o
    oÇhÛš  ã                   @  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@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN d dlOmPZPmQZQ d dlRmSZS d dlTmUZU d d	lVmWZW dd
d„ZXdd„ ZYdd„ ZZdd„ Z[e[G dd„ dƒƒZ\dS )é    )ÚannotationsN)Úproduct)ÚAnyÚCallable)FÚMulÚAddÚPowÚRationalÚ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)Údeprecated_since_versionÚactive_deprecations_target)rP   ÚMathematicaParserrL   Ú
_parse_old)ÚsÚadditional_translationsÚparser© rX   úm/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/parsing/mathematica.pyÚmathematica   s   úrZ   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))
    )rS   Úparse)rU   rW   rX   rX   rY   Úparse_mathematica    s   2
r\   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ÚarX   rX   rY   Ú
<listcomp>[   s    z#_parse_Function.<locals>.<listcomp>zdummy0:©Úclsc                   s   i | ]\}}ˆ |d  ƒ|“qS )r]   rX   )r`   ÚiÚv©r^   rX   rY   Ú
<dictcomp>_   s    z#_parse_Function.<locals>.<dictcomp>rX   é   z&Function node expects 1 or 2 arguments)Úlenr=   ÚatomsÚmaxÚ
isinstancerI   rK   rJ   rH   ÚxreplaceÚ	enumerateÚSyntaxError)r_   ÚargÚslotsÚnumbersÚnumber_of_argumentsÚ	variablesÚbodyrX   rg   rY   Ú_parse_FunctionV   s   

"

