o
    8Va2                     @   s\   d dl mZmZmZ d dlmZ d dlZd dlmZ dddZ	dd Z
e
G d	d
 d
ZdS )    )AnyDictTuple)productN)sympifyc                 C   s   t |}t|| S )aC  
    Users can add their own translation dictionary.
    variable-length argument needs '*' character.

    Examples
    ========

    >>> from sympy.parsing.mathematica import mathematica
    >>> mathematica('Log3[9]', {'Log3[x]':'log(x,3)'})
    2
    >>> mathematica('F[7,5,3]', {'F[*x]':'Max(*x)*Min(*x)'})
    21

    )MathematicaParserr   parse)sadditional_translationsparser r   ;/usr/lib/python3/dist-packages/sympy/parsing/mathematica.pymathematica   s   r   c                 C   s   |    | S N)_initialize_class)clsr   r   r   _deco   s   r   c                   @   s  e Zd Z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rcd.e
  e d/ Zne
 e d/ Zee	ei qId0d1d2d3d4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i Zi Zed@dA ZdUdCdDZedEdF ZdGdH ZdIdJ ZedKdL ZedMdN ZedOdP Z edQdR Z!dSdT Z"dBS )Vr   zxAn instance of this class converts a string of a basic Mathematica
    expression to SymPy style. Output is string type.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)ZSinZCosZTanZCotZSecZCsc)r   hz[x]az(x)r   z**[]) ^{}z
                (?<=[a-zA-Z\d])     # a letter or a number
                \                   # a whitespace
                (?=[a-zA-Z\d])      # a letter or a number
                *z
                (?<=[])\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])
                Zpi)
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])
                c                 C   s   |  | j}| j| d S r   )_compile_dictionaryCORRESPONDENCESTRANSLATIONSupdate)r   dr   r   r   r      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__cache_original
isinstancedict
ValueErrorr!   cache_compiled)selfr
   r%   r   r   r   __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   \r   ).0xr   r   r   
<listcomp>   s   $ z9MathematicaParser._compile_dictionary.<locals>.<listcomp>z(?:(|z)))Z	argumentsfsargspat)items_check_input_apply_rules_replace
FM_PATTERNsearchformatr+   group	_get_argsstartlenjoinARGS_PATTERN_TEMPLATErecompileVERBOSE)r   Zdicr%   fmr8   merrZfm_namer9   endZkey_argkeyZre_argsZxyzZpatStrr:   r   r   r   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@   rB   rC   rD   _convert_one_function)
r-   r	   r:   scannedcurrL   rK   r9   rN   bgnr   r   r   _convert_function   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 )Nr9   c                 S   s   i | ]\}}||qS r   r   )r4   kvr   r   r   
<dictcomp>'  s    z;MathematicaParser._convert_one_function.<locals>.<dictcomp>r   r   ,z'{f}' is out of the whitelist.r0   r8   r:   r   )rE   r&   zip	enumeraterF   rA   r+   r@   rB   rD   rN   )r-   r	   rK   r9   rS   rN   rO   Zx_argsr%   ir5   rM   templater:   rQ   rR   rL   Zxbgnr   r   r   rP     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 function   NrX   r   r   r   r   )stringrN   rZ   appendpop)r   rL   r	   ZancZsquareZcurlyr9   rR   r[   cZfunc_endr   r   r   rC   `  s.   

zMathematicaParser._get_argsc                 C   s   | j | }|||}|S r   )REPLACEMENTSreplace)r   r	   befaftr   r   r   r>     s   
zMathematicaParser._replacec                 C   s   | j | \}}|||S r   )RULESsub)r   r	   rd   r:   re   r   r   r   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/   r0   r   z Currently list is not supported.)countrA   r+   )r   r	   ZbracketrM   r   r   r   r<     s   zMathematicaParser._check_inputc                 C   s`   |  | | |d}| |d}| |d}| |d}| |}| |d}| |d}|S )Nr   r   r   r   r   r    )r<   r=   r>   rT   )r-   r	   r   r   r   r     s   

zMathematicaParser.parser   )#__name__
__module____qualname____doc__r"   r   ZarcZtrir   rK   lowerr8   r$   rb   rH   rI   rJ   rf   r?   ZARG_MTRX_PATTERNrG   r#   r(   r,   classmethodr   r.   r!   rT   rP   rC   r>   r=   r<   r   r   r   r   r   r   !   s    	




)		


?'B
%



r   r   )typingr   r   r   	itertoolsr   rH   Zsympyr   r   r   r   r   r   r   r   <module>   s    
