a
    <b{                     @   sL  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# 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)siftc                   @   sp   e Zd ZdZdZe ZddddddZedd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zd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
    TF)evaluatecheck_sympifyc                   s   |s
 j S tt fdd|}|r2ttt|}tj g|R  }|rltdd |D sdt	|S t
|  |rtdd |D st|ddiS t|}|S )Nc                    s
    j | kS N)identity)icls q/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/matrices/expressions/matadd.py<lambda>+       z MatAdd.__new__.<locals>.<lambda>c                 s   s   | ]}t |tV  qd S r   
isinstancer   .0r!   r$   r$   r%   	<genexpr>2   r'   z!MatAdd.__new__.<locals>.<genexpr>c                 s   s   | ]}t |tV  qd S r   r(   r*   r$   r$   r%   r,   7   r'   r   T)r    listfiltermapr   r   __new__anyr   Zfromitervalidatecanonicalize)r#   r   r   r   argsobjr$   r"   r%   r0   %   s    
zMatAdd.__new__c                 C   s   | j d jS Nr   )r4   shapeselfr$   r$   r%   r7   =   s    zMatAdd.shapec                 C   s   t | S r   )r   r8   r$   r$   r%   could_extract_minus_signA   s    zMatAdd.could_extract_minus_signc                    s   t  fdd| jD  S )Nc                    s    g | ]}|j  fi qS r$   )_entryr+   argr!   jkwargsr$   r%   
<listcomp>E   r'   z!MatAdd._entry.<locals>.<listcomp>)r   r4   )r9   r!   r?   r@   r$   r>   r%   r;   D   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%   rA   H   r'   z*MatAdd._eval_transpose.<locals>.<listcomp>r   r4   doitr8   r$   r$   r%   _eval_transposeG   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%   rA   K   r'   z(MatAdd._eval_adjoint.<locals>.<listcomp>rB   r8   r$   r$   r%   _eval_adjointJ   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<   rG   r$   r%   rA   O   r'   z&MatAdd._eval_trace.<locals>.<listcomp>)rH   r   r4   rC   r8   r$   rG   r%   _eval_traceM   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$   )rC   r<   r@   r$   r%   rA   T   r'   zMatAdd.doit.<locals>.<listcomp>)getr4   r3   r   )r9   r@   rJ   r4   r$   rK   r%   rC   Q   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%   rA   Z   r'   z8MatAdd._eval_derivative_matrix_lines.<locals>.<listcomp>c                 S   s   g | ]}|D ]}|qqS r$   r$   )r+   r!   r?   r$   r$   r%   rA   [   r'   )r4   )r9   rO   Z	add_linesr$   rN   r%   rM   Y   s    z$MatAdd._eval_derivative_matrix_linesN)__name__
__module____qualname____doc__Z	is_MatAddr   r    r0   propertyr7   r:   r;   rD   rE   rI   rC   rM   r$   r$   r$   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   )Z	is_Matrixr<   r$   r$   r%   r,   `   r'   zvalidate.<locals>.<genexpr>z Mix of Matrix and Scalar symbolsr   rF   z"Matrices %s and %s are not aligned)all	TypeErrorr7   r   )r4   ABr$   r$   r%   r2   _   s    r2   c                 C   s   |   d S r6   )as_coeff_mmulr=   r$   r$   r%   r&   h   r'   r&   c                 C   s   t |  d S NrF   )r   rY   rZ   r$   r$   r%   r&   i   r'   c                 C   s   | dkr|S | | S d S r[   r$   )Zcntmatr$   r$   r%   combinej   s    r]   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   rZ   r$   r$   r%   r&      r'   z merge_explicit.<locals>.<lambda>TrF   FN)r   r4   lenr   r   operatorr   )Zmataddgroupsr$   r$   r%   merge_explicitq   s    ra   c                 C   s   | dkpt | tS r6   )r)   r   rN   r$   r$   r%   r&      r'   c                 C   s
   t | tS r   )r)   r   rN   r$   r$   r%   r&      r'   )-	functoolsr   r_   Z
sympy.corer   r   Zsympy.core.addr   r   r   Zsympy.core.sortingr   Zsympy.functionsr
   Zsympy.matrices.commonr   Zsympy.matrices.matricesr   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.utilitiesr   r   Zregister_handlerclassr2   Z	factor_ofZ	matrix_ofr]   ra   rulesr3   r$   r$   r$   r%   <module>   s:   (K	