rw   c                 C  s   |   ¡  | S ©N)Ú_initialize_classrc   rX   rX   rY   Ú_decoi   s   rz   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)d*œ¥Zed+d,d-ƒD ])\ZZZee e d. Z	ered/e 
¡  e d0 Zne 
¡ e d0 Ze e	ei¡ qKd1d2d3d4d5œZe d6ej¡d7fe d8ej¡d7fe d9ej¡d:fe d;ej¡d<fd=œZe d>ej¡Ze d?ej¡Zd@Zi ZdAedB< i ZdAedC< i ZdAedD< edEdF„ ƒZd.dHdI„ZedJdK„ ƒZdLdM„ ZdNdO„ ZedPdQ„ ƒZedRdS„ ƒZ edTdU„ ƒZ!edVdW„ ƒZ"dXdY„ Z#dZd[„ Z$d\Z%d]Z&d^Z'd_Z(d`Z)daZ*e'dGdbdcdd„ ife%e(dbdeife%e)dfdgdhdidjdkdlœfe%e*dmdndd„ ife'dGdodpife%e*dqdrife%e)dsdtduœfe%e*dvdwife%e(dxdyife'dGdzd{d|œfe%e(d}d~ife%e(dd€ife&dGdd‚ife%e(dƒd„d…œfe%e(d†d‡dˆd‰dŠd‹dŒœfe%dGddŽife%e(dddœfe%e(d‘d‘d’œfe%e(d“d”ife&dGd•dd„ d–dd„ d—œfe%e)d˜d™ife%e)dšd›dœddd„ džœfe'dGdŸd d¡d¢d£œfe%dGd¤dd„ d¥dd„ d¦œfe&dGd§dd„ d¨dd„ d©œfe%dGdªd«ife'dGd¬dd„ d­dd„ d®dd„ d¯dd„ d°œfe%dGd±d²dd„ ife&dGd³d´dµœfgZ+d¶ed·< d¸dd„ d¹dd„ dµœZ,dºZ-d»Z.g d¼¢Z/g d½¢Z0ed¾d¿„ ƒZ1edÀdÁ„ ƒZ2dGZ3dÂdÃ„ Z4d/dÆdÇ„Z5d0dÌdÍ„Z6d0dÎdÏ„Z7d0dÐdÑ„Z8d1dÔdÕ„Z9d2dØdÙ„Z:d1dÚdÛ„Z;d3d4dÝdÞ„Z<d5dádâ„Z=d6dädå„Z>d7dçdè„Z?i d‘e@“deA“d™eB“déeC“dêdëdd„ “dìdídd„ “dîdïdd„ “déeC“dðeD“dñeE“dòeF“dóeG“dôeH“dõeI“döeJ“d÷eK“døeL“i dùeM“dúdûdd„ “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\“¥i de]“de^“de_j“de`“dea“deb“dec“ded“dee“def“deg“dddd„ “deh“dei“dej“dek“del“¥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}“¥e~ed(œ¥Z€ee‚d)œZƒd*d+„ Z„d,d-„ Z…dGS (8  rS   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Rational[x,y]zRational(x,y)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airybiprime(x)z li(x)z
primepi(x)zprime(x)z
isprime(x))z	AiryBi[x]zAiryBiPrime[x]zLogIntegral[x]z
PrimePi[x]zPrime[x]z	PrimeQ[x])Ú ÚArc)ÚSinÚCosÚTanÚCotÚSecÚCsc)r{   Úhz[x]ra   z(x)r{   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 rx   )Ú_compile_dictionaryÚCORRESPONDENCESr   Úupdate)rd   ÚdrX   rX   rY   ry   ÷   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   rm   ÚdictÚ
ValueErrorr’   r‘   )ÚselfrV   r•   rX   rX   rY   Ú__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Š   ú\rX   )r`   ÚxrX   rX   rY   rb   C  s   $ z9MathematicaParser._compile_dictionary.<locals>.<listcomp>z(?:(ú|z)))Ú	argumentsÚfsr_   Úpat)ÚitemsÚ_check_inputÚ_apply_rulesÚ_replaceÚ
FM_PATTERNÚsearchÚformatr™   ÚgroupÚ	_get_argsÚstartrj   ÚjoinÚARGS_PATTERN_TEMPLATEÚreÚcompileÚVERBOSE)rd   Údicr•   Úfmr¤   ÚmÚerrÚfm_namer_   ÚendÚkey_argÚkeyÚre_argsÚxyzÚpatStrr¥   rX   rX   rY   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 oner{   r   TN)rª   r«   r­   r®   r¯   Ú_convert_one_function)
rš   rU   r¥   ÚscannedÚcurr·   r¶   r_   rº   ÚbgnrX   rX   rY   Ú_convert_functionU  s"   
ìåz#MathematicaParser._convert_functionc                 C  s^  |t |ƒf| jv r|t |ƒf}| j| d }tt||ƒƒ}nA|df| jv rU|df}| j| d }i }t|ƒD ]\}	}
|
d dkrMd ||	d … ¡||
<  n||	 ||
< q6n
dj|d}t|ƒ‚| j| d }| j| d }d	}d}	 | |¡}|d u r€||7 }n| 	¡ }
| 
¡ }||d |… ||
  7 }| ¡ }||d … }qr|d |… | ||d …  }|S )
Nr_   rŠ   r   ú,z'{f}' is out of the whitelist.r   r¤   r¥   r{   )rj   r–   r˜   Úzipro   r°   r¬   r™   r«   r­   r¯   rº   )rš   rU   r¶   r_   rÃ   rº   r¼   Úx_argsr•   re   r¡   r¸   Útemplater¥   rÁ   rÂ   r·   ÚxbgnrX   rX   rY   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 functionr]   NrÅ   rˆ   r‰   r„   r…   )Ústringrº   ro   ÚappendÚpop)rd   r·   rU   ÚancÚsquareÚcurlyr_   rÂ   re   ÚcÚfunc_endrX   rX   rY   r®   ¾  s.   

ûzMathematicaParser._get_argsc                 C  s   | j | }| ||¡}|S rx   )ÚREPLACEMENTSÚreplace)rd   rU   ÚbefÚaftrX   rX   rY   r©   ä  s   
zMathematicaParser._replacec                 C  s   | j | \}}| ||¡S rx   )ÚRULESÚsub)rd   rU   rÔ   r¥   rÕ   rX   rX   rY   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   r]   rœ   r   rˆ   z Currently list is not supported.)Úcountr¬   r™   )rd   rU   Úbracketr¸   rX   rX   rY   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š   rU   rX   rX   rY   rT   ú  s   

zMathematicaParser._parse_oldc                 C  s"   |   |¡}|  |¡}|  |¡}|S rx   )Ú_from_mathematica_to_tokensÚ_from_tokens_to_fullformlistÚ_from_fullformlist_to_sympy)rš   rU   Ús2Ús3Ús4rX   rX   rY   r[     s   


zMathematicaParser.parseÚInfixÚPrefixÚPostfixÚFlatÚRightÚLeftú;c                 C  s.   t | tƒr| r| d dkr| dg S d| dgS )Nr   ÚCompoundExpressionÚNull)rm   Úlist©r¡   rX   rX   rY   Ú<lambda>%  ó   . zMathematicaParser.<lambda>ré   ÚSetÚ
SetDelayedÚAddToÚSubtractFromÚTimesByÚDivideBy)ú=z:=z+=z-=z*=z/=z//c                 C  s   | |gS rx   rX   ©r¡   ÚyrX   rX   rY   rí   (  ó    ú&r=   z/.Ú
ReplaceAllÚRuleÚRuleDelayed)z->z:>z/;Ú	Conditionr¢   ÚAlternativesÚRepeatedÚRepeatedNull)z..z...z||rF   z&&rG   ú!ÚNotÚSameQÚUnsameQ)z===z=!=ÚEqualÚUnequalÚ	LessEqualÚLessÚGreaterEqualÚGreater)z==z!=z<=ú<z>=ú>z;;ÚSpanÚPlus©ú+ú-ÚTimes)rŠ   ú/Ú.ÚDotc                 C  s
   t  | ¡S rx   )rS   Ú_get_negrì   rX   rX   rY   rí   8  ó   
 c                 C  s   | S rx   rX   rì   rX   rX   rY   rí   9  s    )r  r  r‡   ÚPowerÚApplyÚMapÚMapAllc                 C  s   d| |ddggS )Nr  ÚListÚ1rX   rö   rX   rX   rY   rí   ;  ó    )z@@z/@z//@z@@@Ú
DerivativeÚ	FactorialÚ
Factorial2Ú	Decrement)ú'r  z!!z--c                 C  s
   | g|¢S rx   rX   rö   rX   rX   rY   rí   =  r  c                 C  s   d| g|¢S )NÚPartrX   rö   rX   rX   rY   rí   =  ó    )r„   ú[[c                 C  s
   dg| ¢S )Nr  rX   rì   rX   rX   rY   rí   >  r  c                 C  s   | d S )Nr   rX   rì   rX   rX   rY   rí   >  rø   )rˆ   rØ   ú?ÚPatternTestc                 C  ó   d| dggS ©NÚPatternÚBlankrX   rì   rX   rX   rY   rí   A  r%  c                 C  s   dd| dgggS )NÚOptionalr+  r,  rX   rì   rX   rX   rY   rí   B  r  c                 C  r)  )Nr+  ÚBlankSequencerX   rì   rX   rX   rY   rí   C  r%  c                 C  r)  )Nr+  ÚBlankNullSequencerX   rì   rX   rX   rY   rí   D  r%  )Ú_z_.Ú__Ú___r0  c                 C  s   d| d|ggS r*  rX   rö   rX   rX   rY   rí   F  s    r^   ÚSlotSequence)ú#z##z7list[tuple[str, str | None, dict[str, str | Callable]]]Ú_mathematica_op_precedencec                   C  ó   ddgS )Nr^   r  rX   rX   rX   rX   rY   rí   K  rø   c                   C  r6  )Nr3  r  rX   rX   rX   rX   rY   rí   L  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)rm   Ústrr²   ÚmatchrS   Ú_number©rd   r¡   rX   rX   rY   r  U  s   ,zMathematicaParser._get_negc                 C  s
   d|dgS )Nr  r8  rX   r<  rX   rX   rY   Ú_get_invY  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 rx   )rj   rì   rX   rX   rY   rí   h  r  z2MathematicaParser._get_tokenizer.<locals>.<lambda>)r¼   rÅ   Ú
rØ   r¢   rÙ   )Ú_regex_tokenizerÚ_literalr;  Ú_enclosure_openÚ_enclosure_closer5  rË   ÚsortÚextendÚmapr²   Úescaper³   r°   )rš   ÚtokensÚtokens_escapeÚtypÚstratÚsymdictÚkÚ	tokenizerrX   rX   rY   Ú_get_tokenizer_  s   
ÿ

z MathematicaParser._get_tokenizerÚcoder9  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(?<!\\)"r]   z"mismatch in string "  " expressionÚ_Strz\"z(*z*)zmismatch in comment (*  *) coderi   c                   s.   g | ]}t |tƒr| ¡ rˆ  |¡n|g‘qS rX   )rm   r9  ÚisasciiÚfindall)r`   re   ©rM  rX   rY   rb   “  rî   zAMathematicaParser._from_mathematica_to_tokens.<locals>.<listcomp>c                 S  s   g | ]	}|D ]}|‘qqS rX   rX   )r`   re   ÚjrX   rX   rY   rb   ”  s    r>  )rN  Úfindrj   rË   r²   r«   rp   r¯   rÓ   ro   rm   rë   rÌ   )rš   rO  Úcode_splitsÚstring_startÚ	match_endÚ
string_endre   Ú
code_splitÚpos_comment_startÚpos_comment_endÚtoken_listsrG  rX   rT  rY   rÜ   p  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)rm   rë   r²   r:  r@  r;  ©rš   r_  rX   rX   rY   Ú_is_opŸ  s   
zMathematicaParser._is_opc                 C  ó   |dv rdS |   |¡ S )N)rÙ   r‰   T©rd  rc  rX   rX   rY   Ú_is_valid_star1¨  ó   z!MathematicaParser._is_valid_star1c                 C  re  )N)rØ   rˆ   Trf  rc  rX   rX   rY   Ú_is_valid_star2­  rh  z!MathematicaParser._is_valid_star2rG  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r9t
dƒ‚|  |d ¡S )Nr   rŸ   rÅ   éþÿÿÿz %s cannot be followed by comma ,zunmatched enclosurer7  r„   r]   r…   r&  ri   rØ   z( ) not valid syntaxTz1( must be followed by one expression, %i detectedz"Stack should have only one element)rj   rA  rË   rp   Ú_parse_after_bracesrB  ÚindexÚinsertrÌ   ÚreverseÚRuntimeError)
rš   rG  ÚstackÚopen_seqÚpointerr_  ÚindÚunmatched_enclosureÚ
last_stackÚnew_stack_elementrX   rX   rY   rÝ   ²  sb   

$ù	 ÿÒ/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>  r]   ré   )rj   rÌ   rk  rp   rD  rË   Úrange)	rš   rw  rG  rx  rr  Úsizer_  Ú	prev_exprre   rX   rX   rY   Ú_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   r]   rØ   rŠ   )rj   rg  ri  rm  )rš   rG  rz  rr  rX   rX   rY   Ú_util_add_missing_asterisks  s    ÿþðz-MathematicaParser._util_add_missing_asterisksFc                 C  sd  d}g }|   |||¡ t| jƒD ]T\}}}d|v r|  |¡ t|ƒ}d}	|	|k re||	 }
t|
tƒr]|
|v r]||
 }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| |¡ nw| |¡ nq|| jkr |d ur×tdƒ‚|	|d ksè|  ||	d  ¡rñ| j|
 ƒ ||	< nH| | 
|	d ¡¡ |d8 }n9|| jkr9|d urtdƒ‚|	dks|  ||	d  ¡r'| j|
 ƒ ||	< n| | 
|	d ¡¡ |	d8 }	|d8 }t|tƒr]t t|¡}||Ž }| ¡  t|tƒrY| |¡ n|||	< |	d7 }	|	|k s*qt|ƒdks{t|ƒ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   r]   r  Tr  r  ri   rŸ   z1'Prefix' op_type should not have a grouping stratz0unable to create a single AST for the expressionré   )r|  Úreversedr5  r}  rj   rm   r9  ÚPREFIXrd  ÚINFIXrÌ   r=  r  rË   ÚFLATÚ_check_op_compatibleÚRIGHTÚLEFTÚ	TypeErrorÚ_missing_arguments_defaultÚPOSTFIXr   ÚtypingÚcastÚclearrë   rD  rk  rp   )rš   rG  rx  Úchangedrw  Úop_typeÚgrouping_stratÚop_dictrz  rr  r_  Úop_nameÚnodeÚfirst_indexÚarg1Úarg2Únode_pÚother_opÚop_callÚnew_nodeÚcompound_expressionrX   rX   rY   rk  !  sÐ   


,
8


$


"ø	  û  ù
"

¦€*[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  FrX   )rš   r™  rš  ÚmuldivÚaddsubrX   rX   rY   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Å   r{   r…   r„   rŸ   )	r²   Úfinditerr¯   rÓ   Ústripr­   rË   rÌ   rº   )	rš   r  Úoutrp  Ú	generatorÚlast_posr:  ÚpositionÚ	last_exprrX   rX   rY   Ú_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 rX   rX   ©r`   rq   )Ú	converterrX   rY   rb   Ç  ó    z\MathematicaParser._from_fullformlist_to_fullformsympy.<locals>.converter.<locals>.<listcomp>r]   zEmpty list of expressions)rm   rë   rj   r™   r9  rM   )ÚexprÚheadr_   ©r=   r§  rª  rX   rY   rª  Ã  s   

