U
    :qLe4ž  ã                   @   sÒ  d dl Z d dlZd dl mZmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZ z(d dlmZ d dlmZ d dlmZ W n8 ek
r¬   ddlmZ ddlmZ ddlmZ Y nX d d	lmZ d d
lmZ d dlZdadai ai ai add„ Zdd„ Zi fe dœdd„Z!G dd„ deƒZ"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd „ Z(d!d"„ Z)d#d$„ Z*d%d&„ Z+d'd(„ Z,d)d*„ Z-dbd+d,„Z.d-d.„ Z/d/d0„ Z0d1d2„ Z1d3d4„ Z2d5d6„ Z3d7d8„ Z4d9d:„ Z5d;d<„ Z6d=d>„ Z7d?d@„ Z8dAdB„ Z9dCdD„ Z:dEdF„ Z;dGdH„ Z<dIdJ„ Z=dKdL„ Z>dMdN„ Z?dOdP„ Z@dQdR„ ZAdSdT„ ZBdUdV„ ZCeCdWƒ eCdXƒ eDddYƒD ]\ZEe jFdZe eEƒ d[d\ZGe  HdZe eEƒ eEeE¡ZIe  JeE¡ K¡ ZLeLteG< eLteI< eLte eGƒ< q8eMd]krÎd^ZNe!eNƒZOePd_eNƒ ePd`eOƒ ePdaeCeNƒƒ dS )cé    N)Úmatrix_symbolsÚsimplifyÚfactorÚexpandÚapartÚexpand_trig)ÚInputStreamÚCommonTokenStream)ÚErrorListener)ÚPSParser)ÚPSLexer)Ú
PSListeneré   )Ú
StrPrinter)Ú
parse_exprú\fracc                 C   s   | a d S ©N)Úis_real)Úvalue© r   úc/home/p21-0144/sympy/latex2sympy2solve-back-end/sympyEq/lib/python3.8/site-packages/latex2sympy2.pyÚset_real    s    r   c                 C   s&   | a i a| D ]}| | tt|ƒ< qd S r   )Ú	variancesÚvarÚstr)ÚvarsZvariancer   r   r   Úset_variances%   s    r   )Úsympyc                 C   s¢  |   d¡dkrda|   d¡dkr$da|   d¡dkr6da|  dd¡} |  dd¡} |  ddd¡} |  ddd¡ d	dd¡} |  d
dd¡ ddd¡} t dd| ¡} |  ddd¡} |  ddd¡ ddd¡ ddd¡ ddd¡} |  ddd¡} t|ƒdkrô|ani at| ƒ}t| ƒ}t	|ƒ}| 
¡  | |¡ t|ƒ}t|ƒ}| 
¡  | |¡ d }| ¡ }| ¡ rŽg }| ¡  ¡ }	|	 ¡ D ]}
t|
ƒ}| |¡ qrn| ¡ }t|ƒ}|S )Nr   éÿÿÿÿú\dfracú\tfracz
\mathrm{T}ÚTz
\mathrm{d}Údz{\rm d}ú\left[\begin{matrix}ú\begin{bmatrix}ú\end{matrix}\right]ú\end{bmatrix}z5\(([a-zA-Z0-9+\-*/\\ ]+?)\)_{([a-zA-Z0-9+\-*/\\ ]+?)}z\\frac{(\1)!}{((\1)-(\2))!}z\displaystyleú z\quadz\qquadú~z\,ú$r   )ÚfindÚ	frac_typeÚreplaceÚreÚsubÚlenÚVARIABLE_VALUESÚMathErrorListenerr   r   ZremoveErrorListenersZaddErrorListenerr	   r   ÚmathÚrelation_listZrelation_list_contentÚrelationÚconvert_relationÚappend)r   Zvariable_valuesZ	matherrorÚstreamZlexZtokensZparserZreturn_datar2   r3   Z	list_itemÚexprr4   r   r   r   Úlatex2sympy.   sL    ,


r9   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r1   c                    s   t t| ƒ ¡  || _d S r   )Úsuperr
   Ú__init__Úsrc)Úselfr<   ©Ú	__class__r   r   r;   v   s    zMathErrorListener.__init__c                    sÈ   d}d| d }|  d¡r,||| j|f }	n|  d¡rH|d| j|f }	nt|  d¡r¬tj‰ ‡ fdd	„| ¡ D ƒ}
t|
ƒd
k ršd |
¡}
|d|
 | j|f }	q¼|d| j|f }	n|d| j|f }	t|	ƒ‚d S )Nz%s
