o
    GZhd                     @   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	   S/var/www/auris/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   )sympyZ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   Z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   Z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   Z
greek_baseZ	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   Z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   r;   Nr   r	   r   r	   r	   r   group_round_parenthesesx   r>   z,TransformToSymPyExpr.group_round_parenthesesc                 C   r;   r?   r	   r   r	   r	   r   group_square_brackets{   r>   z*TransformToSymPyExpr.group_square_bracketsc                 C   r;   r?   r	   r   r	   r	   r   group_curly_parentheses~   r>   z,TransformToSymPyExpr.group_curly_parenthesesc                 C      t |d |d S Nr   r,   )r   Eqr   r	   r	   r   eq      zTransformToSymPyExpr.eqc                 C   rC   rD   )r   ZNer   r	   r	   r   ne   rG   zTransformToSymPyExpr.nec                 C   rC   rD   )r   Ltr   r	   r	   r   lt   rG   zTransformToSymPyExpr.ltc                 C   rC   rD   )r   ZLer   r	   r	   r   lte   rG   zTransformToSymPyExpr.ltec                 C   rC   rD   )r   Gtr   r	   r	   r   gt   rG   zTransformToSymPyExpr.gtc                 C   rC   rD   )r   ZGer   r	   r	   r   gte   rG   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   )r1   _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#   rO   r   )r1   rP   r   MatMulrQ   rR   )r
   r   xrT   rU   r	   r	   r   r      s   
zTransformToSymPyExpr.subc                 C   s<   |d }|d }|  |s|  |rt||S t||S rD   )rP   r   rW   MulrS   r	   r	   r   mul   s
   zTransformToSymPyExpr.mulc                 C   s   |  |d |d S rD   )_handle_divisionr   r	   r	   r   div   rG   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.quantumr]   r^   
isinstancer_   r   r   tuple
DerivativerY   )r
   r   r]   r^   r_   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 )NZPRIMESrb   r   r4   rX   r	   r	   r   isprime   rG   z1TransformToSymPyExpr.superscript.<locals>.isprimec                 S      t | to| jdkp| jdkS )NZPRIMES_VIA_CMDZ	CMD_PRIMErg   rh   r	   r	   r   
iscmdprime      z4TransformToSymPyExpr.superscript.<locals>.iscmdprimec                 S   rf   )NZSTARSrg   rh   r	   r	   r   isstar   rG   z0TransformToSymPyExpr.superscript.<locals>.isstarc                 S   rj   )NZSTARS_VIA_CMDZCMD_ASTERISKrg   rh   r	   r	   r   	iscmdstar   rl   z3TransformToSymPyExpr.superscript.<locals>.iscmdstarr   rO   r,   r0   THz\primez\astz with superscript  is not understood.)
r1   rP   r   r   	TransposeZadjointr$   doitr   Pow)r
   r   ri   rk   rm   rn   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   ()rq   r,   )r$   rP   r   r1   r   rr   r
   r   r'   Zprimesr	   r	   r   matrix_prime  s   


z!TransformToSymPyExpr.matrix_primec                 C   s&   |d }|d j }t|j | S )Nr   r   )r$   r   r   namery   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)rb   rc   r[   )r
   r   	numeratorr    variabledenominatorr	   r	   r   fraction  s   zTransformToSymPyExpr.fractionc                 C   rC   )Nr   r,   )r   binomialr   r	   r	   r   r   &  rG   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.rO   r,   )index_extract_differential_symbolr   r   Integral)
r
   r   underscore_indexcaret_indexlower_boundupper_bounddifferential_symbolZ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 )NrO   r   r/   r,   )r1   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   rY   rt   )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   Zleft_brace_indexZright_brace_indexZbottom_limitZ	top_limitZindex_variableZlower_limitZupper_limitr	   r	   r   group_curly_parentheses_special  s   


z4TransformToSymPyExpr.group_curly_parentheses_specialc                 C   rC   Nr,   r   )r   ZSumr   r	   r	   r   	summation  rG   zTransformToSymPyExpr.summationc                 C   rC   r   )r   ZProductr   r	   r	   r   product  rG   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   Z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   rO   r   )rb   rc   r
   r   Z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   ZLimitr   r	   r	   r   limit  s   zTransformToSymPyExpr.limitc                 C   r;   r?   r	   r   r	   r	   r   differential  r>   z!TransformToSymPyExpr.differentialc                 C   rC   )Nr#   r0   )r   rd   r   r	   r	   r   r}     rG   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)rb   r   r4   r   )r   r	   r	   r   remove_tokens  s
   

z?TransformToSymPyExpr.list_of_expressions.<locals>.remove_tokens)r1   filter)r
   r   r   r	   r	   r   list_of_expressions  s   
