o
    oh-                     @  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rLd 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 N	_add_funcselfother r   o/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/vector/basisdependent.py__add__      zBasisDependent.__add__r    c                 C     |  || S r   r   r   r   r   r   r      r!   zBasisDependent.__radd____rsub__c                 C  s   |  | | S r   r   r   r   r   r   __sub__#      zBasisDependent.__sub__r$   c                 C  s   |  ||  S r   r   r   r   r   r   r#   '   r%   zBasisDependent.__rsub__r   __rmul__c                 C  r   r   	_mul_funcr   r   r   r   __mul__+      zBasisDependent.__mul__r)   c                 C  r"   r   r'   r   r   r   r   r&   0   r*   zBasisDependent.__rmul__c                 C  s   |  tj| S r   )r(   r   NegativeOner   r   r   r   __neg__5   s   zBasisDependent.__neg____rtruediv__c                 C  
   |  |S r   )_div_helperr   r   r   r   __truediv__8   s   
zBasisDependent.__truediv__r1   c                 C  s   t dS )NzInvalid divisor for division)	TypeErrorr   r   r   r   r.   =   s   zBasisDependent.__rtruediv__   Nd   Fc                 C  sJ   ||||||d}| j }	| j D ]\}
}|	|j|fi ||
 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   nr5   r6   r7   r8   r9   r:   optionsveckvr   r   r   r=   A   s   zBasisDependent.evalfc                   "    fdd| j  D }| j| S )z
        Implements the SymPy simplify routine for this quantity.

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

        c                   $   g | ]\}}t |fi  | qS r   )simp.0rA   rB   kwargsr   r   
<listcomp>\       z+BasisDependent.simplify.<locals>.<listcomp>r;   r<   r   )r   rI   simp_componentsr   rH   r   r   T      

zBasisDependent.simplifyc                   rC   )z
        Implements the SymPy trigsimp routine, for this quantity.

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

        c                   rD   r   )tsimprF   optsr   r   rJ   j   rK   z+BasisDependent.trigsimp.<locals>.<listcomp>rL   )r   rQ   trig_componentsr   rP   r   r   b   rN   zBasisDependent.trigsimpc                 K     | j di |S Nr   )r   )r   rI   r   r   r   _eval_simplifyp      zBasisDependent._eval_simplifyc                 K  rS   rT   )r   )r   rQ   r   r   r   _eval_trigsimps   rV   zBasisDependent._eval_trigsimpc                 C  r/   r   r	   )r   wrtr   r   r   _eval_derivativev   s   
zBasisDependent._eval_derivativec                   $    fdd| j  D }| j| S )Nc                   s*   g | ]\}}t |gR i  | qS r   r   rF   assumptionssymbolsr   r   rJ   z       z1BasisDependent._eval_Integral.<locals>.<listcomp>rL   )r   r]   r\   integral_componentsr   r[   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                   rZ   )z
        Implements the SymPy factor routine, on the scalar parts
        of a basis-dependent expression.

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

        c                   *   g | ]\}}t |g R i | qS r   )fctrrF   argsrI   r   r   rJ      r^   z)BasisDependent.factor.<locals>.<listcomp>rL   )r   rg   rI   fctr_componentsr   rf   r   r      s   	
zBasisDependent.factorc                 C  s
   t j| fS )z1Efficiently extract the coefficient of a product.ra   )r   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   r;   rG   xr,   r   r   rJ      s    z/BasisDependent.as_coeff_add.<locals>.<listcomp>r   )r;   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                   rd   r   )dfrF   rf   r   r   rJ      r^   z'BasisDependent.diff.<locals>.<listcomp>)
