
    \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     X/var/www/auris/envauris/lib/python3.13/site-packages/sympy/matrices/expressions/trace.pyr   Trace.__new__"   sN    cl}}AC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''<<$))!,,yy{dE""%%$$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IIaL66q9ByyA~'$#. "		! "		! 	 /88	  ($#. "		! "		! "		 
	 BI')yyB$(*		B%&'B#'(B$I J r   c                      U R                   S   $ )Nr   )r8   r   s    r   arg	Trace.arge   s    yy|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    99VT""((--(%(C__&F!Sz! $((J//TXX&TXX&r   c                 d    [        U R                  R                  5       5      R                  5       $ r   )r   rG   as_explicitr+   r   s    r   rR   Trace.as_explicitx   s#    TXX))+,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    NN1%a++A'**r   )keyc                 4   > [        TR                  U    5      $ r   )r   r8   )rB   rY   s    r   <lambda>"Trace._normalize.<locals>.<lambda>   s    GWXaXfXfghXiGjr   )!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HH	i((+ s9>>23EF)..0)<<%i0557	U3y~~#67=jk	vw(?)..QXRXBY(YZI##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.Atxx}}q'8 9:vvx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       $ )zTrace 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   