
    Ǆg                     .   d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlZ	d dl
mZmZmZmZmZ d dlmZmZ d dlmZ d dl
mZmZ d dlmZmZmZmZmZmZmZmZmZ d dl m!Z! d d	l"m#Z# d d
l$m%Z% d Z& G d de'      Z(d Z) G d de'      Z*d Z+d Z,d Z-d Z.d Z/y)    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                     |dkD  r| |z
  S | S Nr    )dim_sizeindex_consts     d/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/numba/stencils/stencilparfor.py_compute_last_indr       s    Q+%%    c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)StencilPassc                 f    || _         || _        || _        || _        || _        || _        || _        y N)func_irtypemap	calltypesarray_analysis	typingctx	targetctxflags)selfr&   r'   r(   r)   r*   r+   r,   s           r   __init__zStencilPass.__init__"   s4    ",""
r!   c                 T    ddl m} t         j                  j                        \  }}g }i }|j                         D ]/  \  }}|D ]%  }t        ||      s|j                  |       |||<   ' 1 |sy j                  j                  j                         D ]	  \  }	}
t        t        t        |
j                                    D ]  \  }}t        |t        j                        rt        |j                  t        j                        r|j                  j                   dk(  r|j                  j"                  j$                  |v rt'        |j                  j(                        }t+        t-        |j                  j.                              D ci c]  }||j                  j.                  |    }}|j                  j.                  }t1         fd|D              }|D ]'  }t        |t2        j4                        st7        d       |j9                  d      }||j                  j"                  j$                     }t;        | j<                  ||
j>                  |
j@                  | jB                   jD                        \  }}}|jF                  j9                  dd      } jI                  |	|||||jJ                  |||	      }|
j                  d |z   |
j                  |d	z   d z   |
_        -t        |t        j                        sIt        |j                  t        j                        so|j                  j                   dk(  stM        tN         j                  |j                        d
k(  st        jP                  d|j@                        |_          yc c}w )zP Finds all calls to StencilFuncs in the IR and converts them to parfor.
        r   )StencilFuncNcallc              3   P   K   | ]  }j                   |j                       y wr%   )r'   name).0ir-   s     r   	<genexpr>z"StencilPass.run.<locals>.<genexpr>L   s     'NQVV(<'Ns   #&zITuple parameters not supported for stencil kernels in parallel=True mode.outindex_offsets   )stencilnumba))numba.stencils.stencilr0   r   r&   blocksitems
isinstanceappendreversedlist	enumeratebodyr   AssignvalueExpropfuncr3   dictkwsrangelenargstupler   	BaseTuple
ValueErrorgetget_stencil_irr*   scopelocr'   r(   options_mk_stencil_parfortargetr   r   Const)r-   r0   
call_table_stencil_callsstencil_dictcall_varname	call_listone_calllabelblockr5   stmtrK   
input_dictin_argsarg_typemaparg_typeout_arrsf
stencil_irrtarg_to_arr_dictr8   	gen_nodess   `                        r   runzStencilPass.run,   s    	7 't||':':;
A'1'7'7'9 	:#L)% :h4!((619L.	:	:  !LL//557 '	7LE5#D5::)>$?@ &74tRYY/&tzz277; JJMMV3 JJOO00MAtzz~~.C 5:#djjoo:N4O"QA!TZZ__Q%7"7 "QJ "Q"jjooG"''Ng'N"NK$/ N%h@", .M #N NN
 "ggenG &djjoo&:&:;B6DR NNK!KKJ LL$..7:3JO %'JJNN?D$IM $ 7 7w&t{{B+!-I "'BQ)!;ejj1>N!NEJ ryy1&tzz277; JJMMV3!-tzzJ';< "$!TXX!6DJM&7'	7"Qs   !N%c           	         |j                         D ],  \  }}|j                  }|j                  }g }|j                  D ]  }	t	        |	t
        j                        r|j                         }
t	        |
t
        j                        r=t	        |
j                  t
        j                        r|
j                  j                  dk(  sJ |j                  t        j                  |
j                  j                  ||             |j                  t        j                  ||             |j                  |	        ||_        / y)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)r>   rT   rU   rD   r?   r   ReturnpoprE   rF   rG   rH   r@   Jump)r-   r=   exit_value_varparfor_body_exit_labelra   rb   rT   rU   new_bodyrc   	prev_stmts              r   replace_return_with_setitemz'StencilPass.replace_return_with_setitemh   s     #LLN 	"LE5KKE))CH

 *dBII. (I&y"))<&y@%OO..&8: 9 OOBIIioo.C.C^UX$YZOOBGG,BC$HIOOD)* "EJ!	"r!   c
                 $   ST g }
|j                   }t        j                  dk\  r't        d||||||       t	        j
                  |       |d   } j                  |j                     }t	        j                  | j                        \  }}t	        j                  |      }t	        j                  ||| j                   j                         t        j                  dk\  r t        d       t	        j
                  |       t	        j                  | j                  j                  | j                         t        j                  dk\  r t        d       t	        j
                  |        j                  |j                     j                  S|j                   }|j"                  }g }t%        S      D ]Z  }t'        j(                  |t+        d      |      }t,        j.                   j                  |j                  <   |j1                  |       \  j3                  ||||||	      \  }}t        j                  dk\  r8t        d       t        d|       t        d	|       t	        j
                  |       g } j4                  j7                  |      }|j9                  |      }St;        |      k(  sJ g }g }t%        S      D ]  } j=                  ||   ||   |
||      } j?                  ||   |
||      }|j1                  |       |j1                  |       |j1                  t@        jB                  jD                  jG                  ||   ||d              tI        |jK                               dz   }t'        jL                  ||      ||<   t'        j(                  |t+        d
      |      } |jN                   j                  | j                  <   g }!Sdk(  r|d   }"nt'        j(                  |t+        d      |      }"t,        jP                  jS                  t,        j.                  S       j                  |"j                  <   t&        jT                  jW                  ||      }#t'        jX                  |#|"|      }$|!j1                  |$       t        j                  dk\  r t        d       t	        j
                  |       t'        jL                  ||      }%t j                  |j                     }t	        j*                  d      }&t'        j(                  ||&|      }'t&        jT                  j[                  |d|      }(t,        jP                  jS                  t,        j.                  |j                         j                  |&<   |%j\                  j_                  t'        jX                  |(|'|      g       t	        j*                  d      })t'        j(                  ||)|      Td|j`                  v rq|j`                  d   }*tb        jd                  je                  |*      }+ jf                  ji                  |+|jN                        stk        d      |jO                  |*      },n|jO                  d      },t'        jl                  |,|      }-|jN                   j                  |)<   |%j\                  j_                  t'        jX                  |-T|      g       t	        j*                  d      }.t'        j(                  ||.|      t@        jn                  j,                  jp                  js                  |jN                  |j                  |jt                         j                  j                  <   t'        j(                  |t+        d      |      }/t,        jv                  jy                  tz               j                  |/j                  <   t'        j|                  dtz        |      }0t'        jX                  |0|/|      }1|%j\                  j1                  |1       t        j                  |jN                        j                  j                  }2|2dk(  rd}2t&        jT                  j[                  |/|2|      }3t'        j(                  |t+        d      |      }4t,        j                  j                  |jN                         j                  |4j                  <   t'        jX                  |3|4|      }5|%j\                  j1                  |5       t	        j                  dtz        j                  |'|4g jf                   j                   j                        }6t'        j(                  |t+        d      |      }7t'        jX                  t'        jl                  d|      |7|      }8|6j1                  |8       t,        j                   j                  |7j                  <   t'        j(                  |t+        d      |      }9t'        jX                  t'        jl                  d|      |9|      }:|6j1                  |:       t,        j.                   j                  |9j                  <   t'        j(                  |t+        d      |      }; jf                  j                  t              }<|< j                  |;j                  <   t'        j|                  dt        |      }=t'        jX                  |=|;|      }>|6j1                  |>        jf                  j                  |<t,        j                  fdz  i       }?t&        jT                  j                  |;|7|7fd|       }@|? j                  |@<   t'        j(                  |t+        d!      |      }At,        j                   j                  |Aj                  <   t'        jX                  |@|A|      }>|6j1                  |>       S Tfd"}Bt%        |j                        D ]G  }CAg|j                  z  }D|Ag|j                  z  }E B|<|C|||;|6||D|9d#
        |B|<|C|||;|6||E||C   d$
       I |j                  |       |%j\                  j_                  |6       nAd|j`                  v r2|j`                  d   }*tb        jd                  je                  |*      }+ jf                  ji                  |+|jN                        sd}Ft        |F      t'        j(                  |t+        d%      |      }A jf                  j                  t              }<|< j                  |Aj                  <   t'        j|                  dt        |      }=t'        jX                  |=|A|      }G|%j\                  j1                  |G        jf                  j                  |<t,        j                  fdz  i       }?t&        jT                  j                  |Add|       }H|? j                  |H<   t'        j(                  |t+        d&      |      }It,        j                   j                  |Ij                  <   t'        jX                  |H|I|      }>|%j\                  j1                  |>       t'        jl                  |jO                  |*      |      }Jt'        j(                  |t+        d'      |      }K|jN                   j                  |Kj                  <   t'        jX                  |J|K|      }L|%j\                  j1                  |L       t'        j                  t        dd      |I|K|      }M|%j\                  j1                  |M       t        t,        j                   j                  j                      j                  |Ij                      j                  j                     jN                        }?|? j                  |M<    j                  || |       t        j                  dk\  r t        d(       t	        j
                  |       t'        j                  |"| |      }Nt        t,        j                   j                  j                      j                  |"j                      j                  j                     jN                         j                  |N<   ||   j\                  j_                  |!       ||   j\                  j1                  |N       t'        j                  d)d*      }Ot'        j(                  |t+        d'      |O      }Pt'        jX                  t'        jl                  d|O+      |P|O      }L||   j\                  j1                  |L       ||   j\                  j1                  t'        j                  |P|O             t	        j                  |      }|tI        |jK                                  j\                  j                          t        j                  dk\  r t        d,       t	        j
                  |       d-||gf}Qt@        jB                  jD                  j                  ||%|||"||Q j                        }R|
j1                  |R       |
j1                  t'        jX                  ||             |
S ).z> Converts a set of stencil kernel blocks to a parfor.
        r9   rW   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   rI   rN   rK   rU   $slicec
                     j                   j                  | t        j                  fdz  i       }
||   }t	        |t
        t        j                  f      sJ t        j                  |t        d      |      }t        j                  j                  |j                  <   t	        |t
              r,t        j                  t        j                  ||      ||      }nt        j                  |||      }|j                  |       t        j                  j                  ||	r||fn||fd|      }|
j                   |<   t        j                  |t        d      |      }t        j"                  j                  |j                  <   t        j                  |||      }|j                  |       |||<   t        j                  |t        d      |      }t        j$                  j'                  t        j"                        j                  |j                  <   t        j                  j)                  ||      }t        j                  |||      }|j                  |       t        j*                  ||      }t-        t        j.                  j                  j                     j                  |j                     j                  j                     j0                        j                   |<   |j                  |       y )Nr   z$border_indr   r   r   z$border_index_tuple_var)r*   resolve_function_typer   intpr?   intr   Varr   r'   r3   rE   rY   r@   rG   r1   r(   slice2_type
containersUniTuplebuild_tupleSetItemr   nonedtype)slice_fn_tydimrT   rU   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ndimsrh   r-   zero_vars                        r   handle_borderz5StencilPass._mk_stencil_parfor.<locals>.handle_borderA  sV    nn::ZZMA% !%!"sBFFm454}]'CSI,1JJV[[)b#& "		"((2s*;VS II "		"fc :IY'!#'0;)V,&)AT	 ". "
 25~.#%66%x1H##N 6;6G6G-223!yy9I3O\**:"3'!#}-0/03"5494D4D4M4M%%u5.^001WW001CS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)rU   z#stencil_blocks after adding SetItemr:   )Yr=   r   DEBUG_ARRAY_OPTprintr   dump_blocksr'   r3   copy_propagateget_name_var_tableapply_copy_propagater(   remove_deadr&   	arg_namesndimrT   rU   rL   r   r   r   r   r   r@   _replace_stencil_accessesr)   get_equiv_set	get_shaperM   _get_stencil_last_ind_get_stencil_start_indr;   parforsparforLoopNestmaxkeysBlockr   r   r   rG   r   rE   getattrrD   extendrV   r   typeofr*   can_convertrQ   rY   corenpytypesArraylayoutmiscModuler   Globalr   as_dtypetype__name__	functionsNumberClassgen_np_callr   r   resolve_value_typer   r   r1   r   insert_equivr   StaticSetItemr   rx   r   Locrq   simplify_CFGrr   Parforr,   )Ur-   ra   re   rh   rj   r8   rX   return_typestencil_funcrl   rm   stencil_blocksin_arr
in_arr_typin_cpsout_cpsname_var_tablerT   rU   parfor_varsr5   
parfor_varstart_lengthsend_lengths	loopnests	equiv_setin_arr_dim_sizes
start_inds	last_indslast_ind	start_indru   rt   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   rW   zStencilPass._mk_stencil_parfor   s   
 	#**!!Q&&w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g}l&"{ !!Q&AB"M2.+.  0 	''55e<	$..v6,----
	u 		9A112B12E(3A	5#OH33(5a(8)UCQIi(X&U]]11::;q> )8Q8 9		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$%TUU#))$/#))!,%-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+p Z__- %%.K*//$A!$-;#@ k!#!,#(/,"	$ k!#!,#'..s3#	%%8 ""7,<=OO""5)---#++F3 --..t4~~11';;L;L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                    |}|dk7  r@t        j                  |t        d      |      }t        j                  | j
                  |j                  <   t        |t        j                        r,t        j                  t        j                  ||      ||      }nt        j                  |||      }|j                  |       t        j                  |t        d      |      }t        j                  | j
                  |j                  <   t        j                  |t        d      |      }	t        j                  t              }
t        j                   j#                  |
      }|| j
                  |	j                  <   t        j$                  d|
|      }t        j                  ||	|      }|j                  |       t         j&                  j)                  |	||gd|      }|j+                  | j,                  t        j                  t        j                  gi       | j.                  |<   t        j                  |||      }|j                  |       |S )Nr   stencil_const_varr   compute_last_ind_varr    r   )r   r   r   r   r   r'   r3   r?   numbersNumberrE   rY   r@   r;   njitr    r   
Dispatcherr   rG   r1   get_call_typer*   r(   )r-   r   
end_lengthrm   rT   rU   r   r   const_assigng_var
check_funcfunc_typg_objg_assign
index_callindex_assigns                   r   r   z!StencilPass._get_stencil_last_ind  s   ? &&6I(JHKMK-2ZZDLL))**gnn5!yy*c)B8CS J  "yy[#F\*vve]:%>DH*/**DLL'FF5-0F"GME$56J11*=H'/DLL$II1:sCEyys3HX&eh-Db#NJ)1)?)?UZZ 8"*>DNN:&99Z3?L\*r!   c           	         t        |t              rt        t        |d            S d }t	        |i | j
                  | j                  t        j                  f| j                  | j                        }t        |j                        dk(  sJ |j                  j                         d   }t        ||g       ||j                  d d z  }|j                  d   j                   j                   }|S )Nr   c                 ,    t        t        | d            S r   )absmin)s_lengths    r   get_start_indz9StencilPass._get_stencil_start_ind.<locals>.get_start_ind  s    s8Q'((r!   r9   )r?   r   r!  r"  r   r*   r+   r   r   r'   r(   rM   r=   popitemr   rD   rF   )	r-   start_lengthrm   rT   rU   r$  f_irrb   ret_vars	            r   r   z"StencilPass._get_stencil_start_ind  s    lC(s<+,,	)"="dnn#'>>EJJ=$,,#'>>3 4;;1$$$##%a(%,0UZZ_$	**R.&&,,r!   c                    |j                   }|d   }|D 	cg c]  }	|	j                   }
}	d|j                  v rC|j                  d   D ]  }	|	|vst        d       |j                  d   D 	cg c]  }	||	   	 }}	ng }|j                  |v rt        d      | j                  |j                     j
                  }|j                  }|j                  }|j                  du }|r|dgz  }|dgz  }n8|j                  D 	cg c]  }	|	d   	 }}	|j                  D 	cg c]  }	|	d   	 }}	t        j                  |      }d}|j                         D ]  \  }}g }|j                  D ]  }t        |t        j                        r^t        |j                   t        j"                        r:|j                   j$                  dv r"|j                   j                   j                  |
v sLt        |t        j&                        st        |t        j(                        r#|j*                  j                  |
v rt        d	      t        |t        j                        rt        |j                   t        j"                        r|j                   j$                  d
v r|j                   j                   j                  |
v rb|j                   j                   j                  |vr?|j                   j,                  }|dk(  r|g}n)t/        |d      r|j                  |v r||j                     }t        j0                  |      |_        |D cg c]  }t5        || j6                  |       }}|r| j9                  |t;        |      |||      }|rt        |t        j<                        s(t?        |D cg c]  }t        |t@                c}      rt        d      t;        tC        tD        ||            }t;        tC        tF        ||            }d}| j9                  |t;        |      |||      }|dk(  r|d   }nt        j<                  |tI        d      |      }tJ        jL                  jO                  tJ        jP                  |      | j                  |j                  <   t        j"                  jS                  ||      }t        j                  |||      }|jU                  |       tW        |D cg c],  }| j                  |j                     tJ        jP                  k(  . c}      r8| j                  |j                   j                   j                     jX                  }n-| j                  |j                   j                   j                     }t        j"                  j[                  |j                   j                   ||      }t]        || j                  |j                   j                   j                     | j                  |j                           | j^                  |<   ||_        |jU                  |        ||_         |r|st        d      ||fS c c}	w c c}	w c c}	w c c}	w c c}w c c}w c c}w )z Convert relative indexing in the stencil kernel to standard indexing
            by adding the loop index variables to the corresponding dimensions
            of the array index tuples.
        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.Nr9   F)setitemstatic_setitemz?Assignments to arrays passed to stencil kernels is not allowed.)static_getitemgetitemr3   z<Variable stencil index only possible with known neighborhoodTz$parfor_index_ind_varz=Stencil kernel with no accesses to relatively indexed arrays.)0r=   r3   rV   rQ   r'   r   rT   rU   neighborhoodr   get_tuple_tabler>   rD   r?   r   rE   rF   rG   rH   r   r   rX   indexhasattrbuild_definitions_definitions_get_const_index_exprr&   _add_index_offsetsrB   r   anyr   mapr"  r   r   r   r   r   r   r   r@   allr   r/  r   r(   ) r-   rj   r   re   r8   r   rl   r   r   xin_arg_namesstandard_indexedr   rT   rU   need_to_calc_kernelr   r   tuple_tablefound_relative_indexra   rb   rv   rc   
index_listv
index_varsind_varr   r   getitem_return_typgetitem_calls                                    r   r   z%StencilPass._replace_stencil_accesses#  s    $**(/0100,"6"66!))*=> NO+$ &M N NN
 &2%9%9:M%N Pq 2  P  P  ";;** < = = V[[)..jj*774? !1#IM)K+7+D+DEaQqTEME+7+D+DEaQqTEKE ..~>$ +002 W	"LE5H

 S&bii0&tzz277; JJMM-JJ JJ,,11\Abjj1b&6&67 KK,,<$%fgg tRYY/&tzz277; JJMM-JJ JJ,,11\A JJ,,119II!%!1!1Jz&0\
":v6:??k;Y)4Z__)EJ /7.H.H.XJ+>H"J9: #8"DLL!#5 "JJ "J$%)%<%<Z$($75#&O
 + 'z266: LAZ3%7!7 LM", .C #D D(,SmDN.P )Q&*3sK+L&M/3, "&!8!8 $Z 0(E3"HJ z",Q-"$&&31569#;5:5E5E5N5N!JJ6/W\\2%'WW%8%8S%I
')yyWc'J 5 AKM<= !LL0EJJ> M N-1\\48JJ4D4D4I4I.KKP5 + .2\\$**:J:J:O:O-P*#%77??4::3C3CWLO$QL3<*TZZ%5%5%:%:;W\\244DNN<0 ".DJ%gS&h "EJoW	"p '; - . . k))G 1 P. FET"J !M2Ms)   Y-Y
=YY;Y Y1Y#c           	         t        |      t        |      k(  sJ t        ||z   D cg c]  }t        |t               c}      rt	        t        t        ||            S g }g }t        t        |            D ]}  }	||	   }
t        |
t              rt        j                  |t        d      |      }
t        j                  | j                  |
j                  <   t        j                  t        j                   ||	   |      |
|      }|j#                  |       ||	   }t        |t              rt        j                  |t        d      |      }t        j                  | j                  |j                  <   t        j                  t        j                   ||	   |      ||      }|j#                  |       t        |
t$              s;t        | j                  |
j                     t        j&                  j(                        rT| j                  |j                     t        j                  k(  sJ | j+                  |
||||      }|j#                  |       t        |t$              s;t        | j                  |j                     t        j&                  j(                        rT| j                  |
j                     t        j                  k(  sJ | j+                  ||
|||      }|j#                  |       xt        j                  |t        d      |      }t        j                  | j                  |j                  <   t        j,                  j/                  t0        j                  |
||      }| j2                  j5                  t0        j                  t        j                  t        j                  fi       | j6                  |<   t        j                  |||      }|j#                  |       |j#                  |        |j9                  |       |S c c}w )zw Does the actual work of adding loop index variables to the
            relative index constants or variables.
        old_index_var
offset_varoffset_stencil_index)rM   r:  r?   r   rB   r9  r   rL   r   r   r   r   r   r'   r3   rE   rY   r@   r   r   	SliceType_add_offset_to_slicerG   binopoperatorr*   r   r(   r   )r-   rA  r8   rv   rT   rU   rB  	out_nodesrC  r5   rH  r  rI  	index_varr  r  s                   r   r7  zStencilPass._add_index_offsets  s4   
 :#m"4444 J},DEq
1c"EFC];<<	
s:' 1	)A&qMM-- "u -o >!E38::]//0!yy*Q-)E4A3 H  .&q)J*c*VVE -l ;SB
05

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

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

EJJ7OQS*UDNN:&99ZC@L\*i(c1	)f 		"u Fs   P
c           	         t        |t              rOdj                  |j                  |j                        }i }t        |i |       |d   }|g}t        j                  f}	n2d }||g}| j                  |j                     }
|
t        j                  f}	| j                  j                  j                  j                  }t        ||| j                  | j                   |	| j                  | j"                        }|j$                  j'                         \  }}t)        ||       |j*                  d   j,                  j,                  }|j/                  |j*                  d d        |S )NzRdef f(offset):
                return slice({} + offset, {} + offset)
            fc                 N    t        | j                  |z   | j                  |z         S r%   )r   startstop)	old_sliceoffsets     r   rR  z+StencilPass._add_offset_to_slice.<locals>.f   s!    Y__v5y~~7NOOr!   r%  )r?   r   formatrT  rU  execr   r   r'   r3   r&   func_idrI   __globals__r   r*   r+   r(   r=   r&  r   rD   rF   r   )r-   r   rI  rO  rT   rU   f_textrR  rN   arg_typs
slice_type_globalsr(  r[   rb   	new_indexs                   r   rL  z StencilPass._add_offset_to_slice  s$   i'y	7  CS!CA<D

}HPz*Dinn5J"EJJ0H<<'',,88"1h#+T\\4>>K;;&&(5%&JJrN((..	CR)r!   N)r   
__module____qualname__r.   rn   rx   rW   r   r   r   r7  rL  r   r!   r   r#   r#   !   s7    :7x"2ob DK*ZBHr!   r#   c           
      
   ddl m} ddlm}	 ddlm}
 ddlm} | j                  j                         }t        j                  |j                        }||_        t        j                  |j                        }d|v rt        d      ddlm}	 |	j                  }t!        ||||      }t"        j$                  j'                  d|j(                          ||j(                  j*                  |j(                  j,                  |j(                  j.                  |j(                  j0                  d	      \  |j(                  _        |j(                  _        |j(                  _        }|
j9                  |j(                  j.                  |j(                  j2                  |j(                  j6                  d
d	|j(                  j0                  |j(                  j4                  t:        j<                         t        j>                  |t        j@                               }tC        |jE                               }tG        |jE                               }t        jH                  jK                  |       t:        jL                  dk\  r tO        d       t        jP                  |       i }|j(                  j2                  jS                         D ]9  \  }}tU        jV                  |tY        |      |      }|||<   |||jZ                  <   ; t        j\                  ||       t:        jL                  dk\  r tO        d       t        jP                  |       |j(                  j6                  jS                         D ]
  \  }}|||<    i }|j_                         D ]  }|j`                  D ]  }tc        |tT        jd                        stc        |jf                  tT        jh                        sCt:        jL                  dk\  rMtO        d||jf                  jj                  |jf                  jZ                  |jf                  jj                  |v        ||jf                  jj                     jZ                  ||jf                  jZ                  <   ||jf                  jj                     |_3          t:        jL                  dk\  r,tO        d|       tO        d       t        jP                  |       t        jl                  |       ||_        || jo                  |      d   |fS )z'get typed IR from stencil bytecode
    r   )
