
\K]c           @` s	  d  Z  d d l m Z m Z m Z d d l Z d d l Z d d l Z d d l	 Z	 d d l
 Z
 d d l Z d d l Z d d l Z d d l m Z d d l m Z m Z m Z d d l m Z d d l Z d d l Z d d l m Z 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# m$ Z$ d d	 l% m& Z& d d
 l' m( Z( m) Z) d d l m* Z* d d l+ m, Z, d d l- m. Z. d d l/ m0 Z0 m1 Z1 m2 Z2 m3 Z3 m4 Z4 m5 Z5 m6 Z6 m7 Z7 m8 Z8 m9 Z9 m: Z: m; Z; m< Z< m= Z= m> Z> m? Z? m@ Z@ mA ZA mB ZB mC ZC mD ZD mE ZE mF ZF mG ZG mH ZH mI ZI mJ ZJ mK ZK mL ZL mM ZM mN ZN mO ZO mP ZP mQ ZQ mR ZR mS ZS mT ZT mU ZU mV ZV mW ZW mX ZX mY ZY d d lZ m[ Z[ m\ Z\ m] Z] m^ Z^ d d l_ m` Z` d d la mb Zb mc Zc d d ld me Ze d d lf mg Zg mh Zh mi Zi mj Zj mk Zk ml Zl d d l- mm Zm d d l Z d d ln Zn d d ln Zo d Zp e
 jq d ep d er  Zs d   Zt er Zu d   Zv em ev  d    Zw d ex f d     YZy d   Zz d   Z{ d   Z| d    Z} d!   Z~ d"   Z d#   Z d$   Z d%   Z d&   Z d'   Z d(   Z d)   Z d*   Z d+   Z i d,   d- d. f 6d/   d0 d. f 6ez d1 d. f 6e{ d2 d. f 6ez d3 d. f 6e{ d4 d. f 6e d5 d. f 6e d6 d. f 6e d7 d. f 6e d8 d. f 6e d9 d. f 6e d: d. f 6e d; d. f 6e d< d. f 6Z e. d=    Z e. d>    Z e. d?    Z e. d@    Z e dA dB dC g  Z i e dD e  d- d. f 6e dE e  d0 d. f 6e dF e  d1 d. f 6e dG e  d2 d. f 6e dF e  d3 d. f 6e dG e  d4 d. f 6Z dH ex f dI     YZ dJ e j e j f dK     YZ dL   Z e e  j e <dM ex f dN     YZ dO ex f dP     YZ dQ   Z dR ex f dS     YZ dT   Z dU   Z dV   Z dW   Z dX   Z dY   Z dZ   Z d[   Z d\   Z d]   Z d^   Z d_   Z d`   Z e e e e e da  Z db   Z dc   Z dd   Z de   Z df   Z e e j e <e e dg  Z e e j e <dh   Z e e! j e <e di  Z e dj  Z dk   Z dl   Z dm   Z dn   Z e do dp dq dr g  Z ds   Z dt   Z du   Z dv   Z dw   Z dx   Z dy   Z dz   Z e e j e <d{   Z d|   Z d}   Z e e j e <d~   Z e d  Z e d  Z d   Z e e j e <d   Z e e j e <er d  Z d   Z d   Z d   Z e e d  Z e e j e <e d  Z e e j e <e d  Z e e j e <d   Z e e j e <d   Z e e j e <d   Z e e" j e <e d  Z e e j e <e d    Z e( e  d e) f d     Y Z d   Z d S(   s  
