
    J/Ph                     <   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/dS )    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k    r| |z
  S | S Nr    )dim_sizeindex_consts     \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/stencils/stencilparfor.py_compute_last_indr       s    Q+%%    c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )StencilPassc                 h    || _         || _        || _        || _        || _        || _        || _        d S N)func_irtypemap	calltypesarray_analysis	typingctx	targetctxflags)selfr&   r'   r(   r)   r*   r+   r,   s           r   __init__zStencilPass.__init__"   s8    ",""


r!   c                 P    ddl m} t           j        j                  \  }}g }i }|                                D ]4\  }}|D ],}t          ||          r|                    |           |||<   -5|sdS  j        j                                        D ]\  }	}
t          t          t          |
j                                      D ]Z\  }t          t          j                  rt          j        t          j                  rj        j        dk    r|j        j        j        |v rht'          j        j                  }fdt+          t-          j        j                            D             }j        j        }t1           fd|D                       }|D ]+}t          |t2          j                  rt7          d          ,|                    d          }|j        j        j                 }t;          | j        ||
j        |
j         | j!         j"                  \  }}}|j#                            d	d          } $                    |	||||j%        |||	  	        }|
j        d|         |z   |
j        |d
z   d         z   |
_        t          t          j                  rrt          j        t          j                  rSj        j        dk    rCtM          tN           j        j                  dk    rt          j(        dj                   _        \dS )zP Finds all calls to StencilFuncs in the IR and converts them to parfor.
        r   )StencilFuncNcallc                 6    i | ]}|j         j        |         S r   )valueargs).0istmts     r   
