Ë
    7^(hò  ã                   ó„   — 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y)é    )ÚBasic)ÚExprÚExprBuilder)ÚS)Údefault_sort_key)Úuniquely_named_symbol)Úsympify)Ú
MatrixBase)ÚNonSquareMatrixErrorc                   óX   — 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y)Ú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/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/matrices/expressions/trace.pyr   zTrace.__new__"   sP   € Ü�c‹lˆà�}Š}ÜÐAÄCÈÃHÑLÓMÐMà�=‰=˜EÑ!Ü&Ð'EÓ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 | j                  |«      j                  |«      S | j                  «       }t	        |t        «      rt        ‚|j                  |«      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   sX   € Ý1Ý*Ü�a˜Ô'Ø—<‘< Ó$×)Ñ)¨!Ó,Ð,Ø�y‰y‹{ˆÜ�dœEÔ"ä%Ð%Ø×$Ñ$ QÓ'Ð'r   c           
      ó>  — ddl m}m} | j                  d   j	                  |«      }|D ]ñ  }|j
                  dk(  rFt        |t        ||j                  d   |j                  d   g«      dg|j                  ¬«      |_        nEt        |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�a‰L×6Ñ6°qÓ9ˆØò $	)ˆBØ�y‰y˜AŠ~Ü'Ø$ä#Ø.à "§	¡	¨!¡Ø "§	¡	¨!¡ðóð ð	ð /×8Ñ8ô�•	ô  (Ø$ä#Ø.à "§	¡	¨!¡Ø "§	¡	¨!¡Ø "§	¡	ðóð  ð
ó�”	ô Ÿ™¤§¡˜ˆBŒIØ')§y¡yˆBÔ$Ø(*¯	©	ˆBÔ%Ø&'ˆBÔ#Ø'(ˆBÕ$ðI$	)ðJ ˆr   c                 ó    — | j                   d   S )Nr   )r4   r   s    r   Úargz	Trace.arge   s   € à�y‰y˜‰|Ðr   c                 ó$  — |j                  dd«      r; | j                  j                  di |¤Ž}|j                  «       }|�|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   st   € Ø�9‰9�V˜TÔ"Ø�$—(‘(—-‘-Ñ( %Ñ(ˆCØ—_‘_Ó&ˆFØÐ!Ø�ä˜S“zÐ!ô ˜$Ÿ(™(¤JÔ/Ü˜TŸX™X“Ð&ä˜TŸX™X“Ð&r   c                 ód   — t        | j                  j                  «       «      j                  «       S r   )r   rB   Úas_explicitr(   r   s    r   rK   zTrace.as_explicitx   s#   € Ü�T—X‘X×)Ñ)Ó+Ó,×1Ñ1Ó3Ð3r   c                 óØ  ‡‡— ddl m} ddlmŠ | j                  Št        ‰|«      rÃˆˆfd„}t        t        t        ‰j                  «      «      |¬«      }t        ‰j                  |   ‰«      rB ‰‰«      j                  «       Št        t        t        ‰j                  «      «      ˆfd„¬«      }|j                  ‰j                  |d  ‰j                  d | z   «      Št        ‰«      S | S )Nr   )ÚMatMul)Ú	Transposec                 óh   •— ‰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„   s/   ø€ Ø—N‘N 1Ñ%�Ü˜a Ô+ØŸ™�AÜ'¨Ó*Ð*r   )Úkeyc                 ó4   •— t        ‰j                  |    «      S r   )r   r4   )r>   rQ   s    €r   ú<lambda>z"Trace._normalize.<locals>.<lambda>�   s   ø€ ÔGWÐXa×XfÑXfÐghÑXiÓ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Ø—H‘Hˆ	Ü�i Ô(õ+ô œœs 9§>¡>Ó2Ó3¸ÔEˆFÜ˜)Ÿ.™.¨Ñ0°)Ô<Ù% iÓ0×5Ñ5Ó7�	ÜœU¤3 y§~¡~Ó#6Ó7Ó=jÔk�ØŸ™¨	¯©°v°wÐ(?À)Ç.Á.ÐQXÐRXÐBYÑ(YÓZˆIÜ˜Ó#Ð#Øˆr   c                 ó¬   — ddl m} t        d|g«      } || j                  ||f   |d| j                  j                  dz
  f«      }|j                  «       S )Nr   r   Úir!   )r#   r    r   rB   Úrowsr(   )r   r,   Úkwargsr    r_   Úss         r   Ú_eval_rewrite_as_SumzTrace._eval_rewrite_as_Sum’   sJ   € Ý1Ü! #¨ vÓ.ˆÙ�—‘˜˜A˜‘  A t§x¡x§}¡}°qÑ'8Ð 9Ó:ˆØ�v‰v‹xˆr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úis_TraceÚis_commutativer   r   r*   r5   ÚpropertyrB   r(   rK   r]   rc   r   r   r   r   r      sP   „ ñð& €HØ€Nò	'òò	(ò(ðT ñó ðò'ò4òó.r   r   c                 ó4   — t        | «      j                  «       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      s1   ðÝ "ß -Ý "Ý /Ý 3Ý &Ý 0Ý :ôKˆDô Kó\r   