Ticket #12295: trac-12295-maple_interface_5.9_20130614.patch

File trac-12295-maple_interface_5.9_20130614.patch, 9.9 KB (added by migeruhito, 10 years ago)

Maple interface fix for Sage 5.9

  • sage/interfaces/maple.py

    # HG changeset patch
    # User migeruhito
    # Date 1363871400 -3600
    # Node ID 8f4f541fde590e0ff6a0f21e7c652823ab418c55
    # Parent  4381a8e9f0c8d5d481433f3e670c8de9ddeadc4f
    maple interface fix for sage 5.8
    
    diff --git a/sage/interfaces/maple.py b/sage/interfaces/maple.py
    a b  
    2727    sage: maple('3 * 5')                                 # optional - maple
    2828    15
    2929    sage: maple.eval('ifactor(2005)')                    # optional - maple
    30     '"(5)*"(401)'
     30    '``(5)*``(401)'
    3131    sage: maple.ifactor(2005)                            # optional - maple
    32     "(5)*"(401)
     32    ``(5)*``(401)
    3333    sage: maple.fsolve('x^2=cos(x)+4', 'x=0..5')         # optional - maple
    3434    1.914020619
    3535    sage: maple.factor('x^5 - y^5')                      # optional - maple
     
    186186    sage: maple.isprime(maple.fibonacci(27))     # optional - maple
    187187    false
    188188    sage: maple.ifactor(maple.fibonacci(27))     # optional - maple
    189     "(2)*"(17)*"(53)*"(109)
     189    ``(2)*``(17)*``(53)*``(109)
    190190
    191191Note that the isprime function that is included with Sage (which
    192192uses PARI) is better than the Maple one (it is faster and gives a
     
    266266            sage: maple == loads(dumps(maple))
    267267            True
    268268        """
     269        __maple_iface_opts = [
     270            'screenwidth=infinity',
     271            'errorcursor=false',]
     272        __maple_command = 'maple -t -c "interface({})"'.format(
     273            ','.join(__maple_iface_opts))
     274        #errorcursor=false avoids maple command line interface to dump
     275        #into the editor when an error occurs. Thus pexpect interface
     276        #is not messed up if a maple error occurs.
     277        #screenwidth=infinity prevents maple command interface from cutting
     278        #your input lines. By doing this, file interface also works in the
     279        #event that  sage_user_home + sage_tmp_file_stuff exceeds the
     280        #length of 79 characters.
    269281        Expect.__init__(self,
    270282                        name = 'maple',
    271283                        prompt = '#-->',
    272                         command = "maple -t",
     284                        command = __maple_command,
    273285                        maxread = maxread,
    274286                        script_subdirectory = script_subdirectory,
    275287                        restart_on_ctrlc = False,
     
    277289                        server_tmpdir = server_tmpdir,
    278290                        verbose_start = False,
    279291                        logfile = logfile,
    280                         eval_using_file_cutoff=1)  # very important that this is 1
    281         # It's very important to use file i/o for everything,
    282         # since maple stupid command line interface always
    283         # dumps you into the editor when an error occurs,
    284         # and I can find no way to turn it off!!
     292                        eval_using_file_cutoff=2048)  # 2048 is
     293        #a small enough value to avoid conflicts with the 4096 limit 
     294        #hardcoded in Expect.
    285295   
    286296    def _function_class(self):
    287297        """
     
    298308        return MapleFunction
    299309
    300310    def _keyboard_interrupt(self):
     311        """
     312        EXAMPLES::
     313
     314            sage: maple._keyboard_interrupt()   #not tested
     315            Interrupting Maple...
     316            ...
     317            RuntimeError: Ctrl-c pressed while running Maple
     318
     319        ::
     320
     321            sage: maple('Matrix(8000,8000)')    #not tested
     322            #Press ctrl-c
     323            ^CInterrupting Maple...
     324            ...
     325            RuntimeError: Ctrl-c pressed while running Maple
     326        """
    301327        print "Interrupting %s..."%self
    302328        self._expect.sendline(chr(3))  # send ctrl-c
    303329        self._expect.expect(self._prompt)
    304         self._expect.expect(self._prompt)
    305330        raise RuntimeError, "Ctrl-c pressed while running %s"%self
    306331
    307332    def __reduce__(self):
     
    544569            z = Expect._eval_line(self, line, allow_use_file=allow_use_file,
    545570                    wait_for_prompt=wait_for_prompt).replace('\\\n','').strip()
    546571            if z.lower().find("error") != -1:
    547                 # The following was very tricky to figure out.
    548                 # When an error occurs using Maple, unfortunately,
    549                 # Maple also dumps one into the line where the
    550                 # error occurred with that line copied in.  This
    551                 # totally messes up the pexpect interface.  However,
    552                 # I think the following few lines successfully
    553                 # "clear things out", i.e., delete the text from
    554                 # the edit buffer and get a clean prompt.
    555                 e = self.expect()
    556                 e.sendline('%s__sage__;'%(chr(8)*len(line)))
    557                 e.expect('__sage__;')
    558                 e.expect(self._prompt)           
    559572                raise RuntimeError, "An error occurred running a Maple command:\nINPUT:\n%s\nOUTPUT:\n%s"%(line, z)
    560573        return z
    561574
     575    def _eval_line_using_file(self, line, *args, **kwargs):
     576        """
     577        EXAMPLES::
     578       
     579            sage: maple._eval_line_using_file('2+2')  # optional - maple
     580            '4'
     581        """
     582        line += ';' #Adds the maple ";" thing like in self._eval_line
     583        return Expect._eval_line_using_file(
     584                self, line, *args, **kwargs)
     585
    562586    def cputime(self, t=None):
    563587        r"""
    564588        Returns the amount of CPU time that the Maple session has used. If
     
    693717       
    694718            sage: print maple._source('curry').strip()  # optional - maple
    695719            p -> subs('_X' = args[2 .. nargs], () -> p(_X, args))
    696             sage: maple._source('ZZZ')                  # optional - maple
     720            sage: maple._source('ZZZ')                  #not tested
    697721            Traceback (most recent call last):
    698722            ...
    699723            Exception: no source code could be found
     
    796820        """
    797821        Clear the variable named var.
    798822       
    799         Unfortunately, Maple does not have a clear command. The next best
    800         thing is to set equal to the constant 0, so that memory will be
    801         freed.
     823        To clear a Maple variable, you must assign 'itself' to itself.
     824        In Maple 'expr' prevents expr to be evaluated.
    802825       
    803826        EXAMPLES::
    804827       
     
    807830            '2'
    808831            sage: maple.clear('xx')     # optional - maple
    809832            sage: maple.get('xx')       # optional - maple
    810             '0'
     833            'xx'
    811834        """
    812         self.set(var, '0')
     835        self.set(var, "'{}'".format(var))
    813836
    814837class MapleFunction(ExpectFunction):
    815838    def _sage_doc_(self):
     
    834857       
    835858            sage: print maple.curry._sage_src_().strip() # optional - maple
    836859            p -> subs('_X' = args[2 .. nargs], () -> p(_X, args))
    837             sage: maple.ZZZ._sage_src_()                 # optional - maple
     860            sage: maple.ZZZ._sage_src_()                 #not tested
    838861            Traceback (most recent call last):
    839862            ...
    840863            Exception: no source code could be found
     
    866889            sage: print g.curry._sage_src_().strip() # optional - maple
    867890            p -> subs('_X' = args[2 .. nargs], () -> p(_X, args))
    868891            sage: m = maple('2')                     # optional - maple
    869             sage: m.ZZZ._sage_src_()                 # optional - maple
     892            sage: m.ZZZ._sage_src_()                 #not tested
    870893            Traceback (most recent call last):
    871894            ...
    872895            Exception: no source code could be found
     
    910933            sage: hash(m)                                   # optional - maple
    911934            -2187277978252104690
    912935        """
    913         return int(maple.eval('StringTools:-Hash(convert(%s, string));'%self.name())[1:-1],16)
     936        return int(maple.eval('StringTools:-Hash(convert(%s, string))'%self.name())[1:-1],16)
    914937
    915938    def __cmp__(self, other):
    916939        """
     
    10011024            sage: t = maple(5); u = maple(3)                # optional - maple
    10021025            sage: t*u                                       # optional - maple
    10031026            15
     1027            sage: t._mul_(u)                                # optional - maple
     1028            15
    10041029            sage: M = matrix(ZZ,2,range(4))                 # optional - maple
    10051030            sage: Mm = maple(M)                             # optional - maple
    10061031            sage: Mm*Mm                                     # optional - maple
     
    10641089            sage: print latex(maple('(x^4 - y)/(y^2-3*x)'))      # optional - maple
    10651090            {\frac {{x}^{4}-y}{{y}^{2}-3\,x}}
    10661091            sage: print latex(maple(pi - e^3))                   # optional - maple
    1067             \pi - \left( {e^{1}} \right) ^{3}
    1068        
     1092            \pi-{{\rm e}^{3}}
     1093            sage: print maple(pi - e^3)._latex_()                # optional -- requires maple
     1094            \pi-{{\rm e}^{3}}
     1095 
    10691096        .. note::
    10701097
    10711098           Some expressions might require the Maple style file
     
    10851112            sage: m = maple('x^2 + 5*y')                            # optional - maple
    10861113            sage: m.sage()                                          # optional - maple
    10871114            x^2 + 5*y
     1115            sage: m._sage_()                                        # optional - requires maple
     1116            x^2 + 5*y
    10881117
    10891118        ::
    10901119
  • sage/symbolic/integration/integral.py

    diff --git a/sage/symbolic/integration/integral.py b/sage/symbolic/integration/integral.py
    a b  
    477477       
    478478    We integrate the above function in maple now::
    479479
    480         sage: g = maple(f); g                             # optional - maple
     480        sage: g = maple(f); g                             # random; optional - requires maple
    481481        sin(x^2)+y^z
    482         sage: g.integrate(x)                              # optional - maple
     482        sage: g.integrate(x)                              # random; optional - requires maple
    483483        1/2*2^(1/2)*Pi^(1/2)*FresnelS(2^(1/2)/Pi^(1/2)*x)+y^z*x
    484484
    485485    We next integrate a function with no closed form integral. Notice