%s
%sr(   ú^Zmissingz	no viablezI expected something else hereZ
mismatchedc                    s    g | ]}|t ˆ ƒk rˆ | ‘qS r   )r/   ©Ú.0Úi©Únamesr   r   Ú
<listcomp>„   s      z1MathErrorListener.syntaxError.<locals>.<listcomp>é
   r'   zI expected one of these: zI don't understand this)Ú
startswithr<   r   ZliteralNamesZgetExpectedTokensr/   ÚjoinÚ	Exception)r=   ZrecogÚsymbolÚlineÚcolÚmsgÚeZfmtZmarkerÚerrZexpectedr   rD   r   ÚsyntaxErrorz   s$    



 ÿzMathErrorListener.syntaxError)Ú__name__Ú
__module__Ú__qualname__r;   rQ   Ú__classcell__r   r   r>   r   r1   u   s   r1   c              	   C   sü  |   ¡ rt|   ¡ ƒS t|  d¡ƒ}t|  d¡ƒ}|  ¡ rHtj||ddS |  ¡ r`tj||ddS |  	¡ rxtj
||ddS |  ¡ rtj||ddS |  ¡ r¨tj||ddS |  ¡ rF|jrÐ|t|< |tt|ƒ< |S || }| tj¡}t|ƒdkr4g }|D ]4}t ||¡}|D ]}| tj||dd¡ q qú|S tj||ddS n²|  ¡ rÞt|dƒrÒ|jrÒt|jdƒrÒ|jjd }	|jjd }
|	tkrœt|	 }	|
tkr®t|
 }
t ||	|
¡}|t|< |tt|ƒ< ntdƒ‚|S |   ¡ røtj!||ddS d S )Nr   r   F©ÚevaluateÚis_PowÚis_Mulz7Don't support this form of definition of matrix symbol.)"r8   Úconvert_exprr5   r4   ZLTr   ZStrictLessThanZLTEZLessThanZGTZStrictGreaterThanZGTEZGreaterThanZEQUALZEqZ
ASSIGNMENTZ	is_Symbolr   r   r   ÚatomsÚSymbolr/   Úsolver6   ZINÚhasattrrX   ÚexpÚargsÚMatrixSymbolrJ   ZUNEQUALZNe)ZrelÚlhÚrhÚequationÚsymsÚresultÚsymÚvaluesr   ÚnÚmr   r   r   r5      sX    

"


r5   c                 C   s   |   ¡ rt|   ¡ ƒS d S r   )ÚadditiveÚconvert_add©r8   r   r   r   rZ   È   s    rZ   c           
      C   s®  |  ¡ rÂ|  ¡ }| ¡ }d }t| ¡  ¡ ƒd }| ¡ rFt| ¡ ƒ}n,| ¡ r`t| ¡  ¡ ƒ}n| ¡ rnd}nd}| 	¡  ¡ dkr”| j
d||d} n*| 	¡  ¡ dkr¶| jd||d} ntdƒ‚nè| ¡ rŒ| ¡  ¡ d	 }| ¡  ¡ d }t| ¡  ¡ ƒd }t| ¡  ¡ ƒd }	| 	¡  ¡ | 	¡  ¡ kr8tdƒ‚nP| 	¡  ¡ dkr\| j
d
||	d} n,| 	¡  ¡ dkr€| jd
||	d} ntdƒ‚n| ¡ rª| ¡  ¡ }| ¡   ¡  ¡ }| ¡   ¡ }d }| ¡ rÚt| ¡ ƒ}n0| ¡ röt| ¡  ¡ ƒ}n| ¡ rd}nd}t| ¡  ¡ ƒd }t| ¡  ¡ ƒd }	| 	¡  ¡ | 	¡  ¡ krVtdƒ‚nT| 	¡  ¡ dkr|| j
d|||	d} n.| 	¡  ¡ dkr¢| jd|||	d} ntdƒ‚| S )Nr   r   Úrzn->kn)ÚopÚrowÚkÚc)ro   rM   rq   zRow and col don's matchr   zn<->m)ro   Úrow1Úrow2)ro   Úcol1Úcol2zn->n+km)ro   rq   rs   rt   )ro   rq   ru   rv   )Útransform_scaleÚtransform_atomÚintÚNUMBERÚgetTextr8   rZ   ÚgroupÚSUBÚLETTER_NO_EZelementary_row_opZelementary_col_oprJ   Ztransform_swapZtransform_assignment)
ÚmatrixÚ	transformrw   rx   rq   ZnumZ
first_atomZsecond_atomZ	first_numZ
second_numr   r   r   Úconvert_elementary_transformÍ   sf    






