From 78d528931deeb6b13ce91dc01d20cc3fc667abc8 Mon Sep 17 00:00:00 2001 From: mohabsafey Date: Fri, 2 Oct 2026 10:13:43 +0200 Subject: [PATCH] Fix infinite refinement loop in Maple interface RootFinding[RefineRoot] was called without a digits option, so once an isolating interval was finer than the precision implied by Digits, it returned the same interval forever. SplitAndRefinePerConstraints (and RefineSolutions) then looped without ever resolving the sign of constraints that take tiny nonzero values at a solution. The required precision, already computed in prec, is now passed to RefineRoot. Also return the refined box instead of the original coarse one in SplitAndRefinePerConstraints, so that returned solutions are consistent with the returned constraint values. Co-Authored-By: Claude Opus 5.5 (1M context) --- interfaces/msolve-to-maple-file-interface.mpl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interfaces/msolve-to-maple-file-interface.mpl b/interfaces/msolve-to-maple-file-interface.mpl index 24e5ce13..8205ec26 100644 --- a/interfaces/msolve-to-maple-file-interface.mpl +++ b/interfaces/msolve-to-maple-file-interface.mpl @@ -586,7 +586,7 @@ local elim, v, i, newsols, sol, interv, prec, newsol, boo; lprint("prec = ", prec): printf("{%d}",degree(elim)); if interv[1]<>interv[2] then - interv := RootFinding[RefineRoot](interv, elim);#, digits = iquo(prec,4)); + interv := RootFinding[RefineRoot](interv, elim, digits = iquo(prec,4)); end if; printf("[r]"); newsol, boo := BuildSolution(param, interv, vars); @@ -594,7 +594,7 @@ local elim, v, i, newsols, sol, interv, prec, newsol, boo; while boo = true and interv[2]<> interv[1] do prec := 2*(abs(ilog2(abs(interv[2]-interv[1])))+256); printf("[r]"); - interv := RootFinding[RefineRoot](interv, elim); + interv := RootFinding[RefineRoot](interv, elim, digits = iquo(prec,4)); newsol, boo := BuildSolution(param, interv, vars); end do; newsols:=[op(newsols), newsol]: @@ -781,7 +781,7 @@ pvars, n, gb, boo, interv, prec, newsol, val, vvar, new_lin_form; prec := 2*(abs(ilog2(abs(interv[2]-interv[1])))+256); lprint("prec", prec); printf("{%d}",degree(elim)); - interv := RootFinding[RefineRoot](interv, elim):#, digits = iquo(prec,4)); + interv := RootFinding[RefineRoot](interv, elim, digits = iquo(prec,4)): printf("[r]"); newsol, boo := BuildSolution([elim, den, cfs, nums] , interv, vars); newsol:=[newsol]: @@ -806,7 +806,7 @@ pvars, n, gb, boo, interv, prec, newsol, val, vvar, new_lin_form; end if; end do; if boo = true then - newsols:=[op(newsols), newtsols[i]]: + newsols:=[op(newsols), newsol[1]]: newvals:=[op(newvals), newtvals[i]]: end if; end do;