ķ
~9­\c           @  s  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 m Z d  d
 l m  Z  m! Z! d e e f d     YZ" 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(   i˙˙˙˙(   t   print_functiont   division(   t   reduce(   t   add(   t   Addt   Basict   sympify(   t   adjoint(   t
   MatrixBase(   t	   transpose(   t   rm_idt   unpackt   flattent   sortt	   conditiont   exhaustt   do_onet   glom(   t
   MatrixExprt
   ShapeErrort
   ZeroMatrixt   GenericZeroMatrix(   t   default_sort_keyt   siftt   MatAddc           B  se   e  Z d  Z e Z d   Z e d    Z d	 d  Z	 d   Z
 d   Z d   Z d   Z d   Z RS(
   s3  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
    c         O  s   | s t    St d   |  } t t t |   } | j d t  } t j |  |  } | r t	 d   | D  r t
 j |  St |   n  | S(   Nc         S  s   t    |  k S(   N(   R   (   t   i(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyt   <lambda>(   t    t   checkc         s  s   |  ] } t  | t  Vq d  S(   N(   t
   isinstanceR   (   t   .0R   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pys	   <genexpr>.   s    (   R   t   filtert   listt   mapR   t   gett   FalseR   t   __new__t   allR   t   fromitert   validate(   t   clst   argst   kwargsR   t   obj(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR$   "   s    c         C  s   |  j  d j S(   Ni    (   R)   t   shape(   t   self(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR,   3   s    c         C  s,   t  g  |  j D] } | j | |  ^ q   S(   N(   R   R)   t   _entry(   R-   R   t   jt   expandt   arg(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR.   7   s    c         C  s,   t  g  |  j D] } t |  ^ q   j   S(   N(   R   R)   R	   t   doit(   R-   R1   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyt   _eval_transpose:   s    c         C  s,   t  g  |  j D] } t |  ^ q   j   S(   N(   R   R)   R   R2   (   R-   R1   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyt   _eval_adjoint=   s    c         C  s<   d d l  m  } t g  |  j D] } | |  ^ q   j   S(   Ni   (   t   trace(   R5   R   R)   R2   (   R-   R5   R1   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyt   _eval_trace@   s    c         K  sY   | j  d t  } | r@ g  |  j D] } | j |   ^ q" } n	 |  j } t t |    S(   Nt   deep(   R"   t   TrueR)   R2   t   canonicalizeR   (   R-   R*   R7   R1   R)   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR2   D   s
    (	c         C  sI   g  |  j  D] } | j |  ^ q
 } g  | D] } | D] } | ^ q6 q, S(   N(   R)   t   _eval_derivative_matrix_lines(   R-   t   xR1   t	   add_linesR   R/   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR:   L   s    %N(   t   __name__t
   __module__t   __doc__R8   t	   is_MatAddR$   t   propertyR,   t   NoneR.   R3   R4   R6   R2   R:   (    (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR      s   					c          G  ss   t  d   |  D  s% t d   n  |  d } x= |  d D]1 } | j | j k r: t d | | f   q: q: Wd  S(   Nc         s  s   |  ] } | j  Vq d  S(   N(   t	   is_Matrix(   R   R1   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pys	   <genexpr>R   s    s    Mix of Matrix and Scalar symbolsi    i   s"   Matrices %s and %s are not aligned(   R%   t	   TypeErrorR,   R   (   R)   t   At   B(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR'   Q   s    
c         C  s   |  j    d S(   Ni    (   t   as_coeff_mmul(   R1   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR   Z   R   c         C  s   t  |  j   d  S(   Ni   (   R   RG   (   R1   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR   [   R   c         C  s   |  d k r | S|  | Sd  S(   Ni   (    (   t   cntt   mat(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyt   combine\   s    c         C  sU   t  |  j d    } t | t  d k rM t | t t t | t  g   S|  Sd S(   sī   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(   N(   R   R   (   R1   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR   x   R   i   N(   R   R)   t   lenR8   R   R#   R   R   (   t   mataddt   groups(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyt   merge_explicitc   s    "c         C  s   |  d k p t  |  t  S(   Ni    (   R   R   (   R;   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR      R   c         C  s   t  |  t  S(   N(   R   R   (   R;   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyR      R   N(*   t
   __future__R    R   t   sympy.core.compatibilityR   t   operatorR   t
   sympy.coreR   R   R   t   sympy.functionsR   t   sympy.matrices.matricesR   t$   sympy.matrices.expressions.transposeR	   t   sympy.strategiesR
   R   R   R   R   R   R   R   t"   sympy.matrices.expressions.matexprR   R   R   R   t   sympy.utilitiesR   R   R   R'   t	   factor_oft	   matrix_ofRJ   RN   t   rulesR9   (    (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matadd.pyt   <module>   s.   :"@						