o
    hd                     @   s   d dl Z d dlZd dlmZ d dlmZ edZer%d dlmZmZm	Z	 nG dd dZG dd	 d	ZG d
d dZ	G dd deZ
dS )    N)import_module)LaTeXParsingErrorlark)TransformerTokenTreec                   @   s   e Zd Zdd ZdS )r   c                 G   s   d S N )selfargsr	   r	   Z/var/www/html/ai/venv/lib/python3.10/site-packages/sympy/parsing/latex/lark/transformer.py	transform   s   zTransformer.transformN)__name__
__module____qualname__r   r	   r	   r	   r   r      s    r   c                   @      e Zd ZdS )r   Nr   r   r   r	   r	   r	   r   r          r   c                   @   r   )r   Nr   r	   r	   r	   r   r      r   r   c                   @   s  e Zd ZdZejZejjj	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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 d.d/ Z!d0d1 Z"d2d3 Z#d4d5 Z$d6d7 Z%d8d9 Z&d:d; Z'd<d= Z(d>d? Z)d@dA Z*dBdC Z+dDdE Z,dFdG Z-dHdI Z.dJdK Z/dLdM Z0dNdO Z1dPdQ Z2dRdS Z3dTdU Z4dVdW Z5dXdY Z6dZd[ Z7d\d] Z8d^d_ Z9d`da Z:dbdc Z;ddde Z<dfdg Z=dhdi Z>djdk Z?dldm Z@dndo ZAdpdq ZBdrds ZCdtdu ZDdvdw ZEdxdy ZFdzd{ ZGd|d} ZHd~d ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdeZfddZ[dd Z\dd Z]dd Z^dd Z_dd Z`dd ZadS )TransformToSymPyExpra   Returns a SymPy expression that is generated by traversing the ``lark.Tree``
    passed to the ``.transform()`` function.

    Notes
    =====

    **This class is never supposed to be used directly.**

    In order to tweak the behavior of this class, it has to be subclassed and then after
    the required modifications are made, the name of the new class should be passed to
    the :py:class:`LarkLaTeXParser` class by using the ``transformer`` argument in the
    constructor.

    Parameters
    ==========

    visit_tokens : bool, optional
        For information about what this option does, see `here
        <https://lark-parser.readthedocs.io/en/latest/visitors.html#lark.visitors.Transformer>`_.

        Note that the option must be set to ``True`` for the default parser to work.
    c                 C   s   t jS r   )sympyoor
   tokensr	   r	   r   	CMD_INFTY5   s   zTransformToSymPyExpr.CMD_INFTYc                 C   s    t dd|dd  }t|S )Nvar    )resubr   Symbol)r
   r   variable_namer	   r	   r   GREEK_SYMBOL_WITH_PRIMES8   s   
z-TransformToSymPyExpr.GREEK_SYMBOL_WITH_PRIMESc                 C   sF   |j d\}}|drtd||dd f S td||f S )N_{%s_{%s}r   )valuesplit
startswithr   r   )r
   r   baser   r	   r	   r   !LATIN_SYMBOL_WITH_LATIN_SUBSCRIPT?   s   
z6TransformToSymPyExpr.LATIN_SYMBOL_WITH_LATIN_SUBSCRIPTc                 C   s\   |j d\}}tdd|dd  }|dr%td||dd f S td||f S )Nr"   r   r   r   r#   r$   r%   r&   r'   r   r   r(   r   r   r
   r   r)   r   greek_letterr	   r	   r   !GREEK_SYMBOL_WITH_LATIN_SUBSCRIPTF   s
   
z6TransformToSymPyExpr.GREEK_SYMBOL_WITH_LATIN_SUBSCRIPTc                 C   sT   |j d\}}|dr|dd }n|dd  }tdd|}td||f S )	Nr"   r#      r%   r   r   r   r$   )r&   r'   r(   r   r   r   r   r,   r	   r	   r   !LATIN_SYMBOL_WITH_GREEK_SUBSCRIPTO   s   
z6TransformToSymPyExpr.LATIN_SYMBOL_WITH_GREEK_SUBSCRIPTc                 C   sj   |j d\}}tdd|dd  }|dr|dd }n|dd  }tdd|}td||f S )	Nr"   r   r   r   r#   r/   r%   r$   r+   )r
   r   r)   r   