r   c           	      C   sæ   |   ¡ }g }d}d }|D ]6}| g ¡ | ¡ D ]}||  t|ƒ¡ q.|d }qt |¡}t| dƒrâ|  ¡ râ|  ¡ }t	|ƒdkrž|d  
¡ D ]}t||ƒ}qŒnDt	|ƒdkrâ|d  
¡ D ]}t||ƒ}q¶|d  
¡ D ]}t||ƒ}qÒ|S )Nr   r   ÚMATRIX_XRIGHTARROWé   )Z
matrix_rowr6   r8   rZ   r   ÚMatrixr^   r‚   Zelementary_transformsr/   Zelementary_transformr   )	r   rp   ZtmpÚrowsZmatrn   r8   Ztransforms_listr€   r   r   r   Úconvert_matrix  s*    


r†   c                 C   sœ   t | dƒr| js t |dƒrˆ|jrˆg }t | dƒrD| jrD|t| jƒ7 }n
|| g7 }t |dƒrn|jrn|t|jƒ }n
||g7 }tj|ddiŽS tj| |ddS d S )NÚis_AddrW   FrV   )r^   r‡   Úlistr`   r   ZAdd©rb   rc   r`   r   r   r   Úadd_flat*  s     

rŠ   c                 C   s®   t | dƒr| js t |dƒr’|jr’g }t | dƒrD| jrD|t| jƒ7 }n
|| g7 }t |dƒrn|jrn|t|jƒ }n
||g7 }tjdd„ |D ƒddiŽS tj|  ¡ | ¡ ddS d S )NÚ	is_MatAddc                 S   s   g | ]}|  ¡ ‘qS r   ©Údoit©rB   Úargr   r   r   rF   E  s     z mat_add_flat.<locals>.<listcomp>rW   FrV   )r^   r‹   rˆ   r`   r   ZMatAddr   r‰   r   r   r   Úmat_add_flat:  s     

r   c                 C   sœ   t | dƒr| js t |dƒrˆ|jrˆg }t | dƒrD| jrD|t| jƒ7 }n
|| g7 }t |dƒrn|jrn|t|jƒ }n
||g7 }tj|ddiŽS tj| |ddS d S )NrY   rW   FrV   )r^   rY   rˆ   r`   r   ÚMulr‰   r   r   r   Úmul_flatJ  s     