zHMathematicaParser._from_fullformlist_to_fullformsympy.<locals>.converter)Úsympyr=   r§  )rš   r¦  rX   r®  rY   Ú#_from_fullformlist_to_fullformsympyÀ  s   z5MathematicaParser._from_fullformlist_to_fullformsympyr	   ÚLogc                  G  s   t t| ƒŽ S rx   )r
   r~  ©ra   rX   rX   rY   rí   ×  r%  ÚLog2c                 C  ó
   t | dƒS ©Nri   ©r
   rì   rX   rX   rY   rí   Ø  r  ÚLog10c                 C  r´  )Né
   r¶  rì   rX   rX   rY   rí   Ù  r  ÚExpÚSqrtr}   r~   r   r€   r   r‚   ÚArcSinÚArcCosÚArcTanc                  G  s    t | ƒdkrtt| ƒŽ S t| Ž S rµ  )rj   r)   r~  r(   r²  rX   rX   rY   rí   ç  s     ÚArcCotÚArcSecÚArcCscÚSinhÚCoshÚTanhÚCothÚSechÚCschÚArcSinhÚArcCoshÚArcTanhÚArcCothÚArcSechÚArcCschÚExpandÚImÚReÚFlattenÚPolylogÚCancelÚ
TrigExpandÚSignÚSimplifyÚDeferÚIdentityrê   c                  G  s   t jS rx   )r'   ÚZeror²  rX   rX   rY   rí   	  s    r*   r+   r,   Ú
PochhammerÚExpIntegralEiÚSinIntegralÚCosIntegralÚAiryAiÚAiryAiPrimeÚAiryBiÚAiryBiPrimeÚLogIntegralÚPrimePiÚPrimeÚPrimeQr  )rG   r=   )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                   r¨  rX   rX   r©  )ÚrecurserX   rY   rb   3  r«  zRMathematicaParser._from_fullformlist_to_sympy.<locals>.recurse.<locals>.<listcomp>r]   )rm   rë   Ú_node_conversionsÚgetr=   Ú_atom_conversionsrL   )r¬  r­  ©rå  rš   rX   rY   rå  -  s   
z>MathematicaParser._from_fullformlist_to_sympy.<locals>.recurserX   )rš   Úfull_form_listrX   ré  rY   rÞ   +  s   
z-MathematicaParser._from_fullformlist_to_sympyc                 C  s,   |}| j  ¡ D ]\}}| t|ƒ|¡}q|S rx   )ræ  r¦   rÓ   r=   )rš   Úmformr¬  Úmma_formÚ
sympy_noderX   rX   rY   Ú_from_fullformsympy_to_sympy9  s   z.MathematicaParser._from_fullformsympy_to_sympyrx   )rO  r9  )r_  r`  ra  rb  )rG  rë   )rw  rë   rG  rë   rx  rb  )F)rG  rë   rx  rb  )r™  r9  rš  r9  )r  r9  )r¦  rë   )†Ú__name__Ú
__module__Ú__qualname__Ú__doc__r“   r   ÚarcÚtrirƒ   r¶   Úlowerr¤   r”   rÒ   r²   r³   r´   rÖ   rª   ÚARG_MTRX_PATTERNr±   r   Ú__annotations__r   r‘   Úclassmethodry   r›   r’   rÄ   rÀ   r®   r©   r¨   r§   rT   r[   r€  r  r‡  r  rƒ  r„  r5  r†  r@  r;  rA  rB  r  r=  r?  rN  rÜ   rd  rg  ri  rÝ   r|  r}  rk  r‚  r¥  r°  r   r   r   r	   r   r   r   r   r   r7   r8   r9   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   rN   rO   r4   r5   r6   r@   rB   rA   rC   rD   rE   rF   rG   rw   ræ  r>   r?   rè  rÞ   rî  rX   rX   rX   rY   rS   n   sz  
 ÿþýüûúùø	÷
öõôóòñðïéÿü
üú
üú
üú
úøã)ú	þ	

?'B
%




ÿüÝ'þ

/	7#yÿþýüûúùø	÷
öôóòñðïíìëêéèæåäãâá!ß"Þ#Ý$Ü%Û&Ú(Ø)×*Ö+Õ,Ô-Ó/Ñ0Ð1Ï2Î3Í7É8È9Ç:Æ;Å<Ä=Ã>Â?Á@ÀA¿B¾C½D¼E»FºH¸I·J¶KµL´M³N²O
¯UþrS   rx   )]Ú
__future__r   r²   rˆ  Ú	itertoolsr   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,   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   rK   Úsympy.core.sympifyrL   rM   Úsympy.functions.special.besselrN   Ú'sympy.functions.special.error_functionsrO   Úsympy.utilities.exceptionsrP   rZ   r\   rw   rz   rS   rX   rX   rX   rY   Ú<module>   s$    þ" 
6