
    Ed                        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 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%  G d dee          Z& ej'        ee&fe&           d Z(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.dS )    )reduceN)Basicsympify)addAdd_could_extract_minus_sign)default_sort_keyadjoint)
ShapeError)
MatrixBase	transpose)rm_idunpackflattensort	conditionexhaustdo_oneglom)
MatrixExpr)
ZeroMatrixGenericZeroMatrix)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                    |s j         S t          t           fd|                    }|r"t          t          t          |                    }t          j         g|R  }|t          ddd           |dv r7t          d |D                       st          j
        |          S t          |  nt          ddd           |r                     |          }|S )	Nc                     j         | k    S N)identity)iclss    Alib/python3.11/site-packages/sympy/matrices/expressions/matadd.py<lambda>z MatAdd.__new__.<locals>.<lambda>,   s    S\Q%6     zaPassing 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_target)TNc              3   @   K   | ]}t          |t                    V  d S r$   )
isinstancer   ).0r&   s     r(   	<genexpr>z!MatAdd.__new__.<locals>.<genexpr>8   s,      ??Qz!Z00??????r*   zgPassing check=False to MatAdd is deprecated and the check argument will be removed in a future version.)r%   listfiltermapr   r   __new__r   anyr   fromitervalidate	_evaluate)r'   r   r    r!   argsobjs   `     r(   r4   zMatAdd.__new__&   s'    	 < F6666==>> 	,GT**++DmC'$''' 	[%s)/+Y[ [ [ [ L  	[??$????? *|D)))dOOO%y)/+Y[ [ [ [
  	%--$$C
r*   c                      t          |          S r$   )canonicalize)r'   exprs     r(   r8   zMatAdd._evaluateF   s    D!!!r*   c                 &    | j         d         j        S Nr   )r9   shapeselfs    r(   r@   zMatAdd.shapeJ   s    y|!!r*   c                      t          |           S r$   )r   rA   s    r(   could_extract_minus_signzMatAdd.could_extract_minus_signN   s    (...r*   c                 n     t          t          |           j        di |}|                     |          S )N )superr   expandr8   )rB   kwargsexpanded	__class__s      r(   rH   zMatAdd.expandQ   s7    -5&&-7777~~h'''r*   c                 @    t          fd| j        D              S )Nc                 .    g | ]} |j         fi S rF   )_entry)r/   argr&   jrI   s     r(   
<listcomp>z!MatAdd._entry.<locals>.<listcomp>V   s/    EEECZSZ1////EEEr*   )r   r9   )rB   r&   rP   rI   s    ```r(   rN   zMatAdd._entryU   s-    EEEEEE49EEEFFr*   c                 V    t          d | j        D                                              S )Nc                 ,    g | ]}t          |          S rF   r   r/   rO   s     r(   rQ   z*MatAdd._eval_transpose.<locals>.<listcomp>Y   s    <<<3	#<<<r*   r   r9   doitrA   s    r(   _eval_transposezMatAdd._eval_transposeX   s*    <<$)<<<=BBDDDr*   c                 V    t          d | j        D                                              S )Nc                 ,    g | ]}t          |          S rF   r
   rT   s     r(   rQ   z(MatAdd._eval_adjoint.<locals>.<listcomp>\   s    ::::::r*   rU   rA   s    r(   _eval_adjointzMatAdd._eval_adjoint[   s*    ::	:::;@@BBBr*   c                 h    ddl m  t          fd| j        D                                              S )N   )tracec                 &    g | ]} |          S rF   rF   )r/   rO   r]   s     r(   rQ   z&MatAdd._eval_trace.<locals>.<listcomp>`   s!    555CUU3ZZ555r*   )r]   r   r9   rV   )rB   r]   s    @r(   _eval_tracezMatAdd._eval_trace^   sC          5555495556;;===r*   c                                          dd          }|rfd| j        D             }n| j        }t          t          |           S )NdeepTc                 *    g | ]} |j         d i S )rF   )rV   )r/   rO   hintss     r(   rQ   zMatAdd.doit.<locals>.<listcomp>e   s+    ;;;#HCH%%u%%;;;r*   )getr9   r<   r   )rB   rc   ra   r9   s    `  r(   rV   zMatAdd.doitb   sT    yy&& 	;;;;;;;DD9DFDM***r*   c                 B    fd| j         D             }d |D             S )Nc                 :    g | ]}|                               S rF   )_eval_derivative_matrix_lines)r/   rO   xs     r(   rQ   z8MatAdd._eval_derivative_matrix_lines.<locals>.<listcomp>k   s'    OOOcS66q99OOOr*   c                     g | ]	}|D ]}|
S rF   rF   )r/   r&   rP   s      r(   rQ   z8MatAdd._eval_derivative_matrix_lines.<locals>.<listcomp>l   s%    000aa000000r*   )r9   )rB   rh   	add_liness    ` r(   rg   z$MatAdd._eval_derivative_matrix_linesj   s2    OOOOTYOOO	0090000r*   )__name__
__module____qualname____doc__	is_MatAddr   r%   r4   classmethodr8   propertyr@   rD   rH   rN   rW   rZ   r_   rV   rg   __classcell__)rK   s   @r(   r   r      s          I  ""H%*$     @ " " [" " " X"/ / /( ( ( ( (G G GE E EC C C> > >+ + +1 1 1 1 1 1 1r*   r   c                      t          d | D                       st          d          | d         }| dd          D ](}|j        |j        k    rt          d|d|d          )d S )Nc              3   $   K   | ]}|j         V  d S r$   )	is_MatrixrT   s     r(   r0   zvalidate.<locals>.<genexpr>q   s$      --s}------r*   z Mix of Matrix and Scalar symbolsr   r\   z	Matrices z and z are not aligned)all	TypeErrorr@   r   )r9   ABs      r(   r7   r7   p   s    ------- <:;;;QA!""X J J7ag 	J*111aaaHIII	JJ Jr*   c                 6    |                                  d         S r?   )as_coeff_mmulrO   s    r(   r)   r)   y   s    ))++A. r*   c                 P    t          |                                 d                   S Nr\   )r   r{   r|   s    r(   r)   r)   z   s    s00221566 r*   c                     | dk    r|S | |z  S r~   rF   )cntmats     r(   combiner   {   s    
ax 
Syr*   c                     t          | j        d           }t          |d                   dk    r1t          |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   r|   s    r(   r)   z merge_explicit.<locals>.<lambda>   s    :c:+F+F r*   Tr\   F)r   r9   lenr   r   operatorr   )mataddgroupss     r(   merge_explicitr      s^    * &+FFGGF
6$<1 ufTl)K)K(LLNNr*   c                 8    | dk    pt          | t                    S r?   )r.   r   rh   s    r(   r)   r)      s    a<:a#<#< r*   c                 ,    t          | t                    S r$   )r.   r   r   s    r(   r)   r)      s    :a+@+@ r*   )/	functoolsr   r   
sympy.corer   r   sympy.core.addr   r   r   sympy.core.sortingr	   sympy.functionsr   sympy.matrices.commonr   sympy.matrices.matricesr   $sympy.matrices.expressions.transposer   sympy.strategiesr   r   r   r   r   r   r   r   "sympy.matrices.expressions.matexprr   "sympy.matrices.expressions.specialr   r   sympy.utilities.iterablesr   sympy.utilities.exceptionsr   r   register_handlerclassr7   	factor_of	matrix_ofr   r   rulesr<   rF   r*   r(   <module>r      sj          % % % % % % % % > > > > > > > > > > / / / / / / # # # # # # , , , , , , . . . . . . : : : : : :                    9 9 9 9 9 9 L L L L L L L L * * * * * * @ @ @ @ @ @Y1 Y1 Y1 Y1 Y1Z Y1 Y1 Y1v  3- 0 0 0J J J /.	66	    8 
<<	=	=			iG	,	,					! wyy!@!@!'1 1 2 2r*   