a
    RG5d                     @   sX  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 deeZ&e'ee&fe& dd Z(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)
ShapeError)
MatrixBase	transpose)rm_idunpackflattensort	conditionexhaustdo_oneglom)
MatrixExpr)
ZeroMatrixGenericZeroMatrix)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|}|r2ttt|}tj g|R  }|d urZtdddd |dv rtdd	 |D s~t	
|S t|  ntd
ddd |r |}|S )Nc                    s
    j | kS N)identity)icls ]/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/matrices/expressions/matadd.py<lambda>,       z MatAdd.__new__.<locals>.<lambda>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                 s   s   | ]}t |tV  qd S r    )
isinstancer   ).0r"   r%   r%   r&   	<genexpr>8   r(   z!MatAdd.__new__.<locals>.<genexpr>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objr%   r#   r&   r1   &   s0    


zMatAdd.__new__c                 C   s   t |S r    )canonicalize)r$   exprr%   r%   r&   r5   F   s    zMatAdd._evaluatec                 C   s   | j d jS Nr   )r6   shapeselfr%   r%   r&   r;   J   s    zMatAdd.shapec                 C   s   t | S r    )r   r<   r%   r%   r&   could_extract_minus_signN   s    zMatAdd.could_extract_minus_signc                    s    t t| jf i |}| |S r    )superr   expandr5   )r=   kwargsexpanded	__class__r%   r&   r@   Q   s    zMatAdd.expandc                    s   t  fdd| jD  S )Nc                    s    g | ]}|j  fi qS r%   )_entryr,   argr"   jrA   r%   r&   
<listcomp>V   r(   z!MatAdd._entry.<locals>.<listcomp>)r   r6   )r=   r"   rI   rA   r%   rH   r&   rE   U   s    zMatAdd._entryc                 C   s   t dd | jD   S )Nc                 S   s   g | ]}t |qS r%   r   rF   r%   r%   r&   rJ   Y   r(   z*MatAdd._eval_transpose.<locals>.<listcomp>r   r6   doitr<   r%   r%   r&   _eval_transposeX   s    zMatAdd._eval_transposec                 C   s   t dd | jD   S )Nc                 S   s   g | ]}t |qS r%   r	   rF   r%   r%   r&   rJ   \   r(   z(MatAdd._eval_adjoint.<locals>.<listcomp>rK   r<   r%   r%   r&   _eval_adjoint[   s    zMatAdd._eval_adjointc                    s(   ddl m   t fdd| jD   S )N   tracec                    s   g | ]} |qS r%   r%   rF   rP   r%   r&   rJ   `   r(   z&MatAdd._eval_trace.<locals>.<listcomp>)rQ   r   r6   rL   r<   r%   rP   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 f i  qS r%   )rL   rF   hintsr%   r&   rJ   e   r(   zMatAdd.doit.<locals>.<listcomp>)getr6   r8   r   )r=   rU   rS   r6   r%   rT   r&   rL   b   s
    zMatAdd.doitc                    s"    fdd| j D }dd |D S )Nc                    s   g | ]}|  qS r%   )_eval_derivative_matrix_linesrF   xr%   r&   rJ   k   r(   z8MatAdd._eval_derivative_matrix_lines.<locals>.<listcomp>c                 S   s   g | ]}|D ]}|qqS r%   r%   )r,   r"   rI   r%   r%   r&   rJ   l   r(   )r6   )r=   rY   Z	add_linesr%   rX   r&   rW   j   s    z$MatAdd._eval_derivative_matrix_lines)__name__
__module____qualname____doc__	is_MatAddr   r!   r1   classmethodr5   propertyr;   r>   r@   rE   rM   rN   rR   rL   rW   __classcell__r%   r%   rC   r&   r      s     

r   c                  G   sT   t dd | D std| d }| dd  D ] }|j|jkr.td||f q.d S )Nc                 s   s   | ]}|j V  qd S r    )	is_MatrixrF   r%   r%   r&   r-   q   r(   zvalidate.<locals>.<genexpr>z Mix of Matrix and Scalar symbolsr   rO   z"Matrices %s and %s are not aligned)all	TypeErrorr;   r   )r6   ABr%   r%   r&   r4   p   s    r4   c                 C   s   |   d S r:   )as_coeff_mmulrG   r%   r%   r&   r'   y   r(   r'   c                 C   s   t |  d S NrO   )r   rg   rh   r%   r%   r&   r'   z   r(   c                 C   s   | dkr|S | | S d S ri   r%   )cntmatr%   r%   r&   combine{   s    rl   c                 C   sF   t | jdd }t|d dkr>t|d ttj|d g  S | S d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   s
   t | tS r    )r+   r   rh   r%   r%   r&   r'      r(   z merge_explicit.<locals>.<lambda>TrO   FN)r   r6   lenr   r   operatorr   )mataddgroupsr%   r%   r&   merge_explicit   s    rq   c                 C   s   | dkpt | tS r:   )r+   r   rX   r%   r%   r&   r'      r(   c                 C   s
   t | tS r    )r+   r   rX   r%   r%   r&   r'      r(   )/	functoolsr   rn   
sympy.corer   r   Z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   Z"sympy.matrices.expressions.specialr   r   sympy.utilities.iterablesr   sympy.utilities.exceptionsr   r   register_handlerclassr4   Z	factor_ofZ	matrix_ofrl   rq   rulesr8   r%   r%   r%   r&   <module>   s<   ([	


