§
    OŠtj�k  ã                  ó~  — d dl mZ d dlmZ d dlmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZmZ d d	lmZmZ d d
l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) d dl*m+Z+ d-d„Z, G d„ de¦  «        Z- e)e-e¦  «        d„ ¦   «         Z. e)e-e-¦  «        d„ ¦   «         Z.d„ Z/ e/e¦  «        g e/e	¦  «        gdœej0        e-<   d.d„Z1d„ Z2 G d„ de¦  «        Z3 G d„ d e-¦  «        Z4d!„ Z5 G d"„ d#¦  «        Z6d$„ Z7d%d&l8m9Z9 d%d'l:m;Z; d%d(l<m=Z= d%d)l>m?Z? d%d*l@mAZA d%d+lBmCZCmDZD d%d,lEmFZF dS )/é    )Ú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                ó   ‡— ˆfd„}|S )Nc                ó@   •‡ — t          ‰ ¦  «        ˆ ˆfd„¦   «         }|S )Nc                ó`   •— 	 t          |¦  «        } ‰| |¦  «        S # t          $ r ‰cY S w xY w©N)r   r   )ÚaÚbÚfuncÚretvals     €€ú`/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/matrices/expressions/matexpr.pyÚ__sympifyit_wrapperz5_sympifyit.<locals>.deco.<locals>.__sympifyit_wrapper   sG   ø€ ðÝ˜Q‘K”K�Ø�t˜A˜q‘z”zÐ!øÝð ð ð Ø���ðøøøs   ƒ ž-¬-r   )r%   r(   r&   s   ` €r'   Údecoz_sympifyit.<locals>.deco   s:   øø€ Ý	ˆt‰Œð	ð 	ð 	ð 	ð 	ñ 
Œð	ð #Ð"ó    © )Úargr&   r)   s    ` r'   Ú
_sympifyitr-      s#   ø€ ð	#ð 	#ð 	#ð 	#ð 	#ð €Kr*   c                  óä  ‡ — e Zd ZU dZdZded<   dZdZdZded	<   dZ	ded
<   dZ
ded<   dZdZdZdZdZdZdZdZdZ e¦   «         Zded<   d„ ZedUd„¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Z ede¦  «         ed¦  «        d„ ¦   «         ¦   «         Z  ede¦  «         ed¦  «        d„ ¦   «         ¦   «         Z! ede¦  «         ed¦  «        d„ ¦   «         ¦   «         Z" ede¦  «         ed¦  «        d „ ¦   «         ¦   «         Z# ede¦  «         ed!¦  «        d"„ ¦   «         ¦   «         Z$ ede¦  «         ed!¦  «        d#„ ¦   «         ¦   «         Z% ede¦  «         ed$¦  «        d%„ ¦   «         ¦   «         Z& ede¦  «         ed$¦  «        d&„ ¦   «         ¦   «         Z' ede¦  «         ed'¦  «        d(„ ¦   «         ¦   «         Z( ede¦  «         ed)¦  «        d*„ ¦   «         ¦   «         Z) ede¦  «         ed+¦  «        d,„ ¦   «         ¦   «         Z* ede¦  «         ed-¦  «        d.„ ¦   «         ¦   «         Z+ed/„ ¦   «         Z,ed0„ ¦   «         Z-edVd2„¦   «         Z.d3„ Z/dWd4„Z0d5„ Z1d6„ Z2d7„ Z3d8„ Z4d9„ Z5d:„ Z6d;„ Z7d<„ Z8d=„ Z9ˆ fd>„Z:e;d?„ ¦   «         Z<d@„ Z=dA„ Z>dXdB„Z?dC„ Z@dD„ ZAedE„ ¦   «         ZBdF„ ZCdG„ ZDdH„ ZEedI„ ¦   «         ZFdJ„ ZGdK„ ZHdYdL„ZIdM„ ZJdN„ ZKeLdfdO„ZMdP„ ZNdQ„ ZOdR„ ZPeQdZdS„¦   «         ZRdT„ ZSˆ xZTS )[Ú
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
    r+   ztuple[str, ...]Ú	__slots__Fg      &@TÚboolÚ	is_MatrixÚis_MatrixExprNr   Úis_Identityr   Úkindc                óV   — t          t          |¦  «        }t          j        | g|¢R i |¤ŽS r"   )Úmapr   r   Ú__new__)ÚclsÚargsÚkwargss      r'   r8   zMatrixExpr.__new__Q   s1   € Ý•8˜TÑ"Ô"ˆÝŒ}˜SÐ2 4Ð2Ð2Ð2¨6Ð2Ð2Ð2r*   Úreturnútuple[Expr, Expr]c                ó   — t           ‚r"   ©ÚNotImplementedError©Úselfs    r'   ÚshapezMatrixExpr.shapeW   s   € å!Ð!r*   c                ó   — t           S r"   ©ÚMatAddrA   s    r'   Ú_add_handlerzMatrixExpr._add_handler[   ó   € åˆr*   c                ó   — t           S r"   ©ÚMatMulrA   s    r'   Ú_mul_handlerzMatrixExpr._mul_handler_   rH   r*   c                óZ   — t          t          j        | ¦  «                             ¦   «         S r"   )rK   r   ÚNegativeOneÚdoitrA   s    r'   Ú__neg__zMatrixExpr.__neg__c   s    € Ý•a”m TÑ*Ô*×/Ò/Ñ1Ô1Ð1r*   c                ó   — t           ‚r"   r?   rA   s    r'   Ú__abs__zMatrixExpr.__abs__f   s   € Ý!Ð!r*   ÚotherÚ__radd__c                óF   — t          | |¦  «                             ¦   «         S r"   ©rF   rO   ©rB   rS   s     r'   Ú__add__zMatrixExpr.__add__i   ó    € õ �d˜EÑ"Ô"×'Ò'Ñ)Ô)Ð)r*   rX   c                óF   — t          || ¦  «                             ¦   «         S r"   rV   rW   s     r'   rT   zMatrixExpr.__radd__n   ó    € õ �e˜TÑ"Ô"×'Ò'Ñ)Ô)Ð)r*   Ú__rsub__c                óH   — t          | | ¦  «                             ¦   «         S r"   rV   rW   s     r'   Ú__sub__zMatrixExpr.__sub__s   s"   € õ �d˜U˜FÑ#Ô#×(Ò(Ñ*Ô*Ð*r*   r^   c                óH   — t          ||  ¦  «                             ¦   «         S r"   rV   rW   s     r'   r\   zMatrixExpr.__rsub__x   s"   € õ �e˜d˜UÑ#Ô#×(Ò(Ñ*Ô*Ð*r*   Ú__rmul__c                óF   — t          | |¦  «                             ¦   «         S r"   ©rK   rO   rW   s     r'   Ú__mul__zMatrixExpr.__mul__}   rY   r*   c                óF   — t          | |¦  «                             ¦   «         S r"   rb   rW   s     r'   Ú
