
    J/Ph՛                     4   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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 d	lmZ  G d
 de          Zed             Z d Z! G d de          Z"ddZ#d Z$ ee#          d             Z%dS )    N)ir)typestypingutilsr   configir_utilsregistry)CallableTemplate	signatureinfer_globalAbstractTemplate)lower_builtin)register_jitableNumbaValueError)literal_unroll)numpy_supportc                       e Zd ZdZd Zd ZdS )StencilFuncLowererzMCallable class responsible for lowering calls to a specific StencilFunc.
    c                     || _         d S N)stencilFunc)selfsfs     V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/stencils/stencil.py__init__zStencilFuncLowerer.__init__   s        c                     | j                             |j        i |j        d           }|                    ||j        ||          }|                    |j        g           |S r   )r   compile_for_argtysargsreturn_typecall_internalfndescadd_linking_libslibrary)r   contextbuildersigr    cresress          r   __call__zStencilFuncLowerer.__call__   s_    2238ROT+ +##GT[#tDD  $,000
r   N)__name__
__module____qualname____doc__r   r+    r   r   r   r      s<               r   r   c                    | j         }t          |          D ]h}| j        |j        k    rt          d          |j         }t	          t          |                    D ]#}||         ||         k    rt          d          $id S )Nz\Secondary stencil array does not have same number  of dimensions as the first stencil input.zaSecondary stencil array has some dimension smaller the same dimension in the first stencil input.)shaper   ndim
ValueErrorrangelen)ar    ashapeargargshapeis         r   !raise_if_incompatible_array_sizesr<   $   s    WF d## 	3 	36SX J K K K9s6{{## 	3 	3Aay8A;&&  "2 3 3 3 '	3	3 	3r   c                 B    t          | j        |z   | j        |z             S )z_ Called by stencil in Python mode to add the loop index to a
        user-specified slice.
    )slicestartstop)	the_sliceaddends     r   slice_additionrC   ;   s"     6)9>F+BCCCr   c                   R    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d ZdS )StencilFuncz@
    A special type to hold stencil information for the IR.
    r   c                    t          |           j        | _        t          |           xj        dz  c_        || _        || _        || _        g | _        t          j        j	        | _
        t          j        j        | _        |                     | j
                   | j                            d          | _        i | _        t#          |           | _        d S )N   neighborhood)type
id_counterid	kernel_irmodeoptionskwsr	   
cpu_targettyping_context
_typingctxtarget_context
_targetctx_install_typegetrH   _type_cacher   	_lower_me)r   rL   rM   rN   s       r   r   zStencilFunc.__init__H   s    t**'T

""	 #-<"-<4?+++ L,,^<<+D11r   c           
         g }|                                 D ]\  }}|j        }|j        }g }	|j        D ]}
t	          |
t
          j                  rU|                    |           t          |          dk    rbt          j	        |||          }t          j	        ||d         |          }|	                    t          j
        |||
j        |                     g }|D ]}t          j	        |||          }||gz  }|                    d|          }t
          j                            ||          }|	                    t          j        |||                     t          j	        |||          }t          j
        |||
j        |          }|	                    |           s|	                    |
           |	|_        |S )z
        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.
        rG   r   stencil_index)itemsscopelocbody
isinstancer   Returnappendr6   VarSetItemvalueredefineExprbuild_tupleAssign)r   blocks
index_varsout_name
ret_blockslabelblockr\   r]   new_bodystmtrvarivarvar_index_varsone_var	index_vars_index_var
tuple_callsis                      r   replace_return_with_setitemz'StencilFunc.replace_return_with_setitemX   s    
"LLNN 	" 	"LE5KE)CH
 * *dBI.. *%%e,,,:!++!veXs;;!veZ]C@@ 
4tz3(O(OPPPP *,'1 : :G(*ugs(C(CI*yk9NN&+nn_c&J&J%'W%8%8%M%M
 	*k3(O(OPPP!veXs;;  Zk4:sKK ++++OOD))))!EJJr   c                 8   i }g }	t           j        dk    r*t          d||           t          j        |j                   |d}