r’   c                 C   s&  t | dƒr| js t |dƒr’|jr’g }t | dƒrD| jrD|t| jƒ7 }n
|| g7 }t |dƒrn|jrn|t|jƒ }n
||g7 }tjdd„ |D ƒddiŽS t | dƒr¾t |dƒr¾tj|  ¡ | ¡ ddS t | dƒræt |dƒsætj|  ¡ |ddS t | dƒst |dƒrtj| | ¡ ddS tj| |ddS d S )NÚ	is_MatMulc                 S   s   g | ]}|  ¡ ‘qS r   rŒ   rŽ   r   r   r   rF   e  s     z mat_mul_flat.<locals>.<listcomp>rW   Fr   rV   )r^   r“   rˆ   r`   r   ÚMatMulr   r‰   r   r   r   Úmat_mul_flatZ  s      

r•   c                 C   sÂ   |   ¡ rFt|  d¡ƒ}t|  d¡ƒ}|js0|jr:t||ƒS t||ƒS nx|  ¡ r²t|  d¡ƒ}t|  d¡ƒ}|jsv|jr†t|td|ƒƒS |jsœ|jj	rœ| }n
t
d|ƒ}t||ƒS nt|  ¡ ƒS d S )Nr   r   r   )ÚADDrl   rk   Ú	is_Matrixr   rŠ   r}   r•   ÚfuncÚ	is_Numberr’   Ú
convert_mpÚmp)Úaddrb   rc   r   r   r   rl   q  s     

rl   c                 C   sR  t | dƒr |  d¡}|  d¡}n|  d¡}|  d¡}|  ¡ sL|  ¡ sL|  ¡ r~t|ƒ}t|ƒ}|jsh|jrrt||ƒS t	||ƒS nÐ|  
¡ s–|  ¡ s–|  ¡ rìt|ƒ}t|ƒ}|js²|jrÎtj|tj|dddddS tj|tj|dddddS nb|  ¡ r*t|ƒ}t|ƒ}|jrtdƒ‚ntj||ddS n$t | dƒrBt|  ¡ ƒS t|  ¡ ƒS d S )	Nr›   r   r   r   FrV   z;Cannot perform modulo operation with a matrix as an operandÚunary)r^   r›   Ú	mp_nofuncZMULZ	CMD_TIMESZCMD_CDOTrš   r—   r•   r’   ZDIVZCMD_DIVZCOLONr   r”   ÚPowr‘   ZCMD_MODrJ   ZModÚconvert_unaryr   Úunary_nofunc)r›   Zmp_leftZmp_rightrb   rc   r   r   r   rš   Œ  s4    






rš   c                 C   s¨   t | dƒr|  ¡ }n|  ¡ }t | dƒrB|  ¡ }|  ¡ }|g| }n|  ¡ }|  ¡ rZt|ƒS |  ¡ r˜t|ƒ}|jr~t	d|ddS |j
jrŒ| S td|ƒS n|r¤t|ƒS d S )Nr   Úpostfix_nofuncr   FrV   )r^   r   r¡   Úpostfixr¢   r–   r    r}   r—   r•   r˜   r™   r’   Úconvert_postfix_list)r   Znested_unaryZfirstÚtailr£   Ztmp_convert_nested_unaryr   r   r   r    ±  s&    


r    c                 C   sö   |t | ƒkrtdƒ‚t| | ƒ}t|tjƒsDt|tjƒsD|tjjkrˆ|t | ƒd krX|S t	| |d ƒ}|j
sr|j
r|t||ƒS t||ƒS njt|tƒsœt|tƒr¨|d dks²t|tƒr¶|S |d }|t | ƒd krØtdƒ‚nt	| |d ƒ}t ||¡S d S )NzIndex out of boundsr   r   Ú
derivativez"Expected expression for derivative)r/   rJ   Úconvert_postfixÚ
isinstancer   ZExprr„   ÚSÚEmptySetr¤   r—   r•   r’   Útuplerˆ   ÚdictÚ
Derivative)ZarrrC   Zresrc   Úwrtr8   r   r   r   r¤   Ì  s"    $
*
r¤   c                 C   s’   |  ¡ rVt|  ¡ ƒ}| tj¡}t|ƒdkr0| S t|ƒdkrŽtt|ƒƒ}|  ||¡S n8| 	¡ rŽt| 	¡   d¡ƒ}t| 	¡   d¡ƒ}|  ||¡S d S )Nr   r   )
r8   rZ   r[   r   r\   r/   ÚnextÚiterÚsubsÚequality)r8   ZatZat_exprre   rg   rb   rc   r   r   r   Údo_subsè  s    r³   c              
   C   s  t | dƒr|  ¡ }n|  ¡ }t|ƒ}|  ¡ D ]ì}| ¡ rZt|tƒrJtdƒ‚t	j
|dd}q,| ¡ rÜ| ¡ }d }d }| ¡ rˆt|| ¡ ƒ}| ¡ ržt|| ¡ ƒ}|d k	rÀ|d k	rÀt|t|dƒƒ}n|d k	rÎ|}n|d k	rÚ|}q,| ¡ r,z
|j}W q,   zt	 |¡}W n   Y nX Y q,X q,|S )Nr_   z"Cannot apply postfix to derivativeFrV   r   )r^   r_   Ú
exp_nofuncÚconvert_expZ
postfix_opZBANGr¨   rˆ   rJ   r   Z	factorialZeval_atZeval_at_supr³   Zeval_at_subrŠ   r’   Z	transposer!   )r£   Ú
exp_nestedr_   ro   ZevZat_bZat_ar   r   r   r§   ÷  sB    



r§   c                 C   sš   t | dƒr|  ¡ }n|  ¡ }|rtt|ƒ}t|tƒr:tdƒ‚|  ¡ rPt|  ¡ ƒ}n|  	¡ rdt
|  	¡ ƒ}tj||ddS t | dƒrŠt|  ¡ ƒS t|  ¡ ƒS d S )Nr_   z Cannot raise derivative to powerFrV   Úcomp)r^   r_   r´   rµ   r¨   rˆ   rJ   ÚatomÚconvert_atomr8   rZ   r   rŸ   Úconvert_compr·   Zcomp_nofunc)r_   r¶   ÚbaseZexponentr   r   r   rµ     s    



rµ   c                 C   s  |   ¡ rt|   ¡  ¡ ƒS |  ¡ r4t|  ¡  ¡ ƒ ¡ S |  ¡ rVtjt|  ¡  ¡ ƒddS |  ¡ rrt	t|  ¡  ¡ ƒƒS |  
¡ rŽtt|  
¡  ¡ ƒƒS |  ¡ r¢t|  ¡ ƒS |  ¡ r¶t|  ¡ ƒS |  ¡ rÊt|  ¡ ƒS |  ¡ rÞt|  ¡ ƒS |  ¡  rþt|  ¡ ƒ t¡ ¡ S |  ¡ rt|  ¡ ƒS d S )NFrV   )r|   rZ   r8   Z
norm_groupÚnormZ	abs_groupr   ZAbsZfloor_groupÚhandle_floorZ
ceil_groupÚhandle_ceilr¸   r¹   ÚfracÚconvert_fracÚbinomÚconvert_binomr   r†   Údetr±   r   r˜   Úconvert_func)r·   r   r   r   rº   4  s,    

rº   c              	   C   s¸  |   ¡ r
|   ¡ }d}| ¡ r:| ¡  ¡ }|dkr¨tjS nn| ¡ r\| ¡  ¡ dd …  ¡ }nL| ¡ rv| ¡  ¡  ¡ }n2| ¡ r¨| ¡ }|j	j
}|j ¡ }|d | d }d}| ¡ r@| ¡ }d }| ¡ rÜ| ¡  ¡  ¡ }n4| ¡ rö| ¡  ¡  ¡ }n| ¡ r| ¡  ¡  ¡ }tƒ  |¡}	t|	ƒdkr8d|	 d }nd|	 }tj|| td}
d }|| tkr²z@t||  }t |¡}t || |d	 |d ¡}t|
 t|< W n   Y nX | ¡ rü| ¡ }d }| ¡ ràt| ¡ ƒ}nt| ¡ ƒ}tj|
|d
dS |s|
S |S |  ¡ rn|  ¡  ¡  dd¡ dd¡}|dkr@tjS |dkrPtj S |dkrbtj!j"S t#dƒ‚nF|  $¡ rÆ|  $¡  ¡  dd¡}zt %|¡}|W S  t&t'fk
rÀ   t (|¡ Y S X nî|  )¡ r|  )¡  ¡  dd¡}zt %|¡}|W S  t&t'fk
r   t (|¡ Y S X n–|  *¡ rHt+|  *¡ ƒatjdtj, tdS |  -¡ rpt.|  -¡  /¡ ƒ}tj|tdS |  0¡ rJ|  0¡  ¡ }| 1d¡}|ršdnd}|dd … }|d	t|ƒ| … }t2 3| 4¡ ¡ 5¡ }|| }|t6krt7t6| t8tj9j:ƒƒrt6| }nt;t<t6| ƒƒ}ntj|td}|rFtj=|tjddd
dd
dS |S |  >¡ r´|  >¡  ¡  dd¡ dd¡}zt %|¡}W n$ t&t'fk
r¢   t (|¡}Y nX t %|d¡}|S d S )NÚ ÚIr   ú{ú}z_{Ú_©Úrealr   FrV   z\$z\%z\inftyz\piz	\emptysetzUnrecognized symbolú,r"   é   rG   éd   r   )?Ú	atom_exprr~   r{   r   rÆ   Ú	GREEK_CMDÚstripÚOTHER_SYMBOL_CMDZaccentÚstartÚtextr»   Úsubexprr8   r¸   r`   r   Zdoprintr/   r\   r   r   Úshapera   r   ÚsupexprrZ   r¹   rŸ   ÚSYMBOLr,   ZooZpir©   rª   rJ   rz   ZRationalÚ	TypeErrorÚ
ValueErrorZNumberZ
E_NOTATIONÚDIFFERENTIALÚget_differential_varÚnameZmathitÚ	rule2textZmathit_textZVARIABLEÚendswithÚhashlibZmd5ÚencodeZ	hexdigestr0   r¨   r«   ZcoreZall_classesr   r   r‘   ZPERCENT_NUMBER)r¸   rÏ   Z	atom_textZatom_accentrÝ   r»   Zsubscript_textrÕ   Z	subscriptZsubscript_inner_textZatom_symbolZmatrix_symbolrc   rÖ   r×   Úfunc_powÚsÚsrrÔ   Z
is_percentZtrim_amountÚhashZsymbol_namerK   ÚnumberZpercentr   r   r   r¹   N  sÊ    






