<dictcomp>z#StencilPass.run.<locals>.<dictcomp>I   s6     "Q "Q "QA!TZ_Q%7 "Q "Q "Qr!   c              3   <   K   | ]}j         |j                 V  d S r%   )r'   name)r5   r6   r-   s     r   	<genexpr>z"StencilPass.run.<locals>.<genexpr>L   s,      'N'NQV(<'N'N'N'N'N'Nr!   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   Assignr3   Expropfuncr:   dictkwsrangelenr4   tupler   	BaseTupler   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blockr6   rO   
input_dictin_argsarg_typemaparg_typeout_arrsf
stencil_irrtarg_to_arr_dictr=   	gen_nodesr7   s   `                       @r   runzStencilPass.run,   sR    	766666 't|':;;
A'1'7'7'9'9 	: 	:#L)% : :h44 :!((66619L.	:
  	F !L/5577 )	7 )	7LE5#D5:)>)>$?$?@@ (7 (74tRY// &7&tz27;;&7 JMV33 JO0MAAtz~..C"Q "Q "Q "Q49#djo:N:N4O4O"Q "Q "QJ"joG"''N'N'N'Ng'N'N'N"N"NK$/ ; ;%h@@ ;"1 3: #; #; ;; "ggennG &djo&:;B6DR NK!KJ L$.7: 7:3JO %'JNN?D$I$IM $ 7 7w&t{B+!- !-I "'BQB)!;ej1>N!NEJJ ry11 7&tz27;;7 JMV33!-tzJJ';< < "$!TX!6!6DJQ(7)	7 )	7r!   c           	      T   |                                 D ]\  }}|j        }|j        }g }|j        D ]}	t	          |	t
          j                  r|                                }
t	          |
t
          j                  r/t	          |
j	        t
          j
                  r|
j	        j        dk    sJ |                    t          j        |
j	        j	        ||                     |                    t          j        ||                     |                    |	           ||_        d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.
        castN)rC   rV   rW   rI   rD   r   ReturnpoprJ   r3   rK   rL   rE   Jump)r-   rB   exit_value_varparfor_body_exit_labelrc   rd   rV   rW   new_bodyr7   	prev_stmts              r   replace_return_with_setitemz'StencilPass.replace_return_with_setitemj   s    #LLNN 	" 	"LE5KE)CH
 * *dBI.. 
* (I&y")<< :&y@@:%O.&8888OOBIio.C^UX$Y$YZZZOOBG,BC$H$HIIIIOOD))))!EJJ!	" 	"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 ]S}t'          j        |t+          d          |          }t,          j         j        |j        <   |                    |           T                     ||||||	          \  }}t          j        dk    rCt          d           t          d|           t          d	|           t	          j        |           g } j                            |          }|                    |          }St;          |          k    sJ g }g }t%          S          D ]}                     ||         ||         |
||          }                     ||         |
||          }|                    |           |                    |           |                    t@          j!        j"        #                    ||         ||d                     tI          |%                                          dz   }t'          j&        ||          ||<   t'          j        |t+          d
          |          } |j'         j        | j        <   g }!Sdk    r	|d         }"nt'          j        |t+          d          |          }"t,          j(        )                    t,          j        S           j        |"j        <   t&          j*        +                    ||          }#t'          j,        |#|"|          }$|!                    |$           t          j        dk    r#t          d           t	          j        |           t'          j&        ||          }%ĉ j        |j                 }t	          j        d          }&t'          j        ||&|          }'t&          j*        -                    |d|          }(t,          j(        )                    t,          j        |j                   j        |&<   |%j.        /                    t'          j,        |(|'|          g           t	          j        d          })t'          j        ||)|          Td|j0        v rq|j0        d         }*tb          j2        2                    |*          }+ j3        4                    |+|j'                  stk          d          |'                    |*          },n|'                    d          },t'          j6        |,|          }-|j'         j        |)<   |%j.        /                    t'          j,        |-T|          g           t	          j        d          }.t'          j        ||.|          t@          j7        j        j8        9                    |j'        |j        |j:                   j        j        <   t'          j        |t+          d          |          }/t,          j;        <                    tz                     j        |/j        <   t'          j>        dtz          |          }0t'          j,        |0|/|          }1|%j.                            |1           t          j@        |j'                  jA        jB        }2|2dk    rd}2t&          j*        -                    |/|2|          }3t'          j        |t+          d          |          }4t,          jC        D                    |j'                   j        |4j        <   t'          j,        |3|4|          }5|%j.                            |5           t	          jE        dtz          jF        |'|4g j3         j         j                  }6t'          j        |t+          d          |          }7t'          j,        t'          j6        d|          |7|          }8|6                    |8           t,          jG         j        |7j        <   t'          j        |t+          d          |          }9t'          j,        t'          j6        d|          |9|          }:|6                    |:           t,          j         j        |9j        <   t'          j        |t+          d          |          }; j3        H                    t                    }<|< j        |;j        <   t'          j>        dt          |          }=t'          j,        |=|;|          }>|6                    |>            j3        J                    |<t,          jG        fdz  i           }?t&          j*        K                    |;|7|7fd|           }@|? j        |@<   t'          j        |t+          d!          |          }At,          jL         j        |Aj        <   t'          j,        |@|A|          }>|6                    |>           S Tfd"}Bt%          |j                  D ]F}C|Ag|j        z  }D|Ag|j        z  }E |B|<|C|||;|6||D|9d#
  
          |B|<|C|||;|6||E||C         d$
  
         G|M                    |           |%j.        /                    |6           nd|j0        v r|j0        d         }*tb          j2        2                    |*          }+ j3        4                    |+|j'                  sd}Ftk          |F          t'          j        |t+          d%          |          }A j3        H                    t                    }<|< j        |Aj        <   t'          j>        dt          |          }=t'          j,        |=|A|          }G|%j.                            |G            j3        J                    |<t,          jG        fdz  i           }?t&          j*        K                    |Add|           }H|? j        |H<   t'          j        |t+          d&          |          }It,          jL         j        |Ij        <   t'          j,        |H|I|          }>|%j.                            |>           t'          j6        |'                    |*          |          }Jt'          j        |t+          d'          |          }K|j'         j        |Kj        <   t'          j,        |J|K|          }L|%j.                            |L           t'          jN        t          dd          |I|K|          }M|%j.                            |M           t          t,          jG         j        j                  j        |Ij                  j        j                 j'                  }?|? j        |M<    P                    || |           t          j        dk    r#t          d(           t	          j        |           t'          jQ        |"| |          }Nt          t,          jG         j        j                  j        |"j                  j        j                 j'                   j        |N<   ||         j.        /                    |!           ||         j.                            |N           t'          jR        d)d*          }Ot'          j        |t+          d'          |O          }Pt'          j,        t'          j6        d|O+          |P|O          }L||         j.                            |L           ||         j.                            t'          jS        |P|O                     t	          jT        |          }|tI          |%                                                   j.        U                                 t          j        dk    r#t          d,           t	          j        |           d-||gf}Qt@          j!        j"        V                    ||%|||"||Q jW                  }R|
                    |R           |
                    t'          j,        ||                     |
S ).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   rM   r4   rO   rW   $slicec
                    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        |||          }|                    |           t          j                            ||	r||fn||fd|          }|
j        |<   t          j        |t          d          |          }t          j        j	        |j
        <   t          j        |||          }|                    |           |||<   t          j        |t          d          |          }t          j                            t          j                  j	        |j
        <   t          j                            ||          }t          j        |||          }|                    |           t          j        ||          }t-          t          j        j	        j
                 j	        |j
                 j	        j
                 j                  j        |<   |                    |           d S )Nr   z$border_indr   r   r   z$border_index_tuple_var)r*   resolve_function_typer   intprD   intr   Varr   r'   r:   rJ   r[   rE   rK   r1   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ndimsri   r-   zero_vars                        r   handle_borderz5StencilPass._mk_stencil_parfor.<locals>.handle_borderD  s~    n::ZMA%  !%!"sBFm44555}]'C'CSII,1JV[)b#&& ; "	"(2s*;*;VS I III "	"fc : :IY'''!#'0;T)V,,&)AT	 ". " "
 25~.#%6%x1H1H##N#N 6;6G-23!y9I3OO\****:"3'!#}-0/ 0/03"5 "5494D4M4M%u5. 5.^01W001CSII
!y^SII\***!z'>8SQQ/805
DL<V04^=P0Q04W\0J0P02 02|,
 \*****r!   TFz	$py_g_varz$slice_instz$cval_constz%stencil_blocks after replacing returnstencilparfor_dummy)rW   z#stencil_blocks after adding SetItemr?   )XrB   r   DEBUG_ARRAY_OPTprintr   dump_blocksr'   r:   copy_propagateget_name_var_tableapply_copy_propagater(   remove_deadr&   	arg_namesndimrV   rW   rP   r   r   r   r   r   rE   _replace_stencil_accessesr)   get_equiv_set	get_shaperQ   _get_stencil_last_ind_get_stencil_start_indr@   parforsparforLoopNestmaxkeysBlockr   r   r   rK   r   rJ   getattrrI   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   r1   r   insert_equivStaticSetItemr   ry   r   Locrr   simplify_CFGrs   Parforr,   )Ur-   rc   rf   ri   rk   r=   rZ   return_typestencil_funcrm   rn   stencil_blocksin_arr
in_arr_typin_cpsout_cpsname_var_tablerV   rW   parfor_varsr6   
parfor_varstart_lengthsend_lengths	loopnests	equiv_setin_arr_dim_sizes
start_inds	last_indslast_ind	start_indrv   ru   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   zStencilPass._mk_stencil_parfor   s
   
 	#*!Q&&&wn> > > 000\&+.
"1.$,OO!4^DD%LN	 	 	 !Q&&7888 000^T\-CZ!\	+ 	+ 	+!Q&&;<<< 000 V[).ju 	+ 	+A}#(% (%&)+ +J,1JDL)z****%)%C%Cg}l& &"{ !Q&&ABBB"M222.+... 000 	'55e<<	$..v66,------
	u 		9 		9A112B12E(3A	5#O OH33(5a(8)UCQ QIi(((X&&&U]1::;q> )8Q8 8 9 9 9 9 "%^%8%8%:%:!;!;a!?13%1E1E-.}5I'J'JCPP,7,=^() A::(^NNVE=),+ ,+,/1 1N050@0I0I
E1# 1#DL,-,,[#>>J9ZEEL$$\222!Q&&BCCC 000 XeS))
?fk2J!/??Juj#66IGOOFGSAAM','7'@'@?I(P (PDL$O""BImY$L$L#MNNN .z::IveY44H---#+F3 -..t44~11';;LMM :) +9 : : : $))$//#))!,,%--J&1&7DL#O""BIj(C$H$H#IJJJ,-=>>GfUGS11G).)9)B)H)H;F;L;E?;E;L*N *NDL&  VE=+E+EsKKN05
0A0A"0E0EDL,-4S11J "	*nc J JO""#4555,5*0 2  226x 6))#* !#AQSV!W!WVE=+I+I3OON050K0KKL]0^0^DL,- "	*<nc R RO""#4555(')x'.(1>'B'+~'+|'+~7 7E ve];%?%?EEH)BHT3$7$73GGKLL%%%*/*DL'VE=9J+K+KSQQN "	"(1c*:*:NC P PLL*+++05
DL,-  VE=9J+K+KSQQN.;;EBBK0;DL,-i44G9WncBBLLL&&&.66{8=
}q7H79; ;C  W\\~08(/C.0.1 * 3 3N .1DN>*umH&=&=sCCI+0+<DL(9^YDDLLL&&&5+ 5+ 5+ 5+ 5+ 5+ 5+ 5+p Z_-- % %%.K*/$A!$-;#@ k!#!,#(/,"	$ 	$ 	$ k!#!,#'..s3#	% 	% 	% 	% ""7,<===O""5))))---#+F3 -..t44~11';;LMM /IC)#... F5-*D*DcJJ	"n??FF/:Y^,)GUC88!#7Is!C!C&&~666n::;<AJ=1;L;=? ? 7<<YRR,/ ( 1 1 ,/x(!#}]/K/K(+"- "-494E^01!y>3GG&&|444 "$+*;*;D*A*A3!G!G!#}]/K/K,/"1 "14?4E^01$&In.<c%C %C!&&'8999 !.wdD8I8I/=~/24 4 &&{333
DL,F $^-@ A $W\ : @B B /2{+ 	(()?	A 	A 	A !Q&&9::: 000z'>>3OO'0(-
DL4N(,^5H(I(,W\(B(H(* (*|$
 	-.3::;LMMM-.3::<HHH F0"55	umM&B&BINNIbhqi&@&@&@-QZ[[-.3::;LMMM-.3::ImY//	
 	
 	
 ".~>>s>..001127;;===!Q&&7888 000}k:;%,,Y
N%(.)WdjZ Z   7FC88999r!   c                 N   |}|dk    rt          j        |t          d          |          }t          j        | j        |j        <   t          |t          j	                  r*t          j
        t          j        ||          ||          }nt          j
        |||          }|                    |           t          j        |t          d          |          }t          j        | j        |j        <   t          j        |t          d          |          }	t          j        t                    }
t          j                            |
          }|| j        |	j        <   t          j        d|
|          }t          j
        ||	|          }|                    |           t           j                            |	||gd|          }|                    | j        t          j        t          j        gi           | j        |<   t          j
        |||          }|                    |           |S )Nr   stencil_const_varr   compute_last_ind_varr    r   )r   r   r   r   r   r'   r:   rD   numbersNumberrJ   r[   rE   r@   njitr    r   
Dispatcherr   rK   r1   get_call_typer*   r(   )r-   r   
end_lengthrn   rV   rW   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(J(JHKM MK-2ZDL)**gn55 G!y*c)B)B8CS J  J  "y[#FF\***ve]:%>%>DDH*/*DL'F5-0F"G"GMME$566J11*==H'/DL$I1:sCCEys33HX&&&eh-Db#NNJ)1)?)?UZ 8"*> *>DN:&9Z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                                        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!   r>   )rD   r   r"  r#  r   r*   r+   r   r   r'   r(   rQ   rB   popitemr   rI   r3   )	r-   start_lengthrn   rV   rW   r%  f_irrd   ret_vars	            r   r   z"StencilPass._get_stencil_start_ind  s    lC(( 	-s<++,,,	) 	) 	)"="dn#'>EJ=$,#'>3 3 4;1$$$$##%%a(%,000UZ_$	*R.&,r!   c           	      \
    j         }|d         }d |D             }	d|j        v r=|j        d         D ]}
|
vrt          d          fd|j        d         D             }ng }|j        |v rt          d           j        |j                 j        }|j        }|j        }|j        du }|r|dgz  }|dgz  }n"d |j        D             }d	 |j        D             }t          j
        |          }d
}|                                D ]\  }}g }|j        D ]}t          |t          j                  r@t          |j        t          j                  r!|j        j        dv r|j        j        j        |	v sBt          |t          j                  st          |t          j                  r|j        j        |	v rt          d          t          |t          j                  rt          |j        t          j                  r|j        j        dv r|j        j        j        |	v r|j        j        j        |vr|j        j        }|dk    r|g}n&t/          |d          r|j        |v r||j                 }t          j        |          _         fd|D             }|r&                     |t7          |          |||          }|rt          |t          j                  st;          d |D                       rt          d          t7          t=          t>          ||                    }t7          t=          t@          ||                    }d}                     |t7          |          |||          }|dk    r	|d         }nt          j        |tC          d          |          }tD          j#        $                    tD          j%        |           j        |j        <   t          j        &                    ||          }t          j        |||          }|'                    |           tQ           fd|D                       r" j        |j        j        j                 j)        }n j        |j        j        j                 }t          j        *                    |j        j        ||          }tW          | j        |j        j        j                  j        |j                            j,        |<   ||_        |'                    |           ||_        |r|st          d          ||fS )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   c                     g | ]	}|j         
S r   )r:   r5   xs     r   
<listcomp>z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>.  s    0001000r!   standard_indexingz[Standard indexing requested for an array name not present in the stencil kernel definition.c                      g | ]
}|         S r   r   )r5   r.  rm   s     r   r/  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>6  s0      P  P  Pq 2  P  P  Pr!   zYThe first argument to a stencil kernel must use relative indexing, not standard indexing.Nc                     g | ]
}|d          S )r   r   r-  s     r   r/  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>N      EEEaQqTEEEr!   c                     g | ]
}|d          S )r>   r   r-  s     r   r/  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>O  r3  r!   F)setitemstatic_setitemz?Assignments to arrays passed to stencil kernels is not allowed.)static_getitemgetitemr>   r:   c                 <    g | ]}t          j        |          S r   )_get_const_index_exprr&   )r5   vr-   rk   s     r   r/  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>z  sB     "J "J "J9: #8"DL!#5 #5 "J "J "Jr!   c                 :    g | ]}t          |t                     S r   rD   r   r5   r;  s     r   r/  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>  s%     L L LAZ3%7%7!7 L L Lr!   z<Variable stencil index only possible with known neighborhoodTz$parfor_index_ind_varc                 P    g | ]"}j         |j                 t          j        k    #S r   )r'   r:   r   r   )r5   r;  r-   s     r   r/  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>  s?     M M M<= !L0EJ> M M Mr!   z=Stencil kernel with no accesses to relatively indexed arrays.)-rB   rX   r   r:   r'   r   rV   rW   neighborhoodr   get_tuple_tablerC   rI   rD   r   rJ   r3   rK   rL   r   r   rZ   indexhasattrbuild_definitions_definitions_add_index_offsetsrG   r   anymapr#  r   r   r   r   r   r   r   rE   allr   r8  r   r(   )r-   rk   r   rf   r=   r   rm   r   r   in_arg_namesr.  standard_indexedr   rV   rW   need_to_calc_kernelr   r   tuple_tablefound_relative_indexrc   rd   rw   r7   
index_list
index_varsind_varr   r   getitem_return_typgetitem_calls   ``    `                        r   r   z%StencilPass._replace_stencil_accesses&  s,    $*00000,"666!)*=> H HO++) +G H H H , P  P  P  P%1%9:M%N P  P  P  ";***! #. / / / V[).j*74?  	F!1#IM)KKEE<+DEEEMEE<+DEEEK .~>>$ +0022 Y	" Y	"LE5H
 U& U&bi00 M&tz27;;M JM-JJJ J,1\AAbj11 Bb&677 B !K,<<) +L M M M tRY// C.&tz27;;C. JM-JJJ J,1\AA J,19III!%!1Jzz&0\

