U
    9%e!-                     @  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rd 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/Darija-Ai-API/env/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__   Nd   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           
        sF  i  t |D ]\}}t|| js`t|tr8| j|j }n(t|trP| j|j }ntt	|d || j
krlqt|dr|jD ]} |d|j|   |< q|qt  }|D ]} | dkr |= qt 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)	enumeraterZ   
_expr_typer   r$   rP   r   r   r*   strr   hasattrr3   getlistkeyslensuper__new__r   _assumptions_components_sys)
clsrP   r7   iargrT   tempnewargsobjrH   	__class__rR   r   ro      s<    





zBasisDependentAdd.__new__)r^   r_   r`   ra   ro   __classcell__r   r   ry   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rtdn|dkrt||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   rs   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   rn   ro   r   r   rp   rq   rr   )rs   rP   r7   r}   r~   r   r   countZzeroflag
extra_argsru   exprrw   rx   rH   ry   r   r   ro      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   ro   r   r{   r   r   ry   r   r|      s   :r|   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   rh   Z_latex_formc                   s    t  | }tj| f |_|S r   )rn   ro   r   r   __hash___hash)rs   rx   ry   r   r   ro   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   rg   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   ro   r   r   r   r   r   r   r!   r    r'   r   r   r{   r   r   ry   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   r|   r   r   r   r   r   <module>   s     (1G