U
    me
                     @   st   d dl mZ d dlmZmZ d dlmZ d dlmZ G dd deZ	d dl
mZmZ d dlmZ d	d
 Zeed< dS )    )_sympify)SBasic)NonSquareMatrixError)MatPowc                   @   s`   e Zd ZdZdZejZejfddZe	dd Z
e	dd Zd	d
 Zdd Zdd Zdd ZdS )Inversea  
    The multiplicative inverse of a matrix expression

    This is a symbolic object that simply stores its argument without
    evaluating it. To actually compute the inverse, use the ``.inverse()``
    method of matrices.

    Examples
    ========

    >>> from sympy import MatrixSymbol, Inverse
    >>> A = MatrixSymbol('A', 3, 3)
    >>> B = MatrixSymbol('B', 3, 3)
    >>> Inverse(A)
    A**(-1)
    >>> A.inverse() == Inverse(A)
    True
    >>> (A*B).inverse()
    B**(-1)*A**(-1)
    >>> Inverse(A*B)
    (A*B)**(-1)

    Tc                 C   sB   t |}t |}|jstd|jdkr4td| t| ||S )Nzmat should be a matrixFzInverse of non-square matrix %s)r   Z	is_Matrix	TypeErrorZ	is_squarer   r   __new__)clsmatexp r   F/tmp/pip-unpacked-wheel-rdz2gdd2/sympy/matrices/expressions/inverse.pyr	   #   s    
zInverse.__new__c                 C   s
   | j d S Nr   )argsselfr   r   r   arg.   s    zInverse.argc                 C   s   | j jS N)r   shaper   r   r   r   r   2   s    zInverse.shapec                 C   s   | j S r   )r   r   r   r   r   _eval_inverse6   s    zInverse._eval_inversec                 C   s   ddl m} d|| j S )Nr   )det   )Z&sympy.matrices.expressions.determinantr   r   )r   r   r   r   r   _eval_determinant9   s    zInverse._eval_determinantc                 K   s>   d|kr|d dkr| S | j }|ddr6|jf |}| S )NZ
inv_expandFdeepT)r   getdoitZinverse)r   hintsr   r   r   r   r   =   s    zInverse.doitc                 C   sB   | j d }||}|D ]$}| j| j 9  _| j| 9  _q|S r   )r   _eval_derivative_matrix_linesZfirst_pointerTZsecond_pointer)r   xr   linesliner   r   r   r   G   s    

z%Inverse._eval_derivative_matrix_linesN)__name__
__module____qualname____doc__Z
is_Inverser   ZNegativeOner   r	   propertyr   r   r   r   r   r   r   r   r   r   r      s   


r   )askQ)handlers_dictc                 C   sT   t t| |r| jjS t t| |r2| j S t t| |rPtd| j | S )z
    >>> from sympy import MatrixSymbol, Q, assuming, refine
    >>> X = MatrixSymbol('X', 2, 2)
    >>> X.I
    X**(-1)
    >>> with assuming(Q.orthogonal(X)):
    ...     print(refine(X.I))
    X.T
    zInverse of singular matrix %s)	r(   r)   Z
orthogonalr   r   Zunitary	conjugateZsingular
ValueError)exprZassumptionsr   r   r   refine_InverseT   s    

r.   N)Zsympy.core.sympifyr   Z
sympy.corer   r   Zsympy.matrices.commonr   Z!sympy.matrices.expressions.matpowr   r   Zsympy.assumptions.askr(   r)   Zsympy.assumptions.refiner*   r.   r   r   r   r   <module>   s   H