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