U
    —9%eä  ã                   @   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kr0tdƒ‚t | |¡S )Nz#input to Trace, %s, is not a matrixFzTrace of a non-square matrix)r   Z	is_MatrixÚ	TypeErrorÚstrZ	is_squarer
   r   Ú__new__)ÚclsÚmat© r   ú_/var/www/html/Darija-Ai-API/env/lib/python3.8/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||ƒr2|  |¡ |¡S |  ¡ }t|tƒrHt	‚| 
|¡S )Nr   ©ÚSumé   )ÚMatrixElement)Úsympy.concrete.summationsr   Zmatexprr   Ú
isinstanceZ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 ]’}|jdkr`t|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   é   )Z0sympy.tensor.array.expressions.array_expressionsr#   r$   ÚargsÚ_eval_derivative_matrix_linesZhigherr   Ú_linesÚ	_validater   ZOneZ_first_pointer_parentZ_second_pointer_parentZ_first_pointer_indexZ_second_pointer_index)r   Úxr#   r$   ÚrÚlrr   r   r   r)   ;   sF    
þþø
ô
ýþ ÷þz#Trace._eval_derivative_matrix_linesc                 C   s
   | j d S )Nr   )r(   r   r   r   r   Úarge   s    z	Trace.argc              	   K   sl   |  dd¡rH| jjf |Ž}z
| ¡ W S  ttfk
rD   t|ƒ Y S X n t| jtƒr^t	| jƒS t| jƒS d S )NÚdeepT)
Úgetr/   r   Z_eval_traceÚAttributeErrorr   r   r   r	   Útrace)r   Úhintsr/   r   r   r   r   i   s    

z
Trace.doitc                 C   s   t | j ¡ ƒ ¡ S r   )r   r/   Úas_explicitr   r   r   r   r   r5   w   s    zTrace.as_explicitc                    s´   ddl m} ddlm‰  | j‰tˆ|ƒr°‡ ‡fdd„}tttˆj	ƒƒ|d}tˆj	| ˆ ƒr†ˆ ˆƒ 
¡ ‰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   )r,   Úa©r7   Ú	trace_argr   r   Úget_arg_keyƒ   s    

z%Trace._normalize.<locals>.get_arg_key)Úkeyc                    s   t ˆ j|  ƒS r   )r   r(   )r,   )r:   r   r   Ú<lambda>Œ   ó    z"Trace._normalize.<locals>.<lambda>)Z!sympy.matrices.expressions.matmulr6   Z$sympy.matrices.expressions.transposer7   r/   r   ÚminÚrangeÚlenr(   r   Zfromiterr   )r   r6   r;   Zindminr   r9   r   Ú
_normalizez   s    
"zTrace._normalizec                 K   s@   ddl m} td|ƒ}|| j||f |d| jjd fƒ}| ¡ S )Nr   r   Úir   )r   r   r   r/   Úrowsr   )r   r"   Úkwargsr   rC   Úsr   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   r5   rB   rG   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   r3   ˜   s    r3   N)Zsympy.core.basicr   Zsympy.core.exprr   r   Zsympy.core.singletonr   Zsympy.core.sortingr   Zsympy.core.symbolr   Zsympy.core.sympifyr   Zsympy.matrices.matricesr	   Zsympy.matrices.commonr
   r   r3   r   r   r   r   Ú<module>   s    