ó
\K]c           @   s…  d  d l  Z  d  d l Z d  d l Z d  d l m 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 d  d l m Z d  d l m Z m Z m Z m Z m 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 d  d	 l m  Z  d
 „  Z! d e" f d „  ƒ  YZ# d „  Z$ d e" f d „  ƒ  YZ% d „  Z& d „  Z' d „  Z( d „  Z) d „  Z* d S(   iÿÿÿÿN(   t   add(   t   types(   t   infer_globalt   AbstractTemplate(   t	   signature(   t   ir_utilst   irt   utilst   configt   typing(	   t   get_call_tablet   mk_unique_vart   compile_to_numba_irt   replace_arg_nodest   guardt   find_callnamet   requiret
   find_constt   GuardException(   t   exec_(   t   OPERATORS_TO_BUILTINSc         C   s   | d k r |  | S|  Sd  S(   Ni    (    (   t   dim_sizet   index_const(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyt   _compute_last_ind   s    t   StencilPassc           B   sY   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   c         C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   t   func_irt   typemapt	   calltypest   array_analysist	   typingctxt   flags(   t   selfR   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyt   __init__!   s    					c            s  d d l  m } t ˆ  j j ƒ \ } } g  } i  } x] | j ƒ  D]O \ } } t | ƒ d k rA t | d | ƒ rA | j | ƒ | d | | <qA qA W| sž d Sx`ˆ  j j j ƒ  D]L\ } }	 x=t	 t
 t |	 j ƒ ƒ ƒ D] \ }
 ‰ t ˆ t j ƒ r‡t ˆ j t j ƒ r‡ˆ j j d k r‡ˆ j j j | k r‡t ˆ j j ƒ } ‡ f d †  t t ˆ j j ƒ ƒ Dƒ } ˆ j j } t ‡  f d †  | Dƒ ƒ } x/ | D]' } t | t j ƒ rœt d	 ƒ ‚ qœqœW| j d
 ƒ } | ˆ j j j } t | ˆ  j | |	 j |	 j  | ˆ  j! ˆ  j" ƒ \ } } } | j# j d d ƒ } ˆ  j% | | | | | ˆ j& | | | ƒ	 } |	 j |
  | |	 j |
 d |	 _ qÙ t ˆ t j ƒ rÙ t ˆ j t j ƒ rÙ ˆ j j d k rÙ t' t( ˆ  j ˆ j ƒ d k rÙ t j) d ˆ j  ƒ ˆ _ qÙ qÙ Wq± Wd S(   sP    Finds all calls to StencilFuncs in the IR and converts them to parfor.
        iÿÿÿÿ(   t   StencilFunci   i    Nt   callc            s#   i  |  ] } ˆ  j  j | | “ q S(    (   t   valuet   args(   t   .0t   i(   t   stmt(    s2   lib/python2.7/site-packages/numba/stencilparfor.pys
   <dictcomp>E   s   	 c         3   s   |  ] } ˆ  j  | j Vq d  S(   N(   R   t   name(   R%   R&   (   R   (    s2   lib/python2.7/site-packages/numba/stencilparfor.pys	   <genexpr>H   s    sI   Tuple parameters not supported for stencil kernels in parallel=True mode.t   outt   index_offsetst   stencilt   numba(   R+   R,   (*   t   numba.stencilR!   R
   R   t   blockst   itemst   lent
   isinstancet   appendt   reversedt   listt	   enumeratet   bodyR   t   AssignR#   t   Exprt   opt   funcR(   t   dictt   kwst   rangeR$   t   tupleR   t	   BaseTuplet
   ValueErrort   gett   get_stencil_irR   t   scopet   locR   R   t   optionst   Nonet   _mk_stencil_parfort   targetR   R   t   Const(   R   R!   t
   call_tablet   _t   stencil_callst   stencil_dictt   call_varnamet	   call_listt   labelt   blockR&   R<   t
   input_dictt   in_argst   arg_typemapt   arg_typet   out_arrt   sft
   stencil_irt   rtt   arg_to_arr_dictR*   t	   gen_nodes(    (   R   R'   s2   lib/python2.7/site-packages/numba/stencilparfor.pyt   run)   sR    %(		&	c         C   sþ   x÷ | j  ƒ  D]é \ } } | j } | j } g  } x¹ | j D]® }	 t |	 t j ƒ rÜ | j ƒ  }
 t |
 t j ƒ r˜ t |
 j	 t j
 ƒ r˜ |
 j	 j d k sž t ‚ | j t j |
 j	 j	 | | ƒ ƒ | j t j | | ƒ ƒ q; | j |	 ƒ q; W| | _ q Wd S(   sß   
        Find return statements in the IR and replace them with a SetItem
        call of the value "returned" by the kernel into the result array.
        Returns the block labels that contained return statements.
        t   castN(   R/   RC   RD   R6   R1   R   t   Returnt   popR7   R#   R8   R9   t   AssertionErrorR2   t   Jump(   R   R.   t   exit_value_vart   parfor_body_exit_labelRP   RQ   RC   RD   t   new_bodyR'   t	   prev_stmt(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyt   replace_return_with_setitemd   s    		"c
   H   	   C   s  g  }
 | j  } t j d k rK d | | | | | | | f GHt j | ƒ n  | d } |  j | j } t j | |  j ƒ \ } } t j | ƒ } t j	 | | | |  j |  j
 ƒ t j d k rÒ d GHt j | ƒ n  t j | |  j j | |  j ƒ t j d k rd GHt j | ƒ n  |  j | j j } | j } | j } g  } xO t | ƒ D]A } t j | t d ƒ | ƒ } t j |  j | j <| j | ƒ qMW|  j | | | | | |	 ƒ \ } } t j d k rÚd GHt j | ƒ n  g  } |  j j | ƒ } | j | ƒ } | t | ƒ k st ‚ xy t | ƒ D]k } |  j | | | | |
 | | ƒ } |  j | | |
 | | ƒ } | j t  j! j" | | | | d ƒ ƒ q&Wt# | j$ ƒ  ƒ d } t j% | | ƒ | | <t j | t d ƒ | ƒ } | j& |  j | j <g  }  | d k r| d }! nt t j | t d	 ƒ | ƒ }! t j' j( t j | ƒ |  j |! j <t j) j* | | ƒ }" t j+ |" |! | ƒ }# |  j |# ƒ t j d k r¦d
 GHt j | ƒ n  t j% | | ƒ }$ | d# k r¼|  j | j } t j d ƒ }% t j | |% | ƒ }& t j) j- | d | ƒ }' t j' j( t j | j ƒ |  j |% <|$ j. j/ t j+ |' |& | ƒ g ƒ t j d ƒ }( t j | |( | ƒ }) d | j0 k rÐ| j0 d }* | j& t1 j2 j2 |* ƒ k r¾t3 d ƒ ‚ n  | j& |* ƒ }+ n | j& d ƒ }+ t j4 |+ | ƒ }, | j& |  j |( <|$ j. j/ t j+ |, |) | ƒ g ƒ t j d ƒ }- t j | |- | ƒ } t  j j5 j6 | j& | j | j7 ƒ |  j | j <t j | t d ƒ | ƒ }. t j8 j9 t: ƒ |  j |. j <t j; d t: | ƒ }/ t j+ |/ |. | ƒ }0 |$ j. j |0 ƒ t j) j- |. | j& j | ƒ }1 t j | t d ƒ | ƒ }2 t j< j= | j& ƒ |  j |2 j <t j+ |1 |2 | ƒ }3 |$ j. j |3 ƒ t j> d t: j? | |& |) |2 g |  j@ |  j |  j
 ƒ }4 | jA | | ƒ |$ j. j/ |4 ƒ nfd | j0 k r"	| j0 d }* t1 j2 j2 |* ƒ }5 |  j@ jB |5 | j& ƒ sd }6 t3 |6 ƒ ‚ n  t j | t d ƒ | ƒ }7 |  j@ jC tD ƒ }8 |8 |  j |7 j <t j; d tD | ƒ }9 t j+ |9 |7 | ƒ }: |$ j. j |: ƒ |  j@ jE |8 t jF f d i  ƒ }; t j) jG d |7 d d$ d d% d | ƒ }< |; |  j
 |< <t j | t d ƒ | ƒ }= t jH |  j |= j <t j+ |< |= | ƒ }> |$ j. j |> ƒ t j4 | j& |* ƒ | ƒ }? t j | t d ƒ | ƒ }@ | j& |  j |@ j <t j+ |? |@ | ƒ }A |$ j. j |A ƒ t jI | tD d# d# ƒ |= |@ | ƒ }B |$ j. j |B ƒ tJ t jF |  j | j |  j |= j |  j | j j& ƒ }; |; |  j
 |B <n  |  jK | | | ƒ t j d k rY	d GHt j | ƒ n  t jL | |! | | ƒ }C tJ t jF |  j | j |  j |! j |  j | j j& ƒ |  j
 |C <| | j. j/ |  ƒ | | j. j |C ƒ t jM d d  ƒ }D t j | t d ƒ |D ƒ }E t j+ t j4 d d |D ƒ|E |D ƒ }A | | j. j |A ƒ | | j. j t jN |E |D ƒ ƒ t jO | ƒ } | t# | j$ ƒ  ƒ j. jP ƒ  t j d k r®
d! GHt j | ƒ n  d" | | g f }F t  j! jQ | |$ | | |! | |F |  jR ƒ }G |
 j |G ƒ |
 j t j+ | | | ƒ ƒ |
 S(&   s>    Converts a set of stencil kernel blocks to a parfor.
        i   RG   i    s#   stencil_blocks after copy_propagates'   stencil_blocks after removing dead codes   $parfor_index_vars-   stencil_blocks after replace stencil accessess   $parfor_exit_values   $parfor_index_tuple_vars.   stencil_blocks after creating parfor index vart   in_arr_shapet   shapet   zero_valt   cvals-   cval type does not match stencil return type.t   stencil_outputs	   $np_g_vart   nps   $np_attr_attrt   fulls	   $py_g_vart   slicei   R:   R$   R<   RD   s   $slice_insts   $cval_consts%   stencil_blocks after replacing returnt   stencilparfor_dummyiÿÿÿÿs#   stencil_blocks after adding SetItemR+   N(    (    (S   R.   R   t   DEBUG_ARRAY_OPTR   t   dump_blocksR   R(   t   copy_propagatet   get_name_var_tablet   apply_copy_propagateR   t   remove_deadR   t	   arg_namest   ndimRC   RD   R=   R   t   VarR   R   t   intpR2   t   _replace_stencil_accessesR   t   get_equiv_sett	   get_shapeR0   R`   t   _get_stencil_last_indt   _get_stencil_start_indR,   t   parfort   LoopNestt   maxt   keyst   Blockt   dtypet
   containerst   UniTupleR8   t   build_tupleR7   RF   t   getattrR6   t   extendRE   R	   t   typeofR@   RI   t   npytypest   Arrayt   layoutt   misct   ModuleRl   t   Globalt	   functionst   NumberClasst   gen_np_callRm   R   t   insert_equivt   can_convertt   resolve_value_typeRn   t   resolve_function_typet   noneR"   t   slice2_typet   StaticSetItemR   Rf   t   SetItemt   LocR^   t   simplify_CFGR_   t   ParforR   (H   R   RP   RS   RV   RX   R*   RH   t   return_typet   stencil_funcRZ   R[   t   stencil_blockst   in_arrt
   in_arr_typt   in_cpst   out_cpst   name_var_tablet   ndimsRC   RD   t   parfor_varsR&   t
   parfor_vart   start_lengthst   end_lengthst	   loopnestst	   equiv_sett   in_arr_dim_sizest   last_indt	   start_indRc   Rb   t   for_replacing_rett   parfor_ind_vart
   tuple_callt   tuple_assignt
   init_blockt
   shape_namet	   shape_vart   shape_getattrt	   zero_namet   zero_varRj   t   temp2t
   full_constt   so_namet   dtype_g_np_vart
   dtype_g_npt   dtype_g_np_assignt   dtype_np_attr_callt   dtype_attr_vart   dtype_attr_assignt   stmtst   cval_tyt   msgt	   slice_vart   slice_fn_tyt   slice_gt   slice_assignedt   sigt   callexprt   slice_inst_vart   slice_assignt   cval_const_valt   cval_const_vart   cval_const_assignt   setitemexprt   setitem_callt	   dummy_loct   ret_const_vart   patternR   (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRG   }   sf   	


			""							$c         C   s¾  | } | d k rºt  j | t d ƒ | ƒ } t j |  j | j <t | t j	 ƒ rv t  j
 t  j | | ƒ | | ƒ } n t  j
 | | | ƒ } | j | ƒ t  j | t d ƒ | ƒ } t j |  j | j <t  j | t d ƒ | ƒ }	 t j t ƒ }
 t j j |
 ƒ } | |  j |	 j <t  j d |
 | ƒ } t  j
 | |	 | ƒ } | j | ƒ t  j j |	 | | g d | ƒ } | j |  j t j t j g i  ƒ |  j | <t  j
 | | | ƒ } | j | ƒ n  | S(   Ni    t   stencil_const_varR¯   t   compute_last_ind_varR   (    (   R   Rx   R   R   Ry   R   R(   R1   t   numberst   NumberR7   RI   R2   R,   t   njitR   R‘   t
   DispatcherR   R8   R"   t   get_call_typeR   R   (   R   R   t
   end_lengthR[   RC   RD   R¯   R   t   const_assignt   g_vart
   check_funct   func_typt   g_objt   g_assignt
   index_callt   index_assign(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyR}   k  s2    	!%c   	      C   s»   t  | t ƒ r" t t | d ƒ ƒ Sd „  } t | i  |  j t j f |  j |  j	 ƒ } t
 | j ƒ d k sp t ‚ | j j ƒ  d } t | | g ƒ | | j d  7} | j d j j } | S(   Ni    c         S   s   t  t |  d ƒ ƒ S(   Ni    (   t   abst   min(   t   s_length(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyt   get_start_ind  s    i   iþÿÿÿ(   R1   t   intRç   Rè   R   R   R   Ry   R   R   R0   R.   R`   t   popitemR   R6   R#   (	   R   t   start_lengthR[   RC   RD   Rê   t   f_irRQ   t   ret_var(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyR~     s    	c          C   s  | j  } | d } g  | D] }	 |	 j ^ q }
 d | j k r˜ x0 | j d D]! }	 |	 | k rL t d ƒ ‚ qL qL Wg  | j d D] }	 | |	 ^ q } n g  } | j | k r¼ t d ƒ ‚ n  |  j | j j } | j } | j } | j d k } | r| d g } | d g } n@ g  | j D] }	 |	 d ^ q} g  | j D] }	 |	 d ^ q=} t
 j | ƒ } t } xî| j ƒ  D]à\ } } g  } xÂ| j D]·} t | t j ƒ råt | j t j ƒ rå| j j d k rå| j j j |
 k st | t j ƒ s	t | t j ƒ r*| j j |
 k r*t d ƒ ‚ n  t | t j ƒ r;t | j t j ƒ r;| j j d k r;| j j j |
 k r;| j j j | k r;| j j } | d k r±| g } n. t | d ƒ rß| j | k rß| | j } n  t
 j | ƒ | _ g  | D] } t | |  j | ƒ ^ qø} | rC|  j | t | ƒ | | | ƒ } n  | rÌt | t j  ƒ s„t! g  | D] } t | t" ƒ ^ qeƒ r“t d ƒ ‚ n  t t# t$ | | ƒ ƒ } t t# t% | | ƒ ƒ } t& } n  |  j | t | ƒ | | | ƒ } | d k r| d } nt t j  | t' d ƒ | ƒ } t( j) j* t( j+ | ƒ |  j | j <t j j, | | ƒ } t j | | | ƒ } | j- | ƒ t. g  | D] } |  j | j t( j+ k ^ q„ƒ rÈ|  j | j j j j/ } n |  j | j j j } t j j0 | j j | | ƒ } t1 | |  j | j j j |  j | j ƒ |  j2 | <| | _ n  | j- | ƒ q‘W| | _ quW| ru| rut d ƒ ‚ n  | | f S(   sÄ    Convert relative indexing in the stencil kernel to standard indexing
            by adding the loop index variables to the corresponding dimensions
            of the array index tuples.
        i    t   standard_indexings[   Standard indexing requested for an array name not present in the stencil kernel definition.sY   The first argument to a stencil kernel must use relative indexing, not standard indexing.i   t   setitemt   static_setitems?   Assignments to arrays passed to stencil kernels is not allowed.t   static_getitemt   getitemR(   s<   Variable stencil index only possible with known neighborhoods   $parfor_index_ind_vars=   Stencil kernel with no accesses to relatively indexed arrays.N(   Rñ   Rò   (   Ró   Rô   (3   R.   R(   RE   R@   R   Rw   RC   RD   t   neighborhoodRF   R   t   get_tuple_tablet   FalseR/   R6   R1   R   R7   R#   R8   R9   R›   Rš   RH   t   indext   hasattrt   build_definitionst   _definitionst   _get_const_index_exprR   t   _add_index_offsetsR4   Rx   t   anyRë   t   mapRè   R   t   TrueR   R   R…   R†   Ry   R‡   R2   t   allR„   Rô   R   R   (    R   RX   R¨   RS   R*   R    RZ   R¡   R¢   t   xt   in_arg_namest   standard_indexedR§   RC   RD   t   need_to_calc_kernelRª   R«   t   tuple_tablet   found_relative_indexRP   RQ   Rd   R'   t
   index_listt   vt
   index_varst   ind_varR³   R´   t   getitem_return_typt   getitem_call(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRz   ›  s¬    	
$		  %	)			,	c         C   s1  t  | ƒ t  | ƒ k s t ‚ t g  | | D] } t | t ƒ ^ q, ƒ r` t t t | | ƒ ƒ Sg  } g  } x±t t  | ƒ ƒ D]}	 | |	 }
 t |
 t ƒ rt	 j
 | t d ƒ | ƒ }
 t j |  j |
 j <t	 j t	 j | |	 | ƒ |
 | ƒ } | j | ƒ n  | |	 } t | t ƒ r}t	 j
 | t d ƒ | ƒ } t j |  j | j <t	 j t	 j | |	 | ƒ | | ƒ } | j | ƒ n  t |
 t ƒ s«t |  j |
 j t j j ƒ rø|  j | j t j k sÊt ‚ |  j |
 | | | | ƒ } | j | ƒ q n  t | t ƒ s&t |  j | j t j j ƒ rs|  j |
 j t j k sEt ‚ |  j | |
 | | | ƒ } | j | ƒ q n  t	 j
 | t d ƒ | ƒ } t j |  j | j <t	 j j t j |
 | | ƒ } |  j j t j t j t j f i  ƒ |  j | <t	 j | | | ƒ } | j | ƒ | j | ƒ q W| j | ƒ | S(   sw    Does the actual work of adding loop index variables to the
            relative index constants or variables.
        t   old_index_vart
   offset_vart   offset_stencil_index(   R0   R`   R  R1   Rë   R4   Rÿ   R    R=   R   Rx   R   R   Ry   R   R(   R7   RI   R2   Rn   RŽ   t	   SliceTypet   _add_offset_to_sliceR8   t   binopt   operatorR   R—   R   R‰   (   R   R  R*   Rd   RC   RD   R	  t	   out_nodesR
  R&   R  Rß   R  t	   index_varRå   Ræ   (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRý   (  sd    ,
	
			%c         C   s  t  | t ƒ r_ d j | j | j ƒ } i  } t | i  | ƒ | d } | g } t j f }	 n4 d „  } | | g } |  j | j	 }
 |
 t j f }	 |  j
 j j j } t | | |  j |	 |  j |  j ƒ } | j j ƒ  \ } } t | | ƒ | j d j j } | j | j d  ƒ | S(   NsR   def f(offset):
                return slice({} + offset, {} + offset)
            t   fc         S   s   t  |  j | |  j | ƒ S(   N(   Rn   t   startt   stop(   t	   old_slicet   offset(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyR  x  s    iþÿÿÿ(   R1   Rn   t   formatR  R  R   R   Ry   R   R(   R   t   func_idR:   t   __globals__R   R   R   R.   Rì   R   R6   R#   R‰   (   R   RÇ   R  R  RC   RD   t   f_textR  R$   t   arg_typst
   slice_typet   _globalsRî   RK   RQ   t	   new_index(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyR  l  s&    
		(   t   __name__t
   __module__R    R\   Rf   RG   R}   R~   Rz   Rý   R  (    (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyR       s   		;		î	"			Dc         C   s³  d d l  m } d d l m }	 d d l m }
 d d l m } |  j j	 ƒ  } t	 j
 | j ƒ } | | _ t j | j ƒ } d | k r— t d ƒ ‚ n  | | ƒ } |	 j | | ƒ µ t | | | | ƒ } t j j j d | | j ƒ | | j | j | j d ƒ \ | _ | _ | _ |
 j d	 | j d
 | j d | j d d d d d | j d | j d t j j ƒ Wd QXt j | t j  ƒ  ƒ } t! | j" ƒ  ƒ } t# | j" ƒ  ƒ } | t _$ t j% d k rÕd GHt j& | ƒ n  i  } xO | j j' ƒ  D]> \ } } t( j) | t* | ƒ | ƒ } | | | <| | | j+ <qëWt j, | | ƒ t j% d k rad GHt j& | ƒ n  x' | j j' ƒ  D] \ } } | | | <qqWi  } xÀ | j- ƒ  D]² } x© | j. D]ž } t/ | t( j0 ƒ r®t/ | j1 t( j2 ƒ r®t j% d k rd | | j1 j3 | j1 j+ | j1 j3 | k f GHn  | | j1 j3 j+ | | j1 j+ <| | j1 j3 | _1 q®q®WqžWt j% d k rƒd | f GHd GHt j& | ƒ n  t j4 | ƒ | | _ | |  j5 | ƒ d | f S(   s'   get typed IR from stencil bytecode
    iÿÿÿÿ(   t
   CPUContext(   t
   cpu_target(   t   type_annotations(   t   type_inference_stageR)   s6   Cannot use the reserved word 'out' in stencil kernels.s   before-inferenceR   R   R   t   liftedt   lifted_fromR$   RŸ   t   html_outputNi   s   Initial stencil_blockss   After replace_varsRR   RZ   s   After replace arg with arri    (    (6   t   numba.targets.cpuR&  t   numba.targets.registryR'  t   numba.annotationsR(  t   numba.compilerR)  t	   kernel_irt   copyt   deepcopyR.   R   Rs   R@   t   nested_contextt   DummyPipelineR,   t   rewritest   rewrite_registryt   applyR   R   R$   RF   R   RŸ   R   t   TypeAnnotationR   t   HTMLt   add_offset_to_labelst
   next_labelRè   R‚   R   t
   _max_labelRp   Rq   R/   R   Rx   R   R(   t   replace_varst   valuesR6   R1   R7   R#   t   ArgRø   t   remove_delst   get_return_type(   RW   R   R$   RC   RD   RR   R   R   R&  R'  R(  R)  t   stencil_func_irR¡   R¦   t	   targetctxt   tpt	   min_labelt	   max_labelt   var_dictR	  t   typt   new_varR"   t   call_typRZ   RQ   R'   (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRB   †  sz    	-								
' 	R5  c           B   s   e  Z d  „  Z RS(   c         C   sC   | |  _  | |  _ | |  _ | |  _ d  |  _ d  |  _ d  |  _ d  S(   N(   R   RD  R$   R   RF   R   RŸ   R   (   R   R   RD  R$   Rî   (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyR    Þ  s    						(   R$  R%  R    (    (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyR5  Ý  s   c         C   s)   t  t |  | | ƒ } | d k	 r% | S| S(   s²   
    infer index_var as constant if it is of a expression form like c-1 where c
    is a constant in the outer function.
    index_var is assumed to be inside stencil kernel
    N(   R   t   _get_const_index_expr_innerRF   (   RX   R   R  t	   const_val(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRü   è  s
    c         C   s¡   t  t | t j ƒ ƒ t t |  | | ƒ } | d k	 r; | St j |  | ƒ } t t	 |  | | ƒ } | d k	 rr | St t
 |  | | ƒ } | d k	 r— | St ‚ d S(   sW   inner constant inference function that calls constant, unary and binary
    cases.
    N(   R   R1   R   Rx   R   t   _get_const_two_irsRF   R   t   get_definitiont   _get_const_unary_exprt   _get_const_binary_exprR   (   RX   R   R  t	   var_constt	   index_def(    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRL  ô  s    c         C   sN   t  t |  | ƒ } | d k	 r" | St  t | | ƒ } | d k	 rD | St ‚ d S(   sW   get constant in either of two IRs if available
    otherwise, throw GuardException
    N(   R   R   RF   R   (   t   ir1t   ir2t   varRR  (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRN    s    c         C   sc   t  t | t j ƒ o! | j d k ƒ | j } t |  | | ƒ } t | j } t	 d j
 | | ƒ ƒ S(   sQ   evaluate constant unary expr if possible
    otherwise, raise GuardException
    t   unarys   {}{}(   R   R1   R   R8   R9   R#   RL  R   t   fnt   evalR  (   RX   R   RS  t	   inner_varRM  R9   (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRP    s
    %	c         C   su   t  t | t j ƒ o! | j d k ƒ t |  | | j ƒ } t |  | | j ƒ } t | j	 } t
 d j | | | ƒ ƒ S(   sR   evaluate constant binary expr if possible
    otherwise, raise GuardException
    R  s   {}{}{}(   R   R1   R   R8   R9   RL  t   lhst   rhsR   RX  RY  R  (   RX   R   RS  t   arg1t   arg2R9   (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyRQ  "  s
    %(+   RÙ   R2  R   t   pytypesR  R    t   numpyRl   R,   t   numba.typing.templatesR   R   t   numba.typingR   R   R   R   R   R	   t   numba.ir_utilsR
   R   R   R   R   R   R   R   R   t	   numba.sixR   t   numba.utilsR   R   t   objectR   RB   R5  Rü   RL  RN  RP  RQ  (    (    (    s2   lib/python2.7/site-packages/numba/stencilparfor.pyt   <module>   s0   (@	ÿ ÿ h	W				