B
    [                 @   sX   d dl mZmZ d dl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 )    )print_functiondivision)BasicExprsympify)
MatrixBase   )
ShapeErrorc               @   sH   e Zd ZdZdZdd Zdd Zdd Zed	d
 Z	dd Z
dd ZdS )TracezMatrix Trace

    Represents the trace of a matrix expression.

    >>> from sympy import MatrixSymbol, Trace, eye
    >>> A = MatrixSymbol('A', 3, 3)
    >>> Trace(A)
    Trace(A)

    See Also:
        trace
    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   ?lib/python3.7/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   s   ddl m}m}m} t||s"d S |d}|d}|d}|j|| jd ||f |||f |d| jd jd d f||jdd  dS )Nr   )Dummy
MatrixExprSumZt_1mnr   )Z
dimensions)	sympyr   r   r   
isinstanceZfrom_index_summationargsZdiffshape)r   vr   r   r   Zt1r   r   r   r   r   _eval_derivative%   s    
:zTrace._eval_derivativec             C   s
   | j d S )Nr   )r   )r   r   r   r   arg3   s    z	Trace.argc          	   K   sf   | ddrB| jjf |}y| S  ttfk
r>   t|S X n t| jtrXt	| jS t| jS d S )NZdeepT)
getr   doitZ_eval_traceAttributeErrorNotImplementedErrorr
   r   r   trace)r   kwargsr   r   r   r   r    7   s    
z
Trace.doitc             C   s>   ddl m}m} |d}|| j||f |d| jjd f S )Nr   )r   r   ir   )r   r   r   r   Zrowsr    )r   r   r   r%   r   r   r   _eval_rewrite_as_SumF   s    zTrace._eval_rewrite_as_SumN)__name__
__module____qualname____doc__Zis_Tracer   r   r   propertyr   r    r&   r   r   r   r   r
      s   r
   c             C   s   t |  S )a%   Trace of a Matrix.  Sum of the diagonal elements

    >>> from sympy import trace, Symbol, MatrixSymbol, pprint, eye
    >>> n = Symbol('n')
    >>> X = MatrixSymbol('X', n, n)  # A square matrix
    >>> trace(2*X)
    2*Trace(X)

    >>> trace(eye(3))
    3

    See Also:
        Trace
    )r
   r    )exprr   r   r   r#   L   s    r#   N)Z
__future__r   r   r   r   r   r   Zsympy.matrices.matricesr   Zmatexprr	   r
   r#   r   r   r   r   <module>   s
   D