greek_base	greek_subr	   r	   r   !GREEK_SYMBOL_WITH_GREEK_SUBSCRIPTZ   s   
z6TransformToSymPyExpr.GREEK_SYMBOL_WITH_GREEK_SUBSCRIPTc                 C   s@   t |dkrt|d S t |dkrt|d |d  S d S )N   r/      )lenr   r   r   r	   r	   r   multi_letter_symbolf   s
   z(TransformToSymPyExpr.multi_letter_symbolc                 C   sD   |d j dkr
tjS d|d v rtjj|d S tjj|d S )Nr   CMD_IMAGINARY_UNIT.)typer   IcorenumbersFloatIntegerr   r	   r	   r   numberl   s
   zTransformToSymPyExpr.numberc                 C      |d S Nr   r	   r   r	   r	   r   latex_stringu      z!TransformToSymPyExpr.latex_stringc                 C   rA   Nr   r	   r   r	   r	   r   group_round_parenthesesx   rD   z,TransformToSymPyExpr.group_round_parenthesesc                 C   rA   rE   r	   r   r	   r	   r   group_square_brackets{   rD   z*TransformToSymPyExpr.group_square_bracketsc                 C   rA   rE   r	   r   r	   r	   r   group_curly_parentheses~   rD   z,TransformToSymPyExpr.group_curly_parenthesesc                 C      t |d |d S Nr   r/   )r   Eqr   r	   r	   r   eq      zTransformToSymPyExpr.eqc                 C   rI   rJ   )r   Ner   r	   r	   r   ne   rM   zTransformToSymPyExpr.nec                 C   rI   rJ   )r   Ltr   r	   r	   r   lt   rM   zTransformToSymPyExpr.ltc                 C   rI   rJ   )r   Ler   r	   r	   r   lte   rM   zTransformToSymPyExpr.ltec                 C   rI   rJ   )r   Gtr   r	   r	   r   gt   rM   zTransformToSymPyExpr.gtc                 C   rI   rJ   )r   Ger   r	   r	   r   gte   rM   zTransformToSymPyExpr.gtec                 C   s`   t |dkr
|d S t |dkr.|d }|d }| |s"| |r(t||S t||S d S )Nr/   r      r   )r6   _obj_is_sympy_Matrixr   MatAddAddr
   r   lhrhr	   r	   r   add   s   zTransformToSymPyExpr.addc                 C   s   t |dkr|d }| |rtd|S | S t |dkrA|d }|d }| |s0| |r:t|td|S t|| S d S )Nr/   r   r%   rX   r   )r6   rY   r   MatMulrZ   r[   )r
   r   xr]   r^   r	   r	   r   r      s   
zTransformToSymPyExpr.subc                 C   s<   |d }|d }|  |s|  |rt||S t||S rJ   )rY   r   r`   Mulr\   r	   r	   r   mul   s
   zTransformToSymPyExpr.mulc                 C   s   |  |d |d S rJ   )_handle_divisionr   r	   r	   r   div   rM   zTransformToSymPyExpr.divc                 C   s   ddl m}m} t|d |r%t|d |r%ddl m} ||d |d S |d tdkr6|d |d fS t|d trIt|d |d d S t	|d |d S )Nr   )BraKetr   )OuterProductd)
sympy.physics.quantumrf   rg   
isinstancerh   r   r   tuple
Derivativerb   )r
   r   rf   rg   rh   r	   r	   r   adjacent_expressions   s   z)TransformToSymPyExpr.adjacent_expressionsc                 C   s  dd }dd }dd }dd }|d	 }t |d
kr|d }t |dkr(|d
 }| |r|tdkr9t|S |tdkrEt|S ||r[|j}t |d d	krV|S t|S ||ru|j}t |t d d d	krp|S t|S ||r|j}t |d d	kr| S t|S ||r|j}t |t d d d	kr| S t|S ||s||s||s||rt| d| dt	||S )Nc                 S      t | to	| jdkS )NPRIMESrk   r   r:   ra   r	   r	   r   isprime   rM   z1TransformToSymPyExpr.superscript.<locals>.isprimec                 S      t | to| jdkp| jdkS )NPRIMES_VIA_CMD	CMD_PRIMErq   rr   r	   r	   r   
iscmdprime      z4TransformToSymPyExpr.superscript.<locals>.iscmdprimec                 S   ro   )NSTARSrq   rr   r	   r	   r   isstar   rM   z0TransformToSymPyExpr.superscript.<locals>.isstarc                 S   rt   )NSTARS_VIA_CMDCMD_ASTERISKrq   rr   r	   r	   r   	iscmdstar   rx   z3TransformToSymPyExpr.superscript.<locals>.iscmdstarr   rX   r/   r5   THz\primez\astz with superscript  is not understood.)
r6   rY   r   r   	Transposeadjointr&   doitr   Pow)r
   r   rs   rw   rz   r}   r)   supr	   r	   r   superscript   sJ   






 z TransformToSymPyExpr.superscriptc                 C   sP   |d }|d j }| |std| d| dt|d dkr#|S t|S )Nr   r   ()r   r/   )r&   rY   r   r6   r   r   r
   r   r)   primesr	   r	   r   matrix_prime  s   