__matmul__zMatrixExpr.__matmul__‚   rY   r*   rc   c                óF   — t          || ¦  «                             ¦   «         S r"   rb   rW   s     r'   r`   zMatrixExpr.__rmul__‡   r[   r*   c                óF   — t          || ¦  «                             ¦   «         S r"   rb   rW   s     r'   Ú__rmatmul__zMatrixExpr.__rmatmul__Œ   r[   r*   Ú__rpow__c                óF   — t          | |¦  «                             ¦   «         S r"   )ÚMatPowrO   rW   s     r'   Ú__pow__zMatrixExpr.__pow__‘   rY   r*   rl   c                ó    — t          d¦  «        ‚)NzMatrix Power not definedr?   rW   s     r'   ri   zMatrixExpr.__rpow__–   s   € õ "Ð"<Ñ=Ô=Ð=r*   Ú__rtruediv__c                ó&   — | |t           j        z  z  S r"   )r   rN   rW   s     r'   Ú__truediv__zMatrixExpr.__truediv__›   s   € ð �e�Qœ]Ñ*Ñ*Ð*r*   rp   c                ó   — t          ¦   «         ‚r"   r?   rW   s     r'   rn   zMatrixExpr.__rtruediv__    s   € õ "Ñ#Ô#Ð#r*   c                ó   — | j         d         S ©Nr   ©rC   rA   s    r'   ÚrowszMatrixExpr.rows¦   ó   € àŒz˜!Œ}Ðr*   c                ó   — | j         d         S ©Né   rt   rA   s    r'   ÚcolszMatrixExpr.colsª   rv   r*   úbool | Nonec                óŠ   — | j         \  }}t          |t          ¦  «        rt          |t          ¦  «        r||k    S ||k    rdS d S ©NT)rC   Ú
isinstancer   )rB   ru   rz   s      r'   Ú	is_squarezMatrixExpr.is_square®   sM   € à”Z‰
ˆˆdÝ�d�GÑ$Ô$ð 	 ­°D½'Ñ)BÔ)Bð 	 Ø˜4’<ÐØ�4Š<ˆ<Ø�4Øˆtr*   c                ó>   — ddl m}  |t          | ¦  «        ¦  «        S ©Nr   )ÚAdjoint)Ú"sympy.matrices.expressions.adjointr‚   Ú	Transpose©rB   r‚   s     r'   Ú_eval_conjugatezMatrixExpr._eval_conjugate·   s*   € Ø>Ð>Ð>Ð>Ð>Ð>Øˆw•y ‘”Ñ'Ô'Ð'r*   c                ó*   — |                       ¦   «         S r"   )Ú_eval_as_real_imag)rB   ÚdeepÚhintss      r'   Úas_real_imagzMatrixExpr.as_real_imag»   s   € Ø×&Ò&Ñ(Ô(Ð(r*   c                ó    — t           j        | |                      ¦   «         z   z  }| |                      ¦   «         z
  dt           j        z  z  }||fS ©Né   )r   ÚHalfr†   ÚImaginaryUnit)rB   ÚrealÚims      r'   rˆ   zMatrixExpr._eval_as_real_imag¾   sK   € ÝŒv˜ × 4Ò 4Ñ 6Ô 6Ñ6Ñ7ˆØ�T×)Ò)Ñ+Ô+Ñ+¨aµ´Ñ.?Ñ@ˆØ�bˆzÐr*   c                ó    — t          | ¦  «        S r"   ©ÚInverserA   s    r'   Ú_eval_inversezMatrixExpr._eval_inverseÃ   ó   € Ý�t‰}Œ}Ðr*   c                ó    — t          | ¦  «        S r"   ©ÚDeterminantrA   s    r'   Ú_eval_determinantzMatrixExpr._eval_determinantÆ   s   € Ý˜4Ñ Ô Ð r*   c                ó    — t          | ¦  «        S r"   ©r„   rA   s    r'   Ú_eval_transposezMatrixExpr._eval_transposeÉ   ó   € Ý˜‰ŒÐr*   c                ó   — d S r"   r+   rA   s    r'   Ú_eval_tracezMatrixExpr._eval_traceÌ   s   € Øˆtr*   c                ó"   — t          | |¦  «        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.
        ©rk   )rB   Úexps     r'   Ú_eval_powerzMatrixExpr._eval_powerÏ   s   € õ
 �d˜CÑ Ô Ð r*   c                ó\   ‡‡— | j         r| S ddlmŠ  | j        ˆˆfd„| j        D ¦   «         Ž S )Nr   )Úsimplifyc                ó"   •— g | ]} ‰|fi ‰¤Ž‘ŒS r+   r+   )Ú.0Úxr;   r§   s     €€r'   ú
