Opened 3 years ago

Closed 2 years ago

Last modified 2 years ago

#28913 closed defect (fixed)

integrate(..., algorithm="giac"): Incorrect conversion to Sage

Reported by: Emmanuel Charpentier Owned by:
Priority: major Milestone: sage-9.2
Component: calculus Keywords: symbolics giac integration
Cc: Frédéric Chapoton, Markus Wageringel, Jakob Kroeker, Karl-Dieter Crisman, Peter Bruin, Ralf Stephan, Sébastien Labbé, Samuel Lelièvre, Thierry Monteil, Vincent Delecroix, vklein, Paul Zimmermann, Marcelo Forets, Marc Mezzarobba Merged in:
Authors: Frédéric Chapoton Reviewers: Thierry Monteil
Report Upstream: N/A Work issues:
Branch: 297033a (Commits, GitHub, GitLab) Commit:
Dependencies: Stopgaps:

Status badges

Description

Seen in this ask.sagemath question:

sage: Ex=(1-2*x^(1/3))^(3/4)/x
sage: integrate(Ex, x, algorithm="giac")
---------------------------------------------------------------------------
SyntaxError                               Traceback (most recent call last)
/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/interfaces/giac.py in _sage_(self, locals)
   1100                 return symbolic_expression_from_string(result, lsymbols,
-> 1101                     accept_sequence=True)
   1102 

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/calculus/calculus.py in symbolic_expression_from_string(s, syms, accept_sequence)
   2384             _augmented_syms = syms
-> 2385             return parse_func(s)
   2386         finally:

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/misc/parser.pyx in sage.misc.parser.Parser.parse_sequence (build/cythonized/sage/misc/parser.c:5479)()
    538 
--> 539     cpdef parse_sequence(self, s):
    540         """

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/misc/parser.pyx in sage.misc.parser.Parser.parse_sequence (build/cythonized/sage/misc/parser.c:5369)()
    556         if tokens.next() != EOS:
--> 557             self.parse_error(tokens)
    558         if len(all) == 1 and isinstance(all, list):

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/misc/parser.pyx in sage.misc.parser.Parser.parse_error (build/cythonized/sage/misc/parser.c:9742)()
   1007     cdef parse_error(self, Tokenizer tokens, msg="Malformed expression"):
-> 1008         raise SyntaxError(msg, tokens.s, tokens.pos)
   1009 

SyntaxError: Malformed expression

During handling of the above exception, another exception occurred:

NotImplementedError                       Traceback (most recent call last)
<ipython-input-22-617e71e52902> in <module>()
----> 1 integrate(Ex, x, algorithm="giac")

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/misc/functional.py in integral(x, *args, **kwds)
    751     """
    752     if hasattr(x, 'integral'):
--> 753         return x.integral(*args, **kwds)
    754     else:
    755         from sage.symbolic.ring import SR

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.integral (build/cythonized/sage/symbolic/expression.cpp:64575)()
  12389                     R = ring.SR
  12390             return R(integral(f, v, a, b, **kwds))
> 12391         return integral(self, *args, **kwds)
  12392 
  12393     integrate = integral

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/symbolic/integration/integral.py in integrate(expression, v, a, b, algorithm, hold)
    925         if not integrator:
    926             raise ValueError("Unknown algorithm: %s" % algorithm)
--> 927         return integrator(expression, v, a, b)
    928     if a is None:
    929         return indefinite_integral(expression, v, hold=hold)

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/symbolic/integration/external.py in giac_integrator(expression, v, a, b)
    430         return expression.integrate(v, a, b, hold=True)
    431     else:
--> 432         return result._sage_()

/usr/local/sage-P3-2/local/lib/python3.7/site-packages/sage/interfaces/giac.py in _sage_(self, locals)
   1102 
   1103             except Exception:
-> 1104                 raise NotImplementedError("Unable to parse Giac output: %s" % result)
   1105         else:
   1106             return [entry.sage() for entry in self]

NotImplementedError: Unable to parse Giac output: Evaluation time: 2.82
12*(1/4*ln(abs((-2*x^(1/3)+1)^(1/4)-1))-1/4*ln((-2*x^(1/3)+1)^(1/4)+1)+1/2*atan((-2*x^(1/3)+1)^(1/4))+1/3*((-2*x^(1/3)+1)^(1/4))^3)

However, the following workaround works:

sage: from giacpy_sage import *
// Giac share root-directory:/usr/local/sage-P3-2/local/share/giac/
// Giac share root-directory:/usr/local/sage-P3-2/local/share/giac/
Help file /usr/local/sage-P3-2/local/share/giac/doc/fr/aide_cas not found
Added 0 synonyms
sage: libgiac.integrate(Ex,x).sage()
4*(-2*x^(1/3) + 1)^(3/4) + 6*arctan((-2*x^(1/3) + 1)^(1/4)) - 3*log((-2*x^(1/3) + 1)^(1/4) + 1) + 3*log(abs((-2*x^(1/3) + 1)^(1/4) - 1))

This seems to point to the (unwelcome) timing information added by Giac before its results... It's probably more of a booboo than a (real|hard) bug, but might defeat a whole problem if this error is raised before other algorithms has had a chance to report their results.

I'm not sure that this should be reported upstream (it should if there is no way to cleanly suppress the timing information).

Ccing the participants to #27958, which introduced this particular wolf in the general Sage integration sheepshed...

Change History (16)

comment:1 Changed 3 years ago by Emmanuel Charpentier

Cc: Frédéric Chapoton added

Forgot Frederic Chapoton in the Cc list...