z!TransformToSymPyExpr.matrix_primec                 C   s&   |d }|d j }t|j | S )Nr   r   )r&   r   r   namer   r	   r	   r   symbol_prime  s   
z!TransformToSymPyExpr.symbol_primec                 C   s>   |d }t |d tr|d \}}d|fS |d }| ||S )Nr   r/   
derivative)rk   rl   rd   )r
   r   	numeratorr"   variabledenominatorr	   r	   r   fraction  s   zTransformToSymPyExpr.fractionc                 C   rI   )Nr   r/   )r   binomialr   r	   r	   r   r   &  rM   zTransformToSymPyExpr.binomialc           
      C   s(  d }d }d|v r| d}d|v r| d}|r||d  nd }|r(||d  nd }| |}|d u r7td| |d }|| }|d urN|d u rNtd|d urZ|d u rZtd|d urg||d krgd}	n|d urt||d krtd}	n|dkr{d}	n||d  }	|d urt|	|||fS t|	|S )	Nr"   ^r   ztDifferential symbol was not found in the expression.Valid differential symbols are "d", "\text{d}, and "\mathrm{d}".FLower bound for the integral was found, but upper bound was not found.FUpper bound for the integral was found, but lower bound was not found.rX   r/   )index_extract_differential_symbolr   r   Integral)
r
   r   underscore_indexcaret_indexlower_boundupper_bounddifferential_symboldifferential_variable_indexdifferential_variable	integrandr	   r	   r   normal_integral)  s6   


z$TransformToSymPyExpr.normal_integralc                 C   s8   t |dkrd|d fS t |dkr|d |d fS d S )NrX   r   r4   r/   )r6   r   r	   r	   r   group_curly_parentheses_intl  s
   z0TransformToSymPyExpr.group_curly_parentheses_intc                 C   s,   |d \}}|d }t |t |d|fS )Nr   r/   r%   )r   rb   r   )r
   r   r   r   r   r	   r	   r   special_fractionu  s   z%TransformToSymPyExpr.special_fractionc                 C   s   d }d }d|v r| d}d|v r| d}|r||d  nd }|r(||d  nd }|d ur6|d u r6td|d urB|d u rBtd|d \}}|d urUt||||fS t||S )Nr"   r   r   r   r   r%   )r   r   r   r   )r
   r   r   r   r   r   r   r   r	   r	   r   integral_with_special_fraction|  s    

z3TransformToSymPyExpr.integral_with_special_fractionc                 C   sn   | d}| d}| d|}| d|}||d | }||d d  }|d }|d }	|d }
||	|
fS )Nr"   r   r#   }r   r   r%   r   )r
   r   r   r   left_brace_indexright_brace_indexbottom_limit	top_limitindex_variablelower_limitupper_limitr	   r	   r   group_curly_parentheses_special  s   


z4TransformToSymPyExpr.group_curly_parentheses_specialc                 C   rI   Nr/   r   )r   Sumr   r	   r	   r   	summation  rM   zTransformToSymPyExpr.summationc                 C   rI   r   )r   Productr   r	   r	   r   product  rM   zTransformToSymPyExpr.productc                 C   sl   | d}d|v r| d|}||d  }n||d  }|dkr&|d dfS |dkr0|d dfS |d dfS )Nr   r#   r   +r   -+-r   )r
   r   r   left_curly_brace_index	directionr	   r	   r   limit_dir_expr  s   
z#TransformToSymPyExpr.limit_dir_exprc                 C   s:   |d }t |d tr|d \}}n|d }d}|||fS )Nr   rX   r   )rk   rl   r
   r   limit_variabledestinationr   r	   r	   r   group_curly_parentheses_lim  s   
z0TransformToSymPyExpr.group_curly_parentheses_limc                 C   s"   |d \}}}t |d |||S Nr/   r%   )r   Limitr   r	   r	   r   limit  s   zTransformToSymPyExpr.limitc                 C   rA   rE   r	   r   r	   r	   r   differential  rD   z!TransformToSymPyExpr.differentialc                 C   rI   )Nr%   r5   )r   rm   r   r	   r	   r   r     rM   zTransformToSymPyExpr.derivativec                 C   s"   t |dkr|S dd }t||S )Nr   c                 S   s$   t | tr| jdkrtddS dS )NCOMMAzAA comma token was expected, but some other token was encountered.FT)rk   r   r:   r   )r   r	   r	   r   remove_tokens  s
   

