+
    ik                    R   ^ RI Ht ^ RIHt ^ RIHtHtHtHtH	t	 ^ RI
Ht ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHtHtHt ^ R	IHtHt ^ R
IHt ^ RIHtHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t% ^ RI&H't' ^ RI(H)t) ^ RI*H+t+ R,R lt, ! R R]4      t-])! ]-]4      R 4       t.])! ]-]-4      R 4       t.R t/R]/! ]4      .R]/! ]	4      ./]P`                  ]-&   R-R lt1R t2 ! R R]4      t3 ! R R ]-4      t4R! t5 ! R" R#4      t6R$ t7^R%I8H9t9 ^R&I:H;t; ^R'I<H=t= ^R(I>H?t? ^R)I@HAtA ^R*IBHCtCHDtD ^R+IEHFtF R# ).    )annotationswraps)SIntegerBasicMulAdd)check_assumptions)call_highest_priority)ExprExprBuilder)	FuzzyBool)StrDummysymbolsSymbol)SympifyError_sympify)
SYMPY_INTS)	conjugateadjoint)KroneckerDelta)NonSquareMatrixError)
MatrixKind)
MatrixBase)dispatch)
filldedentNc                   a V3R  lpV# )c                4   <a  \        S 4      V V3R  l4       pV# )c                R   <  \        V4      pS! W4      #   \         d    Su # i ; iN)r   r   )abfuncretvals   &&ڂ/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/sympy/matrices/expressions/matexpr.py__sympifyit_wrapper5_sympifyit.<locals>.deco.<locals>.__sympifyit_wrapper   s/    QKAz! s    &&r   )r%   r(   r&   s   f r'   deco_sympifyit.<locals>.deco   s!    	t	 
	 #"     )argr&   r*   s   &f r'   
_sympifyitr/      s    	# Kr,   c                    a  ] tR t^%t$ RtRTtR]R&   RtRtRt	R]R&   Rt
R]R	&   R
tR]R&   RtRtRtRtRtRtRtRtRt]! 4       tR]R&   R t]R R l4       t]R 4       t]R 4       tR tR t]! R]4      ] ! R4      R 4       4       t!]! R]4      ] ! R4      R 4       4       t"]! R]4      ] ! R4      R 4       4       t#]! R]4      ] ! R4      R 4       4       t$]! R]4      ] ! R4      R  4       4       t%]! R]4      ] ! R4      R! 4       4       t&]! R]4      ] ! R"4      R# 4       4       t']! R]4      ] ! R"4      R$ 4       4       t(]! R]4      ] ! R%4      R& 4       4       t)]! R]4      ] ! R'4      R( 4       4       t*]! R]4      ] ! R)4      R* 4       4       t+]! R]4      ] ! R+4      R, 4       4       t,]R- 4       t-]R. 4       t.]R/ R0 l4       t/R1 t0RUR2 lt1R3 t2R4 t3R5 t4R6 t5R7 t6R8 t7R9 t8R: t9R; t:V 3R< lt;]<R= 4       t=R> t>R? t?RVR@ lt@RA tARB tB]RC 4       tCRD tDRE tERF tF]RG 4       tGRH tHRI tIRJ RK ltJRL tKRM tL]MR
3RN ltNRO tORP tPRQ tQ]RRWRR l4       tSRS tTRTtUV ;tV# )X
MatrixExpra`  Superclass for Matrix Expressions

MatrixExprs represent abstract matrices, linear transformations represented
within a particular basis.

Examples
========

>>> from sympy import MatrixSymbol
>>> A = MatrixSymbol('A', 3, 3)
>>> y = MatrixSymbol('y', 3, 1)
>>> x = (A.T*A).I * A * y

See Also
========

