o
    Ïer™  ã                   @  sÈ  d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dlZd dlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM d dlNmOZOmPZP d dlQmRZR d dlSmTZT d d	lUmVZV dd
d„ZWdd„ ZXdd„ ZYdd„ ZZeZG dd„ dƒƒZ[dS )é    )ÚannotationsN)Úproduct)ÚAnyÚCallable)EÚMulÚAddÚPowÚlogÚexpÚsqrtÚcosÚsinÚtanÚasinÚacosÚacotÚasecÚacscÚsinhÚcoshÚtanhÚasinhÚacoshÚatanhÚacothÚasechÚacschÚexpandÚimÚflattenÚpolylogÚcancelÚexpand_trigÚsignÚsimplifyÚUnevaluatedExprÚSÚatanÚatan2ÚModÚMaxÚMinÚrfÚEiÚSiÚCiÚairyaiÚairyaiprimeÚairybiÚprimepiÚprimeÚisprimeÚcotÚsecÚcscÚcschÚsechÚcothÚFunctionÚIÚpiÚTupleÚGreaterThanÚStrictGreaterThanÚStrictLessThanÚLessThanÚEqualityÚOrÚAndÚLambdaÚIntegerÚDummyÚsymbols)ÚsympifyÚ_sympify)Úairybiprime)Úli)Úsympy_deprecation_warningc                 C  s$   t dddd t|ƒ}t| | ¡ƒS )NzóThe ``mathematica`` function for the Mathematica parser is now
deprecated. Use ``parse_mathematica`` instead.
The parameter ``additional_translation`` can be replaced by SymPy's
.replace( ) or .subs( ) methods on the output expression instead.z1.11zmathematica-parser-new)Zdeprecated_since_versionZactive_deprecations_target)rO   ÚMathematicaParserrK   Ú
_parse_old)ÚsÚadditional_translationsÚparser© rU   úID:\Projects\ConvertPro\env\Lib\site-packages\sympy/parsing/mathematica.pyÚmathematica   s   úrW   c                 C  s   t ƒ }| | ¡S )a±  
    Translate a string containing a Wolfram Mathematica expression to a SymPy
    expression.

    If the translator is unable to find a suitable SymPy expression, the
    ``FullForm`` of the Mathematica expression will be output, using SymPy
    ``Function`` objects as nodes of the syntax tree.

    Examples
    ========

    >>> from sympy.parsing.mathematica import parse_mathematica
    >>> parse_mathematica("Sin[x]^2 Tan[y]")
    sin(x)**2*tan(y)
    >>> e = parse_mathematica("F[7,5,3]")
    >>> e
    F(7, 5, 3)
    >>> from sympy import Function, Max, Min
    >>> e.replace(Function("F"), lambda *x: Max(*x)*Min(*x))
    21

    Both standard input form and Mathematica full form are supported:

    >>> parse_mathematica("x*(a + b)")
    x*(a + b)
    >>> parse_mathematica("Times[x, Plus[a, b]]")
    x*(a + b)

    To get a matrix from Wolfram's code:

    >>> m = parse_mathematica("{{a, b}, {c, d}}")
    >>> m
    ((a, b), (c, d))
    >>> from sympy import Matrix
    >>> Matrix(m)
    Matrix([
    [a, b],
    [c, d]])

    If the translation into equivalent SymPy expressions fails, an SymPy
    expression equivalent to Wolfram Mathematica's "FullForm" will be created:

    >>> parse_mathematica("x_.")
    Optional(Pattern(x, Blank()))
    >>> parse_mathematica("Plus @@ {x, y, z}")
    Apply(Plus, (x, y, z))
    >>> parse_mathematica("f[x_, 3] := x^3 /; x > 0")
    SetDelayed(f(Pattern(x, Blank()), 3), Condition(x**3, x > 0))
    )rP   Úparse)rR   rT   rU   rU   rV   Úparse_mathematica    s   2
rY   c                    s²   t | ƒdkrB| d }tdƒ‰ | ˆ ¡}dd„ |D ƒ}t|ƒ}t|tƒr=td|› td}t|| 	‡ fdd	„t
|ƒD ƒ¡ƒS td
|ƒS t | ƒdkrU| d }| d }t||ƒS tdƒ‚)Né   r   ÚSlotc                 S  s   g | ]}|j d  ‘qS )r   )Úargs)Ú.0ÚarU   rU   rV   Ú
<listcomp>[   ó    z#_parse_Function.<locals>.<listcomp>zdummy0:©Úclsc                   s   i | ]\}}ˆ |d  ƒ|“qS )rZ   rU   )r]   ÚiÚv©r[   rU   rV   Ú
<dictcomp>_   s    z#_parse_Function.<locals>.<dictcomp>rU   é   z&Function node expects 1 or 2 arguments)Úlenr<   ZatomsÚmaxÚ
isinstancerH   rJ   rI   rG   ZxreplaceÚ	enumerateÚSyntaxError)r\   ÚargÚslotsÚnumbersZnumber_of_argumentsÚ	variablesÚbodyrU   re   rV   Ú_parse_FunctionV   s   

