K i< ddlmZmZddlmZddlmZmZmZddl m Z m Z ddl m Z mZddlmZddlmZddlmZmZmZmZmZmZmZdd lmZdd lmZdd lm Z dd l!m"Z#d dl$m%Z%d dl&m'Z'd dl(m)Z)d dl*m*Z*d dl+m,Z,d dl-m.Z.m/Z/m0Z0m1Z1Gdde'e Z2e jfe e2fe2dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZd Z?d!Z@e@ed<y")#)askQ) handlers_dict)BasicsympifyS)mulMul)NumberIntegerDummy)adjoint)rm_idunpacktypedflattenexhaustdo_onenew)NonInvertibleMatrixError) MatrixBase)sympy_deprecation_warning)validate_matmul_integer)Inverse) MatrixExpr)MatPow) transpose)PermutationMatrix) ZeroMatrixIdentityGenericIdentity OneMatrixceZdZdZdZeZdddddZedZ e dZ dd Z d Z d Zfd Zd ZdZdZdZdZdZddZdZxZS)MatMula 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)evaluatecheck_sympifycB|s jSttfd|}|rttt|}t j g|}|j\}}|tddd|durt||s|S|rj|S|S)Nc"j|k7SN)identity)iclss g/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/matrices/expressions/matmul.pyz MatMul.__new__..0sS\\Q%6zaPassing check to MatMul is deprecated and the check argument will be removed in a future version.z1.11z,remove-check-argument-from-matrix-operations)deprecated_since_versionactive_deprecations_targetF) r-listfiltermaprr__new__as_coeff_matricesrvalidate _evaluate)r/r'r(r)argsobjfactormatricess` r0r8zMatMul.__new__*s<< F6=> GT*+DmmC'$'002   %s)/+Y [   h M ==% % r2ct|Sr,) canonicalize)r/exprs r0r;zMatMul._evaluateJs D!!r2c|jDcgc]}|js|}}|dj|djfScc}w)Nr)r< is_Matrixrowscols)selfargr?s r0shapez MatMul.shapeNsC#'99>C C>>   (2,"3"344?s AAc ddlm}ddlm|j \}}t |dk(r ||d||fzSdgt |dzz}dgt |dz z} ||d<||d<d} |j d| } tdt |D]}t| ||<t|ddD]\}} | jddz | |<t|D cgc]"\}} | j||||dz| $}}} tj|} tfd |Drd }||| gt|dddgt | z| z}td | Dsd }|r|j!S|Scc} }w) Nr)Sum)ImmutableMatrixrrDc3<Kd} td|z|dz }w)Nrzi_%ir )counters r0fzMatMul._entry..fbs,GFW,--1 dummy_generator)rRc3@K|]}|jywr,)has).0vrMs r0 z MatMul._entry..qs8!quu_%8sTc3HK|]}t|ttfywr,) isinstancer int)rUrVs r0rWz MatMul._entry..ysEQ:a'30Es "F)sympy.concrete.summationsrLsympy.matrices.immutablerMr9lengetrangenext enumeraterJ_entryr fromiteranyzipdoit)rHr.jexpandkwargsrLcoeffr?indices ind_rangesrPrRrI expr_in_sumresultrMs @r0rbz MatMul._entrySs1<002x x=A 8A;q!t,, ,&#h-!+,VS]Q./     !**%6<q#h-( /Ao.GAJ / " . -FAsIIaL1,JqM -hqrzh{|^d^_adCJJwqz71Q3<JY||ll8, 8x8 8FsWQr]QCJ$7D E*EEF &v{{}2F2}s%'F c|jDcgc]}|jr|}}|jDcgc]}|js|}}t|}|jdur t d||fScc}wcc}w)NFz3noncommutative scalars in MatMul are not supported.)r<rEr is_commutativeNotImplementedError)rHxscalarsr?rjs r0r9zMatMul.as_coeff_matrices}sq"ii;q{{1;;#yy8!AKKA88W    5 (%&[\ \h <8sA2A2A7A7c<|j\}}|t|fSr,)r9r&)rHrjr?s r0 as_coeff_mmulzMatMul.as_coeff_mmuls$002xfh'''r2c Ltt| di|}|j|SN)superr&rhr;)rHriexpanded __class__s r0rhz MatMul.expands&-77~~h''r2c |j\}}t|g|dddDcgc] }t|c}jScc}w)aTransposition 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 NrD)r9r&rrf)rHrjr?rIs r0_eval_transposezMatMul._eval_transposesR&002x @/7"~>Ys^>@@D G>sA ct|jdddDcgc] }t|c}jScc}w)NrD)r&r<rrf)rHrIs r0 _eval_adjointzMatMul._eval_adjoints4 $B$@ @AFFHH@s>cr|j\}}|dk7rddlm}|||jzSy)Nr)trace)rurrf)rHr>mmulrs r0 _eval_tracezMatMul._eval_traces9))+  Q; $E$))+.. . r2c ddlm}|j\}}t|}||jzt t t||zS)Nr) Determinant)&sympy.matrices.expressions.determinantrr9 only_squaresrFr r5r7)rHrr>r?square_matricess r0_eval_determinantzMatMul._eval_determinantsGF113&1tyy 3So-N(O#PPPr2ctd|jDr-td|jdddDjSt |S)Nc3VK|]!}t|ts|j#ywr,)rYr is_squarerUrIs r0rWz'MatMul._eval_inverse..sQZZ5Ps}}Qs))c3fK|])}t|tr|jn|dz+yw)rDN)rYrinversers r0rWz'MatMul._eval_inverse..s0",C!< #r'Is/1rD)allr<r&rfr)rHs r0 _eval_inversezMatMul._eval_inversesO Q Q Q#yy2df   t}r2c jdd}|rtfd|jD}n |j}tt |}|S)NdeepTc3BK|]}|jdiywrw)rf)rUrIhintss r0rWzMatMul.doit..s@s*E*@s)r^tupler<rAr&)rHrrr<rBs ` r0rfz MatMul.doitsHyy& @dii@@D99DFDM* r2c |jDcgc]}|js|}}|jDcgc]}|jr|}}|rlt|}t|}|rT|rRt||k7rDt d|Dcgc],}t |jj |dkDs+|.c}z||gScc}wcc}wcc}w)Nz"repeated commutative arguments: %sr)r<rpr]set ValueErrorr5count) rHcsetwarnrirrcoeff_ccoeff_ncclencis r0args_cnczMatMul.args_cncs"ii<1+;+;1<<#yyA!0@0@AAA w.s3 , ;; ?3==>S->-> ? ,s24rrD)rdr<rEr!rFrG)r rIr?s r0 any_zerosrsc  ,"%(( ,,#&88=Cs}}C==(1+**HRL,=,=>> J>s A+A+cDtd|jDs|Sg}|jd}|jddD]G}t|ttfrt|ttfr||z}5|j ||}I|j |t |S)a 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] c3<K|]}t|tywr,)rYrrs r0rWz!merge_explicit..sBsz#z*BrQrrN)rdr<rYrr rr&)matmulnewargslastrIs r0merge_explicitrs8 BfkkB B G ;;q>D{{12 cJ/ 0ZzSYFZ5[#:D NN4 D   NN4 7 r2c|j\}}td|}||k7rt|g|jS|S)z Remove 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|jduS)NT) is_Identityrrs r0r1zremove_ids..6sQ]]d2r2)rurrr<)r r>rrns r0 remove_idsr'sJ%3$$&LFD 3U2 3D 9F ~f+v{{++ r2cP|j\}}|dk7r t|g|S|SNr)r9r)r r>r?s r0factor_in_frontr<s3,s,,.FH {f(x(( Jr2c$|j\}}|dg}tdt|D]A}|d}||}t|trnt|j t rT|j j}t|}t||| dk(r!|d| t|jdgz}t|trt|j t rm|j j} t| }t| ||||zk(r8t|jd} | |d<t|||zD]} | || < #|jdk(s|jdk(r|j|Tt|tr|j\} } n|tj} } t|tr|j\}}n|tj}}| |k(r&| |z}t| |j!d|d<t|t"s> |j%}|+| |k(r&| |z }t| |j!d|d<1|j|Dt)|g|S#t&$rd}YZwxYw)aCombine 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 $$ rrrDNF)r)r9r_r]rYrrIr&r<r5r"rJrrrrOnerfrrrr)r r>r<new_argsr.ABBargslAargsr-rgA_baseA_expB_baseB_expnew_exp B_base_invs r0combine_powersrBsb)3((*LFDQyH 1c$i 0 RL G a !j&?EEJJEE AE{hrsm+#CaR=HQWWQZ,@+AA a !j&?EEJJEE AE{d1QqSk)#AGGAJ/' q!A#'A&DG' ;;% 1;;%#7 OOA   a FFMFEquuEF a FFMFEquuEF V emG!&'277U7CHRL FJ/ "#^^- %&J*>%-%fg6;;;G a0d & $8 $$, "!  "s$J JJcR|j}t|}|dkr|S|dg}td|D]m}|d}||}t|tr@t|tr0|jd}|jd}t ||z|d<]|j |ot |S)zGRefine products of permutation matrices as the products of cycles. rrrD)r<r]r_rYr rr&) r r<rrnr.rrcycle_1cycle_2s r0combine_permutationsrs 88D D A1u 1gYF 1a[  2J G a* + q+ ,ffQiGffQiG*7W+<=F2J MM!   6?r2c~|j\}}|dg}|ddD]}|d}t|trt|ts|j|:|j |jt|j d|j d||j dz}t |g|S)zj Combine products of OneMatrix e.g. OneMatrix(2, 3) * OneMatrix(3, 4) -> 3 * OneMatrix(2, 4) rrNrD)r9rYr$rpoprJr)r r>r<rrrs r0combine_one_matricesrs )3((*LFDQyH !"X RL!Y'z!Y/G OOA    !''!*aggaj9:!''!* & $8 $$r2c |j}t|dk(rddlm}|djrJ|dj r;||djDcgc]}t ||dj!c}S|djrJ|dj r;||djDcgc]}t |d|j!c}S|Scc}wcc}w)zr Simplify MatMul expressions but distributing rational term to MatMul. e.g. 2*(A+B) -> 2*A + 2*B rr)MatAddr)r<r]mataddr is_MatAdd is_Rationalr&rf)r r<rmats r0distribute_monomrs 88D 4yA~" 7  a!4!447<<PCF3Q0557PQ Q 7  a!4!447<<PCF47C0557PQ Q JQPs $C+$Cc |dk(Srrxrs r0r1r1s klpqkqr2c "|dj|djk7r tdg}d}t|D]R\}}|j||jk(s#|j t |||dzj |dz}T|S)z'factor matrices only if they are squarerrDz!Invalid matrices being multipliedr)rFrG RuntimeErrorrarr&rf)r?outstartr.Ms r0rrs{8B<,,,>?? C E(#1 66Xe_)) ) JJvxac2388: ;aCE Jr2c$g}g}|jD]1}|jr|j|!|j|3|d}|ddD]}||jk(r8t t j ||rt|jd}J||jk(r8t t j||rt|jd}|j||}|j|t|S)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 rrN) r<rErTrr orthogonalr"rJ conjugateunitaryr&)rB assumptionsrexprargsr<rrIs r0 refine_MatMulrsGH ! >> OOD ! NN4 ! A;D| $&&=Sc!2K@CIIaL)D DNN$ $QYYs^[)ICIIaL)D NN4 D NN4 7 r2N)Asympy.assumptions.askrrsympy.assumptions.refiner sympy.corerrrsympy.core.mulr r sympy.core.numbersr r sympy.core.symbolrsympy.functionsrsympy.strategiesrrrrrrrsympy.matrices.exceptionsrsympy.matrices.matrixbasersympy.utilities.exceptionsr!sympy.matrices.expressions._shaperr:rrmatexprrmatpowrr permutationr specialr!r"r#r$r&register_handlerclassrrrrrrrrrrulesrArrrxr2r0r s(2((#.##>0@Q *EESZSj3-0 (T* =%~,%("i-A>SY[`aq[rOW.B Duffen567  D( hr2