B
    ˜‘[@  ã               @   s0  d dl mZmZ d dlmZ d dl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mZmZmZmZmZmZmZ d d	lmZmZmZ d d
lmZm Z  d dl!m"Z" G dd„ dee"ƒZ#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 )é    )Úprint_functionÚdivision)Úreduce)Úadd)ÚAddÚBasicÚsympify)Úadjoint)Ú
MatrixBase)Ú	transpose)Úrm_idÚunpackÚflattenÚsortÚ	conditionÚexhaustÚdo_oneÚglom)Ú
MatrixExprÚ
ShapeErrorÚ
ZeroMatrix)Údefault_sort_keyÚsift)ÚAssocOpc               @   sR   e Zd ZdZdZdd„ Zedd„ ƒZddd	„Zd
d„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚMatAdda  A Sum of Matrix Expressions

    MatAdd inherits from and operates like SymPy Add

    >>> 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
    Tc             O   s:   t tt|ƒƒ}| dd¡}tj| f|žŽ }|r6t|Ž  |S )NÚcheckT)ÚlistÚmapr   Úgetr   Ú__new__Úvalidate)ÚclsÚargsÚkwargsr   Úobj© r%   ú@lib/python3.7/site-packages/sympy/matrices/expressions/matadd.pyr      s    zMatAdd.__new__c             C   s   | j d jS )Nr   )r"   Úshape)Úselfr%   r%   r&   r'   '   s    zMatAdd.shapeNc                s   t ‡ ‡fdd„| jD ƒŽ S )Nc                s   g | ]}|  ˆ ˆ¡‘qS r%   )Ú_entry)Ú.0Úarg)ÚiÚjr%   r&   ú
<listcomp>,   s    z!MatAdd._entry.<locals>.<listcomp>)r   r"   )r(   r,   r-   Úexpandr%   )r,   r-   r&   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%   r&   r.   /   s    z*MatAdd._eval_transpose.<locals>.<listcomp>)r   r"   Údoit)r(   r%   r%   r&   Ú_eval_transpose.   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%   r&   r.   2   s    z(MatAdd._eval_adjoint.<locals>.<listcomp>)r   r"   r0   )r(   r%   r%   r&   Ú_eval_adjoint1   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*   r+   )r4   r%   r&   r.   6   s    z&MatAdd._eval_trace.<locals>.<listcomp>)r4   r   r"   r0   )r(   r%   )r4   r&   Ú_eval_trace4   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%   )r0   )r*   r+   )r#   r%   r&   r.   ;   s    zMatAdd.doit.<locals>.<listcomp>)r   r"   Úcanonicalizer   )r(   r#   r6   r"   r%   )r#   r&   r0   8   s
    zMatAdd.doit)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	is_MatAddr   Úpropertyr'   r)   r1   r2   r5   r0   r%   r%   r%   r&   r      s   	
r   c              G   sX   t dd„ | D ƒƒstdƒ‚| d }x0| dd … D ] }|j|jkr0td||f ƒ‚q0W d S )Nc             s   s   | ]}|j V  qd S )N)Z	is_Matrix)r*   r+   r%   r%   r&   ú	<genexpr>B   s    zvalidate.<locals>.<genexpr>z Mix of Matrix and Scalar symbolsr   r3   z"Matrices %s and %s are not aligned)ÚallÚ	TypeErrorr'   r   )r"   ÚAÚBr%   r%   r&   r    A   s    r    c             C   s   |   ¡ d S )Nr   )Úas_coeff_mmul)r+   r%   r%   r&   Ú<lambda>J   s    rC   c             C   s   t |  ¡ d ƒS )Nr3   )r   rB   )r+   r%   r%   r&   rC   K   s    c             C   s   | dkr|S | | S d S )Nr3   r%   )ZcntZmatr%   r%   r&   ÚcombineL   s    rD   c             C   sD   t | jdd„ ƒ}t|d ƒdkr<t|d tt|d ƒg Ž S | S dS )aÔ   Merge explicit MatrixBase arguments

    >>> 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 )N)Ú
isinstancer
   )r+   r%   r%   r&   rC   e   s    z merge_explicit.<locals>.<lambda>Tr3   FN)r   r"   Úlenr   r   r   )ZmataddÚgroupsr%   r%   r&   Úmerge_explicitS   s    rH   c             C   s   | dkpt | tƒS )Nr   )rE   r   )Úxr%   r%   r&   rC   l   s    c             C   s
   t | tƒS )N)rE   r   )rI   r%   r%   r&   rC   s   s    N)+Z
__future__r   r   Zsympy.core.compatibilityr   Úoperatorr   Z
sympy.corer   r   r   Zsympy.functionsr	   Zsympy.matrices.matricesr
   Z$sympy.matrices.expressions.transposer   Zsympy.strategiesr   r   r   r   r   r   r   r   Z"sympy.matrices.expressions.matexprr   r   r   Zsympy.utilitiesr   r   Zsympy.core.operationsr   r   r    Z	factor_ofZ	matrix_ofrD   rH   Zrulesr7   r%   r%   r%   r&   Ú<module>   s0   (1	