"

rr   c                 C  s   |   ¡  | S ©N)Ú_initialize_classra   rU   rU   rV   Ú_decoi   s   ru   c                !   @  sì  e Zd ZU dZi dd“dd“dd“dd	“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%d&d'd(d)œ¥Zed*d+d,ƒD ])\ZZZee e d- Z	erdd.e 
¡  e d/ Zne 
¡ e d/ Ze e	ei¡ qJd0d1d2d3d4œZe d5ej¡d6fe d7ej¡d6fe d8ej¡d9fe d:ej¡d;fd<œZe d=ej¡Ze d>ej¡Zd?Zi Zd@edA< i Zd@edB< i Zd@edC< edDdE„ ƒZd+dGdH„ZedIdJ„ ƒZdKdL„ ZdMdN„ ZedOdP„ ƒZedQdR„ ƒZ edSdT„ ƒZ!edUdV„ ƒZ"dWdX„ Z#dYdZ„ Z$d[Z%d\Z&d]Z'd^Z(d_Z)d`Z*e'dFdadbdc„ ife%e(daddife%e)dedfdgdhdidjdkœfe%e*dldmdc„ ife'dFdndoife%e*dpdqife%e)drdsdtœfe%e*dudvife%e(dwdxife'dFdydzd{œfe%e(d|d}ife%e(d~dife&dFd€dife%e(d‚dƒd„œfe%e(d…d†d‡dˆd‰dŠd‹œfe%dFdŒdife%e(dŽdŽdœfe%e(ddd‘œfe%e(d’d“ife&dFd”dc„ d•dc„ d–œfe%e)d—d˜ife%e)d™dšd›dœdc„ dœfe'dFdždŸd d¡d¢œfe%dFd£dc„ d¤dc„ d¥œfe&dFd¦dc„ d§dc„ d¨œfe%dFd©dªife'dFd«dc„ d¬dc„ d­dc„ d®dc„ d¯œfe%dFd°d±dc„ ife&dFd²d³d´œfgZ+dµed¶< d·dc„ d¸dc„ d´œZ,d¹Z-dºZ.g d»¢Z/g d¼¢Z0ed½d¾„ ƒZ1ed¿dÀ„ ƒZ2dFZ3dÁdÂ„ Z4d,dÅdÆ„Z5d-dËdÌ„Z6d-dÍdÎ„Z7d-dÏdÐ„Z8d.dÓdÔ„Z9d/d×dØ„Z:d.dÙdÚ„Z;d0d1dÜdÝ„Z<d2dàdá„Z=d3dãdä„Z>d4dædç„Z?i de@“dŽeA“d˜eB“dèdédc„ “dêdëdc„ “dìdídc„ “dîeC“dïeD“dðeE“dñeF“dòeG“dóeH“dôeI“dõeJ“döeK“d÷eL“dødùdc„ “i dúeM“dûeN“düeO“dýeP“dþeQ“dÿeR“d eS“deT“deU“deV“deW“deX“deY“deZ“de[“d	e\“d
e]“¥i de^j“de_“de`“dea“deb“dec“ded“dee“def“dddc„ “deg“deh“dei“dej“dek“del“dem“¥i den“deo“dep“d eq“d!er“d"es“d#et“d$eu“d%ev“dŠew“d‰ex“dˆey“d‡ez“d…e{“d}e|“de}“doe~“¥Ze€ed&œZ‚d'd(„ Zƒd)d*„ Z„dFS (5  rP   ap  
    An instance of this class converts a string of a Wolfram Mathematica
    expression to a SymPy expression.

    The main parser acts internally in three stages:

    1. tokenizer: tokenizes the Mathematica expression and adds the missing *
        operators. Handled by ``_from_mathematica_to_tokens(...)``
    2. full form list: sort the list of strings output by the tokenizer into a
        syntax tree of nested lists and strings, equivalent to Mathematica's
        ``FullForm`` expression output. This is handled by the function
        ``_from_tokens_to_fullformlist(...)``.
    3. SymPy expression: the syntax tree expressed as full form list is visited
        and the nodes with equivalent classes in SymPy are replaced. Unknown
        syntax tree nodes are cast to SymPy ``Function`` objects. This is
        handled by ``_from_fullformlist_to_sympy(...)``.

    zSqrt[x]zsqrt(x)zExp[x]zexp(x)zLog[x]zlog(x)zLog[x,y]zlog(y,x)zLog2[x]zlog(x,2)zLog10[x]z	log(x,10)zMod[x,y]zMod(x,y)zMax[*x]zMax(*x)zMin[*x]zMin(*x)zPochhammer[x,y]zrf(x,y)zArcTan[x,y]z
atan2(y,x)zExpIntegralEi[x]zEi(x)zSinIntegral[x]zSi(x)zCosIntegral[x]zCi(x)z	AiryAi[x]z	airyai(x)zAiryAiPrime[x]zairyaiprime(x)z	AiryBi[x]z	airybi(x)zairybiprime(x)z li(x)z
primepi(x)zprime(x)z
isprime(x))zAiryBiPrime[x]zLogIntegral[x]z
PrimePi[x]zPrime[x]z	PrimeQ[x])Ú ZArc)ÚSinÚCosÚTanÚCotÚSecÚCsc)rv   Úhz[x]r^   z(x)rv   z**ú[ú])ú ú^Ú{Ú}zñ
                (?:(?<=[a-zA-Z\d])|(?<=\d\.))     # a letter or a number
                \s+                               # any number of whitespaces
                (?:(?=[a-zA-Z\d])|(?=\.\d))       # a letter or a number
                Ú*zÐ
                (?:(?<=[])\d])|(?<=\d\.))       # ], ) or a number
                                                # ''
                (?=[(a-zA-Z])                   # ( or a single letter
                z¬
                (?<=[a-zA-Z])       # a letter
                \(                  # ( as a character
                (?=.)               # any characters
                z*(z¿
                (?:
                \A|(?<=[^a-zA-Z])
                )
                Pi                  # 'Pi' is 3.14159... in Mathematica
                (?=[^a-zA-Z])
                r>   )Ú
whitespaceúadd*_1úadd*_2ÚPizÞ
                (?:
                \A|(?<=[^a-zA-Z])   # at the top or a non-letter
                )
                [A-Z][a-zA-Z\d]*    # Function
                (?=\[)              # [ as a character
                z(
                \{.*\}
                zº
                (?:
                \A|(?<=[^a-zA-Z])
                )
                {arguments}         # model argument like x, y,...
                (?=[^a-zA-Z])
                z%dict[tuple[str, int], dict[str, Any]]ÚTRANSLATIONSÚcache_originalÚcache_compiledc                 C  s   |   | j¡}| j |¡ d S rs   )Ú_compile_dictionaryÚCORRESPONDENCESr‰   Úupdate)rb   ÚdrU   rU   rV   rt   ö   s   z#MathematicaParser._initialize_classNc                 C  sl   i | _ | j  | j¡ |d u ri }| jj|kr,t|tƒstdƒ‚|  |¡}|| j_|| j_	| j  | jj	¡ d S )NzThe argument must be dict type)
ÚtranslationsrŽ   r‰   Ú	__class__rŠ   rj   ÚdictÚ
ValueErrorrŒ   r‹   )ÚselfrS   r   rU   rU   rV   Ú__init__ü   s   

zMathematicaParser.__init__c                 C  sV  i }|  ¡ D ]¢\}}|  |¡ |  |¡ |  |d¡}|  |d¡}|  |d¡}|  |d¡}| j |¡}|d u r@dj|d}t|ƒ‚| ¡ }|  	|¡\}}	| 
¡ dksW|	t|ƒkradj|d}t|ƒ‚|d d dkrld}
nt|ƒ}
||
f}dd	„ |D ƒ}d
d |¡ d }| jj|d}t |tj¡}i ||< ||| d< ||| d< ||| d< q|S )Nr…   r€   ú'{f}' function form is invalid.©Úfr   éÿÿÿÿr„   c                 S  s$   g | ]}|d  dkr|nd| ‘qS )r   r„   ú\rU   )r]   ÚxrU   rU   rV   r_   B  s   $ z9MathematicaParser._compile_dictionary.<locals>.<listcomp>z(?:(ú|z)))Ú	argumentsÚfsr\   Úpat)ÚitemsÚ_check_inputÚ_apply_rulesÚ_replaceÚ
FM_PATTERNÚsearchÚformatr“   ÚgroupÚ	_get_argsÚstartrh   ÚjoinÚARGS_PATTERN_TEMPLATEÚreÚcompileÚVERBOSE)rb   Zdicr   Úfmrž   ÚmÚerrZfm_namer\   ÚendZkey_argÚkeyZre_argsZxyzZpatStrrŸ   rU   rU   rV   rŒ     s<   

z%MathematicaParser._compile_dictionaryc           
      C  s‚   | j }d}d}	 | |¡}|du r||7 }	 |S | ¡ }|  |¡\}}| ¡ }	|  ||||	|¡}|	}||d|… 7 }||d… }q)z'Parse Mathematica function to SymPy onerv   r   TN)r¤   r¥   r§   r¨   r©   Ú_convert_one_function)
r”   rR   rŸ   ÚscannedÚcurr°   r¯   r\   r²   ÚbgnrU   rU   rV   Ú_convert_functionT  s"   
ìåz#MathematicaParser._convert_functionc                 C  sd  |t |ƒf| jv r!|t |ƒf}| j| d }dd„ t||ƒD ƒ}nA|df| jv rX|df}| j| d }i }t|ƒD ]\}	}
|
d dkrPd ||	d … ¡||
<  n||	 ||
< q9n
dj|d}t|ƒ‚| j| d	 }| j| d
 }d}d}	 | |¡}|d u rƒ||7 }n| ¡ }
| 	¡ }||d |… ||
  7 }| 
¡ }||d … }qu|d |… | ||d …  }|S )Nr\   c                 S  s   i | ]\}}||“qS rU   rU   )r]   Úkrd   rU   rU   rV   rf   „  r`   z;MathematicaParser._convert_one_function.<locals>.<dictcomp>r„   r   ú,z'{f}' is out of the whitelist.r—   rž   rŸ   rv   )rh   r   Úziprk   rª   r¦   r“   r¥   r§   r©   r²   )r”   rR   r¯   r\   r·   r²   r³   Zx_argsr   rc   r›   r±   ÚtemplaterŸ   rµ   r¶   r°   ZxbgnrU   rU   rV   r´   {  sB   €
ìz'MathematicaParser._convert_one_functionc                 C  sÞ   |j }| ¡ d }g g }}g }|}t||d… |ƒD ]K\}}	|	dkr4|s4|s4| |||… ¡ |d }|	dkr>| |	¡ n|	dkrF| ¡  |	dkrP| |	¡ q|	dkrf|r[| ¡  q| |||… ¡  nq|d }
||
fS )z'Get arguments of a Mathematica functionrZ   Nrº   r‚   rƒ   r~   r   )Ústringr²   rk   ÚappendÚpop)rb   r°   rR   ZancZsquareZcurlyr\   r¶   rc   ÚcZfunc_endrU   rU   rV   r¨   ½  s.   

