U
    ZÊ¹jK  ã                   @   s¬   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lmZ ddlm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S )é    )ÚaskÚQ)ÚEq)ÚS)Ú_sympify)ÚKroneckerDelta©ÚNonInvertibleMatrixErroré   )Ú
MatrixExprc                       sx   e Zd ZdZdZ‡ fdd„Ze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d„ Zdd„ Z‡  ZS )Ú
ZeroMatrixzâThe Matrix Zero 0 - additive identity

    Examples
    ========

    >>> from sympy import MatrixSymbol, ZeroMatrix
    >>> A = MatrixSymbol('A', 3, 5)
    >>> Z = ZeroMatrix(3, 5)
    >>> A + Z
    A
    >>> Z*A.T
    0
    Tc                    s6   t |ƒt |ƒ }}|  |¡ |  |¡ tƒ  | ||¡S ©N©r   Ú
_check_dimÚsuperÚ__new__)ÚclsÚmÚn©Ú	__class__© úa/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/matrices/expressions/special.pyr      s    

zZeroMatrix.__new__c                 C   s   | j d | j d fS ©Nr   r
   ©Úargs©Úselfr   r   r   Úshape!   s    zZeroMatrix.shapec                 C   s   |dk dkrt dƒ‚| S )Nr   TúMatrix det == 0; not invertibler   ©r   Úexpr   r   r   Ú_eval_power%   s    zZeroMatrix._eval_powerc                 C   s   t | j| jƒS r   ©r   ÚcolsÚrowsr   r   r   r   Ú_eval_transpose+   s    zZeroMatrix._eval_transposec                 C   s   t | j| jƒS r   r#   r   r   r   r   Ú_eval_adjoint.   s    zZeroMatrix._eval_adjointc                 C   s   t jS r   ©r   ÚZeror   r   r   r   Ú_eval_trace1   s    zZeroMatrix._eval_tracec                 C   s   t jS r   r(   r   r   r   r   Ú_eval_determinant4   s    zZeroMatrix._eval_determinantc                 C   s   t dƒ‚d S )Nú Matrix det == 0; not invertible.r   r   r   r   r   Ú_eval_inverse7   s    zZeroMatrix._eval_inversec                 C   s   | | fS r   r   r   r   r   r   Ú_eval_as_real_imag:   s    zZeroMatrix._eval_as_real_imagc                 C   s   | S r   r   r   r   r   r   Ú_eval_conjugate=   s    zZeroMatrix._eval_conjugatec                 K   s   t jS r   r(   ©r   ÚiÚjÚkwargsr   r   r   Ú_entry@   s    zZeroMatrix._entry)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zis_ZeroMatrixr   Úpropertyr   r"   r&   r'   r*   r+   r-   r.   r/   r4   Ú__classcell__r   r   r   r   r   
   s   
r   c                       s`   e Zd ZdZ‡ fdd„Zedd„ ƒZedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
‡ fdd„Z‡  ZS )ÚGenericZeroMatrixz�
    A zero matrix without a specified shape

    This exists primarily so MatAdd() with no arguments can return something
    meaningful.
    c                    s   t t| ƒ | ¡S r   )r   r   r   ©r   r   r   r   r   K   s    zGenericZeroMatrix.__new__c                 C   s   t dƒ‚d S ©Nz1GenericZeroMatrix does not have a specified shape©Ú	TypeErrorr   r   r   r   r%   P   s    zGenericZeroMatrix.rowsc                 C   s   t dƒ‚d S r=   r>   r   r   r   r   r$   T   s    zGenericZeroMatrix.colsc                 C   s   t dƒ‚d S r=   r>   r   r   r   r   r   X   s    zGenericZeroMatrix.shapec                 C   s
   t |tƒS r   )Ú
isinstancer;   ©r   Úotherr   r   r   Ú__eq__]   s    zGenericZeroMatrix.__eq__c                 C   s
   | |k S r   r   rA   r   r   r   Ú__ne__`   s    zGenericZeroMatrix.__ne__c                    s
   t ƒ  ¡ S r   ©r   Ú__hash__r   r   r   r   rF   c   s    zGenericZeroMatrix.__hash__)r5   r6   r7   r8   r   r9   r%   r$   r   rC   rD   rF   r:   r   r   r   r   r;   D   s   


