
    \h<                        S SK JrJr  S SKJr  S SKJrJrJr  S SK	J
r
Jr  S SKJrJr  S SKJr  S SKJr  S SKJrJrJrJrJrJrJr  S S	KJr  S S
KJr  S SKJ r   S SK!J"r#  SSK$J%r%  SSK&J'r'  SSK(J)r)  SSK*J*r*  SSK+J,r,  SSK-J.r.J/r/J0r0J1r1   " S S\'\5      r2\
Rf                  " \\24\25        S r4S r5S r6S r7S r8S r9S r:S r;S r<\<\5\7\;\9\\" S 5      \6\8\\:4r=\" \" \2\" \=6 05      5      r>S  r?S! r@\@\S'   g")#    )askQ)handlers_dict)BasicsympifyS)mulMul)NumberIntegerDummy)adjoint)rm_idunpacktypedflattenexhaustdo_onenew)NonInvertibleMatrixError)
MatrixBase)sympy_deprecation_warning)validate_matmul_integer   )Inverse)
MatrixExpr)MatPow)	transpose)PermutationMatrix)
ZeroMatrixIdentityGenericIdentity	OneMatrixc                      ^  \ rS rSrSrSr\" 5       rSSSS.S jr\	S 5       r
\S	 5       rSS
 jrS rS rU 4S jrS rS rS rS rS rS rSS jrS rSrU =r$ )MatMul   z
A product of matrix expressions

Examples
========

