
    sgK                         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
e      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    )askQ)Eq)S)_sympify)KroneckerDeltaNonInvertibleMatrixError   )
MatrixExprc                   l     e Zd ZdZdZ fdZed        Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Z xZS )
ZeroMatrixzThe 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                     t        |      t        |      }}| j                  |       | j                  |       t        |   | ||      S Nr   
_check_dimsuper__new__)clsmn	__class__s      U/var/www/html/venv/lib/python3.12/site-packages/sympy/matrices/expressions/special.pyr   zZeroMatrix.__new__   s?    {HQK1qqwsAq))    c                 >    | j                   d   | j                   d   fS Nr   r   argsselfs    r   shapezZeroMatrix.shape!       		!diil++r   c                 ,    |dk  dk(  rt        d      | S )Nr   TMatrix det == 0; not invertibler	   r    exps     r   _eval_powerzZeroMatrix._eval_power%   s    !G*+LMMr   c                 B    t        | j                  | j                        S r   r   colsrowsr   s    r   _eval_transposezZeroMatrix._eval_transpose+       $))TYY//r   c                 B    t        | j                  | j                        S r   r)   r   s    r   _eval_adjointzZeroMatrix._eval_adjoint.   r-   r   c                 "    t         j                  S r   r   Zeror   s    r   _eval_tracezZeroMatrix._eval_trace1       vvr   c                 "    t         j                  S r   r1   r   s    r   _eval_determinantzZeroMatrix._eval_determinant4   r4   r   c                     t        d      )N Matrix det == 0; not invertible.r	   r   s    r   _eval_inversezZeroMatrix._eval_inverse7   s    &'IJJr   c                 
    | | fS r    r   s    r   _eval_as_real_imagzZeroMatrix._eval_as_real_imag:   s    d|r   c                     | S r   r;   r   s    r   _eval_conjugatezZeroMatrix._eval_conjugate=       r   c                 "    t         j                  S r   r1   r    ijkwargss       r   _entryzZeroMatrix._entry@   r4   r   )__name__
__module____qualname____doc__is_ZeroMatrixr   propertyr!   r'   r,   r/   r3   r6   r9   r<   r>   rE   __classcell__r   s   @r   r   r   
   sV     M* , ,00Kr   r   c                   h     e Zd ZdZ fdZed        Zed        Zed        Zd Z	d Z
 fdZ xZS )	GenericZeroMatrixz
    A zero matrix without a specified shape

    This exists primarily so MatAdd() with no arguments can return something
    meaningful.
    c                 *    t         t        |   |       S r   )r   r   r   r   r   s    r   r   zGenericZeroMatrix.__new__K   s     Z-c22r   c                     t        d      Nz1GenericZeroMatrix does not have a specified shape	TypeErrorr   s    r   r+   zGenericZeroMatrix.rowsP       KLLr   c                     t        d      rS   rT   r   s    r   r*   zGenericZeroMatrix.colsT   rV   r   c                     t        d      rS   rT   r   s    r   r!   zGenericZeroMatrix.shapeX   rV   r   c                 "    t        |t              S r   )
