§
    OŠtjò  ã                   óŒ   — 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  G d	„ d
e¦  «        Zd„ ZdS )é    )ÚBasic)ÚExprÚExprBuilder)ÚS)Údefault_sort_key)Úuniquely_named_symbol)Úsympify)Ú
MatrixBase)ÚNonSquareMatrixErrorc                   ó`   — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	e
d„ ¦   «         Zd„ Zd	„ Zd
„ Zd„ ZdS )ÚTraceaS  Matrix Trace

    Represents the trace of a matrix expression.

    Examples
    ========

    >>> from sympy import MatrixSymbol, Trace, eye
    >>> A = MatrixSymbol('A', 3, 3)
    >>> Trace(A)
    Trace(A)
    >>> Trace(eye(3))
    Trace(Matrix([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]]))
    >>> Trace(eye(3)).simplify()
    3
    Tc                 óÆ   — t          |¦  «        }|j        st          dt          |¦  «        z  ¦  «        ‚|j        du rt          d¦  «        ‚t          j        | |¦  «        S )Nz#input to Trace, %s, is not a matrixFzTrace of a non-square matrix)r	   Ú	is_MatrixÚ	TypeErrorÚstrÚ	is_squarer   r   Ú__new__)ÚclsÚmats     ú^/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/matrices/expressions/trace.pyr   zTrace.__new__"   s`   € Ý�c‰lŒlˆàŒ}ð 	NÝÐAÅCÈÁHÄHÑLÑMÔMÐMàŒ=˜EÐ!Ð!Ý&Ð'EÑFÔFÐFåŒ}˜S #Ñ&Ô&Ð&ó    c                 ó   — | S ©N© ©Úselfs    r   Ú_eval_transposezTrace._eval_transpose-   s   € Øˆr   c                 ó  — ddl m} ddlm} t	          ||¦  «        r(|                      |¦  «                             |¦  «        S |                      ¦   «         }t	          |t          ¦  «        rt          ‚| 
                    |¦  «        S )Nr   ©ÚSumé   )ÚMatrixElement)Úsympy.concrete.summationsr    Úmatexprr"   Ú
isinstanceÚrewriteÚdiffÚdoitr   ÚNotImplementedErrorÚ_eval_derivative)r   Úvr    r"   Úexprs        r   r*   zTrace._eval_derivative0   s‘   € Ø1Ð1Ð1Ð1Ð1Ð1Ø*Ð*Ð*Ð*Ð*Ð*Ý�a˜Ñ'Ô'ð 	-Ø—<’< Ñ$Ô$×)Ò)¨!Ñ,Ô,Ð,Ø�yŠy‰{Œ{ˆÝ�d�EÑ"Ô"ð 	&å%Ð%Ø×$Ò$ QÑ'Ô'Ð'r   c           
      ó  — ddl m}m} | j        d                              |¦  «        }|D ]Ù}|j        dk    rEt          |t          ||j        d         |j        d         g¦  «        dg|j        ¬¦  «        |_        nDt          |t          ||j        d         |j        d         |j        g¦  «        ddg¦  «        |_        t          j
        t          j
        g|_        |j        |_        |j        |_        d|_        d|_        ŒÚ|S )Nr   )ÚArrayTensorProductÚArrayContractionr!   )r!   é   )Ú	validator)r   é   )Ú0sympy.tensor.array.expressions.array_expressionsr.   r/   ÚargsÚ_eval_derivative_matrix_linesÚhigherr   Ú_linesÚ	_validater   ÚOneÚ_first_pointer_parentÚ_second_pointer_parentÚ_first_pointer_indexÚ_second_pointer_index)r   Úxr.   r/   ÚrÚlrs         r   r5   z#Trace._eval_derivative_matrix_lines;   s,  € ØiÐiÐiÐiÐiÐiÐiÐiØŒI�aŒL×6Ò6°qÑ9Ô9ˆØð $	)ð $	)ˆBØŒy˜AŠ~ˆ~Ý'Ø$å#Ø.à "¤	¨!¤Ø "¤	¨!¤ðñô ð ð	ð /Ô8ðñ ô �”	�	õ  (Ø$å#Ø.à "¤	¨!¤Ø "¤	¨!¤Ø "¤	ðñô ð  ð
