B
    [k	                 @   s   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	 G dd de	Z
dd Zd d	lmZmZ d d
lmZ dd Zeed< dS )    )print_functiondivision)Basic)adjoint	conjugate)
MatrixExprc               @   sf   e Zd ZdZdZdd Zedd Zedd Zdd
dZ	dd Z
dd Zdd Zdd Zdd ZdS )	Transposea]  
    The transpose of a matrix expression.

    This is a symbolic object that simply stores its argument without
    evaluating it. To actually compute the transpose, use the ``transpose()``
    function, or the ``.T`` attribute of matrices.

    Examples
    ========

    >>> from sympy.matrices import MatrixSymbol, Transpose
    >>> from sympy.functions import transpose
    >>> A = MatrixSymbol('A', 3, 5)
    >>> B = MatrixSymbol('B', 5, 3)
    >>> Transpose(A)
    A.T
    >>> A.T == transpose(A) == Transpose(A)
    True
    >>> Transpose(A*B)
    (A*B).T
    >>> transpose(A*B)
    B.T*A.T

    Tc             K   sb   | j }|ddr(t|tr(|jf |}y| }|d k	r>|S t|S  tk
r\   t|S X d S )NZdeepT)argget
isinstancer   doit_eval_transposer   AttributeError)selfZhintsr	   result r   Clib/python3.7/site-packages/sympy/matrices/expressions/transpose.pyr   #   s    zTranspose.doitc             C   s
   | j d S )Nr   )args)r   r   r   r   r	   -   s    zTranspose.argc             C   s   | j jd d d S )N)r	   shape)r   r   r   r   r   1   s    zTranspose.shapeFc             C   s   | j j|||dS )N)expand)r	   _entry)r   ijr   r   r   r   r   5   s    zTranspose._entryc             C   s
   t | jS )N)r   r	   )r   r   r   r   _eval_adjoint8   s    zTranspose._eval_adjointc             C   s
   t | jS )N)r   r	   )r   r   r   r   _eval_conjugate;   s    zTranspose._eval_conjugatec             C   s   | j S )N)r	   )r   r   r   r   r   >   s    zTranspose._eval_transposec             C   s   ddl m} || jS )N   )Trace)Ztracer   r	   )r   r   r   r   r   _eval_traceA   s    zTranspose._eval_tracec             C   s   ddl m} || jS )Nr   )det)Z&sympy.matrices.expressions.determinantr   r	   )r   r   r   r   r   _eval_determinantE   s    zTranspose._eval_determinantN)F)__name__
__module____qualname____doc__Zis_Transposer   propertyr	   r   r   r   r   r   r   r    r   r   r   r   r      s   

r   c             C   s   t |  S )z Matrix transpose )r   r   )exprr   r   r   	transposeI   s    r'   )askQ)handlers_dictc             C   s   t t| |r| jS | S )z
    >>> from sympy import MatrixSymbol, Q, assuming, refine
    >>> X = MatrixSymbol('X', 2, 2)
    >>> X.T
    X.T
    >>> with assuming(Q.symmetric(X)):
    ...     print(refine(X.T))
    X
    )r(   r)   Z	symmetricr	   )r&   Zassumptionsr   r   r   refine_TransposeR   s    
r+   N)Z
__future__r   r   Zsympyr   Zsympy.functionsr   r   Z"sympy.matrices.expressions.matexprr   r   r'   Zsympy.assumptions.askr(   r)   Zsympy.assumptions.refiner*   r+   r   r   r   r   <module>   s   A