isinstancerO   r    others     r   __eq__zGenericZeroMatrix.__eq__]   s    %!233r   c                     | |k(   S r   r;   r[   s     r   __ne__zGenericZeroMatrix.__ne__`       EM""r   c                      t         |          S r   r   __hash__r    r   s    r   rc   zGenericZeroMatrix.__hash__c       w!!r   )rF   rG   rH   rI   r   rK   r+   r*   r!   r]   r_   rc   rL   rM   s   @r   rO   rO   D   sc    3
 M M M M M M4#" "r   rO   c                        e Zd ZdZdZ fdZed        Zed        Zed        Z	ed        Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Z xZS )IdentityzThe Matrix Identity I - multiplicative identity

    Examples
    ========

    >>> from sympy import Identity, MatrixSymbol
    >>> A = MatrixSymbol('A', 3, 5)
    >>> I = Identity(3)
    >>> I*A
    A
    Tc                 \    t        |      }| j                  |       t        |   | |      S r   r   )r   r   r   s     r   r   zIdentity.__new__w   s)    QKqwsA&&r   c                      | j                   d   S Nr   r   r   s    r   r+   zIdentity.rows}       yy|r   c                      | j                   d   S rj   r   r   s    r   r*   zIdentity.cols   rk   r   c                 >    | j                   d   | j                   d   fS rj   r   r   s    r   r!   zIdentity.shape   r"   r   c                      yNTr;   r   s    r   	is_squarezIdentity.is_square       r   c                     | S r   r;   r   s    r   r,   zIdentity._eval_transpose   r?   r   c                     | j                   S r   )r+   r   s    r   r3   zIdentity._eval_trace   s    yyr   c                     | S r   r;   r   s    r   r9   zIdentity._eval_inverse   r?   r   c                 *    | t        | j                   fS r   r   r!   r   s    r   r<   zIdentity._eval_as_real_imag       j$**-..r   c                     | S r   r;   r   s    r   r>   zIdentity._eval_conjugate   r?   r   c                     | S r   r;   r   s    r   r/   zIdentity._eval_adjoint   r?   r   c                     t        ||      }|t        j                  u rt        j                  S |t        j                  u rt        j
                  S t        ||d| j                  dz
  f      S r   )r   r   trueOnefalser2   r   r*   )r    rB   rC   rD   eqs        r   rE   zIdentity._entry   sQ    1X<55L177]66MaQ		!$455r   c                 "    t         j                  S r   r   r|   r   s    r   r6   zIdentity._eval_determinant       uur   c                     | S r   r;   r%   s     r   r'   zIdentity._eval_power   r?   r   )rF   rG   rH   rI   is_Identityr   rK   r+   r*   r!   rp   r,   r3   r9   r<   r>   r/   rE   r6   r'   rL   rM   s   @r   rg   rg   h   s    
 K'     , ,  /6r   rg   c                   x     e Zd ZdZ fdZed        Zed        Zed        Zed        Z	d Z
d Z fd	Z xZS )
GenericIdentityz
    An identity matrix without a specified shape

    This exists primarily so MatMul() with no arguments can return something
    meaningful.
    c                 *    t         t        |   |       S r   )r   rg   r   rQ   s    r   r   zGenericIdentity.__new__   s     Xs+C00r   c                     t        d      Nz/GenericIdentity does not have a specified shaperT   r   s    r   r+   zGenericIdentity.rows       IJJr   c                     t        d      r   rT   r   s    r   r*   zGenericIdentity.cols   r   r   c                     t        d      r   rT   r   s    r   r!   zGenericIdentity.shape   r   r   c                      yro   r;   r   s    r   rp   zGenericIdentity.is_square   rq   r   c                 "    t        |t              S r   )rZ   r   r[   s     r   r]   zGenericIdentity.__eq__   s    %11r   c                     | |k(   S r   r;   r[   s     r   r_   zGenericIdentity.__ne__   r`   r   c                      t         |          S r   rb   rd   s    r   rc   zGenericIdentity.__hash__   re   r   )rF   rG   rH   rI   r   rK   r+   r*   r!   rp   r]   r_   rc   rL   rM   s   @r   r   r      sw    1
 K K K K K K  2#" "r   r   c                        e Zd ZdZd fd	Zed        Zed        Zd Zd Z	 fdZ
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Z xZS )	OneMatrixz,
    Matrix whose all entries are ones.
    c                     t        |      t        |      }}| j                  |       | j                  |       |r)t        |d      t        |d      z  }|dk(  rt        d      S t        |   | ||      }|S )Nr   T)r   r   r   rg   r   r   )r   r   r   evaluate	conditionobjr   s         r   r   zOneMatrix.__new__   sn    {HQK1qq1a2a8+ID {"goc1a(
r   c                     | j                   S r   )_argsr   s    r   r!   zOneMatrix.shape   s    zzr   c                 (    | j                         dk(  S ro   )_is_1x1r   s    r   r   zOneMatrix.is_Identity   s    ||~%%r   c                 @    ddl m}  |j                  | j                   S )Nr   )ImmutableDenseMatrix)sympy.matrices.immutabler   onesr!   )r    r   s     r   as_explicitzOneMatrix.as_explicit   s    A(#(($**55r   c                     | j                   }|j                  dd      r|D cg c]  } |j                  di | }} | j                  |ddiS c c}w )NdeepTr   r;   )r   getdoitfunc)r    hintsr   as       r   r   zOneMatrix.doit   sS    yy99VT"-12FAFFOUO2D2tyy$... 3s   Ac                    | j                         dk(  rt        d      S |dk  dk(  rt        d      t        t	        j
                  |            r(| j                  d   |dz
  z  t        | j                   z  S t        | %  |      S )NTr   r   r$   )
r   rg   r
   r   r   integerr!   r   r   r'   )r    r&   r   s     r   r'   zOneMatrix._eval_power   sx    <<>T!A;!G*+LMMqyy~::a=S1W-	4::0FFFw"3''r   c                 B    t        | j                  | j                        S r   r   r*   r+   r   s    r   r,   zOneMatrix._eval_transpose      DII..r   c                 B    t        | j                  | j                        S r   r   r   s    r   r/   zOneMatrix._eval_adjoint  r   r   c                 <    t         j                  | j                  z  S r   )r   r|   r+   r   s    r   r3   zOneMatrix._eval_trace  s    uuTYYr   c                 X    | j                   }t        |d   d      t        |d   d      z  S )z-Returns true if the matrix is known to be 1x1r   r   )r!   r   )r    r!   s     r   r   zOneMatrix._is_1x1  s*    

%(AE!Ha00r   c                     | j                         }|dk(  rt        j                  S |dk(  rt        j                  S ddlm}  ||       S )NTFr   )Determinant)r   r   r|   r2   &sympy.matrices.expressions.determinantr   )r    r   r   s      r   r6   zOneMatrix._eval_determinant  s=    LLN	55L%66MJt$$r   c                 ~    | j                         }|dk(  rt        d      S |dk(  rt        d      ddlm}  ||       S )NTr   Fr8   )Inverse)r   rg   r
   inverser   )r    r   r   s      r   r9   zOneMatrix._eval_inverse  s@    LLN	A;%*+MNN(4= r   c                 *    | t        | j                   fS r   rv   r   s    r   r<   zOneMatrix._eval_as_real_imag$  rw   r   c                     | S r   r;   r   s    r   r>   zOneMatrix._eval_conjugate'  r?   r   c                 "    t         j                  S r   r   rA   s       r   rE   zOneMatrix._entry*  r   r   )F)rF   rG   rH   rI   r   rK   r!   r   r   r   r'   r,   r/   r3   r   r6   r9   r<   r>   rE   rL   rM   s   @r   r   r      sq       & &6/(//1
%!/r   r   N)sympy.assumptions.askr   r   sympy.core.relationalr   sympy.core.singletonr   sympy.core.sympifyr   (sympy.functions.special.tensor_functionsr   sympy.matrices.exceptionsr
   matexprr   r   rO   rg   r   r   r;   r   r   <module>r      s^    ( $ " ' C > 7 7t "
  "HCz CL$"h $"NV
 Vr   