ó
\K]c           @   sX  d  d l  Z  d  d l Z d  d l m Z d  d l m Z m Z m	 Z	 m Z m
 Z
 m Z m Z d  d l m Z d  d l m Z m Z m Z m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z d  d l Z d  d l Z d
 e f d „  ƒ  YZ e d „  ƒ Z d „  Z d e f d „  ƒ  YZ  d d „ Z! d „  Z" e e! ƒ d „  ƒ Z# d S(   iÿÿÿÿN(   t   ir(   t   compilert   typest   ir_utilsR    t   typingt   numpy_supportt   utils(   t   config(   t   CallableTemplatet	   signaturet   infer_globalt   AbstractTemplate(   t   registry(   t   lower_builtin(   t   register_jitable(   t   exec_t   StencilFuncLowererc           B   s    e  Z d  Z d „  Z d „  Z RS(   sM   Callable class responsible for lowering calls to a specific StencilFunc.
    c         C   s   | |  _  d  S(   N(   t   stencilFunc(   t   selft   sf(    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   __init__   s    c         C   sS   |  j  j | j i  | j d  ƒ } | j | | j | | ƒ } | j | j g ƒ | S(   N(	   R   t   compile_for_argtyst   argst   return_typet   Nonet   call_internalt   fndesct   add_linking_libst   library(   R   t   contextt   buildert   sigR   t   crest   res(    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   __call__   s
    (   t   __name__t
   __module__t   __doc__R   R"   (    (    (    s,   lib/python2.7/site-packages/numba/stencil.pyR      s   	c         G   sˆ   |  j  } xx | D]p } |  j | j k r7 t d ƒ ‚ n  | j  } x= t t | ƒ ƒ D]) } | | | | k rS t d ƒ ‚ qS qS Wq Wd  S(   Ns\   Secondary stencil array does not have same number  of dimensions as the first stencil input.sa   Secondary stencil array has some dimension smaller the same dimension in the first stencil input.(   t   shapet   ndimt
   ValueErrort   ranget   len(   t   aR   t   ashapet   argt   argshapet   i(    (    s,   lib/python2.7/site-packages/numba/stencil.pyt!   raise_if_incompatible_array_sizes$   s    		c         C   s   t  |  j | |  j | ƒ S(   s_    Called by stencil in Python mode to add the loop index to a
        user-specified slice.
    (   t   slicet   startt   stop(   t	   the_slicet   addend(    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   slice_addition2   s    t   StencilFuncc           B   sn   e  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 RS(   s@   
    A special type to hold stencil information for the IR.
    i    c         C   sÄ   t  |  ƒ j |  _ t  |  ƒ j d 7_ | |  _ | |  _ | |  _ g  |  _ t j j	 |  _
 t j j |  _ |  j
 j ƒ  |  j j ƒ  |  j |  j
 ƒ |  j j d ƒ |  _ i  |  _ t |  ƒ |  _ d  S(   Ni   t   neighborhood(   t   typet
   id_countert   idt	   kernel_irt   modet   optionst   kwsR   t
   cpu_targett   typing_contextt
   _typingctxt   target_contextt
   _targetctxt   refresht   _install_typet   getR8   t   _type_cacheR   t	   _lower_me(   R   R<   R=   R>   (    (    s,   lib/python2.7/site-packages/numba/stencil.pyR   ?   s    					c         C   s»  g  } x®| j  ƒ  D] \ } } | j } | j } g  }	 xp| j D]e}
 t |
 t j ƒ r™| j | ƒ t | ƒ d k rË t j	 | | | ƒ } t j	 | | d | ƒ } |	 j t j
 | | |
 j | ƒ ƒ q¦g  } x0 | D]( } t j	 | | | ƒ } | | g 7} qØ Wt j d ƒ } t j	 | | | ƒ } t j j | | ƒ } |	 j t j | | | ƒ ƒ t j	 | | | ƒ } t j
 | | |
 j | ƒ } |	 j | ƒ qA |	 j |
 ƒ qA W|	 | _ q W| 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.
        i   i    t   stencil_index(   t   itemst   scopet   loct   bodyt
   isinstanceR    t   Returnt   appendR*   t   Vart   SetItemt   valueR   t   mk_unique_vart   Exprt   build_tuplet   Assign(   R   t   blockst
   index_varst   out_namet
   ret_blockst   labelt   blockRL   RM   t   new_bodyt   stmtt   rvart   ivart   var_index_varst   one_vart	   index_vart   s_index_namet   s_index_vart
   tuple_callt   si(    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   replace_return_with_setitemQ   s4    		%c   .      C   së	  i  } g  }	 t  j d k r< d | | f GHt j | j ƒ n  | d k rQ t }
 n7 t }
 t | ƒ | k rˆ t	 d t | ƒ | f ƒ ‚ n  t j
 | j ƒ } t ƒ  } x}| j j ƒ  D]l} | j } | j } g  } xB| j D]7} t | t j ƒ rMt | j t j ƒ rMt  j d k r4d | j j | j j f GHn  | j j | | j j <n  t | t j ƒ ržt | j t j ƒ rž| j j d k rž| j j j | j k sÅt | t j ƒ rÔ| j j | j k rÔt	 d ƒ ‚ n  t | t j ƒ rt | j t j ƒ r| j j d k r| j j j | j k r| j j j | k r| j j d k r[| j j } n | j j } | j | j j j ƒ |
 rót | d
 ƒ s˜t ‚ | j | k r¾|	 | | j g 7}	 qó| j | k rä|	 | | j g 7}	 qót	 d ƒ ‚ n  | d k rët j  | | d | ƒ } t j! d ƒ } t j  | | | ƒ } | | j } t | t" j# j$ ƒ rwt j  | t j! d ƒ | ƒ } t% j& t' ƒ } t" j( j) | ƒ } | | | j <t j* d | | ƒ } | j+ t j | | | ƒ ƒ t j j, | | | g d | ƒ } | j- |  j. | t" j/ g i  ƒ | | <| j+ t j | | | ƒ ƒ | j+ t j t j j0 | j j | | ƒ | j | ƒ ƒ qt j j1 t2 j | | | ƒ } | j+ t j | | | ƒ ƒ | j+ t j t j j0 | j j | | ƒ | j | ƒ ƒ qg  } g  } t j! d ƒ } t j  | | | ƒ }  g  }! g  }" | | j } xct3 | ƒ D]U}# t j! d ƒ } t j  | | | ƒ } | j+ t j t j |# | ƒ | | ƒ ƒ |! | g 7}! t j  | | |# | ƒ } | | g 7} t j! d ƒ } t j  | | | ƒ } |" | g 7}" t j! d ƒ }$ t j  | |$ | ƒ }% t j j0 | |! |# | ƒ }& | j+ t j |& |% | ƒ ƒ | |# }' t |' t" j# j$ ƒ rXt j  | t j! d ƒ | ƒ } t% j& t' ƒ } t" j( j) | ƒ } | | | j <t j* d | | ƒ } | j+ t j | | | ƒ ƒ t j j, | |% | |# g d | ƒ } | j- |  j. |' t" j/ g i  ƒ | | <| j+ t j | | | ƒ ƒ qAt j j1 t2 j |% | |# | ƒ } | j+ t j | | | ƒ ƒ qAWt j j4 |" | ƒ }( | j+ t j |( |  | ƒ ƒ | j+ t j t j j0 | j j |  | ƒ | j | ƒ ƒ qÛ | j+ | ƒ qÛ W| | _ q³ W|
 rá	g  t3 | ƒ D] }) d d g ^ q6} t |	 ƒ d k rot	 d ƒ ‚ n  xo|	 D]d}* t |* t5 ƒ sšt |* t6 ƒ r]	x± t3 t |* ƒ ƒ D] }+ |* |+ }, t |, t j  ƒ rî|, j | k rî| |, j }, n  t |, t7 ƒ r>	t8 | |+ d |, ƒ | |+ d <t9 | |+ d |, ƒ | |+ d <q­t	 d ƒ ‚ q­Wt |* ƒ }- nb t |* t7 ƒ r³	t8 | d d |* ƒ | d d <t9 | d d |* ƒ | d d <d }- n t	 d ƒ ‚ |- | k rvt	 d ƒ ‚ qvqvWn  | | f S(   sß   
        Transforms the stencil kernel as specified by the user into one
        that includes each dimension's index variable as part of the getitem
        calls.  So, in effect array[-1] becomes array[index0-1].
        i   t   add_indices_to_kernelsD   %d dimensional neighborhood specified for %d dimensional input arrays   remembering in const_dictt   setitemt   static_setitems?   Assignments to arrays passed to stencil kernels is not allowed.t   getitemt   static_getitemt   namesD   stencil kernel index is not constant, 'neighborhood' option requiredi    RJ   R6   t   const_indext   ind_stencil_indexs=   Stencil kernel with no accesses to relatively indexed arrays.sC   stencil kernel index is not constant,'neighborhood' option requireds/   Non-tuple or non-integer used as stencil index.s2   Stencil index does not match array dimensionality.N(   Rl   Rm   (   Rn   Ro   (    (    (:   R   t   DEBUG_ARRAY_OPTR   t   dump_blocksRY   R   t   Truet   FalseR*   R(   t   get_tuple_tablet   sett   valuesRL   RM   RN   RO   R    RX   RT   t   Constt   targetRp   RV   t   opt	   arg_namesRS   t   indexRe   t   addt   hasattrt   AssertionErrorRR   RU   R   t   misct	   SliceTypet   numbat   njitR6   t	   functionst
   Dispatchert   GlobalRQ   t   callt   get_call_typeRB   t   intpRn   t   binopt   operatorR)   RW   t   tuplet   listt   intt   mint   max(.   R   t   kernelt   index_namesR'   R8   t   standard_indexedt   typemapt	   calltypest
   const_dictt   kernel_constst   need_to_calc_kernelt   tuple_tablet   relatively_indexedR^   RL   RM   R_   R`   t   stmt_index_varRe   t   tmpnamet   tmpvart   stmt_index_var_typt   sa_vart   sa_funct   sa_func_typt   g_sat   slice_addition_callt   acc_callRZ   t   sum_resultsRf   Rg   t   const_index_varst   ind_stencilst   dimt   getitemnamet
   getitemvart   getitemcallt   one_index_typRh   t   _R~   R/   t   tet	   index_len(    (    s,   lib/python2.7/site-packages/numba/stencil.pyRk   |   s   				!%
%% %
!"		c         C   sÙ   t  j d k r0 d | f GHt j |  j j ƒ n  t | d t j j	 ƒ sX t
 d ƒ ‚ n  t j |  j |  j | d  i  ƒ \ } } } t | t j j	 ƒ r¦ t
 d ƒ ‚ n  t j j	 | | d j | d j ƒ } | | | f S(   Ni   t   get_return_typei    sG   The first argument to a stencil kernel must be the primary input array.s:   Stencil kernel must return a scalar and not a numpy array.(   R   Rs   R   Rt   R<   RY   RO   R   t   npytypest   ArrayR(   R   t   type_inference_stageRB   R   R'   t   layout(   R   t   argtysR–   R   R—   t   real_ret(    (    s,   lib/python2.7/site-packages/numba/stencil.pyR²   F  s"    c         C   sH   t  d t |  j ƒ t f t d |  d |  j ƒ ƒ } | j |  | ƒ d S(   sm   Constructs and installs a typing class for a StencilFunc object in
        the input typing context.
        t   StencilFuncTyping_t   keyt   genericN(   R9   t   strR;   R   t   dictt   _type_met   insert_user_function(   R   t	   typingctxt   _ty_cls(    (    s,   lib/python2.7/site-packages/numba/stencil.pyRF   ]  s
    c   
      C   s;   |  j  | \ } } } } |  j | | | | | | Œ }	 |	 S(   N(   RH   t   _stencil_wrapper(
   R   R·   t   kwtysR   t   sigretR¯   t   resultR–   R—   t   new_func(    (    s,   lib/python2.7/site-packages/numba/stencil.pyR   g  s    c         C   s®  |  j  d k	 rT t |  j  ƒ | d j k rT t d t |  j  ƒ | d j f ƒ ‚ n  | } d } d } d | k rš | | d f 7} | d 7} | d } n  d | k rÄ | | d f 7} | d 7} n  | |  j k rð |  j | \ } } } } | S|  j | ƒ \ } }	 }
 t | | Œ } d j d	 j	 |  j
 j ƒ | ƒ } t | ƒ t ƒ  k t ƒ  f t d
 ƒ } t j | ƒ | _ |  j j |  j |  | f g ƒ | | |	 |
 f |  j | <| S(   s¡   
        Implement AbstractTemplate.generic() for the typing class
        built by StencilFunc._install_type().
        Return the call-site signature.
        i    sD   %d dimensional neighborhood specified for %d dimensional input arrayt    t   outs
   , out=NoneR8   s   , neighborhood=Nones*   def __numba_dummy_stencil({}{}):
    pass
t   ,t   __numba_dummy_stencilN(   R8   R   R*   R'   R(   RH   R²   R	   t   formatt   joinR<   R}   R   t   globalst   localst   evalR   t   pysignaturet   pysigRD   t   insert_func_defnRI   (   R   R·   RÃ   t   argtys_extrat	   sig_extraRÅ   t   _sigR¯   R¸   R–   R—   R   t
   dummy_textt
   dummy_func(    (    s,   lib/python2.7/site-packages/numba/stencil.pyR¾   n  s6    #
c   
      C   sÈ   i  } | j  ƒ  } i  | _ x  | j j ƒ  D] \ } } t  j | j | ƒ } g  | _ xT | j | j D]B } t  j | ƒ }	 | j j |	 ƒ | | k rg | | | |	 <qg qg W| | j | <q+ W| | f S(   s  
        Create a copy of a given IR along with its calltype information.
        We need a copy of the calltypes because copy propagation applied
        to the copied IR will change the calltypes and make subsequent
        uses of the original IR invalid.
        (   t   copyRY   RK   t   deepcopyRN   RQ   (
   R   R    R—   t   copy_calltypest   kernel_copyt   block_labelR^   t	   new_blockR`   t   scopy(    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   copy_ir_with_calltypes–  s    		c   ?   	   G   s
  |  j  |  j | ƒ \ } } t j | j ƒ | j d }	 t j | j | ƒ \ }
 } t j | j ƒ } t j | j |
 | | | ƒ d | k rœ t	 d ƒ ‚ n  t j
 d | ƒ } t j d k rÎ d | | f GHn  | d } t j d k rd | | j t | j ƒ | f GHt j | j ƒ n  d t t | ƒ ƒ j d	 d
 ƒ |  j f } g  } x@ t | j ƒ D]/ } t j
 d t | ƒ | ƒ } | | g 7} q[Wt j
 d | ƒ } t j
 d | ƒ } d } | d  k	 rÚ| d j | ƒ 7} n  d t |  j ƒ k r| d j | ƒ 7} n  |  j j d g  ƒ } |	 | k r5t	 d ƒ ‚ n  t t | ƒ t | j ƒ ƒ d k rit	 d ƒ ‚ n  |  j | | | j |  j | | | ƒ \ } } |  j d  k r±| |  _ n  t j d k rØd GHt j | j ƒ n  |  j  | j | | ƒ } t j d k rd | f GHt j | j ƒ n  d j | d j! | j ƒ | ƒ } g  } x„ t | j ƒ D]s } t" | | d t# ƒ r| | d } | | d } n$ d j | | ƒ } d j | | ƒ } | j$ | | f ƒ qTWt | ƒ d k r&| d |	 7} x+ | D]# } | |	 k rò| d | 7} qòqòW| d 7} n  t j
 d | ƒ } | d j | |	 ƒ 7} | d  k rùt% j& | j ƒ j j' }  d |  j k rÓ|  j d }! | j t( j) j) |! ƒ k r¸t	 d ƒ ‚ n  d j | | |! |  ƒ }" n d j | | |  ƒ }" | d  |" 7} n~ d |  j k rw|  j d }! t( j) j) |! ƒ }# |  j* j+ |# | j ƒ sTd }$ t	 |$ ƒ ‚ n  d! j | |! ƒ }" | d  |" 7} n  d }% xu t | j ƒ D]d } x t |% ƒ D] }& | d  7} q W| d" j | | | | d | | | | d ƒ 7} |% d 7}% qWx t |% ƒ D] }& | d  7} qW| d# j | ƒ 7} | d$ j | ƒ 7} t j d k rXd% GH| GHn  t, | ƒ t- ƒ  k t. ƒ  f t/ | ƒ }' | d  k	 r§t0 j1 |' ƒ }( |( | _2 n  t3 j4 |' ƒ }) t j5 |) j ƒ t j |) j ƒ }* i  }+ | | | | g | j | }, x< |* j6 ƒ  D]. \ }- }. |- |, k rt j7 |- ƒ |+ |- <qqWt j8 |) j |+ ƒ t9 |) j j: ƒ  ƒ d }/ t j; | j |/ ƒ | _ t9 | j j: ƒ  ƒ d }0 g  | D] }1 |1 |/ ^ qž} t j d k rþd& | |/ f GHd' GHt j |) j ƒ d( GHt j | j ƒ n  xW|) j j6 ƒ  D]F\ }2 }3 x6t< |3 j= ƒ D]"\ } }4 t" |4 t> j? ƒ r*|4 j@ jA | k r*|4 jB }5 |3 jC }6 t> jD |6 |5 ƒ }7 |3 j= |  |7 _= |3 j= | d |3 _= tE | j j: ƒ  ƒ }8 |7 j$ t> jF |8 |5 ƒ ƒ x* | j j6 ƒ  D] \ }9 }: |: |) j |9 <qàW|3 |) j |0 <|7 |) j |2 <x. | D]& }; |) j |; j$ t> jF |0 |5 ƒ ƒ q	WPq*q*WqPqWt jG |) j ƒ |) _ t j5 |) j ƒ t" | tH jI ƒ s•	tJ ‚ | }< tK |< ƒ }= t j d k rÔ	d) |= f GHt j |) j ƒ n  t3 jL |  j* |  jM |) |= d  t3 jN i  ƒ }> |> S(*   Ni    RÈ   s6   Cannot use the reserved word 'out' in stencil kernels.t   __sentinel__i   t   name_var_tableRÂ   s   __numba_stencil_%s_%st   -R¯   R~   R8   RÇ   s	   , {}=Nonet   standard_indexingsY   The first argument to a stencil kernel must use relative indexing, not standard indexing.s[   Standard indexing requested for an array name not present in the stencil kernel definition.s   After add_indices_to_kernels!   After replace_return_with_setitems   def {}({}{}):
