B
    ˜‘[¿9  ã               @   st  d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ dd„ ZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZ G dd „ d e
ƒZ!d!d"„ Z"d#d$„ Z#d%d&„ Z$G d'd(„ d(e
ƒZ%G d)d*„ d*e
ƒZ&G d+d,„ d,e
ƒZ'd-S ).zd
This module contains query handlers responsible for calculus queries:
infinitesimal, bounded, etc.
é    )Úprint_functionÚdivision)Ú	conjuncts)ÚQÚask)ÚCommonHandlerÚtest_closed_group)ÚMatMulÚ
MatrixExpr)Ú	fuzzy_and)Úsift)ÚBasic)Úpartialc             C   s   | |j krdS d S )NT)Z
predicates)Ú	predicateÚexprÚassumptions© r   úBlib/python3.7/site-packages/sympy/assumptions/handlers/matrices.pyÚ_Factorization   s    
r   c               @   s   e Zd ZdZedd„ ƒZdS )ÚAskSquareHandlerz"
    Handler for key 'square'
    c             C   s   | j d | j d kS )Nr   é   )Úshape)r   r   r   r   r   r
      s    zAskSquareHandler.MatrixExprN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr
   r   r   r   r   r      s   r   c               @   sf   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	e	Z
edd„ ƒZeejƒZdS )ÚAskSymmetricHandlerz%
    Handler for key 'symmetric'
    c                s”   |   ¡ \}}t‡ fdd„|jD ƒƒr(dS tt | ¡ˆ ƒr<dS t|jƒdkr|jd |jd jkrt|jƒdkrrdS tt t	|jdd… Ž ¡ˆ ƒS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   Ú	symmetric)Ú.0Úarg)r   r   r   ú	<genexpr>'   s    z-AskSymmetricHandler.MatMul.<locals>.<genexpr>Té   r   éÿÿÿÿr   )
Úas_coeff_mmulÚallÚargsr   r   ÚdiagonalÚlenÚTr   r	   )r   r   ÚfactorÚmmulr   )r   r   r	   $   s    $zAskSymmetricHandler.MatMulc                s   t ‡ fdd„| jD ƒƒS )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   r   )r   r    )r   r   r   r!   4   s    z-AskSymmetricHandler.MatAdd.<locals>.<genexpr>)r%   r&   )r   r   r   )r   r   ÚMatAdd2   s    zAskSymmetricHandler.MatAddc             C   s8   | j s
dS tt | ¡|ƒrdS t | ¡t|ƒkr4dS d S )NFT)Ú	is_squarer   r   r'   r   r   )r   r   r   r   r   ÚMatrixSymbol6   s    z AskSymmetricHandler.MatrixSymbolc             C   s   t t | ¡|ƒS )N)r   r   Zsquare)r   r   r   r   r   Ú
ZeroMatrixA   s    zAskSymmetricHandler.ZeroMatrixc             C   s   t t | j¡|ƒS )N)r   r   r   r    )r   r   r   r   r   Ú	TransposeE   s    zAskSymmetricHandler.Transposec             C   s4   t t | ¡|ƒrdS | jsd S t t | j¡|ƒS d S )NT)r   r   r'   Úon_diagr   Úparent)r   r   r   r   r   ÚMatrixSliceK   s
    zAskSymmetricHandler.MatrixSliceN)r   r   r   r   r   r	   r,   r.   r/   r0   ÚInverser3   r   Ú