":v66 F:?k;Y;Y)4Z_)EJ /7.H.X.XJ+"J "J "J "J "J>H"J "J "JJ$ O%)%<%<Z$($7$75#&O &O
 + 4 'z26:: B L L L L LMMB"1 3A #B #B B )-SmDN.P .P )Q )Q&*3sK+L+L&M&M/3, "&!8!8 $Z 0 0(E3"H "HJ zz",Q-"$&315 1569#; #;5:5E5N5N!J6/ 6/W\2%'W%8%8S%I%I
')yWc'J'J 555  M M M MAKM M M N N Q-1\48J4D4I.KKP +* .2\$*:J:O-P*#%7??4:3CWLO$Q $QL3<*TZ%5%:;W\244 44DN<0 ".DJ%%%%!EJJ 	@'; 	@! #? @ @ @ k))r!   c                    t          |          t          |          k    sJ t          d ||z   D                       r#t          t          t          ||                    S g }g }t          t          |                    D ]U}||         }	t          |	t                    rt          j	        |t          d          |          }	t          j        | j        |	j        <   t          j        t          j        ||         |          |	|          }
|                    |
           ||         }t          |t                    rt          j	        |t          d          |          }t          j        | j        |j        <   t          j        t          j        ||         |          ||          }
|                    |
           t          |	t$                    s/t          | j        |	j                 t          j        j                  rR| j        |j                 t          j        k    sJ |                     |	||||          }|                    |           t          |t$                    s/t          | j        |j                 t          j        j                  rR| j        |	j                 t          j        k    sJ |                     ||	|||          }|                    |           it          j	        |t          d          |          }t          j        | j        |j        <   t          j                            t0          j        |	||          }| j                            t0          j        t          j        t          j        fi           | j        |<   t          j        |||          }|                    |           |                    |           W|                    |           |S )zw Does the actual work of adding loop index variables to the
            relative index constants or variables.
        c                 8    g | ]}t          |t                    S r   r=  r>  s     r   r/  z2StencilPass._add_index_offsets.<locals>.<listcomp>  s"    EEEq
