Opened 21 months ago

Closed 16 months ago

Last modified 15 months ago

#28913 closed defect (fixed)

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

Reported by: charpent Owned by:
Priority: major Milestone: sage-9.2
Component: calculus Keywords: symbolics giac integration
Cc: chapoton, gh-mwageringel, jakobkroeker, kcrisman, pbruin, rws, slabbe, slelievre, tmonteil, vdelecroix, vklein, zimmerma, mforets, mmezzarobba 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 21 months ago by charpent

  • Cc chapoton added

Forgot Frederic Chapoton in the Cc list...

comment:2 Changed 21 months ago by charpent

  • Keywords symbolics giac integration added

comment:3 follow-up: Changed 21 months ago by 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.

comment:4 in reply to: ↑ 3 Changed 21 months ago by slelievre

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 21 months ago by embray

  • Milestone changed from sage-9.0 to sage-9.1

Ticket retargeted after milestone closed

comment:6 follow-up: Changed 17 months ago by slabbe

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 17 months ago by mkoeppe

  • Milestone changed from sage-9.1 to sage-9.2

comment:8 Changed 17 months ago by chapoton

  • Authors set to Frédéric Chapoton
  • Branch set to u/chapoton/28913
  • Commit set to 203f9eb6b8624111047656a4ffd805aa53809b73
  • Status changed from new to needs_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 17 months ago by chapoton

green bot, please review

comment:10 Changed 17 months ago by tmonteil

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 17 months ago by git

  • Commit changed from 203f9eb6b8624111047656a4ffd805aa53809b73 to 297033a040583cc934757c4c94376d5146054265

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

297033atrac 28913 adding yet another doctest

comment:12 Changed 17 months ago by chapoton

Doctest ajouté

comment:13 Changed 17 months ago by chapoton

bot is morally green, please review

comment:14 Changed 17 months ago by tmonteil

  • Reviewers set to Thierry Monteil
  • Status changed from needs_review to positive_review

comment:15 Changed 16 months ago by vbraun

  • Branch changed from u/chapoton/28913 to 297033a040583cc934757c4c94376d5146054265
  • Resolution set to fixed
  • Status changed from positive_review to closed

comment:16 in reply to: ↑ 6 Changed 15 months ago by slabbe

  • Commit 297033a040583cc934757c4c94376d5146054265 deleted

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.