AlwaysTrueÚIdentityr   r   r   r   r      s   r   c               @   sj   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZeej	ƒgd \Z
ZeejƒZed	d
„ ƒZedd„ ƒZdS )ÚAskInvertibleHandlerz&
    Handler for key 'invertible'
    c                sH   |   ¡ \}}t‡ fdd„|jD ƒƒr(dS t‡ fdd„|jD ƒƒrDdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   Ú
invertible)r   r    )r   r   r   r!   a   s    z.AskInvertibleHandler.MatMul.<locals>.<genexpr>Tc             3   s"   | ]}t t |¡ˆ ƒd kV  qdS )FN)r   r   r8   )r   r    )r   r   r   r!   c   s   F)r$   r%   r&   Úany)r   r   r*   r+   r   )r   r   r	   ^   s    zAskInvertibleHandler.MatMulc             C   s   d S )Nr   )r   r   r   r   r   r,   g   s    zAskInvertibleHandler.MatAddc             C   s$   | j s
dS t | ¡t|ƒkr dS d S )NFT)r-   r   r8   r   )r   r   r   r   r   r.   k   s    z!AskInvertibleHandler.MatrixSymbolr"   c             C   s   t t | j¡|ƒS )N)r   r   r8   r    )r   r   r   r   r   r0   v   s    zAskInvertibleHandler.Transposec             C   s    | j s
d S tt | j¡|ƒS d S )N)r1   r   r   r8   r2   )r   r   r   r   r   r3   z   s    z AskInvertibleHandler.MatrixSliceN)r   r   r   r   r   r	   r,   r.   r   r5   r6   r4   ÚAlwaysFalser/   r0   r3   r   r   r   r   r7   Y   s   	
r7   c               @   sz   e Zd ZdZejZedd„ ƒZedd„ ƒZ	edd„ ƒZ
eejƒZeejƒZedd	„ ƒZeZed
d„ ƒZeeeejƒƒZdS )ÚAskOrthogonalHandlerz&
    Handler for key 'orthogonal'
    c                sP   |   ¡ \}}t‡ fdd„|jD ƒƒr0|dkr0dS t‡ fdd„|jD ƒƒrLdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   Ú
orthogonal)r   r    )r   r   r   r!   Š   s    z.AskOrthogonalHandler.MatMul.<locals>.<genexpr>r   Tc             3   s"   | ]}t t |¡ˆ ƒd kV  qdS )FN)r   r   r8   )r   r    )r   r   r   r!      s   F)r$   r%   r&   r9   )r   r   r*   r+   r   )r   r   r	   ‡   s    zAskOrthogonalHandler.MatMulc             C   s,   t | jƒdkr(tt | jd ¡|ƒr(dS d S )Nr   r   T)r(   r&   r   r   r<   )r   r   r   r   r   r,   ‘   s    zAskOrthogonalHandler.MatAddc             C   s$   | j s
dS t | ¡t|ƒkr dS d S )NFT)r-   r   r<   r   )r   r   r   r   r   r.   —   s    z!AskOrthogonalHandler.MatrixSymbolc             C   s   t t | j¡|ƒS )N)r   r   r<   r    )r   r   r   r   r   r0   ¢   s    zAskOrthogonalHandler.Transposec             C   s    | j s
d S tt | j¡|ƒS d S )N)r1   r   r   r<   r2   )r   r   r   r   r   r3   ¨   s    z AskOrthogonalHandler.MatrixSliceN)r   r   r   r   r   r<   r   r   r	   r,   r.   r   r5   r6   r:   r/   r0   r4   r3   r   r   ÚFactorizationr   r   r   r   r;      s   


r;   c               @   sz   e Zd ZdZejZedd„ ƒZedd„ ƒZ	edd„ ƒZ
e
Zedd	„ ƒZed
d„ ƒZeeeejƒƒZeejƒZeejƒZdS )ÚAskUnitaryHandlerz#
    Handler for key 'unitary'
    c                sT   |   ¡ \}}t‡ fdd„|jD ƒƒr4t|ƒdkr4dS t‡ fdd„|jD ƒƒrPdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   Úunitary)r   r    )r   r   r   r!   º   s    z+AskUnitaryHandler.MatMul.<locals>.<genexpr>r   Tc             3   s"   | ]}t t |¡ˆ ƒd kV  qdS )FN)r   r   r8   )r   r    )r   r   r   r!   ½   s   F)r$   r%   r&   Úabsr9   )r   r   r*   r+   r   )r   r   r	   ·   s    zAskUnitaryHandler.MatMulc             C   s$   | j s
dS t | ¡t|ƒkr dS d S )NFT)r-   r   r?   r   )r   r   r   r   r   r.   Á   s    zAskUnitaryHandler.MatrixSymbolc             C   s   t t | j¡|ƒS )N)r   r   r?   r    )r   r   r   r   r   r0   È   s    zAskUnitaryHandler.Transposec             C   s    | j s
d S tt | j¡|ƒS d S )N)r1   r   r   r?   r2   )r   r   r   r   r   r3   Î   s    zAskUnitaryHandler.MatrixSlicec             C   s   dS )NTr   )r   r   r   r   r   ÚDFTÕ   s    zAskUnitaryHandler.DFTN)r   r   r   r   r   r?   r   r   r	   r.   r0   r4   r3   rA   r   r   r=   r   r5   r6   r:   r/   r   r   r   r   r>   ±   s   