r;   c                       sœ   e Zd ZdZdZ‡ fdd„Zedd„ ƒZedd„ ƒZed	d
„ ƒZ	e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d„ Zdd„ Z‡  ZS )ÚIdentityzÏThe Matrix Identity I - multiplicative identity

    Examples
    ========

    >>> from sympy import Identity, MatrixSymbol
    >>> A = MatrixSymbol('A', 3, 5)
    >>> I = Identity(3)
    >>> I*A
    A
    Tc                    s    t |ƒ}|  |¡ tƒ  | |¡S r   r   )r   r   r   r   r   r   w   s    
zIdentity.__new__c                 C   s
   | j d S ©Nr   r   r   r   r   r   r%   }   s    zIdentity.rowsc                 C   s
   | j d S rH   r   r   r   r   r   r$   �   s    zIdentity.colsc                 C   s   | j d | j d fS rH   r   r   r   r   r   r   …   s    zIdentity.shapec                 C   s   dS ©NTr   r   r   r   r   Ú	is_square‰   s    zIdentity.is_squarec                 C   s   | S r   r   r   r   r   r   r&   �   s    zIdentity._eval_transposec                 C   s   | j S r   )r%   r   r   r   r   r*   �   s    zIdentity._eval_tracec                 C   s   | S r   r   r   r   r   r   r-   “   s    zIdentity._eval_inversec                 C   s   | t | jŽ fS r   ©r   r   r   r   r   r   r.   –   s    zIdentity._eval_as_real_imagc                 C   s   | S r   r   r   r   r   r   r/   ™   s    zIdentity._eval_conjugatec                 C   s   | S r   r   r   r   r   r   r'   œ   s    zIdentity._eval_adjointc                 K   s@   t ||ƒ}|tjkrtjS |tjkr*tjS t||d| jd fƒS r   )r   r   ÚtrueÚOneÚfalser)   r   r$   )r   r1   r2   r3   Úeqr   r   r   r4   Ÿ   s    


zIdentity._entryc                 C   s   t jS r   ©r   rM   r   r   r   r   r+   §   s    zIdentity._eval_determinantc                 C   s   | S r   r   r    r   r   r   r"   ª   s    zIdentity._eval_power)r5   r6   r7   r8   Úis_Identityr   r9   r%   r$   r   rJ   r&   r*   r-   r.   r/   r'   r4   r+   r"   r:   r   r   r   r   rG   h   s(   



rG   c                       sl   e Zd ZdZ‡ fdd„Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	dd„ Z
dd„ Z‡ fdd„Z‡  ZS )ÚGenericIdentityz”
    An identity matrix without a specified shape

    This exists primarily so MatMul() with no arguments can return something
    meaningful.
    c                    s   t t| ƒ | ¡S r   )r   rG   r   r<   r   r   r   r   µ   s    zGenericIdentity.__new__c                 C   s   t dƒ‚d S ©Nz/GenericIdentity does not have a specified shaper>   r   r   r   r   r%   º   s    zGenericIdentity.rowsc                 C   s   t dƒ‚d S rS   r>   r   r   r   r   r$   ¾   s    zGenericIdentity.colsc                 C   s   t dƒ‚d S rS   r>   r   r   r   r   r   Â   s    zGenericIdentity.shapec                 C   s   dS rI   r   r   r   r   r   rJ   Æ   s    zGenericIdentity.is_squarec                 C   s
   t |tƒS r   )r@   rR   rA   r   r   r   rC   Ë   s    zGenericIdentity.__eq__c                 C   s
   | |k S r   r   rA   r   r   r   rD   Î   s    zGenericIdentity.__ne__c                    s
   t ƒ  ¡ S r   rE   r   r   r   r   rF   Ñ   s    zGenericIdentity.__hash__)r5   r6   r7   r8   r   r9   r%   r$   r   rJ   rC   rD   rF   r:   r   r   r   r   rR   ®   s   