ûzMathematicaParser._get_argsc                 C  s   | j | }| ||¡}|S rs   )ÚREPLACEMENTSÚreplace)rb   rR   ÚbefÚaftrU   rU   rV   r£   ã  s   
zMathematicaParser._replacec                 C  s   | j | \}}| ||¡S rs   )ÚRULESÚsub)rb   rR   rÃ   rŸ   rÄ   rU   rU   rV   r¢   é  s   zMathematicaParser._apply_rulesc                 C  sR   dD ]}|  |d ¡|  |d ¡krdj|d}t|ƒ‚qd|v r'd}t|ƒ‚d S )N))r~   r   )r‚   rƒ   )ú(ú)r   rZ   r–   r—   r‚   z Currently list is not supported.)Úcountr¦   r“   )rb   rR   Zbracketr±   rU   rU   rV   r¡   î  s   þþzMathematicaParser._check_inputc                 C  s`   |   |¡ |  |d¡}|  |d¡}|  |d¡}|  |d¡}|  |¡}|  |d¡}|  |d¡}|S )Nr…   r€   r†   r‡   r   rˆ   )r¡   r¢   r£   r¸   )r”   rR   rU   rU   rV   rQ   ù  s   

zMathematicaParser._parse_oldc                 C  s"   |   |¡}|  |¡}|  |¡}|S rs   )Ú_from_mathematica_to_tokensÚ_from_tokens_to_fullformlistÚ_from_fullformlist_to_sympy)r”   rR   Ús2Zs3Zs4rU   rU   rV   rX     s   