r>   c               @   sL   e Zd ZdZedd„ ƒZeejƒZeej	ƒZ
edd„ ƒZeZedd„ ƒZdS )	ÚAskFullRankHandlerz$
    Handler for key 'fullrank'
    c                s    t ‡ fdd„| jD ƒƒrdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   Úfullrank)r   r    )r   r   r   r!   æ   s    z,AskFullRankHandler.MatMul.<locals>.<genexpr>T)r%   r&   )r   r   r   )r   r   r	   ä   s    zAskFullRankHandler.MatMulc             C   s   t t | j¡|ƒS )N)r   r   rC   r    )r   r   r   r   r   r0   í   s    zAskFullRankHandler.Transposec             C   s   t t | j¡|ƒrdS d S )NT)r   r   r<   r2   )r   r   r   r   r   r3   ó   s    zAskFullRankHandler.MatrixSliceN)r   r   r   r   r   r	   r   r5   r6   r:   r/   r0   r4   r3   r   r   r   r   rB   ß   s   

rB   c               @   sd   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZeej	ƒZ
eejƒZedd	„ ƒZeZed
d„ ƒZdS )ÚAskPositiveDefiniteHandlerz-
    Handler for key 'positive_definite'
    c                sŒ   |   ¡ \}}t‡ fdd„|jD ƒƒr0|dkr0dS t|jƒdkrˆ|jd |jd jkrˆtt |jd ¡ˆ ƒrˆtt t	|jdd… Ž ¡ˆ ƒS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   Úpositive_definite)r   r    )r   r   r   r!      s   z4AskPositiveDefiniteHandler.MatMul.<locals>.<genexpr>r   Tr"   r#   r   )
r$   r%   r&   r(   r)   r   r   rC   rE   r	   )r   r   r*   r+   r   )r   r   r	   ý   s    z!AskPositiveDefiniteHandler.MatMulc                s    t ‡ fdd„| jD ƒƒrdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   rE   )r   r    )r   r   r   r!     s   z4AskPositiveDefiniteHandler.MatAdd.<locals>.<genexpr>T)r%   r&   )r   r   r   )r   r   r,   	  s    z!AskPositiveDefiniteHandler.MatAddc             C   s$   | j s
dS t | ¡t|ƒkr dS d S )NFT)r-   r   rE   r   )r   r   r   r   r   r.     s    z'AskPositiveDefiniteHandler.MatrixSymbolc             C   s   t t | j¡|ƒS )N)r   r   rE   r    )r   r   r   r   r   r0     s    z$AskPositiveDefiniteHandler.Transposec             C   s    | j s
d S tt | j¡|ƒS d S )N)r1   r   r   rE   r2   )r   r   r   r   r   r3      s    z&AskPositiveDefiniteHandler.MatrixSliceN)r   r   r   r   r   r	   r,   r.   r   r5   r6   r:   r/   r0   r4   r3   r   r   r   r   rD   ø   s   

rD   c               @   s|   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZeej	ƒgd \Z
Zed	d
„ ƒZedd„ ƒZedd„ ƒZeeeejƒƒZdS )ÚAskUpperTriangularHandlerz,
    Handler for key 'upper_triangular'
    c                s*   |   ¡ \}}t‡ fdd„|D ƒƒr&dS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   Úupper_triangular)r   Úm)r   r   r   r!   /  s    z3AskUpperTriangularHandler.MatMul.<locals>.<genexpr>T)Úas_coeff_matricesr%   )r   r   r*   Úmatricesr   )r   r   r	   ,  s    z AskUpperTriangularHandler.MatMulc                s    t ‡ fdd„| jD ƒƒrdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   rG   )r   r    )r   r   r   r!   4  s    z3AskUpperTriangularHandler.MatAdd.<locals>.<genexpr>T)r%   r&   )r   r   r   )r   r   r,   2  s    z AskUpperTriangularHandler.MatAddc             C   s   t  | ¡t|ƒkrdS d S )NT)r   rG   r   )r   r   r   r   r   r.   7  s    z&AskUpperTriangularHandler.MatrixSymbolr"   c             C   s   t t | j¡|ƒS )N)r   r   Úlower_triangularr    )r   r   r   r   r   r0   >  s    z#AskUpperTriangularHandler.Transposec             C   s   t t | j¡|ƒS )N)r   r   rG   r    )r   r   r   r   r   r4   B  s    z!AskUpperTriangularHandler.Inversec             C   s    | j s
