U
    ZÊ¹j¥  ã                   @   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„|ƒƒ}|r2ttt|ƒƒ}tdd„ |D ƒƒsLtdƒ‚tjˆ f|žŽ }|d k	rrt	dddd	� |d
k	r‚t
|Ž  |r�ˆ  |¡}|S )Nc                    s
   ˆ j | kS ©N)Úidentity)Úi©Úcls© ú`/var/www/html/bwave/python/venv/lib/python3.8/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)Zdeprecated_since_versionZactive_deprecations_targetF)r!   ÚlistÚfilterÚmapr   ÚallÚ	TypeErrorr   Ú__new__r   ÚvalidateÚ	_evaluate)r$   r   r   r   ÚargsÚobjr%   r#   r&   r3   &   s&    ý
zMatAdd.__new__c                 C   s   t |ƒS r    )Úcanonicalize)r$   Úexprr%   r%   r&   r5   C   s    zMatAdd._evaluatec                 C   s   | j d jS ©Nr   )r6   Ú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f |Ž}|  |¡S r    )Úsuperr   Úexpandr5   )r=   ÚkwargsÚexpanded©Ú	__class__r%   r&   r@   N   s    zMatAdd.expandc                    s   t ‡ ‡‡fdd„| jD ƒŽ S )Nc                    s   g | ]}|j ˆ ˆfˆŽ‘qS r%   )Ú_entryr*   ©r"   ÚjrA   r%   r&   Ú
<listcomp>S   s     z!MatAdd._entry.<locals>.<listcomp>)r   r6   )r=   r"   rG   rA   r%   rF   r&   rE   R   s    zMatAdd._entryc                 C   s   t dd„ | jD ƒŽ  ¡ S )Nc                 S   s   g | ]}t |ƒ‘qS r%   r   r*   r%   r%   r&   rH   V   s     z*MatAdd._eval_transpose.<locals>.<listcomp>©r   r6   Údoitr<   r%   r%   r&   Ú_eval_transposeU   s    zMatAdd._eval_transposec                 C   s   t dd„ | jD ƒŽ  ¡ S )Nc                 S   s   g | ]}t |ƒ‘qS r%   r	   r*   r%   r%   r&   rH   Y   s     z(MatAdd._eval_adjoint.<locals>.<listcomp>rI   r<   r%   r%   r&   Ú_eval_adjointX   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%   r*   rN   r%   r&   rH   ]   s     z&MatAdd._eval_trace.<locals>.<listcomp>)rO   r   r6   rJ   r<   r%   rN   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 ˆ Ž‘qS r%   )rJ   r*   ©Úhintsr%   r&   rH   b   s     zMatAdd.doit.<locals>.<listcomp>)Úgetr6   r8   r   )r=   rS   rQ   r6   r%   rR   r&   rJ   _   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&   rH   h   s     z8MatAdd._eval_derivative_matrix_lines.<locals>.<listcomp>c                 S   s   g | ]}|D ]}|‘qqS r%   r%   )r+   r"   rG   r%   r%   r&   rH   i   s       )r6   )r=   rW   Z	add_linesr%   rV   r&   rU   g   s    z$MatAdd._eval_derivative_matrix_lines)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	is_MatAddr   r!   r3   Úclassmethodr5   Úpropertyr;   r>   r@   rE   rK   rL   rP   rJ   rU   Ú__classcell__r%   r%   rC   r&   r      s    

r   c                 C   s   |   ¡ d S r:   )Úas_coeff_mmul©r,   r%   r%   r&   r'   n   r(   r'   c                 C   s   t |  ¡ d ƒS ©NrM   )r   r_   r`   r%   r%   r&   r'   o   r(   c                 C   s   | dkr|S | | S d S ra   r%   )ZcntZmatr%   r%   r&   Úcombinep   s    rb   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   r`   r%   r%   r&   r'   Œ   r(   z merge_explicit.<locals>.<lambda>TrM   FN)r   r6   Úlenr   r   Úoperatorr   )ZmataddÚgroupsr%   r%   r&   Úmerge_explicitw   s    rf   c                 C   s   | dkpt | tƒS r:   )r)   r   rV   r%   r%   r&   r'   “   r(   c                 C   s
   t | tƒS r    )r)   r   rV   r%   r%   r&   r'   š   r(   )/Ú	functoolsr   rd   Z
sympy.corer   r   Zsympy.core.addr   r   r   Zsympy.core.sortingr   Zsympy.functionsr
   Zsympy.matrices.matrixbaser   Z$sympy.matrices.expressions.transposer   Zsympy.strategiesr   r   r   r   r   r   r   r   Z"sympy.matrices.expressions.matexprr   Z"sympy.matrices.expressions.specialr   r   Z!sympy.matrices.expressions._shaper   r4   Zsympy.utilities.iterablesr   Zsympy.utilities.exceptionsr   r   Zregister_handlerclassZ	factor_ofZ	matrix_ofrb   rf   Úrulesr8   r%   r%   r%   r&   Ú<module>   s:   (X

û
ÿ