z?TransformToSymPyExpr.list_of_expressions.<locals>.remove_tokens)r6   filter)r
   r   r   r	   r	   r   list_of_expressions  s   
z(TransformToSymPyExpr.list_of_expressionsc                 C   s   t |d |d  S rJ   )r   Functionr   r	   r	   r   function_applied     z%TransformToSymPyExpr.function_appliedc                 C      t j|d  S Nr/   )r   Minr   r	   r	   r   min     zTransformToSymPyExpr.minc                 C   r   r   )r   Maxr   r	   r	   r   max  r   zTransformToSymPyExpr.maxc                 C      ddl m} ||d S )Nr   )rf   r   )rj   rf   )r
   r   rf   r	   r	   r   bra
     zTransformToSymPyExpr.brac                 C   r   )Nr   )rg   r   )rj   rg   )r
   r   rg   r	   r	   r   ket  r   zTransformToSymPyExpr.ketc                 C   s.   ddl m}m}m} |||d ||d S )Nr   )rf   rg   InnerProductr   rX   )rj   rf   rg   r   )r
   r   rf   rg   r   r	   r	   r   inner_product  s   z"TransformToSymPyExpr.inner_productc                 C      t |d S rE   )r   sinr   r	   r	   r   r     r   zTransformToSymPyExpr.sinc                 C   r   rE   )r   cosr   r	   r	   r   r     r   zTransformToSymPyExpr.cosc                 C   r   rE   )r   tanr   r	   r	   r   r     r   zTransformToSymPyExpr.tanc                 C   r   rE   )r   cscr   r	   r	   r   r     r   zTransformToSymPyExpr.cscc                 C   r   rE   )r   secr   r	   r	   r   r   "  r   zTransformToSymPyExpr.secc                 C   r   rE   )r   cotr   r	   r	   r   r   %  r   zTransformToSymPyExpr.cotc                 C   4   |d }|dkrt |d S t t |d |S r   )r   asinr   r   r
   r   exponentr	   r	   r   	sin_power(     zTransformToSymPyExpr.sin_powerc                 C   r   r   )r   acosr   r   r   r	   r	   r   	cos_power/  r   zTransformToSymPyExpr.cos_powerc                 C   r   r   )r   atanr   r   r   r	   r	   r   	tan_power6  r   zTransformToSymPyExpr.tan_powerc                 C   r   r   )r   acscr   r   r   r	   r	   r   	csc_power=  r   zTransformToSymPyExpr.csc_powerc                 C   r   r   )r   asecr   r   r   r	   r	   r   	sec_powerD  r   zTransformToSymPyExpr.sec_powerc                 C   r   r   )r   acotr   r   r   r	   r	   r   	cot_powerK  r   zTransformToSymPyExpr.cot_powerc                 C   r   rE   )r   r   r   r	   r	   r   arcsinR  r   zTransformToSymPyExpr.arcsinc                 C   r   rE   )r   r   r   r	   r	   r   arccosU  r   zTransformToSymPyExpr.arccosc                 C   r   rE   )r   r   r   r	   r	   r   arctanX  r   zTransformToSymPyExpr.arctanc                 C   r   rE   )r   r   r   r	   r	   r   arccsc[  r   zTransformToSymPyExpr.arccscc                 C   r   rE   )r   r   r   r	   r	   r   arcsec^  r   zTransformToSymPyExpr.arcsecc                 C   r   rE   )r   r   r   r	   r	   r   arccota  r   zTransformToSymPyExpr.arccotc                 C   r   rE   )r   sinhr   r	   r	   r   r   d  r   zTransformToSymPyExpr.sinhc                 C   r   rE   )r   coshr   r	   r	   r   r   g  r   zTransformToSymPyExpr.coshc                 C   r   rE   )r   tanhr   r	   r	   r   r   j  r   zTransformToSymPyExpr.tanhc                 C   r   rE   )r   asinhr   r	   r	   r   r   m  r   zTransformToSymPyExpr.asinhc                 C   r   rE   )r   acoshr   r	   r	   r   r   p  r   zTransformToSymPyExpr.acoshc                 C   r   rE   )r   atanhr   r	   r	   r   r   s  r   zTransformToSymPyExpr.atanhc                 C   r   rE   )r   Absr   r	   r	   r   absv  r   zTransformToSymPyExpr.absc                 C   r   rE   )r   floorr   r	   r	   r   r   y  r   zTransformToSymPyExpr.floorc                 C   r   rE   )r   ceilingr   r	   r	   r   ceil|  r   zTransformToSymPyExpr.ceilc                 C   r   rB   )r   	factorialr   r	   r	   r   r     r   zTransformToSymPyExpr.factorialc                 C   r   rE   )r   	conjugater   r	   r	   r   r     r   zTransformToSymPyExpr.conjugatec                 C   s>   t |dkrt|d S t |dkrt|d |d S d S )Nr/   r   rX   )r6   r   sqrtrootr   r	   r	   r   square_root  s
   z TransformToSymPyExpr.square_rootc                 C   r   rE   )r   expr   r	   r	   r   exponential  r   z TransformToSymPyExpr.exponentialc                 C   sv   |d j dkrt|d dS |d j dkrt|d S |d j dkr9d|v r2t|d |d	 S t|d S d S )