MatrixSymbol, MatAdd, MatMul, Transpose, Inverse
ztuple[str, ...]	__slots__Fg      &@Tbool	is_Matrixis_MatrixExprNr   is_Identityr   kindc                	V    \        \        V4      p\        P                  ! V .VO5/ VB # r"   )mapr   r   __new__)clsargskwargss   &*,r'   r:   MatrixExpr.__new__Q   s'    8T"}}S242622r,   c                   V ^8  d   QhRR/# )   returnztuple[Expr, Expr]r-   )formats   "r'   __annotate__MatrixExpr.__annotate__X   s     " "( "r,   c                	    \         hr"   NotImplementedErrorselfs   &r'   shapeMatrixExpr.shapeW   s    !!r,   c                	    \         # r"   MatAddrH   s   &r'   _add_handlerMatrixExpr._add_handler[       r,   c                	    \         # r"   MatMulrH   s   &r'   _mul_handlerMatrixExpr._mul_handler_   rQ   r,   c                	R    \        \        P                  V 4      P                  4       # r"   )rT   r   NegativeOnedoitrH   s   &r'   __neg__MatrixExpr.__neg__c   s    ammT*//11r,   c                	    \         hr"   rF   rH   s   &r'   __abs__MatrixExpr.__abs__f   s    !!r,   other__radd__c                	4    \        W4      P                  4       # r"   rN   rY   rI   r_   s   &&r'   __add__MatrixExpr.__add__i        d"''))r,   rd   c                	4    \        W4      P                  4       # r"   rb   rc   s   &&r'   r`   MatrixExpr.__radd__n        e"''))r,   __rsub__c                	6    \        W) 4      P                  4       # r"   rb   rc   s   &&r'   __sub__MatrixExpr.__sub__s   s     dF#((**r,   rl   c                	6    \        W) 4      P                  4       # r"   rb   rc   s   &&r'   rj   MatrixExpr.__rsub__x   s     eU#((**r,   __rmul__c                	4    \        W4      P                  4       # r"   rT   rY   rc   s   &&r'   __mul__MatrixExpr.__mul__}   rf   r,   c                	4    \        W4      P                  4       # r"   rr   rc   s   &&r'   
__matmul__MatrixExpr.__matmul__   rf   r,   rs   c                	4    \        W4      P                  4       # r"   rr   rc   s   &&r'   rp   MatrixExpr.__rmul__   ri   r,   c                	4    \        W4      P                  4       # r"   rr   rc   s   &&r'   __rmatmul__MatrixExpr.__rmatmul__   ri   r,   __rpow__c                	4    \        W4      P                  4       # r"   )MatPowrY   rc   s   &&r'   __pow__MatrixExpr.__pow__   rf   r,   r   c                	    \        R 4      h)zMatrix Power not definedrF   rc   s   &&r'   r}   MatrixExpr.__rpow__   s     ""<==r,   __rtruediv__c                	<    W\         P                  ,          ,          # r"   )r   rX   rc   s   &&r'   __truediv__MatrixExpr.__truediv__   s     Q]]***r,   r   c                	    \        4       hr"   rF   rc   s   &&r'   r   MatrixExpr.__rtruediv__   s     "##r,   c                	(    V P                   ^ ,          # r   rJ   rH   s   &r'   rowsMatrixExpr.rows       zz!}r,   c                	(    V P                   ^,          #    r   rH   s   &r'   colsMatrixExpr.cols   r   r,   c                   V ^8  d   QhRR/# )r@   rA   zbool | Noner-   )rB   s   "r'   rC   rD      s      ; r,   c                	    V P                   w  r\        V\        4      '       d   \        V\        4      '       d   W8H  # W8X  d   R # R# )TN)rJ   
isinstancer   )rI   r   r   s   &  r'   	is_squareMatrixExpr.is_square   s9    ZZ
dG$$D')B)B<<r,   c                	0    ^ RI Hp V! \        V 4      4      # r   )Adjoint)"sympy.matrices.expressions.adjointr   	TransposerI   r   s   & r'   _eval_conjugateMatrixExpr._eval_conjugate   s    >y''r,   c                	"    V P                  4       # r"   )_eval_as_real_imag)rI   deephintss   &&,r'   as_real_imagMatrixExpr.as_real_imag   s    &&((r,   c                	    \         P                  W P                  4       ,           ,          pW P                  4       ,
          ^\         P                  ,          ,          pW3# r@   )r   Halfr   ImaginaryUnit)rI   realims   &  r'   r   MatrixExpr._eval_as_real_imag   sC    vv 4 4 667))++a.?@zr,   c                	    \        V 4      # r"   InverserH   s   &r'   _eval_inverseMatrixExpr._eval_inverse       t}r,   c                	    \        V 4      # r"   DeterminantrH   s   &r'   _eval_determinantMatrixExpr._eval_determinant   s    4  r,   c                	    \        V 4      # r"   r   rH   s   &r'   _eval_transposeMatrixExpr._eval_transpose       r,   c                	    R # r"   r-   rH   s   &r'   _eval_traceMatrixExpr._eval_trace   s    r,   c                    \        W4      # )z
Override this in sub-classes to implement simplification of powers.  The cases where the exponent
is -1, 0, 1 are already covered in MatPow.doit(), so implementations can exclude these cases.
r   )rI   exps   &&r'   _eval_powerMatrixExpr._eval_power   s    
 d  r,   c           
     	    V P                   '       d   V # ^ RIHp V P                  ! V P                   Uu. uF  q2! V3/ VB NK  	  up!  # u upi )r   )simplify)is_Atomsympy.simplifyr   r%   r<   )rI   r=   r   xs   &,  r'   _eval_simplifyMatrixExpr._eval_simplify   sB    <<<K/99diiHix4V4iHIIHs   Ac                	    ^ RI Hp V! V 4      # r   )r   r   r   s   & r'   _eval_adjointMatrixExpr._eval_adjoint   s    >t}r,   c                	0    \         P                  ! WV4      # r"   )r   _eval_derivative_n_times)rI   r   ns   &&&r'   r   #MatrixExpr._eval_derivative_n_times   s    --dq99r,   c                	v   < V P                  V4      '       d   \        SV `	  V4      # \        V P                  !  # r"   )hassuper_eval_derivative