n6d}
t          |          |k    r!t          dt          |          |fz            t          j        |j                  }t                      }|j        
                                D ]}|j        }|j        }g }|j        D ]o}t          |t          j                  rmt          |j        t          j                  rNt           j        dk    r%t          d|j        j        |j        j                   |j        j        ||j        j        <   t          |t          j                  rEt          |j        t          j                  r&|j        j        dv r|j        j        j        |j        v s-t          |t          j                  r"|j        j        |j        v rt          d	          t          |t          j                  rt          |j        t          j                  r|j        j        d
v r|j        j        j        |j        v r|j        j        j        |vr|j        j        dk    r|j        j        }n|j        j        }|                    |j        j        j                   |
rWt9          |d          sJ |j        |v r|	||j                 gz  }	n*|j        |v r|	||j                 gz  }	nt          d          |dk    rut          j        ||d         |          }|                    d|          }||j                 }t          |t>          j         j!                  rh|                    d|          }tE          j#        tH                    }t>          j%        &                    |          }|||j        <   t          j'        d||          }|(                    t          j        |||                     t          j        )                    |||gd|          }|*                    | j+        |t>          j,        gi           ||<   |(                    t          j        |||                     |(                    t          j        t          j        -                    |j        j        ||          |j        |                     t          j        .                    t^          j        |||          }|(                    t          j        |||                     |(                    t          j        t          j        -                    |j        j        ||          |j        |                     g }g }|                    d|          }g }g } ||j                 }ta          |          D ]}!|                    d|          }|(                    t          j        t          j        |!|          ||                     ||gz  }t          j        |||!         |          }||gz  }|                    d|          }| |gz  } |                    d|          }"t          j        -                    |||!         |          }#|(                    t          j        |#|"|                     t          |t>          j1                  r	||!         }$n
|dd         }$t          |$t>          j         j!                  r|                    d|          }tE          j#        tH                    }t>          j%        &                    |          }|||j        <   t          j'        d||          }|(                    t          j        |||                     t          j        )                    ||"||!         gd|          }|*                    | j+        |$t>          j,        gi           ||<   |(                    t          j        |||                     ct          j        .                    t^          j        |"||!         |          }|(                    t          j        |||                     t          j        2                    | |          }%|(                    t          j        |%||                     |(                    t          j        t          j        -                    |j        j        ||          |j        |                     Z|(                    |           q||_        |
rd ta          |          D             }t          |	          dk    rt          d          |	D ]}&t          |&tf                    st          |&th                    rta          t          |&                    D ]}'|&|'         }(t          |(t          j                  r|(j        |v r||(j                 }(t          |(tj                    rKtm          ||'         d         |(          ||'         d<   to          ||'         d         |(          ||'         d<   t          d          t          |&          })nqt          |&tj                    rMtm          |d         d         |&          |d         d<   to          |d         d         |&          |d         d<   d})nt          d          |)|k    rt          d          ||fS )z
        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].
        rG   add_indices_to_kernelNTFD%d dimensional neighborhood specified for %d dimensional input arrayzremembering in const_dict)setitemstatic_setitemz?Assignments to arrays passed to stencil kernels is not allowed.)getitemstatic_getitemr   namezDstencil kernel index is not constant, 'neighborhood' option requiredr   rZ   rC   r0   const_indexind_stencil_indexc                     g | ]}d d gS )r   r0   ).0_s     r   