zMathematicaParser.parseZInfixZPrefixZPostfixZFlatÚRightÚLeftú;c                 C  s.   t | tƒr| r| d dkr| dg S d| dgS )Nr   ÚCompoundExpressionÚNull)rj   Úlist©r›   rU   rU   rV   Ú<lambda>$  ó   . zMathematicaParser.<lambda>rÑ   ÚSetZ
SetDelayedZAddToZSubtractFromZTimesByZDivideBy)ú=z:=z+=z-=z*=z/=z//c                 C  s   | |gS rs   rU   ©r›   ÚyrU   rU   rV   rÕ   '  ó    ú&r<   z/.Z
ReplaceAllÚRuleZRuleDelayed)z->z:>z/;Ú	Conditionrœ   ZAlternativesZRepeatedZRepeatedNull)z..z...z||rE   z&&rF   ú!ÚNotZSameQZUnsameQ)z===z=!=ZEqualZUnequalZ	LessEqualZLessZGreaterEqualZGreater)z==z!=z<=ú<z>=ú>z;;ÚSpanZPlus©ú+ú-ÚTimes)r„   ú/Ú.ZDotc                 C  s
   t  | ¡S rs   )rP   Ú_get_negrÔ   rU   rU   rV   rÕ   7  ó   
 c                 C  s   | S rs   rU   rÔ   rU   rU   rV   rÕ   8  s    )ræ   rå   r   ÚPowerÚApplyZMapZMapAllc                 C  s   d| |ddggS )Nrí   ÚListÚ1rU   rÙ   rU   rU   rV   rÕ   :  ó    )z@@z/@z//@z@@@Z