r¹   c                 C   s&   | j  ¡ }| j j }| jj}| ||¡S r   )rÓ   ZgetInputStreamÚstopr{   )Zctxr7   ZstartIdxZstopIdxr   r   r   rÞ   Ü  s    
rÞ   c           	      C   s4  d}d}| j  ¡ }|d |d  d }| j j| j jkrZ| j jjtjkrZt| j jjƒ}d}np|dkrÊ| j jjtj	krÊ| j jjdkrÊ| j jjtj
ks | j jjtj	krÊd}| j jj}| j jjtj	krÊ|dd … }|sÔ|rÔtj|td}|r$| jj| jjkr$| jjjtj
kr$| jjjdkr$d	|fS |rf| jj| jjkrf| jjjtj	krf| jjjdkrfd	|fS t| jƒ}d }|r˜| d¡r˜t|dd … ƒ}n*|rÂ| jjjdkrÂt|tdƒd … ƒ}|rÔt ||¡S t| jƒ}t| j ƒ}|jsø|jrtj|tj|d
ddddS tj|tj|d
ddddS d S )NFr   r   Trƒ   z\partialrÊ   r"   r¦   r   rV   )ÚlowerZgetSourceIntervalrÓ   rç   Útyper   rÛ   Úget_differential_var_strrÔ   rØ   r~   r   r\   r   ÚupperrÞ   rH   r9   r/   r­   rZ   r—   r”   rŸ   r‘   )	r¿   Zdiff_opZ
partial_opZ	lower_itvZlower_itv_lenr®   Z
upper_textÚexpr_topÚexpr_botr   r   r   rÀ   æ  sb    
ÿÿþýý

