o
    oh                     @   sP  d dl mZ d dlZd dlmZmZ d dlmZ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mZmZmZmZmZmZ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& G dd deeZ'e(ee'fe' dd Z)dd Z*dd Z+dd Z,edd eeee*e)e+e,eefZ-eedd ee- Z.dS )    )reduceN)Basicsympify)addAdd_could_extract_minus_sign)default_sort_keyadjoint)
MatrixBase	transpose)rm_idunpackflattensort	conditionexhaustdo_oneglom)
MatrixExpr)
ZeroMatrixGenericZeroMatrix)validate_matadd_integer)sift)sympy_deprecation_warningc                       s   e Zd ZdZdZe ZddddddZedd	 Z	e
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  ZS )MatAdda3  A Sum of Matrix Expressions

    MatAdd inherits from and operates like SymPy Add

    Examples
    ========

    >>> from sympy import MatAdd, MatrixSymbol
    >>> A = MatrixSymbol('A', 5, 5)
    >>> B = MatrixSymbol('B', 5, 5)
    >>> C = MatrixSymbol('C', 5, 5)
    >>> MatAdd(A, B, C)
    A + B + C
    TFN)evaluatecheck_sympifyc                   s   |s j S tt fdd|}|rttt|}tdd |D s&tdtj g|R  }|d ur:t	dddd	 |d
urBt
|  |rI |}|S )Nc                    s
    j | kS N)identity)icls u/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/matrices/expressions/matadd.py<lambda>,      
 z MatAdd.__new__.<locals>.<lambda>c                 s   s    | ]}t |tV  qd S r    )
isinstancer   .0argr%   r%   r&   	<genexpr>0   s    z!MatAdd.__new__.<locals>.<genexpr>z Mix of Matrix and Scalar symbolszaPassing check to MatAdd is deprecated and the check argument will be removed in a future version.z1.11z,remove-check-argument-from-matrix-operations)deprecated_since_versionactive_deprecations_targetF)r!   listfiltermapr   all	TypeErrorr   __new__r   validate	_evaluate)r$   r   r   r   argsobjr%   r#   r&   r5   &   s&   
zMatAdd.__new__c                 C   s   t |S r    )canonicalize)r$   exprr%   r%   r&   r7   C   s   zMatAdd._evaluatec                 C   s   | j d jS Nr   )r8   shapeselfr%   r%   r&   r=   G   s   zMatAdd.shapec                 C   s   t | S r    )r   r>   r%   r%   r&   could_extract_minus_signK   s   zMatAdd.could_extract_minus_signc                    s    t t| jdi |}| |S )Nr%   )superr   expandr7   )r?   kwargsexpanded	__class__r%   r&   rB   N   s   
zMatAdd.expandc                    s   t  fdd| jD  S )Nc                    s    g | ]}|j  fi qS r%   )_entryr*   r"   jrC   r%   r&   
<listcomp>S   s     z!MatAdd._entry.<locals>.<listcomp>)r   r8   )r?   r"   rI   rC   r%   rH   r&   rG   R   s   zMatAdd._entryc                 C      t dd | jD   S )Nc                 S      g | ]}t |qS r%   r   r*   r%   r%   r&   rJ   V       z*MatAdd._eval_transpose.<locals>.<listcomp>r   r8   doitr>   r%   r%   r&   _eval_transposeU      zMatAdd._eval_transposec                 C   rK   )Nc                 S   rL   r%   r	   r*   r%   r%   r&   rJ   Y   rM   z(MatAdd._eval_adjoint.<locals>.<listcomp>rN   r>   r%   r%   r&   _eval_adjointX   rQ   zMatAdd._eval_adjointc                    s(   ddl m   t fdd| jD   S )N   tracec                    s   g | ]} |qS r%   r%   r*   rT   r%   r&   rJ   ]   rM   z&MatAdd._eval_trace.<locals>.<listcomp>)rU   r   r8   rO   r>   r%   rT   r&   _eval_trace[   s   zMatAdd._eval_tracec                    s8     dd}|r fdd| jD }n| j}tt| S )NdeepTc                    s   g | ]
}|j d i  qS )r%   )rO   r*   hintsr%   r&   rJ   b   s    zMatAdd.doit.<locals>.<listcomp>)getr8   r:   r   )r?   rY   rW   r8   r%   rX   r&   rO   _   s
   zMatAdd.doitc                    s"    fdd| j D }dd |D S )Nc                    s   g | ]}|  qS r%   )_eval_derivative_matrix_linesr*   xr%   r&   rJ   h   s    z8MatAdd._eval_derivative_matrix_lines.<locals>.<listcomp>c                 S   s   g | ]	}|D ]}|qqS r%   r%   )r+   r"   rI   r%   r%   r&   rJ   i   s    )r8   )r?   r]   	add_linesr%   r\   r&   r[   g   s   z$MatAdd._eval_derivative_matrix_lines)__name__
__module____qualname____doc__	is_MatAddr   r!   r5   classmethodr7   propertyr=   r@   rB   rG   rP   rR   rV   rO   r[   __classcell__r%   r%   rE   r&   r      s"    

r   c                 C   s   |   d S r<   )as_coeff_mmulr,   r%   r%   r&   r'   n   s    r'   c                 C   s   t |  d S NrS   )r   rg   rh   r%   r%   r&   r'   o   s    c                 C   s   | dkr|S | | S ri   r%   )cntmatr%   r%   r&   combinep   s   rl   c                 C   sB   t | jdd }t|d dkrt|d ttj|d g  S | S )a   Merge explicit MatrixBase arguments

    Examples
    ========

    >>> from sympy import MatrixSymbol, eye, Matrix, MatAdd, pprint
    >>> from sympy.matrices.expressions.matadd import merge_explicit
    >>> A = MatrixSymbol('A', 2, 2)
    >>> B = eye(2)
    >>> C = Matrix([[1, 2], [3, 4]])
    >>> X = MatAdd(A, B, C)
    >>> pprint(X)
        [1  0]   [1  2]
    A + [    ] + [    ]
        [0  1]   [3  4]
    >>> pprint(merge_explicit(X))
        [2  2]
    A + [    ]
        [3  5]
    c                 S   
   t | tS r    )r)   r   rh   r%   r%   r&   r'      r(   z merge_explicit.<locals>.<lambda>TrS   F)r   r8   lenr   r   operatorr   )mataddgroupsr%   r%   r&   merge_explicitw   s   rr   c                 C   s   | dkpt | tS r<   )r)   r   r\   r%   r%   r&   r'      s    c                 C   rm   r    )r)   r   r\   r%   r%   r&   r'      r(   )/	functoolsr   ro   
sympy.corer   r   sympy.core.addr   r   r   sympy.core.sortingr   sympy.functionsr
   sympy.matrices.matrixbaser   $sympy.matrices.expressions.transposer   sympy.strategiesr   r   r   r   r   r   r   r   "sympy.matrices.expressions.matexprr   "sympy.matrices.expressions.specialr   r   !sympy.matrices.expressions._shaper   r6   sympy.utilities.iterablesr   sympy.utilities.exceptionsr   r   register_handlerclass	factor_of	matrix_ofrl   rr   rulesr:   r%   r%   r%   r&   <module>   s<    (X



