ó
    ‰*£hò  ã                   ó„   • S SK Jr  S SKJrJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S SKJr   " S	 S
\5      rS rg)é    )ÚBasic)ÚExprÚExprBuilder)ÚS)Údefault_sort_key)Úuniquely_named_symbol)Úsympify)Ú
MatrixBase)ÚNonSquareMatrixErrorc                   ó`   • \ rS rSrSrSrSrS rS rS r	S r
\S 5       rS	 rS
 rS rS rSrg)ÚTraceé   a  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                 óÈ   • [        U5      nUR                  (       d  [        S[        U5      -  5      eUR                  SL a  [        S5      e[        R                  " X5      $ )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     Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/matrices/expressions/trace.pyr   ÚTrace.__new__"   sN   € Ü�c‹lˆà�}�}ÜÐAÄCÈÃHÑLÓMÐMà�=‰=˜EÒ!Ü&Ð'EÓFÐFä�}Š}˜SÓ&Ð&ó    c                 ó   • U $ ©N© ©Úselfs    r   Ú_eval_transposeÚTrace._eval_transpose-   s   € Øˆr   c                 óò   • SSK Jn  SSKJn  [	        X5      (       a   U R                  U5      R                  U5      $ U R                  5       n[	        U[        5      (       a  [        eUR                  U5      $ )Nr   ©ÚSumé   )ÚMatrixElement)Úsympy.concrete.summationsr#   Úmatexprr%   Ú
isinstanceÚrewriteÚdiffÚdoitr   ÚNotImplementedErrorÚ_eval_derivative)r   Úvr#   r%   Úexprs        r   r-   ÚTrace._eval_derivative0   s\   € Ý1Ý*Ü�a×'Ñ'Ø—<‘< Ó$×)Ñ)¨!Ó,Ð,Ø�y‰y‹{ˆÜ�dœE×"Ñ"ä%Ð%Ø×$Ñ$ QÓ'Ð'r   c           
      ó>  • SSK JnJn  U R                  S   R	                  U5      nU Hð  nUR
                  S:X  aC  [        U[        UUR                  S   UR                  S   /5      S/UR                  S9Ul        OE[        U[        UUR                  S   UR                  S   UR
                  /5      SS/5      Ul        [        R                  [        R                  /Ul        UR                  Ul        UR                  Ul        SUl        SUl        Mò     U$ )Nr   )ÚArrayTensorProductÚArrayContractionr$   )r$   é   )Ú	validator)r   é   )Ú0sympy.tensor.array.expressions.array_expressionsr2   r3   ÚargsÚ_eval_derivative_matrix_linesÚhigherr   Ú_linesÚ	_validater   ÚOneÚ_first_pointer_parentÚ_second_pointer_parentÚ_first_pointer_indexÚ_second_pointer_index)r   Úxr2   r3   ÚrÚlrs         r   r9   Ú#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                 ó    • U R                   S   $ )Nr   )r8   r   s    r   ÚargÚ	Trace.arge   s   € à�y‰y˜‰|Ðr   c                 ó:  • UR                  SS5      (       a<  U R                  R                  " S0 UD6nUR                  5       nUb  U$ [	        U5      $ [        U R                  [        5      (       a  [        U R                  5      $ [	        U R                  5      $ )NÚdeepTr   )ÚgetrG   r+   Ú_eval_tracer   r(   r
   Útrace)r   ÚhintsrG   Úresults       r   r+   Ú
Trace.doiti   sx   € Ø�9‰9�V˜T×"Ñ"Ø—(‘(—-’-Ñ( %Ñ(ˆCØ—_‘_Ó&ˆFØÑ!Ø�ä˜S“zÐ!ô ˜$Ÿ(™(¤J×/Ñ/Ü˜TŸX™X“Ð&ä˜TŸX™X“Ð&r   c                 ód   • [        U R                  R                  5       5      R                  5       $ r   )r   rG   Úas_explicitr+   r   s    r   rR   ÚTrace.as_explicitx   s#   € Ü�T—X‘X×)Ñ)Ó+Ó,×1Ñ1Ó3Ð3r   c                 óä  ^^• SSK Jn  SSKJm  U R                  m[        TU5      (       aÄ  UU4S jn[        [        [        TR                  5      5      US9n[        TR                  U   T5      (       a@  T" T5      R                  5       m[        [        [        TR                  5      5      U4S jS9nUR                  TR                  US  TR                  S U -   5      m[        T5      $ U $ )Nr   )ÚMatMul)Ú	Transposec                 ór   >• TR                   U    n[        UT5      (       a  UR                  n[        U5      $ r   )r8   r(   rG   r   )rB   ÚarV   Ú	trace_args     €€r   Úget_arg_keyÚ%Trace._normalize.<locals>.get_arg_key„   s2   ø€ Ø—N‘N 1Ñ%�Ü˜a ×+Ñ+ØŸ™�AÜ'¨Ó*Ð*r   )Úkeyc                 ó4   >• [        TR                  U    5      $ r   )r   r8   )rB   rY   s    €r   Ú<lambda>Ú"Trace._normalize.<locals>.<lambda>�   s   ø€ ÔGWÐXa×XfÑXfÐghÑXiÔGjr   )Ú!sympy.matrices.expressions.matmulrU   Ú$sympy.matrices.expressions.transposerV   rG   r(   ÚminÚrangeÚlenr8   r+   Úfromiterr   )r   rU   rZ   ÚindminrV   rY   s       @@r   Ú
_normalizeÚ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                 óª   • SSK Jn  [        SU/5      nU" U R                  XD4   USU R                  R                  S-
  45      nUR                  5       $ )Nr   r"   Úir$   )r&   r#   r   rG   Úrowsr+   )r   r/   Úkwargsr#   rj   Úss         r   Ú_eval_rewrite_as_SumÚTrace._eval_rewrite_as_Sum’   sH   € Ý1Ü! #¨ vÓ.ˆÙ�—‘˜˜‘  A t§x¡x§}¡}°qÑ'8Ð 9Ó:ˆØ�v‰v‹xˆr   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úis_TraceÚis_commutativer   r   r-   r9   ÚpropertyrG   r+   rR   rg   rn   Ú__static_attributes__r   r   r   r   r      sP   † ñð& €HØ€Nò	'òò	(ò(ðT ñó ðò'ò4òõ.r   r   c                 ó4   • [        U 5      R                  5       $ )zò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   rM   rM   ™   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   rM   r   r   r   Ú<module>r‚      s1   ðÝ "ß -Ý "Ý /Ý 3Ý &Ý 0Ý :ôKˆDô Kó\r   