B
    ˜‘[Ó  ã               @   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	 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 )é    )Úprint_functionÚdivision)Ú_sympify)ÚSÚBasic)Ú
ShapeError)ÚMatPowc               @   sT   e Zd ZdZdZedƒZdd„ Zedd„ ƒZ	e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

    Téÿÿÿÿc             C   s4   t |ƒ}|jstdƒ‚|js(td| ƒ‚t | |¡S )Nzmat should be a matrixzInverse of non-square matrix %s)r   Z	is_MatrixÚ	TypeErrorZ	is_squarer   r   Ú__new__)ÚclsZmat© r   úAlib/python3.7/site-packages/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   Úshape)r   r   r   r   r   1   s    zInverse.shapec             C   s   | j S )N)r   )r   r   r   r   Ú_eval_inverse5   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_determinant8   s    zInverse._eval_determinantc             K   s,   |  dd¡r| jjf |Ž ¡ S | j ¡ S d S )NZdeepT)Úgetr   ÚdoitZinverse)r   Zhintsr   r   r   r   <   s    zInverse.doitN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z
is_Inverser   Zexpr   Úpropertyr   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   ÚTZunitaryÚ	conjugateZsingularÚ
ValueError)ÚexprZassumptionsr   r   r   Úrefine_InverseG   s    

r&   N)Z
__future__r   r   Zsympy.core.sympifyr   Z
sympy.corer   r   Z"sympy.matrices.expressions.matexprr   Z!sympy.matrices.expressions.matpowr   r	   Zsympy.assumptions.askr   r    Zsympy.assumptions.refiner!   r&   r   r   r   r   Ú<module>   s   9