<listcomp>z-MatrixExpr._eval_simplify.<locals>.<listcomp>Û   s+   ø€ ÐHÐHÐH¸˜x˜x¨Ð4Ð4¨VÐ4Ð4ÐHÐHÐHr*   )Úis_AtomÚsympy.simplifyr§   r%   r:   )rB   r;   r§   s    `@r'   Ú_eval_simplifyzMatrixExpr._eval_simplifyÖ   sO   øø€ ØŒ<ð 	JØˆKà/Ð/Ð/Ð/Ð/Ð/Ø�4”9ÐHÐHÐHÐHÐH¸d¼iÐHÑHÔHÐIÐIr*   c                ó$   — ddl m}  || ¦  «        S r�   )rƒ   r‚   r…   s     r'   Ú_eval_adjointzMatrixExpr._eval_adjointÝ   s"   € Ø>Ð>Ð>Ð>Ð>Ð>Øˆw�t‰}Œ}Ðr*   c                ó.   — t          j        | ||¦  «        S r"   )r   Ú_eval_derivative_n_times)rB   rª   Úns      r'   r²   z#MatrixExpr._eval_derivative_n_timesá   s   € ÝÔ-¨d°A°qÑ9Ô9Ð9r*   c                óŒ   •— |                       |¦  «        r!t          ¦   «                              |¦  «        S t          | j        Ž S r"   )ÚhasÚsuperÚ_eval_derivativeÚ
ZeroMatrixrC   )rB   rª   Ú	__class__s     €r'   r·   zMatrixExpr._eval_derivativeä   s:   ø€ à�8Š8�A‰;Œ;ð 	+å‘7”7×+Ò+¨AÑ.Ô.Ð.å˜tœzÐ*Ð*r*   c                ó†   — |j          ot          |dd¬¦  «        }|du r"t          d                     |¦  «        ¦  «        ‚dS )z2Helper function to check invalid matrix dimensionsT)ÚintegerÚnonnegativeFz?The dimension specification {} should be a nonnegative integer.N)Úis_Floatr   Ú
ValueErrorÚformat)r9   ÚdimÚoks      r'   Ú
_check_dimzMatrixExpr._check_dimì   s^   € ð ”Ðð 1Õ"3Ø˜¨4ð#1ñ #1ô #1ˆà�ˆ;ˆ;Ýð)ß)/ª°©¬ñ6ô 6ð 6ð ˆ;r*   c                ó:   — t          d| j        j        z  ¦  «        ‚)NzIndexing not implemented for %s)r@   r¹   Ú__name__©rB   ÚiÚjr;   s       r'   Ú_entryzMatrixExpr._entry÷   s$   € Ý!Ø-°´Ô0GÑGñIô Ið 	Ir*   c                ó    — t          | ¦  «        S r"   )r   rA   s    r'   r   zMatrixExpr.adjointû   r—   r*   c                ó   — t           j        | fS )z1Efficiently extract the coefficient of a product.)r   ÚOne)rB   Úrationals     r'   Úas_coeff_MulzMatrixExpr.as_coeff_Mulþ   s   € åŒu�dˆ{Ðr*   c                ó    — t          | ¦  «        S r"   )r   rA   s    r'   r   zMatrixExpr.conjugate  rŸ   r*   c                ó$   — ddl m}  || ¦  «        S )Nr   ©Ú	transpose)Ú$sympy.matrices.expressions.transposerÑ   )rB   rÑ   s     r'   rÑ   zMatrixExpr.transpose  s"   € ØBÐBÐBÐBÐBÐBØˆy˜‰ŒÐr*   c                ó*   — |                       ¦   «         S )zMatrix transpositionrÐ   rA   s    r'   ÚTzMatrixExpr.T	  s   € ð �~Š~ÑÔÐr*   c                óZ   — | j         du rt          d¦  «        ‚|                      ¦   «         S )NFzInverse of non-square matrix)r   r   r–   rA   s    r'   ÚinversezMatrixExpr.inverse  s0   € ØŒ>˜UÐ"Ð"Ý&Ð'EÑFÔFÐFØ×!Ò!Ñ#Ô#Ð#r*   c                ó*   — |                       ¦   «         S r"   ©rÖ   rA   s    r'   ÚinvzMatrixExpr.inv  s   € Ø�|Š|‰~Œ~Ðr*   c                ó$   — ddl m}  || ¦  «        S )Nr   )Údet)Ú&sympy.matrices.expressions.determinantrÛ   )rB   rÛ   s     r'   rÛ   zMatrixExpr.det  s"   € Ø>Ð>Ð>Ð>Ð>Ð>Øˆs�4‰yŒyÐr*   c                ó*   — |                       ¦   «         S r"   rØ   rA   s    r'   ÚIzMatrixExpr.I  s   € à�|Š|‰~Œ~Ðr*   c                óÂ   — d„ } ||¦  «        oQ ||¦  «        oF| j         d u p|| j          k    dk    o|| j         k     dk    o|| j         k    dk    o|| j        k     dk    S )Nc                óR   — t          | t          t          t          t          f¦  «        S r"   )r~   Úintr   r   r   )Úidxs    r'   Úis_validz(MatrixExpr.valid_index.<locals>.is_valid  s   € Ý˜c¥C­µ&½$Ð#?Ñ@Ô@Ð@r*   F)ru   rz   )rB   rÆ   rÇ   rã   s       r'   Úvalid_indexzMatrixExpr.valid_index  s™   € ð	Að 	Að 	Aà�˜‘”ð H  ¨¡¤ð HØ”˜dÐ"ð HØ�t”y�j’ UÒ*ÐG°°D´I²À%Ò/GðHð �t”y�j’ UÒ*ðHð 12°D´I²À%Ò/Gð	Ir*   c                ó  — t          |t          ¦  «        s(t          |t          ¦  «        rddlm}  || |d¦  «        S t          |t          ¦  «        r¹t          |¦  «        dk    r¦|\  }}t          |t          ¦  «        st          |t          ¦  «        rddlm}  || ||¦  «        S t          |¦  «        t          |¦  «        }}|                      ||¦  «        dk    r|                      ||¦  «        S t          d|›d|›d�¦  «        ‚t          |t          t          f¦  «        r–| j        \  }}t          |t          ¦  «        st          t          d	¦  «        ¦  «        ‚t          |¦  «        }||z  }||z  }|                      ||¦  «        dk    r|                      ||¦  «        S t          d
|z  ¦  «        ‚t          |t          t          f¦  «        rt          t          d¦  «        ¦  «        ‚t          d| z  ¦  «        ‚)Nr   )ÚMatrixSlice)r   Nry   rŽ   Fz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~   ÚtupleÚsliceÚ sympy.matrices.expressions.sliceræ   Úlenr   rä   rÈ   Ú
IndexErrorr   r   rC   r   r   r   )rB   Úkeyræ   rÆ   rÇ   ru   rz   s          r'   Ú__getitem__zMatrixExpr.__getitem__&  s&  € Ý˜#�uÑ%Ô%ð 	8­*°S½%Ñ*@Ô*@ð 	8ØDÐDÐDÐDÐDÐDØ�;˜t S¨,Ñ7Ô7Ð7Ý�c�5Ñ!Ô!ð 	*¥c¨#¡h¤h°!¢m mØ‰DˆAˆqÝ˜!�UÑ#Ô#ð /¥z°!µUÑ';Ô';ð /ØHÐHÐHÐHÐHÐHØ"�{ 4¨¨AÑ.Ô.Ð.Ý˜A‘;”;¥¨¡¤ˆqˆAØ×Ò  1Ñ%Ô%¨Ò.Ð.Ø—{’{ 1 aÑ(Ô(Ð(å �j¸q¸q¸qÀ!À!À!Ð!DÑEÔEÐEÝ˜�j­'Ð2Ñ3Ô3ð 	*àœ‰JˆD�$å˜d¥GÑ,Ô,ð .Ý ¥ð -,ñ "-ô "-ñ .ô .ð .õ ˜3‘-”-ˆCØ�t‘ˆAØ�d‘
ˆAØ×Ò  1Ñ%Ô%¨Ò.Ð.Ø—{’{ 1 aÑ(Ô(Ð(å Ð!3°cÑ!9Ñ:Ô:Ð:Ý˜�f¥d˜^Ñ,Ô,ð 	*Ý�Zð )(ñ )ô )ñ *ô *ð *õ Ð8¸4Ñ?Ñ@Ô@Ð@r*   c                óŠ   — t          | j        t          t          f¦  «         p!t          | j        t          t          f¦  «         S r"   )r~   ru   r   r   rz   rA   s    r'   Ú_is_shape_symboliczMatrixExpr._is_shape_symbolicI  s<   € Ý˜tœy­:µwÐ*?Ñ@Ô@Ð@ð @Ý˜dœi­*µgÐ)>Ñ?Ô?Ð?ð	Ar*   c                ó¨   ‡ — ‰                       ¦   «         rt          d¦  «        ‚ddlm}  |ˆ fd„t	          ‰ j        ¦  «        D ¦   «         ¦  «        S )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<Matrix with symbolic shape cannot be represented explicitly.r   ©ÚImmutableDenseMatrixc                óT   •‡— g | ]#Šˆˆfd „t          ‰j        ¦  «        D ¦   «         ‘Œ$S )c                ó$   •— g | ]}‰‰|f         ‘ŒS r+   r+   )r©   rÇ   rÆ   rB   s     €€r'   r«   z5MatrixExpr.as_explicit.<locals>.<listcomp>.<listcomp>j  s1   ø€ ð &7ð &7ð &7Ø !ð '+¨1¨a¨4¤jð &7ð &7ð &7r*   )Úrangerz   ©r©   rÆ   rB   s    @€r'   r«   z*MatrixExpr.as_explicit.<locals>.<listcomp>j  sZ   øø€ ð %7ð %7ð %7à !ð&7ð &7ð &7ð &7ð &7Ý%*¨4¬9Ñ%5Ô%5ð&7ñ &7ô &7ð %7ð %7ð %7r*   )rð   r¾   Úsympy.matrices.immutableró   rö   ru   )rB   ró   s   ` r'   Úas_explicitzMatrixExpr.as_explicitM  sŠ   ø€ ð0 ×"Ò"Ñ$Ô$ð 	5Ýð4ñ5ô 5ð 5ð 	BÐAÐAÐAÐAÐAØ#Ð#ð %7ð %7ð %7ð %7å%*¨4¬9Ñ%5Ô%5ð%7ñ %7ô %7ñ 8ô 8ð 	8r*   c                óN   — |                       ¦   «                              ¦   «         S )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_mutablerA   s    r'   rû   zMatrixExpr.as_mutablen  s"   € ð. ×ÒÑ!Ô!×,Ò,Ñ.Ô.Ð.r*   c                óà   — |�|st          d¦  «        ‚ddlm}  || j        t          ¬¦  «        }t          | j        ¦  «        D ](}t          | j        ¦  «        D ]}| ||f         |||f<   ŒŒ)|S )Nz=Cannot implement copy=False when converting Matrix to ndarrayr   )Úempty)Údtype)Ú	TypeErrorÚnumpyrý   rC   Úobjectrö   ru   rz   )rB   rþ   Úcopyrý   r#   rÆ   rÇ   s          r'   Ú	__array__zMatrixExpr.__array__‡  s—   € ØÐ DÐÝÐ[Ñ\Ô\Ð\ØÐÐÐÐÐØˆE�$”*¥FÐ+Ñ+Ô+ˆÝ�t”yÑ!Ô!ð 	%ð 	%ˆAÝ˜4œ9Ñ%Ô%ð %ð %�Ø˜q !˜tœ*��!�Q�$‘�ð%àˆr*   c                óP   — |                       ¦   «                              |¦  «        S )zÅ
        Test elementwise equality between matrices, potentially of different
        types

        >>> from sympy import Identity, eye
        >>> Identity(3).equals(eye(3))
        True
        )rù   ÚequalsrW   s     r'   r  zMatrixExpr.equals‘  s$   € ð ×ÒÑ!Ô!×(Ò(¨Ñ/Ô/Ð/r*   c                ó   — | S r"   r+   rA   s    r'   ÚcanonicalizezMatrixExpr.canonicalizeœ  ó   € Øˆr*   c                ó8   — t           j        t          | ¦  «        fS r"   )r   rË   rK   rA   s    r'   Úas_coeff_mmulzMatrixExpr.as_coeff_mmulŸ  s   € ÝŒu•f˜T‘l”lÐ"Ð"r*   c                óª   — ddl m} ddlm} g }|�|                     |¦  «         |�|                     |¦  «          || |¬¦  «        } ||¦  «        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_array©Úconvert_array_to_matrixN)Úfirst_indices)Ú4sympy.tensor.array.expressions.from_indexed_to_arrayr  Ú3sympy.tensor.array.expressions.from_array_to_matrixr  Úappend)ÚexprÚfirst_indexÚ
