ó
¦–Õ\c           @` s¤   d  d l  m Z m Z m Z d  d l m Z d  d l Z d  d l m	 Z	 d d l
 m Z m Z m Z d Z e e ƒ Z d „  Z d	 „  Z e e j ƒ d
 „  ƒ Z d S(   i    (   t   divisiont   print_functiont   absolute_import(   t   wrapsN(   t
   basestringi   (   t	   blockwiset   asarrayt   einsum_lookupt4   abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZc          O` sv   | j  d ƒ } | j  d ƒ } | j  d ƒ } t j t |  d ƒ ƒ } | | d | |  | Ž} | j | j d | ƒ S(   Nt
   subscriptst   ncontract_indst   kernel_dtypei    t   dtypei   (   i   (   t   popR   t   dispatcht   typet   reshapet   shape(   t   operandst   kwargsR	   R
   R   t   einsumt   chunk(    (    s5   lib/python2.7/site-packages/dask/array/einsumfuncs.pyt   chunk_einsum   s    c         C` s±  t  |  ƒ d k r! t d ƒ ‚ n  t |  d t ƒ r² |  d j d d ƒ } g  |  d D] } t | ƒ ^ qU }  xó| D]7 } | d k rŒ qt n  | t k rt t d | ƒ ‚ qt qt Wn±t |  ƒ } g  } g  } xJ t t  |  ƒ d ƒ D]2 } | j	 | j
 d ƒ ƒ | j	 | j
 d ƒ ƒ qá Wt  | ƒ r-| d	 n d } g  | D] }	 t |	 ƒ ^ q:}  d } t  | ƒ d }
 x‰ t | ƒ D]{ \ } } xS | D]K } | t k r§| d
 7} qˆt | t ƒ rÇ| t | 7} qˆt d ƒ ‚ qˆW| |
 k ru| d 7} ququW| d k	 rc| d 7} xV | D]K } | t k r0| d
 7} qt | t ƒ rP| t | 7} qt d ƒ ‚ qWn  d | k s{d | k rÒ| j d ƒ d k p¢| j d ƒ d k } | sÀ| j d ƒ d k rÒt d ƒ ‚ qÒn  d | k r¤| j d d ƒ j d d ƒ j d d ƒ } t t t | ƒ ƒ } d j | ƒ } d } d | k rl| j d ƒ \ } } | j d ƒ } t } n | j d ƒ } t } xt | ƒ D]\ } } d | k rŽ| j d ƒ d k sÐ| j d
 ƒ d k rßt d ƒ ‚ n  |  | j d k rûd } n* t |  | j d ƒ } | t  | ƒ d 8} | | k r:| } n  | d k  rUt d ƒ ‚ qž| d k rz| j d
 d ƒ | | <qž| | } | j d
 | ƒ | | <qŽqŽWd j | ƒ } | d k rÆd } n | | } | rô| d | j d
 | ƒ 7} q¤d } | j d d ƒ } x[ t t | ƒ ƒ D]G } | t k rDt d | ƒ ‚ n  | j | ƒ d k r| | 7} qqWd j t t | ƒ t | ƒ ƒ ƒ } | d | | 7} n  d | k rÈ| j d ƒ \ } } n| | } | j d d ƒ } d } x[ t t | ƒ ƒ D]G } | t k rt d | ƒ ‚ n  | j | ƒ d k rù| | 7} qùqùWx- | D]% } | | k rKt d | ƒ ‚ qKqKWt  | j d ƒ ƒ t  |  ƒ k r¤t d ƒ ‚ n  | | |  f S(   s§  
    A reproduction of numpy's _parse_einsum_input()
    which in itself is a reproduction of
    c side einsum parsing in python.

    Returns
    -------
    input_strings : str
        Parsed input strings
    output_string : str
        Parsed output string
    operands : list of array_like
        The operands to use in the numpy contraction
    Examples
    --------
    The operand list is simplified to reduce printing:
    >> a = np.random.rand(4, 4)
    >> b = np.random.rand(4, 4, 4)
    >> __parse_einsum_input(('...a,...a->...', a, b))
    ('za,xza', 'xz', [a, b])
    >> __parse_einsum_input((a, [Ellipsis, 0], b, [Ellipsis, 0]))
    ('za,xza', 'xz', [a, b])
    i    s   No input operandst    t    i   s   .,->s#   Character %s is not a valid symbol.i   iÿÿÿÿs   ...s=   For this input type lists must contain either int or Ellipsist   ,s   ->t   -t   >s%   Subscripts can only contain one '->'.t   .i   s   Invalid Ellipses.s   Ellipses lengths do not match.s/   Output character %s did not appear in the inputsD   Number of einsum subscripts must be equal to the number of operands.N(    (   t   lent
   ValueErrort
   isinstanceR   t   replaceR   t   einsum_symbols_sett   listt   ranget   appendR   t   Nonet	   enumeratet   Ellipsist   intt   einsum_symbolst	   TypeErrort   countt   sett   joint   splitt   Truet   FalseR   t   maxt   ndimt   sorted(   R   R	   t   ot   st   tmp_operandst   operand_listt   subscript_listt   pt   output_listt   vt   lastt   numt   subt   invalidt   usedt   unusedt   ellipse_indst   longestt	   input_tmpt
   output_subt   split_subscriptst   out_subt   ellipse_countt   rep_indst   out_ellipset   output_subscriptt   tmp_subscriptst   normal_indst   input_subscriptst   char(    (    s5   lib/python2.7/site-packages/dask/array/einsumfuncs.pyt   parse_einsum_input   sÊ    #
**	*			!c          O` sR  | j  d d ƒ } | j  d d  ƒ } | j  d t ƒ } | j  d d ƒ } | j  d d  ƒ } | r| t d d	 j | ƒ ƒ ‚ n  | } t |  ƒ \ } }	 }
 d
 j | |	 f ƒ } | d  k rà t j g  |
 D] } | j ^ qÅ Œ  } n  | t k	 rDg  |
 D]* } t j	 | j j
 d ƒ d | j ƒ^ qó } t j | d | | Œ\ } } n  g  | j d	 ƒ D] } t | ƒ ^ qT} t d „  | Dƒ ƒ } | t |	 ƒ } t | ƒ } t t t |	 ƒ t | ƒ d d „  | Dƒ d | d | d | d | d | d | d | d „  t |
 | ƒ Dƒ Œ} | d k rNt |	 ƒ } | j d t t | | | ƒ ƒ d | ƒ S| S(   Nt   castingt   safeR   t   optimizet   ordert   Kt   split_everys.   einsum() got unexpected keyword argument(s) %sR   s   ->i    R   c         s` s"   |  ] } | D] } | Vq q d  S(   N(    (   t   .0t   it   a(    (    s5   lib/python2.7/site-packages/dask/array/einsumfuncs.pys	   <genexpr>ã   s    t   adjust_chunksc         S` s   i  |  ] } d  | “ q S(   i   (    (   RW   t   ind(    (    s5   lib/python2.7/site-packages/dask/array/einsumfuncs.pys
   <dictcomp>î   s   	 R	   R   R
   c         s` s"   |  ] } | D] } | Vq q d  S(   N(    (   RW   t   apRY   (    (    s5   lib/python2.7/site-packages/dask/array/einsumfuncs.pys	   <genexpr>ì   s    t   axis(   R   R%   R0   R*   R-   RP   t   npt   result_typeR   t   broadcast_toR   R   t   einsum_pathR.   t   tupleR,   R   R   R   t   zipt   sumR"   R#   (   R   R   RQ   R   RS   RT   RV   t   einsum_dtypet   inputst   outputst   opsR	   R4   t   fake_opst   _RX   t   all_indst   contract_indsR
   t   resultt   size(    (    s5   lib/python2.7/site-packages/dask/array/einsumfuncs.pyR   Ä   s>    (4!(%"(   t
   __future__R    R   R   t	   functoolsR   t   numpyR^   t   numpy.compatR   t   coreR   R   R   R)   R,   R!   R   RP   R   (    (    (    s5   lib/python2.7/site-packages/dask/array/einsumfuncs.pyt   <module>   s   		§