ZeroMatrixrJ   )rI   r   	__class__s   &&r'   r   MatrixExpr._eval_derivative   s/    88A;;7+A..tzz**r,   c                    VP                   '       * ;'       d    \        VRRR7      pVRJ d   \        RP                  V4      4      hR# )z2Helper function to check invalid matrix dimensionsT)integernonnegativeFz?The dimension specification {} should be a nonnegative integer.N)is_Floatr   
ValueErrorrB   )r;   dimoks   && r'   
_check_dimMatrixExpr._check_dim   sP      1 1"34#1;))/6 6 r,   c                	N    \        R V P                  P                  ,          4      h)zIndexing not implemented for %s)rG   r   __name__rI   ijr=   s   &&&,r'   _entryMatrixExpr._entry   s#    !-0G0GGI 	Ir,   c                	    \        V 4      # r"   )r   rH   s   &r'   r   MatrixExpr.adjoint   r   r,   c                &    \         P                  V 3# )z1Efficiently extract the coefficient of a product.)r   One)rI   rationals   &&r'   as_coeff_MulMatrixExpr.as_coeff_Mul   s    uud{r,   c                	    \        V 4      # r"   )r   rH   s   &r'   r   MatrixExpr.conjugate  r   r,   c                	    ^ RI Hp V! V 4      # )r   	transpose)$sympy.matrices.expressions.transposer   )rI   r   s   & r'   r   MatrixExpr.transpose  s    Br,   c                "    V P                  4       # )zMatrix transpositionr   rH   s   &r'   TMatrixExpr.T	  s     ~~r,   c                	X    V P                   R J d   \        R4      hV P                  4       # )FzInverse of non-square matrix)r   r   r   rH   s   &r'   inverseMatrixExpr.inverse  s)    >>U"&'EFF!!##r,   c                	"    V P                  4       # r"   r   rH   s   &r'   invMatrixExpr.inv  s    ||~r,   c                	    ^ RI Hp V! V 4      # )r   )det)&sympy.matrices.expressions.determinantr  )rI   r  s   & r'   r  MatrixExpr.det  s    >4yr,   c                	"    V P                  4       # r"   r  rH   s   &r'   IMatrixExpr.I  s    ||~r,   c                	0   R  pV! V4      ;'       d    V! V4      ;'       du    V P                   RJ ;'       g4    WP                   ) 8  R8g  ;'       dE    WP                   8  R8g  ;'       d,    W P                  ) 8  R8g  ;'       d    W P                  8  R8g  # )c                B    \        V \        \        \        \        34      # r"   )r   intr   r   r   )idxs   &r'   is_valid(MatrixExpr.valid_index.<locals>.is_valid  s    cC&$#?@@r,   NF)r   r   )rI   r   r   r  s   &&& r'   valid_indexMatrixExpr.valid_index  s    	A H H H Hd" H HyyjU*HGII%/GH H yyjU*H H 12II%/G	Ir,   c                	   \        V\        4      '       g&   \        V\        4      '       d   ^ RIHp V! WR
4      # \        V\        4      '       d   \        V4      ^8X  d   Vw  r4\        V\        4      '       g   \        V\        4      '       d   ^ RIHp V! WV4      # \        V4      \        V4      rCV P                  W44      R8w  d   V P                  W44      # \        RV: RV: R24      h\        V\        \        34      '       d   V P                  w  rV\        V\        4      '       g   \        \        R4      4      h\        V4      pW,          pW,          pV P                  W44      R8w  d   V P                  W44      # \        RV,          4      h\        V\        \        34      '       d   \        \        R4      4      h\        R	V ,          4      h)r   )MatrixSliceFzInvalid indices (z, )zo
                    Single indexing is only supported when the number
                    of columns is known.zInvalid index %szj
                Only integers may be used when addressing the matrix
                with a single index.zInvalid index, wanted %s[i,j])r   Nr   )r   tupleslice sympy.matrices.expressions.slicer  lenr   r  r   
