
    sg                        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ee      Z' ejP                  ee'fe'       d Z)d Z*d Z+d Z, ed       ee ee*e)e+      e, ee      fZ- e ed  ee-             Z.y)    )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                        e Zd ZdZdZ e       ZdddddZed        Z	e
d        Zd	 Z fd
Zd Zd Zd Zd Zd Zd Z x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                N    |s j                   S t        t         fd|            }|rt        t        t        |            }t        d |D              st        d      t        j                   g| }|t        ddd       |durt        |  |r j                  |      }|S )	Nc                 "    j                   | k7  S N)identity)iclss    T/var/www/html/venv/lib/python3.12/site-packages/sympy/matrices/expressions/matadd.py<lambda>z MatAdd.__new__.<locals>.<lambda>,   s    S\\Q%6     c              3   <   K   | ]  }t        |t                y wr"   )
isinstancer   ).0args     r&   	<genexpr>z!MatAdd.__new__.<locals>.<genexpr>0   s     ?3:c:.?s   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objs   `     r&   r5   zMatAdd.__new__&   s    << F6=>GT*+D?$??>??mmC'$'%s)/+Y[
 dO--$C
r(   c                     t        |      S r"   )canonicalize)r%   exprs     r&   r7   zMatAdd._evaluateC   s    D!!r(   c                 4    | j                   d   j                  S Nr   )r8   shapeselfs    r&   r?   zMatAdd.shapeG   s    yy|!!!r(   c                     t        |       S r"   )r   r@   s    r&   could_extract_minus_signzMatAdd.could_extract_minus_signK   s    (..r(   c                 L    t        t        | 
  di |}| j                  |      S )N )superr   expandr7   )rA   kwargsexpanded	__class__s      r&   rG   zMatAdd.expandN   s&    -77~~h''r(   c           
      p    t        | j                  D cg c]  } |j                  ||fi | c} S c c}w r"   )r   r8   _entry)rA   r$   jrH   r,   s        r&   rL   zMatAdd._entryR   s1    499ECZSZZ1//EFFEs   3c                 z    t        | j                  D cg c]  }t        |       c} j                         S c c}w r"   )r   r8   r   doitrA   r,   s     r&   _eval_transposezMatAdd._eval_transposeU   s,    $))<3	#<=BBDD<   8c                 z    t        | j                  D cg c]  }t        |       c} j                         S c c}w r"   )r   r8   r
   rO   rP   s     r&   _eval_adjointzMatAdd._eval_adjointX   s,    		::;@@BB:rR   c                     ddl m } t        | j                  D cg c]
  } ||       c} j                         S c c}w )N   )trace)rW   r   r8   rO   )rA   rW   r,   s      r&   _eval_tracezMatAdd._eval_trace[   s/     4995CU3Z56;;==5s   ;c                     |j                  dd      }|r*| j                  D cg c]  } |j                  di | }}n| j                  }t        t	        |       S c c}w )NdeepTrE   )getr8   rO   r;   r   )rA   hintsrZ   r,   r8   s        r&   rO   zMatAdd.doit_   sW    yy&15;#HCHH%u%;D;99DFDM** <s   Ac                     | j                   D cg c]  }|j                  |       }}|D cg c]  }|D ]  }|  c}}S c c}w c c}}w r"   )r8   _eval_derivative_matrix_lines)rA   xr,   	add_linesr$   rM   s         r&   r^   z$MatAdd._eval_derivative_matrix_linesg   sJ    EIYYOcS66q9O	O$0aa0000 P0s
   AA)__name__
__module____qualname____doc__	is_MatAddr   r#   r5   classmethodr7   propertyr?   rC   rG   rL   rQ   rT   rX   rO   r^   __classcell__)rJ   s   @r&   r   r      sv     I "H%*$ : " " " "/(GEC>+1r(   r   c                 (    | j                         d   S r>   )as_coeff_mmulr,   s    r&   r'   r'   n   s    ))+A. r(   c                 :    t        | j                         d         S NrV   )r   rj   rk   s    r&   r'   r'   o   s    s002156 r(   c                     | dk(  r|S | |z  S rm   rE   )cntmats     r&   combinerq   p   s    
ax
Syr(   c                     t        | j                  d       }t        |d         dkD  r*t        |d   t	        t
        j                  |d         gz    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                 "    t        | t              S r"   )r*   r   rk   s    r&   r'   z merge_explicit.<locals>.<lambda>   s    :c:+F r(   TrV   F)r   r8   lenr   r   operatorr   )mataddgroupss     r&   merge_explicitrx   w   sQ    * &++FGF
6$<1ufTl)K(LLNNr(   c                 0    | dk(  xs t        | t              S r>   )r*   r   r_   s    r&   r'   r'      s    a<:a#< r(   c                 "    t        | t              S r"   )r*   r   rz   s    r&   r'   r'      s    :a+@ r(   )/	functoolsr   ru   
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_ofrq   rx   rulesr;   rE   r(   r&   <module>r      s      % > > / # 0 :   9 L Q * @V1Z V1p   3- 0 /	6	8 
<	=			iG	,				! y!@!'1 2r(   