d S tt | j¡|ƒS d S )N)r1   r   r   rG   r2   )r   r   r   r   r   r3   F  s    z%AskUpperTriangularHandler.MatrixSliceN)r   r   r   r   r   r	   r,   r.   r   r5   r6   r/   r0   r4   r3   r   r   r   rG   r=   r   r   r   r   rF   '  s   rF   c               @   s|   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZeej	ƒgd \Z
Zed	d
„ ƒZedd„ ƒZedd„ ƒZeeeejƒƒZdS )ÚAskLowerTriangularHandlerz,
    Handler for key 'lower_triangular'
    c                s*   |   ¡ \}}t‡ fdd„|D ƒƒr&dS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   rK   )r   rH   )r   r   r   r!   W  s    z3AskLowerTriangularHandler.MatMul.<locals>.<genexpr>T)rI   r%   )r   r   r*   rJ   r   )r   r   r	   T  s    z AskLowerTriangularHandler.MatMulc                s    t ‡ fdd„| jD ƒƒrdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   rK   )r   r    )r   r   r   r!   \  s    z3AskLowerTriangularHandler.MatAdd.<locals>.<genexpr>T)r%   r&   )r   r   r   )r   r   r,   Z  s    z AskLowerTriangularHandler.MatAddc             C   s   t  | ¡t|ƒkrdS d S )NT)r   rK   r   )r   r   r   r   r   r.   _  s    z&AskLowerTriangularHandler.MatrixSymbolr"   c             C   s   t t | j¡|ƒS )N)r   r   rG   r    )r   r   r   r   r   r0   f  s    z#AskLowerTriangularHandler.Transposec             C   s   t t | j¡|ƒS )N)r   r   rK   r    )r   r   r   r   r   r4   j  s    z!AskLowerTriangularHandler.Inversec             C   s    | j s
d S tt | j¡|ƒS d S )N)r1   r   r   rK   r2   )r   r   r   r   r   r3   n  s    z%AskLowerTriangularHandler.MatrixSliceN)r   r   r   r   r   r	   r,   r.   r   r5   r6   r/   r0   r4   r3   r   r   r   rK   r=   r   r   r   r   rL   O  s   rL   c               @   s”   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZee	j
ƒgd
 \ZZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZeeeejƒƒZdS )ÚAskDiagonalHandlerz$
    Handler for key 'diagonal'
    c             C   s   | j dkp| j dkS )N)r   r   )r   r   )r   )r   r   r   r   Ú_is_empty_or_1x1|  s    z#AskDiagonalHandler._is_empty_or_1x1c                s8   t  | ¡rdS |  ¡ \}}t‡ fdd„|D ƒƒr4dS d S )NTc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   r'   )r   rH   )r   r   r   r!   …  s    z,AskDiagonalHandler.MatMul.<locals>.<genexpr>)rM   rN   rI   r%   )r   r   r*   rJ   r   )r   r   r	   €  s
    
zAskDiagonalHandler.MatMulc                s    t ‡ fdd„| jD ƒƒrdS d S )Nc             3   s   | ]}t t |¡ˆ ƒV  qd S )N)r   r   r'   )r   r    )r   r   r   r!   Š  s    z,AskDiagonalHandler.MatAdd.<locals>.<genexpr>T)r%   r&   )r   r   r   )r   r   r,   ˆ  s    zAskDiagonalHandler.MatAddc             C   s(   t  | ¡rdS t | ¡t|ƒkr$dS d S )NT)rM   rN   r   r'   r   )r   r   r   r   r   r.     s    
zAskDiagonalHandler.MatrixSymbolr"   c             C   s   t t | j¡|ƒS )N)r   r   r'   r    )r   r   r   r   r   r0   –  s    zAskDiagonalHandler.Transposec             C   s   t t | j¡|ƒS )N)r   r   r'   r    )r   r   r   r   r   r4   š  s    zAskDiagonalHandler.Inversec             C   s.   t  | ¡rdS | jsd S tt | j¡|ƒS d S )NT)rM   rN   r1   r   r   r'   r2   )r   r   r   r   r   r3   ž  s
    