Nr   FUNC_LGr   
   FUNC_LNFUNC_LOGr"   rX   r/   )r:   r   logr   r	   r	   r   r
    s   zTransformToSymPyExpr.logsc                    s$   h d}t  fdd|D d }|S )N>   \text{d}
\mathrm{d}ri   c                 3   s    | ]	}| v r|V  qd S r   r	   ).0symbolr  r	   r   	<genexpr>  s    zDTransformToSymPyExpr._extract_differential_symbol.<locals>.<genexpr>)next)r
   r  differential_symbolsr   r	   r  r   r     s   z1TransformToSymPyExpr._extract_differential_symbolc                    s4   dd  dd |d j }t fdd|D S )Nc                 S   ro   )N
matrix_row)rk   r   datarr   r	   r	   r   is_matrix_row  rM   z2TransformToSymPyExpr.matrix.<locals>.is_matrix_rowc                 S   s   t | t p
| jdkS )NMATRIX_COL_DELIMrq   )yr	   r	   r   is_not_col_delim  r   z5TransformToSymPyExpr.matrix.<locals>.is_not_col_delimr   c                    s(   g | ]} |rfd d|j D qS )c                    s   g | ]} |r|qS r	   r	   )r  r  )r  r	   r   
<listcomp>  s    z:TransformToSymPyExpr.matrix.<locals>.<listcomp>.<listcomp>)children)r  ra   r  r  r	   r   r    s    z/TransformToSymPyExpr.matrix.<locals>.<listcomp>)r  r   Matrix)r
   r   matrix_bodyr	   r  r   matrix  s   
zTransformToSymPyExpr.matrixc                 C   sL   t |dkr| |d std|d  S t |dkr$| | S d S )Nr/   r   z&Cannot take determinant of non-matrix.rX   )r6   rY   r   detr  r   r	   r	   r   determinant  s   z TransformToSymPyExpr.determinantc                 C   s$   |  |d stdt|d S )Nr   z Cannot take trace of non-matrix.)rY   r   r   Tracer   r	   r	   r   trace  s   zTransformToSymPyExpr.tracec                 C   s&   |  |d std|d   S )Nr   z#Cannot take adjugate of non-matrix.)rY   r   r   adjugater   r	   r	   r   r$    s   zTransformToSymPyExpr.adjugatec                 C   s   t |dr|jS t|tjS )N	is_Matrix)hasattrr%  rk   r   r  )r
   objr	   r	   r   rY     s   
z)TransformToSymPyExpr._obj_is_sympy_Matrixc                 C   sD   |  |r	td|  |rt|t|dS t|t|dS )NzCannot divide by matrices like this since it is not clear if left or right multiplication by the inverse is intended. Try explicitly multiplying by the inverse instead.r%   )rY   r   r   r`   r   rb   )r
   r   r   r	   r	   r   rd     s
   

z%TransformToSymPyExpr._handle_divisionN)br   r   r   __doc__r   r   SYMBOLr<   r=   r?   DIGITr   r!   r*   r.   r0   r3   r7   r@   rC   rF   rG   rH   rL   rO   rQ   rS   rU   rW   r_   r   rc   re   rn   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   r   r   r   r   r   r   r   r   r  r  r
  strr   r  r!  r#  r$  rY   rd   r	   r	   r	   r   r      s    
			<C	'#

r   )r   r   sympy.externalr   sympy.parsing.latex.errorsr   r   r   r   r   r   r	   r	   r	   r   <module>   s    