
    sg                         d dl mZ d dlmZ d dl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e
d	efd
Zdee
ef   d	efdZde
d	efdZde
d	dfdZde
d	dfdZy)    Eq)Expr)Integer)BooleanAnd)
MatrixExpr)
ShapeError)Unionargsreturnc            
          t        d | D         \  }}t        g d t        |dd |dd       D        d t        |dd |dd       D         S )a  Return the symbolic condition how ``MatAdd``, ``HadamardProduct``
    makes sense.

    Parameters
    ==========

    args
        The list of arguments of matrices to be tested for.

    Examples
    ========

    >>> from sympy import MatrixSymbol, symbols
    >>> from sympy.matrices.expressions._shape import is_matadd_valid

    >>> m, n, p, q = symbols('m n p q')
    >>> A = MatrixSymbol('A', m, n)
    >>> B = MatrixSymbol('B', p, q)
    >>> is_matadd_valid(A, B)
    Eq(m, p) & Eq(n, q)
    c              3   4   K   | ]  }|j                     y wNshape.0args     T/var/www/html/venv/lib/python3.12/site-packages/sympy/matrices/expressions/_shape.py	<genexpr>z"is_matadd_valid.<locals>.<genexpr>    s     1Ssyy1   c              3   :   K   | ]  \  }}t        ||        y wr   r   r   ijs      r   r   z"is_matadd_valid.<locals>.<genexpr>"        	8tq!"Q(	8   N   c              3   :   K   | ]  \  }}t        ||        y wr   r   r   s      r   r   z"is_matadd_valid.<locals>.<genexpr>#   r   r   zipr   r   rowscolss      r   is_matadd_validr'   
   se    , 1D12JD$ 	8s49d12h7	8	8s49d12h7	8     c            	      d    t        d | D         \  }}t        d t        |dd |dd       D         S )a  Return the symbolic condition how ``MatMul`` makes sense

    Parameters
    ==========

    args
        The list of arguments of matrices and scalar expressions to be tested
        for.

    Examples
    ========

    >>> from sympy import MatrixSymbol, symbols
    >>> from sympy.matrices.expressions._shape import is_matmul_valid

    >>> m, n, p, q = symbols('m n p q')
    >>> A = MatrixSymbol('A', m, n)
    >>> B = MatrixSymbol('B', p, q)
    >>> is_matmul_valid(A, B)
    Eq(n, p)
    c              3   V   K   | ]!  }t        |t              s|j                   # y wr   )
isinstancer	   r   r   s     r   r   z"is_matmul_valid.<locals>.<genexpr>=   s     PSJsJ4OsyyPs   ))c              3   :   K   | ]  \  }}t        ||        y wr   r   r   s      r   r   z"is_matmul_valid.<locals>.<genexpr>>   s     ?daAq?r   Nr   r    r"   r$   s      r   is_matmul_validr-   '   s<    , PDPQJD$?c$s)T!"X&>?@@r(   r   c                B    t        | j                  | j                        S )a  Return the symbolic condition how the matrix is assumed to be square

    Parameters
    ==========

    arg
        The matrix to be tested for.

    Examples
    ========

    >>> from sympy import MatrixSymbol, symbols
    >>> from sympy.matrices.expressions._shape import is_square

    >>> m, n = symbols('m n')
    >>> A = MatrixSymbol('A', m, n)
    >>> is_square(A)
    Eq(m, n)
    )r   r%   r&   )r   s    r   	is_squarer/   A   s    ( chh!!r(   Nc                      t        d | D         \  }}t        t        t        d |                  dkD  rt	        d|       t        t        t        d |                  dkD  rt	        d|       y)z:Validate matrix shape for addition only for integer valuesc              3   4   K   | ]  }|j                     y wr   r   )r   xs     r   r   z*validate_matadd_integer.<locals>.<genexpr>Z   s     -1qww-r   c                 .    t        | t        t        f      S r   r+   intr   r2   s    r   <lambda>z)validate_matadd_integer.<locals>.<lambda>[       
1sGn = r(   r    z!Matrices have mismatching shape: c                 .    t        | t        t        f      S r   r4   r6   s    r   r7   z)validate_matadd_integer.<locals>.<lambda>]   r8   r(   N)r#   lensetfilterr
   r$   s      r   validate_matadd_integerr=   X   sv    --.JD$
3v=tDEFJ<TFCDD
3v=tDEFJ<TFCDD Kr(   c                      t        | dd | dd       D ]]  \  }}|j                  |j                  }}t        |t        t
        f      s5t        |t        t
        f      sL||k7  sRt        d||       y)z@Validate matrix shape for multiplication only for integer valuesNr   r    zMatrices are not aligned)r#   r&   r%   r+   r5   r   r
   )r   ABr   r   s        r   validate_matmul_integerrA   a   sk    D"ItABx( ?1vvqvv1a#w(ZC>-JqTUv7A>>?r(   )sympy.core.relationalr   sympy.core.exprr   sympy.core.numbersr   sympy.logic.boolalgr   r   "sympy.matrices.expressions.matexprr	   sympy.matrices.exceptionsr
   typingr   r'   r-   r/   r=   rA    r(   r   <module>rJ      s    $   & , 9 0 : ' :A5T!12 Aw A4": "W ".E: E$ E?: ?$ ?r(   