B
    ˜‘[90  ã               @   sZ   d dl 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
e
ƒƒZdS )é    )Úprint_functionÚdivision)ÚproductN)Úsympifyc             C   s   t |ƒ}t| | ¡ƒS )a  Users can add their own translation dictionary
    # Example
    In [1]: mathematica('Log3[9]', {'Log3[x]':'log(x,3)'})
    Out[1]: 2
    In [2]: mathematica('F[7,5,3]', {'F[*x]':'Max(*x)*Min(*x)'})
    Out[2]: 21
    variable-length argument needs '*' character )ÚMathematicaParserr   Úparse)ÚsÚadditional_translationsÚparser© r   ú8lib/python3.7/site-packages/sympy/parsing/mathematica.pyÚmathematica   s    	r   c             C   s   |   ¡  | S )N)Ú_initialize_class)Úclsr   r   r   Ú_deco   s    r   c            
   @   sv  e Zd ZdZdddddddd	d
dœ	ZxbedddƒD ]R\ZZZee e d Z	erfde 
¡  e d Zne 
¡ e d Ze e	ei¡ q2W d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"d#„ ƒZd7d%d&„Zed'd(„ ƒZd)d*„ Zd+d,„ Zed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZ ed3d4„ ƒZ!d5d6„ Z"d$S )8r   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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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)Ú
whitespacezadd*_1z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 )N)Ú_compile_dictionaryÚCORRESPONDENCESÚTRANSLATIONSÚupdate)r   Údr   r   r   r   …   s    z#MathematicaParser._initialize_classNc             C   sl   i | _ | j  | j¡ |d k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   s^  i }xR|  ¡ D ]D\}}|  |¡ |  |¡ |  |d¡}|  |d¡}|  |d¡}|  |d¡}| j |¡}|d kr†dj|d}t|ƒ‚| ¡ }|  	|¡\}}	| 
¡ dks´|	t|ƒkrÈdj|d}t|ƒ‚|d d dkrÞd}
nt|ƒ}
||
f}dd	„ |D ƒ}d
d |¡ d }| jj|d}t |tj¡}i ||< ||| d< ||| d< ||| d< qW |S )Nr   r   z'{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!   Úfmr2   ÚmÚerrZfm_namer3   ÚendZkey_argÚkeyZre_argsZxyzZpatStrr4   r   r   r   r   £   s<    

z%MathematicaParser._compile_dictionaryc       
      C   s„   | j }d}d}xp| |¡}|dkr,||7 }P | ¡ }|  |¡\}}| ¡ }	|  ||||	|¡}|	}||d|… 7 }||d… }qW |S )z'Parse Mathematica function to SymPy oner   r   N)r9   r:   r<   r=   r>   Ú_convert_one_function)
r)   r   r4   ÚscannedÚcurrF   rE   r3   rH   Úbgnr   r   r   Ú_convert_functionã   s     
z#MathematicaParser._convert_functionc             C   sj  |t |ƒf| jkrB|t |ƒf}| j| d }dd„ t||ƒD ƒ}n„|df| jkr²|df}| j| d }i }xZt|ƒD ]8\}	}
|
d dkr d ||	d … ¡||
< P ||	 ||
< qtW ndj|d}t|ƒ‚| j| d	 }| j| d
 }d}d}x^| |¡}|d kr
||7 }P | ¡ }
| 	¡ }||d |… ||
  7 }| 
¡ }||d … }qìW |d |… | ||d …  }|S )Nr3   c             S   s   i | ]\}}||“qS r   r   )r.   ÚkÚvr   r   r   ú
<dictcomp>  s    z;MathematicaParser._convert_one_function.<locals>.<dictcomp>r   r   ú,z'{f}' is out of the whitelist.)r+   r2   r4   r   )r?   r"   ÚzipÚ	enumerater@   r;   r'   r:   r<   r>   rH   )r)   r   rE   r3   rM   rH   rI   Zx_argsr!   Úir/   rG   Útemplater4   rK   rL   rF   Zxbgnr   r   r   rJ   
  s>    

z'MathematicaParser._convert_one_functionc             C   sà   |j }| ¡ d }g g  }}g }|}xªt||d… |ƒD ]”\}}	|	dkrj|sj|sj| |||… ¡ |d }|	dkr~| |	¡ n|	dkrŽ| ¡  |	dkr¢| |	¡ q8|	dkr8|r¸| ¡  q8| |||… ¡ P q8W |d }
||
fS )z'Get arguments of a Mathematica functioné   NrR   r   r   r   r   )ÚstringrH   rT   ÚappendÚpop)r   rF   r   ZancZsquareZcurlyr3   rL   rU   ÚcZfunc_endr   r   r   r=   L  s,    

zMathematicaParser._get_argsc             C   s   | j | }| ||¡}|S )N)ÚREPLACEMENTSÚreplace)r   r   ÚbefÚaftr   r   r   r8   r  s    
zMathematicaParser._replacec             C   s   | j | \}}| ||¡S )N)ÚRULESÚsub)r   r   r^   r4   r_   r   r   r   r7   x  s    zMathematicaParser._apply_rulesc             C   s^   x<dD ]4}|  |d ¡|  |d ¡krdj|d}t|ƒ‚qW d|krZdj|d}t|ƒ‚d S )N))r   r   )r   r   )ú(ú)r   rW   z'{f}' function form is invalid.)r+   r   z Currently list is not supported.)Úcountr;   r'   )r   r   ZbracketrG   r   r   r   r6   }  s    
zMathematicaParser._check_inputc             C   s`   |   |¡ |  |d¡}|  |d¡}|  |d¡}|  |d¡}|  |¡}|  |d¡}|  |d¡}|S )Nr   r   zadd*_1zadd*_2r   r   )r6   r7   r8   rN   )r)   r   r   r   r   r   ˆ  s    

zMathematicaParser.parse)N)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ZarcZtrir   rE   Úlowerr2   r    r\   rB   rC   rD   r`   r9   ZARG_MTRX_PATTERNrA   r   r$   r(   Úclassmethodr   r*   r   rN   rJ   r=   r8   r7   r6   r   r   r   r   r   r      sf   


	
@'B&r   )N)Z
__future__r   r   Ú	itertoolsr   rB   Zsympyr   r   r   Úobjectr   r   r   r   r   Ú<module>   s   
