
    sh                     .   S SK r S SKrS SKrS SKJr  S SKrS SKrS SKr	S SK
JrJrJrJrJr  S SKJrJr  S SKJr  S SK
JrJr  S SKJrJrJrJrJrJrJrJrJr  S SK J!r!  S S	K"J#r#  S S
K$J%r%  S r& " S S\'5      r(S r) " S S\'5      r*S r+S r,S r-S r.S r/g)    N)add)typesirrewritesconfigir_utils)infer_globalAbstractTemplate)	signature)utilstyping)	get_call_tablemk_unique_varcompile_to_numba_irreplace_arg_nodesguardfind_callnamerequire
find_constGuardException)NumbaValueError)OPERATORS_TO_BUILTINS)numpy_supportc                     US:  a  X-
  $ U $ Nr    )dim_sizeindex_consts     p/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/stencils/stencilparfor.py_compute_last_indr       s    Q%%    c                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)StencilPass!   c                 X    Xl         X l        X0l        X@l        XPl        X`l        Xpl        g N)func_irtypemap	calltypesarray_analysis	typingctx	targetctxflags)selfr'   r(   r)   r*   r+   r,   r-   s           r   __init__StencilPass.__init__"   s&    ",""
r!   c                   ^  SSK Jn  [        T R                  R                  5      u  p#/ n0 nUR                  5        H5  u  pgU H*  n[        X5      (       d  M  UR                  U5        XU'   M,     M7     U(       d  gT R                  R                  R                  5        GH1  u  p[        [        [        U
R                  5      5      5       GH  u  p[        U[        R                  5      (       Ga  [        UR                  [        R                  5      (       Ga  UR                  R                   S:X  Ga  UR                  R"                  R$                  U;   Ga  ['        UR                  R(                  5      n[+        [-        UR                  R.                  5      5       Vs0 s H  oUR                  R.                  U   _M     nnUR                  R.                  n[1        U 4S jU 5       5      nU H-  n[        U[2        R4                  5      (       d  M$  [7        S5      e   UR9                  S5      nX\R                  R"                  R$                     n[;        UT R<                  UU
R>                  U
R@                  UT RB                  T RD                  5      u  nnnURF                  R9                  SS5      nT RI                  XUUUURJ                  UUU5	      nU
R                  SW U-   U
R                  US	-   S -   U
l        GMB  [        U[        R                  5      (       d  GMd  [        UR                  [        R                  5      (       d  GM  UR                  R                   S:X  d  GM  [M        [N        T R                  UR                  5      S
:X  d  GM  [        RP                  " SUR@                  5      Ul        GM     GM4     gs  snf )zOFinds all calls to StencilFuncs in the IR and converts them to parfor.
        r   )StencilFuncNcallc              3   V   >#    U  H  nTR                   UR                     v   M      g 7fr&   )r(   name).0ir.   s     r   	<genexpr>"StencilPass.run.<locals>.<genexpr>L   s     'NgQVV(<gs   &)zITuple parameters not supported for stencil kernels in parallel=True mode.outindex_offsets   )stencilnumba))numba.stencils.stencilr2   r   r'   blocksitems
isinstanceappendreversedlist	enumeratebodyr   AssignvalueExpropfuncr5   dictkwsrangelenargstupler   	BaseTupler   getget_stencil_irr+   scopelocr(   r)   options_mk_stencil_parfortargetr   r   Const)r.   r2   
call_table_stencil_callsstencil_dictcall_varname	call_listone_calllabelblockr7   stmtrN   
input_dictin_argsarg_typemaparg_typeout_arrsf
stencil_irrtarg_to_arr_dictr;   	gen_nodess   `                        r   runStencilPass.run,   s    	7 't||':':;
'1'7'7'9#L%h44!((619.	 & (:  !LL//557LE#D5::)>$?@tRYY//&tzz277;; JJMMV3 JJOO00MAtzz~~.C 5:#djjoo:N4O"Q4O =>TZZ__Q%7"74O  "Q"jjooG"''Ng'N"NK$/%h@@"1 3: #; ; %0 "ggenG &jjoo&:&:;B6DR NNK!KKJ LL$..7:3JO %'JJNN?D$IM $ 7 7&t{{B+!-I "'BQ)!;ejj1>N!NEJ ryy11&tzz277;; JJMMV3!-tzzJ';< "$!TXX!6DJQ A 8"Qs   (#Oc           	         UR                  5        GH@  u  pEUR                  nUR                  n/ nUR                   GH	  n	[	        U	[
        R                  5      (       a  UR                  5       n
[	        U
[
        R                  5      (       aC  [	        U
R                  [
        R                  5      (       a  U
R                  R                  S:X  d   eUR                  [
        R                  " U
R                  R                  X'5      5        UR                  [
        R                  " X75      5        M  UR                  U	5        GM     Xl        GMC     g)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.
castN)rA   rV   rW   rG   rB   r   ReturnpoprH   rI   rJ   rK   rC   Jump)r.   r@   exit_value_varparfor_body_exit_labelrc   rd   rV   rW   new_bodyre   	prev_stmts              r   replace_return_with_setitem'StencilPass.replace_return_with_setitemj   s     #LLNLEKKE))CH

dBII.. (I&y"))<<&y@@%OO..&8: 9 OOBIIioo.C.C^$YZOOBGG,B$HIOOD) # "J! +r!   c
                 *%  ^ ^^S^T / n
UR                   n[        R                  S:  a&  [        SXTUXxU5        [        R
                  " U5        US   nT R                  UR                     n[        R                  " UT R                  5      u  p[        R                  " U5      n[        R                  " UUUT R                  T R                  5        [        R                  S:  a!  [        S5        [        R
                  " U5        [        R                  " UT R                  R                  UT R                  5        [        R                  S:  a!  [        S5        [        R
                  " U5        T R                  UR                     R                  mSUR                   nUR"                  n/ n[%        TS5       H\  n[&        R(                  " U[+        S5      U5      n[,        R.                  T R                  UR                  '   UR1                  U5        M^     T R3                  UUX%UU	5      u  nn[        R                  S:  a9  [        S5        [        SU5        [        S	U5        [        R
                  " U5        / nT R4                  R7                  U5      nUR9                  U5      nTS[;        U5      :X  d   e/ n/ n[%        TS5       H  nT R=                  UU   UU   U
UU5      nT R?                  UU   U
UU5      nUR1                  U5        UR1                  U5        UR1                  [@        RB                  RD                  RG                  UU   UUS5      5        M     [I        URK                  5       5      S-   n[&        RL                  " UU5      UU'   [&        R(                  " U[+        S
5      U5      n URN                  T R                  U R                  '   / n!TSS:X  a  US   n"O[&        R(                  " U[+        S5      U5      n"[,        RP                  RS                  [,        R.                  TS5      T R                  U"R                  '   [&        RT                  RW                  UU5      n#[&        RX                  " U#U"U5      n$U!R1                  U$5        [        R                  S:  a!  [        S5        [        R
                  " U5        [&        RL                  " UU5      n%TGc  T R                  UR                     n[        R*                  " S5      n&[&        R(                  " UU&U5      n'[&        RT                  R[                  USU5      n([,        RP                  RS                  [,        R.                  UR                  5      T R                  U&'   U%R\                  R_                  [&        RX                  " U(U'U5      /5        [        R*                  " S5      n)[&        R(                  " UU)U5      mTSUR`                  ;   av  UR`                  S   n*[b        Rd                  Re                  U*5      n+T Rf                  Ri                  U+URN                  5      (       d  [k        S5      eURO                  U*5      n,OURO                  S5      n,[&        Rl                  " U,U5      n-URN                  T R                  U)'   U%R\                  R_                  [&        RX                  " U-TTU5      /5        [        R*                  " S5      n.[&        R(                  " UU.U5      m[@        Rn                  R,                  Rp                  Rs                  URN                  UR                  URt                  5      T R                  TR                  '   [&        R(                  " U[+        S5      U5      n/[,        Rv                  Ry                  [z        5      T R                  U/R                  '   [&        R|                  " S[z        U5      n0[&        RX                  " U0U/U5      n1U%R\                  R1                  U15        [~        R                  " URN                  5      R                  R                  n2U2S:X  a  Sn2[&        RT                  R[                  U/U2U5      n3[&        R(                  " U[+        S5      U5      n4[,        R                  R                  URN                  5      T R                  U4R                  '   [&        RX                  " U3U4U5      n5U%R\                  R1                  U55        [        R                  " S[z        R                  TU'U4/T Rf                  T R                  T R                  5      n6[&        R(                  " U[+        S5      U5      n7[&        RX                  " [&        Rl                  " SU5      U7U5      n8U6R1                  U85        [,        R                  T R                  U7R                  '   [&        R(                  " U[+        S5      U5      n9[&        RX                  " [&        Rl                  " SU5      U9U5      n:U6R1                  U:5        [,        R.                  T R                  U9R                  '   [&        R(                  " U[+        S5      U5      n;T Rf                  R                  [        5      n<U<T R                  U;R                  '   [&        R|                  " S[        U5      n=[&        RX                  " U=U;U5      n>U6R1                  U>5        T Rf                  R                  U<[,        R                  4S-  0 5      n?[&        RT                  R                  U;U7U74SUS 9n@U?T R                  U@'   [&        R(                  " U[+        S!5      U5      nA[,        R                  T R                  UAR                  '   [&        RX                  " U@UAU5      n>U6R1                  U>5        USUU UT4S" jnB[%        UR                  5       HH  nCWA/UR                  -  nDUA/UR                  -  nEWB" U<UCUUU;U6UUDU9S#5
        UB" U<UCUUU;U6UUEUUC   S$5
        MJ     UR                  TU5        U%R\                  R_                  U65        GONSUR`                  ;   Ga=  UR`                  S   n*[b        Rd                  Re                  U*5      n+T Rf                  Ri                  U+URN                  5      (       d  SnF[k        UF5      e[&        R(                  " U[+        S%5      U5      nAT Rf                  R                  [        5      n<U<T R                  UAR                  '   [&        R|                  " S[        U5      n=[&        RX                  " U=UAU5      nGU%R\                  R1                  UG5        T Rf                  R                  U<[,        R                  4S-  0 5      n?[&        RT                  R                  UASSUS 9nHU?T R                  UH'   [&        R(                  " U[+        S&5      U5      nI[,        R                  T R                  UIR                  '   [&        RX                  " UHUIU5      n>U%R\                  R1                  U>5        [&        Rl                  " URO                  U*5      U5      nJ[&        R(                  " U[+        S'5      U5      nKURN                  T R                  UKR                  '   [&        RX                  " UJUKU5      nLU%R\                  R1                  UL5        [&        R                  " T[        SS5      UIUKU5      nMU%R\                  R1                  UM5        [        [,        R                  T R                  TR                     T R                  UIR                     T R                  TR                     RN                  5      n?U?T R                  UM'   T R                  UU U5        [        R                  S:  a!  [        S(5        [        R
                  " U5        [&        R                  " TU"U U5      nN[        [,        R                  T R                  TR                     T R                  U"R                     T R                  TR                     RN                  5      T R                  UN'   UU   R\                  R_                  U!5        UU   R\                  R1                  UN5        [&        R                  " S)S*5      nO[&        R(                  " U[+        S'5      UO5      nP[&        RX                  " [&        Rl                  " SUOS+9UPUO5      nLUU   R\                  R1                  UL5        UU   R\                  R1                  [&        R                  " UPUO5      5        [        R                  " U5      nU[I        URK                  5       5         R\                  R                  5         [        R                  S:  a!  [        S,5        [        R
                  " U5        S-UU/4nQ[@        RB                  RD                  R                  UU%UUU"UUQT R                  5      nRU
R1                  UR5        U
R1                  [&        RX                  " TUU5      5        U
$ ).z=Converts a set of stencil kernel blocks to a parfor.
        r<   rY   r   z#stencil_blocks after copy_propagatez'stencil_blocks after removing dead codez$parfor_index_varz-stencil_blocks after replace stencil accesseszstart_lengths:zend_lengths:z$parfor_exit_valuez$parfor_index_tuple_varz.stencil_blocks after creating parfor index varNin_arr_shapeshapezero_valcvalz-cval type does not match stencil return type.stencil_outputz	$np_g_varnpboolbool_z$np_attr_attremptyz	$none_varz$zero_index_varz$slice_func_varslice   r   rL   rQ   rN   rW   $slicec
                   > TR                   R                  U [        R                  4S-  0 5      n
Xa   n[	        U[
        [        R                  45      (       d   e[        R                  " U[        S5      U5      n[        R                  TR                  UR                  '   [	        U[
        5      (       a,  [        R                  " [        R                  " X5      X5      nO[        R                  " XU5      nUR                  U5        [        R                  R                  UU	(       a  X4OX4SUS9nU
TR                   U'   [        R                  " U[        S5      U5      n[        R"                  TR                  UR                  '   [        R                  " XU5      nUR                  U5        XU'   [        R                  " U[        S5      U5      n[        R$                  R'                  [        R"                  T5      TR                  UR                  '   [        R                  R)                  Xs5      n[        R                  " UUU5      nUR                  U5        [        R*                  " TUTU5      n[-        [        R.                  TR                  TR                     TR                  UR                     TR                  TR                     R0                  5      TR                   U'   UR                  U5        g )Nr   z$border_indr   r   r   z$border_index_tuple_var)r+   resolve_function_typer   intprB   intr   Varr   r(   r5   rH   r[   rC   rJ   r3   r)   slice2_type
containersUniTuplebuild_tupleSetItemr   nonedtype)slice_fn_tydimrV   rW   slice_func_varstmtsborder_indsborder_tuple_items	other_argother_firstsigsisi_var	si_assignslice_callexprborder_slice_varslice_assignborder_ind_var
tuple_calltuple_assignsetitem_callndimsrj   r.   zero_vars                        r   handle_border5StencilPass._mk_stencil_parfor.<locals>.handle_borderD  sH    nn::ZZMA% !%!"sBFFm4454}]'CSI,1JJV[[)b#&& "		"((2*;V II "		"c :IY'!#'0;),&AT	 ". "
 25~.#%66%x1H##N 6;6G6G-223!yy3O\**:3'!#}-0/03"5494D4D4M4M%%u5.^001WW001CI
!yy^SI\*!zz'>8SQ/805

DLL<V04^=P=P0Q04W\\0J0P0P02|,
 \*r!   TFz	$py_g_varz$slice_instz$cval_constz%stencil_blocks after replacing returnstencilparfor_dummy)rW   z#stencil_blocks after adding SetItemr=   )Xr@   r   DEBUG_ARRAY_OPTprintr   dump_blocksr(   r5   copy_propagateget_name_var_tableapply_copy_propagater)   remove_deadr'   	arg_namesndimrV   rW   rO   r   r   r   r   r   rC   _replace_stencil_accessesr*   get_equiv_set	get_shaperP   _get_stencil_last_ind_get_stencil_start_indr>   parforsparforLoopNestmaxkeysBlockr   r   r   rJ   r   rH   getattrrG   extendrX   r   typeofr+   can_convertr   r[   corenpytypesArraylayoutmiscModuler   Globalr   as_dtypetype__name__	functionsNumberClassgen_np_callr   r   resolve_value_typer   r   r3   r   insert_equivStaticSetItemr   r{   r   Locrt   simplify_CFGru   Parforr-   )Ur.   rc   rg   rj   rl   r;   rZ   return_typestencil_funcrn   ro   stencil_blocksin_arr
in_arr_typin_cpsout_cpsname_var_tablerV   rW   parfor_varsr7   
parfor_varstart_lengthsend_lengths	loopnests	equiv_setin_arr_dim_sizes
start_inds	last_indslast_ind	start_indrx   rw   for_replacing_retparfor_ind_varr   r   
init_block
shape_name	shape_varshape_getattr	zero_namer   cval_tytemp2
full_constso_namedtype_g_np_var
dtype_g_npdtype_g_np_assignreturn_type_namedtype_np_attr_calldtype_attr_vardtype_attr_assignr   none_varnone_assignzero_index_varzero_index_assignr   r   slice_gr   r   r   	slice_varr   r   start_tuple_itemslast_tuple_itemsmsgslice_assignedcallexprslice_inst_varcval_const_valcval_const_varcval_const_assignsetitemexprr   	dummy_locret_const_varpatternr   r   r   sU   `  `                                                                               @@r   rY   StencilPass._mk_stencil_parfor   s   
 	#**!!Q&&n>  0\\&++.
"11.$,,O!44^D%%LLNN	 !!Q&78  0^T\\-C-CZ!\\	+!!Q&;<  0 V[[)..jjuA}#(%&)+J,1JJDLL)z*	  &*%C%Cgl&"{ !!Q&AB"M2.+.  0 	''55e<	$..v6,----
	uA112B12E(3A	5#OH33(5a(8)UCQIi(X&U]]11::;q> )8Q8 9  "%^%8%8%:!;a!?13%1E-.}5I'JCP,7,=,=^(() A:(^NVVE=),+,/1N050@0@0I0I

E1#DLL,,-,,[#>J99ZEL$$\2!!Q&BC  0 XXeS)
?fkk2J!//?Juj#6IGGOOFGSAM','7'7'@'@?I(PDLL$OO""BIImY$L#MN ..z:IvveY4H---#++F3 --..t4~~11';;L;LMM) +9 : : $))$/#))!,%-J&1&7&7DLL#OO""BIIj(C$H#IJ,,-=>GffUGS1G).)9)9)B)B)H)H;F;L;L;E??;E;L;L*NDLL&  VVE=+EsKN05

0A0A"0EDLL,,-4S1J "		*nc JOO""#45,55*00 226$xx 6)#* !#AQSV!WVVE=+I3ON050K0KKL]L]0^DLL,,- "		*<nc ROO""#45((')xx'.(1>'B'+~~'+||'+~~7E vve];%?EH))BHHT3$73GKLL%*/**DLL'VVE=9J+KSQN "		"((1c*:NC PLL*+05

DLL,,-  VVE=9J+KSQN..;;EBK0;DLL,,-ii4G99WncBLLL&..66{8=

}q7H79;C  WW\\~08(/C.0.1 * 3N .1DNN>*umH&=sCI+0+<+<DLL(99^YDLLL&5+ 5+p Z__-%.K*//$A!$-;#@ k!#!,#(/,"	$ k!#!,#'..s3#	% .8 ""7,<=OO""5)---#++F3 --..t4~~11';;L;LMMIC)#.. FF5-*DcJ	"nn??F/:Y^^,))GUC8!#7Is!C&&~6nn::;<AJJ=1;L;=? 77<<YRR,/ ( 1 ,/x(!#}]/K(+"-494E4E^001!yy>3G&&|4 "$+*;*;D*A3!G!#}]/K,/"14?4E4E^001$&IIn.<c%C!&&'89 !..wdD8I/=~/24 &&{3

DLL,F $^-@-@ A $W\\ : @ @B /2{+ 	(()?	A !!Q&9:  0zz'>>3O'0(-

DLL4N(,^5H5H(I(,W\\(B(H(H(*|$
 	-.33::;LM-.33::<H FF0"5	umM&BINIIbhhqi&@-QZ[-.33::;LM-.33::IImY/	
 "..~>s>..01277;;=!!Q&78  0}k:;%%,,Y
N%(.)WdjjZ 7FC89r!   c                    UnUS:w  GaG  [         R                  " U[        S5      U5      n[        R                  U R
                  UR                  '   [        U[        R                  5      (       a,  [         R                  " [         R                  " X%5      Xu5      nO[         R                  " X'U5      nUR                  U5        [         R                  " U[        S5      U5      n[        R                  U R
                  UR                  '   [         R                  " U[        S5      U5      n	[        R                  " [        5      n
[        R                   R#                  U
5      nXR
                  U	R                  '   [         R$                  " SX5      n[         R                  " XU5      nUR                  U5        [         R&                  R)                  XU/SU5      nUR+                  U R,                  [        R                  [        R                  /0 5      U R.                  U'   [         R                  " XU5      nUR                  U5        U$ )Nr   stencil_const_varr   compute_last_ind_varr    r   )r   r   r   r   r   r(   r5   rB   numbersNumberrH   r[   rC   r>   njitr    r   
Dispatcherr   rJ   r3   get_call_typer+   r)   )r.   r   
end_lengthro   rV   rW   r   r   const_assigng_var
check_funcfunc_typg_objg_assign
index_callindex_assigns                   r   r   !StencilPass._get_stencil_last_ind  s   ? &&6I(JHKMK-2ZZDLL))**gnn55!yy*)B8C J  "yy#F\*vve]:%>DH*/**DLL'FF5-0F"GME$56J11*=H'/LL$II1:CEyys3HX&e-Db#NJ)1)?)?UZZ 8"*>DNN:&99Z3?L\*r!   c           	         [        U[        5      (       a  [        [        US5      5      $ S n[	        U0 U R
                  U R                  [        R                  4U R                  U R                  5      n[        UR                  5      S:X  d   eUR                  R                  5       S   n[        Xq/5        X'R                  S S -  nUR                  S   R                   R                   nU$ )Nr   c                 ,    [        [        U S5      5      $ r   )absmin)s_lengths    r   get_start_ind9StencilPass._get_stencil_start_ind.<locals>.get_start_ind  s    s8Q'((r!   r<   )rB   r   r(  r)  r   r+   r,   r   r   r(   r)   rP   r@   popitemr   rG   rI   )	r.   start_lengthro   rV   rW   r+  f_irrd   ret_vars	            r   r   "StencilPass._get_stencil_start_ind  s    lC((s<+,,	)"="dnn#'>>EJJ=$,,#'>>3 4;;1$$$##%a(%0ZZ_$	**R.&&,,r!   c                    UR                   nUS   nU V	s/ s H  oR                  PM     n
n	SUR                  ;   aH  UR                  S    H  n	X;  d  M
  [        S5      e   UR                  S    V	s/ s H  oU	   PM	     nn	O/ nUR                  U;   a  [        S5      eU R                  UR                     R
                  nUR                  nUR                  nUR                  SL nU(       a  US/-  nUS/-  nO<UR                   V	s/ s H  oS   PM	     nn	UR                   V	s/ s H  oS   PM	     nn	[        R                  " U5      nSnUR                  5        GH<  u  nn/ nUR                   GH  n[        U[        R                  5      (       ag  [        UR                   [        R"                  5      (       a>  UR                   R$                  S;   a$  UR                   R                   R                  U
;   dX  [        U[        R&                  5      (       d  [        U[        R(                  5      (       a%  UR*                  R                  U
;   a  [        S	5      e[        U[        R                  5      (       Ga  [        UR                   [        R"                  5      (       Ga  UR                   R$                  S
;   Ga  UR                   R                   R                  U
;   Ga  UR                   R                   R                  U;  Gan  UR                   R,                  nUS:X  a  U/nO0[/        US5      (       a  UR                  U;   a  UUR                     n[        R0                  " U5      Ul        U Vs/ s H  n[5        XR6                  U5      PM     nnU(       a  U R9                  U[;        U5      UX5      nU(       a  [        U[        R<                  5      (       d4  [?        U Vs/ s H  n[        U[@        5      (       + PM     sn5      (       a  [        S5      e[;        [C        [D        UU5      5      n[;        [C        [F        UU5      5      nSnU R9                  U[;        U5      UX5      nUS:X  a  US   nO[        R<                  " U[I        S5      U5      n[J        RL                  RO                  [J        RP                  U5      U R                  UR                  '   [        R"                  RS                  UU5      n[        R                  " UUU5      nURU                  U5        [W        U Vs/ s H-  nU R                  UR                     [J        RP                  :H  PM/     sn5      (       a8  U R                  UR                   R                   R                     RX                  nO-U R                  UR                   R                   R                     n[        R"                  R[                  UR                   R                   UU5      n[]        UU R                  UR                   R                   R                     U R                  UR                     5      U R^                  U'   UUl        URU                  U5        GM     UUl        GM?     U(       a  U(       d  [        S5      eUU4$ s  sn	f s  sn	f s  sn	f s  sn	f s  snf s  snf s  snf )zConvert relative indexing in the stencil kernel to standard indexing
by adding the loop index variables to the corresponding dimensions
of the array index tuples.
r   standard_indexingz[Standard indexing requested for an array name not present in the stencil kernel definition.zYThe first argument to a stencil kernel must use relative indexing, not standard indexing.Nr<   F)setitemstatic_setitemz?Assignments to arrays passed to stencil kernels is not allowed.)static_getitemgetitemr5   z<Variable stencil index only possible with known neighborhoodTz$parfor_index_ind_varz=Stencil kernel with no accesses to relatively indexed arrays.)0r@   r5   rX   r   r(   r   rV   rW   neighborhoodr   get_tuple_tablerA   rG   rB   r   rH   rI   rJ   rK   r   r   rZ   indexhasattrbuild_definitions_definitions_get_const_index_exprr'   _add_index_offsetsrE   r   anyr   mapr)  r   r   r   r   r   r   r   rC   allr   r8  r   r)   ) r.   rl   r   rg   r;   r   rn   r   r   xin_arg_namesstandard_indexedr   rV   rW   need_to_calc_kernelr   r   tuple_tablefound_relative_indexrc   rd   ry   re   
index_listv
index_varsind_varr   r   getitem_return_typgetitem_calls                                    r   r   %StencilPass._replace_stencil_accesses&  s    $**(/010,"6"66!))*=>+) +G H H ? &2%9%9:M%N P%N 89 2%N   P  ";;**! #. / / V[[)..jj*774? !1#IM)K+7+D+DE+DaqT+DME+7+D+DE+DaqT+DKE ..~>$ +002LE5H

bii00&tzz277;; JJMM-JJ JJ,,11\Abjj11b&6&677 KK,,<) +L M M tRYY//&tzz277;; JJMM-JJ JJ,,11\A JJ,,119II!%!1!1Jz&0\
":v66:??k;Y)4Z__)EJ /7.H.H.XJ+>H"J>H #8"LL!#5>H  "J$%)%<%<Z$($75&O
 + 'z266:: LAZ3%7!7 LMM"1 3A #B B )-SmDN.P )Q&*3sK+L&M/3, "&!8!8 $Z 0(E"HJ z",Q-"$&&31569#;5:5E5E5N5N!JJ6/W\\2%'WW%8%8S%I
')yyWc'J 5 AKMAKA !LL0EJJ>AKM N N-1\\48JJ4D4D4I4I.KKP5 + .2\\$**:J:J:O:O-P*#%77??4::3C3CWLO$QL3<*TZZ%5%5%:%:;W\\244DNN<0 ".DJ%k #l "EJs 3t ';! #? @ @ k))O 1 P0 FEV"J !M4Ms)   [4[[+[ [8[4[c           	      l   [        U5      [        U5      :X  d   e[        X-    Vs/ s H  n[        U[        5      PM     sn5      (       a  [	        [        [        X5      5      $ / n/ n[        [        U5      5       GH  n	X   n
[        U
[        5      (       a  [        R                  " U[        S5      U5      n
[        R                  U R                  U
R                  '   [        R                  " [        R                   " X   U5      X5      nUR#                  U5        X)   n[        U[        5      (       a  [        R                  " U[        S5      U5      n[        R                  U R                  UR                  '   [        R                  " [        R                   " X)   U5      X5      nUR#                  U5        [        U
[$        5      (       d@  [        U R                  U
R                     [        R&                  R(                  5      (       aT  U R                  UR                     [        R                  :X  d   eU R+                  XXtU5      nUR#                  U5        GM  [        U[$        5      (       d@  [        U R                  UR                     [        R&                  R(                  5      (       aT  U R                  U
R                     [        R                  :X  d   eU R+                  XXtU5      nUR#                  U5        GM  [        R                  " U[        S5      U5      n[        R                  U R                  UR                  '   [        R,                  R/                  [0        R                  U
X5      nU R2                  R5                  [0        R                  [        R                  [        R                  40 5      U R6                  U'   [        R                  " XU5      nUR#                  U5        UR#                  U5        GM     UR9                  U5        U$ s  snf )zbDoes the actual work of adding loop index variables to the
relative index constants or variables.
old_index_var
offset_varoffset_stencil_index)rP   rC  rB   r   rE   rB  r   rO   r   r   r   r   r   r(   r5   rH   r[   rC   r   r   	SliceType_add_offset_to_slicerJ   binopoperatorr+   r   r)   r   )r.   rJ  r;   ry   rV   rW   rK  	out_nodesrL  r7   rR  r  rS  	index_varr#  r$  s                   r   r@  StencilPass._add_index_offsets  s2   
 :#m"4444 J,DE,Dq
1c",DEFFC;<<	
s:'A&MM--- "u -o >!E38::]//0!yy*-)E4A H  .&)J*c**VVE -l ;SB
05

Z__-!yy-2BC)H0: A  .=%00!$,,}/A/A"B$)JJ$8$8: : ||JOO4

BBB 55m8A#O	!!),:u--!$,,z"?$)JJ$8$8: : ||M$6$675::EEE 55j8A#O	!!),u)*@A3HI+0::DLL(x||]0:AJ)-)M)M)1

EJJ7OQS*UDNN:&99ZC@L\*i(c (f 		"u Fs   P1c           	         [        U[        5      (       aO  SR                  UR                  UR                  5      n0 n[        U0 U5        US   nU/n[        R                  4n	O1S nX/nU R                  UR                     n
U
[        R                  4n	U R                  R                  R                  R                  n[        X{U R                  U R                   XR                  U R"                  5      nUR$                  R'                  5       u  p[)        X5        UR*                  S   R,                  R,                  nUR/                  UR*                  S S 5        U$ )NzRdef f(offset):
                return slice({} + offset, {} + offset)
            fc                 N    [        U R                  U-   U R                  U-   5      $ r&   )r   startstop)	old_sliceoffsets     r   r]  +StencilPass._add_offset_to_slice.<locals>.f  s!    Y__v5y~~7NOOr!   r-  )rB   r   formatr_  r`  execr   r   r(   r5   r'   func_idrL   __globals__r   r+   r,   r)   r@   r.  r   rG   rI   r   )r.   r  rS  rY  rV   rW   f_textr]  rQ   arg_typs
slice_type_globalsr0  r]   rd   	new_indexs                   r   rV   StencilPass._add_offset_to_slice  s   i''y	7  CS!CA<D

}HP*Dinn5J"EJJ0H<<'',,88"1#+\\4>>K;;&&(%&JJrN((..	CR)r!   )r*   r)   r-   r'   r,   r(   r+   N)r   
__module____qualname____firstlineno__r/   rp   r{   rY   r   r   r   r@  rV  __static_attributes__r   r!   r   r#   r#   !   s7    <7|"2pd DO*bBHr!   r#   c                 J
   SSK Jn  SSKJn	  SSKJn
  SSKJn  U R                  R                  5       n[        R                  " UR                  5      nXl        [        R                  " UR                  5      nSU;   a  [        S5      eSSKJn	  U	R                  n[!        XX,5      n["        R$                  R'                  SUR(                  5        U" UR(                  R*                  UR(                  R,                  UR(                  R.                  UR(                  R0                  S	5      u  UR(                  l        UR(                  l        UR(                  l        nU
R9                  UR(                  R.                  UR(                  R2                  UR(                  R6                  S
S	UR(                  R0                  UR(                  R4                  [:        R<                  S9  [        R>                  " U[        R@                  " 5       5      n[C        URE                  5       5      n[G        URE                  5       5      n[        RH                  RK                  U5        [:        RL                  S:  a!  [O        S5        [        RP                  " U5        0 nUR(                  R2                  RS                  5        H;  u  nn[T        RV                  " U[Y        U5      U5      nUUU'   UUURZ                  '   M=     [        R\                  " UU5        [:        RL                  S:  a!  [O        S5        [        RP                  " U5        UR(                  R6                  RS                  5        H  u  nnUUU'   M     0 nUR_                  5        GH  nUR`                   GH
  n[c        U[T        Rd                  5      (       d  M%  [c        URf                  [T        Rh                  5      (       d  MP  [:        RL                  S:  aN  [O        SUURf                  Rj                  URf                  RZ                  URf                  Rj                  U;   5        UURf                  Rj                     RZ                  UURf                  RZ                  '   UURf                  Rj                     Ul3        GM     GM"     [:        RL                  S:  a-  [O        SU5        [O        S5        [        RP                  " U5        [        Rl                  " U5        Xl        XRo                  U5      S   U4$ )z'get typed IR from stencil bytecode
    r   )
CPUContext)
cpu_target)type_annotations)type_inference_stager:   z6Cannot use the reserved word 'out' in stencil kernels.zbefore-inferenceNr   )r'   r(   r)   liftedlifted_fromrQ   r   html_outputr<   zInitial stencil_blockszAfter replace_varsrf   rn   zAfter replace arg with arr)8numba.core.cpurs  numba.core.registryrt  numba.core.annotationsru  numba.core.typed_passesrv  	kernel_ircopydeepcopyr@   r   r   r   target_contextDummyPipeliner   rewrite_registryapplystater+   r,   r'   rQ   r(   r   r)   TypeAnnotationr   HTMLadd_offset_to_labels
next_labelr)  r   r   _the_max_labelupdater   r   r   rA   r   r   r   r5   replace_varsvaluesrG   rB   rH   rI   Argr;  remove_delsget_return_type)rk   r+   rQ   rV   rW   rf   r(   r)   rs  rt  ru  rv  stencil_func_irr   r   r,   tpr]   	min_label	max_labelvar_dictrK  typnew_varr3   call_typrn   rd   re   s                                r   rU   rU     s    *.7< ll'')O]]?#9#9:N+001G1GHN ) * 	* /))I	yT	CB##$6ADX
BHH..0@0@
tEABHHbhh*BHH,> ##    (($$XX]]HH((KK $ ! 22>8@8K8K8MONN'')*IN'')*I""9-"&'^, H((""((*3&&a 0#6 # + .(3""#^, ((,,224h"	$ 5 O&&(JJD$		**z$**bff/M/M))Q.,
DJJ4D4D#zz

0@0@J0NP3=djj>N>N3O3T3T

0'

(8(89
  ) "1*+^,(+..t4Q7HHr!   c                       \ rS rSrS rSrg)r  in  c                    SSK Jn  U" 5       U l        XR                  l        X R                  l        X0R                  l        X@R                  l        S U R                  l        S U R                  l        S U R                  l	        g )Nr   )	StateDict)
numba.core.compilerr  r  r+   r,   rQ   r'   r(   r   r)   )r.   r+   r,   rQ   r0  r  s         r   r/   DummyPipeline.__init__o  sY    1[
(

(



!

!

!%

#

r!   )r  N)r   rn  ro  rp  r/   rq  r   r!   r   r  r  n  s    	$r!   r  c                 2    [        [        XU5      nUb  U$ U$ )z
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
)r   _get_const_index_expr_inner)rl   r'   rZ  	const_vals       r   r?  r?  {  s(     #Z)EIr!   c                    [        [        U[        R                  5      5        [	        [
        XU5      nUb  U$ [        R                  " X5      n[	        [        XU5      nUb  U$ [	        [        XU5      nUb  U$ [        e)zOinner constant inference function that calls constant, unary and binary
cases.
)r   rB   r   r   r   _get_const_two_irsr   get_definition_get_const_unary_expr_get_const_binary_exprr   )rl   r'   rZ  	var_const	index_defs        r   r  r    s     Jy"&&)*):	JI''
>IzI?I
Y@I
r!   c                 b    [        [        X5      nUb  U$ [        [        X5      nUb  U$ [        e)zOget constant in either of two IRs if available
otherwise, throw GuardException
)r   r   r   )ir1ir2varr  s       r   r  r    s:     j#+Ij#+I
r!   c                     [        [        U[        R                  5      =(       a    UR                  S:H  5        UR
                  n[        XU5      n[        UR                     n[        SR                  XT5      5      $ )zIevaluate constant unary expr if possible
otherwise, raise GuardException
unaryz{}{})r   rB   r   rJ   rK   rI   r  r   fnevalrd  )rl   r'   r  	inner_varr  rK   s         r   r  r    s\     Jy"''*Fy||w/FGI+JKI	y||	,Bb,--r!   c                 (   [        [        U[        R                  5      =(       a    UR                  S:H  5        [        XUR                  5      n[        XUR                  5      n[        UR                     n[        SR                  X5U5      5      $ )zJevaluate constant binary expr if possible
otherwise, raise GuardException
rW  z{}{}{})r   rB   r   rJ   rK   r  lhsrhsr   r  r  rd  )rl   r'   r  arg1arg2rK   s         r   r  r    si     Jy"''*Fy||w/FG&zIMMJD&zIMMJD	y||	,B$/00r!   )0r  r  r   pytypesrX  r   numpyr   numba.parfors.parforr>   
numba.corer   r   r   r   numba.core.typing.templatesr	   r
   numba.core.typingr   r   r   numba.core.ir_utilsr   r   r   r   r   r   r   r   r   numba.core.errorsr   numba.core.utilsr   numba.npr   r    objectr#   rU   r  r?  r  r  r  r  r   r!   r   <module>r     s           < < F ' %P P P . 2 "r& rhWIr
$F 
$
.
	.1r!   