DerivativeZ	FactorialZ
Factorial2Z	Decrement)ú'rß   z!!z--c                 C  s
   | g|¢S rs   rU   rÙ   rU   rU   rV   rÕ   <  rë   c                 C  s   d| g|¢S )NZPartrU   rÙ   rU   rU   rV   rÕ   <  ó    )r~   ú[[c                 C  s
   dg| ¢S )Nrî   rU   rÔ   rU   rU   rV   rÕ   =  rë   c                 C  s   | d S )Nr   rU   rÔ   rU   rU   rV   rÕ   =  rÛ   )r‚   rÇ   ú?ZPatternTestc                 C  ó   d| dggS ©NÚPatternÚBlankrU   rÔ   rU   rU   rV   rÕ   @  rò   c                 C  s   dd| dgggS )NÚOptionalr÷   rø   rU   rÔ   rU   rU   rV   rÕ   A  rð   c                 C  rõ   )Nr÷   ZBlankSequencerU   rÔ   rU   rU   rV   rÕ   B  rò   c                 C  rõ   )Nr÷   ZBlankNullSequencerU   rÔ   rU   rU   rV   rÕ   C  rò   )Ú_z_.Ú__Z___rú   c                 C  s   d| d|ggS rö   rU   rÙ   rU   rU   rV   rÕ   E  s    r[   ÚSlotSequence)ú#z##z7list[tuple[str, str | None, dict[str, str | Callable]]]Ú_mathematica_op_precedencec                   C  ó   ddgS )Nr[   rï   rU   rU   rU   rU   rV   rÕ   J  rÛ   c                   C  rÿ   )Nrü   rï   rU   rU   rU   rU   rV   rÕ   K  rÛ   z[A-Za-z][A-Za-z0-9]*z (?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+))rÇ   r~   ró   r‚   )rÈ   r   ú]]rƒ   c                 C  s,   t |tƒrt tj|¡rd|› S dd|gS )Nræ   rç   ú-1)rj   Ústrr¬   ÚmatchrP   Ú_number©rb   r›   rU   rU   rV   rê   T  s   ,zMathematicaParser._get_negc                 C  s
   d|dgS )Nrì   r  rU   r  rU   rU   rV   Ú_get_invX  s   
zMathematicaParser._get_invc                 C  s¸   | j d ur| j S | j| jg}| jd d … | jd d …  }| jD ]\}}}|D ]}| |¡ q&q|jdd„ d | t	t
j|ƒ¡ | d¡ | d¡ t
 dd |¡ d ¡}|| _ | j S )	Nc                 S  s
   t | ƒ S rs   )rh   rÔ   rU   rU   rV   rÕ   g  rë   z2MathematicaParser._get_tokenizer.<locals>.<lambda>)r³   rº   Ú
rÇ   rœ   rÈ   )Ú_regex_tokenizerÚ_literalr  Ú_enclosure_openÚ_enclosure_closerþ   r¾   ÚsortÚextendÚmapr¬   Úescaper­   rª   )r”   ÚtokensZtokens_escapeÚtypZstratZsymdictr¹   Ú	tokenizerrU   rU   rV   Ú_get_tokenizer^  s   
ÿ

z MathematicaParser._get_tokenizerÚcoder  c                   s²  |   ¡ ‰ g }	 | d¡}|dkrt|ƒdkr| |¡ nCt d||d d … ¡}|d u r0tdƒ‚|| ¡  d }|dkrE| |d |… ¡ | d||d |…  d	d¡g¡ ||d d … }qt	|ƒD ]9\}}t
|tƒrmqc	 | d
¡}|dkrxn | d¡}	|	dks…|	|k r‰tdƒ‚|d |… ||	d d …  }qn|||< qc‡ fdd„|D ƒ}
dd„ |
D ƒ}|rÂ|d dkrÂ| d¡ |rÂ|d dksµ|r×|d dkr×| d¡ |r×|d dksÊ|S )NTú"r™   r   z(?<!\\)"rZ   z"mismatch in string "  " expressionZ_Strz\"z(*z*)zmismatch in comment (*  *) coderg   c                   s.   g | ]}t |tƒr| ¡ rˆ  |¡n|g‘qS rU   )rj   r  ÚisasciiÚfindall)r]   rc   ©r  rU   rV   r_   ’  rÖ   zAMathematicaParser._from_mathematica_to_tokens.<locals>.<listcomp>c                 S  s   g | ]	}|D ]}|‘qqS rU   rU   )r]   rc   ÚjrU   rU   rV   r_   “  s    r  )r  Úfindrh   r¾   r¬   r¥   rl   r©   rÂ   rk   rj   rÓ   r¿   )r”   r  Zcode_splitsÚstring_startZ	match_endÚ
string_endrc   Z
code_splitZpos_comment_startZpos_comment_endZtoken_listsr  rU   r  rV   rÊ   o  sN   

