U
    ZÊ¹j-  ã                   @  sà   d dl mZ d dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZ er˜d dlmZ G dd„ deƒZG dd„ deeƒZG dd„ deeƒZ G dd„ deƒZ!dS )é    )Úannotations)ÚTYPE_CHECKING)ÚsimplifyÚtrigsimp)Úcall_highest_priorityÚ
_sympifyit)Ú	StdFactKB©Údiff©ÚIntegral)Úfactor)ÚSÚAddÚMul)ÚExpr)Ú
BaseVectorc                   @  s‚  e Zd ZU dZded< edƒdd„ ƒZedƒdd	„ ƒZed
ƒdd„ ƒZedƒdd„ ƒZ	e
deƒedƒdd„ ƒƒZe
deƒedƒdd„ ƒƒZdd„ Ze
deƒedƒdd„ ƒƒZedƒdd„ ƒZd=d#d$„Ze jejj7  _eZd%d&„ Ze jej7  _d'd(„ Ze jej7  _d)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Ze jej7  _d>d5d6„Zd7d8„ Z d9d:„ Z!e! je"j7  _d;d<„ Z#d S )?ÚBasisDependentzÒ
    Super class containing functionality common to vectors and
    dyadics.
    Named so because the representation of these quantities in
    sympy.vector is dependent on the basis they are expressed in.
    ÚBasisDependentZeroÚzeroÚ__radd__c                 C  s   |   | |¡S ©N©Ú	_add_func©ÚselfÚother© r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/vector/basisdependent.pyÚ__add__   s    zBasisDependent.__add__r   c                 C  s   |   || ¡S r   r   r   r   r   r   r      s    zBasisDependent.__radd__Ú__rsub__c                 C  s   |   | | ¡S r   r   r   r   r   r   Ú__sub__#   s    zBasisDependent.__sub__r!   c                 C  s   |   ||  ¡S r   r   r   r   r   r   r    '   s    zBasisDependent.__rsub__r   Ú__rmul__c                 C  s   |   | |¡S r   ©Ú	_mul_funcr   r   r   r   Ú__mul__+   s    zBasisDependent.__mul__r%   c                 C  s   |   || ¡S r   r#   r   r   r   r   r"   0   s    zBasisDependent.__rmul__c                 C  s   |   tj| ¡S r   )r$   r   ZNegativeOne©r   r   r   r   Ú__neg__5   s    zBasisDependent.__neg__Ú__rtruediv__c                 C  s
   |   |¡S r   )Z_div_helperr   r   r   r   Ú__truediv__8   s    zBasisDependent.__truediv__r)   c                 C  s   t dƒS )NzInvalid divisor for division)Ú	TypeErrorr   r   r   r   r(   =   s    zBasisDependent.__rtruediv__é   Néd   Fc                 C  sF   ||||||dœ}| j }	| j ¡ D ]\}
}|	|j|f|Ž|
 7 }	q"|	S )z…
        Implements the SymPy evalf routine for this quantity.

        evalf's documentation
        =====================

        )ÚsubsÚmaxnÚchopÚstrictÚquadÚverbose)r   Ú
componentsÚitemsÚevalf)r   Únr-   r.   r/   r0   r1   r2   ÚoptionsZvecÚkÚvr   r   r   r5   A   s     ÿzBasisDependent.evalfc                   s"   ‡ fdd„| j  ¡ D ƒ}| j|Ž S )zŽ
        Implements the SymPy simplify routine for this quantity.

        simplify's documentation
        ========================

        c                   s    g | ]\}}t |fˆ Ž| ‘qS r   )Úsimp©Ú.0r8   r9   ©Úkwargsr   r   Ú
<listcomp>\   s   ÿz+BasisDependent.simplify.<locals>.<listcomp>©r3   r4   r   )r   r>   Zsimp_componentsr   r=   r   r   T   s    
ÿzBasisDependent.simplifyc                   s"   ‡ fdd„| j  ¡ D ƒ}| j|Ž S )z�
        Implements the SymPy trigsimp routine, for this quantity.

        trigsimp's documentation
        ========================

        c                   s    g | ]\}}t |fˆ Ž| ‘qS r   )Útsimpr;   ©Úoptsr   r   r?   j   s   ÿz+BasisDependent.trigsimp.<locals>.<listcomp>r@   )r   rC   Ztrig_componentsr   rB   r   r   b   s    