comment:2 Changed 3 years ago by Emmanuel Charpentier

Keywords: symbolics giac integration added

comment:3 Changed 3 years ago by Markus Wageringel

I think it would make sense to use giacpy_sage for this in general, rather than the pexpect interface. Perhaps giacpy_sage could be turned into a standard package.

comment:4 in reply to:  3 Changed 3 years ago by Samuel Lelièvre

Replying to gh-mwageringel:

I think it would make sense to use giacpy_sage for this in general, rather than the pexpect interface. Perhaps giacpy_sage could be turned into a standard package.

I opened #28918 for that. See also #16688.

comment:5 Changed 3 years ago by Erik Bray

Milestone: sage-9.0sage-9.1

Ticket retargeted after milestone closed

comment:6 Changed 2 years ago by Sébastien Labbé

Is the following

sage: integrate(sqrt(x + sqrt(x)), x, algorithm='giac')

an other instance of the problem described in this ticket? See https://ask.sagemath.org/question/50885/is-there-a-way-to-integrate-sqrtxsqrtx-in-sage/

The result is:

Traceback (most recent call last):
...
AttributeError: 
...
During handling of the above exception, another exception occurred:
...
RuntimeError: An error occurred running a Giac command:
INPUT:
sage2
OUTPUT:
Warning, choosing root of [1,0,0,%%%{4,[1]%%%},%%%{4,[2]%%%}+%%%{-1,[1]%%%}] at parameters values [-97]
Warning, need to choose a branch for the root of a polynomial with parameters. This might be wrong.
The choice was done assuming [x]=[9]
Warning, need to choose a branch for the root of a polynomial with parameters. This might be wrong.
The choice was done assuming [x]=[54]
  ***   bug in PARI/GP (Bus Error), please report.sym2poly exception caught Error in PARI subsystem Error: Bad Argument Value
Warning, need to choose a branch for the root of a polynomial with parameters. This might be wrong.
The choice was done assuming [x]=[64]

  ***   bug in PARI/GP (Segmentation Fault), please report.sym2poly exception caught Error in PARI subsystem Error: Bad Argument Value

  ***   bug in PARI/GP (Segmentation Fault), please report.sym2poly exception caught Error in PARI subsystem Error: Bad Argument Value

  ***   Warning: normalizing a polynomial with 0 leading term.
  ***   Warning: normalizing a polynomial with 0 leading term.
Warning, choosing root of [1,0,0,%%%{4,[1]%%%},%%%{4,[2]%%%}+%%%{-1,[1]%%%}] at parameters values [6.38357630698]
  ***   Warning: normalizing a polynomial with 0 leading term.
  ***   Warning: normalizing a polynomial with 0 leading term.
Warning, choosing root of [1,0,0,%%%{4,[1]%%%},%%%{4,[2]%%%}+%%%{-1,[1]%%%}] at parameters values [82.1195442914]
2*(2*((1/6*sqrt(x)+1/24)*sqrt(x)-1/16)*sqrt(x+sqrt(x))-1/16*ln(sqrt(4*sqrt(x)+1-4*sqrt(x)*cos((pi*sign(im(sqrt(x)))*sign(x+re(sqrt(x)))-pi*sign(im(sqrt(x)))-2*atan(im(sqrt(x))/(x+re(sqrt(x)))))/2)+rootof([[-4,-4,0],[1,0,0,4*x,4*x^2-x]])*cos(1/2*(atan(im(sqrt(x))/(x+re(sqrt(x))))+(1-sign(x+re(sqrt(x))))*sign(im(sqrt(x)))*pi/2)))))

comment:7 Changed 2 years ago by Matthias Köppe

Milestone: sage-9.1sage-9.2

comment:8 Changed 2 years ago by Frédéric Chapoton

Authors: Frédéric Chapoton
Branch: u/chapoton/28913
Commit: 203f9eb6b8624111047656a4ffd805aa53809b73
Status: newneeds_review

here is a bandaid. A better would be to go through #28918


New commits:

203f9ebbandaid for giac pexpect unwanted timing display

comment:9 Changed 2 years ago by Frédéric Chapoton

green bot, please review

comment:10 Changed 2 years ago by Thierry Monteil

The fix looks good. How wbout adding a direct doctest in SAGE_ROOT/src/sage/symbolic/integration/integral.py pointing to this ticket ?

comment:11 Changed 2 years ago by git

Commit: 203f9eb6b8624111047656a4ffd805aa53809b73297033a040583cc934757c4c94376d5146054265

Branch pushed to git repo; I updated commit sha1. New commits:

297033atrac 28913 adding yet another doctest

comment:12 Changed 2 years ago by Frédéric Chapoton

Doctest ajouté

comment:13 Changed 2 years ago by Frédéric Chapoton

bot is morally green, please review

comment:14 Changed 2 years ago by Thierry Monteil

Reviewers: Thierry Monteil
Status: needs_reviewpositive_review

comment:15 Changed 2 years ago by Volker Braun

Branch: u/chapoton/28913297033a040583cc934757c4c94376d5146054265
Resolution: fixed
Status: positive_reviewclosed

comment:16 in reply to:  6 Changed 2 years ago by Sébastien Labbé

Commit: 297033a040583cc934757c4c94376d5146054265

Replying to slabbe:

Is the following

sage: integrate(sqrt(x + sqrt(x)), x, algorithm='giac')

an other instance of the problem described in this ticket?

Answer is no. I created #29966 for the other issue mentioned in comment 6.

Note: See TracTickets for help on using tickets.