Problematic bug in `solve` via Maxima

42 views
Skip to first unread message

Emmanuel Charpentier

unread,
Oct 7, 2024, 1:26:26 PM10/7/24
to sage-support

This is new in 10.5.beta6, and seems serious :

sage: var("x, y, rho, theta", domain="real") (x, y, rho, theta) sage: Sys=[tan(theta)==y/x, x^2+y^2==rho^2] sage: solve(Sys, (rho, theta)) --------------------------------------------------------------------------- SyntaxError Traceback (most recent call last) File /usr/local/sage-10/src/sage/calculus/calculus.py:2409, in symbolic_expression_from_maxima_string(x, equals_sub, maxima) 2408 SRM_parser._callable_constructor().set_names(function_syms) -> 2409 return SRM_parser.parse_sequence(s) 2410 except SyntaxError: File /usr/local/sage-10/src/sage/misc/parser.pyx:573, in sage.misc.parser.Parser.parse_sequence() 572 --> 573 cpdef parse_sequence(self, s): 574 """ File /usr/local/sage-10/src/sage/misc/parser.pyx:590, in sage.misc.parser.Parser.parse_sequence() 589 cdef Tokenizer tokens = Tokenizer(s) --> 590 all = self.p_sequence(tokens) 591 if tokens.next() != EOS: File /usr/local/sage-10/src/sage/misc/parser.pyx:654, in sage.misc.parser.Parser.p_sequence() 653 elif token == c'[': --> 654 obj = self.p_list(tokens) 655 elif token == c'(': File /usr/local/sage-10/src/sage/misc/parser.pyx:686, in sage.misc.parser.Parser.p_list() 685 self.parse_error(tokens, "Malformed list") --> 686 all = self.p_sequence(tokens) 687 token = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:663, in sage.misc.parser.Parser.p_sequence() 662 else: --> 663 obj = self.p_eqn(tokens) 664 PyList_Append(all, obj) File /usr/local/sage-10/src/sage/misc/parser.pyx:754, in sage.misc.parser.Parser.p_eqn() 753 """ --> 754 lhs = self.p_expr(tokens) 755 cdef int op = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:795, in sage.misc.parser.Parser.p_expr() 794 cdef int op --> 795 operand1 = self.p_term(tokens) 796 op = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:830, in sage.misc.parser.Parser.p_term() 829 cdef int op --> 830 operand1 = self.p_factor(tokens) 831 op = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:873, in sage.misc.parser.Parser.p_factor() 872 tokens.backtrack() --> 873 return self.p_power(tokens) 874 File /usr/local/sage-10/src/sage/misc/parser.pyx:901, in sage.misc.parser.Parser.p_power() 900 """ --> 901 operand1 = self.p_atom(tokens) 902 cdef int token = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:958, in sage.misc.parser.Parser.p_atom() 957 func = self.callable_constructor(name) --> 958 args, kwds = self.p_args(tokens) 959 token = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:995, in sage.misc.parser.Parser.p_args() 994 while token == c',': --> 995 arg = self.p_arg(tokens) 996 if isinstance(arg, tuple): File /usr/local/sage-10/src/sage/misc/parser.pyx:1044, in sage.misc.parser.Parser.p_arg() 1043 tokens.backtrack() -> 1044 return self.p_expr(tokens) 1045 File /usr/local/sage-10/src/sage/misc/parser.pyx:795, in sage.misc.parser.Parser.p_expr() 794 cdef int op --> 795 operand1 = self.p_term(tokens) 796 op = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:830, in sage.misc.parser.Parser.p_term() 829 cdef int op --> 830 operand1 = self.p_factor(tokens) 831 op = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:873, in sage.misc.parser.Parser.p_factor() 872 tokens.backtrack() --> 873 return self.p_power(tokens) 874 File /usr/local/sage-10/src/sage/misc/parser.pyx:901, in sage.misc.parser.Parser.p_power() 900 """ --> 901 operand1 = self.p_atom(tokens) 902 cdef int token = tokens.next() File /usr/local/sage-10/src/sage/misc/parser.pyx:970, in sage.misc.parser.Parser.p_atom() 969 if token != c')': --> 970 self.parse_error(tokens, "Mismatched parentheses") 971 return expr File /usr/local/sage-10/src/sage/misc/parser.pyx:1047, in sage.misc.parser.Parser.parse_error() 1046 cdef parse_error(self, Tokenizer tokens, msg="Malformed expression"): -> 1047 raise SyntaxError(msg, tokens.s, tokens.pos) 1048 SyntaxError: Mismatched parentheses During handling of the above exception, another exception occurred: TypeError Traceback (most recent call last) Cell In[9], line 1 ----> 1 solve(Sys, (rho, theta)) File /usr/local/sage-10/src/sage/symbolic/relation.py:1157, in solve(f, *args, **kwds) 1154 except Exception: # if that gives an error, stick with no solutions 1155 s = [] -> 1157 sol_list = string_to_list_of_solutions(repr(s)) 1159 # Relaxed form suggested by Mike Hansen (#8553): 1160 if kwds.get('solution_dict', None): File /usr/local/sage-10/src/sage/symbolic/relation.py:576, in string_to_list_of_solutions(s) 574 from sage.structure.sequence import Sequence 575 from sage.calculus.calculus import symbolic_expression_from_maxima_string --> 576 v = symbolic_expression_from_maxima_string(s, equals_sub=True) 577 return Sequence(v, universe=Objects(), cr_str=True) File /usr/local/sage-10/src/sage/calculus/calculus.py:2411, in symbolic_expression_from_maxima_string(x, equals_sub, maxima) 2409 return SRM_parser.parse_sequence(s) 2410 except SyntaxError: -> 2411 raise TypeError("unable to make sense of Maxima expression '%s' in Sage" % s) 2412 finally: 2413 is_simplified = False TypeError: unable to make sense of Maxima expression '[if((_SAGE_VAR_x != 0) and (1-(_SAGE_VAR_y-I*_SAGE_VAR_x)/(_SAGE_VAR_y+I*_SAGE_VAR_x) != 0),[_SAGE_VAR_rho == -sqrt(_SAGE_VAR_y^2+_SAGE_VAR_x^2),_SAGE_VAR_theta == -((I*log(-((_SAGE_VAR_y^2+_SAGE_VAR_x^2)/(_SAGE_VAR_y^2+2*I*_SAGE_VAR_x*_SAGE_VAR_y-_SAGE_VAR_x^2)))-2*pi*z2067)/2)],union()),if((_SAGE_VAR_x != 0) and (1-(_SAGE_VAR_y-I*_SAGE_VAR_x)/(_SAGE_VAR_y+I*_SAGE_VAR_x) != 0),[_SAGE_VAR_rho == sqrt(_SAGE_VAR_y^2+_SAGE_VAR_x^2),_SAGE_VAR_theta == -((I*log(-((_SAGE_VAR_y^2+_SAGE_VAR_x^2)/(_SAGE_VAR_y^2+2*I*_SAGE_VAR_x*_SAGE_VAR_y-_SAGE_VAR_x^2)))-2*pi*z2675)/2)],union())]' in Sage

