o
    8Va
                     @   sp   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 )    )Basic)adjoint	conjugate)
MatrixExprc                   @   sv   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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di |}t|dd }|d ur-| }|d ur)|S t|S t|S )NdeepT_eval_transpose )argget
isinstancer   doitgetattrr   )selfZhintsr
   r   resultr	   r	   F/usr/lib/python3/dist-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
   shaper   r	   r	   r   r   1   s   zTranspose.shapeFc                 K   s   | j j||fd|i|S )Nexpand)r
   _entry)r   ijr   kwargsr	   r	   r   r   5   s   zTranspose._entryc                 C   
   t | jS N)r   r
   r   r	   r	   r   _eval_adjoint8      
zTranspose._eval_adjointc                 C   r   r   )r   r
   r   r	   r	   r   _eval_conjugate;   r   zTranspose._eval_conjugatec                 C   s   | j S r   )r
   r   r	   r	   r   r   >   s   zTranspose._eval_transposec                 C      ddl m} || jS )N   )Trace)Ztracer"   r
   )r   r"   r	   r	   r   _eval_traceA      
zTranspose._eval_tracec                 C   r    )Nr   )det)Z&sympy.matrices.expressions.determinantr%   r
   )r   r%   r	   r	   r   _eval_determinantE   r$   zTranspose._eval_determinantc                 C   s   | j |S r   )r
   _eval_derivative)r   xr	   r	   r   r'   I   s   zTranspose._eval_derivativec                 C   s   | j d |}dd |D S )Nr   c                 S   s   g | ]}|  qS r	   )	transpose).0r   r	   r	   r   
<listcomp>O   s    z;Transpose._eval_derivative_matrix_lines.<locals>.<listcomp>)r   _eval_derivative_matrix_lines)r   r(   linesr	   r	   r   r,   M   s   z'Transpose._eval_derivative_matrix_linesN)F)__name__
__module____qualname____doc__Zis_Transposer   propertyr
   r   r   r   r   r   r#   r&   r'   r,   r	   r	   r	   r   r      s     


r   c                 C   s   t | jddS )zMatrix transposeF)r   )r   r   )exprr	   r	   r   r)   R   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
    )r4   r5   Z	symmetricr
   )r3   Zassumptionsr	   r	   r   refine_Transpose[   s   
r7   N)Zsympyr   Zsympy.functionsr   r   Z"sympy.matrices.expressions.matexprr   r   r)   Zsympy.assumptions.askr4   r5   Zsympy.assumptions.refiner6   r7   r	   r	   r	   r   <module>   s    K