rR   c                       sž   e Zd ZdZd!‡ fdd„	Zedd„ ƒZedd„ ƒZd	d
„ Zdd„ Z	‡ f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d„ Zdd „ Z‡  ZS )"Ú	OneMatrixz,
    Matrix whose all entries are ones.
    Fc                    sb   t |ƒt |ƒ }}|  |¡ |  |¡ |rNt|dƒt|dƒ@ }|dkrNtdƒS tƒ  | ||¡}|S )Nr
   T)r   r   r   rG   r   r   )r   r   r   ÚevaluateÚ	conditionÚobjr   r   r   r   Ù   s    

zOneMatrix.__new__c                 C   s   | j S r   )Ú_argsr   r   r   r   r   æ   s    zOneMatrix.shapec                 C   s   |   ¡ dkS rI   )Ú_is_1x1r   r   r   r   rQ   ê   s    zOneMatrix.is_Identityc                 C   s   ddl m} |j| jŽ S )Nr   )ÚImmutableDenseMatrix)Zsympy.matrices.immutablerZ   Zonesr   )r   rZ   r   r   r   Úas_explicitî   s    zOneMatrix.as_explicitc                    s4   | j }ˆ  dd¡r$‡ fdd„|D ƒ}| j|ddiŽS )NÚdeepTc                    s   g | ]}|j f ˆ Ž‘qS r   )Údoit)Ú.0Úa©Úhintsr   r   Ú
<listcomp>õ   s     z"OneMatrix.doit.<locals>.<listcomp>rU   )r   ÚgetÚfunc)r   ra   r   r   r`   r   r]   ò   s    zOneMatrix.doitc                    s^   |   ¡ dkrtdƒS |dk dkr(tdƒ‚tt |¡ƒrR| jd |d  t| jŽ  S tƒ  	|¡S )NTr
   r   r   )
rY   rG   r	   r   r   Úintegerr   rT   r   r"   r    r   r   r   r"   ø   s    zOneMatrix._eval_powerc                 C   s   t | j| jƒS r   ©rT   r$   r%   r   r   r   r   r&     s    zOneMatrix._eval_transposec                 C   s   t | j| jƒS r   rf   r   r   r   r   r'     s    zOneMatrix._eval_adjointc                 C   s   t j| j S r   )r   rM   r%   r   r   r   r   r*     s    zOneMatrix._eval_tracec                 C   s"   | j }t|d dƒt|d dƒ@ S )z-Returns true if the matrix is known to be 1x1r   r
   )r   r   )r   r   r   r   r   rY     s    zOneMatrix._is_1x1c                 C   s<   |   ¡ }|dkrtjS |dkr$tjS ddlm} || ƒS d S )NTFr   )ÚDeterminant)rY   r   rM   r)   Z&sympy.matrices.expressions.determinantrg   )r   rV   rg   r   r   r   r+     s    zOneMatrix._eval_determinantc                 C   sB   |   ¡ }|dkrtdƒS |dkr*tdƒ‚nddlm} || ƒS d S )NTr
   Fr,   )ÚInverse)rY   rG   r	   Zinverserh   )r   rV   rh   r   r   r   r-     s    
zOneMatrix._eval_inversec                 C   s   | t | jŽ fS r   rK   r   r   r   r   r.   $  s    zOneMatrix._eval_as_real_imagc                 C   s   | S r   r   r   r   r   r   r/   '  s    zOneMatrix._eval_conjugatec                 K   s   t jS r   rP   r0   r   r   r   r4   *  s    zOneMatrix._entry)F)r5   r6   r7   r8   r   r9   r   rQ   r[   r]   r"   r&   r'   r*   rY   r+   r-   r.   r/   r4   r:   r   r   r   r   rT   Õ   s$   




rT   N)Zsympy.assumptions.askr   r   Zsympy.core.relationalr   Zsympy.core.singletonr   Zsympy.core.sympifyr   Z(sympy.functions.special.tensor_functionsr   Zsympy.matrices.exceptionsr	   Zmatexprr   r   r;   rG   rR   rT   r   r   r   r   Ú<module>   s   :$F'