o
    oh                     @   s   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
 d
eZdd ZdS )    )Basic)ExprExprBuilder)S)default_sort_key)uniquely_named_symbol)sympify)
MatrixBase)NonSquareMatrixErrorc                   @   sd   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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   s<   t |}|jstdt| |jdu rtdt| |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mat r   t/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-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)sympy.concrete.summationsr   matexprr   
isinstancerewritediffdoitr   NotImplementedError_eval_derivative)r   vr   r   exprr   r   r   r$   0   s   


zTrace._eval_derivativec                 C   s   ddl m}m} | jd |}|D ]I}|jdkr0t|t||jd |jd gdg|jd|_nt|t||jd |jd |jgddg|_t	j
t	j
g|_|j|_|j|_d|_d|_q|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lrr   r   r   r.   ;   sD   


z#Trace._eval_derivative_matrix_linesc                 C   s
   | j d S )Nr   )r-   r   r   r   r   arge   s   
z	Trace.argc                 K   sZ   | ddr| jjdi |}| }|d ur|S t|S t| jtr(t| jS t| jS )NdeepTr   )getr:   r"   _eval_tracer   r   r	   trace)r   hintsr:   resultr   r   r   r"   i   s   

z
Trace.doitc                 C   s   t | j  S r   )r   r:   as_explicitr"   r   r   r   r   rA   x   s   zTrace.as_explicitc                    s   ddl m} ddl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)	Transposec                    s"   j |  }t| r|j}t|S r   )r-   r   r:   r   )r7   arC   	trace_argr   r   get_arg_key   s   

z%Trace._normalize.<locals>.get_arg_key)keyc                    s   t  j|  S r   )r   r-   )r7   )rF   r   r   <lambda>   s    z"Trace._normalize.<locals>.<lambda>)!sympy.matrices.expressions.matmulrB   $sympy.matrices.expressions.transposerC   r:   r   minrangelenr-   r"   fromiterr   )r   rB   rG   indminr   rE   r   
_normalize{   s   
"zTrace._normalizec                 K   sB   ddl m} td|g}|| j||f |d| jjd f}| S )Nr   r   ir   )r   r   r   r:   rowsr"   )r   r&   kwargsr   rR   sr   r   r   _eval_rewrite_as_Sum   s   "zTrace._eval_rewrite_as_SumN)__name__
__module____qualname____doc__is_Traceis_commutativer   r   r$   r.   propertyr:   r"   rA   rQ   rV   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)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   r>   r   r   r   r   <module>   s     