last_indexÚ
dimensionsr  r  r  Úarrs           r'   Úfrom_index_summationzMatrixExpr.from_index_summation¢  s‰   € ðT 	bÐaÐaÐaÐaÐaØ_Ð_Ð_Ð_Ð_Ð_ØˆØÐ"Ø× Ò  Ñ-Ô-Ð-ØÐ!Ø× Ò  Ñ,Ô,Ð,Ø&Ð& t¸=ÐIÑIÔIˆØ&Ð& sÑ+Ô+Ð+r*   c                ó&   — ddl m}  ||| ¦  «        S )Nry   )ÚElementwiseApplyFunction)Ú	applyfuncr  )rB   r%   r  s      r'   r  zMatrixExpr.applyfuncÖ  s'   € Ø7Ð7Ð7Ð7Ð7Ð7Ø'Ð'¨¨dÑ3Ô3Ð3r*   )r<   r=   )r<   r{   )T©F)r<   r1   )NNN)UrÄ   Ú
__module__Ú__qualname__Ú__doc__r0   Ú__annotations__Ú	_iterableÚ_op_priorityr2   r3   r4   Ú
is_InverseÚis_TransposeÚis_ZeroMatrixÚ	is_MatAddÚ	is_MatMulÚis_commutativeÚ	is_numberÚ	is_symbolÚ	is_scalarr   r5   r8   ÚpropertyrC   rG   rL   rP   rR   r-   ÚNotImplementedr   rX   rT   r^   r\   rc   re   r`   rh   rl   ri   rp   rn   ru   rz   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û   r  r  r  r  r
  Ústaticmethodr  r  Ú__classcell__)r¹   s   @r'   r/   r/   %   sí  ø€ € € € € € ðð ð$ "$€IÐ#Ð#Ð#Ñ#ð
 €Ià€Là€IÐÐÐÑØ€MÐÐÐÑØ!€KÐ!Ð!Ð!Ñ!Ø€JØ€LØ€MØ€IØ€Ià€NØ€IØ€IØ€Ià!�z‘|”|€DÐ#Ð#Ð#Ñ#ð3ð 3ð 3ð ð"ð "ð "ñ „Xð"ð ðð ñ „Xðð ðð ñ „Xðð2ð 2ð 2ð"ð "ð "ð €Z�˜Ñ(Ô(ØÐ˜:Ñ&Ô&ð*ð *ñ 'Ô&ñ )Ô(ð*ð €Z�˜Ñ(Ô(ØÐ˜9Ñ%Ô%ð*ð *ñ &Ô%ñ )Ô(ð*ð €Z�˜Ñ(Ô(ØÐ˜:Ñ&Ô&ð+ð +ñ 'Ô&ñ )Ô(ð+ð €Z�˜Ñ(Ô(ØÐ˜9Ñ%Ô%ð+ð +ñ &Ô%ñ )Ô(ð+ð €Z�˜Ñ(Ô(ØÐ˜:Ñ&Ô&ð*ð *ñ 'Ô&ñ )Ô(ð*ð €Z�˜Ñ(Ô(ØÐ˜:Ñ&Ô&ð*ð *ñ 'Ô&ñ )Ô(ð*ð €Z�˜Ñ(Ô(ØÐ˜9Ñ%Ô%ð*ð *ñ &Ô%ñ )Ô(ð*ð €Z�˜Ñ(Ô(ØÐ˜9Ñ%Ô%ð*ð *ñ &Ô%ñ )Ô(ð*ð €Z�˜Ñ(Ô(ØÐ˜:Ñ&Ô&ð*ð *ñ 'Ô&ñ )Ô(ð*ð €Z�˜Ñ(Ô(ØÐ˜9Ñ%Ô%ð>ð >ñ &Ô%ñ )Ô(ð>ð €Z�˜Ñ(Ô(ØÐ˜>Ñ*Ô*ð+ð +ñ +Ô*ñ )Ô(ð+ð €Z�˜Ñ(Ô(ØÐ˜=Ñ)Ô)ð$ð $ñ *Ô)ñ )Ô(ð$ð ðð ñ „Xðð ðð ñ „Xðð ðð ð ñ „Xðð(ð (ð (ð)ð )ð )ð )ðð ð ð
ð ð ð!ð !ð !ðð ð ðð ð ð!ð !ð !ðJð Jð Jðð ð ð:ð :ð :ð+ð +ð +ð +ð +ð ð6ð 6ñ „[ð6ðIð Ið Iðð ð ðð ð ð ðð ð ðð ð ð ð ð  ñ „Xð ð$ð $ð $ð
ð ð ðð ð ð ðð ñ „XððIð Ið Ið!Að !Að !AðFAð Að Að Að8ð 8ð 8ðB/ð /ð /ð2 %¨4ð ð ð ð ð	0ð 	0ð 	0ðð ð ð#ð #ð #ð ð1,ð 1,ð 1,ñ „\ð1,ðf4ð 4ð 4ð 4ð 4ð 4ð 4r*   r/   c                ó   — dS )NFr+   ©ÚlhsÚrhss     r'   Ú_eval_is_eqr5  Û  s   € àˆ5r*   c                óB   — | j         |j         k    rdS | |z
  j        rdS d S )NFT)rC   r%  r2  s     r'   r5  r5  ß  s4   € à
„y�C”IÒÐØˆuØˆc‰	Ô ð Øˆtðð r*   c                ó   ‡ — ˆ fd„}|S )Nc                óô  •— t           t          t          t          i‰         }g }g }| j        D ]B}t          |t          ¦  «        r|                     |¦  «         Œ-|                     |¦  «         ŒC|s‰                     |¦  «        S |r�‰t           k    rbt          t          |¦  «        ¦  «        D ]D}||         j        s5||                              ‰                     |¦  «        ¦  «        ||<   g } nŒEn0‰                     | ||Ž                      d¬¦  «        gz   ¦  «        S |t          k    r ||Ž                      d¬¦  «        S  |‰                     |¦  «        g|¢R Ž                      d¬¦  «        S )NF)r‰   )r	   rK   r
   rF   r:   r~   r/   r  Ú
_from_argsrö   rë   r3   rc   rO   )r  Ú	mat_classÚnonmatricesÚmatricesÚtermrÆ   r9   s         €r'   Ú_postprocessorz)get_postprocessor.<locals>._postprocessorç  s“  ø€ å�&¥#¥vÐ.¨sÔ3ˆ	ØˆØˆØ”Ið 	)ð 	)ˆDÝ˜$¥
Ñ+Ô+ð )Ø—’ Ñ%Ô%Ð%Ð%à×"Ò" 4Ñ(Ô(Ð(Ð(àð 	/Ø—>’> +Ñ.Ô.Ð.àð 	]Ø•cŠzˆzÝ�s 8™}œ}Ñ-Ô-ð ð �AØ# Aœ;Ô4ð ð '/¨q¤k×&9Ò&9¸#¿.º.ÈÑ:UÔ:UÑ&VÔ&V˜ ™Ø&(˜Ø˜ðøð —~’~ k°Y°YÀÐ5I×5NÒ5NÐTYÐ5NÑ5ZÔ5ZÐ4[Ñ&[Ñ\Ô\Ð\à�ÒÐØ�9˜hÐ'×,Ò,°%Ð,Ñ8Ô8Ð8Øˆy˜Ÿš¨Ñ4Ô4Ð@°xÐ@Ð@Ð@×EÒEÈ5ÐEÑQÔQÐQr*   r+   )r9   r>  s   ` r'   Úget_postprocessorr?  æ  s*   ø€ ð"Rð "Rð "Rð "Rð "RðF Ðr*   )r	   r
   Fc                óê   — t          | t          ¦  «        st          |t          ¦  «        rd}|rt          | |¦  «        S ddlm} ddlm} ddlm}  || ¦  «        } |||¦  «        } ||¦  «        }|S )NTr   )Úconvert_matrix_to_array)Úarray_deriver  )	r~   r   Ú _matrix_derivative_old_algorithmÚ3sympy.tensor.array.expressions.from_matrix_to_arrayrA  Ú4sympy.tensor.array.expressions.arrayexpr_derivativesrB  r  r  )	r  rª   Úold_algorithmrA  rB  r  Ú