IndexErrorr   r   rJ   r   r   r   )rI   keyr  r   r   r   r   s   &&     r'   __getitem__MatrixExpr.__getitem__&  s   #u%%*S%*@*@Dt,77c5!!c#h!mDA!U##z!U';';H"4A..A;q%.{{1(( q!!DEEj'233JDdG,,  -, "- . . 3-CA
A%.{{1(( !3c!9::fd^,,Z )( ) * * 84?@@r,   c                   V ^8  d   QhRR/# )r@   rA   r3   r-   )rB   s   "r'   rC   rD   I  s     A AD Ar,   c                	    \        V P                  \        \        34      '       * ;'       g&    \        V P                  \        \        34      '       * # r"   )r   r   r   r   r   rH   s   &r'   _is_shape_symbolicMatrixExpr._is_shape_symbolicI  s@    tyy:w*?@@ @ @dii*g)>??	Ar,   c                   V P                  4       '       d   \        R4      h^ RIHp T! \	        V P
                  4       UUu. uF0  p\	        V P                  4       Uu. uF  pWV3,          NK  	  upNK2  	  upp4      # u upi u uppi )a8  
Returns a dense Matrix with elements represented explicitly

Returns an object of type ImmutableDenseMatrix.

Examples
========

>>> from sympy import Identity
>>> I = Identity(3)
>>> I
I
>>> I.as_explicit()
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])

See Also
========
as_mutable: returns mutable Matrix type

z<Matrix with symbolic shape cannot be represented explicitly.ImmutableDenseMatrix)r   r   sympy.matrices.immutabler$  ranger   r   )rI   r$  r   r   s   &   r'   as_explicitMatrixExpr.as_explicitM  s    0 ""$$45 5 	B#%*499%5%7%5 &+499%5&7%5 '+a4jj%5&7%5%7 8 	8 &7 %7s   B
B 1B
 B
c                >    V P                  4       P                  4       # )a#  
Returns a dense, mutable matrix with elements represented explicitly

Examples
========

>>> from sympy import Identity
>>> I = Identity(3)
>>> I
I
>>> I.shape
(3, 3)
>>> I.as_mutable()
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])

See Also
========
as_explicit: returns ImmutableDenseMatrix
)r'  
as_mutablerH   s   &r'   r*  MatrixExpr.as_mutablen  s    . !,,..r,   c                	    Ve   V'       g   \        R4      h^ RIHp V! V P                  \        R7      p\        V P                  4       F-  p\        V P                  4       F  pWV3,          WEV3&   K  	  K/  	  V# )Nz=Cannot implement copy=False when converting Matrix to ndarray)empty)dtype)	TypeErrornumpyr-  rJ   objectr&  r   r   )rI   r.  copyr-  r#   r   r   s   &&&    r'   	__array__MatrixExpr.__array__  sg    D[\\$**F+tyy!A499%!t*Q$ & " r,   c                @    V P                  4       P                  V4      # )z
Test elementwise equality between matrices, potentially of different
types