<listcomp>z5StencilFunc.add_indices_to_kernel.<locals>.<listcomp>*  s    777aQqE777r   z=Stencil kernel with no accesses to relatively indexed arrays.zCstencil kernel index is not constant,'neighborhood' option requiredz/Non-tuple or non-integer used as stencil index.z2Stencil index does not match array dimensionality.)8r   DEBUG_ARRAY_OPTprintr   dump_blocksri   r6   r   get_tuple_tablesetvaluesr\   r]   r^   r_   r   rh   rd   Consttargetr   rf   op	arg_namesrc   indexru   addhasattrrb   re   r   misc	SliceTypenumbanjitrC   	functions
DispatcherGlobalra   callget_call_typerR   intpr   binopoperatorr5   
ConstSizedrg   tuplelistintminmax)*r   kernelindex_namesr3   rH   standard_indexedtypemap	calltypes
const_dictkernel_constsneed_to_calc_kerneltuple_tablerelatively_indexedrn   r\   r]   ro   rp   stmt_index_varru   tmpvarstmt_index_var_typsa_varsa_funcsa_func_typg_saslice_addition_callacc_callrj   sum_resultsrv   const_index_varsind_stencilsdim
getitemvargetitemcallone_index_typrw   r   r;   te	index_lens*                                             r   r{   z!StencilFunc.add_indices_to_kernel   s
    
!Q&&)4>>> ///"&"'<  D((% 'G'*<'8'8$&?'@ A A A .v}== UU]))++ H	" H	"EKE)CH
 C* C*tRY// Dtz2844D-2294;;K"j.0 0 0 48:3CJt{/0bi00 M&tz27;;M JM-JJJ J,1V5EEEtRZ00 F K,0@@@) +L M M MtRY// s*&tz27;;s* JM-JJJ J,1V5EEE J,19IIIz}	11)-)9)-)= '**4:+;+@AAA + 	L&~v>>>>>).+==)k.:M.N-OOMM+0J>>)j9L.M-NNMM"1 3K #L #L L qyy
 %'F5+a.#$F$F	!&!E!E-4^5H-I* &&8%*:NOO >%*^^4Dc%J%JF&+j&@&@G*//*D*DW*M*MK3>GFK0#%9-=w#L#LD$OOBIdFC,H,HIII24',,vXaGbdfhk2l2l/=H=V=VW[Wfi{  ~C  ~H  iI  KM  >N  >NI&9:$OOBI6I6SV,W,WXXX$OOBI+-7??4:;KVUX+Y+Y+/;-= -= > > > > (*w}}X\>5>(E (EH$OOBIh,L,LMMM$OOBI+-7??4:;KVUX+Y+Y+/;-= -= > > > > &(
&(&+nn_c&J&J+-(')-4^5H-I* $);; #R #RC%*^^M3%G%GF$OOBIbhsC6H6H6<c-C -C D D D,8,(*uk#6F(L(LI&9+5J%*^^4G%M%MF(VH4L).	3)G)GJ*,'//.7G7Lc+S +SK$OOBIk:s,S,STTT)*<e>NOO F0B30G0B1110E  *-9MNN R).8H#)N)N*/*^*D*D.3o.H.H.Q.Q7B 4')y1A7C'P'P (	$0L0L M M M68gll6JXbcfXgKhjlnq6r6r 3ALAZAZ[_[jmz  }B  }G  mH  JL  BM  BM	*= > (	:MvWZ0[0[ \ \ \ \+-7==z9CC#,O ,O (	(FC0P0P Q Q Q Q%'W%8%8s%K%K
 	*k3(O(OPPP 	"$'//$*2B;s"S"S"&+c)3 )3 4 4 4 4 OOD))))!EJJ 	N 875;;777L=!!Q&&% 'C D D D ' N NeU++ Kz%/F/F K"3u::.. 
B 
B"1X%b"&11 5bg6K6K!+BG!4B%b#.. B14\!_Q5G1L1LLOA.14\!_Q5G1L1LLOA.."1!A#B #B B !$E

IIs++ K),\!_Q-?)G)GLOA&),\!_Q-?)G)GLOA& !II)IK K K$$)LN N N % 011r   c                 "   t           j        dk    r.t          d|           t          j        | j        j                   t          |d         t          j	        j
                  st          d          ddlm} |                    | j        | j        | j        |d i           \  }}}}t          |t          j	        j
                  rt          d          t          j	        
                    ||d         j        |d         j                  }|||fS )NrG   get_return_typer   zGThe first argument to a stencil kernel must be the primary input array.)typed_passesz:Stencil kernel must return a scalar and not a numpy array.)r   r   r   r   r   rL   ri   r_   r   npytypesArrayr   
