
    wg-                        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e      Z G d dee      Z G d dee      Z  G d de      Z!y)    )annotations)TYPE_CHECKING)simplifytrigsimp)call_highest_priority
_sympifyit)	StdFactKBdiff)Integral)factor)SAddMul)Expr)
BaseVectorc                     e Zd ZU dZded<    ed      d        Z ed      d        Z ed      d	        Z ed
      d        Z	 e
de       ed      d               Z e
de       ed      d               Zd Z e
de       ed      d               Z ed      d        Zd$dZexj                  ej"                  j                  z  c_        eZd Zexj                  ej                  z  c_        d Zexj                  ej                  z  c_        d Zd Zd Zd Zd Zd Zexj                  ej                  z  c_        d%d Zd! Z d" Z!e!xj                  e"j                  z  c_        d# Z#y)&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                &    | j                  | |      S N	_add_funcselfothers     `/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/vector/basisdependent.py__add__zBasisDependent.__add__   s    ~~dE**    r    c                &    | j                  ||       S r   r   r   s     r   r   zBasisDependent.__radd__   s    ~~eT**r!   __rsub__c                (    | j                  | |       S r   r   r   s     r   __sub__zBasisDependent.__sub__#   s    ~~dUF++r!   r%   c                (    | j                  ||        S r   r   r   s     r   r#   zBasisDependent.__rsub__'   s    ~~edU++r!   r   __rmul__c                &    | j                  | |      S r   	_mul_funcr   s     r   __mul__zBasisDependent.__mul__+   s     ~~dE**r!   r+   c                &    | j                  ||       S r   r)   r   s     r   r'   zBasisDependent.__rmul__0   s     ~~eT**r!   c                B    | j                  t        j                  |       S r   )r*   r   NegativeOner   s    r   __neg__zBasisDependent.__neg__5   s    ~~ammT22r!   __rtruediv__c                $    | j                  |      S r   )_div_helperr   s     r   __truediv__zBasisDependent.__truediv__8   s     &&r!   r4   c                    t        d      S )NzInvalid divisor for division)	TypeErrorr   s     r   r1   zBasisDependent.__rtruediv__=   s    788r!   Nc                    ||||||d}| j                   }	| j                  j                         D ]  \  }
}|	 |j                  |fi ||
z  z  }	  |	S )z
        Implements the SymPy evalf routine for this quantity.

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

        )subsmaxnchopstrictquadverbose)r   
