ó
~9­\c        	   @  sÞ  d  d l  m Z 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 d  d l m Z m Z m Z m Z m Z d  d	 l m Z d  d
 l m  Z  d e e f d „  ƒ  YZ! d „  Z" d „  Z# d „  Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) e$ e' e& e e d „  ƒ e% e( e e) f	 Z* e e i e e* Œ  e! 6ƒ ƒ Z+ d „  Z, d  d l- m. Z. m/ Z/ d  d l0 m1 Z1 d „  Z2 e2 e1 d <d S(   iÿÿÿÿ(   t   print_functiont   division(   t   Number(   t   Mult   Basict   sympify(   t   range(   t   adjoint(   t	   transpose(   t   rm_idt   unpackt   typedt   flattent   exhaustt   do_onet   new(   t
   MatrixExprt
   ShapeErrort   Identityt
   ZeroMatrixt   GenericIdentity(   t   MatPow(   t
   MatrixBaset   MatMulc           B  s’   e  Z d  Z e Z d „  Z e d „  ƒ Z e d „ Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z RS(   s  
    A product of matrix expressions

    Examples
    ========

    >>> from sympy import MatMul, MatrixSymbol
    >>> A = MatrixSymbol('A', 5, 4)
    >>> B = MatrixSymbol('B', 4, 3)
    >>> C = MatrixSymbol('C', 3, 6)
    >>> MatMul(A, B, C)
    A*B*C
    c         O  s‹   | j  d t ƒ } | s t ƒ  St d „  | ƒ } t t t | ƒ ƒ } t j |  | Œ } | j	 ƒ  \ } } | r} t
 | Œ  n  | s‡ | S| S(   Nt   checkc         S  s   t  ƒ  |  k S(   N(   R   (   t   i(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   <lambda>(   t    (   t   gett   TrueR   t   filtert   listt   mapR   R   t   __new__t   as_coeff_matricest   validate(   t   clst   argst   kwargsR   t   objt   factort   matrices(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyR!       s    c         C  s=   g  |  j  D] } | j r
 | ^ q
 } | d j | d j f S(   Ni    iÿÿÿÿ(   R%   t	   is_Matrixt   rowst   cols(   t   selft   argR)   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   shape5   s    %c           sé  d d l  m } m } m } m ‰  m ‰ |  j ƒ  \ } } t | ƒ d k rb | | d | | f Sd  g t | ƒ d }	 d  g t | ƒ d }
 | |	 d <| |	 d <x1 t	 d t | ƒ ƒ D] } | d | ƒ |	 | <qº Wx3 t
 | d  ƒ D]! \ } } | j d d |
 | <qé Wg  t
 | ƒ D]( \ } } | |	 | |	 | d f ^ q} | j | ƒ } t ‡  f d †  | Dƒ ƒ r}t } n  | | | t |	 d d !d g t |
 ƒ |
 ƒ Œ } t ‡ f d †  |
 Dƒ ƒ sÕt } n  | rå| j ƒ  S| S(   Niÿÿÿÿ(   t   Dummyt   SumR   t   ImmutableMatrixt   Integeri   i    s   i_%ic         3  s   |  ] } | j  ˆ  ƒ Vq d  S(   N(   t   has(   t   .0t   v(   R2   (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pys	   <genexpr>L   s    c         3  s$   |  ] } t  | ˆ  t f ƒ Vq d  S(   N(   t
   isinstancet   int(   R5   R6   (   R3   (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pys	   <genexpr>T   s    (   t   sympyR0   R1   R   R2   R3   R"   t   lent   NoneR   t	   enumerateR/   t   fromitert   anyR   t   zipt   Falset   doit(   R-   R   t   jt   expandR0   R1   R   t   coeffR)   t   indicest
   ind_rangesR.   t   expr_in_sumt   result(    (   R2   R3   s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   _entry:   s,    (

;	*	c         C  s~   g  |  j  D] } | j s
 | ^ q
 } g  |  j  D] } | j r/ | ^ q/ } t | Œ  } | j t k rt t d ƒ ‚ n  | | f S(   Ns3   noncommutative scalars in MatMul are not supported.(   R%   R*   R   t   is_commutativeR@   t   NotImplementedError(   R-   t   xt   scalarsR)   RD   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyR"   X   s    %%c         C  s"   |  j  ƒ  \ } } | t | Œ  f S(   N(   R"   R   (   R-   RD   R)   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   as_coeff_mmula   s    c         C  s9   t  g  |  j d  d  d … D] } t | ƒ ^ q Œ  j ƒ  S(   Niÿÿÿÿ(   R   R%   R   RA   (   R-   R.   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   _eval_transposee   s    c         C  s9   t  g  |  j d  d  d … D] } t | ƒ ^ q Œ  j ƒ  S(   Niÿÿÿÿ(   R   R%   R   RA   (   R-   R.   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   _eval_adjointh   s    c         C  sR   |  j  ƒ  \ } } | d k rB d d l m } | | | j ƒ  ƒ St d ƒ ‚ d  S(   Ni   (   t   traces   Can't simplify any further(   RN   RQ   RA   RK   (   R-   R(   t   mmulRQ   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   _eval_tracek   s
    c         C  sR   d d l  m } |  j ƒ  \ } } t | Œ  } | |  j t t t | | ƒ ƒ Œ  S(   Niÿÿÿÿ(   t   Determinant(   t&   sympy.matrices.expressions.determinantRT   R"   t   only_squaresR+   R   R   R    (   R-   RT   R(   R)   t   square_matrices(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   _eval_determinants   s    c         C  s…   yV t  g  |  j d  d  d … D]+ } t | t ƒ r> | j ƒ  n | d ^ q Œ  j ƒ  SWn( t k
 r€ d d l m } | |  ƒ SXd  S(   Niÿÿÿÿ(   t   Inverse(	   R   R%   R7   R   t   inverseRA   R   t"   sympy.matrices.expressions.inverseRY   (   R-   R.   RY   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   _eval_inversey   s    Pc         K  s„   | j  d t ƒ } | r@ g  |  j D] } | j |   ^ q" } n	 |  j } g  |  j D] } | j rS | ^ qS } t t | Œ  ƒ } | S(   Nt   deep(   R   R   R%   RA   R*   t   canonicalizeR   (   R-   R&   R]   R.   R%   t   matst   expr(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyRA   ‚   s    (	%c         K  sT   g  |  j  D] } | j r
 | ^ q
 } g  |  j  D] } | j s/ | ^ q/ } | | g S(   N(   R%   RJ   (   R-   R&   RL   t   coeff_ct   coeff_nc(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   args_cncŽ   s    %%c         C  sz  d d l  m } g  t |  j ƒ D]! \ } } | j | ƒ r  | ^ q  } g  } x&| D]} |  j |  } |  j | d }	 t j |	 ƒ }
 t j g  t |	 ƒ D] } | | ƒ j ƒ  ^ qš ƒ } t j | ƒ } t j g  t | ƒ D] } | | ƒ j ƒ  ^ qÝ ƒ } |  j | j	 | ƒ } x[ | D]S } | j
 rG| j |
 ƒ | j | ƒ n | j | ƒ | j |
 ƒ | j | ƒ qWqT W| S(   Ni   (   t	   Transpose(   R   Rd   R<   R%   R4   R   R=   t   reversedRA   t   _eval_derivative_matrix_linest
   transposedt   append_firstt   append_secondt   append(   R-   RL   Rd   R   R.   t
   with_x_indt   linest   indt	   left_argst
   right_argst	   right_matt	   right_revt   left_matt   left_revt   d(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyRf   “   s&    744	(   t   __name__t
   __module__t   __doc__R   t	   is_MatMulR!   t   propertyR/   RI   R"   RN   RO   RP   RS   RX   R\   RA   Rc   Rf   (    (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyR      s   												c          G  sg   x` t  t |  ƒ d ƒ D]H } |  | | d !\ } } | j | j k r t d | | f ƒ ‚ q q Wd S(   s,    Checks for valid shapes for args of MatMul i   i   s"   Matrices %s and %s are not alignedN(   R   R:   R,   R+   R   (   R)   R   t   At   B(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyR#   ­   s    c          G  s*   |  d d k r |  d }  n  t  t |  Œ S(   Ni    i   (   R   R   (   R%   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   newmul·   s    c         C  s{   t  g  |  j D]! } | j p+ | j o+ | j ^ q ƒ rw g  |  j D] } | j rA | ^ qA } t | d j | d j ƒ S|  S(   Ni    iÿÿÿÿ(   R>   R%   t   is_zeroR*   t   is_ZeroMatrixR   R+   R,   (   t   mulR.   R)   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt	   any_zeros¼   s
    1%c         C  s©   t  d „  |  j Dƒ ƒ s |  Sg  } |  j d } x_ |  j d D]P } t | t t f ƒ r{ t | t t f ƒ r{ | | } q> | j | ƒ | } q> W| j | ƒ t | Œ  S(   s   Merge explicit MatrixBase arguments

    >>> from sympy import MatrixSymbol, eye, Matrix, MatMul, pprint
    >>> from sympy.matrices.expressions.matmul import merge_explicit
    >>> A = MatrixSymbol('A', 2, 2)
    >>> B = Matrix([[1, 1], [1, 1]])
    >>> C = Matrix([[1, 2], [3, 4]])
    >>> X = MatMul(A, B, C)
    >>> pprint(X)
      [1  1] [1  2]
    A*[    ]*[    ]
      [1  1] [3  4]
    >>> pprint(merge_explicit(X))
      [4  6]
    A*[    ]
      [4  6]

    >>> X = MatMul(B, A, C)
    >>> pprint(X)
    [1  1]   [1  2]
    [    ]*A*[    ]
    [1  1]   [3  4]
    >>> pprint(merge_explicit(X))
    [1  1]   [1  2]
    [    ]*A*[    ]
    [1  1]   [3  4]
    c         s  s   |  ] } t  | t ƒ Vq d  S(   N(   R7   R   (   R5   R.   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pys	   <genexpr>ß   s    i    i   (   R>   R%   R7   R   R   Rj   R   (   t   matmult   newargst   lastR.   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   merge_explicitÃ   s    *
c         C  sh  d d l  m } |  j ƒ  \ } } x?t t | d  | d ƒ ƒ D] \ } \ } } yú | j rK| j rK| d } } | d }	 }
 t | t ƒ r² t | | ƒ r² | j \ } } n  t | t ƒ rã t | | ƒ rã | j \ }	 }
 n  | |	 j	 ƒ  k rK| |
 d k r| | |
 } n |	 |
 | } t
 | | |  | g | | d Œ Sn  Wq@ t k
 r_q@ Xq@ W|  S(   s    Y * X * X.I -> Y iÿÿÿÿ(   RY   i   i    i   (   R[   RY   R"   R<   R?   t	   is_squareR7   R   R%   RZ   R|   t
   ValueError(   R   RY   R(   R)   R   t   Xt   Yt   _Xt   x_expt   _Yt   y_expt   I(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   xxinví   s&    0+c         C  sK   |  j  ƒ  \ } } t d „  ƒ | ƒ } | | k rC t | | j Œ S|  Sd S(   sñ    Remove Identities from a MatMul

    This is a modified version of sympy.strategies.rm_id.
    This is necesssary because MatMul may contain both MatrixExprs and Exprs
    as args.

    See Also
    ========

    sympy.strategies.rm_id
    c         S  s   |  j  t k S(   N(   t   is_IdentityR   (   RL   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyR     R   N(   RN   R	   R|   R%   (   R   R(   RR   RH   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt
   remove_ids  s
    c         C  s/   |  j  ƒ  \ } } | d k r+ t | | Œ S|  S(   Ni   (   R"   R|   (   R   R(   R)   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   factor_in_front  s    c   
      C  s  d d l  m } |  j ƒ  \ } } g  } d  } d } xª | j D]Ÿ } t | | ƒ rp | j d } | j d }	 n | } d }	 | | k r• | |	 7} q> | d  k	 rÑ | d k r½ | j | ƒ qÑ | j | | ƒ n  |	 } | } q> W| d k rý | j | ƒ n | j | | ƒ t | | Œ S(   Niÿÿÿÿ(   R   i    i   (   t   sympy.matrices.expressionsR   RN   R;   R%   R7   Rj   R|   (
   R   R   R(   RR   R%   t   baset   expR.   t   current_baset   current_exp(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   combine_powers  s.    
c         C  s
   |  d k S(   Ni   (    (   RL   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyR   ?  R   c          G  s   |  d j  |  d j k r) t d ƒ ‚ n  g  } d } xa t |  ƒ D]S \ } } | j |  | j  k rB | j t |  | | d !Œ  j ƒ  ƒ | d } qB qB W| S(   s'   factor matrices only if they are squarei    iÿÿÿÿs!   Invalid matrices being multipliedi   (   R+   R,   t   RuntimeErrorR<   Rj   R   RA   (   R)   t   outt   startR   t   M(    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyRV   C  s    $(   t   askt   Q(   t   handlers_dictc         C  s  g  } g  } x7 |  j  D], } | j r5 | j | ƒ q | j | ƒ q W| d } x¢ | d D]– } | | j k rž t t j | ƒ | ƒ rž t | j d ƒ } q[ | | j	 ƒ  k rÞ t t j
 | ƒ | ƒ rÞ t | j d ƒ } q[ | j | ƒ | } q[ W| j | ƒ t | Œ  S(   sè   
    >>> from sympy import MatrixSymbol, Q, assuming, refine
    >>> X = MatrixSymbol('X', 2, 2)
    >>> expr = X * X.T
    >>> print(expr)
    X*X.T
    >>> with assuming(Q.orthogonal(X)):
    ...     print(refine(expr))
    I
    i    i   (   R%   R*   Rj   t   TRœ   R   t
   orthogonalR   R/   t	   conjugatet   unitaryR   (   R`   t   assumptionsR‚   t   exprargsR%   Rƒ   R.   (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   refine_MatMulT  s     	
'*
N(3   t
   __future__R    R   R9   R   t
   sympy.coreR   R   R   t   sympy.core.compatibilityR   t   sympy.functionsR   t$   sympy.matrices.expressions.transposeR   t   sympy.strategiesR	   R
   R   R   R   R   R   t"   sympy.matrices.expressions.matexprR   R   R   R   R   t!   sympy.matrices.expressions.matpowR   t   sympy.matrices.matricesR   R   R#   R|   R€   R„   RŽ   R   R‘   R—   t   rulesR^   RV   t   sympy.assumptions.askRœ   R   t   sympy.assumptions.refineRž   R¥   (    (    (    s@   lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyt   <module>   s4   4(	
			*				 		"