"ó


ù

ÿ
ÿz-MathematicaParser._from_mathematica_to_tokensÚtokenú
str | listÚreturnÚboolc                 C  s:   t |tƒrdS t | j|¡rdS t d| j |¡rdS dS )NFz-?T)rj   rÓ   r¬   r  r	  r  ©r”   r  rU   rU   rV   Ú_is_opž  s   
zMathematicaParser._is_opc                 C  ó   |dv rdS |   |¡ S )N)rÈ   rƒ   T©r"  r!  rU   rU   rV   Ú_is_valid_star1§  ó   z!MathematicaParser._is_valid_star1c                 C  r#  )N)rÇ   r‚   Tr$  r!  rU   rU   rV   Ú_is_valid_star2¬  r&  z!MathematicaParser._is_valid_star2r  rÓ   c           
      C  s|  g g}g }d}|t |ƒk r.|| }|| jv r)|d  |¡ | |¡ | g ¡ nû|dkrVt |d ƒdkrG|d d |d krGtd|d  ƒ‚|  |d ¡|d< | g ¡ nÎ|| jv r| j |¡}| j| |d kr¹tdƒ}|dkr·|d dkr·|d dkrˆ| |d	 d
¡ n1|d dkr¶||d	  d
krd||d	 < n||d	  dkr´d||d	 < | |d d
¡ n|‚n|‚t |d ƒdkrÍ|d d dkrÍtdƒ‚|  |d d¡}||d< g }	|d d |d krö|	 | ¡ ¡ |d d |d kså|	 	¡  |d dkrt |	ƒd	krtdt |	ƒ ƒ‚|d  |	¡ | d¡ n|d  |¡ |d	7 }|t |ƒk st |ƒd	ks7J ‚|  |d ¡S )Nr   r™   rº   éþÿÿÿz %s cannot be followed by comma ,zunmatched enclosurer   r~   rZ   r   ró   rg   rÇ   z( ) not valid syntaxTz1( must be followed by one expression, %i detected)
rh   r
  r¾   rl   Ú_parse_after_bracesr  ÚindexÚinsertr¿   Úreverse)