ÿzBasisDependent.trigsimpc                 K  s   | j f |ŽS r   )r   )r   r>   r   r   r   Ú_eval_simplifyp   s    zBasisDependent._eval_simplifyc                 K  s   | j f |ŽS r   )r   )r   rC   r   r   r   Ú_eval_trigsimps   s    zBasisDependent._eval_trigsimpc                 C  s
   |   |¡S r   r	   )r   Zwrtr   r   r   Ú_eval_derivativev   s    zBasisDependent._eval_derivativec                   s$   ‡ ‡fdd„| j  ¡ D ƒ}| j|Ž S )Nc                   s$   g | ]\}}t |fˆžˆ Ž| ‘qS r   r   r;   ©ÚassumptionsÚsymbolsr   r   r?   z   s   ÿz1BasisDependent._eval_Integral.<locals>.<listcomp>r@   )r   rI   rH   Zintegral_componentsr   rG   r   Ú_eval_Integraly   s    ÿzBasisDependent._eval_Integralc                 C  s
   | t jfS )z‚
        Returns the expression as a tuple wrt the following
        transformation -

        expression -> a/b -> a, b

        ©r   ÚOner&   r   r   r   Úas_numer_denom~   s    zBasisDependent.as_numer_denomc                   s$   ‡ ‡fdd„| j  ¡ D ƒ}| j|Ž S )zµ
        Implements the SymPy factor routine, on the scalar parts
        of a basis-dependent expression.

        factor's documentation
        ========================

        c                   s$   g | ]\}}t |fˆ žˆŽ| ‘qS r   )Úfctrr;   ©Úargsr>   r   r   r?   ‘   s   ÿz)BasisDependent.factor.<locals>.<listcomp>r@   )r   rP   r>   Zfctr_componentsr   rO   r   r   ˆ   s    	ÿzBasisDependent.factorc                 C  s
   t j| fS )z1Efficiently extract the coefficient of a product.rK   )r   Zrationalr   r   r   Úas_coeff_Mul—   s    zBasisDependent.as_coeff_Mulc                   s    ‡ fdd„ˆ j D ƒ}dt|ƒfS )z3Efficiently extract the coefficient of a summation.c                   s   g | ]}|ˆ j |  ‘qS r   ©r3   ©r<   Úxr&   r   r   r?   �   s     z/BasisDependent.as_coeff_add.<locals>.<listcomp>r   )r3   Útuple)r   ÚdepsÚlr   r&   r   Úas_coeff_add›   s    zBasisDependent.as_coeff_addc                   s@   ˆ D ]}t |tƒrtdƒ‚q‡ ‡fdd„| j ¡ D ƒ}| j|Ž S )z�
        Implements the SymPy diff routine, for vectors.

        diff's documentation
        ========================

        zInvalid arg for differentiationc                   s$   g | ]\}}t |fˆ žˆŽ| ‘qS r   )Údfr;   rO   r   r   r?   «   s   ÿz'BasisDependent.diff.<locals>.<listcomp>)Ú
isinstancer   r*   r3   r4   r   )r   rP   r>   rT   Zdiff_componentsr   rO   r   r
       s    

ÿzBasisDependent.diffc                   s    ‡ ‡fdd„ˆj D ƒ}ˆj|Ž S )z(Calls .doit() on each term in the Dyadicc                   s"   g | ]}ˆj | jf ˆ Ž| ‘qS r   )r3   ÚdoitrS   ©Úhintsr   r   r   r?   ³   s   ÿz'BasisDependent.doit.<locals>.<listcomp>)r3   r   )r   r]   Zdoit_componentsr   r\   r   r[   ±   s    ÿzBasisDependent.doit)r+   Nr,   FFNF)F)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r!   r    r   ÚNotImplementedr%   r"   r'   r)   r(   r5   r   r6   r   r:   r   rA   rD   rE   rF   rJ   rM   r   rN   rQ   rX   r
   rY   r[   r   r   r   r   r      sR   








r   c                      s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚBasisDependentAddzt
    Denotes sum of basis dependent quantities such that they cannot
    be expressed as base or Mul instances.
    c           	        s>  i ‰ |D ]Œ}t || jƒsXt |tƒr0| j|jŽ }n(t |tƒrH| j|jŽ }ntt|ƒd ƒ‚|| j	krdqt
|dƒr|jD ]}ˆ  |d¡|j|  ˆ |< qtqtˆ  ¡ ƒ}|D ]}ˆ | dkr¦ˆ |= q¦tˆ ƒdkrÐ| j	S ‡ fdd„ˆ D ƒ}tƒ j| f|ž|Ž}t |tƒ�r| j|jŽ S ddi}t|ƒ|_ˆ |_tˆ  ¡ ƒd j|_|S )Nz  cannot be interpreted correctlyr3   r   c                   s   g | ]}|ˆ |  ‘qS r   r   rS   rR   r   r   r?   Ý   s     z-BasisDependentAdd.__new__.<locals>.<listcomp>ÚcommutativeT)rZ   Ú
_expr_typer   r$   rP   r   r   r*   Ústrr   Úhasattrr3   ÚgetÚlistÚkeysÚlenÚsuperÚ__new__r   Ú_assumptionsÚ_componentsÚ_sys)	ÚclsrP   r7   ÚargrT   ÚtempÚnewargsÚobjrH   ©Ú	__class__rR   r   rn   ¾   s<    

ÿ