>>> from sympy import Identity, eye
>>> Identity(3).equals(eye(3))
True
)r'  equalsrc   s   &&r'   r6  MatrixExpr.equals  s     !((//r,   c                	    V # r"   r-   rH   s   &r'   canonicalizeMatrixExpr.canonicalize      r,   c                	8    \         P                  \        V 4      3# r"   )r   r   rT   rH   s   &r'   as_coeff_mmulMatrixExpr.as_coeff_mmul  s    uufTl""r,   c                    ^ RI Hp ^ RIHp . pVe   VP	                  V4       Ve   VP	                  V4       V! WR7      pV! V4      # )a  
Parse expression of matrices with explicitly summed indices into a
matrix expression without indices, if possible.

This transformation expressed in mathematical notation:

`\sum_{j=0}^{N-1} A_{i,j} B_{j,k} \Longrightarrow \mathbf{A}\cdot \mathbf{B}`

Optional parameter ``first_index``: specify which free index to use as
the index starting the expression.

Examples
========

>>> from sympy import MatrixSymbol, MatrixExpr, Sum
>>> from sympy.abc import i, j, k, l, N
>>> A = MatrixSymbol("A", N, N)
>>> B = MatrixSymbol("B", N, N)
>>> expr = Sum(A[i, j]*B[j, k], (j, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
A*B

Transposition is detected:

>>> expr = Sum(A[j, i]*B[j, k], (j, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
A.T*B

Detect the trace:

>>> expr = Sum(A[i, i], (i, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
Trace(A)

More complicated expressions:

>>> expr = Sum(A[i, j]*B[k, j]*A[l, k], (j, 0, N-1), (k, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
A*B.T*A.T
)convert_indexed_to_arrayconvert_array_to_matrix)first_indices)4sympy.tensor.array.expressions.from_indexed_to_arrayr@  3sympy.tensor.array.expressions.from_array_to_matrixrB  append)exprfirst_index
last_index
dimensionsr@  rB  rC  arrs   &&&&    r'   from_index_summationMatrixExpr.from_index_summation  sN    T 	b_"  -!  ,&tI&s++r,   c                	    ^RI Hp V! W4      # )r   )ElementwiseApplyFunction)	applyfuncrO  )rI   r%   rO  s   && r'   rP  MatrixExpr.applyfunc  s    7'33r,   r-   TF)NNN)Wr   
__module____qualname____firstlineno____doc__r2   __annotations__	_iterable_op_priorityr4   r5   r6   
is_Inverseis_Transposeis_ZeroMatrix	is_MatAdd	is_MatMulis_commutative	is_number	is_symbol	is_scalarr   r7   r:   propertyrJ   rO   rU   rZ   r]   r/   NotImplementedr   rd   r`   rl   rj   rs   rv   rp   r{   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r  r  r	  r  r  r   r'  r*  r1  r3  r6  r9  r=  staticmethodrL  rP  __static_attributes____classcell__)r   s   @r'   r1   r1   %   s   $ "$I#
 ILItM4!K!JLMIINIII!|D*#3 " "    2" (:&* ' )* (9%* & )* (:&+ ' )+ (9%+ & )+ (:&* ' )* (:&* ' )* (9%* & )* (9%* & )* (:&* ' )* (9%> & )> (>*+ + )+ (=)$ * )$      ()
!!J:+ 6 6I    $
  I!AFA8B/2 %4 	0# 1, 1,f4 4r,   r1   c                    R # rS  r-   lhsrhss   &&r'   _eval_is_eqrn    s    r,   c                t    V P                   VP                   8w  d   R # W,
          P                  '       d   R# R# )FTN)rJ   r]  rk  s   &&r'   rn  rn    s+    
yyCII	    !r,   c                   a  V 3R  lpV# )c                  < \         \        \        \        /S,          p. p. pV P                   F=  p\        V\        4      '       d   VP                  V4       K,  VP                  V4       K?  	  V'       g   SP                  V4      # V'       d   S\         8X  da   \        \        V4      4       FG  pW5,          P                  '       d   K  W5,          P                  SP                  V4      4      W5&   . p M/	  M,SP                  W!! V!  P                  R R7      .,           4      # V\        8X  d   V! V!  P                  R R7      # V! SP                  V4      .VO5!  P                  R R7      # )F)r   )r	   rT   r
   rN   r<   r   r1   rF  
_from_argsr&  r  r5   rs   rY   )rG  	mat_classnonmatricesmatricestermr   r;   s   &     r'   _postprocessor)get_postprocessor.<locals>._postprocessor  s0   &#v.s3	IID$
++%""4(	  >>+..czs8}-A#;444 '/k&9&9#..:U&V&( . ~~kY5I5N5NTY5N5Z4[&[\\h',,%,884@x@EE5EQQr,   r-   )r;   rw  s   f r'   get_postprocessorry    s    "RF r,   r	   r
   c                    \        V \        4      '       g   \        V\        4      '       d   R pV'       d   \        W4      # ^ RIHp ^ RIHp ^ RIHp V! V 4      pV! Wa4      pV! V4      pV# )T)convert_matrix_to_array)array_deriverA  )	r   r    _matrix_derivative_old_algorithm3sympy.tensor.array.expressions.from_matrix_to_arrayr{  4sympy.tensor.array.expressions.arrayexpr_derivativesr|  rE  rB  )	rG  r   old_algorithmr{  r|  rB  
array_exprdiff_array_exprdiff_matrix_exprs	   &&&      r'   _matrix_derivativer    s\    $
##z!Z'@'@/88[Q[(.J":1O.?r,   c           
       a ^ RI Hp V P                  V4      pV Uu. uF  qDP                  4       NK  	  pp^ RIHp V UUu. uF  qD Uu. uF
  qv! V4      NK  	  upNK  	  pppR oV3R lpV Uu. uF
  qH! V4      NK  	  p	pV	^ ,          p
R pV
^8:  d,   \        P                  ! V Uu. uF
  qK! V4      NK  	  up4      # V! W4      # u upi u upi u uppi u upi u upi )r   )ArrayDerivativerA  c                J    \        V \        4      '       d   V P                  # R# )r   r   r   r   r1   rJ   elems   &r'   
_get_shape4_matrix_derivative_old_algorithm.<locals>._get_shape0  s    dJ''::r,   c                .   < \        V3R  lV  4       4      # )c              3  J   <"   T F  pS! V4       F	  q"R9  x  K  	  K  	  R# 5i)r   Nr   Nr-   ).0r   r   r  s   &  r'   	<genexpr>E_matrix_derivative_old_algorithm.<locals>.get_rank.<locals>.<genexpr>6  s!     Lu!jmI%m%us    #)sum)partsr  s   &r'   get_rank2_matrix_derivative_old_algorithm.<locals>.get_rank5  s    LuLLLr,   c                   \        V 4      ^8X  d
   V ^ ,          # V R,          w  rVP                  '       d   VP                  pV\        ^4      8X  d   TpMV\        ^4      8X  d   TpMW,          p\        V 4      ^8X  d   V# VP                  '       d   \	        R4      hV\
        P                  ! V R,          4      ,          # )r   :Nr@   N :r@   NN)r  r4   r   Identityr   r	   fromiter)r  p1p2pbases   &   r'   contract_one_dims;_matrix_derivative_old_algorithm.<locals>.contract_one_dims;  s    u:?8O2YFB|||TTXa[ x{"5zQ???$R.(S\\%)444r,   )$sympy.tensor.array.array_derivativesr  _eval_derivative_matrix_linesbuildrE  rB  r
   r  )rG  r   r  linesr   r  rB  r   r  ranksrankr  r  s   &&          @r'   r}  r}  &  s    D..q1E %&1WWYE&[>CDe!4!Q%a(!4eED
M #((%QXa[%E(8D5( qy||5A5a.q15ABB4##Q ' 5D )0 Bs)   C	C
CC1C*CCc                      ] tR tRt]! R 4      t]! R 4      t]! R 4      tRtRt	Rt
R t]R 4       tR t]R	 4       tR
 tRtR# )MatrixElementiU  c                	(    V P                   ^ ,          # r   r<   rH   s   &r'   <lambda>MatrixElement.<lambda>V  s    499Q<r,   c                	(    V P                   ^,          # r   r  rH   s   &r'   r  r  W      diilr,   c                	(    V P                   ^,          # r   r  rH   s   &r'   r  r  X  r  r,   Tc                	   \        \        W#34      w  r#\        V\        4      '       d   \	        V4      pM\        V\
        4      '       d;   VP                  '       d   VP                  '       d   WV3,          # \        V4      pM6\        V4      p\        VP                  \        4      '       g   \        R 4      h\        VRR 4      ! W#4      '       g   \        R4      h\        P                  ! WW#4      pV# )z2First argument of MatrixElement should be a matrixr  c                    R # rR  r-   )r   ms   &&r'   r  'MatrixElement.__new__.<locals>.<lambda>j  s    Tr,   zindices out of range)r9   r   r   strr   r   
is_Integerr7   r   r/  getattrr  r   r:   r;   namer   r  objs   &&&& r'   r:   MatrixElement.__new__]  s    8aV$dC  $<D$
++<<<ALLL1:%~~!$))Z88#$XYY40AB1HH !788ll3a+
r,   c                	(    V P                   ^ ,          # r   r  rH   s   &r'   symbolMatrixElement.symbolo  s    yy|r,   c                	    VP                  R R4      pV'       d,   V P                   Uu. uF  q3P                  ! R/ VB NK  	  ppMV P                  pV^ ,          V^,          V^,          3,          # u upi )r   Tr-   )getr<   rY   )rI   r   r   r.   r<   s   &,   r'   rY   MatrixElement.doits  sc    yy&15;#HH%u%D;D99DAwtAwQ'(( <s   A2c                	(    V P                   R ,          # )r   NNr  rH   s   &r'   indicesMatrixElement.indices{  s    yy}r,   c                	   \        V\        4      '       g9   V P                  P                  V4      V P                  V P
                  3,          # V P                  ^ ,          pV P                  P                  w  r4W!P                  ^ ,          8X  dv   \        V P                  ^,          VP                  ^,          ^ V^,
          34      \        V P                  ^,          VP                  ^,          ^ V^,
          34      ,          # \        V\        4      '       d   ^ RI
Hp V P                  R,          w  rg\        R\        R7      w  rVP                  ^ ,          p
V
P                  w  rV! W&V3,          WV	3,          P                  V4      ,          W)V3,          ,          V^ V^,
          3V	^ V^,
          34      ) # V P                  VP                  ^ ,          4      '       d   R# \        P                   # )r   )Sumr  zz1, z2)r;   N)r   r  parentdiffr   r   r<   rJ   r   r   sympy.concrete.summationsr  r   r   r   r   Zero)rI   vMr  r   r  r   r   i1i2Yr1r2s   &&           r'   r   MatrixElement._eval_derivative  sm   !]++;;##A&tvvtvv~66IIaL{{  q	>!$))A,q	Aqs8D!$))A,q	Aqs8DE E a!!599R=DAX51FBq	AWWFBR%r6!221U8;b!RT]RQRTVWXTXMZZZ88AFF1Ivvr,   r-   N)r   rT  rU  rV  rd  r  r   r   	_diff_wrtrb  r`  r:   r  rY   r  r   rh  r-   r,   r'   r  r  U  si    /0F*+A*+AIIN$  )  r,   r  c                  t    ] tR tRtRtRtRtRtR t]	R 4       t
]	R 4       tR t]	R	 4       tR
 tR tR tRtR# )MatrixSymboli  av  Symbolic representation of a Matrix object

Creates a SymPy Symbol to represent a Matrix. This matrix has a shape and
can be included in Matrix Expressions

Examples
========

>>> from sympy import MatrixSymbol, Identity
>>> A = MatrixSymbol('A', 3, 4) # A 3 by 4 Matrix
>>> B = MatrixSymbol('B', 4, 3) # A 4 by 3 Matrix
>>> A.shape
(3, 4)
>>> 2*A*B + Identity(3)
I + 2*A*B
FTc                	    \        V4      \        V4      r2V P                  V4       V P                  V4       \        V\        4      '       d   \	        V4      p\
        P                  ! WW#4      pV# r"   )r   r   r   r  r   r   r:   r  s   &&&& r'   r:   MatrixSymbol.__new__  sT    {HQK1qqdC  t9DmmCq,
r,   c                	N    V P                   ^,          V P                   ^,          3# r   r  rH   s   &r'   rJ   MatrixSymbol.shape  s    yy|TYYq\))r,   c                	<    V P                   ^ ,          P                  # r   )r<   r  rH   s   &r'   r  MatrixSymbol.name  s    yy|   r,   c                	    \        WV4      # r"   )r  r   s   &&&,r'   r   MatrixSymbol._entry  s    Ta((r,   c                	    V 0# r"   r-   rH   s   &r'   free_symbolsMatrixSymbol.free_symbols  s	    vr,   c                	    V # r"   r-   )rI   r=   s   &,r'   r   MatrixSymbol._eval_simplify  r;  r,   c                	^    \        V P                  ^ ,          V P                  ^,          4      # r   )r   rJ   )rI   r   s   &&r'   r   MatrixSymbol._eval_derivative  s    $**Q-A77r,   c                	   W8w  d   V P                   ^ ,          ^8w  d/   \        VP                   ^ ,          V P                   ^ ,          4      M\        P                  pV P                   ^,          ^8w  d/   \        VP                   ^,          V P                   ^,          4      M\        P                  p\	        W#.4      .# V P                   ^ ,          ^8w  d   \        V P                   ^ ,          4      M\        P                  pV P                   ^,          ^8w  d   \        V P                   ^,          4      M\        P                  p\	        W#.4      .# r   )rJ   r   r   r  _LeftRightArgsr  r   )rI   r   firstseconds   &&  r'   r  *MatrixSymbol._eval_derivative_matrix_lines  s    9=AZZ]a=OJqwwqz4::a=9UVU[U[E>Bjjmq>PZ
DJJqM:VWV\V\F"   04zz!}/AHTZZ]+quuE04

10BXdjjm,F"  r,   r-   N)r   rT  rU  rV  rW  r`  rb  r  r:   rd  rJ   r  r   r  r   r   r  rh  r-   r,   r'   r  r    sm      NII	 * * ! !)  8r,   r  c                j    V P                    Uu. uF  qP                  '       g   K  VNK  	  up# u upi r"   )r  r4   )rG  syms   & r'   matrix_symbolsr    s(    ,,>,CCC,>>>s   00c                      ] tR tRtRt]P                  3R lt]R 4       t	]	P                  R 4       t	]R 4       t]P                  R 4       tR tR	 t]R
 4       tR tR tR tR tR tR tRtR# )r  i  aq  
Helper class to compute matrix derivatives.

The logic: when an expression is derived by a matrix `X_{mn}`, two lines of
matrix multiplications are created: the one contracted to `m` (first line),
and the one contracted to `n` (second line).

Transposition flips the side by which new matrices are connected to the
lines.

The trace connects the end of the two lines.
c                	    \        V4      V n        V P                  V n        ^ V n        ^ V n        V P                  V n        ^V n        ^V n        W n        R# )r   N)	list_lines_first_pointer_parent_first_pointer_index_first_line_index_second_pointer_parent_second_pointer_index_second_line_indexhigher)rI   r  r  s   &&&r'   __init___LeftRightArgs.__init__  sJ    5k%)[["$%!!"&*kk#%&""#r,   c                	<    V P                   V P                  ,          # r"   r  r  rH   s   &r'   first_pointer_LeftRightArgs.first_pointer  s    ))$*C*CDDr,   c                	6    WP                   V P                  &   R # r"   r  rI   values   &&r'   r  r    s    @E""4#<#<=r,   c                	<    V P                   V P                  ,          # r"   r  r  rH   s   &r'   second_pointer_LeftRightArgs.second_pointer  s    **4+E+EFFr,   c                	6    WP                   V P                  &   R # r"   r  r  s   &&r'   r  r    s    BG##D$>$>?r,   c                	    V P                    Uu. uF  qP                  V4      NK  	  ppR V: RV P                  : R2# u upi )z_LeftRightArgs(lines=z	, higher=r  )r  _buildr  )rI   r   builts   &  r'   __repr___LeftRightArgs.__repr__  s;    )-5AQ5KK
 	
 6s   ?c                	    V P                   V P                  uV n        V n         V P                  V P                  uV n        V n        V P                  V P
                  uV n        V n        V # r"   )r  r  r  r  r  r  rH   s   &r'   r   _LeftRightArgs.transpose  sd    BFB]B]_c_y_y?"D$?@D@Z@Z\`\u\u=!4#=:>:Q:QSWSiSi7 7r,   c                	(   \        V \        4      '       d   V P                  4       # \        V \        4      '       dQ   \	        V 4      ^8X  d
   V ^ ,          # V ^ ,          ! V ^,           Uu. uF  p\
        P                  V4      NK  	  up!  # V # u upi r   )r   r   r  r  r  r  r  )rG  r   s   & r'   r  _LeftRightArgs._build  st    dK((::<dD!!4yA~AwAw47 K7a!6!6q!97 KLLK !Ls   *Bc                	    V P                    Uu. uF  qP                  V4      NK  	  ppV P                  ^8w  d#   W P                  V P                  4      .,          p\        V4      pV# u upi r   )r  r  r  r  )rI   r   datas   &  r'   r  _LeftRightArgs.build$  sW    (,41A4;;![[-..DDz	 5s   A*c                	j   V P                   ^8w  d   V P                  ^8w  d   \        R4      hR pV! V P                   4      ^,          V! V P                  4      ^,          8w  d   V! V P                  4      R8X  d%   V P                   V P                  R,          ,          # V! V P                   4      R8X  d/   V P                   R,          V P                  P                  ,          # \        R4      hV P                   ^8w  d(   V P                   V P                  P                  ,          # V P                  # )r   z.higher dimensional array cannot be representedc                J    \        V \        4      '       d   V P                  # R# )N)NNr  r  s   &r'   r  ._LeftRightArgs.matrix_form.<locals>._get_shape/  s    $
++zz!r,   zincompatible shapesr  )r   r   )r  r  r   r  r   )rI   r  s   & r'   matrix_form_LeftRightArgs.matrix_form+  s    ::?t{{a/MNN	 
 djj!!$