numba.corer   type_inference_stagerR   rT   r3   layout)r   argtysr   r   r!   r   r   real_rets           r   r   zStencilFunc.get_return_typeK  s&   !Q&&#V,,, !6777&)U^%9:: 	A! #@ A A A 	,+++++-9-N-N. .*i k5>#788 	N!LN N N >''VAY^5;AY5EG G'9--r   c                     t          dt          | j                  z   t          ft	          | | j                            }|                    | |           dS )zmConstructs and installs a typing class for a StencilFunc object in
        the input typing context.
        StencilFuncTyping_)keygenericN)rI   strrK   r   dict_type_meinsert_user_function)r   	typingctx_ty_clss      r   rU   zStencilFunc._install_typed  s\     +47||$(*dm<<<> > 	&&tW55555r   c                 N    | j         |         \  }}}} | j        |||||g|R  }	|	S r   )rW   _stencil_wrapper)
r   r   kwtysr!   sigretr   resultr   r   new_funcs
             r   r   zStencilFunc.compile_for_argtysn  sM    *.*:6*B'FGY(4()0)F>DF F Fr   c                    | j         Tt          | j                   |d         j        k    r1t          dt          | j                   |d         j        fz            |}d}d}d|v r||d         fz  }|dz  }|d         }d|v r||d         fz  }|dz  }|| j        v r| j        |         \  }}}}|S |                     |          \  }}	}
t          |g|R  }d	                    d
                    | j	        j
                  |          }i }t          ||           |d         }|                    t          j        |                    }| j                            | j        | |fg           |||	|
f| j        |<   |S )z
        Implement AbstractTemplate.generic() for the typing class
        built by StencilFunc._install_type().
        Return the call-site signature.
        Nr   r|    outz
, out=NonerH   z, neighborhood=Nonez*def __numba_dummy_stencil({}{}):
    pass
,__numba_dummy_stencil)pysig)rH   r6   r3   r   rW   r   r   formatjoinrL   r   execreplacer   pysignaturerT   insert_func_defnrX   )r   r   r   argtys_extra	sig_extrar   _sigr   r   r   r   r(   
dummy_textdct
dummy_funcs                  r   r   zStencilFunc._type_meu  s    )!""fQin44! #C#&t'8#9#96!9>"J#K L L L 	E>>U5\O+L%I5\FU""U>244L..I 4+++".|<OT1aK)-)=)=f)E)E&7I0<000DKK!9::IG G
Z01
kk 1* = =k>>((4>4*N)OPPP*-vw	)J&
r   c                 |   i } |j                     }i |_        |j                                        D ]\  }}t          j        |j        |                   }g |_        |j        |         j        D ]?}t          j        |          }	|j                            |	           ||v r||         ||	<   @||j        |<   ||fS )a  
        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.
        )copyri   r[   deepcopyr^   ra   )
r   r   r   copy_calltypeskernel_copyblock_labelrn   	new_blockrp   scopys
             r   copy_ir_with_calltypesz"StencilFunc.copy_ir_with_calltypes  s     bgii$&IOO$5$5 	8 	8 [%bi&<==IIN	+.3 < <
 d++%%e,,,9$$,5dON5).7K{++^,,r   c           
      Z  D |                      | j        |          \  }}t          j        |j                   |j        d         }	t          j        |j        |          \  }
}t          j        |j                  }t          j        |j        |
|||           d|v rt          d          t          j
        d|          }t          j        dk    rt          d||           |d         }t          j        dk    rCt          d||j        t          |j                  |           t          j        |j                   dt#          t%          |                                        d	d
          d