ÿþÿþ


rÀ   c                 C   s    t | jƒ}t | jƒ}t ||¡S r   )rZ   rë   rè   r   Zbinomial)rÁ   rì   rí   r   r   r   rÂ     s    

rÂ   c           
         sT  |   ¡ rô|  ¡ r t|  ¡ ƒ‰ nt|  ¡ ƒ‰ |   ¡ jjdd … }|dkrpd|dd …  }ttj	|ƒˆ dd}nî|dkr d|dd …  }ttj	|ƒˆ dd}n¾|d	krÐd|dd …  }ttj	|ƒˆ dd}nŽ|d
kr–|   ¡ j
 ¡ }|dkrd|dd …  }ttj	|ƒˆ dd}q^|d	krLd|dd …  }ttj	|ƒˆ dd}q^|dkrbtˆ ƒ}q^|dkrxtˆ ƒ}q^|dkrt ˆ ¡}q^|dkrªt ˆ  ¡ ¡}nê|dkr¾ˆ  ¡ }nÖ|dkrÖˆ  ¡ d }n¾|dkrêˆ  ¡ }nª|dkrþˆ  ¡ }n–|dkr"‡ fdd„tˆ jƒD ƒ}nr|dkrF‡ fdd„tˆ jƒD ƒ}nN|dkrZˆ  ¡ }n:|dkrnˆ  ¡ }n&|dkr‚ˆ  ¡ }n|dkr^ˆ  ¡ }nÈ|dkr|  ¡ rÜ|  ¡  ¡ rÊt|  ¡  ¡ ƒ}nt|  ¡   ¡ ƒ}n |dkrìd}n|d krütj!}tj"ˆ |dd}nP|d!kr$t #ˆ ¡}n:|dkr8tˆ ƒ}n&|dkrLtˆ ƒ}n|d"kr^ˆ  $¡ }d }d#}|  %¡ r |  %¡   ¡ rt|  %¡   ¡ ƒ}nt|  %¡  ¡ ƒ}|d$krÔ|d%krÀd| }d}ttj	|ƒˆ dd}|rð|rðtj&||dd}|S |  '¡ rô|  ¡ r|  (¡  ¡  )d&¡}n|  *¡  )d&¡}t+t,d'd(„ |ƒƒ}|  '¡ jjdd … }|d