RÉ   s	   {}[{}][0]s	   {}[{}][1]s&       raise_if_incompatible_array_sizes(s   )
t
   full_shapes       {} = {}.shape
t   cvals-   cval type does not match stencil return type.s"   {} = np.full({}, {}, dtype=np.{})
s   {} = np.zeros({}, dtype=np.{})
s       s   {}[:] = {}
s.   for {} in range(-min(0,{}),{}[{}]-max(0,{})):
s   {} = 0
s       return {}
s   new stencil func texts   ret_blocks w/ offsetss"   before replace sentinel stencil_irs#   before replace sentinel kernel_copyt   new_stencil_param_types(O   Rß   R<   R   t   remove_argsRY   R}   t   copy_propagatet   get_name_var_tablet   apply_copy_propagateR(   t   get_unused_var_nameR   Rs   t   dtypeR9   Rt   t   hexR;   t   replaceR)   R'   R¼   R   RË   R½   R?   R>   RG   R*   Rx   Rk   R8   Rj   RÌ   RO   R   RQ   R   t   as_dtypeR#   R   t   typeofRB   t   can_convertR   RÍ   RÎ   RÏ   R   RÐ   RÑ   R   t   run_frontendt   remove_delsRK   RU   t   replace_var_namesR’   t   keyst   add_offset_to_labelst	   enumerateRN   R    RX   R{   Rp   RM   RL   t   BlockR‘   t   Jumpt   rename_labelsR   t   TypeR   R   t
   compile_irRD   t   DEFAULT_FLAGS(?   R   RÅ   RÄ   R   R–   R—   R   RÛ   RÚ   t	   first_argt   in_cpst   out_cpsRá   t   sentinel_namet	   the_arrayt   stencil_func_nameRZ   R/   t   index_var_nameR[   t   neighborhood_nameRÔ   R•   t   kernel_sizeRœ   R\   t	   func_textt   rangest   lot   hit   other_arrayt
   shape_namet   return_type_nameRå   t   out_initt   cval_tyt   msgt   offsett   jt   stencil_funcRÑ   t
   stencil_irt	   var_tablet   new_var_dictt   reserved_namesRp   t   vart   stencil_stub_last_labelt	   new_labelt   xR]   R^   t   instRM   RL   t
   prev_blockt   body_first_labelt   lt   bt	   ret_blockt   array_typesRæ   RÆ   (    (    s,   lib/python2.7/site-packages/numba/stencil.pyRÂ   ±  s`   
			%	
				c         O   sÉ  |  j  d  k	 rV t |  j  ƒ | d j k rV t d j t |  j  ƒ | d j ƒ ƒ ‚ n  d | k r| d } | j } t j | ƒ } t	 j
 j | | j t j | ƒ ƒ } t g  | D] } t j j | ƒ ^ q² ƒ } t g  | D] } t j j | ƒ ^ qÝ | g ƒ }	 n7 d  } t g  | D] } t j j | ƒ ^ qƒ } | }	 t j d k rbd | | | f GHn  |  j | ƒ \ }
 } } |  j | d  |
 | | |	 Œ } | d  k r±| j | Œ  S| j | | f Œ  Sd  S(   Ni    sD   {} dimensional neighborhood specified for {} dimensional input arrayRÈ   i   R"   (   R8   R   R*   R'   R(   RË   Rì   R   t
   from_dtypeR   R³   R´   t
   map_layoutRŽ   R   Rð   R   Rs   R²   RÂ   t   entry_point(   R   R   t   kwargsRÅ   t   rdtypet   rttypet   result_typeR  R"  t   array_types_fullR¸   R–   R—   RÆ   (    (    s,   lib/python2.7/site-packages/numba/stencil.pyR"   ß  s0    	"
	+%+(   R#   R$   R%   R:   R   Rj   Rk   R²   RF   R   R¾   Rß   RÂ   R"   (    (    (    s,   lib/python2.7/site-packages/numba/stencil.pyR7   8   s   		+	Ê		
		(		ÿ /t   constantc         K   sƒ   t  |  t ƒ s d } |  } n |  } d  } x- | D]% } | d k r1 t d | ƒ ‚ q1 q1 Wt | | ƒ } | d  k	 r | | ƒ S| S(   NR+  Rå   Rã   R8   s   Unknown stencil option (   Rå   Rã   R8   (   RO   R¼   R   R(   t   _stencil(   t   func_or_modeR>   R=   t   funct   optiont   wrapper(    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   stencil   s    	
c            s5   ˆ  d k r t  d ˆ  ƒ ‚ n  ‡  ‡ f d †  } | S(   NR+  s   Unsupported mode style c            s   t  j |  ƒ } t | ˆ  ˆ ƒ S(   N(   R   Rò   R7   (   R.  R<   (   R=   R>   (    s,   lib/python2.7/site-packages/numba/stencil.pyt	   decorated  s    (   R(   (   R=   R>   R2  (    (   R=   R>   s,   lib/python2.7/site-packages/numba/stencil.pyR,    s    c         C   s   t  j t  j t j j ƒ d ƒ S(   s    lowering for dummy stencil callsi    (   t   lirt   Constantt   IntTypeR   R‹   t   bitwidth(   R   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   stencil_dummy_lower  s    ($   RØ   t   numpyt   npt   llvmliteR    R3  R„   R   R   R   R   R   R   R   t   numba.typing.templatesR   R	   R
   R   t   numba.targetsR   t   numba.targets.imputilsR   t   numba.extendingR   t	   numba.sixR   R   t   objectR   R0   R6   R7   R1  R,  R7  (    (    (    s,   lib/python2.7/site-packages/numba/stencil.pyt   <module>   s(   4"	ÿ ÿ Ê	