z(TransformToSymPyExpr.list_of_expressionsc                 C   s   t |d |d  S rD   )r   Functionr   r	   r	   r   function_applied     z%TransformToSymPyExpr.function_appliedc                 C      t j|d  S Nr,   )r   ZMinr   r	   r	   r   min     zTransformToSymPyExpr.minc                 C   r   r   )r   ZMaxr   r	   r	   r   max  r   zTransformToSymPyExpr.maxc                 C      ddl m} ||d S )Nr   )r]   r   )ra   r]   )r
   r   r]   r	   r	   r   bra
     zTransformToSymPyExpr.brac                 C   r   )Nr   )r^   r   )ra   r^   )r
   r   r^   r	   r	   r   ket  r   zTransformToSymPyExpr.ketc                 C   s.   ddl m}m}m} |||d ||d S )Nr   )r]   r^   InnerProductr   rO   )ra   r]   r^   r   )r
   r   r]   r^   r   r	   r	   r   inner_product  s   z"TransformToSymPyExpr.inner_productc                 C      t |d S r?   )r   sinr   r	   r	   r   r     r   zTransformToSymPyExpr.sinc                 C   r   r?   )r   cosr   r	   r	   r   r     r   zTransformToSymPyExpr.cosc                 C   r   r?   )r   tanr   r	   r	   r   r     r   zTransformToSymPyExpr.tanc                 C   r   r?   )r   cscr   r	   r	   r   r     r   zTransformToSymPyExpr.cscc                 C   r   r?   )r   secr   r	   r	   r   r   "  r   zTransformToSymPyExpr.secc                 C   r   r?   )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   asinrt   r   r
   r   exponentr	   r	   r   	sin_power(     zTransformToSymPyExpr.sin_powerc                 C   r   r   )r   acosrt   r   r   r	   r	   r   	cos_power/  r   zTransformToSymPyExpr.cos_powerc                 C   r   r   )r   atanrt   r   r   r	   r	   r   	tan_power6  r   zTransformToSymPyExpr.tan_powerc                 C   r   r   )r   acscrt   r   r   r	   r	   r   	csc_power=  r   zTransformToSymPyExpr.csc_powerc                 C   r   r   )r   asecrt   r   r   r	   r	   r   	sec_powerD  r   zTransformToSymPyExpr.sec_powerc                 C   r   r   )r   acotrt   r   r   r	   r	   r   	cot_powerK  r   zTransformToSymPyExpr.cot_powerc                 C   r   r?   )r   r   r   r	   r	   r   arcsinR  r   zTransformToSymPyExpr.arcsinc                 C   r   r?   )r   r   r   r	   r	   r   arccosU  r   zTransformToSymPyExpr.arccosc                 C   r   r?   )r   r   r   r	   r	   r   arctanX  r   zTransformToSymPyExpr.arctanc                 C   r   r?   )r   r   r   r	   r	   r   arccsc[  r   zTransformToSymPyExpr.arccscc                 C   r   r?   )r   r   r   r	   r	   r   arcsec^  r   zTransformToSymPyExpr.arcsecc                 C   r   r?   )r   r   r   r	   r	   r   arccota  r   zTransformToSymPyExpr.arccotc                 C   r   r?   )r   sinhr   r	   r	   r   r   d  r   zTransformToSymPyExpr.sinhc                 C   r   r?   )r   coshr   r	   r	   r   r   g  r   zTransformToSymPyExpr.coshc                 C   r   r?   )r   tanhr   r	   r	   r   r   j  r   zTransformToSymPyExpr.tanhc                 C   r   r?   )r   asinhr   r	   r	   r   r   m  r   zTransformToSymPyExpr.asinhc                 C   r   r?   )r   acoshr   r	   r	   r   r   p  r   zTransformToSymPyExpr.acoshc                 C   r   r?   )r   atanhr   r	   r	   r   r   s  r   zTransformToSymPyExpr.atanhc                 C   r   r?   )r   ZAbsr   r	   r	   r   absv  r   zTransformToSymPyExpr.absc                 C   r   r?   )r   floorr   r	   r	   r   r   y  r   zTransformToSymPyExpr.floorc                 C   r   r?   )r   Zceilingr   r	   r	   r   ceil|  r   zTransformToSymPyExpr.ceilc                 C   r   r<   )r   	factorialr   r	   r	   r   r     r   zTransformToSymPyExpr.factorialc                 C   r   r?   )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   rO   )r1   r   sqrtrootr   r	   r	   r   square_root  s
   z TransformToSymPyExpr.square_rootc                 C   r   r?   )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   ZFUNC_LGr   
   ZFUNC_LNZFUNC_LOGr    rO   r,   )r4   r   logr   r	   r	   r   r     s   zTransformToSymPyExpr.logsc                    s$   h d}t  fdd|D d }|S )N>   r`   z\text{d}z
\mathrm{d}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   Z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   rf   )NZ
matrix_row)rb   r   datarh   r	   r	   r   is_matrix_row  rG   z2TransformToSymPyExpr.matrix.<locals>.is_matrix_rowc                 S   s   t | t p
| jdkS )NZMATRIX_COL_DELIMrg   )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   rX   r   r   r	   r   r     s    z/TransformToSymPyExpr.matrix.<locals>.<listcomp>)r   r   Matrix)r
   r   Z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.rO   )r1   rP   r   Z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.)rP   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.)rP   r   rs   adjugater   r	   r	   r   r     s   zTransformToSymPyExpr.adjugatec                 C   s   t |dr|jS t|tjS )N	is_Matrix)hasattrr   rb   r   r   )r
   objr	   r	   r   rP     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#   )rP   r   r   rW   rt   rY   )r
   r~   r   r	   r	   r   r[     s
   

z%TransformToSymPyExpr._handle_divisionN)br   r   r   __doc__r   r   SYMBOLr6   r7   r9   DIGITr   r   r(   r+   r-   r.   r2   r:   r=   r@   rA   rB   rF   rH   rJ   rK   rM   rN   rV   r   rZ   r\   re   rv   rz   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   rP   r[   r	   r	   r	   r   r      s    
			<C	'#

r   )r   r   Zsympy.externalr   Zsympy.parsing.latex.errorsr   r   r   r   r   r   r	   r	   r	   r   <module>   s    