krD|  '¡ j
 ¡ }|d)kr~t-||ƒ}nÄ|d*kr”tj.|Ž }n®|d+krªtj/|Ž }n˜|d,krÀtj0|Ž }n‚|d-krØtj1j2|Ž }nj|d.krðtj1j3|Ž }nR|d/kr’t4|ƒdkr4|d ‰ tj5 6‡ fd0d„tˆ jƒD ƒd#¡}ntj5 6|d#¡}nN|d)krZt-||ƒ}n8|d1kr’|d  7¡ |dd …  }ttj	|ƒ|d2diŽ}d }d#}|  %¡ rÔ|  %¡   ¡ rÄt|  %¡   ¡ ƒ}nt|  %¡  ¡ ƒ}|rð|rðtj&||dd}|S |  8¡ r¢t 9|  8¡  ¡ ¡}|  :¡  ¡  )d&¡}|d% d3kr<|d d%… }d4d„ |D ƒ}|  %¡ r˜|  %¡   ¡ rtt|  %¡   ¡ ƒ}nt|  %¡  ¡ ƒ}tj&||Ž |ddS ||Ž S n®|  ;¡ r´t<| ƒS |  =¡ rt| j>ƒ}| j?rît| j?ƒ}	tj&|d|	 ddS tj&|tj@jAddS nL|  B¡ rtC| d5ƒS |  D¡ r,tC| d6ƒS |  E¡ r>tF| ƒS |  G¡ rPtH| ƒS d S )7Nr   )ZarcsinZarccosZarctanZarccscZarcsecZarccotÚarÍ   FrV   )ZarsinhZarcoshZartanhrƒ   )ZarcsinhZarccoshZarctanhÚoperatornameÚfloorZceilÚeyeÚrank)ÚtraceZtrÚrrefr   Ú	nullspacer¼   Úcolsc                    s   g | ]}ˆ   |¡‘qS r   ©rM   rA   ©r   r   r   rF   H  s     z convert_func.<locals>.<listcomp>r…   c                    s   g | ]}ˆ   |¡‘qS r   )rp   rA   rø   r   r   rF   J  s     )ZeigZeigenÚdiagonalize)Ú	eigenvalsZeigenvalues)Ú
eigenvectsZeigenvectors)ZsvdZSVD)ÚlogÚlnrü   rG   rý   )r_   ZexponentialErÃ   T)	ZsinZcosZtanZcscZsecZcotZsinhZcoshZtanhr   rÌ   c                 S   s
   t | tƒS r   ©r9   r0   rø   r   r   r   Ú<lambda>€  ó    zconvert_func.<locals>.<lambda>)ZgcdZlcmÚzerosÚonesÚdiagÚhstackÚvstack)ZorthZorthoZ