However :

sage: solve(Sys, (rho, theta), algorithm="sympy") [{rho: -sqrt(x^2 + y^2), theta: arctan(y/x)}, {rho: sqrt(x^2 + y^2), theta: arctan(y/x)}]

as expected. By the way, giac is also problematic :

sage: solve(Sys, (rho, theta), algorithm="giac") --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) Cell In[19], line 1 ----> 1 solve(Sys, (rho, theta), algorithm="giac") File /usr/local/sage-10/src/sage/symbolic/relation.py:1129, in solve(f, *args, **kwds) 1126 return sympy_set_to_list(ret, sympy_vars) 1128 if algorithm == 'giac': -> 1129 return _giac_solver(f, x, solution_dict) 1131 from sage.calculus.calculus import maxima 1132 m = maxima(f) File /usr/local/sage-10/src/sage/symbolic/relation.py:1455, in _giac_solver(f, x, solution_dict) 1453 giac_f = libgiac(f) 1454 giac_vars = libgiac(x) -> 1455 ret = giac_f.solve(giac_vars) 1456 sols = ret.sage() 1457 if solution_dict: File /usr/local/sage-10/src/sage/libs/giac/auto-methods.pxi:14802, in sage.libs.giac.giac.GiacMethods_base.solve() 14800 Ex4:solve([x^2-y^2=0,x^2-z^2=0],[x,y,z]) 14801 ''' > 14802 return GiacMethods['solve'](self,*args) 14803 14804 def somme(self,*args): File /usr/local/sage-10/src/sage/libs/giac/giac.pyx:1934, in sage.libs.giac.giac.GiacFunction.__call__() 1932 if n == 1: 1933 args = (Pygen(args[0]).eval(),) -> 1934 return Pygen.__call__(self, *args) 1935 1936 File /usr/local/sage-10/src/sage/libs/giac/giac.pyx:1109, in sage.libs.giac.giac.Pygen.__call__() 1107 pari_unlock_result = GIAC_eval(pari_unlock.gptr[0], <int> 1, context_ptr) 1108 tmp = _wrap_gen(result) -> 1109 raise 1110 else: 1111 result = GIAC_eval(right.gptr[0], <int> 1, context_ptr) File /usr/local/sage-10/src/sage/libs/giac/giac.pyx:1099, in sage.libs.giac.giac.Pygen.__call__() 1097 sig_on() 1098 try: -> 1099 result = self.gptr[0](right.gptr[0], context_ptr) 1100 except RuntimeError: 1101 # The previous computation might have failed due to a pari_lock RuntimeError: Error: Invalid dimension

As far as I can remember, I didn’t (yet) see this.

It is reproducible in Maxima 5.47.0 :

Maxima 5.47.0 https://maxima.sourceforge.io using Lisp GNU Common Lisp (GCL) GCL 2.6.14 git tag Version_2_6_15pre8 Distributed under the GNU Public License. See the file COPYING. Dedicated to the memory of William Schelter. The function bug_report() provides bug reporting information. (%i1) declare(x, real, y, real, rho, real, theta, real); (%o1) done (%i2) solve([tan(theta)=y/x, rho^2=x^2+y^2], [rho, theta]); (%o2) [] (%i3) load("to_poly_solve"); (%o3) /usr/share/maxima/5.47.0/share/to_poly_solve/to_poly_solve.mac (%i4) %solve([tan(theta)=y/x, rho^2=x^2+y^2], [rho, theta]); y - %i x (%o4) %union(%if((x # 0) %and (1 - -------- # 0), y + %i x 2 2 [rho = - sqrt(y + x ), theta = 2 2 y + x %i log(- ------------------) - 2 %pi %z21938 2 2 y + 2 %i x y - x - --------------------------------------------], %union()), 2 y - %i x 2 2 %if((x # 0) %and (1 - -------- # 0), [rho = sqrt(y + x ), y + %i x 2 2 y + x %i log(- ------------------) - 2 %pi %z27138 2 2 y + 2 %i x y - x theta = - --------------------------------------------], %union())) 2

and is also reproducible in Sagecell, which still uses Maxima 5.46.0.

kcrisman

unread,
Oct 8, 2024, 6:49:45 AM10/8/24
to sage-support
Also in 5.42.2.  What were you expecting to get?  Sage still can't parse all the expressions of this type we get from Maxima, presumably partly due to people who used to work on that code (like me) moving on to other things :-( 
Reply all
Reply to author
Forward
0 new messages