zAskDiagonalHandler.MatrixSlicec             C   s   dS )NTr   )r   r   r   r   r   ÚDiagonalMatrix§  s    z!AskDiagonalHandler.DiagonalMatrixN)r   r   r   r   r   rN   r	   r,   r.   r   r5   r6   r/   r0   r4   r3   rO   r   r   r   r'   r=   r   r   r   r   rM   w  s   	rM   c                s   t ‡ ‡fdd„|jD ƒƒS )z Block Matrix elements c             3   s   | ]}t ˆ|ƒˆ ƒV  qd S )N)r   )r   Úb)r   r   r   r   r!   °  s    zBM_elements.<locals>.<genexpr>)r%   Zblocks)r   r   r   r   )r   r   r   ÚBM_elements®  s    rQ   c             C   s   t | |jƒ|ƒS )z Matrix Slice elements )r   r2   )r   r   r   r   r   r   ÚMS_elements²  s    rR   c             C   sF   t |jdd„ ƒ}|d |d  }}ttt|Ž ||ƒtt|Ž || ƒgƒS )Nc             S   s
   t | tƒS )N)Ú
isinstancer
   )Úxr   r   r   Ú<lambda>·  s    z!MatMul_elements.<locals>.<lambda>FT)r   r&   r   r   r   )Zmatrix_predicateZscalar_predicater   r   ÚdZfactorsrJ   r   r   r   ÚMatMul_elements¶  s
    rW   c               @   sr   e Zd Zedd„ ƒZegd \ZZZZee	j
ƒgd \ZZeeeejejƒƒZeeeejƒƒZeeeejƒƒZdS )ÚAskIntegerElementsHandlerc             C   s   t | |tjƒS )N)r   r   Úinteger_elements)r   r   r   r   r   r,   ¾  s    z AskIntegerElementsHandler.MatAddé   r"   N)r   r   r   r   r,   ÚHadamardProductÚDeterminantÚTracer0   r   r5   r/   r6   r   rW   r   rY   Zintegerr	   rR   r3   rQ   ÚBlockMatrixr   r   r   r   rX   ½  s   

rX   c               @   sb   e Zd Zedd„ ƒZegd \ZZZZZ	Z
eeeejejƒƒZeeeejƒƒZeeeejƒƒZdS )ÚAskRealElementsHandlerc             C   s   t | |tjƒS )N)r   r   Úreal_elements)r   r   r   r   r   r,   Ì  s    zAskRealElementsHandler.MatAddé   N)r   r   r   r   r,   r[   r\   r]   r0   r4   r=   r   rW   r   r`   Úrealr	   rR   r3   rQ   r^   r   r   r   r   r_   Ë  s
   r_   c               @   sl   e Zd Zedd„ ƒZegd \ZZZZZ	Z
eeeejejƒƒZeeeejƒƒZeeeejƒƒZeejƒZdS )ÚAskComplexElementsHandlerc             C   s   t | |tjƒS )N)r   r   Úcomplex_elements)r   r   r   r   r   r,   Ù  s    z AskComplexElementsHandler.MatAddra   N)r   r   r   r   r,   r[   r\   r]   r0   r4   r=   r   rW   r   rd   Úcomplexr	   rR   r3   rQ   r^   r   r5   rA   r   r   r   r   rc   Ø  s   

rc   N)(r   Z
__future__r   r   Zsympy.logic.boolalgr   Zsympy.assumptionsr   r   Zsympy.assumptions.handlersr   r   Zsympy.matrices.expressionsr	   r
   Zsympy.core.logicr   Zsympy.utilities.iterablesr   Z
sympy.corer   Ú	functoolsr   r   r   r   r7   r;   r>   rB   rD   rF   rL   rM   rQ   rR   rW   rX   r_   rc   r   r   r   r   Ú<module>   s4   
:(0./((7