4;;(?(BB $++&&0zz$++d"333$**%/zz$'55233::?::dkkmm++;;r,   c                6   ^ pV P                   ^8w  d.   V\        R V P                   P                   4       4      ,          pV P                  ^8w  d.   V\        R V P                  P                   4       4      ,          pV P                  ^8w  d
   V^,          pV# )zT
Number of dimensions different from trivial (warning: not related to
matrix rank).
c              3  *   "   T F	  q^8g  x  K  	  R# 5ir  r-   r  r   s   & r'   r  &_LeftRightArgs.rank.<locals>.<genexpr>H  s     9(81Q(8   c              3  *   "   T F	  q^8g  x  K  	  R# 5ir  r-   r  s   & r'   r  r  J  s     :(91Q(9r  )r  r  rJ   r  r  )rI   r  s   & r'   r  _LeftRightArgs.rankA  sx    
 ::?C9

(8(8999D;;!C:(9(9:::D;;!AIDr,   c                	j    ^RI Hp ^RI Hp \        V\        VVV.4      R.VP                  R7      pV# )   )ArrayTensorProduct)ArrayContraction)	validator)r   r@   )*tensor.array.expressions.array_expressionsr   r!  r   	_validate)rI   pointerr_   r   r!  subexprs   &&&   r'   _multiply_pointer _LeftRightArgs._multiply_pointerO  sG    TR& 	 '00
 r,   c                	8    V ;P                   V,          un         R # r"   )r  rc   s   &&r'   append_first_LeftRightArgs.append_firstd  s    e#r,   c                	8    V ;P                   V,          un         R # r"   )r  rc   s   &&r'   append_second_LeftRightArgs.append_secondg  s    u$r,   )r  r  r  r  r  r  r  r  N)r   rT  rU  rV  rW  r   r   r  rd  r  setterr  r	  r   rg  r  r  r  r  r'  r*  r-  rh  r-   r,   r'   r  r    s     &'UU  E E F F G G H H
 	 	,*$%r,   r  c                R    ^ RI Hp \        V \        4      '       d   V # V! V ..4      # )r   r#  )r%  r$  r   r1   )r   r$  s   & r'   _make_matrixr1  k  s&    =!Z  !&&r,   rS   rM   r   r   r   )r   r  r   r"   rS  )G
__future__r   	functoolsr   
sympy.corer   r   r   r	   r
   sympy.core.assumptionsr   sympy.core.decoratorsr   sympy.core.exprr   r   sympy.core.logicr   sympy.core.symbolr   r   r   r   sympy.core.sympifyr   r   sympy.external.gmpyr   sympy.functionsr   r   (sympy.functions.special.tensor_functionsr   sympy.matrices.exceptionsr   sympy.matrices.kindr   sympy.matrices.matrixbaser   sympy.multipledispatchr   sympy.utilities.miscr   r/   r1   rn  ry  "_constructor_postprocessor_mappingr  r}  r  r  r  r  r1  matmulrT   mataddrN   matpowr   r   r   r   r   specialr   r  determinantr   r-   r,   r'   <module>rI     s   "  2 2 4 7 - & 9 9 5 * . C : * 0 + + s4 s4l 
*d  
*j! "$P 
c"#	c"#8 ( ( 4&,$^BD BJB: BJ?E% E%P'       ) $r,   