array_exprÚdiff_array_exprÚdiff_matrix_exprs	            r'   Ú_matrix_derivativerJ    s°   € å�$�
Ñ#Ô#ð ¥z°!µZÑ'@Ô'@ð àˆàð 9Ý/°°aÑ8Ô8Ð8à[Ð[Ð[Ð[Ð[Ð[ØQÐQÐQÐQÐQÐQØ[Ð[Ð[Ð[Ð[Ð[à(Ð(¨Ñ.Ô.€JØ"�l :¨qÑ1Ô1€OØ.Ð.¨Ñ?Ô?ÐØÐr*   c                ó&  ‡‡‡	‡
— ddl m} |                      |¦  «        }d„ |D ¦   «         }ddlmŠ	 ˆ	fd„|D ¦   «         }d„ Šˆfd„Š
ˆ
fd„|D ¦   «         }|d         }d	„ Š|d
k    r t          j        ˆfd„|D ¦   «         ¦  «        S  || |¦  «        S )Nr   )ÚArrayDerivativec                ó6   — g | ]}|                      ¦   «         ‘ŒS r+   )Úbuild©r©   rÆ   s     r'   r«   z4_matrix_derivative_old_algorithm.<locals>.<listcomp>*  s    € Ð&Ð&Ð&˜1ˆQ�WŠW‰YŒYÐ&Ð&Ð&r*   r  c                ó,   •— g | ]}ˆfd „|D ¦   «         ‘ŒS )c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r+   r+   )r©   rÇ   r  s     €r'   r«   z?_matrix_derivative_old_algorithm.<locals>.<listcomp>.<listcomp>.  s%   ø€ Ð4Ð4Ð4¨QÐ%Ð% aÑ(Ô(Ð4Ð4Ð4r*   r+   )r©   rÆ   r  s     €r'   r«   z4_matrix_derivative_old_algorithm.<locals>.<listcomp>.  s.   ø€ ÐDÐDÐD¸Ð4Ð4Ð4Ð4°!Ð4Ñ4Ô4ÐDÐDÐDr*   c                ó>   — t          | t          ¦  «        r| j        S dS )N©ry   ry   ©r~   r/   rC   ©Úelems    r'   Ú
_get_shapez4_matrix_derivative_old_algorithm.<locals>._get_shape0  s!   € Ý�d�JÑ'Ô'ð 	Ø”:ÐØˆtr*   c                ó:   •— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3  ó<   •K  — | ]} ‰|¦  «        D ]}|d vV — Œ	ŒdS )©ry   NNr+   )r©   rÆ   rÇ   rW  s      €r'   ú	<genexpr>zE_matrix_derivative_old_algorithm.<locals>.get_rank.<locals>.<genexpr>6  s=   øè è € ÐLÐL¨!¸j¸jÈ¹m¼mÐLÐL¸�1˜IÐ%ÐLÐLÐLÐLÐLÐLÐLr*   )Úsum)ÚpartsrW  s    €r'   Úget_rankz2_matrix_derivative_old_algorithm.<locals>.get_rank5  s&   ø€ ÝÐLÐLÐLÐL¨uÐLÑLÔLÑLÔLÐLr*   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r+   r+   )r©   rÆ   r^  s     €r'   r«   z4_matrix_derivative_old_algorithm.<locals>.<listcomp>8  s!   ø€ Ð(Ð(Ð(˜QˆXˆX�a‰[Œ[Ð(Ð(Ð(r*   c                ód  — t          | ¦  «        dk    r| d         S | d d…         \  }}|j        r|j        }|t          d¦  «        k    r|}n|t          d¦  «        k    r|}n||z  }t          | ¦  «        dk    r|S |j        rt	          d¦  «        ‚|t          j        | dd …         ¦  «        z  S )Nry   r   rŽ   Ú )rë   r2   rÔ   ÚIdentityr¾   r	   Úfromiter)r]  Úp1Úp2Úpbases       r'   Úcontract_one_dimsz;_matrix_derivative_old_algorithm.<locals>.contract_one_dims;  s¼   € Ýˆu‰:Œ:˜Š?ˆ?Ø˜”8ˆOà˜2˜A˜2”Y‰FˆB�ØŒ|ð Ø”T�Ø•X˜a‘[”[Ò Ð Ø��Ø•x ‘{”{Ò"Ð"Ø��à˜2™�Ý�5‰zŒz˜QŠˆØ�à”?ð )Ý$ R™.œ.Ð(Ø�Sœ\¨%°°°¬)Ñ4Ô4Ñ4Ð4r*   rŽ   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r+   r+   )r©   rÆ   rg  s     €r'   r«   z4_matrix_derivative_old_algorithm.<locals>.<listcomp>P  s%   ø€ ÐAÐAÐA°aÐ.Ð.¨qÑ1Ô1ÐAÐAÐAr*   )Ú$sympy.tensor.array.array_derivativesrL  Ú_eval_derivative_matrix_linesr  r  r
   rc  )r  rª   rL  Úlinesr]  ÚranksÚrankrW  rg  r  r^  s          @@@@r'   rC  rC  &  s  øøøø€ ØDÐDÐDÐDÐDÐDØ×.Ò.¨qÑ1Ô1€Eà&Ð& Ð&Ñ&Ô&€Eà[Ð[Ð[Ð[Ð[Ð[àDÐDÐDÐD¸eÐDÑDÔD€Eðð ð ð
