o
    8Vac                     @   sL   d dl mZmZmZmZ d dlmZ d dlmZ G dd deZ	dd Z
dS )	    )BasicExprsympifyS)
MatrixBase)NonSquareMatrixErrorc                   @   s\   e Zd ZdZdZdZdd Zdd Zdd Zd	d
 Z	e
dd Zdd Zdd Zd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                 C   s8   t |}|jstdt| |jstdt| |S )Nz#input to Trace, %s, is not a matrixzTrace of a non-square matrix)r   Z	is_Matrix	TypeErrorstrZ	is_squarer   r   __new__)clsZmat r   B/usr/lib/python3/dist-packages/sympy/matrices/expressions/trace.pyr      s   zTrace.__new__c                 C   s   | S Nr   selfr   r   r   _eval_transpose(   s   zTrace._eval_transposec                 C   sR   ddl m} ddlm} t||r| ||S |  }t|tr$t	|
|S )Nr   )Sum   )MatrixElement)sympyr   Zmatexprr   
isinstanceZrewriteZdiffdoitr   NotImplementedError_eval_derivative)r   vr   r   exprr   r   r   r   +   s   


zTrace._eval_derivativec                 C   s   ddl m}m} ddlm} | jd |}|D ]I}|jdkr6|||||jd |jd gdg|j	d|_n|||||jd |jd |jgddg|_t
jt
jg|_|j|_|j|_d|_d|_q|S )Nr   )ArrayTensorProductArrayContraction)ExprBuilderr   )r      )Z	validator)r      )Z0sympy.tensor.array.expressions.array_expressionsr   r   Zsympy.core.exprr   args_eval_derivative_matrix_linesZhigherZ_linesZ	_validater   ZOneZ_first_pointer_parentZ_second_pointer_parentZ_first_pointer_indexZ_second_pointer_index)r   xr   r   r   rZlrr   r   r   r#   6   sF   


z#Trace._eval_derivative_matrix_linesc                 C   s
   | j d S )Nr   r"   r   r   r   r   arga   s   
z	Trace.argc              	   K   sh   | ddr$| jjdi |}z| W S  ttfy#   t| Y S w t| jtr/t	| jS t| jS )NZdeepTr   )
getr'   r   Z_eval_traceAttributeErrorr   r   r   r   trace)r   kwargsr'   r   r   r   r   e   s   


z
Trace.doitc                    s   ddl m}m m | jt|rX fdd}tttj	|d}tj	|  rC 
 tttj	fddd}|j	|d  j	d |  tS | S )Nr   )MatMul	Transposedefault_sort_keyc                    s"   j |  }t| r|j}|S r   )r"   r   r'   )r$   ar-   r.   	trace_argr   r   get_arg_key{   s   

z%Trace._normalize.<locals>.get_arg_key)keyc                    s    j |  S r   r&   )r$   )r.   r1   r   r   <lambda>   s    z"Trace._normalize.<locals>.<lambda>)r   r,   r-   r.   r'   r   minrangelenr"   r   Zfromiterr   )r   r,   r2   Zindminr   r0   r   
_normalizes   s   
 "zTrace._normalizec                 K   s>   ddl m}m} |d}|| j||f |d| jjd f S )Nr   )r   Dummyir   )r   r   r9   r'   Zrowsr   )r   r   r+   r   r9   r:   r   r   r   _eval_rewrite_as_Sum   s   &zTrace._eval_rewrite_as_SumN)__name__
__module____qualname____doc__Zis_TraceZis_commutativer   r   r   r#   propertyr'   r   r8   r;   r   r   r   r   r      s    +
r   c                 C   s   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   r   r   r   r*      s   r*   N)r   r   r   r   r   Zsympy.matrices.matricesr   Zsympy.matrices.commonr   r   r*   r   r   r   r   <module>   s     