r”   r  ÚstackZopen_seqÚpointerr  ÚindZunmatched_enclosureZ
last_stackZnew_stack_elementrU   rU   rV   rË   ±  s`   

$ù	 ÿÒ/z.MathematicaParser._from_tokens_to_fullformlistÚlinesÚinside_enclosurec           	      C  s  d}t |ƒ}||k r‹|| }|dkr|r| |¡ |d8 }q|dkr,| d¡ |d8 }q|dkrOz|  |d |… |¡}W n tyN   | |¡ |d8 }Y qw |d }t |ƒdkri|d dkri| |dd … ¡ n| |¡ t|ƒD ]}| d¡ qr||8 }d}q|d7 }||k s
d S d S )Nr   r  rZ   rÑ   )rh   r¿   r)  rl   r  r¾   Úrange)	r”   r0  r  r1  r.  Úsizer  Z	prev_exprrc   rU   rU   rV   Ú_util_remove_newlinesç  s@   


ý
âz'MathematicaParser._util_remove_newlinesc                 C  sž   t |ƒ}d}||k rM|dkrC|  ||d  ¡rC|  || ¡rC|| dkr5d||< ||d  d ||d < n| |d¡ |d7 }|d7 }|d7 }||k s
d S d S )Nr   rZ   rÇ   r„   )rh   r%  r'  r+  )r”   r  r3  r.  rU   rU   rV   Ú_util_add_missing_asterisks
  s    ÿþðz-MathematicaParser._util_add_missing_asterisksFc                 C  s\  d}g }|   |||¡ t| jƒD ]P\}}}d|v r|  |¡ t|ƒ}d}	|	|k ra||	 }
t|
tƒrY|
|v rY||
 }t|tƒrH|g}d}ng }d}|
dv rg|| jkrg|	dkrg|  ||	d  ¡sg|	d7 }	q%|| j	kr|	dksˆ|	|d ksˆ|  ||	d  ¡sˆ|  ||	d  ¡r|	d7 }	q%d}|||	< || j	krÈ| 
|	d ¡}| 
|	¡}|
dkr¯|  |¡}n	|
dkr¸|  |¡}|	d8 }	|d	8 }| |¡ |}|| jkr"|	d	 |k r|  ||	d  |
¡r| |¡ | 
|	d ¡}| 
|	d ¡}|dkrü|  |¡}n
|dkr|  |¡}|d	8 }|	d	 |k r|  ||	d  |
¡sß| |¡ n|| jkrk|	d	 |k re||	d  |
kre| ||g¡ |d
 }| 
|	d ¡ | 
|	d ¡}|d	8 }|	d	 |k re||	d  |
ks8| |¡ nÊ|| jkrÂ|	d |k r¼||	d  |
kr¼t|tƒr‘||| |g||< n	||| |ƒ||< | 
|	d ¡ | 
|	d ¡}|d	8 }|	d |k r¼||	d  |
ks| |¡ ns| |¡ nm|| jkrþ|d u sÕJ ‚|	|d ksæ|  ||	d  ¡rï| j|
 ƒ ||	< nF| | 
|	d ¡¡ |d8 }n7|| jkr5|d u sJ ‚|	dks|  ||	d  ¡r#| j|
 ƒ ||	< n| | 
|	d ¡¡ |	d8 }	|d8 }t|tƒrYt t|¡}||Ž }| ¡  t|tƒrU| |¡ n|||	< |	d7 }	|	|k s*qt|ƒdkswt|ƒdkr„t|ƒdkr„|r€|  ||¡S tdƒ‚t|ƒdkrª|d r¡|d d dkr¡|d dd … }dg|¢|¢}|S |d S )NFr„   r   rZ   rä   Trè   ræ   rg   r™   z0unable to create a single AST for the expressionrÑ   )r4  Úreversedrþ   r5  rh   rj   r  ÚPREFIXr"  ÚINFIXr¿   r  rê   r¾   ÚFLATÚ_check_op_compatibleÚRIGHTÚLEFTÚ_missing_arguments_defaultÚPOSTFIXr   ÚtypingÚcastÚclearrÓ   r  r)  rl   )r”   r  r1  Úchangedr0  Zop_typeZgrouping_stratZop_dictr3  r.  r  Zop_nameÚnodeZfirst_indexZarg1Zarg2Znode_pZother_opZop_callÚnew_nodeZcompound_expressionrU   rU   rV   r)    sÌ   


,
8


$


"ø	  û  ù"
¨€*Yz%MathematicaParser._parse_after_bracesÚop1Úop2c                 C  sH   ||krdS ddh}ddh}||v r||v rdS ||v r"||v r"dS dS )NTr„   rè   rå   ræ   FrU   )r”   rE  rF  ZmuldivZaddsubrU   rU   rV   r:  –  s   z&MathematicaParser._check_op_compatibleÚwmexprc           	      C  sô   g }|g}t  d|¡}d}|D ]f}|du r |d S | ¡ }|||…  dd¡ dd¡ dd¡ ¡ }| ¡ dkrD|dkrC|d  |¡ n-| ¡ dkrZ|dkrU|d  |¡ | ¡  n| ¡ dkrq|d  |g¡ | |d d ¡ | ¡ }q|d S )	zH
        Parses FullForm[Downvalues[]] generated by Mathematica
        z[\[\],]r   Nrº   rv   r   r~   r™   )	r¬   Úfinditerr©   rÂ   Ústripr§   r¾   r¿   r²   )	r”   rG  Úoutr-  Ú	generatorZlast_posr  ÚpositionÚ	last_exprrU   rU   rV   Ú_from_fullform_to_fullformlist¡  s.   ò(€

z0MathematicaParser._from_fullform_to_fullformlistÚpylistc                   s(   ddl m‰ m‰ ‡ ‡‡fdd„‰ˆ|ƒS )Nr   )r<   ÚSymbolc                   sf   t | tƒr&t| ƒdkr"| d }‡fdd„| dd … D ƒ}ˆ |ƒ|Ž S tdƒ‚t | tƒr/ˆ| ƒS t| ƒS )Nr   c                   ó   g | ]}ˆ |ƒ‘qS rU   rU   ©r]   rm   )Ú	converterrU   rV   r_   Ã  ó    z\MathematicaParser._from_fullformlist_to_fullformsympy.<locals>.converter.<locals>.<listcomp>rZ   zEmpty list of expressions)rj   rÓ   rh   r“   r  rL   )ÚexprÚheadr\   ©r<   rP  rS  rU   rV   rS  ¿  s   

zHMathematicaParser._from_fullformlist_to_fullformsympy.<locals>.converter)Úsympyr<   rP  )r”   rO  rU   rW  rV   Ú#_from_fullformlist_to_fullformsympy¼  s   z5MathematicaParser._from_fullformlist_to_fullformsympyZLogc                  G  s   t t| ƒŽ S rs   )r	   r6  ©r^   rU   rU   rV   rÕ   Ò  rò   ZLog2c                 C  ó
   t | dƒS ©Nrg   ©r	   rÔ   rU   rU   rV   rÕ   Ó  rë   ZLog10c                 C  r[  )Né
   r]  rÔ   rU   rU   rV   rÕ   Ô  rë   ZExpZSqrtrw   rx   ry   rz   r{   r|   ZArcSinZArcCosZArcTanc                  G  s    t | ƒdkrtt| ƒŽ S t| Ž S r\  )rh   r(   r6  r'   rZ  rU   rU   rV   rÕ   á  s     ZArcCotZArcSecZArcCscZSinhZCoshZTanhZCothZSechZCschZArcSinhZArcCoshZArcTanhZArcCothZArcSechZArcCschZExpandZImZReZFlattenZPolylogZCancelZ
TrigExpandZSignZSimplifyZDeferZIdentityrÒ   c                  G  s   t jS rs   )r&   ZZerorZ  rU   rU   rV   rÕ     s    r)   r*   r+   Z
PochhammerZExpIntegralEiZSinIntegralZCosIntegralZAiryAiZAiryAiPrimeZAiryBiZAiryBiPrimeZLogIntegralZPrimePiÚPrimeZPrimeQrî   )r=   rˆ   c                   s   ‡ ‡fdd„‰ ˆ |ƒS )Nc                   sp   t | tƒr/t | d tƒrˆ | d ƒ}nˆj | d t| d ƒ¡}|‡ fdd„| dd … D ƒŽ S ˆj | t| ƒ¡S )Nr   c                   rQ  rU   rU   rR  )ÚrecurserU   rV   r_   -  rT  zRMathematicaParser._from_fullformlist_to_sympy.<locals>.recurse.<locals>.<listcomp>rZ   )rj   rÓ   Ú_node_conversionsÚgetr<   Ú_atom_conversionsrK   )rU  rV  ©r`  r”   rU   rV   r`  '  s   
z>MathematicaParser._from_fullformlist_to_sympy.<locals>.recurserU   )r”   Zfull_form_listrU   rd  rV   rÌ   %  s   
z-MathematicaParser._from_fullformlist_to_sympyc                 C  s,   |}| j  ¡ D ]\}}| t|ƒ|¡}q|S rs   )ra  r    rÂ   r<   )r”   ZmformrU  Zmma_formZ
sympy_noderU   rU   rV   Ú_from_fullformsympy_to_sympy3  s   z.MathematicaParser._from_fullformsympy_to_sympyrs   )r  r  )r  r  r  r   )r  rÓ   )r0  rÓ   r  rÓ   r1  r   )F)r  rÓ   r1  r   )rE  r  rF  r  )rG  r  )rO  rÓ   )…Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚarcZtrir}   r¯   Úlowerrž   rŽ   rÁ   r¬   r­   r®   rÅ   r¤   ZARG_MTRX_PATTERNr«   r‰   Ú__annotations__rŠ   r‹   Úclassmethodrt   r•   rŒ   r¸   r´   r¨   r£   r¢   r¡   rQ   rX   r8  r7  r>  r9  r;  r<  rþ   r=  r	  r  r
  r  rê   r  r  r  rÊ   r"  r%  r'  rË   r4  r5  r)  r:  rN  rY  r   r   r   r
   r   r   r   r   r6   r7   r8   r   r   r   r   r   r   r   r   r;   r:   r9   r   r   r   r   r   r   r   r   rX  r   r    r!   r"   r#   r$   r%   r&   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   rM   rN   r3   r4   r5   r?   rA   r@   rB   rC   rD   rE   rF   rr   ra  r=   r>   rc  rÌ   re  rU   rU   rU   rV   rP   n   sr  
 ÿþýüûúùø	÷
öõôóòñðïêÿü
üú
üú
üú
úøã)ú	þ	

?'B
%




ÿüÝ'þ

/	6#wÿþýüûúùø
öõôóòñïîíìëêèçæåäãá à!ß"Þ#Ý$Ü&Ú'Ù(Ø)×*Ö+Õ-Ó.Ò/Ñ0Ð1Ï5Ë6Ê7É8È9Ç:Æ;Å<Ä=Ã>Â?Á@ÀA¿B¾C½D¼FºG¹H¸I·J¶KµL´M³O±SþrP   rs   )\Ú
__future__r   r¬   r?  Ú	itertoolsr   r   r   rX  r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   Zsympy.core.sympifyrK   rL   Zsympy.functions.special.besselrM   Z'sympy.functions.special.error_functionsrN   Zsympy.utilities.exceptionsrO   rW   rY   rr   ru   rP   rU   rU   rU   rV   Ú<module>   s$    þ 
6