Mð Mð Mð Mð Mð )Ð(Ð(Ð( %Ð(Ñ(Ô(€EØ�Œ8€Dð5ð 5ð 5ð( ˆq‚y€yÝŒ|ÐAÐAÐAÐA¸5ÐAÑAÔAÑBÔBÐBàˆ?˜4 Ñ#Ô#Ð#r*   c                  ó    — e Zd Z ed„ ¦  «        Z ed„ ¦  «        Z ed„ ¦  «        ZdZdZdZ	d„ Z
ed„ ¦   «         Zd„ Zed„ ¦   «         Zd	„ Zd
S )ÚMatrixElementc                ó   — | j         d         S rs   ©r:   rA   s    r'   ú<lambda>zMatrixElement.<lambda>V  s   €  4¤9¨Q¤<€ r*   c                ó   — | j         d         S rx   rq  rA   s    r'   rr  zMatrixElement.<lambda>W  ó   € ˜dœi¨œl€ r*   c                ó   — | j         d         S r�   rq  rA   s    r'   rr  zMatrixElement.<lambda>X  rt  r*   Tc                óò  — t          t          ||f¦  «        \  }}t          |t          ¦  «        rt	          |¦  «        }n t          |t
          ¦  «        r(|j        r|j        r
|||f         S t          |¦  «        }n8t          |¦  «        }t          |j        t          ¦  «        st          d¦  «        ‚ t          |dd„ ¦  «        ||¦  «        st          d¦  «        ‚t          j        | |||¦  «        }|S )Nz2First argument of MatrixElement should be a matrixrä   c                ó   — dS r}   r+   )r³   Úms     r'   rr  z'MatrixElement.__new__.<locals>.<lambda>j  s   € ¸T€ r*   zindices out of range)r7   r   r~   Ústrr   r   Ú
is_Integerr5   r   rÿ   Úgetattrrì   r   r8   ©r9   Únamer³   rx  Úobjs        r'   r8   zMatrixElement.__new__]  sõ   € Ý•8˜a ˜VÑ$Ô$‰ˆˆ1Ý�d�CÑ Ô ð 	9Ý˜$‘<”<ˆDˆDå˜$¥
Ñ+Ô+ð ZØ”<ð & A¤Lð &Ø  1 œ:Ð%Ý ‘~”~��å ‘~”~�Ý! $¤)­ZÑ8Ô8ð ZÝ#Ð$XÑYÔYÐYØB•7˜4 Ð0AÐ0AÑBÔBÀ1ÀaÑHÔHð 9Ý Ð!7Ñ8Ô8Ð8ÝŒl˜3  a¨Ñ+Ô+ˆØˆ
r*   c                ó   — | j         d         S rs   rq  rA   s    r'   ÚsymbolzMatrixElement.symbolo  s   € àŒy˜Œ|Ðr*   c                ó¢   ‡— ‰                      dd¦  «        }|rˆfd„| j        D ¦   «         }n| j        }|d         |d         |d         f         S )Nr‰   Tc                ó*   •— g | ]} |j         d i ‰¤Ž‘ŒS )r+   )rO   )r©   r,   rŠ   s     €r'   r«   z&MatrixElement.doit.<locals>.<listcomp>v  s+   ø€ Ð;Ð;Ð;¨#�H�C”HÐ%Ð%˜uÐ%Ð%Ð;Ð;Ð;r*   r   ry   rŽ   )Úgetr:   )rB   rŠ   r‰   r:   s    `  r'   rO   zMatrixElement.doits  s^   ø€ Ø�yŠy˜ Ñ&Ô&ˆØð 	Ø;Ð;Ð;Ð;°´Ð;Ñ;Ô;ˆDˆDà”9ˆDØ�AŒw�t˜A”w  Q¤Ð'Ô(Ð(r*   c                ó    — | j         dd …         S rx   rq  rA   s    r'   ÚindiceszMatrixElement.indices{  s   € àŒy˜˜˜Œ}Ðr*   c                ó<  — t          |t          ¦  «        s,| j                             |¦  «        | j        | j        f         S | j        d         }| j        j        \  }}||j        d         k    rYt          | j        d         |j        d         d|dz
  f¦  «        t          | j        d         |j        d         d|dz
  f¦  «        z  S t          |t          ¦  «        r“ddl
m} | j        dd …         \  }}t          dt          ¬¦  «        \  }}	|j        d         }
|
j        \  }} ||||f         |
||	f                              |¦  «        z  ||	|f         z  |d|dz
  f|	d|dz
  f¦  «         S |                      |j        d         ¦  «        rd S t          j        S )Nr   ry   rŽ   )ÚSumzz1, z2)r9   )r~   ro  ÚparentÚdiffrÆ   rÇ   r:   rC   r   r•   Úsympy.concrete.summationsr‡  r   r   rµ   r   ÚZero)rB   ÚvÚMrx  r³   r‡  rÆ   rÇ   Úi1Úi2ÚYÚr1Úr2s                r'   r·   zMatrixElement._eval_derivative  sš  € å˜!�]Ñ+Ô+ð 	7Ø”;×#Ò# AÑ&Ô& t¤v¨t¬v ~Ô6Ð6àŒI�aŒLˆàŒ{Ô ‰ˆˆ1à�”�q”	Š>ˆ>Ý! $¤)¨A¤,°´°q´	¸A¸qÀ¹s¸8ÑDÔDÝ! $¤)¨A¤,°´°q´	¸A¸qÀ¹s¸8ÑDÔDñEð Eõ �a�Ñ!Ô!ð 	[Ø5Ð5Ð5Ð5Ð5Ð5Ø”9˜Q˜R˜R”=‰DˆAˆqÝ˜X­5Ð1Ñ1Ô1‰FˆB�Ø”�q”	ˆAØ”W‰FˆB�Ø�C˜˜!˜R˜%œ  2 r 6¤§¢°Ñ!2Ô!2Ñ2°1°R¸°U´8Ñ;¸bÀ!ÀRÈÁT¸]ÈRÐQRÐTVÐWXÑTXÈMÑZÔZÐZÐZà�8Š8�A”F˜1”IÑÔð 	Ø�4åŒvˆr*   N)rÄ   r  r  r,  rˆ  rÆ   rÇ   Ú	_diff_wrtr*  r(  r8   r€  rO   r…  r·   r+   r*   r'   ro  ro  U  s¿   € € € € € ØˆXÐ/Ð/Ñ0Ô0€FØˆÐ*Ð*Ñ+Ô+€AØˆÐ*Ð*Ñ+Ô+€AØ€IØ€IØ€Nðð ð ð$ ðð ñ „Xðð)ð )ð )ð ðð ñ „Xððð ð ð ð r*   ro  c                  ó~   — e Zd ZdZdZdZdZd„ Zed„ ¦   «         Z	ed„ ¦   «         Z