>>> from sympy import MatMul, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 4)
>>> B = MatrixSymbol('B', 4, 3)
>>> C = MatrixSymbol('C', 3, 6)
>>> MatMul(A, B, C)
A*B*C
TFN)evaluatecheck_sympifyc                j  ^  U(       d  T R                   $ [        [        U 4S jU5      5      nU(       a  [        [        [        U5      5      n[
        R                  " T /UQ76 nUR                  5       u  pgUb  [        SSSS9  USLa  [        U6   U(       d  U$ U(       a  T R                  U5      $ U$ )Nc                 "   > TR                   U :g  $ N)identity)iclss    Y/var/www/auris/envauris/lib/python3.13/site-packages/sympy/matrices/expressions/matmul.py<lambda> MatMul.__new__.<locals>.<lambda>0   s    S\\Q%6    zaPassing check to MatMul is deprecated and the check argument will be removed in a future version.z1.11z,remove-check-argument-from-matrix-operations)deprecated_since_versionactive_deprecations_targetF)r.   listfiltermapr   r   __new__as_coeff_matricesr   validate	_evaluate)r0   r(   r)   r*   argsobjfactormatricess   `       r1   r:   MatMul.__new__*   s    << F6=>GT*+DmmC'$'002%s)/+Y[
 h M==%%
r4   c                     [        U5      $ r-   )canonicalize)r0   exprs     r1   r=   MatMul._evaluateJ   s    D!!r4   c                     U R                    Vs/ s H  oR                  (       d  M  UPM     nnUS   R                  US   R                  4$ s  snf )Nr   )r>   	is_Matrixrowscols)selfargrA   s      r1   shapeMatMul.shapeN   sB    #'99>9CC9>  (2,"3"344 ?s
   AAc                 2  ^ SSK Jn  SSKJm  U R	                  5       u  pg[        U5      S:X  a  XgS   X4   -  $ S /[        U5      S-   -  nS /[        U5      S-
  -  n	XS'   X(S'   S n
UR                  SU
" 5       5      n[        S[        U5      5       H  n[        U5      X'   M     [        US S 5       H  u  pUR                  S   S-
  X'   M     [        U5       VVs/ s H  u  pUR                  X   XS-      US9PM     nnn[        R                  " U5      n[        U4S	 jU 5       5      (       a  S
nXe" U/[        USS S/[        U	5      -  U	5      Q76 -  n[        S U	 5       5      (       d  SnU(       a  UR!                  5       $ U$ s  snnf )Nr   )Sum)ImmutableMatrixr   rH   c               3   >   #    Sn  [        SU -  5      v   U S-  n M  7f)Nr   zi_%ir   )counters    r1   fMatMul._entry.<locals>.fb   s+     GFW,--1 s   dummy_generator)rW   c              3   D   >#    U  H  oR                  T5      v   M     g 7fr-   )has).0vrR   s     r1   	<genexpr> MatMul._entry.<locals>.<genexpr>q   s     8x!uu_%%xs    Tc              3   N   #    U  H  n[        U[        [        45      v   M     g 7fr-   )
isinstancer   int)rZ   r[   s     r1   r\   r]   y   s     E*Q:a'300*s   #%F)sympy.concrete.summationsrQ   sympy.matrices.immutablerR   r;   lengetrangenext	enumeraterN   _entryr
   fromiteranyzipdoit)rL   r/   jexpandkwargsrQ   coeffrA   indices
ind_rangesrU   rW   rM   expr_in_sumresultrR   s                  @r1   rh   MatMul._entryS   s   1<002x=AA;qt,,,&#h-!+,VS]Q./

	 !**%6<q#h-(Ao.GJ )  ".FAIIaL1,JM /hqrzh{|h{^d^_CJJwz7Q3<JYh{|ll8,8x888FsWQr]QCJ$7D  E*EEEF &v{{}2F2 }s   "$Fc                    U R                    Vs/ s H  oR                  (       a  M  UPM     nnU R                    Vs/ s H  oR                  (       d  M  UPM     nn[        U6 nUR                  SL a  [	        S5      eXC4$ s  snf s  snf )NFz3noncommutative scalars in MatMul are not supported.)r>   rI   r
   is_commutativeNotImplementedError)rL   xscalarsrA   rp   s        r1   r;   MatMul.as_coeff_matrices}   sm    "ii;i{{1i;#yy8y!KKAy8W5(%&[\\ <8s   BBBBc                 :    U R                  5       u  pU[        U6 4$ r-   )r;   r&   )rL   rp   rA   s      r1   as_coeff_mmulMatMul.as_coeff_mmul   s"    002fh'''r4   c                 N   > [         [        U ]
  " S0 UD6nU R                  U5      $ N )superr&   rn   r=   )rL   ro   expanded	__class__s      r1   rn   MatMul.expand   s&    -77~~h''r4   c           	          U R                  5       u  p[        U/USSS2    Vs/ s H  n[        U5      PM     snQ76 R                  5       $ s  snf )aP  Transposition of matrix multiplication.

Notes
=====

The following rules are applied.

Transposition for matrix multiplied with another matrix:
`\left(A B\right)^{T} = B^{T} A^{T}`

Transposition for matrix multiplied with scalar:
`\left(c A\right)^{T} = c A^{T}`

References
==========

.. [1] https://en.wikipedia.org/wiki/Transpose
NrH   )r;   r&   r   rl   )rL   rp   rA   rM   s       r1   _eval_transposeMatMul._eval_transpose   sT    & 002@/7"~>~Ys^~>@@D	G>s   A
c                     [        U R                  S S S2    Vs/ s H  n[        U5      PM     sn6 R                  5       $ s  snf )NrH   )r&   r>   r   rl   )rL   rM   s     r1   _eval_adjointMatMul._eval_adjoint   s8    		$B$@@AFFHH@s   Ac                 p    U R                  5       u  pUS:w  a  SSKJn  X" UR                  5       5      -  $ g )Nr   )trace)r}   r   rl   )rL   r@   mmulr   s       r1   _eval_traceMatMul._eval_trace   s7    ))+Q;$E$))+... r4   c           	          SSK Jn  U R                  5       u  p#[        U6 nX R                  -  [        [        [        X5      5      6 -  $ )Nr   )Determinant)&sympy.matrices.expressions.determinantr   r;   only_squaresrJ   r
   r7   r9   )rL   r   r@   rA   square_matricess        r1   _eval_determinantMatMul._eval_determinant   sA    F113&1yy 3S-N(O#PPPr4   c                     [        S U R                   5       5      (       a-  [        S U R                  S S S2    5       6 R                  5       $ [	        U 5      $ )Nc              3   h   #    U  H(  n[        U[        5      (       d  M  UR                  v   M*     g 7fr-   )r_   r   	is_squarerZ   rM   s     r1   r\   'MatMul._eval_inverse.<locals>.<genexpr>   s     Q	ZZ5P}s}}	s   22c              3   v   #    U  H/  n[        U[        5      (       a  UR                  5       OUS -  v   M1     g7f)rH   N)r_   r   inverser   s     r1   r\   r      s2      . ",C!<!<#r'I.s   79rH   )allr>   r&   rl   r   )rL   s    r1   _eval_inverseMatMul._eval_inverse   sR    Q		QQQ #yy2  df	
 t}r4   c                    ^ TR                  SS5      nU(       a   [        U4S jU R                   5       5      nOU R                  n[        [	        U6 5      nU$ )NdeepTc              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr   )rl   )rZ   rM   hintss     r1   r\   MatMul.doit.<locals>.<genexpr>   s     @is*E*is   !)rd   tupler>   rD   r&   )rL   r   r   r>   rE   s    `   r1   rl   MatMul.doit   sH    yy&@dii@@D99D FDM*r4   c           	         U R                    Vs/ s H  oDR                  (       d  M  UPM     nnU R                    Vs/ s H  oDR                  (       a  M  UPM     nnU(       a|  [        U5      n[        U5      nU(       a_  U(       aX  [        U5      U:w  aI  [	        SU Vs/ s H/  n[        U R                   5      R                  U5      S:  d  M-  UPM1     sn-  5      eXV/$ s  snf s  snf s  snf )Nz"repeated commutative arguments: %sr   )r>   rw   rc   set
ValueErrorr7   count)	rL   csetwarnro   ry   coeff_ccoeff_ncclencis	            r1   args_cncMatMul.args_cnc   s    "ii<i+;+;1i<#yyAy!0@0@AyAw<D'lGW!5 !E/6!Xw$tyy/:O:OPR:SVW:W"w!X"Y Z Z"" =A "Ys!   C#C#C(C(!,C-
C-
c           	         SSK Jn  [        U R                  5       VVs/ s H  u  p4UR	                  U5      (       d  M  UPM!     nnn/ nU GH)  nU R                  S U nU R                  US-   S  n	U	(       a  [
        R                  U	5      n
O[        U R                  S   5      n
U(       aV  [
        R                  [        U5       Vs/ s H+  o3R                  (       a  U" U5      R                  5       OUPM-     sn5      nO[        U R                  S   5      nU R                  U   R                  U5      nU H6  nUR                  U5        UR                  U
5        UR                  U5        M8     GM,     U$ s  snnf s  snf )Nr   )	Transposer   )r   r   rg   r>   rY   r&   ri   r"   rN   reversedrI   rl   _eval_derivative_matrix_linesappend_firstappend_secondappend)rL   ry   r   r/   rM   
with_x_indlinesind	left_args
right_args	right_matleft_revds                r1   r   $MatMul._eval_derivative_matrix_lines   s0   (&/		&:I&:FAcggaja&:
IC		$3I3q56*J"OOJ7	$TZZ]3	!??_ghq_r+s_rZ[;;IaL,=,=,?TU,U_r+st#DJJqM2		#<<Q?Ax(	*Q  & + J ,ts   E<E<	2F
r   )T)FT)__name__
__module____qualname____firstlineno____doc__	is_MatMulr#   r.   r:   classmethodr=   propertyrN   rh   r;   r}   rn   r   r   r   r   r   rl   r   r   __static_attributes____classcell__)r   s   @r1   r&   r&      s     I H%*$ @ " " 5 5(3T((G.I/Q		# r4   r&   c                  >    U S   S:X  a  U SS  n [        [        /U Q76 $ )Nr   r   )r   r&   )r>   s    r1   newmulr      s(    Aw!|ABxvr4   c                     [        S U R                   5       5      (       aT  U R                   Vs/ s H  oR                  (       d  M  UPM     nn[        US   R                  US   R
                  5      $ U $ s  snf )Nc              3      #    U  H7  nUR                   =(       d    UR                  =(       a    UR                  v   M9     g 7fr-   )is_zerorI   is_ZeroMatrixr   s     r1   r\   any_zeros.<locals>.<genexpr>   s2      ,"*3 ;;?3==>S->->?"*s   ?Ar   rH   )rj   r>   rI   r!   rJ   rK   )r	   rM   rA   s      r1   	any_zerosr      sg    
 ,"%((, , ,#&88=8C}}C8=(1+**HRL,=,=>>J >s   A8A8c                 f   [        S U R                   5       5      (       d  U $ / nU R                  S   nU R                  SS  HR  n[        U[        [        45      (       a!  [        U[        [        45      (       a  X#-  nM?  UR                  U5        UnMT     UR                  U5        [        U6 $ )a7  Merge explicit MatrixBase arguments

>>> from sympy import MatrixSymbol, Matrix, MatMul, pprint
>>> from sympy.matrices.expressions.matmul import merge_explicit
>>> A = MatrixSymbol('A', 2, 2)
>>> B = Matrix([[1, 1], [1, 1]])
>>> C = Matrix([[1, 2], [3, 4]])
>>> X = MatMul(A, B, C)
>>> pprint(X)
  [1  1] [1  2]
A*[    ]*[    ]
  [1  1] [3  4]
>>> pprint(merge_explicit(X))
  [4  6]
A*[    ]
  [4  6]

>>> X = MatMul(B, A, C)
>>> pprint(X)
[1  1]   [1  2]
[    ]*A*[    ]
[1  1]   [3  4]
>>> pprint(merge_explicit(X))
[1  1]   [1  2]
[    ]*A*[    ]
[1  1]   [3  4]
c              3   B   #    U  H  n[        U[        5      v   M     g 7fr-   )r_   r   r   s     r1   r\   !merge_explicit.<locals>.<genexpr>  s     Bksz#z**ks   r   r   N)rj   r>   r_   r   r   r   r&   )matmulnewargslastrM   s       r1   merge_explicitr      s    8 BfkkBBBG;;q>D{{12cJ/00ZzSYFZ5[5[:DNN4 D  NN47r4   c                     U R                   " 5       u  p[        S 5      " U5      nX2:w  a  [        U/UR                  Q76 $ U $ )zRemove Identities from a MatMul

This is a modified version of sympy.strategies.rm_id.
This is necessary because MatMul may contain both MatrixExprs and Exprs
as args.

See Also
========

sympy.strategies.rm_id
c                     U R                   SL $ )NT)is_Identityry   s    r1   r2   remove_ids.<locals>.<lambda>6  s    Q]]d2r4   )r}   r   r   r>   )r	   r@   r   rt   s       r1   
remove_idsr   '  sB     $$&LF23D9F~f+v{{++
r4   c                 P    U R                   " 5       u  pUS:w  a  [        U/UQ76 $ U $ Nr   )r;   r   )r	   r@   rA   s      r1   factor_in_frontr   <  s/    ,,.F{f(x((Jr4   c                 b   U R                   " 5       u  pUS   /n[        S[        U5      5       GH_  nUS   nX$   n[        U[        5      (       at  [        UR
                  [        5      (       aU  UR
                  R                  n[        U5      n[        U5      X8* S :X  a"  USU*  [        UR                  S   5      /-   nM  [        U[        5      (       a  [        UR
                  [        5      (       al  UR
                  R                  n	[        U	5      n[        U	5      X$XH-    :X  a8  [        UR                  S   5      n
XS'   [        XDU-   5       H  nXU'   M	     GM6  UR                  S:X  d  UR                  S:X  a  UR                  U5        GMj  [        U[        5      (       a  UR                  u  pOU[        R                  p[        U[        5      (       a  UR                  u  pOU[        R                  pX:X  a#  X-   n[        UU5      R!                  SS9US'   GM  [        U["        5      (       d=   UR%                  5       nUb)  UU:X  a#  X-
  n[        UU5      R!                  SS9US'   GMN  UR                  U5        GMb     [)        U/UQ76 $ ! [&         a    Sn N\f = f)zCombine consecutive powers with the same base into one, e.g.
$$A \times A^2 \Rightarrow A^3$$

This also cancels out the possible matrix inverses using the
knowledgebase of :class:`~.Inverse`, e.g.,
$$ Y \times X \times X^{-1} \Rightarrow Y $$
r   r   rH   NF)r   )r;   re   rc   r_   r   rM   r&   r>   r7   r"   rN   r   r   r   r   Onerl   r   r   r   r   )r	   r@   r>   new_argsr/   ABBargslAargsr.   rm   A_baseA_expB_baseB_expnew_exp
B_base_invs                     r1   combine_powersr   B  sQ    ((*LFQyH1c$i RLGa!!j&?&?EEJJEE
AE{hrsm+#CaR=HQWWQZ,@+AAa!!j&?&?EEJJEE
AE{dQSk)#AGGAJ/'qA#A&G ';;%1;;%#7OOAa  FFMFEquuEa  FFMFEquuEmG!&'277U7CHRLFJ//"#^^-
 %&J*>-%fg6;;;Ga !d &$8$$ , "!
"s   JJ.-J.c                 j   U R                   n[        U5      nUS:  a  U $ US   /n[        SU5       Hw  nUS   nX   n[        U[        5      (       aE  [        U[        5      (       a0  UR                   S   nUR                   S   n[	        Xx-  5      US'   Mf  UR                  U5        My     [        U6 $ )zGRefine products of permutation matrices as the products of cycles.
       r   r   rH   )r>   rc   re   r_   r    r   r&   )	r	   r>   r   rt   r/   r   r   cycle_1cycle_2s	            r1   combine_permutationsr     s     88DD	A1u
1gYF1a[2JGa*++q+,,ffQiGffQiG*7+<=F2JMM!  6?r4   c                    U R                   " 5       u  pUS   /nUSS  H  nUS   n[        U[        5      (       a  [        U[        5      (       d  UR                  U5        ME  UR	                  5         UR                  [        UR
                  S   UR
                  S   5      5        XR
                  S   -  nM     [        U/UQ76 $ )z^
Combine products of OneMatrix

e.g. OneMatrix(2, 3) * OneMatrix(3, 4) -> 3 * OneMatrix(2, 4)
r   r   NrH   )r;   r_   r$   r   poprN   r   )r	   r@   r>   r   r   r   s         r1   combine_one_matricesr     s     ((*LFQyH!"XRL!Y''z!Y/G/GOOA	!''!*aggaj9:''!*  &$8$$r4   c           
         U R                   n[        U5      S:X  a  SSKJn  US   R                  (       aQ  US   R
                  (       a=  U" US   R                    Vs/ s H  n[        X1S   5      R                  5       PM!     sn6 $ US   R                  (       aR  US   R
                  (       a>  U" US   R                    Vs/ s H   n[        US   U5      R                  5       PM"     sn6 $ U $ s  snf s  snf )zb
Simplify MatMul expressions but distributing
rational term to MatMul.

e.g. 2*(A+B) -> 2*A + 2*B
r   r   )MatAddr   )r>   rc   mataddr   	is_MatAddis_Rationalr&   rl   )r	   r>   r   mats       r1   distribute_monomr    s     88D
4yA~"7a!4!447<<P<CF3Q0557<PQQ7a!4!447<<P<CF47C0557<PQQJ QPs   &C/'C4c                     U S:H  $ r   r   r   s    r1   r2   r2     s    klpqkqr4   c            	      &   U S   R                   U S   R                  :w  a  [        S5      e/ nSn[        U 5       HR  u  p4UR                  X   R                   :X  d  M#  UR	                  [        XUS-    6 R                  5       5        US-   nMT     U$ )z'factor matrices only if they are squarer   rH   z!Invalid matrices being multipliedr   )rJ   rK   RuntimeErrorrg   r   r&   rl   )rA   outstartr/   Ms        r1   r   r     s    {8B<,,,>??
CE(#66X_)))JJvxac2388:;aCE $ Jr4   c                 T   / n/ nU R                    H8  nUR                  (       a  UR                  U5        M'  UR                  U5        M:     US   nUSS  H  nXeR                  :X  a?  [	        [
        R                  " U5      U5      (       a  [        UR                  S   5      nMQ  XeR                  5       :X  a?  [	        [
        R                  " U5      U5      (       a  [        UR                  S   5      nM  UR                  U5        UnM     UR                  U5        [        U6 $ )z
>>> from sympy import MatrixSymbol, Q, assuming, refine
>>> X = MatrixSymbol('X', 2, 2)
>>> expr = X * X.T
>>> print(expr)
X*X.T
>>> with assuming(Q.orthogonal(X)):
...     print(refine(expr))
I
r   r   N)r>   rI   r   Tr   r   
orthogonalr"   rN   	conjugateunitaryr&   )rE   assumptionsr   exprargsr>   r   rM   s          r1   refine_MatMulr    s     GH		>>OOD!NN4 	  A;D|&&=Sc!2K@@CIIaL)DNN$$QYYs^[)I)ICIIaL)DNN4 D  NN47r4   N)Asympy.assumptions.askr   r   sympy.assumptions.refiner   
sympy.corer   r   r   sympy.core.mulr	   r
   sympy.core.numbersr   r   sympy.core.symbolr   sympy.functionsr   sympy.strategiesr   r   r   r   r   r   r   sympy.matrices.exceptionsr   sympy.matrices.matrixbaser   sympy.utilities.exceptionsr   !sympy.matrices.expressions._shaper   r<   r   r   matexprr   matpowr   r   permutationr    specialr!   r"   r#   r$   r&   register_handlerclassr   r   r   r   r   r   r   r   r  rulesrD   r   r  r   r4   r1   <module>r%     s    ( 2 ( ( # . # #   > 0 @ Q      * E ESZ Sj   3- 0
(T*=%~,%(" i-A>SY[`aq[rOW.B	D uffen567
D (h r4   