| j        }g }t)          |j                  D ]-}t          j
        dt-          |          z   |          }||gz  }.t          j
        d|          }t          j
        d|          }d}||d                    |          z  }dt1          | j                  v r|d                    |          z  }| j                            dg           }|	|v rt          d          t9          t;          |          t;          |j                  z
            dk    rt          d          |                     |||j        | j        |||          \  }}| j        || _        t          j        dk    r(t          d           t          j        |j                   |                      |j        ||          }t          j        dk    r)t          d|           t          j        |j                   d                    |d!                    |j                  |          }g }t)          |j                  D ]}tE          ||         d         tF                    r||         d         }||         d         }n,d                    ||          }d                    ||          }|$                    ||f           t9          |          dk    r |d|	z   z  }|D ]}||	k    r|d|z   z  }|dz  }t          j
        d|          }|d                    ||	          z  }d } |tK          j&        |j                  j        j'        }!d                    |||!          }"d| j        v r^| j        d         }#tP          j)        )                    |#          }$| j*        +                    |$|j                  sd}%t          |%          nd}#|d |"z   z  }t)          |j                  D ]}&d!g|j        z  }'d!g|j        z  }(d"                    | j        |&         d                   |'|&<   d#                    | j        |&         d                   |(|&<   |d d$                    |d!                    |'           | |#                    z   z  }|d d$                    |d!                    |(           | |#                    z   z  }nd| j        v r| j        d         }#tP          j)        )                    |#          }$| j*        +                    |$|j                  sd}%t          |%          d%                    | | |#                    }"|d |"z   z  }d})t)          |j                  D ]X}t)          |)          D ]}*|d z  }|d&                    ||         ||         d         ||||         d                   z  }|)dz  })Yt)          |)          D ]}*|d z  }|d'                    |          z  }|d(                    |          z  }t          j        dk    rt          d)           t          |           i }+|+,                    t[                                 t]          ||+           |+|         },|t_          j0        |,          }-|-|_1        dd*l2m3}. |.4                    |,          }/t          j5        |/j                   t          j        |/j                  }0i }1||||g|j        z   |z   }2|06                                D ]T\  }3}4|3|2vrKtE          |4tn          j8                  sJ |4j9        :                    |4j;        |4j<                  }5|5j;        |1|3<   Ut          j=        |/j        |1           t}          |/j        ?                                          dz   Dt          j@        |j        D          |_        t}          |j        ?                                          dz   }6Dfd+|D             }t          j        dk    rat          d,|D           t          d-           t          j        |/j                   t          d.           t          j        |j                   |/j        6                                D ]b\  }7}8t          |8jB                  D ]E\  }}9tE          |9tn          jC                  r$|9jD        j;        |k    r|9j<        }:|8j9        };to          jE        |;|:          }<|8jB        d |         |<_B        |8jB        |dz   d          |8_B        t          |j        ?                                          }=|<$                    to          jG        |=|:                     |j        6                                D ]\  }>}?|?|/j        |><   |8|/j        |6<   |<|/j        |7<   |D ]5}@|/j        |@         $                    to          jG        |6|:                     6 nGc t          jH        |/j                  |/_        t          j5        |/j                   tE          |t          jJ                  sJ |}At          |A          }Bt          j        dk    r)t          d/|B           t          j        |/j                   t          jL        |/j                   |.M                    | j*        | jN        |/|Bd |.jO        i           }C|CS )0Nr   r   z6Cannot use the reserved word 'out' in stencil kernels.__sentinel__rG   name_var_tabler   __numba_stencil_-r   r   rH   r   z	, {}=Nonestandard_indexingzYThe first argument to a stencil kernel must use relative indexing, not standard indexing.z[Standard indexing requested for an array name not present in the stencil kernel definition.zAfter add_indices_to_kernelz!After replace_return_with_setitemzdef {}({}{}):
r   z	{}[{}][0]z	{}[{}][1]z&    raise_if_incompatible_array_sizes(z)

full_shapez    {} = {}.shape
c                     t          j        |           s6t          j        |           rdS t          j        |           r
| dk     rdS dS d S t	          |           S )Nznp.nanr   z-np.infznp.inf)npisfiniteisnanisinfr   )cvals    r   cval_as_strz1StencilFunc._stencil_wrapper.<locals>.cval_as_strD  sd    ;t$$ 
!8D>> (#8Xd^^ (axx(y'x	( ( 4yy r   z{} = np.empty({}, dtype=np.{})
r  z-cval type does not match stencil return type.z    :z:-{}z-{}:z{}[{}] = {}
z{}[:] = {}
z.for {} in range(-min(0,{}),{}[{}]-max(0,{})):
z{} = 0
z    return {}
znew stencil func textcompilerc                     g | ]}|z   S r0   r0   )r   xstencil_stub_last_labels     r   r   z0StencilFunc._stencil_wrapper.<locals>.<listcomp>  s    FFFaa11FFFr   zret_blocks w/ offsetsz"before replace sentinel stencil_irz#before replace sentinel kernel_copynew_stencil_param_types)Pr   rL   r   remove_argsri   r   copy_propagateget_name_var_tableapply_copy_propagater   get_unused_var_namer   r   r   dtyperI   r   hexrK   r   r5   r3   r   r   r   rO   rN   rV   r6   r   r{   rH   ry   r   r_   r   ra   r   as_dtyper,   r   typeofrR   can_convertupdateglobalsr   r   r   r   r   r  run_frontendremove_delsr[   r   rb   r\   re   r   r]   replace_var_namesr   keysadd_offset_to_labels	enumerater^   rh   r   Blockr   Jumprename_labelsr   Typer   fixup_var_define_in_scope
compile_irrT   DEFAULT_FLAGS)Er   r   r   r!   r   r   r    r   r   	first_argin_cpsout_cpsr   sentinel_name	the_arraystencil_func_namerj   r;   index_var_namerk   neighborhood_namer   r   kernel_sizer   rl   	func_textrangeslohiother_array
shape_namer  return_type_nameout_initr  cval_tymsgr   start_items	end_itemsoffsetjr   stencil_funcr   r  
stencil_ir	var_tablenew_var_dictreserved_namesr   varnew_var	new_labelrm   rn   instr]   r\   
prev_blockbody_first_labellb	ret_blockarray_typesr  r   r  sE                                                                       @r   r   zStencilFunc._stencil_wrapper  s   & )-(C(C,0NI)G )G%n 	[/000)!,	"1+2DgNN!4[5GHH%	 	 	 N""!"Z[[[ 4^^TT!Q&&"NMBBBG	!Q&&$k;3D&*;+<&=&=tE E E !3444
 ),ByMM(:(:(B(B3(L(L(L(L(,1 
y~&& 	+ 	+A%9'CFF:J:HJ JN>**JJ /~FF$89GI I	++H555IT$(^^++++,=>>>I  <++,?DD(((! #R S S S s#$$s;+@'A'AABBaGG! #R S S S +/*D*DZ!#3Wn+N +N'' $ +D!Q&&/000 !3444 55k6H6@(L L
 !Q&&5zBBB !3444 &,,->!677D D	 y~&& 	$ 	$A+a.+S11 > ^A& ^A& ''(91== ''(91==MM2r(####
 !""Q&&AIMMI1 3 3)++{!22II 1,OO
*11*iHHH		! 	! 	!  >,5*0 2  226x 8?? *.>@ @H %%|F+ -..t44227K<MNN /IC)#.../ (**IY^,, o o"ein4 EIN2	#)==1B31G1J#K#KC !'t/@/Ea/H!I!I	#Vo&<&<XsxxP[G\G\^i^ijn^o^o&p&ppp	Vo&<&<XsxxPYGZGZ\g\ghl\m\m&n&nnn		o %%|F+ -..t44227K<MNN /IC)#...)00;;t;L;LMMVh..	y~&& 	 	A6]] $ $V#		  128&&qM"1IaL&"1IaL3* 3**I aKFFv 	  	 AII 	Z&&}555	&--h777	!Q&&)***) 

799Y,-%l33E FL''''''**<88
Z./// /
0ABB	((4E%')4)>?AKL"** 	2 	2ID#>))!#rv.....),,SXsw??%,\T"":#4lCCC"%j&7&<&<&>&>"?"?!"C &: + 24KM M*//1122Q6	FFFF:FFF
!Q&&):7NOOO6777 !23337888 !3444 '-3355 %	 %	LE5$UZ00 # #4bi00  K$55(C!KE
 "$%!5!5J&+j!nJO!&AEFF!3EJ'*;+=+B+B+D+D'E'E$ %%bg.>&D&DEEE #."4":":"<"< 1 1A/0
)!,,38J%i0/9J%e, &0 5 5	"))4;;GIs335 5 5 5E$2:3DEE
Z.///)UZ00111"&{"3"3!Q&&+-DEEE !2333 	*:+<===&&OO#"  r   c                 <   | j                                          | j        ct          | j                  |d         j        k    r@t          d                    t          | j                  |d         j                            d|v r|d         }|j        }t          j	        |          }t          j                            ||j        t          j        |                    }t          d |D                       }t          d |D             |gz             }nd }t          d |D                       }|}t          j        dk    rt#          d|||           |                     |          \  }	}
} | j        |d |	|
|g|R  }|
 |j        | S  |j        ||fz    S )	Nr   zD{} dimensional neighborhood specified for {} dimensional input arrayr   c                 L    g | ]!}t           j                            |          "S r0   r   r  r   r
  s     r   r   z(StencilFunc.__call__.<locals>.<listcomp>  (     G G GQ!5!5a!8!8 G G Gr   c                 L    g | ]!}t           j                            |          "S r0   rN  rO  s     r   r   z(StencilFunc.__call__.<locals>.<listcomp>  s(    %L%L%L!fm&:&:1&=&=%L%L%Lr   c                 L    g | ]!}t           j                            |          "S r0   rN  rO  s     r   r   z(StencilFunc.__call__.<locals>.<listcomp>  rP  r   rG   r+   )rR   refreshrH   r6   r3   r   r   r  r   
from_dtyper   r   r   
map_layoutr   r   r   r   r   r   entry_point)r   r    kwargsr   rdtyperttyperesult_typerK  array_types_fullr   r   r   r   s                r   r+   zStencilFunc.__call__  s   !!!)!""d1gl22! #??Ev"%d&7"8"8$q',@H @HI I I F??E]F\F"-f55F...vv{/</G/O/OQ QK G G$ G G GHHK$%L%Lt%L%L%L&1]&3  4  4 F G G$ G G GHHK*!Q&&*k4888)-)=)=k)J)J&7I(4(x)2G5EG G G >'8'..'8'$y.::r   N)r,   r-   r.   r/   rJ   r   ry   r{   r   rU   r   r   r   r   r+   r0   r   r   rE   rE   A   s          J2 2 2 ( ( (TF2 F2 F2R. . .26 6 6  ' ' 'R- - -6G G GR
 ;  ;  ;  ;  ;r   rE   constantc                     t          | t                    sd}| }n| }d }|D ]}|dvrt          d|z             t          ||          }| ||          S |S )Nr\  )r  r   rH   zUnknown stencil option )r_   r   r   _stencil)func_or_moderN   rM   funcoptionwrappers         r   stencilrc  $  s    lC((  F FFFF!";f"DEEE G tW%%Gwt}}Nr   c                 F      dk    rt          d z              fd}|S )Nr\  zUnsupported mode style c                 \    ddl m} |                    |           }t          |          S )Nr   r  )r   r  r  rE   )r`  r  rL   rM   rN   s      r   	decoratedz_stencil.<locals>.decorated:  s:    ''''''))$//	9dG444r   r   )rM   rN   rf  s   `` r   r^  r^  6  sI    z7$>???5 5 5 5 5 5
 r   c                 n    t          j        t          j        t          j        j                  d          S )z lowering for dummy stencil callsr   )lirConstantIntTyper   r   bitwidth)r&   r'   r(   r    s       r   stencil_dummy_lowerrl  A  s%     <EJ$788!<<<r   )r\  )&r   numpyr   llvmliter   rh  r   r   r   r   r   r   r	   numba.core.typing.templatesr
   r   r   r   numba.core.imputilsr   numba.core.extendingr   numba.core.errorsr   numba.misc.specialr   r   r   numba.npr   objectr   r<   rC   rE   rc  r^  rl  r0   r   r   <module>rv     s              K K K K K K K K K K K K K K K K K KI I I I I I I I I I I I - - - - - - 1 1 1 1 1 1 - - - - - - - - - - - -   " " " " " "        3 3 3,D D Da; a; a; a; a;& a; a; a;F   $	 	 	 w= = = = =r   