
    Ed                         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        st          d          t          j        | |          S )Nz#input to Trace, %s, is not a matrixzTrace of a non-square matrix)r	   	is_Matrix	TypeErrorstr	is_squarer   r   __new__)clsmats     @lib/python3.11/site-packages/sympy/matrices/expressions/trace.pyr   zTrace.__new__"   s^    cll} 	NACHHLMMM} 	G&'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'' 	-<<$$))!,,,yy{{dE"" 	&%%$$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IaL66q99 $	) $	)ByA~ '$#. "	! "	!  	 /8  		  ($#. "	! "	! "	  
 	 BI')yB$(*	B%&'B#'(B$$r   c                     | j         d         S )Nr   )r4   r   s    r   argz	Trace.arge   s    y|r   c                 L   |                     dd          rM | j        j        di |}	 |                                S # t          t
          f$ r t          |          cY S w xY wt          | j        t                    rt          | j                  S t          | j                  S )NdeepTr   )
getrB   r(   _eval_traceAttributeErrorr)   r   r%   r
   trace)r   hintsrB   s      r   r(   z
Trace.doiti   s    99VT"" 	'$(-((%((C"((("$78 " " "Szz!!!" $(J// 'TX&TX&s   >  A! A!c                 r    t          | j                                                                                  S r   )r   rB   as_explicitr(   r   s    r   rK   zTrace.as_explicitw   s*    TX))++,,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    N1%a++ A'***r   )keyc                 8    t          j        |                    S r   )r   r4   )r>   rQ   s    r   <lambda>z"Trace._normalize.<locals>.<lambda>   s    GWXaXfghXiGjGj 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._normalizez   s,    	=<<<<<BBBBBBH	i(( 	$+ + + + + + s9>2233EEEF).0)<< l%Ii005577	U3y~#6#677=j=j=j=jkkk	vww(?).QXRXQXBY(YZZI###r   c                     ddl m} t          d|          } || 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!#t,,CAAtx}q'8 9::vvxx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   rH   rH      s     ;;r   N)sympy.core.basicr   sympy.core.exprr   r   sympy.core.singletonr   sympy.core.sortingr   sympy.core.symbolr   sympy.core.sympifyr	   sympy.matrices.matricesr
   sympy.matrices.commonr   r   rH   r   r   r   <module>rt      s    " " " " " " - - - - - - - - " " " " " " / / / / / / 3 3 3 3 3 3 & & & & & & . . . . . . 6 6 6 6 6 6J J J J JD J J JZ    r   