K ikJddlmZddlmZddlmZmZmZmZm Z ddl m Z ddl m Z ddlmZmZddlmZddlmZmZmZmZdd lmZmZdd lmZdd lmZmZdd l m!Z!dd l"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+d,dZ,GddeZ-e)e-edZ.e)e-e-dZ.dZ/e/ege/e gdej`e-<d-dZ1dZ2GddeZ3Gdde-Z4d Z5Gd!d"Z6d#Z7d$d%l8m9Z9d$d&l:m;Z;d$d'lm?Z?d$d)l@mAZAd$d*lBmCZCmDZDd$d+lEmFZFy).) annotationswraps)SIntegerBasicMulAdd)check_assumptions)call_highest_priority)Expr ExprBuilder) FuzzyBool)StrDummysymbolsSymbol) SympifyError_sympify) SYMPY_INTS) conjugateadjoint)KroneckerDelta)NonSquareMatrixError) MatrixKind) MatrixBase)dispatch) filldedentNcfd}|S)Nc2tfd}|S)NcP t|}||S#t$rcYSwxYwN)rr)abfuncretvals h/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/matrices/expressions/matexpr.py__sympifyit_wrapperz5_sympifyit..deco..__sympifyit_wrappers1 QKAqz!   s  %%r)r%r(r&s` r'decoz_sympifyit..decos! t   #")argr&r)s ` r' _sympifyitr-s # Kr*ceZdZUdZdZded<dZdZdZded <dZ ded <d Z d ed <dZ dZ dZ dZdZdZdZdZdZeZded<dZedRdZedZedZdZdZedeeddZ edeeddZ!edeeddZ"edeeddZ#edeedd Z$edeedd!Z%edeed"d#Z&edeed"d$Z'edeed%d&Z(edeed'd(Z)edeed)d*Z*edeed+d,Z+ed-Z,ed.Z-edSd/Z.d0Z/dTd1Z0d2Z1d3Z2d4Z3d5Z4d6Z5d7Z6d8Z7d9Z8d:Z9fd;Z:e;d<ZZ>dUd?Z?d@Z@dAZAedBZBdCZCdDZDdEZEedFZFdGZGdHZHdVdIZIdJZJdKZKeLd fdLZMdMZNdNZOdOZPeQdWdPZRdQZSxZTS)X MatrixExpraSuperclass 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 r+ztuple[str, ...] __slots__Fg&@Tbool is_Matrix is_MatrixExprNr is_IdentityrkindcTtt|}tj|g|i|Sr")maprr__new__)clsargskwargss r'r8zMatrixExpr.__new__Qs'8T"}}S242622r*ctr"NotImplementedErrorselfs r'shapezMatrixExpr.shapeWs!!r*ctSr"MatAddr?s r' _add_handlerzMatrixExpr._add_handler[ r*ctSr"MatMulr?s r' _mul_handlerzMatrixExpr._mul_handler_rFr*cRttj|jSr")rIr NegativeOnedoitr?s r'__neg__zMatrixExpr.__neg__csammT*//11r*ctr"r=r?s r'__abs__zMatrixExpr.__abs__fs!!r*other__radd__c6t||jSr"rDrMr@rQs r'__add__zMatrixExpr.__add__idE"''))r*rVc6t||jSr"rTrUs r'rRzMatrixExpr.__radd__neT"''))r*__rsub__c8t|| jSr"rTrUs r'__sub__zMatrixExpr.__sub__ssdUF#((**r*r\c8t|| jSr"rTrUs r'rZzMatrixExpr.__rsub__xsedU#((**r*__rmul__c6t||jSr"rIrMrUs r'__mul__zMatrixExpr.__mul__}rWr*c6t||jSr"r`rUs r' __matmul__zMatrixExpr.__matmul__rWr*rac6t||jSr"r`rUs r'r^zMatrixExpr.__rmul__rYr*c6t||jSr"r`rUs r' __rmatmul__zMatrixExpr.__rmatmul__rYr*__rpow__c6t||jSr")MatPowrMrUs r'__pow__zMatrixExpr.__pow__rWr*rjctd)NzMatrix Power not definedr=rUs r'rgzMatrixExpr.__rpow__s""<==r* __rtruediv__c.||tjzzSr")rrLrUs r' __truediv__zMatrixExpr.__truediv__seQ]]***r*rnctr"r=rUs r'rlzMatrixExpr.__rtruediv__s "##r*c |jdSNrrAr?s r'rowszMatrixExpr.rowszz!}r*c |jdSNrrr?s r'colszMatrixExpr.colsrtr*cx|j\}}t|trt|tr||k(S||k(ryyNT)rA isinstancer)r@rsrxs r' is_squarezMatrixExpr.is_squares9ZZ d dG $D')B4<  4<r*c0ddlm}|t|SNr)Adjoint)"sympy.matrices.expressions.adjointr Transposer@rs r'_eval_conjugatezMatrixExpr._eval_conjugates>y''r*c "|jSr")_eval_as_real_imag)r@deephintss r' as_real_imagzMatrixExpr.as_real_imags&&((r*ctj||jzz}||jz dtjzz }||fSN)rHalfr ImaginaryUnit)r@realims r'rzMatrixExpr._eval_as_real_imagsIvv 4 4 667T))++a.? @bzr*ct|Sr"Inverser?s r' _eval_inversezMatrixExpr._eval_inverse t}r*ct|Sr" Determinantr?s r'_eval_determinantzMatrixExpr._eval_determinants 4  r*ct|Sr"rr?s r'_eval_transposezMatrixExpr._eval_transpose r*cyr"r+r?s r' _eval_tracezMatrixExpr._eval_tracesr*ct||S)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. ri)r@exps r' _eval_powerzMatrixExpr._eval_powers dC  r*c |jr|Sddlm}|j|jDcgc] }||fi| c}Scc}w)Nr)simplify)is_Atomsympy.simplifyrr%r:)r@r;rxs r'_eval_simplifyzMatrixExpr._eval_simplifys> <<K /499diiHx4V4HI IHsAcddlm}||Sr~)rrrs r' _eval_adjointzMatrixExpr._eval_adjoints>t}r*c0tj|||Sr")r_eval_derivative_n_times)r@rns r'rz#MatrixExpr._eval_derivative_n_timess--dAq99r*ch|j|rt| |St|jSr")hassuper_eval_derivative ZeroMatrixrA)r@r __class__s r'rzMatrixExpr._eval_derivatives- 88A;7+A. .tzz* *r*cz|j xrt|dd}|durtdj|y)z2Helper function to check invalid matrix dimensionsT)integer nonnegativeFz?The dimension specification {} should be a nonnegative integer.N)is_Floatr ValueErrorformat)r9dimoks r' _check_dimzMatrixExpr._check_dimsK 1"3 4#1 ;))/6 6 r*c Ftd|jjz)NzIndexing not implemented for %s)r>r__name__r@ijr;s r'_entryzMatrixExpr._entrys#! -0G0G GI Ir*ct|Sr")rr?s r'rzMatrixExpr.adjointrr*c&tj|fS)z1Efficiently extract the coefficient of a product.)rOne)r@rationals r' as_coeff_MulzMatrixExpr.as_coeff_Mulsuud{r*ct|Sr")rr?s r'rzMatrixExpr.conjugaterr*cddlm}||S)Nr transpose)$sympy.matrices.expressions.transposer)r@rs r'rzMatrixExpr.transposesBr*c"|jS)zMatrix transpositionrr?s r'Tz MatrixExpr.T s~~r*cT|jdur td|jS)NFzInverse of non-square matrix)r|rrr?s r'inversezMatrixExpr.inverses) >>U "&'EF F!!##r*c"|jSr"rr?s r'invzMatrixExpr.invs||~r*cddlm}||S)Nr)det)&sympy.matrices.expressions.determinantr)r@rs r'rzMatrixExpr.dets>4yr*c"|jSr"rr?s r'Iz MatrixExpr.Is||~r*cd}||xrj||xr`|jduxs'||j k\dk7xr||jkdk7xr'||j k\dk7xr||jkdk7S)NcBt|ttttfSr")r{intrrr )idxs r'is_validz(MatrixExpr.valid_index..is_validscC&$#?@ @r*F)rsrx)r@rrrs r' valid_indexzMatrixExpr.valid_indexs A H Hd"HtyyjU*GDII %/GHtyyjU*H12DII %/G Ir*c<t|ts t|trddlm}|||dSt|trt |dk(r|\}}t|tst|trddlm}||||St |t |}}|j||dk7r|j||Std|d|dt|ttfr}|j\}}t|tsttd t |}||z}||z}|j||dk7r|j||Std |zt|ttfrttd td |z) Nr) MatrixSlice)rNrwrFzInvalid indices (z, )zo Single indexing is only supported when the number of columns is known.zInvalid index %szj Only integers may be used when addressing the matrix with a single index.zInvalid index, wanted %s[i,j])r{tupleslice sympy.matrices.expressions.slicerlenrrr IndexErrorrrrArrr )r@keyrrrrsrxs r' __getitem__zMatrixExpr.__getitem__&s}#u%*S%*@ DtS,7 7 c5 !c#h!mDAq!U#z!U';H"4A..A; qA1%.{{1a(( q!!DEE j'2 3JD$dG, -,"-..3-Ct Ad A1%.{{1a(( !3c!9:: fd^ ,Z)()* *84?@@r*ct|jttf xs!t|jttf Sr")r{rsrrrxr?s r'_is_shape_symboliczMatrixExpr._is_shape_symbolicIs:tyy:w*?@@@dii*g)>?? Ar*c |jr tdddlm}|t |j Dcgc]*}t |j Dcgc] }|||f c},c}}Scc}wcc}}w)a 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|jjS)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_mutabler?s r'rzMatrixExpr.as_mutablens.!,,..r*c| |s tdddlm}||jt}t |j D](}t |jD]}|||f|||f<*|S)Nz=Cannot implement copy=False when converting Matrix to ndarrayr)empty)dtype) TypeErrornumpyrrAobjectrrsrx)r@rcopyrr#rrs r' __array__zMatrixExpr.__array__su  D[\ \ $**F +tyy! %A499% %q!t*!Q$ % %r*c@|jj|S)z Test elementwise equality between matrices, potentially of different types >>> from sympy import Identity, eye >>> Identity(3).equals(eye(3)) True )requalsrUs r'rzMatrixExpr.equalss!((//r*c|Sr"r+r?s r' canonicalizezMatrixExpr.canonicalize r*c8tjt|fSr")rrrIr?s r' as_coeff_mmulzMatrixExpr.as_coeff_mmulsuufTl""r*cddlm}ddlm}g}||j |||j ||||}||S)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 r)convert_indexed_to_arrayconvert_array_to_matrix) first_indices)4sympy.tensor.array.expressions.from_indexed_to_arrayr3sympy.tensor.array.expressions.from_array_to_matrixrappend)expr first_index last_index dimensionsrrrarrs r'from_index_summationzMatrixExpr.from_index_summationsPT b_  "   -  !   ,&t=I&s++r*c ddlm}|||S)Nrw)ElementwiseApplyFunction) applyfuncr)r@r%rs r'rzMatrixExpr.applyfuncs7'd33r*)returnztuple[Expr, Expr])rz bool | None)TF)rr1)NNN)Ur __module__ __qualname____doc__r0__annotations__ _iterable _op_priorityr2r3r4 is_Inverse is_Transpose is_ZeroMatrix is_MatAdd is_MatMulis_commutative is_number is_symbol is_scalarrr5r8propertyrArErJrNrPr-NotImplementedr rVrRr\rZrarcr^rfrjrgrnrlrsrxr|rrrrrrrrrrrr classmethodrrrrrrrrrrrrrrrrrrrrr staticmethodrr __classcell__)rs@r'r/r/%s$"$I# ILItM4!K!JLMIINIII!|D*#3 ""2"(:&*')*(9%*&)*(:&+')+(9%+&)+(:&*')*(:&*')*(9%*&)*(9%*&)*(:&*')*(9%>&)>(>*++)+(=)$*)$() !!J:+66I  $ I!AFA8B/2%4 0#1,1,f4r*r/cy)NFr+lhsrhss r' _eval_is_eqr-s r*cX|j|jk7ry||z jryy)NFT)rArr*s r'r-r-s* yyCII c   !r*cfd}|S)Nctttti}g}g}|jD]5}t |t r|j|%|j|7|sj|S|rtk(rStt|D];}||jr||jj|||<g}n*n(j|||jdgzS|tk(r||jdS|j|g|jdS)NF)r)r rIr rDr:r{r/r  _from_argsrrr3rarM)r  mat_class nonmatricesmatricestermrr9s r'_postprocessorz)get_postprocessor.._postprocessors:&#v.s3  II )D$ +%""4(  ) >>+. . czs8}-A#A;44'/qk&9&9#..:U&V &( ~~kY5I5N5NTY5N5Z4[&[\\  h',,%,8 8 4@x@EE5EQQr*r+)r9r6s` r'get_postprocessorr7s"RF r*)r r ct|tst|trd}|r t||Sddlm}ddlm}ddlm}||}|||}||}|S)NTr)convert_matrix_to_array) array_deriver) r{r _matrix_derivative_old_algorithm3sympy.tensor.array.expressions.from_matrix_to_arrayr94sympy.tensor.array.expressions.arrayexpr_derivativesr:rr) r r old_algorithmr9r:r array_exprdiff_array_exprdiff_matrix_exprs r'_matrix_derivativerBsZ$ #z!Z'@ /a88[Q[(.J":q1O.? r*c  ddlm}|j|}|Dcgc]}|j}}ddlm}|Dcgc]}|Dcgc] }|| c}}}}d fd}|Dcgc] }|| } }| d} d} | dkr)t j|Dcgc] }| | c}S|||Scc}wcc}wcc}}wcc}wcc}w)Nr)ArrayDerivativerc<t|tr |jSy)Nrwrwr{r/rAelems r' _get_shapez4_matrix_derivative_old_algorithm.._get_shape0s dJ ':: r*c,tfd|DS)Nc3@K|]}|D]}|dv yw)rwNNr+).0rrrJs r' zE_matrix_derivative_old_algorithm..get_rank..6s'L!jmL1I%L%Ls)sum)partsrJs r'get_rankz2_matrix_derivative_old_algorithm..get_rank5sLuLLLr*c:t|dk(r|dS|dd\}}|jr |j}|tdk(r|}n|tdk(r|}n||z}t|dk(r|S|jr t d|t j |ddzS)Nrwrr)rr2rIdentityrr fromiter)rQp1p2pbases r'contract_one_dimsz;_matrix_derivative_old_algorithm..contract_one_dims;s u:?8O2AYFB||TTXa[ x{"25zQ ??$R.(S\\%)444r*r)$sympy.tensor.array.array_derivativesrD_eval_derivative_matrix_linesbuildrrr rV) r rrDlinesrrQrrrRranksrankrZrJs @r'r;r;&sD  . .q 1E % &1QWWY &E &[>C D! 4Q%a( 4 DE D M#( (QXa[ (E ( 8D5( qy||5Aa.q1ABB 4 ##Q '5 D )0Bs)B= C C C-C CCceZdZedZedZedZdZdZdZ dZ edZ dZ edZ d Zy ) MatrixElementc |jdSrqr:r?s r'zMatrixElement.Vs499Q<r*c |jdSrvrdr?s r'rezMatrixElement.Wdiilr*c |jdSrrdr?s r'rezMatrixElement.Xrgr*Tctt||f\}}t|tr t |}nt|t r+|j r|j r|||fSt|}n0t|}t|jts tdt|dd||s tdtj||||}|S)Nz2First argument of MatrixElement should be a matrixrcyrzr+)rms r'rez'MatrixElement.__new__..jsr*zindices out of range)r7rr{strrr is_Integerr5rrgetattrrr r8r9namerrkobjs r'r8zMatrixElement.__new__]s8aV$1 dC $!$))A,q Aqs8D!$))A,q Aqs8DE E a ! 599QR=DAqX51FBq AWWFB!R%2r6!221RU8;b!RT]RQRTVWXTXMZZ Z 88AFF1I vv r*N)rrrr$rzrr _diff_wrtr"r r8rsrMrwrr+r*r'rbrbUsi / 0F*+A*+AIIN$)r*rbcjeZdZdZdZdZdZdZedZ edZ dZ edZ d Z d Zd Zy ) MatrixSymbolaSymbolic 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 FTct|t|}}|j||j|t|tr t |}t j ||||}|Sr")rrr{rlrrr8ros r'r8zMatrixSymbol.__new__sW{HQK1 q q dC t9DmmCq!, r*c>|jd|jdfS)Nrwrrdr?s r'rAzMatrixSymbol.shapesyy|TYYq\))r*c4|jdjSrq)r:rpr?s r'rpzMatrixSymbol.namesyy|   r*c t|||Sr")rbrs r'rzMatrixSymbol._entrysT1a((r*c|hSr"r+r?s r' free_symbolszMatrixSymbol.free_symbolss v r*c |Sr"r+)r@r;s r'rzMatrixSymbol._eval_simplifyrr*cNt|jd|jdSNrrw)rrA)r@rs r'rzMatrixSymbol._eval_derivatives$**Q-A77r*cL||k7r|jddk7r&t|jd|jdntj}|jddk7r&t|jd|jdntj}t ||ggS|jddk7rt |jdntj }|jddk7rt |jdntj }t ||ggSr)rArrr}_LeftRightArgsrUr)r@rfirstseconds r'r\z*MatrixSymbol._eval_derivative_matrix_liness 19=AZZ]a=OJqwwqz4::a=9UVU[U[E>Bjjmq>PZ DJJqM:VWV\V\F" 04zz!}/AHTZZ]+quuE04 1 0BXdjjm,F" r*N)rrrrr r"rr8r$rArprrrrr\r+r*r'rrsm NII **!!)8 r*rcZ|jDcgc]}|js|c}Scc}wr")rr2)r syms r'matrix_symbolsrs",, >C C >> >s((ceZdZdZej fdZedZejdZedZ e jdZ dZ dZ e d Zd Zd Zd Zd ZdZdZy)ra 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. ct||_|j|_d|_d|_|j|_d|_d|_||_yr) list_lines_first_pointer_parent_first_pointer_index_first_line_index_second_pointer_parent_second_pointer_index_second_line_indexhigher)r@r^rs r'__init__z_LeftRightArgs.__init__sL5k %)[["$%!!"&*kk#%&""# r*c4|j|jSr"rrr?s r' first_pointerz_LeftRightArgs.first_pointers))$*C*CDDr*c6||j|j<yr"rr@values r'rz_LeftRightArgs.first_pointers@E""4#<#<=r*c4|j|jSr"rrr?s r'second_pointerz_LeftRightArgs.second_pointers**4+E+EFFr*c6||j|j<yr"rrs r'rz_LeftRightArgs.second_pointersBG##D$>$>?r*c|jDcgc]}|j|}}d|d|jdScc}w)Nz_LeftRightArgs(lines=z , higher=r)r_buildr)r@rbuilts r'__repr__z_LeftRightArgs.__repr__ s:)-5AQ55  KK  6s<c|j|jc|_|_|j|jc|_|_|j|j c|_|_|Sr")rrrrrrr?s r'rz_LeftRightArgs.transposesdBFB]B]_c_y_y?"D$?@D@Z@Z\`\u\u=!4#=:>:Q:QSWSiSi7 7 r*ct|tr|jSt|tr?t |dk(r|dS|d|dDcgc]}t j |c}S|Scc}w)Nrwr)r{rr]rrrr)r rs r'rz_LeftRightArgs._buildsl dK (::<  dD !4yA~AwtAw47 Ka!6!6q!9 KLLK!LsA2c|jDcgc]}|j|}}|jdk7r||j|jgz }t|}|Scc}wrv)rrrr)r@rdatas r'r]z_LeftRightArgs.build$sZ(, 41 A44 ;;!  T[[-. .DDz 5sA$c|jdk7r|jdk7r tdd}||jd||jdk7rw||jdk(r|j|jdzS||jdk(r&|jd|jjzStd|jdk7r#|j|jjzS|jS)Nrwz.higher dimensional array cannot be representedc<t|tr |jSy)N)NNrGrHs r'rJz._LeftRightArgs.matrix_form.._get_shape/s$ +zz!r*rF)rrzincompatible shapes)rrrrr)r@rJs r' matrix_formz_LeftRightArgs.matrix_form+s ::?t{{a/MN N djj !! $ 4;;(?(B B$++&&0zz$++d"333$**%/zz$' 5523 3 ::?::dkkmm+ +;; r*cd}|jdk7r)|td|jjDz }|jdk7r)|td|jjDz }|jdk7r|dz }|S)zl Number of dimensions different from trivial (warning: not related to matrix rank). rrwc3&K|] }|dk7 ywrMr+rNrs r'rOz&_LeftRightArgs.rank..Hs91Q9c3&K|] }|dk7 ywrMr+rs r'rOz&_LeftRightArgs.rank..Js:1Q:rr)rrPrArr)r@r`s r'r`z_LeftRightArgs.rankAsx  ::? C9 (8(899 9D ;;!  C: (9(9:: :D ;;!  AID r*cjddlm}ddlm}t|t|||gdg|j}|S)N)ArrayTensorProduct)ArrayContraction)rwr) validator)*tensor.array.expressions.array_expressionsrrr _validate)r@pointerrQrrsubexprs r'_multiply_pointerz _LeftRightArgs._multiply_pointerOsGTR & '00  r*c.|xj|zc_yr")rrUs r' append_firstz_LeftRightArgs.append_firstds e#r*c.|xj|zc_yr")rrUs r' append_secondz_LeftRightArgs.append_secondgs u$r*N)rrrrrrrr$rsetterrrrr'rr]rr`rrrr+r*r'rrs &'UUEEFFGGHH    , *$%r*rcFddlm}t|tr|S||ggS)Nrr)rrr{r/)rrs r' _make_matrixrks#=!Z  ! &&r*rwrHrCrrr)rrUrr"r)G __future__r functoolsr sympy.corerrrr r sympy.core.assumptionsr sympy.core.decoratorsr sympy.core.exprr rsympy.core.logicrsympy.core.symbolrrrrsympy.core.sympifyrrsympy.external.gmpyrsympy.functionsrr(sympy.functions.special.tensor_functionsrsympy.matrices.exceptionsrsympy.matrices.kindrsympy.matrices.matrixbasersympy.multipledispatchrsympy.utilities.miscrr-r/r-r7"_constructor_postprocessor_mappingrBr;rbrrrrmatmulrImataddrDmatpowrirrrrspecialrrU determinantrr+r*r'rs"2247-&995*.C:*0++  s4s4l  *d *j!" $P c " # c " #8((4 &,$^BDBJB:BJ?E%E%P' )$r*