U
    ZÊ¹jö  ã                   @   s´   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 e
edœd	d
„Zee
ef edœdd„Ze
edœdd„Ze
ddœdd„Ze
ddœdd„ZdS )é    ©ÚEq)ÚExpr)ÚInteger)ÚBooleanÚAnd)Ú
MatrixExpr)Ú
ShapeError)ÚUnion)ÚargsÚreturnc                  G   sb   t dd„ | D ƒŽ \}}tdd„ t |d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                 s   s   | ]}|j V  qd S ©N©Úshape©Ú.0Úarg© r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/matrices/expressions/_shape.pyÚ	<genexpr>    s     z"is_matadd_valid.<locals>.<genexpr>c                 s   s   | ]\}}t ||ƒV  qd S r   r   ©r   ÚiÚjr   r   r   r   "   s     Néÿÿÿÿé   c                 s   s   | ]\}}t ||ƒV  qd S r   r   r   r   r   r   r   #   s     ©Úzipr   ©r   ÚrowsÚcolsr   r   r   Úis_matadd_valid
   s
    ""þr    c                  G   s>   t dd„ | D ƒŽ \}}td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                 s   s   | ]}t |tƒr|jV  qd S r   )Ú
isinstancer   r   r   r   r   r   r   =   s     
 z"is_matmul_valid.<locals>.<genexpr>c                 s   s   | ]\}}t ||ƒV  qd S r   r   r   r   r   r   r   >   s     Nr   r   r   r   r   r   r   Úis_matmul_valid'   s    r"   )r   r   c                C   s   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   r   r   r   Ú	is_squareA   s    r#   Nc                  G   sj   t dd„ | D ƒŽ \}}tttdd„ |ƒƒƒdkr>td|› �ƒ‚tttdd„ |ƒƒƒdkrftd|› �ƒ‚dS )	z:Validate matrix shape for addition only for integer valuesc                 s   s   | ]}|j V  qd S r   r   )r   Úxr   r   r   r   Z   s     z*validate_matadd_integer.<locals>.<genexpr>c                 S   s   t | ttfƒS r   ©r!   Úintr   ©r$   r   r   r   Ú<lambda>[   ó    z)validate_matadd_integer.<locals>.<lambda>r   z!Matrices have mismatching shape: c                 S   s   t | ttfƒS r   r%   r'   r   r   r   r(   ]   r)   N)r   ÚlenÚsetÚfilterr	   r   r   r   r   Úvalidate_matadd_integerX   s
    r-   c                  G   sf   t | dd… | dd… ƒD ]F\}}|j|j }}t|ttfƒrt|ttfƒr||krtd||ƒ‚qdS )z@Validate matrix shape for multiplication only for integer valuesNr   r   zMatrices are not aligned)r   r   r   r!   r&   r   r	   )r   ÚAÚBr   r   r   r   r   Úvalidate_matmul_integera   s    "$r0   )Zsympy.core.relationalr   Zsympy.core.exprr   Zsympy.core.numbersr   Zsympy.logic.boolalgr   r   Z"sympy.matrices.expressions.matexprr   Zsympy.matrices.exceptionsr	   Útypingr
   r    r"   r#   r-   r0   r   r   r   r   Ú<module>   s   	