isinstancer   r2   r;   r<   r   )r   rg   rI   rm   diff_componentsr   rf   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d i  | qS )r   )r;   doitrl   hintsr   r   r   rJ      s    z'BasisDependent.doit.<locals>.<listcomp>)r;   r   )r   rw   doit_componentsr   rv   r   ru      s   
zBasisDependent.doit)r3   Nr4   FFNF)F)$__name__
__module____qualname____doc____annotations__r   r    r   r$   r#   r   NotImplementedr)   r&   r-   r1   r.   r=   r   r>   r   rE   r   rO   rU   rW   rY   r`   rc   r   re   rj   rq   r
   rr   ru   r   r   r   r   r      sT   
 







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           	        sB  i  |D ]F}t || js,t |tr| j|j }nt |tr$| j|j }ntt|d || j	kr2qt
|drJ|jD ]} |d|j|   |< q:qt  }|D ]} | dkr^ |= qSt dkrh| j	S  fdd D }t j| g|R i |}t |tr| j|j S ddi}t||_ |_t  d j|_|S )Nz  cannot be interpreted correctlyr;   r   c                   s   g | ]}| |  qS r   r   rl   rk   r   r   rJ      s    z-BasisDependentAdd.__new__.<locals>.<listcomp>commutativeT)rs   
_expr_typer   r(   rg   r   r   r2   strr   hasattrr;   getlistkeyslensuper__new__r   _assumptions_components_sys)	clsrg   r?   argrm   tempnewargsobjr\   	__class__rk   r   r      s@   






zBasisDependentAdd.__new__)ry   rz   r{   r|   r   __classcell__r   r   r   r   r      s    r   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 ]M}
t|
 jr&|d7 }d}q|
tj	kr.d}qt|
 j
 jfrD|d7 }|
j}|
j9 qt|
 jrQ|d7 }|
}qt|
||||fr`|	|
 q|
9 q|dkrmtd|dkrxt|i |S |r} jS t| jr fdd|jD } j| S t j |jg|	R i |}t|tr 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'   rl   r   measure_numberr   r   rJ     s    z-BasisDependentMul.__new__.<locals>.<listcomp>r   )sympy.vectorr   r   r   r   r   rb   rs   
_zero_funcZero
_base_funcr(   _base_instance_measure_numberr   append
ValueErrorr   r   rg   r   r   r   r   r   r   r   )r   rg   r?   r   r   r   r   countzeroflag
extra_argsr   exprr   r   r\   r   r   r   r      s`   






zBasisDependentMul.__new__c                 C  sD   | | j}d|v sd|v sd|v rd| d }|d | | j S )N(-+)*)_printr   r   )r   printermeasure_strr   r   r   	_sympystr(  s
   zBasisDependentMul._sympystr)ry   rz   r{   r|   r   r   r   r   r   r   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]r;   r   _latex_formc                   s    t  | }tj| f |_|S r   )r   r   r   r   __hash___hash)r   r   r   r   r   r   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   )rs   r   r   r   r   r   __eq__A  r!   zBasisDependentZero.__eq__r   c                 C     t || jr|S tdNz#Invalid argument types for additionrs   r   r2   r   r   r   r   r    G     zBasisDependentZero.__add__r    c                 C  r   r   r   r   r   r   r   r   N  r   zBasisDependentZero.__radd__r#   c                 C  s   t || jr	| S tdNz&Invalid argument types for subtractionr   r   r   r   r   r$   U  s   zBasisDependentZero.__sub__r$   c                 C  r   r   r   r   r   r   r   r#   \  r   zBasisDependentZero.__rsub__c                 C     | S r   r   r,   r   r   r   r-   c     zBasisDependentZero.__neg__c                 C  r   )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  r   zBasisDependentZero._sympystr)ry   rz   r{   r|   r;   r}   r   r   r   r   r   r    r   r$   r#   r-   r   r   r   r   r   r   r   r   0  s(   
 




r   N)"
__future__r   typingr   sympy.simplifyr   rE   r   rO   sympy.core.decoratorsr   r   sympy.core.assumptionsr   sympy.core.functionr
   rr   sympy.integrals.integralsr   sympy.polys.polytoolsr   re   
sympy.corer   r   r   sympy.core.exprr   sympy.vector.vectorr   r   r   r   r   r   r   r   r   <module>   s"     (1G