CPUContext)
cpu_target)type_annotations)type_inference_stager7   z6Cannot use the reserved word 'out' in stencil kernels.zbefore-inferenceNr   )r&   r'   r(   liftedlifted_fromrN   r   html_outputr9   zInitial stencil_blockszAfter replace_varsrd   rl   zAfter replace arg with arr)8numba.core.cpurd  numba.core.registryre  numba.core.annotationsrf  numba.core.typed_passesrg  	kernel_ircopydeepcopyr=   r   r   rQ   target_contextDummyPipeliner   rewrite_registryapplystater*   r+   r&   rN   r'   r   r(   TypeAnnotationr   HTMLadd_offset_to_labels
next_labelr"  r   r   _the_max_labelupdater   r   r   r>   r   r   r   r3   replace_varsvaluesrD   r?   rE   rF   Argr2  remove_delsget_return_type)ri   r*   rN   rT   rU   rd   r'   r(   rd  re  rf  rg  stencil_func_irr   r   r+   tpr[   	min_label	max_labelvar_dictrB  typnew_varr1   call_typrl   rb   rc   s                                r   rS   rS     s    *.7< ll'')O]]?#9#9:N+O001G1GHNQRR /))I	y)T?	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"	$# O&&( :JJ 	:D$		*z$**bff/M))Q.,
DJJ4D4D#zz

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

0'

(8(89
	:: "1*+^,(+OB..t4Q7HHr!   c                       e Zd Zd Zy)rs  c                    ddl m}  |       | _        || j                  _        || j                  _        || j                  _        || j                  _        d | j                  _        d | j                  _        d | j                  _	        y )Nr   )	StateDict)
numba.core.compilerr  rv  r*   r+   rN   r&   r'   r   r(   )r-   r*   r+   rN   r(  r  s         r   r.   zDummyPipeline.__init__g  sa    1[
(

(



!

!

!%

#

r!   N)r   ra  rb  r.   r   r!   r   rs  rs  f  s    	$r!   rs  c                 2    t        t        | ||      }||S |S )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)rj   r&   rP  	const_vals       r   r6  r6  s  s*     #Z)EIr!   c                    t        t        |t        j                               t	        t
        | ||      }||S t        j                  | |      }t	        t        | ||      }||S t	        t        | ||      }||S t        )zWinner constant inference function that calls constant, unary and binary
    cases.
    )r   r?   r   r   r   _get_const_two_irsr   get_definition_get_const_unary_expr_get_const_binary_exprr   )rj   r&   rP  	var_const	index_defs        r   r  r    s     Jy"&&)*):w	JI''