1c""EEEr!   old_index_var
offset_varoffset_stencil_index)rQ   rI  rG   rH  r   rP   rD   r   r   r   r   r   r   r'   r:   rJ   r[   rE   r   r   	SliceType_add_offset_to_slicerK   binopoperatorr*   r   r(   r   )r-   rO  r=   rw   rV   rW   	out_nodesrP  r6   rV  r  rW  	index_varr  r  s                  r   rF  zStencilPass._add_index_offsets  s   
 :#m"4"44444 EEJ},DEEEFF 	=C];;<<<	
s:'' 1	) 1	)A&qMM--- / "u -o > >!E !E38:]/0!y*Q-)E)E4A3 H  H  ...&q)J*c** /VE -l ; ;SB B
05
Z_-!y-2BC)H)H0:C A  A  ...=%00 !$,}/A"B$)J$8: : |JO4
BBBB 55mZ8A5#O O	!!),,,:u-- !$,z"?$)J$8: : |M$675:EEEE 55j-8A5#O O	!!),,,u)*@AA3H HI+0:DL(x|]0:CA AJ)-)M)M)1
EJ7OQS*U *UDN:&9ZC@@L\***i((((	"""r!   c           	      ^   t          |t                    rLd                    |j        |j                  }i }t          |i |           |d         }|g}t          j        f}	n'd }||g}| j        |j	                 }
|
t          j        f}	| j
        j        j        j        }t          ||| j        | j        |	| j        | j                  }|j                                        \  }}t)          ||           |j        d         j        j        }|                    |j        d d                    |S )NzRdef f(offset):
                return slice({} + offset, {} + offset)
            fc                 B    t          | j        |z   | j        |z             S r%   )r   startstop)	old_sliceoffsets     r   r`  z+StencilPass._add_offset_to_slice.<locals>.f  s     Y_v5y~7NOOOr!   r&  )rD   r   formatrb  rc  execr   r   r'   r:   r&   func_idrM   __globals__r   r*   r+   r(   rB   r'  r   rI   r3   r   )r-   r  rW  r]  rV   rW   f_textr`  r4   arg_typs
slice_type_globalsr)  r]   rd   	new_indexs                   r   rZ  z StencilPass._add_offset_to_slice  s/   i'' 	1y	77  CS!!!CA<D
}HHP P Pz*Din5J"EJ0H<',8"1h#+T\4>K K;&&((5%&&&JrN(.	CRC)))r!   N)r   
__module____qualname__r.   ro   ry   rY   r   r   r   rF  rZ  r   r!   r   r#   r#   !   s          <7 <7 <7|" " "2p p pd     D  O* O* O*bB B BH    r!   r#   c           
         ddl m} ddlm}	 ddlm}
 ddlm} | j        	                                }t          j
        |j                  }||_        t          j        |j                  }d|v rt          d          ddlm}	 |	j        }t!          ||||          }t"          j                            d|j                    ||j        j        |j        j        |j        j        |j        j        d	          \  |j        _        |j        _        |j        _        }|
                    |j        j        |j        j        |j        j        d
d	|j        j        |j        j        t:          j                   t          j        |t          j                               }tC          |"                                          }tG          |"                                          }t          j$        %                    |           t:          j&        dk    r#tO          d           t          j(        |           i }|j        j        )                                D ]7\  }}tU          j+        |tY          |          |          }|||<   |||j-        <   8t          j.        ||           t:          j&        dk    r#tO          d           t          j(        |           |j        j        )                                D ]
\  }}|||<   i }|/                                D ]}|j0        D ]}tc          |tT          j2                  rtc          |j3        tT          j4                  r~t:          j&        dk    r3tO          d||j3        j5        |j3        j-        |j3        j5        |v            ||j3        j5                 j-        ||j3        j-        <   ||j3        j5                 |_3        t:          j&        dk    r3tO          d|           tO          d           t          j(        |           t          j6        |           ||_        || 7                    |          d         |fS )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_fromr4   r   html_outputr>   zInitial stencil_blockszAfter replace_varsre   rm   zAfter replace arg with arr)8numba.core.cpurr  numba.core.registryrs  numba.core.annotationsrt  numba.core.typed_passesru  	kernel_ircopydeepcopyrB   r   r   r   target_contextDummyPipeliner   rewrite_registryapplystater*   r+   r&   r4   r'   r   r(   TypeAnnotationr   HTMLadd_offset_to_labels
next_labelr#  r   r   _the_max_labelupdater   r   r   rC   r   r   r   r:   replace_varsvaluesrI   rD   rJ   r3   ArgrB  remove_delsget_return_type)rj   r*   r4   rV   rW   re   r'   r(   rr  rs  rt  ru  stencil_func_irr   r   r+   tpr]   	min_label	max_labelvar_dictr;  typnew_varr1   call_typrm   rd   r7   s                                r   rU   rU     sI    *)))))......777777<<<<<< l''))O]?#9::N+O01GHHN ) * * 	* /.....)I	y)T?	C	CB##$6AAADXDX
BH.0@
tE EABHbh*BH,> ##  ($X]H(K $ ! ! ! 2>8@8K8M8MO ONN''))**IN''))**I""9---""&'''^,,, H("((** $ $3&a 0 0#66 #.(333"""###^,,, (,2244 # #h"	$O&&(( : :J 	: 	:D$	** :z$*bf/M/M :)Q..,
DJ4D#z
0@J0NP P P3=dj>N3O3T
0'
(89
	: ""111*+++^,,,(((+OB..t44Q7HHr!   c                       e Zd Zd ZdS )r  c                     ddl m}  |            | _        || j        _        || j        _        || j        _        || j        _        d | j        _        d | j        _        d | j        _	        d S )Nr   )	StateDict)
numba.core.compilerr  r  r*   r+   r4   r&   r'   r   r(   )r-   r*   r+   r4   r)  r  s         r   r.   zDummyPipeline.__init__o  sl    111111Y[[
(
(

!
!
!%
#
r!   N)r   ro  rp  r.   r   r!   r   r  r  n  s#        	$ 	$ 	$ 	$ 	$r!   r  c                 <    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)rk   r&   r^  	const_vals       r   r:  r:  {  s0     #Z)E 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   rD   r   r   r   _get_const_two_irsr   get_definition_get_const_unary_expr_get_const_binary_exprr   )rk   r&   r^  	var_const	index_defs        r   r  r    s     Jy"&))***):w	JJI'
I>>Iz7I? ?I
GY@ @I
r!   c                 x    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    sD     j#s++Ij#s++I
r!   c                     t          t          |t          j                  o
|j        dk               |j        }t          | ||          }t          |j                 }t          d
                    ||                    S )zQevaluate constant unary expr if possible
    otherwise, raise GuardException
    unaryz{}{})r   rD   r   rK   rL   r3   r  r   fnevalrf  )rk   r&   r  	inner_varr  rL   s         r   r  r    sj     Jy"'**Fy|w/FGGGI+JKKI	y|	,Bb),,---r!   c                 *   t          t          |t          j                  o
|j        dk               t          | ||j                  }t          | ||j                  }t          |j	                 }t          d                    |||                    S )zRevaluate constant binary expr if possible
    otherwise, raise GuardException
    r[  z{}{}{})r   rD   r   rK   rL   r  lhsrhsr   r  r  rf  )rk   r&   r  arg1arg2rL   s         r   r  r    sz     Jy"'**Fy|w/FGGG&z7IMJJD&z7IMJJD	y|	,Bb$//000r!   )0r  r~  r   pytypesr\  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     sW                        < < < < < < < < < < < < < < F F F F F F F F ' ' ' ' ' ' % % % % % % % %P P P P P P P P P P P P P P P P P P P P P P . - - - - - 2 2 2 2 2 2 " " " " " "  r r r r r& r r rhWI WI WIr
$ 
$ 
$ 
$ 
$F 
$ 
$ 
$
 
 
  .
 
 
	. 	. 	.1 1 1 1 1r!   