ñô �”	õ œ¥¤˜ˆBŒIØ')¤yˆBÔ$Ø(*¬	ˆBÔ%Ø&'ˆBÔ#Ø'(ˆBÔ$Ð$Øˆr   c                 ó   — | j         d         S )Nr   )r4   r   s    r   Úargz	Trace.arge   s   € àŒy˜Œ|Ðr   c                 ó$  — |                      dd¦  «        r9 | j        j        di |¤Ž}|                     ¦   «         }|�|S t	          |¦  «        S t          | j        t          ¦  «        rt          | j        ¦  «        S t	          | j        ¦  «        S )NÚdeepTr   )ÚgetrB   r(   Ú_eval_tracer   r%   r
   Útrace)r   ÚhintsrB   Úresults       r   r(   z
Trace.doiti   s‰   € Ø�9Š9�V˜TÑ"Ô"ð 	'Ø�$”(”-Ð(Ð( %Ð(Ð(ˆCØ—_’_Ñ&Ô&ˆFØÐ!Ø�å˜S‘z”zÐ!õ ˜$œ(¥JÑ/Ô/ð 'Ý˜TœX‘”Ð&å˜TœX‘”Ð&r   c                 ór   — t          | j                             ¦   «         ¦  «                             ¦   «         S r   )r   rB   Úas_explicitr(   r   s    r   rK   zTrace.as_explicitx   s*   € Ý�T”X×)Ò)Ñ+Ô+Ñ,Ô,×1Ò1Ñ3Ô3Ð3r   c                 ó  ‡‡— ddl m} ddlmŠ | j        Št          ‰|¦  «        râˆˆfd„}t          t          t          ‰j	        ¦  «        ¦  «        |¬¦  «        }t          ‰j	        |         ‰¦  «        rP ‰‰¦  «         
                    ¦   «         Št          t          t          ‰j	        ¦  «        ¦  «        ˆfd„¬¦  «        }|                     ‰j	        |d …         ‰j	        d |…         z   ¦  «        Št          ‰¦  «        S | S )Nr   )ÚMatMul)Ú	Transposec                 ój   •— ‰j         |          }t          |‰¦  «        r|j        }t          |¦  «        S r   )r4   r%   rB   r   )r>   ÚarN   Ú	trace_args     €€r   Úget_arg_keyz%Trace._normalize.<locals>.get_arg_key„   s6   ø€ Ø”N 1Ô%�Ý˜a Ñ+Ô+ð Øœ�AÝ'¨Ñ*Ô*Ð*r   )Úkeyc                 ó8   •— t          ‰j        |          ¦  «        S r   )r   r4   )r>   rQ   s    €r   ú<lambda>z"Trace._normalize.<locals>.<lambda>�   s   ø€ ÕGWÐXaÔXfÐghÔXiÑGjÔGj€ r   )Ú!sympy.matrices.expressions.matmulrM   Ú$sympy.matrices.expressions.transposerN   rB   r%   ÚminÚrangeÚlenr4   r(   Úfromiterr   )r   rM   rR   ÚindminrN   rQ   s       @@r   Ú
_normalizezTrace._normalize{   s,  øø€ ð 	=Ð<Ð<Ð<Ð<Ð<ØBÐBÐBÐBÐBÐBØ”Hˆ	Ý�i Ñ(Ô(ð 	$ð+ð +ð +ð +ð +ð +õ ��s 9¤>Ñ2Ô2Ñ3Ô3¸ÐEÑEÔEˆFÝ˜)œ.¨Ô0°)Ñ<Ô<ð lØ%˜I iÑ0Ô0×5Ò5Ñ7Ô7�	Ý�U¥3 y¤~Ñ#6Ô#6Ñ7Ô7Ð=jÐ=jÐ=jÐ=jÐkÑkÔk�ØŸš¨	¬°v°w°wÔ(?À)Ä.ÐQXÐRXÐQXÔBYÑ(YÑZÔZˆIÝ˜Ñ#Ô#Ð#Øˆr   c                 óª   — ddl m} t          d|g¦  «        } || j        ||f         |d| j        j        dz
  f¦  «        }|                     ¦   «         S )Nr   r   Úir!   )r#   r    r   rB   Úrowsr(   )r   r,   Úkwargsr    r_   Úss         r   Ú_eval_rewrite_as_SumzTrace._eval_rewrite_as_Sum’   s]   € Ø1Ð1Ð1Ð1Ð1Ð1Ý! #¨ vÑ.Ô.ˆØˆC�”˜˜A˜”  A t¤x¤}°qÑ'8Ð 9Ñ:Ô:ˆØ�vŠv‰xŒxˆr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úis_TraceÚis_commutativer   r   r*   r5   ÚpropertyrB   r(   rK   r]   rc   r   r   r   r   r      s¾   € € € € € ðð ð& €HØ€Nð	'ð 	'ð 	'ðð ð ð	(ð 	(ð 	(ð(ð (ð (ðT ðð ñ „Xðð'ð 'ð 'ð4ð 4ð 4ðð ð ð.ð ð ð ð r   r   c                 óD   — t          | ¦  «                             ¦   «         S )a  Trace of a Matrix.  Sum of the diagonal elements.

    Examples
    ========

    >>> from sympy import trace, Symbol, MatrixSymbol, eye
    >>> n = Symbol('n')
    >>> X = MatrixSymbol('X', n, n)  # A square matrix
    >>> trace(2*X)
    2*Trace(X)
    >>> trace(eye(3))
    3
    )r   r(   )r,   s    r   rG   rG   ™   s   € õ �‰;Œ;×ÒÑÔÐr   N)Úsympy.core.basicr   Úsympy.core.exprr   r   Úsympy.core.singletonr   Úsympy.core.sortingr   Úsympy.core.symbolr   Úsympy.core.sympifyr	   Úsympy.matrices.matrixbaser
   Úsympy.matrices.exceptionsr   r   rG   r   r   r   ú<module>rt      sç   ðØ "Ð "Ð "Ð "Ð "Ð "Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø "Ð "Ð "Ð "Ð "Ð "Ø /Ð /Ð /Ð /Ð /Ð /Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø &Ð &Ð &Ð &Ð &Ð &Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø :Ð :Ð :Ð :Ð :Ð :ðKð Kð Kð Kð KˆDñ Kô Kð Kð\ð ð ð ð r   