orthogonalZorthogonalizec                    s   g | ]}ˆ   |¡‘qS r   r÷   rA   rø   r   r   rF   ”  s     )ÚmaxÚminrW   rÅ   c                 S   s   g | ]}t |tƒ‘qS r   rþ   rŽ   r   r   r   rF   °  s     Ú	summationÚproduct)IZfunc_normal_single_argZL_PARENÚconvert_func_argZfunc_single_argZfunc_single_arg_noparensrÓ   rÔ   Úgetattrr   Ú	functionsZfunc_operator_namer{   r½   r¾   rñ   ZIntegerrò   ró   rô   rõ   r¼   Úrangerö   r…   rù   rú   rû   Zsingular_value_decompositionrÕ   r¸   r¹   rZ   r8   ÚErü   r_   rÃ   r×   rŸ   Zfunc_normal_multi_argZfunc_multi_argÚsplitZfunc_multi_arg_noparensrˆ   ÚmapÚhandle_gcd_lcmr  r  r  r„   r  r  r/   ZmatricesZGramSchmidtrë   Zatom_expr_no_supexprZFunctionZfunc_common_argsZFUNC_INTÚhandle_integralZ	FUNC_SQRTr»   Úrootr©   ZHalfZFUNC_SUMÚhandle_sum_or_prodZ	FUNC_PRODZFUNC_LIMÚhandle_limitZEXP_EÚ
handle_exp)
r˜   rÝ   r8   rï   r»   râ   Z
should_powr`   Úfrn   r   rø   r   rÄ     s*   















































$















rÄ   c                 C   s&   t | dƒrt|  ¡ ƒS t|  ¡ ƒS d S )Nr8   )r^   rZ   r8   rš   rž   rø   r   r   r   r
  Í  s    
r
  c                 C   sf  |   ¡ rt|   ¡ ƒ}n|  ¡ r,t|  ¡ ƒ}nd}d }|  ¡ rJt|  ¡ ƒ}n| tj¡D ]b}t	|ƒ}t
|ƒdkrV|d dkrV|d dkržtj|dd … td}ntj|dd … td}|}qV|rÌ| |d¡}ntjdtd}|  ¡ rV|  ¡  ¡ rt|  ¡  ¡ ƒ}nt|  ¡  ¡ ƒ}|  ¡  ¡ r4t|  ¡  ¡ ƒ}nt|  ¡  ¡ ƒ}t ||||f¡S t ||¡S d S )Nr   r   r"   ú\rƒ   rÊ   Úx)rk   rl   r¿   rÀ   rÛ   rÜ   r[   r   r\   r   r/   r   r±   rÕ   r¸   r¹   rZ   r8   r×   ZIntegral)r˜   Z	integrandZint_varrg   rã   Zint_symrè   rë   r   r   r   r  Ô  s6    
r  c                 C   sž   t |  ¡ ƒ}t|  ¡  ¡  d¡ƒ}t|  ¡  ¡  d¡ƒ}|  ¡  ¡ rVt|  ¡  ¡ ƒ}nt|  ¡  ¡ ƒ}|dkr€t	 
||||f¡S |dkršt	 ||||f¡S d S )Nr   r   r  r	  )rš   r›   rZ   Zsubeqr²   r8   r×   r¹   r¸   r   ZSumZProduct)r˜   rÝ   ÚvalZiter_varrÓ   Úendr   r   r   r  ü  s    r  c                 C   sÀ   |   ¡ }| ¡ r(tj| ¡  ¡ td}n^| ¡ rTtj| ¡  ¡ dd …  ¡ td}n2| ¡ rxtj| ¡  ¡  ¡ td}ntjdtd}| 	¡ r”d}nd}t
| ¡ ƒ}t|  ¡ ƒ}t ||||¡S )NrÊ   r   r  ú-ú+)Z	limit_subr~   r   r\   r{   r   rÐ   rÑ   rÒ   r}   rZ   r8   rš   r›   ZLimit)r˜   r.   r   Ú	directionZapproachingZcontentr   r   r   r    s    $r  c                 C   sF   |   ¡ r8|   ¡  ¡ r&t|   ¡  ¡ ƒ}q<t|   ¡  ¡ ƒ}nd}t |¡S )Nr   )r×   r8   rZ   r¹   r¸   r   r_   )r˜   Zexp_argr   r   r   r    s    r  c                 C   s$   t ttj|ƒƒ}t tt| ƒ|ƒ¡S )z£
    Return the result of gcd() or lcm(), as UnevaluatedExpr

    f: str - name of function ("gcd" or "lcm")
    args: List[Expr] - list of function arguments
    )r«   r  r   Ú	nsimplifyZUnevaluatedExprr  )r  r`   r   r   r   r  *  s    r  c                 C   s   t jj| ddS )zx
    Apply floor() then return the floored expression.

    expr: Expr - sympy expression as an argument to floor()
    FrV   )r   r  rð   rm   r   r   r   r½   8  s    r½   c                 C   s   t jj| ddS )zv
    Apply ceil() then return the ceil-ed expression.

    expr: Expr - sympy expression as an argument to ceil()
    FrV   )r   r  Zceilingrm   r   r   r   r¾   A  s    r¾   c                 C   s   t |  ¡ ƒ}tj|tdS )NrÊ   )rê   r{   r   r\   r   )r"   rÔ   r   r   r   rÜ   J  s    rÜ   c                 C   sl   t dt| ƒƒD ]4}| | }|dks|dks|dks|dks|} qDq| |d … } | d dkrh| dd … } | S )Nr   r'   úÚ
ú	r   r  )r  r/   )rÔ   rC   rr   Zidxr   r   r   rê   O  s     rê   c                 C   s|   t  | ¡}| dtd¡ dtd¡ dtd¡}| ddd¡ ddd¡}| d	d
d¡ dd
d¡}| ddd¡}| ddd¡}|S )Nr   r   r   r    r#   r$   r%   r&   z\leftrÅ   z\rightz )ú)z\logz\ln)r   Úlatexr,   r+   ©Útexrf   r   r   r   r$  [  s    
"r$  c                 C   sL   t | ƒ}t|tƒs&t|tƒs&t|tƒr.t|ƒS tt| t¡ 	¡  	¡ ƒƒS d S r   )
r9   r¨   rˆ   r«   r¬   r$  r   r±   r   r   r%  r   r   r   Úlatex2latexf  s    r'  zi=Izj=IrG   z\bm{I}_FrÊ   Ú__main__z'\frac{\mathrm{d}}{\mathrm{d}x}(x^{2}+x)zlatex:z	raw_math:zcal:)r   )Qr   r-   r   r   r   r   r   r   Zantlr4r   r	   Zantlr4.error.ErrorListenerr
   Zgen.PSParserr   Zgen.PSLexerr   Zgen.PSListenerr   rJ   Zsympy.printing.strr   Zsympy.parsing.sympy_parserr   rà   r   r+   r   r   r0   r   r   r   r9   r1   r5   rZ   r   r†   rŠ   r   r’   r•   rl   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  rC   r\   rb   ra   Zlh_mZIdentityZ
as_mutablerc   rR   r&  r2   Úprintr   r   r   r   Ú<module>   s”    	G8>%
' 
. 4(		



