a
    <b2                     @   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   i/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-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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 ]R\ZZZee e d Z	er~de
  e d Zne
 e d Zee	ei qJdd d!d"d#Zed$ejd%fed&ejd%fed'e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i Zi Zed/d0 ZdDd2d3Zed4d5 Zd6d7 Zd8d9 Zed:d; Zed<d= Zed>d? Z ed@dA Z!dBdC Z"d1S )Er   zxAn instance of this class converts a string of a basic Mathematica
    expression to SymPy style. Output is string type.zsqrt(x)zexp(x)zlog(x)zlog(y,x)zlog(x,2)z	log(x,10)zMod(x,y)zMax(*x)zMin(*x)zrf(x,y)z
atan2(y,x)zEi(x)zSi(x)zCi(x)z	airyai(x)zairyaiprime(x)z	airybi(x)zairybiprime(x)z li(x)z
primepi(x)zprime(x)z
isprime(x))zSqrt[x]zExp[x]zLog[x]zLog[x,y]zLog2[x]zLog10[x]zMod[x,y]zMax[*x]zMin[*x]zPochhammer[x,y]zArcTan[x,y]zExpIntegralEi[x]zSinIntegral[x]zCosIntegral[x]z	AiryAi[x]zAiryAiPrime[x]z	AiryBi[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])
                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rXt|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   sX  i }|  D ]D\}}| | | | | |d}| |d}| |d}| |d}| j|}|d u rdj|d}t|| }| 	|\}}	|
 dks|	t|krdj|d}t||d d dkrd}
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>       z9MathematicaParser._compile_dictionary.<locals>.<listcomp>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&   fmr;   merrZfm_namer<   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 }q|| }| |\}}| }	| ||||	|}|	}||d| 7 }||d }q|S )z'Parse Mathematica function to SymPy oner   r   N)rB   rC   rE   rF   rG   _convert_one_function)
r.   r	   r=   scannedcurrO   rN   r<   rQ   bgnr   r   r   _convert_function   s    
z#MathematicaParser._convert_functionc                 C   sf  |t |f| jv rB|t |f}| j| d }dd t||D }n|df| jv r|df}| j| d }i }t|D ]:\}	}
|
d dkrd||	d  ||
<  q||	 ||
< qrndj|d}t|| j| d	 }| j| d
 }d}d}||}|d u r||7 }qF| }
|	 }||d | ||
  7 }|
 }||d  }q|d | | ||d   }|S )Nr<   c                 S   s   i | ]\}}||qS r   r   )r5   kvr   r   r   
<dictcomp>'  r8   z;MathematicaParser._convert_one_function.<locals>.<dictcomp>r   r   ,z'{f}' is out of the whitelist.r1   r;   r=   r   )rH   r'   zip	enumeraterI   rD   r,   rC   rE   rG   rQ   )r.   r	   rN   r<   rV   rQ   rR   Zx_argsr&   ir6   rP   templater=   rT   rU   rO   Zxbgnr   r   r   rS     s<    

z'MathematicaParser._convert_one_functionc                 C   s   |j }| d }g g  }}g }|}t||d |D ]\}}	|	dkrh|sh|sh||||  |d }|	dkr|||	 n|	dkr|  |	dkr||	 q6|	dkr6|r|  q6||||   qq6|d }
||
fS )z'Get arguments of a Mathematica function   Nr[   r   r   r   r   )stringrQ   r]   appendpop)r   rO   r	   ZancZsquareZcurlyr<   rU   r^   cZfunc_endr   r   r   rF   `  s,    

zMathematicaParser._get_argsc                 C   s   | j | }|||}|S r   )REPLACEMENTSreplace)r   r	   befaftr   r   r   rA     s    
zMathematicaParser._replacec                 C   s   | j | \}}|||S r   )RULESsub)r   r	   rg   r=   rh   r   r   r   r@     s    zMathematicaParser._apply_rulesc                 C   sR   dD ]4}| |d | |d krdj|d}t|qd|v rNd}t|d S )N))r   r   )r   r   )()r   r`   r0   r1   r   z Currently list is not supported.)countrD   r,   )r   r	   ZbracketrP   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@   rA   rW   )r.   r	   r   r   r   r     s    

zMathematicaParser.parse)N)#__name__
__module____qualname____doc__r#   r   ZarcZtrir   rN   lowerr;   r%   re   rK   rL   rM   ri   rB   ZARG_MTRX_PATTERNrJ   r$   r)   r-   classmethodr   r/   r"   rW   rS   rF   rA   r@   r?   r   r   r   r   r   r   !   s   



)		


?'B
%



r   )N)typingr   r   ZtDictr   ZtTuple	itertoolsr   rK   Zsympy.core.sympifyr   r   r   r   r   r   r   r   <module>   s   