componentsitemsevalf)r   nr8   r9   r:   r;   r<   r=   optionsveckvs               r   r@   zBasisDependent.evalfA   sf     tD6w0iiOO))+ 	-DAq71771((1,,C	-
r!   c           	         | j                   j                         D cg c]  \  }}t        |fi ||z   }}} | j                  | S c c}}w )z
        Implements the SymPy simplify routine for this quantity.

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

        )r>   r?   simpr   )r   kwargsrD   rE   simp_componentss        r   r   zBasisDependent.simplifyT   sW     $(??#8#8#:<1a  ,V,q0 < <t~~//<   A	c           	         | j                   j                         D cg c]  \  }}t        |fi ||z   }}} | j                  | S c c}}w )z
        Implements the SymPy trigsimp routine, for this quantity.

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

        )r>   r?   tsimpr   )r   optsrD   rE   trig_componentss        r   r   zBasisDependent.trigsimpb   sW     $(??#8#8#:<1a !+d+a/ < <t~~//<rJ   c                &     | j                   di |S N )r   )r   rH   s     r   _eval_simplifyzBasisDependent._eval_simplifyp   s    t}}&v&&r!   c                &     | j                   di |S rP   )r   )r   rM   s     r   _eval_trigsimpzBasisDependent._eval_trigsimps   s    t}}$t$$r!   c                $    | j                  |      S r   r
   )r   wrts     r   _eval_derivativezBasisDependent._eval_derivativev   s    yy~r!   c           	         | j                   j                         D cg c]  \  }}t        |g|i ||z   }}} | j                  | S c c}}w r   )r>   r?   r   r   )r   symbolsassumptionsrD   rE   integral_componentss         r   _eval_IntegralzBasisDependent._eval_Integraly   s`    +/??+@+@+BD#'1a  (CGC{CaG D Dt~~233D   Ac                &    | t         j                  fS )z
        Returns the expression as a tuple wrt the following
        transformation -

        expression -> a/b -> a, b

        r   Oner/   s    r   as_numer_denomzBasisDependent.as_numer_denom~   s     QUU{r!   c           	         | j                   j                         D cg c]  \  }}t        |g|i ||z   }}} | j                  | S c c}}w )z
        Implements the SymPy factor routine, on the scalar parts
        of a basis-dependent expression.

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

        )r>   r?   fctrr   )r   argsrH   rD   rE   fctr_componentss         r   r   zBasisDependent.factor   s\     $(??#8#8#:<1a  3D3F3a7 < <t~~//<r]   c                &    t         j                  | fS )z1Efficiently extract the coefficient of a product.r_   )r   rationals     r   as_coeff_MulzBasisDependent.as_coeff_Mul   s    t}r!   c                x    | j                   D cg c]  }|| j                   |   z   }}dt        |      fS c c}w )z3Efficiently extract the coefficient of a summation.r   )r>   tuple)r   depsxls       r   as_coeff_addzBasisDependent.as_coeff_add   s:    -1__=Q##==%({ >s   7c           	         |D ]  }t        |t              st        d       | j                  j	                         D cg c]  \  }}t        |g|i ||z   }}} | j                  | S c c}}w )z
        Implements the SymPy diff routine, for vectors.

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

        zInvalid arg for differentiation)
isinstancer   r6   r>   r?   dfr   )r   rd   rH   rl   rD   rE   diff_componentss          r   r   zBasisDependent.diff   s      	CA!^, ABB	C $(??#8#8#:<1a a1$1&1A5 < <t~~//<s    A.c                    | j                   D cg c]$  } | j                   |   j                  di ||z  & }} | j                  | S c c}w )z(Calls .doit() on each term in the DyadicrQ   )r>   doitr   )r   hintsrl   doit_componentss       r   rt   zBasisDependent.doit   sY     %)OO5  34??1-22;U;a? 5 5t~~//5s   )A	)   Nd   FFNF)F)$__name__
__module____qualname____doc____annotations__r   r    r   r%   r#   r   NotImplementedr+   r'   r0   r4   r1   r@   r   rA   r   rG   r   rL   rR   rT   rW   r\   ra   r   rc   rh   rn   r   rq   rt   rQ   r!   r   r   r      s    :&+ '+ 9%+ &+ :&, ', 9%, &, (:&+ ' )+ (9%+ & )+3 (>*' + )' =)9 *9 
MMTZZ'''MA
0 $
0 %'%4
0 NNdll"N
0 	LLBJJL0r!   r   c                  "     e Zd ZdZ fdZ xZS )BasisDependentAddzt
    Denotes sum of basis dependent quantities such that they cannot
    be expressed as base or Mul instances.
    c                   i }|D ]  }t        || j                        skt        |t              r | j                  |j                   }nAt        |t
              r | j                  |j                   }nt        t        |      dz         || j                  k(  rt        |d      s|j                  D ]'  }|j                  |d      |j                  |   z   ||<   )  t        |j                               }|D ]  }||   dk(  s||=  t        |      dk(  r| j                  S |D cg c]
  }|||   z   }}t!        
| D  | g|i |}t        |t              r | j                  |j                   S ddi}	t%        |	      |_        ||_        t        |j                               d   j*                  |_        |S c c}w )Nz  cannot be interpreted correctlyr>   r   commutativeT)rp   
_expr_typer   r*   rd   r   r   r6   strr   hasattrr>   getlistkeyslensuper__new__r	   _assumptions_components_sys)clsrd   rB   r>   argrl   tempnewargsobjrZ   	__class__s             r   r   zBasisDependentAdd.__new__   s   
  	MCc3>>2c3''#--#((4CS)'#--#((4C#CH$F%G H H chhsL) MA$.NN1a$83>>!;L$LJqMM	M" JOO%& 	"A!}!qM	"
 z?a88O /991z!}$99goc7G7w7c3 3==#((++$d+$[1$*+Q/44
 :s   )F>)ry   rz   r{   r|   r   __classcell__r   s   @r   r   r      s    
( (r!   r   c                  (     e Zd ZdZ fdZd Z xZS )BasisDependentMulzJ
    Denotes product of base- basis dependent quantity with a scalar.
    c                   ddl m}m}m}m} d}t
        j                  }d}	g }
|D ]  }t        || j                        r|dz  }d}	!|t
        j                  k(  rd}	7t        || j                  | j                  f      r!|dz  }|j                  }||j                  z  }zt        || j                        r|dz  }|}t        |||||f      r|
j                  |       ||z  } |dkD  rt!        d      |dk(  rt#        |i |S |	r| j$                  S t        | j                        r8|j&                  D cg c]  }| j                  ||       }} | j                  | S t)        | T  | ||j                  g|
i |}t        |t,              r | j                  |j&                   S |j                  |_        ||_        ddi}t/        |      |_        |j                  |i|_        |j                  j4                  |_        |S c c}w )Nr   )CrossDotCurlGradientF   TzInvalid multiplicationr   )sympy.vectorr   r   r   r   r   r`   rp   
_zero_funcZero
_base_funcr*   _base_instance_measure_numberr   append
ValueErrorr   r   rd   r   r   r   r	   r   r   r   )r   rd   rB   r   r   r   r   countmeasure_numberzeroflag
extra_argsr   exprrl   r   r   rZ   r   s                    r   r   zBasisDependentMul.__new__   s   ;;

  	&C#s~~.