d„ Zed„ ¦   «         Zd	„ Zd
„ Zd„ ZdS )ÚMatrixSymbola¦  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                ó  — t          |¦  «        t          |¦  «        }}|                      |¦  «         |                      |¦  «         t          |t          ¦  «        rt	          |¦  «        }t          j        | |||¦  «        }|S r"   )r   rÂ   r~   ry  r   r   r8   r|  s        r'   r8   zMatrixSymbol.__new__¯  sr   € Ý˜‰{Œ{�H Q™KœKˆ1ˆà�Š�qÑÔÐØ�Š�qÑÔÐå�d�CÑ Ô ð 	Ý�t‘9”9ˆDÝŒm˜C  q¨!Ñ,Ô,ˆØˆ
r*   c                ó6   — | j         d         | j         d         fS )Nry   rŽ   rq  rA   s    r'   rC   zMatrixSymbol.shapeº  s   € àŒy˜Œ|˜TœY qœ\Ð)Ð)r*   c                ó&   — | j         d         j        S rs   )r:   r}  rA   s    r'   r}  zMatrixSymbol.name¾  s   € àŒy˜Œ|Ô Ð r*   c                ó$   — t          | ||¦  «        S r"   )ro  rÅ   s       r'   rÈ   zMatrixSymbol._entryÂ  s   € Ý˜T 1 aÑ(Ô(Ð(r*   c                ó   — | hS r"   r+   rA   s    r'   Úfree_symbolszMatrixSymbol.free_symbolsÅ  s	   € àˆvˆr*   c                ó   — | S r"   r+   )rB   r;   s     r'   r®   zMatrixSymbol._eval_simplifyÉ  r  r*   c                óN   — t          | j        d         | j        d         ¦  «        S ©Nr   ry   )r¸   rC   )rB   rª   s     r'   r·   zMatrixSymbol._eval_derivativeÌ  s   € å˜$œ* Qœ-¨¬°A¬Ñ7Ô7Ð7r*   c                ó>  — | |k    r˜| j         d         dk    r&t          |j         d         | j         d         ¦  «        nt          j        }| j         d         dk    r&t          |j         d         | j         d         ¦  «        nt          j        }t	          ||g¦  «        gS | j         d         dk    rt          | j         d         ¦  «        nt          j        }| j         d         dk    rt          | j         d         ¦  «        nt          j        }t	          ||g¦  «        gS rž  )rC   r¸   r   r‹  Ú_LeftRightArgsrb  rË   )rB   rª   ÚfirstÚseconds       r'   rj  z*MatrixSymbol._eval_derivative_matrix_linesÐ  s  € Ø�1Š9ˆ9Ø=A¼ZÈ¼]ÈaÒ=OÐ=O•J˜qœw qœz¨4¬:°a¬=Ñ9Ô9Ð9ÕUVÔU[ˆEØ>B¼jÈ¼mÈqÒ>PÐ>P•Z ¤¨¤
¨D¬J°q¬MÑ:Ô:Ð:ÕVWÔV\ˆFÝ"Ø˜�ñô ð ð ð 04¬z¸!¬}ÀÒ/AÐ/A•H˜TœZ¨œ]Ñ+Ô+Ð+ÅqÄuˆEØ04´
¸1´ÀÒ0BÐ0B•X˜dœj¨œmÑ,Ô,Ð,ÍÌˆFÝ"Ø˜�ñô ð ð r*   N)rÄ   r  r  r  r(  r*  r“  r8   r,  rC   r}  rÈ   r›  r®   r·   rj  r+   r*   r'   r•  r•  š  sË   € € € € € ðð ð  €NØ€IØ€Ið	ð 	ð 	ð ð*ð *ñ „Xð*ð ð!ð !ñ „Xð!ð)ð )ð )ð ðð ñ „Xððð ð ð8ð 8ð 8ðð ð ð ð r*   r•  c                ó$   — d„ | j         D ¦   «         S )Nc                ó    — g | ]}|j         ¯	|‘ŒS r+   )r2   )r©   Úsyms     r'   r«   z"matrix_symbols.<locals>.<listcomp>à  s   € Ð>Ð>Ð>�C°´Ð>ˆCÐ>Ð>Ð>r*   )r›  ©r  s    r'   Úmatrix_symbolsr§  ß  s   € Ø>Ð>˜4Ô,Ð>Ñ>Ô>Ð>r*   c                  óØ   — e Zd ZdZej        fd„Zed„ ¦   «         Zej	        d„ ¦   «         Zed„ ¦   «         Z
e
j	        d„ ¦   «         Z
d„ Zd„ Zed	„ ¦   «         Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r   a‘  
    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                ó¤   — t          |¦  «        | _        | j        | _        d| _        d| _        | j        | _        d| _        d| _        || _        d S rž  )	ÚlistÚ_linesÚ_first_pointer_parentÚ_first_pointer_indexÚ_first_line_indexÚ_second_pointer_parentÚ_second_pointer_indexÚ_second_line_indexÚhigher)rB   rk  r²  s      r'   Ú__init__z_LeftRightArgs.__init__ñ  sN   € Ý˜5‘k”kˆŒØ%)¤[ˆÔ"Ø$%ˆÔ!Ø!"ˆÔØ&*¤kˆÔ#Ø%&ˆÔ"Ø"#ˆÔØˆŒˆˆr*   c                ó&   — | j         | j                 S r"   ©r¬  r­  rA   s    r'   Úfirst_pointerz_LeftRightArgs.first_pointerû  s   € àÔ)¨$Ô*CÔDÐDr*   c                ó$   — || j         | j        <   d S r"   rµ  ©rB   Úvalues     r'   r¶  z_LeftRightArgs.first_pointerÿ  s   € à@EˆÔ" 4Ô#<Ñ=Ð=Ð=r*   c                ó&   — | j         | j                 S r"   ©r¯  r°  rA   s    r'   Úsecond_pointerz_LeftRightArgs.second_pointer  s   € àÔ*¨4Ô+EÔFÐFr*   c                ó$   — || j         | j        <   d S r"   r»  r¸  s     r'   r¼  z_LeftRightArgs.second_pointer  s   € àBGˆÔ# DÔ$>Ñ?Ð?Ð?r*   c                óF   ‡ — ˆ fd„‰ j         D ¦   «         }d|›d‰ j        ›d�S )Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r+   ©Ú_buildr÷   s     €r'   r«   z+_LeftRightArgs.__repr__.<locals>.<listcomp>  s#   ø€ Ð5Ð5Ð5 A�—’˜Q‘”Ð5Ð5Ð5r*   z_LeftRightArgs(lines=z	, higher=rç   )r«  r²  )rB   Úbuilts   ` r'   Ú__repr__z_LeftRightArgs.__repr__  s:   ø€ Ø5Ð5Ð5Ð5¨¬Ð5Ñ5Ô5ˆˆàˆEˆEØŒKˆKˆKð