zBasisDependentAdd.__new__)r^   r_   r`   ra   rn   Ú__classcell__r   r   rw   r   rd   ¸   s   rd   c                      s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚBasisDependentMulzJ
    Denotes product of base- basis dependent quantity with a scalar.
    c                   s’  ddl m}m}m}m} d}tj‰d}g }	|D ]š}
t|
ˆ jƒrL|d7 }d}q.|
tj	kr\d}q.t|
ˆ j
ˆ jfƒrˆ|d7 }|
j}ˆ|
j9 ‰q.t|
ˆ jƒr¢|d7 }|
}q.t|
||||fƒrÀ|	 |
¡ q.ˆ|
9 ‰q.|dkrÜtdƒ‚n|dkrît||ŽS |røˆ jS t|ˆ jƒ�r&‡ ‡fdd„|jD ƒ}ˆ j|Ž S tƒ jˆ ˆ|jf|	ž|Ž}t|tƒ�rXˆ j|jŽ S |j|_ˆ|_d	di}t|ƒ|_|jˆi|_|jj|_|S )
Nr   )ÚCrossÚDotÚCurlÚGradientFé   TzInvalid multiplicationc                   s   g | ]}ˆ   ˆ|¡‘qS r   r#   rS   ©rr   Zmeasure_numberr   r   r?     s   ÿz-BasisDependentMul.__new__.<locals>.<listcomp>re   )Zsympy.vectorr{   r|   r}   r~   r   rL   rZ   Ú
_zero_funcÚZeroZ
_base_funcr$   Ú_base_instanceÚ_measure_numberr   ÚappendÚ
ValueErrorr   r   rP   rm   rn   r   r   ro   rp   rq   )rr   rP   r7   r{   r|   r}   r~   ÚcountZzeroflagÚ
extra_argsrs   Úexprru   rv   rH   rw   r€   r   rn   î   s`    



ÿ

ÿþý

zBasisDependentMul.__new__c                 C  sD   |  | j¡}d|ks$d|ks$d|kr0d| d }|d |  | j¡ S )Nú(ú-ú+ú)Ú*)Z_printr„   rƒ   )r   ÚprinterZmeasure_strr   r   r   Ú	_sympystr(  s    ÿzBasisDependentMul._sympystr)r^   r_   r`   ra   rn   r�   ry   r   r   rw   r   rz   é   s   :rz   c                      sª   e Zd ZU dZi Zded< ded< ‡ fdd„Zdd	„ Zed
ƒdd„ ƒZ	e	Z
edƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZdd„ Zdd„ Zdd„ Z‡  ZS )r   z:
    Class to denote a zero basis dependent instance.
    zdict['BaseVector', Expr]r3   rg   Z_latex_formc                   s    t ƒ  | ¡}tj| f ¡ |_|S r   )rm   rn   r   r‚   Ú__hash__Ú_hash)rr   rv   rw   r   r   rn   7  s    zBasisDependentZero.__new__c                 C  s   | j S r   )r’   r&   r   r   r   r‘   >  s    zBasisDependentZero.__hash__Ú__req__c                 C  s   t || jƒS r   )rZ   r�   r   r   r   r   Ú__eq__A  s    zBasisDependentZero.__eq__r   c                 C  s   t || jƒr|S tdƒ‚d S ©Nz#Invalid argument types for addition©rZ   rf   r*   r   r   r   r   r   G  s    zBasisDependentZero.__add__r   c                 C  s   t || jƒr|S tdƒ‚d S r•   r–   r   r   r   r   r   N  s    zBasisDependentZero.__radd__r    c                 C  s   t || jƒr| S tdƒ‚d S ©Nz&Invalid argument types for subtractionr–   r   r   r   r   r!   U  s    zBasisDependentZero.__sub__r!   c                 C  s   t || jƒr|S tdƒ‚d S r—   r–   r   r   r   r   r    \  s    zBasisDependentZero.__rsub__c                 C  s   | S r   r   r&   r   r   r   r'   c  s    zBasisDependentZero.__neg__c                 C  s   | S )z@
        Returns the normalized version of this vector.
        r   r&   r   r   r   Ú	normalizef  s    zBasisDependentZero.normalizec                 C  s   dS )NÚ0r   )r   r�   r   r   r   r�   l  s    zBasisDependentZero._sympystr)r^   r_   r`   ra   r3   rb   rn   r‘   r   r”   r“   r   r   r!   r    r'   r˜   r�   ry   r   r   rw   r   r   0  s&   





r   N)"Ú
__future__r   Útypingr   Zsympy.simplifyr   r:   r   rA   Zsympy.core.decoratorsr   r   Zsympy.core.assumptionsr   Zsympy.core.functionr
   rY   Zsympy.integrals.integralsr   Zsympy.polys.polytoolsr   rN   Z
sympy.corer   r   r   Zsympy.core.exprr   Zsympy.vector.vectorr   r   rd   rz   r   r   r   r   r   Ú<module>   s     (1G