C#..#--!@A
))#"5"55C/
C%dH!=>!!#&#%!	&$ 19566aZ(((88O dCMM* II' }}^Q7 'G ' 3=='**goc>"11))) !() c3 3==#((++!00,$d+$[1..?&&++
#'s   9Hc                    |j                  | j                        }d|v sd|v sd|v rd|z   dz   }|dz   |j                  | j                        z   S )N(-+)*)_printr   r   )r   printermeasure_strs      r   	_sympystrzBasisDependentMul._sympystr(  s[    nnT%9%9:;#"4{"+c1KS 7>>$2E2E#FFFr!   )ry   rz   r{   r|   r   r   r   r   s   @r   r   r      s    8tGr!   r   c                       e Zd ZU dZi Zded<   ded<    fdZd Z ed      d	        Z	e	Z
 ed
      d        Z ed      d        Z ed      d        Z ed      d        Zd Zd Zd Z xZS )r   z:
    Class to denote a zero basis dependent instance.
    zdict['BaseVector', Expr]r>   r   _latex_formc                p    t         |   |       }t        j                  | fj	                         |_        |S r   )r   r   r   r   __hash___hash)r   r   r   s     r   r   zBasisDependentZero.__new__7  s0    goc" VVSM**,	
r!   c                    | j                   S r   )r   r/   s    r   r   zBasisDependentZero.__hash__>  s    zzr!   __req__c                .    t        || j                        S r   )rp   r   r   s     r   __eq__zBasisDependentZero.__eq__A  s    %11r!   r   c                H    t        || j                        r|S t        d      Nz#Invalid argument types for additionrp   r   r6   r   s     r   r    zBasisDependentZero.__add__G  !    eT__-LABBr!   r    c                H    t        || j                        r|S t        d      r   r   r   s     r   r   zBasisDependentZero.__radd__N  r   r!   r#   c                J    t        || j                        r| S t        d      Nz&Invalid argument types for subtractionr   r   s     r   r%   zBasisDependentZero.__sub__U  s#    eT__-6MDEEr!   r%   c                H    t        || j                        r|S t        d      r   r   r   s     r   r#   zBasisDependentZero.__rsub__\  s!    eT__-LDEEr!   c                    | S r   rQ   r/   s    r   r0   zBasisDependentZero.__neg__c  s    r!   c                    | S )z@
        Returns the normalized version of this vector.
        rQ   r/   s    r   	normalizezBasisDependentZero.normalizef  s	     r!   c                     y)N0rQ   )r   r   s     r   r   zBasisDependentZero._sympystrl  s    r!   )ry   rz   r{   r|   r>   r}   r   r   r   r   r   r    r   r%   r#   r0   r   r   r   r   s   @r   r   r   0  s     ,.J(- 9%2 &2 G:&C 'C 9%C &C :&F 'F 9%F &Fr!   r   N)"
__future__r   typingr   sympy.simplifyr   rG   r   rL   sympy.core.decoratorsr   r   sympy.core.assumptionsr	   sympy.core.functionr   rq   sympy.integrals.integralsr   sympy.polys.polytoolsr   rc   
sympy.corer   r   r   sympy.core.exprr   sympy.vector.vectorr   r   r   r   r   rQ   r!   r   <module>r      si    "   > C , * . 0 " "  .d0T d0N. .bDG DGN= =r!   