This module transforms data-parallel operations such as Numpy calls into
'Parfor' nodes, which are nested loops that can be parallelized.
It also implements optimizations such as loop fusion, and extends the rest of
compiler analysis and optimizations to support Parfors.
This is similar to ParallelAccelerator package in Julia:
https://github.com/IntelLabs/ParallelAccelerator.jl
'Parallelizing Julia with a Non-invasive DSL', T. Anderson et al., ECOOP'17.
i    (   t   print_functiont   divisiont   absolute_importN(   t   reduce(   t   defaultdictt   OrderedDictt
   namedtuple(   t   contextmanager(	   t   irt   ir_utilst   typest   typingt   rewritest   configt   analysist   pranget   pndindex(   t   array_analysist   postproct	   typeinfert   utilst   errors(   t   as_dtype(   t   infer_globalt   AbstractTemplate(   t   stencilparfor(   t   StencilPass(   t   register_jitable(*   t   mk_unique_vart
   next_labelt   mk_alloct   get_np_ufunc_typt   mk_range_blockt   mk_loop_headert   get_name_var_tablet   replace_varst   replace_vars_innert
   visit_varst   visit_vars_innert   remove_delst   remove_deadt   copy_propagatet   get_block_copiest   apply_copy_propagatet   dprint_func_irt   find_topo_ordert   get_stmt_writest   rename_labelst   get_call_tablet   simplifyt   simplify_CFGt   has_no_side_effectt   canonicalize_array_matht   add_offset_to_labelst   find_callnamet   find_build_sequencet   guardt   requiret   GuardExceptiont   compile_to_numba_irt   get_definitiont   build_definitionst   replace_arg_nodest   replace_returnst
   is_getitemt
   is_setitemt   is_get_setitemt   index_var_of_get_setitemt   set_index_var_of_get_setitemt   find_potential_aliases(   t   compute_use_defst   compute_live_mapt   compute_dead_mapst   compute_cfg_from_blocks(   t   CFGraph(   t   npydeclt	   signature(   t   Function(   t   random_int_argst   random_1arg_sizet   random_2arg_sizelastt   random_3arg_sizelastt   random_callst   assert_equiv(   t   overloadiP   t   widtht   drop_whitespacec         C` sA   x: |  j    D], } g  t j |  D] } t |  ^ q# q Wd  S(   N(   t
   splitlinest   _txtwrappert   wrapt   print(   t   xt   lt   y(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   print_wrappedc   s    c           C` s   d  S(   N(    (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   init_prangel   s    c          C` s   d   }  |  S(   Nc           S` s   d  S(   N(    (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   no_opq   s    (    (   R`   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   init_prange_overloado   s    	t   internal_prangec           B` s   e  Z d    Z RS(   c         G` s
   t  |   S(   N(   t   range(   t   clst   args(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   __new__w   s    (   t   __name__t
   __module__Rf   (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRb   u   s   c         C` s(   | j  d k r d   } n	 d   } | S(   Ni   c         S` so   t  j j   t t |    t  j j j |  j  } x3 t  j j	 t |    D] } t
 | |  |  } qN W| S(   N(   t   numbat   parforR_   t   min_checkert   lent   targetst   builtinst   get_type_max_valuet   dtypeRb   t   min(   t   in_arrt   valt   i(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   min_1~   s    c         S` si   t  j j   t t |    t  j j j |  j  } x- t  j	 |  j
  D] } t | |  |  } qH W| S(   N(   Ri   Rj   R_   Rk   Rl   Rm   Rn   Ro   Rp   R   t   shapeRq   (   Rr   Rs   Rt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRu      s    (   t   ndim(   t   return_typet   argRu   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   min_parallel_implz   s    	c         C` s(   | j  d k r d   } n	 d   } | S(   Ni   c         S` so   t  j j   t t |    t  j j j |  j  } x3 t  j j	 t |    D] } t
 | |  |  } qN W| S(   N(   Ri   Rj   R_   t   max_checkerRl   Rm   Rn   t   get_type_min_valueRp   Rb   t   max(   Rr   Rs   Rt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   max_1   s    c         S` si   t  j j   t t |    t  j j j |  j  } x- t  j	 |  j
  D] } t | |  |  } qH W| S(   N(   Ri   Rj   R_   R{   Rl   Rm   Rn   R|   Rp   R   Rv   R}   (   Rr   Rs   Rt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR~      s    (   Rw   (   Rx   Ry   R~   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   max_parallel_impl   s    	c         C` s   t  j j   t t |    |  j   } t  j j j | j	  } t  j
 j j d |  } xK t  j j t |   D]1 } t  j
 j j | | |  } t | |  } qr W| j S(   Ni    (   Ri   Rj   R_   t   argmin_checkerRl   t   ravelRm   Rn   Ro   Rp   R   t
   IndexValueRb   Rq   t   index(   Rr   t   At   init_valt   ivalRt   t	   curr_ival(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   argmin_parallel_impl   s    c         C` s   t  j j   t t |    |  j   } t  j j j | j	  } t  j
 j j d |  } xK t  j j t |   D]1 } t  j
 j j | | |  } t | |  } qr W| j S(   Ni    (   Ri   Rj   R_   t   argmax_checkerRl   R   Rm   Rn   R|   Rp   R   R   Rb   R}   R   (   Rr   R   R   R   Rt   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   argmax_parallel_impl   s    c         C` sd   t  j j   |  j d } | j d } d } x0 t  j j |  D] } | |  | | | 7} q@ W| S(   Ni    (   Ri   Rj   R_   Rv   Rb   (   t   at   bR\   t   mt   sRt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   dotvv_parallel_impl   s    c         C` s}   t  j j   |  j } | j \ } } t j | |  j  } x< t  j j |  D]( } | |  | | | d  d   f 7} qM W| S(   N(   Ri   Rj   R_   Rv   t   npt   zerosRp   Rb   (   R   R   R\   R   t   nt   cRt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   dotvm_parallel_impl   s    	&c   	      C` s   t  j j   |  j \ } } | j } t j | |  j  } x] t  j j |  D]I } d } x0 t |  D]" } | |  | | f | | 7} qf W| | | <qM W| S(   Ni    (	   Ri   Rj   R_   Rv   R   t   emptyRp   Rb   Rc   (	   R   R   R   R   R\   R   Rt   R   t   j(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   dotmv_parallel_impl   s    	 c         C` sy   t  | t j j  ru t  | t j j  ru | j | j k oG d k n rP t S| j d k ru | j d k ru t Sn  d  S(   Ni   i   (   t
   isinstanceR
   t   npytypest   ArrayRw   R   R   (   Rx   t   atypt   btyp(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   dot_parallel_impl   s    "c         ` s@   |  d    | j  d k r-   f d   } n   f d   } | S(   Ni    i   c         ` sH   t  j j     } x. t  j j t |    D] } | |  | 7} q, W| S(   N(   Ri   Rj   R_   Rb   Rl   (   Rr   Rs   Rt   (   t   zero(    s+   lib/python2.7/site-packages/numba/parfor.pyt   sum_1   s
    c         ` sB   t  j j     } x( t  j |  j  D] } | |  | 7} q& W| S(   N(   Ri   Rj   R_   R   Rv   (   Rr   Rs   Rt   (   R   (    s+   lib/python2.7/site-packages/numba/parfor.pyR      s
    (   Rw   (   Rx   Ry   R   (    (   R   s+   lib/python2.7/site-packages/numba/parfor.pyt   sum_parallel_impl   s
    c         ` s@   |  d    | j  d k r-   f d   } n   f d   } | S(   Ni   c         ` sH   t  j j     } x. t  j j t |    D] } | |  | 9} q, W| S(   N(   Ri   Rj   R_   Rb   Rl   (   Rr   Rs   Rt   (   t   one(    s+   lib/python2.7/site-packages/numba/parfor.pyt   prod_1  s
    c         ` sB   t  j j     } x( t  j |  j  D] } | |  | 9} q& W| S(   N(   Ri   Rj   R_   R   Rv   (   Rr   Rs   Rt   (   R   (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s
    (   Rw   (   Rx   Ry   R   (    (   R   s+   lib/python2.7/site-packages/numba/parfor.pyt   prod_parallel_impl  s
    c         ` s@   |  d    | j  d k r-   f d   } n   f d   } | S(   Ni    i   c         ` sR   t  j j     } x. t  j j t |    D] } | |  | 7} q, W| t |   S(   N(   Ri   Rj   R_   Rb   Rl   (   Rr   Rs   Rt   (   R   (    s+   lib/python2.7/site-packages/numba/parfor.pyt   mean_1  s
    c         ` sI   t  j j     } x( t  j |  j  D] } | |  | 7} q& W| |  j S(   N(   Ri   Rj   R_   R   Rv   t   size(   Rr   Rs   Rt   (   R   (    s+   lib/python2.7/site-packages/numba/parfor.pyR   !  s
    (   Rw   (   Rx   Ry   R   (    (   R   s+   lib/python2.7/site-packages/numba/parfor.pyt   mean_parallel_impl  s
    c         C` s(   | j  d k r d   } n	 d   } | S(   Ni   c         S` s~   |  j    } t j j   d } xN t j j t |    D]4 } |  | | } | t j | t j |   7} q8 W| t |   S(   Ni    (	   t   meanRi   Rj   R_   Rb   Rl   R   t   realt   conj(   Rr   R   t   ssdRt   Rs   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   var_1,  s    $c         S` su   |  j    } t j j   d } xH t j |  j  D]4 } |  | | } | t j | t j |   7} q2 W| |  j	 S(   Ni    (
   R   Ri   Rj   R_   R   Rv   R   R   R   R   (   Rr   R   R   Rt   Rs   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   7  s    $(   Rw   (   Rx   Ry   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   var_parallel_impl)  s    	
c         C` s   d   } | S(   Nc         S` s   |  j    d S(   Ng      ?(   t   var(   Rr   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   std_1D  s    (    (   Rx   Ry   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   std_parallel_implC  s    	c         ` s   t  |  j      f d   }   f d   }   f d   } t d   | D  r^ d   } n	 d   } t |  d k r} | St |  d k r | St |  d	 k r | St |  d
 k r | St d j |    d  S(   Nc         ` s   t  j d |  d    S(   Ni    i   (   R   t   arange(   t   stop(   Rp   (    s+   lib/python2.7/site-packages/numba/parfor.pyt   arange_1K  s    c         ` s   t  j |  | d    S(   Ni   (   R   R   (   t   startR   (   Rp   (    s+   lib/python2.7/site-packages/numba/parfor.pyt   arange_2N  s    c         ` s   t  j |  | |    S(   N(   R   R   (   R   R   t   step(   Rp   (    s+   lib/python2.7/site-packages/numba/parfor.pyt   arange_3Q  s    c         s` s!   |  ] } t  | t j  Vq d  S(   N(   R   R
   t   Complex(   t   .0R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>T  s    c   
      S` s   t  j j   | |  | } t j | j  } t j | j  } t t t	 | |  d   } t
 j | |  } x, t  j j |  D] }	 |  |	 | | |	 <q W| S(   Ni    (   Ri   Rj   R_   t   matht   ceilR   t   imagt   intR}   Rq   R   R   Rb   (
   R   R   R   Rp   t   nitems_ct   nitems_rt   nitems_it   nitemst   arrRt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   arange_4U  s    c   	      S` s   t  j j   t j | |  |  } t t | d   } t j | |  } |  } x, t  j j	 |  D] } |  | | | | <qd W| S(   Ni    (
   Ri   Rj   R_   R   R   R   R}   R   R   Rb   (	   R   R   R   Rp   R   R   R   Rs   Rt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   `  s    i   i   i   i   s   parallel arange with types {}(   R   Rp   t   anyRl   t
   ValueErrort   format(   Rx   Re   R   R   R   R   (    (   Rp   s+   lib/python2.7/site-packages/numba/parfor.pyt   arange_parallel_implH  s     	
c         ` sl   t  |  j    d   }   f d   } t |  d k r= | St |  d k rS | St d j |    d  S(   Nc         S` s   t  j |  | d  S(   Ni2   (   R   t   linspace(   R   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt
   linspace_2x  s    c         ` st   t  j j   t j |    } | d } | |  } |  | d <x0 t  j j |  D] } |  | | | | | <qP W| S(   Ni   i    (   Ri   Rj   R_   R   R   Rb   (   R   R   t   numR   t   divt   deltaRt   (   Rp   (    s+   lib/python2.7/site-packages/numba/parfor.pyt
   linspace_3{  s    


i   i   s   parallel linspace with types {}(   R   Rp   Rl   R   R   (   Rx   Re   R   R   (    (   Rp   s+   lib/python2.7/site-packages/numba/parfor.pyt   linspace_parallel_implu  s    	
c         C` s   t  S(   N(   R   (   t   rR   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   <lambda>  t    t   argmint   numpyc         C` s   t  S(   N(   R   (   R   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     R   t   argmaxRq   R}   t   amint   amaxt   sumt   prodR   R   t   stdt   dotR   R   c         C` s   |  d k r t  d   n  d  S(   Ni    sD   zero-size array to reduction operation maximum which has no identity(   R   (   t   arr_size(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR{     s    c         C` s   |  d k r t  d   n  d  S(   Ni    sD   zero-size array to reduction operation minimum which has no identity(   R   (   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRk     s    c         C` s   |  d k r t  d   n  d  S(   Ni    s*   attempt to get argmin of an empty sequence(   R   (   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s    c         C` s   |  d k r t  d   n  d  S(   Ni    s*   attempt to get argmax of an empty sequence(   R   (   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s    t   checker_implt   namet   funcR   R   Rk   R{   t   LoopNestc           B` s)   e  Z d  Z d   Z d   Z d   Z RS(   s   The LoopNest class holds information of a single loop including
    the index variable (of a non-negative integer value), and the
    range variable, e.g. range(r) is 0 to r-1 with step size 1.
    c         C` s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   t   index_variableR   R   R   (   t   selfR   R   R   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   __init__  s    			c         C` s"   d j  |  j |  j |  j |  j  S(   Ns3   LoopNest(index_variable = {}, range = ({}, {}, {}))(   R   R   R   R   R   (   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   __repr__  s    c         C` s   g  } | j  |  j  t |  j t j  r> | j  |  j  n  t |  j t j  rf | j  |  j  n  t |  j t j  r | j  |  j  n  | S(   N(   t   appendR   R   R   R   t   VarR   R   (   R   t   all_uses(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt	   list_vars  s    (   Rg   Rh   t   __doc__R   R   R   (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s   		t   Parforc           B` sJ   e  Z d  Z e e   d  Z d   Z d   Z d d  Z	 d d  Z
 RS(   i    c         C` s   t  t |   j d d d |  t |   j |  _ t |   j d 7_ | |  _ | |  _ | |  _ | |  _	 d  |  _ | |  _ t |  d k s t  | g |  _ | |  _ |	 |  _ |
 |  _ t j r d } t | j |  j | |   n  d  S(   Nt   opRj   t   loci   s9   Parallel for-loop #{} is produced from pattern '{}' at {}(   t   superR   R   t   typet
   id_countert   idt
   loop_nestst
   init_blockt	   loop_bodyt	   index_vart   Nonet   paramst	   equiv_setRl   t   AssertionErrort   patternst   flagst   no_sequential_loweringt   racesR   t   DEBUG_ARRAY_OPT_STATSRZ   R   (   R   R   R   R   R   R   R   t   patternR   R   R   t   fmt(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s(    											c         C` s8   d t  |  j  t |  j  t |  j  t |  j  S(   Ns   id=(   t   strR   t   reprR   R   R   (   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   
  s    c         C` s   g  } xA |  j  j   D]0 \ } } x! | j D] } | | j   7} q, Wq Wx! |  j D] } | | j   7} qT Wx$ |  j j D] } | | j   7} q{ W| S(   ss   list variables used (read/written) in this parfor by
        traversing the body and combining block uses.
        (   R   t   itemst   bodyR   R   R   (   R   R   R\   R   t   stmtt   loop(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s    c         C` sX   | d k	 r' |  j j } | |  j _ n  |  j j |  } | d k	 rT | |  j _ n  | S(   sv   get the shape classes for a given variable.
        If a typemap is specified then use it for type resolution
        N(   R   R   t   typemapt   get_shape_classes(   R   R   R  t   save_typemapt   res(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    
c         C` s  | p t  j } t d j |  j  j d d  d | t d |  j d | x! |  j D] } t | d | qW Wt d d | |  j j	 |  xG t
 |  j j    D]0 \ } } t d | f d | | j	 |  q Wt d j |  j  j d d  d | d  S(	   Ns   begin parfor {}i   t   -t   files   index_var = s   init block:s	   label %s:s   end parfor {}(   t   syst   stdoutRZ   R   R   t   centerR   R   R   t   dumpt   sortedR   R   (   R   R	  t   loopnestt   offsett   block(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  1  s    ("N(   Rg   Rh   R   t   Falset   setR   R   R   R   R  R  (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s   		c         C` sw   | j  } t |   } | j j d d  } | j | |  t |  |  | j d |  _ | rm | | j d <n  g  g  f S(   s/   Recursive array analysis for parfor nodes.
    i    N(   t   func_irt   wrap_parfor_blockst
   equiv_setst   getR   t   runt   unwrap_parfor_blocksR   (   Rj   R   R  R   R  t   parfor_blockst   backup_equivset(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   _analyze_parfor>  s    	t   ParforDiagnosticsc           B` s   e  Z d  Z d   Z d   Z e d    Z e j d    Z e d  Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d d  Z d   Z d   Z RS(   s   Holds parfor diagnostic info, this is accumulated throughout the
    PreParforPass and ParforPass, also in the closure inlining!
    c         C` s[   d  |  _ t   |  _ d |  _ t t  |  _ t t  |  _ g  |  _	 i  |  _
 t |  _ d  S(   Nt   __numba_parfor_gufunc(   R   R   t   dictt   replaced_fnst   internal_nameR   t   listt   fusion_infot   nested_fusion_infot   fusion_reportst
   hoist_infoR  t	   has_setup(   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   T  s    				c         C` s   | |  _  |  j  j j |  _ |  j  j |  _ | |  _ |  j |  j k rQ d |  _ n d |  j |  j f |  _ |  j	   |  _
 t |  _ d  S(   Ns   Internal parallel functions   Function %s, %s(   R  t   func_idt   func_qualnameR   R   t   linet   fusion_enabledR!  t   purposet   get_parforst   initial_parforst   TrueR'  (   R   R  R+  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   setupa  s    		c         C` s   |  j  S(   N(   t
   _has_setup(   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR'  p  s    c         C` s   | |  _  d  S(   N(   R1  (   R   t   state(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR'  t  s    c         C` s   t  |  j    S(   N(   Rl   R-  (   R   t   blocks(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   count_parforsy  s    c         C` s*   t  |  } |  j | |  t |  d  S(   N(   R  t   _get_parforsR  (   R   Rj   t   parfors_listR3  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   _get_nested_parfors|  s    c         C` sd   x] | j    D]O \ } } x@ | j D]5 } t | t  r# | j |  |  j | |  q# q# Wq Wd  S(   N(   R   R  R   R   R   R7  (   R   R3  R6  t   labelt   blkR  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR5    s
    c         C` s    g  } |  j  |  j j |  | S(   N(   R5  R  R3  (   R   R6  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR-    s    c         C` s   g  } x |  j  j   D] \ } } | j d g   } x{ | D]s } t | j t j  r; | j j d k r t t	 |  j
 | j  } | d  k	 r | d k r | j |  q q q; q; Wq W| S(   Nt   hoistedt   callR   R   (   R   R   (   R&  R   R  R   t   valueR   t   ExprR   R8   R6   R  R   R   (   R   t   allocst   pf_idt   dataR  t   instR;  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   hoisted_allocations  s    c         C` se  t  j |  } | i  k r( g  t   f St   } x2 | j   D]$ } x | D] } | j |  qK Wq> Wt | j    } | | } | d k r t   } n  t   } x t t t | j    j	 |   d  D]T } | j
 |  }	 |	 d k	 r |	 | | <q |	 g  k r| j |  q g  | | <q Wg  }
 x+ t | j    D] } |
 j | |  q@W|
 | f S(   sf   
        compute adjacency list of the fused loops
        and find the roots in of the lists
        i   N(   t   copyt   deepcopyR  t   valuest   addt   keysR   Rc   R}   t   unionR  R  R   (   R   t   _aR   t   vtxt   vR[   t   potential_rootst   rootst	   not_rootsRs   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   compute_graph_info  s.    	
	2c         ` s7     f d       | | | d d  \ } } | | f S(   s   
        Computes the number of fused and serialized loops
        based on a fusion adjacency list `fadj` and a nested
        parfors adjacency list `nadj` for the root, `root`
        c         ` s~   xq | | D]e } | d 7} | | g  k rB | t  |  |  7} q   |  | | | |  \ } } | | 7} | } q W| | f S(   Ni   (   Rl   (   t   fadjt   nadjt   roott   nfusedt   nserialt   kt   nft   ns(   t
   count_root(    s+   lib/python2.7/site-packages/numba/parfor.pyRX    s    


i    (    (   R   RP  RQ  RR  RS  RT  (    (   RX  s+   lib/python2.7/site-packages/numba/parfor.pyt	   get_stats  s    
c         C` s\   g  } | j  | |  x> | | D]2 } | | g  k r" | j  |  j | |   q" q" W| S(   sf   
        returns a list of nodes reachable in an adjacency list from a
        specified root
        (   t   extendt   reachable_nodes(   R   t   adjRR  t   fusersRU  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR[    s     c         C` s<  | | d } | j  d } t d | j j d  } |  j j j } |  j |  j  \ } } |  j |  j  \ }	 }
 | |	 g } t	 | t
  r8| d d k r8| d d } | j | k r t d | j d  Sg  } xb | D]Z } | r x+ | | D] } | j |  j | |   q W| r6t d t |  d  Sq q WxT | j j   D]C } x: | j D]/ } | j j | k rZt d | j j d  SqZWqJWx |  j j j   D] } yp | j j |  } xW t | d d d  D]? } | j | } t	 | t  st d | j j d  } PqqWWqt k
 r-qXqWq8n  | S(   sX   
        pd_id - the parfors id
        parfors_simple - the simple parfors map
        i    i   t   internali   i(   R   R}   R   R*  R  t   filenameRO  R$  R#  R   t   tupleR   t   sort_pf_by_lineRq   R   RE  R  R3  R   Rc   R   R   (   R   R?  t   parfors_simplet   pfR   R*  R_  RQ  t   nrootsRP  t   frootst   graphst   reported_loct   tmpR\  RU  R9  R  t   idxRt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRa    sD    
i   c   M   	   ` s@   j  s t d   n   j j j }  j j }  j | k rQ d } d } n d | | f } d } t } t } t } t }	 t }
 t } t } t } t } t } | dP k r t } t } n t	 d
   | dQ k r t } n  | d k r t }	 t }
 t } n  | d	 k r!t } t } t } n  | d k r8| r8d  St
 d  t
 t d  t
 d | j t d   t
 t d  t
 d  | rt
 d j t d   n  t   } x9t  j d d   D]} | j d } | j d } | j } t | t  r| d d k r| d d k r_d j t t | d d    } | d d } d | d f } q| d d k rxd } q| d d k rd } qd st  qn  d } | rt
 | | j | | f  n  | | | f | | j <qW j   } | rt
 d |  t
 d t  n   j j j } y t j j |  } Wn# t	 k
 rat j j |  } n X| r j j j } y t j  |  j!   } Wn t" k
 rd  } n X| rt$ g  | D] } t% |  ^ q } t& t  } x] | j'   D]O \ } }  | | d j | k r j( | |  }! | |! j) t* |   qqWt$ d g g  | j+   D] } t% |  ^ qW }" | d |" t% t* |   d }# g  }$ |$ j) d  |$ j) d |  |$ j) |# d d  d  } t$ d  j j j, d  }% x t- | |%  D] \ }& } | j. |& d   }' |' d  k	 r@d! d" j |'  }( n d }( | j/ d  }) t% |)  }* |' r| j0 |# d |# |(  }+ n | j0 |# d# |# |(  }+ |$ j) |) |+ |*  q Wt1 d j |$   qt1 d$  n  d%   j2   }, g  |, D] } | j ^ q}- t% |-  }. | s|	 rnt3 sMt
 d& j t d   d' }/ t
 |/  qnd( }/ t
 |/  t
 t d  n  |. d) k r&  f d*   }0 | rxE  j4 D]7 }1 |1 \ }2 }3 }/ t
 d+ |2 |3 f  t
 d, |/  qWn   j5 i  k r|	 rt
 d-  |0  j5 d. d/  qn  |	 r j6 r*d0 }4 n d1 }4 t
 d2 j0 |4 |. d" j g  |- D] } d3 | ^ qL   t
 t d  t
 d  n  |
 r j7 i  k rt
 d4 j t d   t
 d5  d6 }5 d7 }6 |0  j7 |5 |6  t
 t d  t
 d  qn   j8  j5  \   }7  j8  j7  \  }8 t%    t%   k rSt%    }9  }: n t%   }9   }: x* t9 t% |:  |9  D] } |: j) g   q{Wt:   }; |8 rx1 |8 D]& }<  |< g  k r|; j; |<  qqWn  |7 |; A}= i  }> x3 |7 D]+ }  j( | |  } d8 |   f |> | <qWi  }? x3 |; D]+ }  j( | |  } d9 |  f |? | <q(	W|> j<   }@ |@ j= |?       f d:   }A      f d;   }B | r	t1 d< j t d   |A |@  t1 t d  n  | r
t1 d= j t d   |B |@  t1 t d  n  t
 d  t
 t d  t
 d  | s<
| rU
t
 d> j d? d   n  | rt }C t1 d@  x[ j> j'   D]J\ }D }E |E j. dA g   }F x)|F D]!}G t |G j? t@ jA  r
y |G j? jB }H |H dB k rdC }/ |G j } t
 |/ | |D f  y t j j | j  } Wn& t	 k
 r:t j j | j  } n XtC jD |  } | r| j, rt
 dD | | j, d k  rwd n
 | j, d j/    n  t
 dE  t }C n  WqtE tF f k
 rqXq
q
Wq{
W|C st
 dF  qn  | r<t1 d  t1 dG  t }I  j> rx  j> j'   D] \ }D }E |E j. dA d   }J |E j. dH d   }K |J rj|K rjt1 dI |D  qn  t1 dJ |D  |J rt1 dK  g  |J D] }L t1 d, |L  ^ qt }I n  |K rt1 dL  g  |K D]" \ } }L t1 dM |L | f  ^ qt }I qqWn  |I st
 dN  n  t
 d? d  q<n t
 dO j0 | |   d  S(R   Ns   self.setup has not been calleds   Internal parallel functions R^  s    Function %s, %s t   useri   i   i   i   s1   Report level unknown, should be one of 1, 2, 3, 4s   
 t   =s%    Parallel Accelerator Optimizing: %s R   s   Looking for parallel loopsR  t   keyc         S` s
   |  j  j S(   N(   R   R*  (   R[   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   U  R   i    R   t   .s   %s %ss   (internal parallel version)s   user defined prangeR   s   internal pndindexs5   Parallel for-loop #%s: is produced from %s:
    %s
 
s   
Found %s parallel loops.s   
s   Parallel loop listing for %ss	   |loop #IDs   {0:{1}}| {2}t   #s   , t    s   No source availables   +--s    Fusing loops sP   Attempting fusion of parallel loops (combines loops with similar properties)...
s+   Performing sequential lowering of loops...
ic         ` sM   t            f d   }  j |   \  } |  |  d  S(   Nc         ` s^        f d     x? | D]7 } t  d  |  f     | d  t  d  q Wd  S(   Nc         ` sc   x\ |  | D]P } t    | d d  |  f  |  | g  k r  |  | | d  q q Wd  S(   NRo  s   %s%s %si   (   R^   (   R\  RR  t   depthRU  (   t   fact   node_msgt   print_gt   sword(    s+   lib/python2.7/site-packages/numba/parfor.pyRs    s    #s   %s%s %si   R   (   R^   (   R\  RM  R   (   Rq  R\   Rr  t   root_msgRt  (   Rs  s+   lib/python2.7/site-packages/numba/parfor.pyt   print_graph  s
    (   Rl   RO  (   R   Ru  Rr  Rv  RM  (   R   Rt  (   Rq  R\   Rr  Ru  s+   lib/python2.7/site-packages/numba/parfor.pyt   dump_graph_indented  s    
s#     Trying to fuse loops #%s and #%s:s       %ss   
 
Fused loop summary:
s&   has the following loops fused into it:s   (fused)s4   Following the attempted fusion of parallel for-loopss   With fusion disabledsL   
{} there are {} parallel for-loop(s) (originating from loops labelled: {}).s   #%ss    Optimising loop nests sN   Attempting loop nest rewrites (optimising for the largest parallel loops)...
 s   is a parallel loops   --> rewritten as a serial loopt   fuset   nestc   
      ` s   t          f d   }     f d   } d } g  } x t |  j    D] \ } } | \ } } }	 | d k r | | k r | d | |	 d |  } q qU | d k r |   | | |  } qU d sU t  qU Wd  S(   Nc         ` sg         f d     | | g  k rc t  d |    |  | | d  t d  | d } n  | S(   Nc         ` s"  t    | d d  | d f  x | | D] } | | g  k rg  } | j   | d d d  | d f  |  | g  k r |  k r  j |  |  } x; | D]0 } | j   | d d d  | d f  q Wn   j |  t  d j |   q.  |  | | | d  q. Wd  S(   NRo  s   %s%s %ss
   (parallel)i   s   
(   R^   R   R[  t   join(   t   fadj_t   nadj_t   nrootRp  RU  t   msgt   fusedRt   (   Rq  Rs  t   reportedR   Rt  (    s+   lib/python2.7/site-packages/numba/parfor.pyRs  !  s    #*1s   Parallel region %s:i    s   
i   (   R^   RZ   (   R{  R|  t   therootR  t	   region_id(   Rq  R   Rt  (   Rs  R  s+   lib/python2.7/site-packages/numba/parfor.pyt
   print_nest   s    
c         ` s   g  } t  d |  | j   | d d  | d f  | | g  k r t  j | |   } x7 | D], } | j   | d d  | d f  qi Wn  | d } t  d j |   t d  | S(   Ns   Parallel region %s:Ro  s   %s%s %ss
   (parallel)i   s   
(   R^   R   R  R[  Rz  RZ   (   t   tyR?  R\  Rp  R  R~  R  RU  (   Rq  R   Rt  (    s+   lib/python2.7/site-packages/numba/parfor.pyt
   print_fuse7  s    &-

i    Rx  t   fRy  (   Rl   R  R   R   (
   t   linesR  R  R  R  R*  t   infot   opt_tyR?  R\  (   RP  RQ  R   Rt  (   Rq  s+   lib/python2.7/site-packages/numba/parfor.pyt   print_unoptimised  s    c         ` s  t      t         f d   }      f d   } d } g  } x t |  j    D] \ } } | \ } } }	 | d k r | | k r | d | |	 d |  } q qd | d k r |   | | |  } qd d sd t  qd W rx t  j    D] \ }
 } d } | d } | d	 } | d
 } | d k rk| d 7} t | |
 | | | | f  q| d 7} t | |
 | | f  qWn
 t d  d  S(   Nc         ` s           f d     | | g  k r t  d   t  d  | d f  i | d 6d d 6d d 6  <  |  | | d	  t d
   d	  n   S(   Nc         ` s2  x+| | D]}   | d d  | d f } | | g  k r g  } |  | g  k r |  k r t   j |  |   } | d 7} | d j g  | D] } t |  ^ q  7} n  | d 7}  j |  t |    d c t |  7<n% t | d   |  | | | d    d	 c d 7<q Wd  S(
   NRo  s   %s%s %ss   (serials   , fused with loop(s): s   , t   )R  i   t
   serialized(   R  R[  Rz  R   R   R^   Rl   (   R{  R|  R}  Rp  RU  R~  R  R[   (   Rq  Rs  R  R  R   t   summaryRt  (    s+   lib/python2.7/site-packages/numba/parfor.pyRs  Z  s    
/

s   Parallel region %s:s   %s%s %ss
   (parallel)RR  i    R  R  i   s   
(   R^   RZ   (   R{  R|  R  R  R  (   Rq  R   R  Rt  (   Rs  R  R  s+   lib/python2.7/site-packages/numba/parfor.pyR  Y  s    !
c         ` s   t  d |    | d d  | d f } g  } | | g  k r t  j | |   } | d 7} | d j g  | D] } t |  ^ qu  7} n  i | d 6t |  d 6d	 d
 6 | <| d 7} t  |  t d  | d } | S(   Ns   Parallel region %s:Ro  s   %s%s %ss	   (parallels   , fused with loop(s): s   , RR  R  i    R  R  s   
i   (   R^   R  R[  Rz  R   Rl   RZ   (   R  R?  R\  Rp  R  R~  R  R[   (   Rq  R   R  Rt  (    s+   lib/python2.7/site-packages/numba/parfor.pyR  u  s    
/%



i    Rx  R  Ry  s5   
 
Parallel region %s (loop #%s) had %s loop(s) fusedRR  R  R  sE    and %s loop(s) serialized as part of the larger parallel loop (#%s).Rm  s&   Parallel structure is already optimal.(   Rl   R  R  R   R   R^   (   R  R  R  R  R  R*  R  R  R?  R\  RU  RK  R~  RR  R  R  (   RP  RQ  R   Rt  (   Rq  R  s+   lib/python2.7/site-packages/numba/parfor.pyt   print_optimisedQ  s4    	



 
s    Before Optimisation s    After Optimisation s   Loop invariant code motioniP   s   Allocation hoisting:R:  R   s   The memory allocation derived from the instruction at %s is hoisted out of the parallel loop labelled #%s (it will be performed before the loop is executed and reused inside the loop):s      Allocation:: s0       - numpy.empty() is used for the allocation.
s   No allocation hoisting founds   Instruction hoisting:t   not_hoisteds   loop #%s has nothing to hoist.s	   loop #%s:s     Has the following hoisted:s      Failed to hoist the following:s
       %s: %ss   No instruction hoisting founds+   Function %s, %s, has no parallel for-loops.(   i   i   i   i   (   i   i   i   (G   R'  t   RuntimeErrorR  R(  R)  R   R!  R  R/  R   R^   t
   _termwidthR  R  R  R.  R   R   R`  Rz  t   reversedR"  R   R   R4  R_  t   ost   patht   relpatht   abspathR   t   inspectt	   getsourceRW   t   OSErrorR   R}   Rl   R   R   Ra  R   R   RE  R*  t	   enumerateR  t   stripR   RZ   R-  t   sequential_parfor_loweringR%  R#  R+  R$  RO  Rc   R  RF  RC  t   updateR&  R<  R   R=  t   attrt	   linecachet   getlinest   KeyErrort   AttributeError(M   R   t   levelR   R*  t   purpose_strR,  t   print_loop_searcht   print_source_listingt   print_fusion_searcht   print_fusion_summaryt   print_loopnest_rewritet   print_pre_optimisedt   print_post_optimisedt   print_allocation_hoistt   print_instruction_hoistt   print_internalRb  Rc  t	   r_patternR   R   t   replfnR   t   countR_  R  t	   func_nameR  R[   t	   src_widtht   map_line_to_pfRU  RK  t
   match_linet   max_pf_per_lineRU   t   newlinest   lstartt   not   pf_idst   pfstrt   strippedt   srclenR\   t   parforst
   parfor_idst	   n_parforsR~  Rw  t   reportt   l1t   l2t   after_fusionRu  Rr  Re  t   _nrootst   limRh  Rd  R   t	   all_rootst   froots_linest   nroots_linest	   all_linesR  R  t   foundR?  R@  R  RA  R  t   hoist_info_printedR:  R  R]   (    (   RP  RQ  R   Rt  s+   lib/python2.7/site-packages/numba/parfor.pyR    s   						

		#		
%2"

			0
		
6T




	7


	
!	
-c         C` s   d } | t  |  j  7} | S(   Ns   ParforDiagnostics:
(   R   R   (   R   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   __str__  s    c         C` s
   d } | S(   NR  (    (   R   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s    (   Rg   Rh   R   R   R0  t   propertyR'  t   setterR   R4  R7  R5  R-  RB  RO  RY  R[  Ra  R  R  R   (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  P  s$   							(			: 	t   PreParforPassc           B` s,   e  Z d  Z i  d  Z d   Z d   Z RS(   sw   Preprocessing for the Parfor pass. It mostly inlines parallel
    implementations of numpy functions if available.
    c         C` s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   R  R  t	   calltypest	   typingctxt   optionst   swapped(   R   R  R  R  R  R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s    					c         C` s]   t  |  j |  j |  j |  j  |  j j rA |  j |  j j  n  t	 |  j j  |  j _ d S(   s(   Run pre-parfor processing pass.
        N(
   R4   R  R  R  R  R  R   t   _replace_parallel_functionsR3  R2   (   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s
    c      	   ` s   j   d d l m  t | j     x r j   \ }   xt   j  D]}\  } t | t	 j
  rV | j }  j | j  | j  t  t	 j  r  j d k r          f d   } t |  rPqqt  t	 j  r j d k r j d k r j  j j } t | t j j  r| j }   j } | j }	 t	 j | t d  |	  }
 t j j t   j |
 j <t	 j d t |	  } t	 j
 | |
 |	  } t |  } | d	 k rd
 } n  t	 j | t d  |	  } t j  |   j | j <t	 j
 t	 j! | |	  | |	  } t	 j | t d  |	  } t" t j  } t# j j$ |  } | j%  j&  j | j f i   t j' j$ |   j | j <t	 j j( |
 d |	  } t	 j
 | | |	  } t	 j | t d  |	  } t j j) |   j | j <t	 j j* | | g d |	  } t	 j
 | | |	  } t+  j | j  j | j   j, | <| | _   j j- d |    j j- d |    j j- d |    j j- d |  PqqqV qV Wq. Wd S(   s   
        Replace functions with their parallel implementation in
        replace_functions_map if available.
        The implementation code is inlined to enable more optimization.
        i    (   t   inline_closure_callR;  c          ` s  t   j  j  }  t  j   } t j | d   } t | d  k  t  f d    j	 D  } y |  |  } Wn d  } n Xt | d  k  t
 j
  j j j j  } t | d <t | d <t | d <t j | d   } | d  k	 r| j | | j <n    j |    |  j |  j  j  
 \ } } t | d t }	 xb |	 D]Z }
 xQ |
 j   D]C \ } } | d d k rj| | j |    j  j g  | <PqjqjWqWWt S(   Nc         3` s   |  ] }   j  | j Vq d  S(   N(   R  R   (   R   R[   (   R   (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>)  s    Ri   R   R   t   topological_orderingi    Rb   (   R<   R  R   R6   t   replace_functions_mapR  R   R9   R`  Re   RC  R(  t   __globals__Ri   R   R   t   replace_functions_checkers_mapR   R  R  R  R0   R  R   Rg   R  R   R/  (   t   func_deft   callnamet	   repl_funct   typst   new_funct   gt   checkt
   new_blockst   _t
   call_tableR;  RU  RK  (   R  t   exprRt   R  t   lhs_typR   R  t	   work_list(    s+   lib/python2.7/site-packages/numba/parfor.pyt   replace_func$  s8    



		#t   getattrRp   s	   $np_g_varR   t   boolt   bool_s   $np_typ_vars   $dtype_attr_vars
   $dtype_varN(    (.   R  t   numba.inline_closurecallR  R"  R   t   popR  R  R   R   t   Assignt   targetR  R   R<  R=  R   R8   R  R
   R   R   Rp   t   scopeR   R   R   t   misct   ModuleR   t   GlobalR   t   StringLiteralt   Constt   find_templateRi   RM   t   get_call_typeR  t	   functionsR  t   DTypeR;  RL   R  t   insert(   R   R3  R8  t   instrt   lhsR  t   typRp   R  R   t   g_np_vart   g_npt   g_np_assignt	   dtype_strt   typ_vart   typ_var_assignt   dtype_attr_vart   tempt   tfunct   dtype_attr_getattrt   dtype_attr_assignt	   dtype_vart   dtype_getattrt   dtype_assign(    (   R  R  Rt   R  R  R   R  R  s+   lib/python2.7/site-packages/numba/parfor.pyR    sj    				!$"!					#'	(   Rg   Rh   R   R   R  R  (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s   	
c         C` s4   x- t  j j j j D] } | j |  k r | Sq Wd  S(   N(   Ri   R   t	   templatest   builtin_registryR  Rl  (   R   t   ft(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    t
   ParforPassc           B` s
  e  Z 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 d   Z d   Z d   Z d   Z d   Z d   Z d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s   ParforPass class is responsible for converting Numpy
    calls in Numba intermediate representation to Parfors, which
    will lower into either sequential or parallel loops during lowering
    stage.
    c	   	      C` s   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | j |  _ | j	 |  _	 | j
 |  _
 t j | | | |  |  _ t | j j    t _ | |  _ d  S(   N(   R  R  R  R  Rx   R  t   diagnosticsR   t   swapped_fnsR#  R$  R   t   ArrayAnalysisR}   R3  RG  R	   t
   _max_labelR   (	   R   R  R  R  Rx   R  R  R   R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR     s    							c         C` s  t  |  j j  |  j j |  j j  |  j j rl t |  j |  j |  j	 |  j |  j
 |  j  } | j   n  |  j j r |  j |  j j  n  |  j j r |  j |  j j  n  |  j j r |  j |  j j  n  |  j j r |  j |  j j  n  |  j j |  j |  j j  t |  j d  t |  j j  t |  j |  j |  j	  t |  j |  j |  j	  |  j j rNt |  j j  |  j _ t   |  j _ |  j j |  j j  t |  j |  j j |  j d t t |  j d  |  j  |  j |  j j  t |  j |  j j |  j  t |  j d  |  j  |  j |  j j  t |  j d  n  t |  j |  j |  j	  t! |  j j i  i   t |  j |  j |  j	  t |  j d  t" j# d k rt$ d t% |  j j&     t$ d	 |  j	  n  t' j( |  j  } | j   |  j j) r+t* |  j j+ |  j, |  j  n  t- rSt. |  j
 |  j |  j |  j	  n t/ |  j j |  j j |  j0  } t" j1 r|  j j2 j3 } t4 |  } | d
 k r|  j j rd n d } t$ d j5 | | | |   qt$ d j5 |   n  d S(   sg   run parfor conversion pass: replace Numpy calls
        with Parfors when possible and optimize the IR.s   after parfor passt   up_directions   after maximize fusion downs   after maximize fusion ups   after fusions   after optimizationi   s   variable types: s   call types: i    s   After fusions   With fusion disableds0   {}, function {} has {} parallel for-loop(s) #{}.s   Function {} has no Parfor.N(6   R'   R  R3  R   R  R  t   stencilR   R  R  R  R   t   setitemt   _convert_setitemR   t   _convert_numpyt	   reductiont   _convert_reduceR   t   _convert_loopR  R0  t   fusionR,   t   simplify_parfor_body_CFGR1   R=   t   _definitionsR  R  t   maximize_fusionR  t   fuse_parforst   push_call_varsR   t   DEBUG_ARRAY_OPTRZ   R  R   R   t   PostProcessort   is_generatort   fix_generator_typest   generator_infoRx   R  t   lower_parfor_sequentialt   get_parfor_paramsR$  R   R(  R)  Rl   R   (   R   t   stencil_passt	   post_procR  R   R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    sr    
!		c         C` sP  t  |  } g  } x7| D]/} | | } g  } |  j j |  } x | j D] } t | t j  r.| j }	 | j }
 |  j	 |
 j
  rt |  j |	  r |  j | |
 |	  } t | t  r| \ } } | j |  qqt |	 t j  r|	 j d k r|  j | |
 |	 |  } qn  | j |
 j
  n  | j |  qK W| | _ q Wd S(   si   
        Convert supported Numpy functions, as well as arrayexpr nodes, to
        parfor nodes.
        t	   arrayexprN(   R-   R   t   get_equiv_setR  R   R   R  R<  R  t   _is_C_orderR   R8   t   _is_supported_npycallt   _numpy_to_parforR`  RZ  R=  R   t   _arrayexpr_to_parforR   (   R   R3  t
   topo_ordert
   avail_varsR8  R  t   new_bodyR   R  R  R  t	   pre_stmts(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s,    
		!c         C` s   t  |  } x | D] } | | } g  } |  j j |  } x | j D] } d } t | t j  r | j }	 | j	 }
 | j
 } t t |  j |  } | d k s | d k r t |  j | |
 | j |	  } n  | r | } q n  | j |  qE W| | _ q Wd S(   sB   
        Find reduce() calls and convert them to parfors.
        R   Rn   t
   _functoolsN(   R   Rn   (   R   R5  (   R-   R   R,  R  R   R   R   R  R   R  R<  R8   R6   R  t   _reduce_to_parforRe   R   (   R   R3  R1  R8  R  R3  R   R  Rj   R   R  R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s*    
			c      
   C` sV  t  |  } g  } x=| D]5} | | } g  } |  j j |  } x| j D]} t | t j  su t | t j  r4| j }	 | j	 }
 t | t j  r | j
 n | j } | j } |  j |
 j } |  j | j } |  j | j } t | t j j  r4t | t j j  rt | j t j  r| j | j k rt | t j  re|  j | |	 |
 | |  } q.t | t j j  r.t t |  j | j  } t | t j  r| j d k r| j
 j | j k r|  j | |	 |
 | | j  } qq.q1| j |  } | d  k r1|  j | |	 |
 | | d | } q1q4n  | j |  qK W| | _ q Wd  S(   Nt   getitemRv   (   R-   R   R,  R  R   R   t   StaticSetItemt   SetItemR   R  R   R   R<  R  R   R
   R   R   Rp   t   BooleanRw   t   Numbert   _setitem_to_parforR8   R<   R  R=  R   t	   get_shapeR   R   (   R   R3  R1  R2  R8  R  R3  R   R  R   R  R   R<  t
   target_typt	   index_typt	   value_typt   val_defRv   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  7  sH    
$		$				!c   8      ` s  t     \ } } t    } t    } t |   | j | j   | j   } g  | j   D]# } | | t | | j	  f ^ q^ } g  }	 xt
 | d d   D]\  }
 t  j  d k s t  j  d k r q n  t  j  d } x  | j	 D]} t | t j  r t | j t j  r | j j d k r 	 j | j j j |  r g   j	 D]' } |   k rd|  j k rd| ^ qd} | j j } 	 j | j j j |  \ } } xa    j j	 D]O } t | t j  rt | j t j  r| j j d k r| j j  PqqWt i    j d 6	 j  \ } } | d } t  f d   | D    j     | j } | j  } 	 j! j"  j  } t j# | |  } 	 j$   | | |  | _	 | j | _   f d   | D  t%   } t j# | |   | <t   } x$ | D] } | j& | j |  } q%Wt   } x$  j D] } | j&  |  } qXW| j' |  } xO | D]G }  | j	 d	 } t | t j(  r| j  j k r| | _ qqW  f d
    d  } d  }    	 f d   }  t* }! | d k rC| j+ | d  s7t,  t- |  | d  }" |" re|" \ }# } }$ } n
 | d }# | j. | d  k r|# n |  }% 	 j/ |% | |  \  }  }& | rt0  f d   | D   n   t1  j    }' t j# | |  }( 	 j2 |  |(  \  }) |( j	 |' j	 }* |* |' _	 | rE|& d }+ n  }+ | d  k rt%   }, t3  |, t1  j    d    j   }- t1 |-  }. t4 |-  }/ t j# | |  }( |(  |, <t j5 | t6 d  |  }0 |$ 	 j |0 j <t j j7 | |+ |  }1 |( j	 j8 t j |1 |0 |  t j9 |0 |. |/ |  g  qn`d }2 d }3 | d }4 t |  d k r| d }2 | d }4 n  t |  d k r*| d }2 | d }4 y 	 j: j; | d  }3 Wn t< k
 rt= d   n Xt |3 t j>  st= d   n  |3 j }3 |3 d k r*t= d   q*n  t j5 | t6 d  |   t |2 t?  rl|2 d k rlt@ jA }) n t@ jB }) tC }! tD  |2 |4 |3  g } |) 	 j  j < f d    D }5 tE  |5  |! r	 jF     n  tG | |  | | r|+ n  | d | | f 	 jH d | }6   | j	 d	 }7 t  j  d |7 _   |7 j j	 jI d |6    jJ  j  x | D] }   jJ |  qyWq q Wq Wd  S(   NRl  c         S` s   |  d S(   Ni   (    (   t   tup(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   k  R   i   i    R;  t
   pair_firstc         3` s'   |  ] \ } } |   k r | Vq d  S(   N(    (   R   t   tRK  (   t
   loop_index(    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>  s    c         ` s   i  |  ] }   | |  q S(    (    (   R   R\   (   R3  (    s+   lib/python2.7/site-packages/numba/parfor.pys
   <dictcomp>  s   	 ic          ` sc  t  j    }  xn   j   D]` } xW | j t j  D]C } t | j t j  r5 | j j |  k r5 |  j	 | j
 j  q5 q5 Wq Wg  } g  } x   j   D] } x | j D] } t d   | j   D  } | |  @r | j |   r q n  t t | t j   | j } t t | t j  o*| j d k  | j | j j  | j |  q q Wq W| | f S(   s   find expressions that involve getitem using the
                        index variable. Return both the arrays and expressions.
                        c         s` s   |  ] } | j  Vq d  S(   N(   R   (   R   R[   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>  s    R7  t   static_getitem(   R7  RF  (   RC  RE  t
   find_instsR   R  R   R<  R   R   RF  R  R  R  R   t   issubsetR9   R=  R   R   (   t   indicesR  RA  t   arrst   exprst   lvR  (   R   t   loop_index_vars(    s+   lib/python2.7/site-packages/numba/parfor.pyt   find_indexed_arrays  s*    
	c   
      ` s  t   j |   } t | oH t | t j  oH | j d k oH | j d k  | j } t	 j
 g   j D] }  | ^ qe   }     \ } } t | j g t |  k  t | j | k  t   j | j  }  j |  } x | D] }	 | d |	 _ q W| S(   s   Find the case where size_var is defined by A[M].shape,
                        where M is a boolean array.
                        R  Rv   i    (   R<   R  R9   R   R   R=  R   R  R<  R  RH  t   exitsR   R"  t
   _find_mask(
   t   size_vart   size_deft   arr_varR\   t	   live_varst
   index_arrst   index_exprst   arr_deft   resultR  (   RN  t   live_mapR  R   (    s+   lib/python2.7/site-packages/numba/parfor.pyt   find_mask_from_size  s    	)R   c         3` s%   |  ] } | r | n   d  Vq d S(   i    N(    (   R   R[   (   t
   index_vars(    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>  s   s	   $mask_vali   i   s,   Only known step size is supported for pranges/   Only constant step size is supported for pranges4   Only constant step size of 1 is supported for pranget   parfor_indexc         ` s   i  |  ] }   |  q S(    (    (   R   RK  (   R   (    s+   lib/python2.7/site-packages/numba/parfor.pys
   <dictcomp>1  s   	 R   R   (K   R0   RI   RF   RG   t   usemapt   defmapt   loopsRG  Rl   R  R  t   entriesRO  R"  R   R   R  R<  R=  R   t   _is_parallel_loopR   R   t   headerRe   t   _get_loop_kindR  R*   R  R  RF  R  R   R   R,  t   Blockt   _get_prange_init_blockR   RH  t   intersectiont   JumpR   R/  t	   has_shapeR   R8   R=  t   _mk_parfor_loopsR`  Rq   t   _make_index_varR5   R}   R   R   R7  RZ  t   BranchR  R<   R  t   NotImplementedErrorR  R   R
   t   uintpt   intpR  R   R#   t   _replace_loop_access_indicesR   R   R  R  (8   R   R3  R  R  t   cfgt   usedefsR_  RU  t   sized_loopst   moved_blocksR   t   entryRA  R\   t   body_labelsRe   t	   loop_kindt   loop_replacingR  t   cpsR  R   R   R   t	   end_labelt   bodydefst   blt
   exit_livesR   t	   last_instt   mask_vart   mask_indicesRZ  t   unsigned_indexRX  Rr   t   mask_typt	   size_varst
   orig_indext   first_body_blockt
   body_blockt   index_var_typR  t   orig_index_vart
   body_labelt   labelst
   true_labelt   false_labelt   maskt   mask_valR   R   RQ  t   index_var_mapRj   t   jump(    (
   R3  RN  R   R[  RY  R  R   RE  RM  R   s+   lib/python2.7/site-packages/numba/parfor.pyR  b  s   6"*'
				
		
	"



		c      	   C` s  | j  | j  t |   t |  } Wd QX| d } t   } x| D]} | | } x| j D]y}	 t |	 t j  rt |	 j	 t j
  r| | k r |	 j	 j | k r |	 j j | k r | j  |	 j j  | j  |	 j j  q|	 j j | k rt d j |	 j j    qn  t |	  rt |	  }
 |
 d k rFqc n  t t |  j |
 d t } |
 j | k s| d k	 r| j | k rt |	 |  n  t |  j | | |  n  t |	 t  rc |  j |	 j | |  qc qc WqI W| | 8} d S(   s   
        Replace array access indices in a loop body with a new index.
        index_set has all the variables that are equivalent to loop index.
        Ni    s&   Overwrite of parallel loop index at {}t   lhs_only(   RF  R   t   dummy_return_in_loop_bodyR-   R  R  R   R   R  R<  R   R  R   R   R   RB   RC   R   R8   R<   R  R/  RD   t   _replace_multi_dim_indR   Ro  R   (   R   R   t	   index_sett	   new_indexR  t   first_labelt   added_indicesR\   R  R  R   t   ind_def(    (    s+   lib/python2.7/site-packages/numba/parfor.pyRo  F  sD    
	

!
c         C` s   t  | d k	  t  t |  j | j t j t j f   t |  j	 |  } t  t | t
 j  ol | j d k  g  | j D]! } | j | k r | n | ^ qz | _ d S(   sq   
        replace individual indices in multi-dimensional access variable, which
        is a build_tuple
        t   build_tupleN(   R9   R   R   R  R   R
   t   Tuplet   UniTupleR<   R  R   R=  R   R   (   R   t   ind_varR  R  t   ind_def_nodeRK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    c         C` s6  t  t | t j  o! | j d k  | j } | j } |  j | j } |  j | j } | j	 } t  t | t
 j j   t | t
 j j  r t | j t
 j  r | | j	 k r | | | j d f St | t
 j  r,t |  j |  \ } } t  | d k ot |  | k  d }	 g  }
 d } x | D] } |  j | j } t | t
 j j  rt | j t
 j  r| } | j } |
 j d  q*t | t
 j j  rt | j t
 j  r| } | j } |
 j d  q*t | t
 j  r*|	 d 7}	 |
 j |  q*q*Wt  | o|	 | d k  | | | |
 f St  d S(   s   check if an array is of B[...M...], where M is a
        boolean array, and other indices (if available) are ints.
        If found, return B, M, M's type, and a tuple representing mask indices.
        Otherwise, raise GuardException.
        R7  R  i    i   N(   R9   R   R   R=  R   R<  R   R  R   Rw   R
   R   R   Rp   R:  R   t	   BaseTupleR7   R  Rl   R   t   IntegerR:   (   R   RW  R<  R   R@  R?  Rw   t   seqR   t   count_constsR  R~  t   indR  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRP    sF    %			"		
c         C` s  d } d } g  } x t  | j  D] \ } } t | t j  r t | j t j  r | j j d k r |  j | j j	 j
 |  r | } n  t | t j  r" t | j t j  r" | j j d k r" |  j | j j	 j
 |  r" | } q" q" W| d k r| d k rd   | D }	 g  }
 xu t t | d |   D]Z } | j | } d   | j   D } |	 | @r|	 | O}	 |
 j |  q4| j |  q4W| j   |
 j   | j |  |
 | j | d | _ n  | S(   s   
        If there is init_prange, find the code between init_prange and prange
        calls. Remove the code from entry_block and return it.
        iR;  c         S` s   h  |  ] } | j   q S(    (   R   (   R   RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>  s   	 i   c         S` s   h  |  ] } | j   q S(    (   R   (   R   RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>  s   	 (   R  R  R   R   R  R<  R=  R   t   _is_prange_initR   R   Ra  R  Rc   R   R   t   reverse(   R   t   entry_blockR  t   prange_argst   init_call_indt   prange_call_indt	   init_bodyRt   RA  t   arg_related_varst   saved_nodest	   inst_vars(    (    s+   lib/python2.7/site-packages/numba/parfor.pyRe    s4    '	' 



&c         C` sJ   | | k r t  S| | } t |  d k oI | d d k pI | d t k S(   Ni    R_   (   R  Rl   R_   (   R   t   func_varR  R;  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    
c         C` s   | | k r t  S| | } t |  d k o | d d k p | d t k p | d d k p | d t k p | d d k p | d t k S(   Ni    R   Rb   R   (   R  Rl   R   Rb   R   (   R   R  R  R;  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRa    s    
2 c         C` s   | | k s t   | | } t |  d k s4 t   d } | d d k sZ | d t k r y, d |  j | d |  j | d f f } Wq t k
 r d d	 f } q Xn) | d d k s | d t k r d
 } n  | S(   s(   see if prange is user prange or internali    Rj  R   Rb   R^  iR   (   Rj  R   (   R   R   (   R   R   (   R   Rl   Rb   R  R  R   (   R   R  R  R;  t   kind(    (    s+   lib/python2.7/site-packages/numba/parfor.pyRc    s    
 , 	c         C` s>   |  j  | } t | t j j  o= | j d k o= | j d k S(   Nt   Ci    (   R  R   R
   R   R   t   layoutRw   (   R   t   arr_nameR  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR-    s    c   	      C` s   t  |  } | j } | d k r t j | t d  |  } t j j t j |  |  j	 | j
 <t j j t |  |  } t j | | |  } | j j |  | t j j t j |  f S| d k r | d t j f St d   d  S(   Ni   s   $parfor_index_tuple_vari    s,   Parfor does not handle arrays of dimension 0(   Rl   R   R   R   R   R
   t
   containersR  Rm  R  R   R=  R  R"  R  R  R   Rl  (	   R   R  R[  R  t   ndimsR   t	   tuple_vart
   tuple_callt   tuple_assign(    (    s+   lib/python2.7/site-packages/numba/parfor.pyRj    s    		c         C` s~   g  } g  } xe | D]] } t  j | t d  |  } | j |  t j |  j | j <| j t | d | d   q W| | f S(   sV   
        Create loop index variables and build LoopNest objects for a parfor.
        R\  i    i   (	   R   R   R   R   R
   Rm  R  R   R   (   R   R  R  R   t	   loopnestsR[  RQ  R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRi    s     c         C` s  | j  } | j } | j } |  j | j } | j }	 | j |  }
 |  j |
 | |  \ } } t j	 | |  } t
 |  j |  j | t |
  |	 | |  | _ t   } t j	 | |  } t j | t d  |  } |	 |  j | j <|  j | | |  \ } } | j j t |  j |  j |  j |  j | | | | | | |   d j t | j   f } t | | i  | | | | d |  j  } t j | | | |  } t t j |  j | j | |	  |  j | <| j j |  i | | 6| _ t  j! d k r| j"   n  | S(   se   generate parfor from arrayexpr node, which is essentially a
        map with recursive tree.
        s   $expr_out_vars   array expression {}i    i   (#   R  R   R  R  R   Rp   R=  Ri  R   Rd  R   R  R`  R  R   R   R   Rj  RZ  t   _arrayexpr_tree_to_irR  R  R   t   repr_arrayexprR   R   R9  RL   R
   t   noneR   R   R   R"  R  (   R   R   R  R+  R2  R  R   R  t   arr_typt   el_typR  R[  R  R   R  R  t   expr_out_varR   R  t   patRj   t   setitem_node(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR0  &  sN    						
(&c   "   	   C` sL  | j  } |  j | j } | j }	 |  j | j }
 t j | |  } | rt |
 t j  st t |
 t j	  st t
  | } t j | t d  |  } t j j | | |  } t j j | |
  j } | |  j | j <|  j | |
 f  |  j | <| j t j | | |   | } n0 t |
 t j  s.t
  | j |  } |
 j } g  } g  } xe | D]] } t j | t d  |  } | j |  t j |  j | j <| j t | d | d   qYWt   } t j | |  } |  j | | |  \ } } t | | i  | | | d	 |  j  } | r9i | | 6| _ | } d
 } n t   } t j | |  } t   } t j | |  } i | | 6| | 6| | 6| _ t j | t d  |  } | |  j | j <t j j | | |  } | j! j" t j | | |  t j# | | | |  g  |  j | j } t | t j$ j%  rt j | t d  |  }  | j |  j |  j <t j j | | |  } t& | j | |  |  j | <| j! j t j | |  |   n | }  t j' | | |  |  }! t& t j( |  j | j | |	  |  j |! <| j! j |!  | r,| j! j t j) | |   n  t* j+ d k rH| j,   n  | S(   s   generate parfor from setitem node with a boolean or slice array indices.
        The value can be either a scalar or an array variable, and if a boolean index
        is used for the latter case, the same index must be used for the value too.
        s   $subarrR\  i    i   R  R   s	   $mask_vars
   $value_var(   R  R   N(-   R  R  R   Rp   R   Rd  R   R
   R  t	   SliceTypeR   R   R   R=  R7  R   t	   arraydeclt   get_array_index_typeRX  t   _type_getitemR  R   R  t   ArrayCompatibleR=  Rm  R   R   Rj  R   R   R   R   R  RZ  Rk  R   R   RL   R9  R  Rg  R   R"  R  ("   R   R   R   R  R   R<  Rv   R  R  R  R?  R   R  t
   subarr_vart   getitem_callt
   subarr_typt   bool_typR  R[  RQ  R   R  R  R  Rj   t
   true_blockRy  R  t	   end_blockR~  R  R@  t	   value_varR  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR<  [  s    				 				
	"&c         C` s%   t  j } |  j j | t |  i   S(   N(   t   operatorR7  R  t   resolve_function_typeR`  (   R   Re   t   fnty(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    	c         C` sz   t  |  j |  \ } } t | t  o3 | j d  s: t S| d k rJ t S| d k rZ t S| d k rv | t k rv t St S(	   sL   check if we support parfor translation for
        this Numpy call.
        R   R   t   onesR   R   s   numpy.random(   R   R  (   R   R   (   R6   R  R   R   t
   startswithR  R/  RR   (   R   R  t	   call_namet   mod_name(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR.    s    c         C` s   |  j  | j S(   N(   R  Rw   (   R   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt
   _get_ndims  s    c         C` sw   t  |  j |  \ } } | j } t | j  } | d k sH | d k rd |  j | | | | | |  St d |   d  S(   NR   R  s   numpy.randoms   parfor translation failed for (   R   R  (   R6   R  Re   R  t   kwst   _numpy_map_to_parforRl  (   R   R   R  R  R  R  Re   R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR/    s    	c      	   C` s  | j  } | j } |  j | j }	 |	 j }
 | j |  } |  j | | |  \ } } t j | |  } t	 |  j |  j
 | t |  |
 | |  | _ t   } t j | |  } t j | t d  |  } |
 |  j | j <|  j | | |  \ } } | d k rt j |
 d  |  } n | d k rCt j |
 d  |  } n | t k rt | |  t | |  j  \ } } |  j
 j |  |  j | j j j t j   | |  |  j
 | <| } n t d j |   t j | | |  } | j j |  t | | i  | | | d j |  d f |  j  } t j  | | | |  } t! t" j# |  j | j | |
  |  j
 | <| j j |  i | | 6| _$ t% j& d k rt' d	  | j(   n  | S(
   s8   generate parfor from Numpy calls that are maps.
        s   $expr_out_varR   i    R  i   s,   Map of numpy.{} to parfor is not implementeds   {} functions   NumPy mappings   generated parfor for numpy map:()   R  R   R  R   Rp   R=  Ri  R   Rd  R   R  R`  R  R   R   R   Rj  R  RR   t   _remove_size_argt   _get_call_arg_typesR  R   R  R   t   ContextRl  R   R  R   R   R   R9  RL   R
   R  R   R   R"  RZ   R  (   R   R   R  R  Re   R  R  R  R   R  R  R  R[  R  R   R  R  R  R   R  R<  t   new_arg_typst   new_kw_typest   value_assignRj   R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    sV    					&
c         C` s  d d l  m } t |  j |  } | |  j |  |  j | j }	 |	 j }
 t j | |  } |  j	 | | |  \ } } t j
 | t d  |  } |
 |  j | j <t j j | | |  } t |
 |	 |  |  j | <| j t j | | |   t | |  j j j j |  j |
 |
 f |  j |  j  } | j } t   } t j | |  } | | | <t | j j    } | j | } | j j | j  | j | _ t | | | g  t | | |  | | f S(   sZ   
        Produce the body blocks for a reduction function indicated by call_name.
        i    (   t   check_reduce_funcs   $val(   R  R  R<   R  R  R   Rp   R   Rd  Rj  R   R   R=  R7  RL   R  R   R  R;   R(  R   R  R  R3  R   Rq   RG  R  RZ  R>   R?   (   R   R  R  R   R[  Rr   t   acc_varR  t   reduce_funcR  t   in_typR  R   t   index_var_typet   tmp_varR  t   reduce_f_irR   Ry  R  t   first_reduce_labelt   first_reduce_block(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   _mk_reduction_body	  s>    				
c      	   ` sS  | j  } | d } | d } t |  j | j  } d }	 d }
 t |  j |  } | rk | \ } }	 } }
 n  | d } | j |
 d k r | n |	  } |  j | | |  \   }   } |
 r t	   f d   |
 D    n  | } t
 j | |  } | j j t
 j | | |   t   } |  j | | |   | |  \ } } |
 rS| d } n  |	 d k rt | j    } t | j    } t
 j | |  } | | | <t
 j | t d  |  } | |  j | j <t
 j j |	 | |  } | j j t
 j | | |  t
 j | | | |  g  n  t | | | | | | d j |  d f |  j  } | S(	   sy   
        Convert a reduce call to a parfor.
        The call arguments should be (call_name, array, init_value).
        i    i   i   c         3` s%   |  ] } | r | n   d  Vq d S(   i    N(    (   R   R[   (   R[  (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>Q	  s    s	   $mask_vals   {} functionR  N(   R  R<   R  R   R   R8   RP  R=  Ri  R`  R   Rd  R  R   R  R   R  Rq   RG  R}   R   R   R  R=  R7  RZ  Rk  R   R   R   (   R   R   R  Re   R   R  R  Rr   RW  R~  R  RX  R  R   R  R  t
   mask_indexR  R   R  R   R   R  R  R  R  R  Rj   (    (   R[  s+   lib/python2.7/site-packages/numba/parfor.pyR6  <	  sL    	


!		
	c         C` s  x| j    D]\ } } | j |  } t } x|| rt } g  } d } x@| t | j  d k  r| j | }	 | j | d }
 t |	 t  rOt |
 t  rO| j |  } | |	 _ | |
 _ t	 | |	 |
  \ } } |  j
 j j |  | d  k	 rOt } |  j
 j |	 j j |
 j g  | j |  |  j | |  | d 7} qL qOn  | j |	  t |	 t  r~|  j |	 |  n  | d 7} qL W| j | j d  | | _ q1 Wq Wd  S(   Ni    i   i   i(   R   R,  R/  R  Rl   R  R   R   R   t   try_fuseR  R%  R   R   R#  R   RZ  t   fuse_recursive_parfor(   R   R   R3  R8  R  R   t   fusion_happenedR3  Rt   R  t	   next_stmtt
   fused_nodet   fuse_report(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   r	  s<    			 
	c         C` st   t  |  } t |  j | |  j  t j |  j |  j |  j |  j  } | j | |  |  j	 | |  t
 |  d  S(   N(   R  R  R  R  R   R  R  R  R  R   R  (   R   Rj   R   R3  t   arr_analysis(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  	  s    N(    Rg   Rh   R   R  R   R  R  R  R  R  Ro  R  RP  Re  R  Ra  Rc  R-  Rj  Ri  R0  R   R<  R  R.  R  R/  R  R  R6  R   R  (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s8   	Z			+		9		,	'								5]						;	(	6	#c         C` sh  t  | j  } | j d d  t | j    | _ |  t t k rP g  | _ n  |  t k r t	 | j  d k r | j j   q n  |  t
 k r t	 | j  d k r | j j   q n  |  d k r0t	 | j  d k r | j j   n  t	 | j  d k r0| j j   } | j j   | j j |  q0n  |  d k rdt	 | j  d k rd| j j   qdn  d S(	   s%   remove size argument from args or kwsR   R   i   i   t   randinti   t
   triangularN(   R  R  R  R`  R   RO   RN   Re   RQ   Rl   RP   R   (   R  R  R  t   dt_arg(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  	  s,    c         C` so   g  } x% |  j  D] } | j | | j  q Wi  } x( |  j D] \ } } | | j | | <q> Wt |  | f S(   N(   Re   R   R   R  R`  (   R  R  R  Ry   R  R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  	  s    c   !      ` s    | j  } | j } | j } g  } t | t  r| \ } } g  } xq | D]i } t j | t d  |  } |   | j  <| t |  |   | | | | | | |	 |
  7} | j	 |  qM W| t
 j k r  | d j  } t |  d k rs  | d j  } | j | | | f i   } t j j | | d | d |  } | t j k rt | d | d |    \ } } qn4 | j | | f i   } t j j | | d |  } | | | <| j } | j	 t j | | |   n  xt j D]} t | |  rt   | |
  } t j | t |  |  }   |   | j  <|  j |  } t | t j  r| j d k r| j d k rt j | t d  |  } t j j t    | j  <t j  d t |  } t j | | |  } t j j! | d |  } | j	 |  n  t j j" | | d |  }   | j  j# | t   f d	   | D  i   } | | | <| j } | j	 t j | | |   | j	 t j | | |   qqWn t | t j  r,  | j  }  t |  t j$  r|  j% } t& | | | |	 | | |   | | 
 } n |  } | } | j	 t j | | |   nI t | t j'  rut( j)   j* | j+  } | j	 t j | | |   n  t |  d k rt, d
 | f   n    j- | j  d  |   | j  <| S(   s   generate IR from array_expr's expr tree recursively. Assign output to
    expr_out_var and returns the whole IR as a list of Assign nodes.
    s   $arg_out_vari    i   i   R  t   sqrts   $math_g_varR   c         3` s   |  ] }   | j  Vq d  S(   N(   R   (   R   R   (   R  (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>
  s    s1   Don't know how to translate array expression '%r'(    N(/   R   R  R   R   R`  R   R   R   R  R   RK   t   supported_array_operatorsRl   R  R=  t   binopR  t   truedivt   _gen_np_dividet   unaryRx   R  R   t	   MAP_TYPESt   _find_func_varR<   R   R  R
   R  R  R   R  R  R;  R  R   Rp   t   _gen_arrayexpr_getitemR  R   R  t   resolve_value_typeR<  Rl  R  R   (!   R  R  R  R  R   R   R  R  t   parfor_index_tuple_vart   all_parfor_indicesR2  R  R  R   t   out_irR   t   arr_expr_argst   arg_varsRy   t   arg_out_vart   el_typ1t   el_typ2t   func_typt   ir_exprt   Tt   func_var_nameR  t   func_var_deft
   g_math_vart   g_matht   g_math_assignt   call_typt   var_typ(    (   R  s+   lib/python2.7/site-packages/numba/parfor.pyR  	  s    			
#&
	0%
	&	c         C` sA  |  j  } |  j } t j | t d  |  } t j j t  | | j	 <t j
 d t |  } t j | | |  } t j j | d |  }	 t j | t d  |  }
 t t j  } | | |
 j	 <t j |	 |
 |  } t j j |
 |  | g d |  } | j t j   | |  j	 | | j	 g i   } | j | | g  | | f S(   s   generate np.divide() instead of / for array_expr to get numpy error model
    like inf for division by zero (test_division_by_zero).
    s	   $np_g_varR   t   divides	   $div_attr(    (   R  R   R   R   R   R
   R  R  R   R   R  R  R=  R  R   R  R;  R  R   R  RZ  (   t   arg1t   arg2R  R  R  R   R  R  R   t   div_attr_callt   attr_vart   func_var_typt   attr_assignt   div_callR  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  @
  s     		!)c
   !      C` sY  | j  }
 | } | | j } | | j j } t |  } |  j |  pJ g  } g  | D] } |  j |  ^ qT } | d k rut j | j t	 d  |
  } t
 j j d | j d d d d  } | | | j <t j d t j | | g | | |  } | j j |  | } t j d | j   } t j | j t	 d	  |
  } t
 j | | j <t j | | |
  } |	 j |  | } n| d k r| d
 } nt g  | D] } | d k ^ q r| | } t j | j t	 d  |
  } t
 j j t
 j |  | | j <t j d | j   } t j | j t	 d	  |
  } t
 j | | j <t j | | |
  } |	 j |  g  } x_ t t |   D]K } | | } | | } | d k r| j |  qx| j | | |  qxWt t |   } t j j  | |
  } t j | | |
  } |	 j |  | } n  t j j! | | |
  }  t" | | | j | | j  | |  <|  S(   s  if there is implicit dimension broadcast, generate proper access variable
    for getitem. For example, if indices are (i1,i2,i3) but shape is (c1,0,c3),
    generate a tuple with (i1,0,i3) for access.  Another example: for (i1,i2,i3)
    and (c1,c2) generate (i2,i3).
    i    s   $ravelRp   Rw   i   R  R  R   s   $const_ind_0is   $parfor_index_tuple_var_bcastN(#   R   R   Rw   Rl   R=  t   get_equiv_constR   R   R  R   R
   R   R   Rp   R	   t   gen_np_callR   R   R  RZ  R  Rm  R  R   R   R   R  R  R  Rc   R"  R=  R  R7  RL   (!   R   R   R  R  R  R  R  R  R   R  R   R   R  R  t   num_indicesR  R[   t   size_constst	   ravel_vart	   ravel_typt   stmtst
   const_nodet	   const_vart   const_assignt
   ind_offsetR  R[  Rt   RQ  t
   size_constR  R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  Y
  s`    	"$'	%


	c         C` sM   x: | D]2 } |  | } t  | t  r | j | k r | Sq Wt d   d S(   sA   find variable in typemap which represents the function func.
    s   ufunc call variable not foundN(   R   RM   t
   typing_keyR  (   R  R   R2  RK  RD  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  
  s
    
c   	      C` s   t  t j t j | j   t _ t } i  } xH | j j   D]7 \ } } t | | | | | |  \ } } | | | <q= W| | _ | r t | j  | _ n  t	 | d  t
 | | |  t	 | d  t j |  } | j   d  S(   Ns    after parfor sequential lowerings    after parfor sequential simplify(   R}   R	   R  t   find_max_labelR3  R  R   t   _lower_parfor_sequential_blockR/   R,   R1   R   R#  R  (	   R  R  R  R  t   parfor_foundR  t   block_labelR  R*  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR'  
  s"    		
c      	   C` s  | j  } t | j  } x| d k rt } | j | } | j j }	 t j | |	  }
 | j |  |
 _ | j | d | _ t   } |
 j j	 t j
 | |	   | j | | <|
 | |  <t   }  t | j  } x!t |  D]} | j | } t   } t   } t | | j | j | j | | |	  } | | j d _ | j d j } | | | <t | | | | |	  } | j | j d _ | | | <| d k r| j j j	 t j
 | |	   |  | j d _ n$ | | | j d _ | | j d _ | } q Wt | j j    } | j | j j	 t j
 | |	   t | j j    } | | j d _ xH | j j   D]7 \ } } t | | | | | |  \ } } | | | <qaWt | j  } q W|  | f S(   Nii   ii    (   R  t   _find_first_parforR  R/  R   R   R   Rd  R   R   Rg  Rl   R   Rc   R    R   R   R   R  R!   R   t   falsebrt   truebrR}   R   RG  Rq   R   R"  (   R$  R  R  R  R  R#  R  Rt   RA  R   t
   prev_blockt
   init_labelR  R  t   range_labelt   header_labelt   range_blockt   phi_vart   header_blockt   prev_header_labelt   body_last_labelt   body_first_labelR\   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR"  
  sf    		
				


c         C` s>   x7 t  |   D]) \ } } t | t  r | j r | Sq Wd S(   Ni(   R  R   R   R   (   R  Rt   RA  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR%    s    c         C` s   t    } t    } t |   \ } } t |   } x | D] } |  | }	 x t |	 j  D] \ }
 } t j |	 j |	 j  } |	 j |
  | _ t i | d 6 j	 d } | | O} t
 | | | |  | j B| _ | j | j  qW W| | | O} q7 W| S(   s   find variables used in body of parfors from outside and save them.
    computed as live variables at entry of first block.
    i    (   R  RF   R-   t   _find_parforsR  R   Rd  R  R   R^  t   get_parfor_params_innerR   R   RF  R   (   R3  t   options_fusionR#  R  t   pre_defsR  t   all_defsR1  R8  R  Rt   Rj   t   dummy_blockt   before_defs(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR(    s    			

c         C` s  t  |   } t |  } t |  } t | | | j | j  } t | | |  } t |  }	 |	 d k r t j	 r | r~ d n d }
 t
 d j |
 |  j |	 |   n  t |  | |  j <n  t |   t | j    } | d } | d } | j | | B} | | | @} | S(   Ni    s   After fusions   With fusion disableds2   {}, parallel for-loop {} has nested Parfor(s) #{}.i   (   R  RI   RF   RG   R]  R^  R(  Rl   R   R   RZ   R   R   R"  R  R  RG  (   Rj   R5  R4  R#  R3  Rp  Rq  RY  R  R  R  t   keylistR   t   first_non_init_blockR8  R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR3  .  s(    		


c         c` s>   x7 t  |   D]) \ } } t | t  r | | f Vq q Wd  S(   N(   R  R   R   (   R  Rt   RA  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR2  I  s    c         C` s   t  |  j j    } g  } xn |  j j   D]] } xT | j D]I } t | t j  r; | j j	 |  j
 j	 k r | j | j j	  q q; q; Wq+ Wt t |  t |  @ } t |  S(   sh   get arrays that are written to inside the parfor and need to be passed
    as parameters to gufunc.
    (   R}   R   RG  RE  R  R   R   R9  R   R   R   R   R  R"  R  R  (   Rj   t   parfor_paramst
   last_labelt   outputsR9  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   get_parfor_outputsO  s    !c         C` s  | d k r i  } n  | d k r* g  } n  | d k rE t t  } n  | d k r` t t  } n  | d k ru i  } n  t |   } t |  }	 |	 d }	 t |   xt |	  D]}
 xt |  j |
 j  D]t} t	 | t
 j  r| j j | k s| j j | k r| j j } | j } | | k r.| n | | } g  } t	 | t
 j  r_| j g } n: t	 | t
 j  rg  | j j   D] } | j ^ q} n  | | j |  x | D] } | | | <qWt j |  } | j | k r| | j | | j <n  | | j |  n  t	 | t  r t | | | | | | | |  q q Wq Wx | j   D]t \ } } | | k rT| | k rT| j |  | | j   t | | |  } t t |  } | | f | | <qTqTW| | f S(   s   find variables that are updated using their previous values and an array
    item accessed with parfor index, e.g. s = s+A[i]
    i   N(   R   R   R"  R  R-   R  R  R   R  R   R   R  R  R   R<  R   R=  R   RZ  RC  RD  R   R   t   get_parfor_reductionsR   R  t   get_reduce_nodesR8   t   get_reduction_init(   Rj   R;  R  t
   reductionst   reduce_varnamest
   param_usest   param_nodest   var_to_paramR3  R1  R8  R  R  t   rhst	   cur_paramt	   used_varsRK  t   stmt_cpt   paramt   reduce_nodesR   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR?  `  sZ    			

	(c         C` s   t  t |   d k  t  t |  d j t j   t  |  d j j |  d j j k  |  d j } t  t | t j  o | j	 d k  | j
 t j k r d S| j
 t j k r d Sd S(   s   
    Get initial value for known reductions.
    Currently, only += and *= are supported. We assume the inplace_binop node
    is followed by an assignment.
    i   iit   inplace_binopi    i   N(   R9   Rl   R   R<  R   R   R  R   R=  R   t   fnR  t   iaddt   imulR   (   t   nodest   acc_expr(    (    s+   lib/python2.7/site-packages/numba/parfor.pyRA    s    $%c         ` s  d } i    t    f d   xt |  D]\ } } | j } | j } |   | j <t | t j  r | j   k r  |  } n  t | t j	  r. t
  f d   | j   D  } |  | k rg  t |  D] } | j  | t  f ^ q }	 g  |	 D]! \ } }
 |
 j |  k r| ^ q} t |  d k s@t  g  |	 D]' \ } }
 | |
 j k rG| |
 f ^ qG}	 t |	  } t j | j |  d | j  | | d <t | |  | | } Pqq. q. W| st d   | S(   s   
    Get nodes that combine the reduction variable with a sentinel variable.
    Recognizes the first node that combines the reduction variable with another
    variable.
    c         ` sO     j  |  j d   } t | t j  r1  |  S| sC | d  k rG |  S| Sd  S(   N(   R  R   R   R   R   R   (   R   t   varonlyRs   (   t   defst   lookup(    s+   lib/python2.7/site-packages/numba/parfor.pyRU    s    
c         3` s!   |  ] }   | t   j Vq d  S(   N(   R/  R   (   R   RK  (   RU  (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>  s    i   s   #initi    s   Invalid reduction formatN(   R   R/  R  R  R<  R   R   R   R   R=  R  R   t   get_expr_argsRl   R   R  R  R   R$   (   R   RQ  RL  Rt   R  R  RG  t   in_varsR[   Re   R]   t   non_red_argst   replace_dict(    (   RT  RU  s+   lib/python2.7/site-packages/numba/parfor.pyR@    s.    		!"1.4'
c         C` sa   |  j  d k r |  j |  j g S|  j  d k rH g  |  j D] } | ^ q8 St d j |     d S(   s-   
    Get arguments of an expression node
    R  RM  R;  s   get arguments for expression {}N(   R  RM  (   R   R  RG  Re   Rl  R   (   R  RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRV    s
    c         C` s   x |  j  D] } | d d k r
 | d d } xM t t |   D]9 } t | | t j  rA t | | | |  | | <qA qA W| d d } xP t t |   D]9 } t | | t j  r t | | | |  | | <q q Wq
 q
 Wd  S(   Ni    R  i   (   R   Rc   Rl   R   R   R   R&   (   Rj   t   callbackt   cbdataR   t   left_lengthsRt   t   right_lengths(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   visit_parfor_pattern_vars  s    

c         C` s5  t  j d k r8 t d |   t d t | j     n  x |  j D] } t | j | |  | _ t | j	 t
 j  r t | j	 | |  | _	 n  t | j t
 j  r t | j | |  | _ n  t | j t
 j  rB t | j | |  | _ qB qB Wt i |  j d 6| |  t |  | |  t |  j | |  d  S(   Ni   s   visiting parfor vars for:s   cbdata: i(   R   R"  RZ   R  R   R   R&   R   R   R   R   R   R   R   R%   R   R^  R   (   Rj   RZ  R[  R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   visit_vars_parfor  s    c         C` s  | d k r t   } n  | d k r0 t   } n  t |   } t |  \ } } t |  } t | j    } t |   | j   } | j	   | }	 x' | j
   j   D] }
 |	 |
 j 8}	 q WxX | D]P } | |	 k r | j | | |  | j | |  q | j | | |  q Wd   |  j D } | d   |  j D O} | d   |  j D O} | j |  | t |   O} t j d | d |  S(   sz   list variables written in this parfor by recursively
    calling compute_use_defs() on body and combining block defs.
    c         S` s1   h  |  ]' } t  | j t j  r | j j  q S(    (   R   R   R   R   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>)  s   	 c         S` s1   h  |  ]' } t  | j t j  r | j j  q S(    (   R   R   R   R   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>,  s   	 c         S` s1   h  |  ]' } t  | j t j  r | j j  q S(    (   R   R   R   R   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>/  s   	 R]  R^  N(   R   R  R  RF   RI   R}   RG  R  R1  t
   dominatorsR_  RE  R  R  R   t   get_parfor_pattern_varsR   t   _use_defs_result(   Rj   t   use_sett   def_setR3  t   usesRT  Rp  R<  R1  t   definitely_executedR  R8  t	   loop_vars(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   parfor_defs  s4    
c         C` s  t  |   } t |  } t |  } t | | | j | j  } t | | | | j  } d   |  j D } | d   |  j D O} | d   |  j D O} | d   |  j D O} t   } x | j	   D]t }	 | j
 |	 c | M<| j
 |	 c | 8<| | j
 |	 O} | j |	 c | M<| j |	 c | 8<| | j |	 O} q Wd t f d     Y}
 t j |
 |   } | j | j
 | j  t |   | | BS(   s~   insert dels in parfor. input: dead variable set right after parfor.
    returns the variables for which del was inserted.
    c         S` s1   h  |  ]' } t  | j t j  r | j j  q S(    (   R   R   R   R   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>F  s   	 c         S` s1   h  |  ]' } t  | j t j  r | j j  q S(    (   R   R   R   R   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>I  s   	 c         S` s1   h  |  ]' } t  | j t j  r | j j  q S(    (   R   R   R   R   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>L  s   	 c         S` s   h  |  ] } | j  j  q S(    (   R   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>N  s   	 t   DummyFuncIRc           B` s   e  Z d    Z RS(   c         S` s   | |  _  d  S(   N(   R3  (   R   R3  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR   _  s    (   Rg   Rh   R   (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRi  ]  s   (   R  RI   RF   RG   R]  R^  RH   R   R  RG  R^  t   escapingt   objectR   R#  t   _patch_var_delsR  (   Rj   t   curr_dead_setR3  Rp  Rq  RY  t   dead_mapRg  t   dead_setR8  Ri  R*  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   parfor_insert_dels:  s0    	
c   
      C` sv   t  |  \ } } t | |  j | |   \ } } x? | j   D]1 } t }	 x" |	 rm t |  | | | |  }	 qL Wq= Wd S(   sm   
    Reorder statements to maximize parfor fusion. Push all parfors up or down
    so they are adjacent.
    N(   R0   RE   t	   arg_namesRE  R/  t   maximize_fusion_inner(
   R  R3  R  R  R  R  t	   alias_mapt   arg_aliasesR  t   order_changed(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  k  s    	c   
      C` s   t  } d } x | t | j  d k  r | j | } | j | d } | rd t | | |  | |  n t | | |  | |  }	 |	 r | | j | <| | j | d <t } n  | d 7} q W| S(   Ni    i   i   (   R  Rl   R  t   _can_reorder_stmtsR/  (
   R  R  R  Rs  R  Ru  Rt   R  R  t   can_reorder(    (    s+   lib/python2.7/site-packages/numba/parfor.pyRr  x  s    '	c         C` sM   t    } x= |  D]5 } | | k r8 | j | |  } q | j |  q W| S(   N(   R  RH  RF  (   t   the_setRs  t   retRt   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   expand_aliases  s    	c   	      C` s  t  |  t  r t  | t  r t  | t j  r t  | t j  sr t | j t   |  sr t t	 | | j  r t
 d   |  j   D |  } t
 t |   |  } t
 d   | j   D |  } t
 t |  |  } t | | @| | @B d k r t Sn  t S(   sw   
    Check dependencies to determine if a parfor can be reordered in the IR block
    with a non-parfor statement.
    c         S` s   h  |  ] } | j   q S(    (   R   (   R   RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>  s   	 c         S` s   h  |  ] } | j   q S(    (   R   (   R   RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>  s   	 i    (   R   R   R   t   PrintR  R3   R<  R  R8   t   is_assert_equivRz  R   t   get_parfor_writesR.   Rl   R/  R  (	   R  R  R  R  Rs  t   stmt_accessest   stmt_writest   next_accessest   next_writes(    (    s+   lib/python2.7/site-packages/numba/parfor.pyRv    s     	
c         C` s   t  |  |  \ } } | d k S(   NRS   (   R6   (   R  R  R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR|    s    c         C` s   t  |  t  s t  t   } |  j j   } |  j | d <x` | j   D]R } xI | j D]> } | j	 t
 |   t  | t  rW | j	 t |   qW qW WqG W| S(   Ni(   R   R   R   R  R   RC  R   RE  R  R  R.   R}  (   Rj   t   writesR3  R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR}    s    	t   FusionReportt   firstt   secondt   messagec         ` s  t  d | d |  d } t | j  t | j  k r t  d  d } d } | | j t | j  f } | | j t | j  f } t | j | j | | | f  } d | f St | j  }   f d   }	 x t |  D] }
 | j |
 } | j |
 } |	 | j | j  o8|	 | j | j  o8|	 | j	 | j	  s t  d |
  d } | d	 | j | j | j	 f 7} | d
 | j | j | j	 f 7} t | j | j | |
  } d | f Sq Wt
 |  st
 |  rt  d  d } t | j | j | | j | j f  } d | f St | j  } t   } x! | j j   D] } | | O} q:Wt | j  } t i | j d 6 j d } x! | j j   D] } | | O} qW| j |  st  d  d } t | j | j | | j | j f  } d | f St | |  S(   sI   try to fuse parfors and return a fused parfor, otherwise return None
    s   try_fuse: trying to fuse 
s   
s/   try_fuse: parfors number of dimensions mismatchs4   - fusion failed: number of loops mismatched, %s, %s.s(   parallel loop #%s has a nest of %s loopsc         ` s   |  | k p   j  |  |  S(   N(   t   is_equiv(   R[   R]   (   R   (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    s/   try_fuse: parfor dimension correlation mismatchs7   - fusion failed: loop dimension mismatched in axis %s. s   slice(%s, %s, %s) != s   slice(%s, %s, %s)s1   try_fuse: parfor cross iteration dependency foundsK   - fusion failed: cross iteration dependency found between loops #%s and #%si    s)   try_fuse: parfor2 depends on parfor1 bodysT   - fusion failed: parallel loop %s has a dependency on the body of parallel loop %s. N(   t   dprintR   Rl   R   R   R  Rc   R   R   R   t   has_cross_iter_depRF   R   R  R^  RE  R   R]  t
   isdisjointt   fuse_parfors_inner(   R   t   parfor1t   parfor2R  R~  R   R  R  R  R  Rt   t   nest1t   nest2t   p1_body_usedefst   p1_body_defsRT  t
   p2_usedefst   p2_usesRe  (    (   R   s+   lib/python2.7/site-packages/numba/parfor.pyR    sZ    
"
  

	

c         C` s  |  j  j j | j  j  t | j j    } | j | j } t |  j j    } t |  j j    } |  j | j j |  |  j j | j  |  j j |  t	 |  j
  } i |  j | j j 6} x5 t |  D]' } |  j
 | j | | j
 | j j <q Wt |  j |  t |  d | }	 t |	  }	 t |  |	  t d   | j   D  }
 t |  j |
  |  j j | j  t j rt d j | j |  j   n  d } | j | j |  j  } t |  j | j |  } |  | f S(   Nt   entry_labelc         s` s   |  ] } | j  Vq d  S(   N(   R   (   R   R[   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>$  s    s1   Parallel for-loop #{} is fused into for-loop #{}.sE   - fusion succeeded: parallel for-loop #{} is fused into for-loop #{}.(   R   R  RZ  Rq   R   RG  R}   R  R  Rl   R   R   R   Rc   R   R#   R  R/   R  R  RE  t   remove_duplicate_definitionsR   R   R   RZ   R   R   R  (   R  R  t   parfor2_first_labelt   parfor2_first_blockt   parfor1_first_labelt   parfor1_last_labelR  t
   index_dictRt   R3  t   namesetR~  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s6    		c   	      C` s   x |  j    D] \ } } | j } g  } t   } xj | D]b } t | t j  r | j j } | | k r | | k rz q8 n  | j |  q n  | j	 |  q8 W| | _ q Wd S(   ss   Remove duplicated definition for variables in the given nameset, which
    is often a result of parfor fusion.
    N(
   R   R  R  R   R   R  R  R   RF  R   (	   R3  R  R8  R  R  R3  t   definedRA  R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  2  s    		c         C` s   d   |  j  D } x |  j j   D] } x | j D] } t | t j t j f  rZ q3 n  t | t j  r t | j	 t j
  r | j	 j } | d k r q3 q n  | j | j    s3 t d | |  t Sq3 Wq# Wt S(   Nc         S` s   h  |  ] } | j   q S(    (   R   (   R   R\   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>K  s   	 R  R7  RF  s   has_cross_iter_dep found(   R  R7  RF  (   R   R   RE  R  R   R   R9  R8  R  R<  R=  R   R  R   R  R/  R  (   Rj   RI  R   R  R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  F  s    '	c          G` s    t  j d k r t |    n  d  S(   Ni   (   R   R"  RZ   (   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  ^  s    c         C` s   t    } xz |  j D]o } | d d k r | d d } | d d } x: | | D]+ } t | t j  rP | j | j  qP qP Wq q W| S(   s:    get the variables used in parfor pattern information
    i    R  i   (   R  R   R   R   R   RF  R   (   Rj   t   outR   R\  R]  RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyRa  b  s    	c   "      C` s  t  |  j   t |  j  } Wd QX| d } i  } t |  j | j |  j | | |  t | j    }	 x | D] }
 |
 | k r qq n  x |  j |
 j D] } t | t	 j
  r t | j t	 j  r | j j d k r | j j j |  j j k r q n  t d   | j   D  } | |	 @} x | D] } | j | d  q'Wq Wqq WxU | D]M }
 |
 | k rhqPn  |  j |
 } | j   } t | j |  j | | |  qPW|  j j   } t | j    } t | | |  \ } } t	 j | t	 j d d   } | | j j |  t |  } t |  } t | | | j | j  } t | j    } x8| j   D]*\ } } g  } d   | j j   D } x+ | j  |  D] \ } } | | | O} qWx t! | j  D] } | | @} x | D] }  | | |  O} qWt | t	 j"  rJ| j j |  j j k rJ| j# j | k rJ| j# j | k rJqn  | d   | j   D O} | j |  qW| j$   | | _ q^W| j | j  | | j j   t% |  | | | | |  t& |  j' j  d k }! x0 |  j j(   D] } |! t& | j  d k M}! qW|! rd S|  S(	   s7    remove dead code inside parfor including get/sets
    Ni    R7  c         s` s   |  ] } | j  Vq d  S(   N(   R   (   R   RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <genexpr>  s    t   parfors_dummyic         S` s   h  |  ] } | j   q S(    (   R   (   R   RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>  s   	 c         S` s   h  |  ] } | j   q S(    (   R   (   R   RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>  s   	 ()   R  R   R-   t   _update_parfor_get_setitemsR  R   R  RG  R   R   R  R<  R=  R   R   R   R   R  R   RC  R}   t   _add_liveness_return_blockRg  t   LocR   RI   RF   RG   R]  R^  R   t
   terminatort
   successorsR  R9  R  R  t   remove_dead_parfor_recursiveRl   R   RE  ("   Rj   t   livesRt  Rs  R  R  R  R  t   first_block_saved_valuest
   saved_arrsR\   R  t   varnamest   rm_arrsR   R  t   saved_valuesR3  R<  t   return_labelR  R  Rp  Rq  RY  t	   alias_setR8  R3  t   in_livest   out_blkt   _datat   alias_livesRK  t   is_empty(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   remove_dead_parforp  s    
	'


c   	      C` s  x}|  D]u} t  | t j  r | j j | j k r | j j | k r x0 | j | j j g   D] } | j | d  q_ W| j	 | | j j <q n  t  | t j
  r"t  | j	 t j  r"| j	 } | j d k r"t  | j t j  r"| j j | j k r| j | j	 j |  | _	 q qq"n  xW | j   D]I } | j | j d  x- | j | j g   D] } | j | d  q^Wq/Wq Wd S(   sS   
    replace getitems of a previously set array in a block of parfor loop body
    R7  N(   R   R   R9  R   R   R  R  R  R   R<  R  R=  R   R   R   (	   t
   block_bodyR   Rs  R  R  R  t   wRG  RK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s$    '	$c         C` sa  |  j  j   } t | j    } | d k s3 t  t | j    } t | | |  \ }	 }
 | | j } t j	 | t
 d  t j d d   } t j | | j <t j | | |	 t j d d   } | | j j |  |  j | d <| d j j t j | t j d d    t | | | | | |  | j |
 j  | d j j   | | j j   d S(   sI   create a dummy function from parfor and call remove dead recursively
    i    s   $branchcondR  iN(   R   RC  Rq   RG  R   R}   R  R  R   R   R   R  R
   t   booleanR   Rk  R  R   R   Rg  R(   R  (   Rj   R  Rt  Rs  R  R  R3  R  R<  R  R  R  t
   branchcondt   branch(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s"    '$,c         C` s  t  |  j    } | d } |  | j } |  | j } t j | |  |  | <t j | t d  |  } t j	 j
 t j d  | | j <g  | D] } t j | | |  ^ q }	 t j j |	 |  }
 |  | j j t j |
 | |   |  | j j t j | |   | | f S(   Ni   s
   $tuple_vari   (   R}   RG  R   R  R   Rd  R   R   R
   R  R  Rm  R   R=  R  R  R   R  t   Return(   R3  R  R  R<  R  R   R  R  RK  RT  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    
	(# c         C` s6   t  |   } t j | | | | | |  t |   d  S(   N(   R  R	   RE   R  (   Rj   Re   R  R  Rs  Rt  R3  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   find_potential_aliases_parfor&  s
    
c         C` s(  x!|  j    D]} x
| j D] } t | t  r | } | j t | j j    } | j } t j	 d d  } t j
 | t d  |  } | j j t j t j d |  | |   | j j t j | |   t | j  | _ | j t | j j    } | j j   t | j  q q Wq Wd S(   s%   simplify CFG of body loops in parforsR  is   $consti    N(   RE  R  R   R   R   R}   RG  R  R   R  R   R   R   R  R  R  R2   R  R  (   R3  R  R  Rj   t
   last_blockR  R   t   const(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  /  s    	+c         C` s   |  j  j   } | d k r0 t | j    } n  | d k sB t  |  j | d <| d j j t	 j
 | | d j   x\ | j   D]N } t | j  d k s | j d j r | j j t	 j
 | | j   q q W| S(   s5   wrap parfor blocks for analysis/optimization like CFGi    iN(   R   RC  R   Rq   RG  R   R   R  R   R   Rg  R   RE  Rl   t   is_terminator(   Rj   R  R3  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  D  s    '&&c         C` s   | d k	 r7 t | j    } | j |  | |  _ n  t |  j j    } t |  j j d t j	  sn t
  |  j j j   xV |  j j   D]E } t | j d t j	  r | j d j | k r | j j   q q Wd S(   sb   
    unwrap parfor blocks after analysis/optimization.
    Allows changes to the parfor loop.
    iN(   R   Rq   RG  R  R   R   R   R  R   Rg  R   RE  R  (   Rj   R3  t   init_block_labelt   first_body_labelR  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  T  s    "c         C` s   t  |   } t | |  \ } } t | |  \ } } t |   | d } x= |  j j   D], } | d   | | D O} | | | O} qZ Wt |  j j    }	 | |	 | d @}
 t j d k r t	 d |
 d |  n  |
 | f S(   s&   find copies generated/killed by parfori    c         S` s   h  |  ] \ } } |  q S(    (    (   R   R\   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pys	   <setcomp>}  s   	 i   s   copy propagate parfor gens:t   kill_set(
   R  R)   R*   R  R   RG  R}   R   R"  RZ   (   Rj   R  R3  t   in_copies_parfort   out_copies_parfort   in_gen_copiest   in_extra_killR  R8  R<  t   gens(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   get_copies_parforp  s    

c         C` ss  xP t  |  j  D]? \ } } | d d k r d t | d |  f |  j | <q q WxP |  j D]E } t | j |  | _ t | j |  | _ t | j |  | _ q] Wt |   }	 g  }
 xF | j   D]8 \ } } |
 j	 t
 j | | | t
 j d d    q W|
 |	 d j |	 d _ t |	 |  \ } } t |	 | | | | |  t |   |	 d j t |
  |	 d _ d S(   s*   apply copy propagate recursively in parfori    R  i   t   dummyiN(   R  R   R$   R   R   R   R   R  R   R   R   R  R  R  R)   R+   R  Rl   (   Rj   t   var_dictt   name_var_tableR  R  t   save_copiesRt   R   R\   R3  t   assign_listt   lhs_nameRG  R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   apply_copies_parfor  s(    $

c      	   ` s  x|  j    D] } g  } t     x | j D] }     f d   } | r t | t  r x | j j D] } | |  qj W| j j   }	 t |	   d t	 | j
 |  q, n
 | |  x0 | j   D]" }
 | t |
 j      7} q W| j
 |  q, W| | _ q Wd S(   s   push call variables to right before their call site.
    assuming one global/getattr is created for each call site and control flow
    doesn't change it.
    c         ` s   t  |  t j  r |  j } |  j } t  | t j  rV |   | j <  j | j  q t  | t j  r | j	 d k r | j j  k s | j j  k r |   | j <  j | j  q q n  d  S(   NR  (
   R   R   R  R<  R  R  R   RF  R=  R   (   R  RG  R  (   t
   block_defst   saved_getattrst   saved_globals(    s+   lib/python2.7/site-packages/numba/parfor.pyt   process_assign  s    		!t   nestedN(   RE  R  R  R   R   R   R   RC  R!  R/  R   R   t   _get_saved_call_nodesR   (   R3  R  R  R  R  R3  R  R  R   t   pblocksRK  (    (   R  R  R  s+   lib/python2.7/site-packages/numba/parfor.pyR!    s&    	
c         C` s   g  } x |  | k r |  | k s- |  | k r |  | k rj | j  | |   | j | |  j j  d }  q	 |  | k r	 | |  j j j } | j  | |   | j | |  j j  | }  q	 q	 W| j   | S(   Nt   _PA_DONE(   R   RF  R  R   R<  R  (   t   fnameR  R  R  RQ  t   up_name(    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s    	
c         C` s(  t  |  t  r |  d } t  | t  sL t | d  rC | j } qL d } n  |  d } t |  d k r d j | t | d   Sd | d } d j | j g  | D] } t |  ^ q   Snb t  |  t	 j
 j  r |  j } | j d  r d	 | S| Sn& t  |  t	 j
 j  r t |  j  Sd Sd
 S(   sM   Extract operators from arrayexpr to represent it abstractly as a string.
    i    Rg   R  i   s   ({}({}))Ro  s   ({})t   $s   '%s' (temporary variable)N(   R   R`  R   t   hasattrRg   Rl   R   R  Rz  Ri   R   R   R   R  R  R   R<  (   R+  t   oprRe   R[   R   (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR    s&    
	
2	c         C` s>   g  } x" |  j  D] } | j | |  q Wt |  | _ d S(   s   postproc updates generator_info with live variables after transformations
    but generator variables have types in return_type that are updated here.
    N(   t
   state_varsR   R`  t   state_types(   R&  Rx   R  t   new_state_typesRK  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR%    s
    c         C` sb   | d  k r i  } n  | d  k r* i  } n  t |   } t | | |  \ } } t |   | | f S(   N(   R   R  R0   R  (   Rj   R  t   reverse_call_tableR3  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   get_parfor_call_table  s    			
c         C` sA   | d  k r i  } n  t |   } t j | |  } t |   | S(   N(   R   R  R	   t   get_tuple_tableR  (   Rj   t   tuple_tableR3  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   get_parfor_tuple_table  s    	
c         C` sD   | d  k r t   } n  t |   } t j | |  } t |   | S(   N(   R   R  R  R	   t   get_array_accessesR  (   Rj   t   accessesR3  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   get_parfor_array_accesses*  s    
c         C` sG   t  |   } t | |  } | | | d <| j |  t |  |  d  S(   Ni    (   R  R5   R  R  (   Rj   R  R3  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   parfor_add_offset_to_labels7  s    c         C` s)   t  |   } t j |  } t |   | S(   N(   R  R	   R!  R  (   Rj   R3  t	   max_label(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   parfor_find_max_labelC  s    
c      	   C` s   | j  } t |   } g  |  j D] } | j ^ q } t | j    } | | j } g  | D]0 } t j t j	 d d | d t
 | |  ^ qZ }	 | | j }
 |	 | | j | | _ | | _  | j   | | _  |
 | | _ t |   d  S(   Ni   R   t   use_literal_type(   R3  R  R   R   Rq   RG  R   R   R  R  R  R  t   build_constraintR  (   Rj   t   typeinferert   save_blocksR3  R\   R[  t   first_blockR   RK  t   index_assignst   save_first_block_body(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   parfor_typeinferL  s    	=	
	c         C` sF   | d k r t t  } n  t |  j |  t i |  j d 6|  | S(   s)   get variable definition table for parforsi    N(   R   R   R"  R=   R   R   (   Rj   t   definitions(    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   build_parfor_definitionsa  s
    c         c` s   t  |  j    } |  | j } t j | t d  t j d d   } |  | j j t j	 | t j d d    d V|  | j j
   d S(   sL   adds dummy return to last block of parfor loop body for CFG computation
    s   $constR  iN(   R}   RG  R  R   R   R   R  R  R   R  R  (   R   R<  R  R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  n  s    't   ReduceInferc           B` s   e  Z d    Z RS(   c         C` sU   | s t   t |  d k s% t   t | d t j  sA t   t | d j |  S(   Ni   i   (   R   Rl   R   R
   R   RL   Rp   (   R   Re   R  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   generic~  s    (   Rg   Rh   R  (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyR  |  s   c          C` sV   t  j }  t j } t  j } |  o% | } | } | s: | rR d } t j |   n  d S(   sK   Check if the platform supports parallel=True and raise if it does not.
    s{   The 'parallel' target is not currently supported on Windows operating systems when using Python 2.7, or on 32 bit hardware.N(   R   t   IS_WIN32R   t   IS_PY3t	   IS_32BITSR   t   UnsupportedParforsError(   t   is_win32t   is_py2t   is_32bitt   uns1t   uns2R~  (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   ensure_parallel_support  s    	
	(   R   t
   __future__R    R   R   R
   t   pytypesR
  R   R  t   textwrapRC  R  R  t	   functoolsR   t   collectionsR   R   R   t
   contextlibR   R  Ri   R   R	   R   R   R   R   R   R   R   R   R   R   R   t   numba.numpy_supportR   t   numba.typing.templatesR   R   R   t   numba.stencilparforR   t   numba.extendingR   t   numba.ir_utilsR   R   R   R   R    R!   R"   R#   R$   R%   R&   R'   R(   R)   R*   R+   R,   R-   R.   R/   R0   R1   R2   R3   R4   R5   R6   R7   R8   R9   R:   R;   R<   R=   R>   R?   R@   RA   RB   RC   RD   RE   t   numba.analysisRF   RG   RH   RI   t   numba.controlflowRJ   t   numba.typingRK   RL   t   numba.types.functionsRM   t   numba.array_analysisRN   RO   RP   RQ   RR   RS   RT   R   R   R  t   TextWrapperR  RX   R^   R  R_   Ra   Rk  Rb   Rz   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R  R{   Rk   R   R   R   R  R   R=  t   StmtR   R  t   array_analysis_extensionsR  R  R  R  R  R  R  R  R  R  R'  R"  R%  R(  R3  R2  R>  R   R?  RA  R@  RV  R^  R_  t   visit_vars_extensionsRh  t   ir_extension_usedefsRp  t   ir_extension_insert_delsR/  R  Rr  Rz  Rv  R|  R}  R  R  R  R  R  R  Ra  R  R  t   remove_dead_extensionsR  R  R  t   alias_analysis_extensionsR  R  R  R  t   copy_propagate_extensionsR  t   apply_copy_propagate_extensionsR!  R  R  R%  R  t   call_table_extensionsR  t   tuple_table_extensionsR  t   array_accesses_extensionsR  t   add_offset_to_labels_extensionsR  t   find_max_label_extensionsR  t   typeinfer_extensionsR  t   build_defs_extensionsR  R  R  (    (    (    s+   lib/python2.7/site-packages/numba/parfor.pyt   <module>   sR  @( ,".																-	b	  	    	(		n		J			F						<		%	
		4	.						G	+					`	 						*				
				