I>Iz7I?I
GY@I
r!   c                 b    t        t        | |      }||S t        t        ||      }||S t        )zWget constant in either of two IRs if available
    otherwise, throw GuardException
    )r   r   r   )ir1ir2varr  s       r   r  r    s>     j#s+Ij#s+I
r!   c                     t        t        |t        j                        xr |j                  dk(         |j
                  }t        | ||      }t        |j                     }t        dj                  ||            S )zQevaluate constant unary expr if possible
    otherwise, raise GuardException
    unaryz{}{})r   r?   r   rG   rH   rF   r  r   fnevalrX  )rj   r&   r  	inner_varr  rH   s         r   r  r    s`     Jy"''*Fy||w/FGI+JKI	y||	,Bb),--r!   c                 $   t        t        |t        j                        xr |j                  dk(         t        | ||j                        }t        | ||j                        }t        |j                     }t        dj                  |||            S )zRevaluate constant binary expr if possible
    otherwise, raise GuardException
    rM  z{}{}{})r   r?   r   rG   rH   r  lhsrhsr   r  r  rX  )rj   r&   r  arg1arg2rH   s         r   r  r    so     Jy"''*Fy||w/FG&z7IMMJD&z7IMMJD	y||	,Bb$/00r!   )0r  rp  r   pytypesrN  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#   rS   rs  r6  r  r  r  r  r   r!   r   <module>r     s           < < F ' %P P P . 2 "k& kZVIp
$F 
$
.
	.1r!   