ð 	
r*   c                óœ   — | j         | j        c| _        | _         | j        | j        c| _        | _        | j        | j        c| _        | _        | S r"   )r¯  r¬  r°  r­  r±  r®  rA   s    r'   rÑ   z_LeftRightArgs.transpose  sR   € ØBFÔB]Ð_cÔ_yÐ?ˆÔ" DÔ$?Ø@DÔ@ZÐ\`Ô\uÐ=ˆÔ! 4Ô#=Ø:>Ô:QÐSWÔSiÐ7ˆÔ Ô 7Øˆr*   c                óî   — t          | t          ¦  «        r|                      ¦   «         S t          | t          ¦  «        r6t	          | ¦  «        dk    r| d         S  | d         d„ | d         D ¦   «         Ž S | S )Nry   r   c                óB   — g | ]}t                                |¦  «        ‘ŒS r+   )r   rÁ  rO  s     r'   r«   z)_LeftRightArgs._build.<locals>.<listcomp>   s&   € Ð KÐ KÐ K¸a¥×!6Ò!6°qÑ!9Ô!9Ð KÐ KÐ Kr*   )r~   r   rN  rª  rë   r¦  s    r'   rÁ  z_LeftRightArgs._build  su   € å�d�KÑ(Ô(ð 	 Ø—:’:‘<”<ÐÝ�d�DÑ!Ô!ð 	Ý�4‰yŒy˜AŠ~ˆ~Ø˜A”w�à�t˜A”wÐ KÐ KÀ4ÈÄ7Ð KÑ KÔ KÐLÐLàˆKr*   c                óž   ‡ — ˆ fd„‰ j         D ¦   «         }‰ j        dk    r|‰                      ‰ j        ¦  «        gz  }t          |¦  «        }|S )Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r+   rÀ  r÷   s     €r'   r«   z(_LeftRightArgs.build.<locals>.<listcomp>%  s#   ø€ Ð4Ð4Ð4 1�—’˜A‘”Ð4Ð4Ð4r*   ry   )r«  r²  rÁ  rª  )rB   Údatas   ` r'   rN  z_LeftRightArgs.build$  sV   ø€ Ø4Ð4Ð4Ð4¨¬Ð4Ñ4Ô4ˆØŒ;˜!ÒÐØ�T—[’[ ¤Ñ-Ô-Ð.Ñ.ˆDÝ�D‰zŒzˆØˆr*   c                óÆ  — | j         dk    r| j        dk    rt          d¦  «        ‚d„ } || j         ¦  «        d          || j        ¦  «        d         k    rf || j        ¦  «        dk    r| j         | j        d         z  S  || j         ¦  «        dk    r| j         d         | j        j        z  S t          d¦  «        ‚| j         dk    r| j         | j        j        z  S | j        S )Nry   z.higher dimensional array cannot be representedc                ó>   — t          | t          ¦  «        r| j        S dS )N)NNrT  rU  s    r'   rW  z._LeftRightArgs.matrix_form.<locals>._get_shape/  s!   € Ý˜$¥
Ñ+Ô+ð "Ø”zÐ!Ø�<r*   rS  )r   r   zincompatible shapes)r¡  r²  r¾   r¢  rÔ   )rB   rW  s     r'   Úmatrix_formz_LeftRightArgs.matrix_form+  só   € ØŒ:˜Š?ˆ?˜tœ{¨aÒ/Ð/ÝÐMÑNÔNÐNð	 ð 	 ð 	 ð
 ˆ:�d”jÑ!Ô! !Ô$¨
¨
°4´;Ñ(?Ô(?ÀÔ(BÒBÐBð ˆz˜$œ+Ñ&Ô&¨&Ò0Ð0Ø”z $¤+¨dÔ"3Ñ3Ð3Øˆz˜$œ*Ñ%Ô%¨Ò/Ð/Ø”z $Ô'¨¬¬Ñ5Ð5ÝÐ2Ñ3Ô3Ð3ØŒ:˜Š?ˆ?Ø”:˜dœkœmÑ+Ð+à”;Ðr*   c                óî   — d}| j         dk    r&|t          d„ | j         j        D ¦   «         ¦  «        z  }| j        dk    r&|t          d„ | j        j        D ¦   «         ¦  «        z  }| j        dk    r|dz  }|S )zl
        Number of dimensions different from trivial (warning: not related to
        matrix rank).
        r   ry   c              3  ó"   K  — | ]
}|d k    V — ŒdS rZ  r+   rO  s     r'   r[  z&_LeftRightArgs.rank.<locals>.<genexpr>H  s&   è è € Ð9Ð9 1˜˜QšÐ9Ð9Ð9Ð9Ð9Ð9r*   c              3  ó"   K  — | ]
}|d k    V — ŒdS rZ  r+   rO  s     r'   r[  z&_LeftRightArgs.rank.<locals>.<genexpr>J  s&   è è € Ð:Ð: 1˜˜QšÐ:Ð:Ð:Ð:Ð:Ð:r*   rŽ   )r¡  r\  rC   r¢  r²  )rB   rm  s     r'   rm  z_LeftRightArgs.rankA  sˆ   € ð
 ˆØŒ:˜Š?ˆ?Ø•CÐ9Ð9¨¬
Ô(8Ð9Ñ9Ô9Ñ9Ô9Ñ9ˆDØŒ;˜!ÒÐØ•CÐ:Ð:¨¬Ô(9Ð:Ñ:Ô:Ñ:Ô:Ñ:ˆDØŒ;˜!ÒÐØ�A‰IˆDØˆr*   c                óp   — ddl m} ddl m} t          |t          |||g¦  «        dg|j        ¬¦  «        }|S )Né   )ÚArrayTensorProduct)ÚArrayContraction)ry   rŽ   )Ú	validator)Ú*tensor.array.expressions.array_expressionsrÒ  rÓ  r   Ú	_validate)rB   ÚpointerrS   rÒ  rÓ  Úsubexprs         r'   Ú_multiply_pointerz _LeftRightArgs._multiply_pointerO  sq   € ØTÐTÐTÐTÐTÐTØRÐRÐRÐRÐRÐRåØåØ&àØðñô ð ð	ð 'Ô0ð
ñ 
ô 
ˆð ˆr*   c                ó&   — | xj         |z  c_         d S r"   )r¶  rW   s     r'   Úappend_firstz_LeftRightArgs.append_firstd  s   € ØÐÔ˜eÑ#ÐÔÐÐr*   c                ó&   — | xj         |z  c_         d S r"   )r¼  rW   s     r'   Úappend_secondz_LeftRightArgs.append_secondg  s   € ØÐÔ˜uÑ$ÐÔÐÐr*   N)rÄ   r  r  r  r   rË   r³  r,  r¶  Úsetterr¼  rÃ  rÑ   r/  rÁ  rN  rÌ  rm  rÙ  rÛ  rÝ  r+   r*   r'   r   r   ã  sL  € € € € € ðð ð &'¤Uð ð ð ð ð ðEð Eñ „XðEð ÔðFð Fñ ÔðFð ðGð Gñ „XðGð ÔðHð Hñ ÔðHð
ð 
ð 
ðð ð ð ð	ð 	ñ „\ð	ðð ð ðð ð ð,ð ð ðð ð ð*$ð $ð $ð%ð %ð %ð %ð %r*   r   c                óV   — ddl m} t          | t          ¦  «        r| S  || gg¦  «        S )Nr   rò   )rø   ró   r~   r/   )rª   ró   s     r'   Ú_make_matrixrà  k  s@   € Ø=Ð=Ð=Ð=Ð=Ð=Ý�!•ZÑ Ô ð ØˆØÐ !  Ñ&Ô&Ð&r*   ry   rJ   rE   r£   r�   r”   )r¸   rb  r™   r"   r  )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-   r/   r5  r?  Ú"_constructor_postprocessor_mappingrJ  rC  ro  r•  r§  r   rà  ÚmatmulrK   ÚmataddrF   Úmatpowrk   rÑ   r„   rÖ   r•   Úspecialr¸   rb  Údeterminantrš   r+   r*   r'   ú<module>rø     s·  ðØ "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð à 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø &Ð &Ð &Ð &Ð &Ð &Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø *Ð *Ð *Ð *Ð *Ð *Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø CÐ CÐ CÐ CÐ CÐ CØ :Ð :Ð :Ð :Ð :Ð :Ø *Ð *Ð *Ð *Ð *Ð *Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø +Ð +Ð +Ð +Ð +Ð +Ø +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð s4ð s4ð s4ð s4ð s4�ñ s4ô s4ð s4ðl 
€ˆ*�dÑÔðð ñ Ôðð 
€ˆ*�jÑ!Ô!ðð ñ "Ô!ðð$ð $ð $ðP Ð˜cÑ"Ô"Ð#ØÐ˜cÑ"Ô"Ð#ð8ð 8€Ô (¨Ñ 4ðð ð ð ð&,$ð ,$ð ,$ð^Bð Bð Bð Bð B�Dñ Bô Bð BðJBð Bð Bð Bð B�:ñ Bô Bð BðJ?ð ?ð ?ðE%ð E%ð E%ð E%ð E%ñ E%ô E%ð E%ðP'ð 'ð 'ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $r*   