§
    ƒÛ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/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     úR/granary/edev/quantum/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        ¦  «        �r­t          ‰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 ! T¤Z¤_°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À¨¬°Q´VÔ(<Ð'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   Ú	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Ú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,   sZ  øø€ ð 	7Ð6Ð6Ð6Ð6Ð6õ ' t¤|Ô':Ñ;Ô;‰ˆ
�AØˆØˆØ'1×'7Ò'7Ñ'9Ô'9ð 	:ð 	:Ñ#ˆL˜)Ø%ð :ð :�Ý˜h¨Ñ4Ô4ð :à!×(Ò(¨Ñ6Ô6Ð6Ø19�L Ñ.øð	:ð
 ð 	ØˆFð !œLÔ/×5Ò5Ñ7Ô7ð '	7ñ '	7‰LˆE�5Ý#¥D­°5´:Ñ)>Ô)>Ñ$?Ô$?Ñ@Ô@ð &7ñ &7‘��4å˜t¥R¤YÑ/Ô/ñ $7Ý& t¤zµ2´7Ñ;Ô;ñ$7à œJœM¨VÒ3Ñ3Ø œJœOÔ0°MÐAÑAÝ˜tœzœ~Ñ.Ô.�Cð"Qð "Qð "Qð "QÝ49½#¸d¼j¼oÑ:NÔ:NÑ4OÔ4Oð"Qñ "Qô "Q�Jà"œjœo�GÝ"'Ð'NÐ'NÐ'NÐ'NÀgÐ'NÑ'NÔ'NÑ"NÔ"N�KØ$/ð Nð N˜Ý% hµ´Ñ@Ô@ð NÝ",ð .Mñ #Nô #Nð NðNð "Ÿgšg e™nœn�Gð & d¤j¤oÔ&:Ô;�BÝ6DÀRØ œN¨KØ!œK¨¬°JØ œL¨$¬.ñ7:ô 7:Ñ3�J  Oð %'¤J§N¢N°?ÀDÑ$IÔ$I�MØ $× 7Ò 7¸¸wÈØ&¨°t´{ÀBÈØ+ñ!-ô !-�Ið "'¤¨B¨Q¨B¤°)Ñ!;¸e¼jÈÈ1ÉÈÈÔ>NÑ!N�E”J‘Jå  ¥r¤yÑ1Ô1ð 7Ý& t¤zµ2´7Ñ;Ô;ð7à œJœM¨VÒ3Ð3Ý!¥-°´¸t¼zÑJÔJØ';ò<ð <õ "$¤¨!¨T¬XÑ!6Ô!6�D”JùñM&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   rW   rX   rI   rD   r   ÚReturnÚpoprJ   r3   rK   rL   rE   ÚJump)r-   rB   Úexit_value_varÚparfor_body_exit_labelrd   re   rW   rX   Únew_bodyr7   Ú	prev_stmts              r   Úreplace_return_with_setitemz'StencilPass.replace_return_with_setitemh   s  € ð #ŸLšL™NœNð 	"ñ 	"‰LˆE�5Ø”KˆEØ”)ˆCØˆHØœ
ð *ð *�Ý˜d¥B¤IÑ.Ô.ð 
*à (§¢¡¤�IÝ& yµ"´)Ñ<Ô<ð :Ý& y¤½¼Ñ@Ô@ð:à%œOÔ.°&Ò8Ð8Ð8Ð8à—O’O¥B¤I¨i¬oÔ.CÀ^ÐUXÑ$YÔ$YÑZÔZÐZØ—O’O¥B¤GÐ,BÀCÑ$HÔ$HÑIÔIÐIÐIà—O’O DÑ)Ô)Ð)Ð)Ø!ˆEŒJ‰Jð!	"ð 	"r!   c
                 ó,"  ‡ ‡‡S‡T— 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         }"n¥t'          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¦  «         �nðd|j0        v �ræ|j0        d         }*tb          j2         2                    |*¦  «        }+‰ j3         4                    |+|j'        ¦  «        sd}Ft�          |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'          jO        ‰t“          dd¦  «        |I|K|¦  «        }M|%j.                             |M¦  «         t¡          t,          jG        ‰ j        ‰j                 ‰ j        |Ij                 ‰ j        ‰j                 j'        ¦  «        }?|?‰ j        |M<   ‰  Q                    || |¦  «         t          j        dk    r#t          d(¦  «         t	          j        |¦  «         t'          jR        ‰|"| |¦  «        }Nt¡          t,          jG        ‰ j        ‰j                 ‰ j        |"j                 ‰ j        ‰j                 j'        ¦  «        ‰ j        |N<   ||         j.         /                    |!¦  «         ||         j.                             |N¦  «         t'          jS        d)d*¦  «        }Ot'          j        |t+          d'¦  «        |O¦  «        }Pt'          j,        t'          j6        d|O¬+¦  «        |P|O¦  «        }L||         j.                             |L¦  «         ||         j.                             t'          jT        |P|O¦  «        ¦  «         t	          jU        |¦  «        }|tI          | %                    ¦   «         ¦  «                 j.         V                    ¦   «          t          j        dk    r#t          d,¦  «         t	          j        |¦  «         d-||gf}Qt@          j!        j"         W                    ||%|||"||Q‰ jX        ¦  «        }R|
                     |R¦  «         |
                     t'          j,        ‰||¦  «        ¦  «         |
S ).z> Converts a set of stencil kernel blocks to a parfor.
        r>   rZ   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   rX   ú$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ÚdimrW   rX   Ú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_borderz5StencilPass._mk_stencil_parfor.<locals>.handle_borderA  s~  ø€ ð ”n×:Ò:ØÝ”Z�M AÑ%Øñô �ð ! Ô%�Ý! "¥s­B¬F mÑ4Ô4Ð5Ð5Ð5Ýœ ¥}°]Ñ'CÔ'CÀSÑIÔI�Ý,1¬J�”˜Vœ[Ñ)Ý˜b¥#Ñ&Ô&ð ;Ý "¤	­"¬(°2°sÑ*;Ô*;¸VÀSÑ IÔ I�I�Iå "¤	¨"¨f°cÑ :Ô :�IØ—’˜YÑ'Ô'Ð'å!#¤§¢Ø'Ø0;ÐT˜) VÐ,Ð,À&È)ÐATØØð	 ".ñ "ô "�ð
 25�”˜~Ñ.å#%¤6¨%µ¸xÑ1HÔ1HÈ#Ñ#NÔ#NÐ Ý6;Ô6G�”Ð-Ô2Ñ3Ý!œy¨Ð9IÈ3ÑOÔO�Ø—’˜\Ñ*Ô*Ð*à*:Ð" 3Ñ'Ý!#¤¨­}Ø-ñ0/ô 0/Ø03ñ"5ô "5�å49Ô4D×4MÒ4MÝÔ% uñ5.ô 5.�”˜^Ô0Ñ1åœW×0Ò0Ð1CÀSÑIÔI�
Ý!œy¨°^ÀSÑIÔI�Ø—’˜\Ñ*Ô*Ð*å!œz¨'°>À8ÈSÑQÔQ�Ý/8Ý05´
¸D¼LÈÌÔ<VØ04´¸^Ô=PÔ0QØ04´¸W¼\Ô0JÔ0Pñ02ô 02�”˜|Ñ,ð
 —’˜\Ñ*Ô*Ð*Ð*Ð*r!   TFz	$py_g_varz$slice_instz$cval_constz%stencil_blocks after replacing returnÚstencilparfor_dummyéÿÿÿÿ)rX   z#stencil_blocks after adding SetItemr?   )YrB   r   ÚDEBUG_ARRAY_OPTÚprintr   Údump_blocksr'   r:   Úcopy_propagateÚget_name_var_tableÚapply_copy_propagater(   Úremove_deadr&   Ú	arg_namesÚndimrW   rX   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   ÚextendrY   r   Útypeofr*   Úcan_convertrT   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_equivr   ÚStaticSetItemr   rz   r’   ÚLocrs   Úsimplify_CFGrt   ÚParforr,   )Ur-   rd   rg   rj   rl   r=   r[   Úreturn_typeÚstencil_funcrn   ro   Ústencil_blocksÚin_arrÚ
in_arr_typÚin_cpsÚout_cpsÚname_var_tablerW   rX   Úparfor_varsr6   Ú
parfor_varÚstart_lengthsÚend_lengthsÚ	loopnestsÚ	equiv_setÚin_arr_dim_sizesÚ
start_indsÚ	last_indsÚlast_indÚ	start_indrw   rv   Ú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   rZ   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¬\Ô-CÀZØ!œ\ñ	+ô 	+ð 	+åÔ! QÒ&Ð&ÝÐ;Ñ<Ô<Ð<ÝÔ  Ñ0Ô0Ð0ð ”˜Vœ[Ô)Ô.ˆØ”ˆØŒjˆØˆÝ�u‘”ð 	+ð 	+ˆAÝœ ¥}Ø#ñ(%ô (%Ø&)ñ+ô +ˆJå,1¬JˆDŒL˜œÑ)Ø×Ò˜zÑ*Ô*Ð*Ð*à%)×%CÒ%CØ˜ g¨}¸lØñ&ô &Ñ"ˆ�{õ Ô! QÒ&Ð&ÝÐAÑBÔBÐBÝÐ" MÑ2Ô2Ð2Ý�. +Ñ.Ô.Ð.ÝÔ  Ñ0Ô0Ð0ð ˆ	ØÔ'×5Ò5°eÑ<Ô<ˆ	Ø$×.Ò.¨vÑ6Ô6Ðà�Ð,Ñ-Ô-Ò-Ð-Ð-Ð-Øˆ
Øˆ	Ý�u‘”ð 		9ð 		9ˆAØ×1Ò1Ð2BÀ1Ô2EØ(3°A¬¸	À5È#ñOô OˆHà×3Ò3Ø(5°aÔ(8¸)ÀUÈCñQô QˆIà×Ò˜iÑ(Ô(Ð(Ø×Ò˜XÑ&Ô&Ð&à×Ò�Uœ]Ô1×:Ò:¸;Àq¼>Ø )¨8°Qñ8ô 8ñ 9ô 9ð 9ð 9õ "% ^×%8Ò%8Ñ%:Ô%:Ñ!;Ô!;¸aÑ!?ÐÝ13´¸%ÀÑ1EÔ1EˆÐ-Ñ.Ýœ ¥}Ð5IÑ'JÔ'JÈCÑPÔPˆØ,7Ô,=ˆŒ�^Ô(Ñ)ð ÐØ�AŠ:ˆ:Ø(¨œ^ˆNˆNåœV E­=Ø)ñ,+ô ,+Ø,/ñ1ô 1ˆNå05Ô0@×0IÒ0IÝ”
˜Eñ1#ô 1#ˆDŒL˜Ô,Ñ-åœ×,Ò,¨[¸#Ñ>Ô>ˆJÝœ9 Z°ÀÑEÔEˆLØ×$Ò$ \Ñ2Ô2Ð2åÔ! QÒ&Ð&ÝÐBÑCÔCÐCÝÔ  Ñ0Ô0Ð0õ ”X˜e SÑ)Ô)ˆ
Ø‰?Øœ f¤kÔ2ˆJå!Ô/°Ñ?Ô?ˆJÝœ˜u j°#Ñ6Ô6ˆIÝœGŸOšO¨F°G¸SÑAÔAˆMÝ',Ô'7×'@Ò'@ÅÄØ?I¼ñ(Pô (PˆDŒL˜Ñ$àŒO×"Ò"¥B¤I¨m¸YÈÑ$LÔ$LÐ#MÑNÔNÐNå Ô.¨zÑ:Ô:ˆIÝ”v˜e Y°Ñ4Ô4ˆHØ˜Ô-Ð-Ð-Ø#Ô+¨FÔ3�å œ-×.Ò.¨tÑ4Ô4�Ø”~×1Ò1°'¸;Ô;LÑMÔMð VÝ$Ð%TÑUÔUÐUà#×)Ò)¨$Ñ/Ô/��à#×)Ò)¨!Ñ,Ô,�Ýœ %¨Ñ-Ô-ˆJØ&1Ô&7ˆDŒL˜Ñ#ØŒO×"Ò"¥B¤I¨j¸(ÀCÑ$HÔ$HÐ#IÑJÔJÐJåÔ,Ð-=Ñ>Ô>ˆGÝ”f˜U G¨SÑ1Ô1ˆGÝ).¬Ô)9Ô)B×)HÒ)HØ;FÔ;LØ;E¼?Ø;EÔ;Lñ*Nô *NˆDŒL˜œÑ&õ  œV E­=¸Ñ+EÔ+EÀsÑKÔKˆNÝ05´
×0AÒ0AÅ"Ñ0EÔ0EˆDŒL˜Ô,Ñ-Ýœ 4­¨SÑ1Ô1ˆJÝ "¤	¨*°nÀcÑ JÔ JÐØŒO×"Ò"Ð#4Ñ5Ô5Ð5å,Ô5Ø*Ô0ñ 2ô  2Ü26´xð à 6Ò)Ð)Ø#*Ð Ý!#¤§¢°ÐAQÐSVÑ!WÔ!WÐÝœV E­=¸Ñ+IÔ+IÈ3ÑOÔOˆNÝ05´×0KÒ0KÈKÔL]Ñ0^Ô0^ˆDŒL˜Ô,Ñ-Ý "¤	Ð*<¸nÈcÑ RÔ RÐØŒO×"Ò"Ð#4Ñ5Ô5Ð5åÔ(¨Ý')¤xØ'.Ø(1°>Ð'BØ'+¤~Ø'+¤|Ø'+¤~ñ7ô 7ˆEõ ”v˜e¥]°;Ñ%?Ô%?ÀÑEÔEˆHÝœ)¥B¤H¨T°3Ñ$7Ô$7¸À3ÑGÔGˆKØ�LŠL˜Ñ%Ô%Ð%Ý*/¬*ˆDŒL˜œÑ'åœV E­=Ð9JÑ+KÔ+KÈSÑQÔQˆNÝ "¤	­"¬(°1°cÑ*:Ô*:¸NÈCÑ PÔ PÐØ�LŠLÐ*Ñ+Ô+Ð+Ý05´
ˆDŒL˜Ô,Ñ-õ  œV E­=Ð9JÑ+KÔ+KÈSÑQÔQˆNØœ.×;Ò;½EÑBÔBˆKØ0;ˆDŒL˜Ô,Ñ-Ý”i ­°Ñ4Ô4ˆGÝœ9 W¨n¸cÑBÔBˆLØ�LŠL˜Ñ&Ô&Ð&à”.×6Ò6°{Ý8=¼
°}ÀqÑ7HØ79ñ;ô ;ˆCõ  œWŸ\š\¨~Ø08¸(Ð/CØ.0Ø.1ð *ñ 3ô 3ˆNð .1ˆDŒN˜>Ñ*åœ˜u¥m°HÑ&=Ô&=¸sÑCÔCˆIÝ+0Ô+<ˆDŒL˜œÑ(Ýœ9 ^°YÀÑDÔDˆLØ�LŠL˜Ñ&Ô&Ð&ð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ð /ØI�CÝ)¨#Ñ.Ô.Ð.õ œF 5­-¸Ñ*DÔ*DÀcÑJÔJ�	Ø"œn×?Ò?ÅÑFÔF�Ø/:�”˜Yœ^Ñ,Ýœ) G­U°CÑ8Ô8�Ý!#¤¨7°I¸sÑ!CÔ!C�Ø”×&Ò& ~Ñ6Ô6Ð6à”n×:Ò:¸;Ý<A¼J¸=È1Ñ;LØ;=ñ?ô ?�õ œ7Ÿ<š<¨Y¸RÀRØ,/ð (ñ 1ô 1�ð ,/�”˜xÑ(Ý!#¤¨­}¸]Ñ/KÔ/KØ(+ñ"-ô "-�å49Ô4E�”˜^Ô0Ñ1Ý!œy¨°>À3ÑGÔG�Ø”×&Ò& |Ñ4Ô4Ð4õ "$¤¨+×*;Ò*;¸DÑ*AÔ*AÀ3Ñ!GÔ!G�Ý!#¤¨­}¸]Ñ/KÔ/KØ,/ñ"1ô "1�à4?Ô4E�”˜^Ô0Ñ1Ý$&¤I¨nØ.<¸cñ%Cô %CÐ!à”×&Ò&Ð'8Ñ9Ô9Ð9õ !Ô.¨w½¸dÀDÑ8IÔ8IØ/=¸~Ø/2ñ4ô 4�ð ”×&Ò& {Ñ3Ô3Ð3Ý¥¤
¨D¬L¸¼Ô,FØ $¤¨^Ô-@Ô AØ $¤¨W¬\Ô :Ô @ñBô B�ð /2�”˜{Ñ+ð 	×(Ò(¨¸Ø)?ñ	Aô 	Að 	Aõ Ô! QÒ&Ð&ÝÐ9Ñ:Ô:Ð:ÝÔ  Ñ0Ô0Ð0å”z '¨>¸>È3ÑOÔOˆÝ'0Ý(-¬
°D´LÀÄÔ4NØ(,¬°^Ô5HÔ(IØ(,¬°W´\Ô(BÔ(Hñ(*ô (*ˆŒ�|Ñ$ð
 	Ð-Ô.Ô3×:Ò:Ð;LÑMÔMÐMØÐ-Ô.Ô3×:Ò:¸<ÑHÔHÐHõ ”FÐ0°"Ñ5Ô5ˆ	Ýœ˜u¥m°MÑ&BÔ&BÀIÑNÔNˆÝœI¥b¤h¨q°iÐ&@Ñ&@Ô&@À-ÐQZÑ[Ô[ÐØÐ-Ô.Ô3×:Ò:Ð;LÑMÔMÐMàÐ-Ô.Ô3×:Ò:ÝŒI�m YÑ/Ô/ñ	
ô 	
ð 	
õ "Ô.¨~Ñ>Ô>ˆØ•s˜>×.Ò.Ñ0Ô0Ñ1Ô1Ô2Ô7×;Ò;Ñ=Ô=Ð=åÔ! QÒ&Ð&ÝÐ7Ñ8Ô8Ð8ÝÔ  Ñ0Ô0Ð0à˜}¨kÐ:Ð;ˆÝ”Ô%×,Ò,¨Y¸
ÀNØ%(¨.¸)ÀWÈdÌjñZô Zˆà×Ò˜Ñ Ô Ð Ø×Ò�œ 7¨F°CÑ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_lengthro   rW   rX   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Ô(JØHKñMô MˆKå-2¬ZˆDŒL˜Ô)Ñ*Ý˜*¥g¤nÑ5Ô5ð GÝ!œy­¬°*¸cÑ)BÔ)BØ8CÀSñ Jô  J��õ  "œy¨°[À#ÑFÔF�à×Ò˜\Ñ*Ô*Ð*Ý”v˜e¥]°:Ñ%>Ô%>ÀÑDÔDˆHÝ*/¬*ˆDŒL˜œÑ'å”F˜5¥-Ð0FÑ"GÔ"GÈÑMÔMˆEÝœÕ$5Ñ6Ô6ˆJÝ”×1Ò1°*Ñ=Ô=ˆHØ'/ˆDŒL˜œÑ$Ý”IÐ1°:¸sÑCÔCˆEÝ”y ¨¨sÑ3Ô3ˆHØ×Ò˜XÑ&Ô&Ð&ÝœŸš e¨h¸Ð-DÀbÈ#ÑNÔNˆJØ)1×)?Ò)?Ø”¥¤­U¬ZÐ 8¸"ñ*>ô *>ˆDŒN˜:Ñ&åœ9 Z°¸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   € Ý•s˜8 QÑ'Ô'Ñ(Ô(Ð(r!   r>   éþÿÿÿ)rD   rŒ   r#  r$  r   r*   r+   r   r‹   r'   r(   rQ   rB   Úpopitemr   rI   r3   )	r-   Ústart_lengthro   rW   rX   r&  Úf_irre   Úret_vars	            r   rº   z"StencilPass._get_stencil_start_ind  s×   € Ý�l¥CÑ(Ô(ð 	-Ý•s˜<¨Ñ+Ô+Ñ,Ô,Ð,ð	)ð 	)ð 	)å" =°"°d´nØ#'¤>µE´J°=À$Ä,Ø#'¤>ñ3ô 3ˆõ �4”;ÑÔ 1Ò$Ð$Ð$Ð$Ø”×#Ò#Ñ%Ô% aÔ(ˆÝ˜% , Ñ0Ô0Ð0Ø�U”Z   ”_Ñ$ˆ	Ø”*˜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          |¦  «        |||¦  «        }|rŠt          |t          j        ¦  «        st;          d„ |D ¦   «         ¦  «        rt          d¦  «        ‚t7          t=          t>          ||¦  «        ¦  «        }t7          t=          t@          ||¦  «        ¦  «        }d}‰                      |t7          |¦  «        |||¦  «        }|dk    r	|d         }n¥t          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Ð0 1˜œÐ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/  rn   s     €r   r0  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>2  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   r0  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>I  ó   € ÐEÐEÐE a˜Q˜qœTÐEÐEÐEr!   c                 ó   — g | ]
}|d          ‘ŒS )r>   r   r.  s     r   r0  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>J  r4  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-   rl   s     €€r   r0  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>t  sB   ø€ ð "Jð "Jð "JØ9:õ #8Ø" D¤L°!ñ#5ô #5ð "Jð "Jð "Jr!   c                 ó:   — g | ]}t          |t          ¦  «         ‘ŒS r   ©rD   rŒ   ©r5   r<  s     r   r0  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>  s%   € Ð LÐ LÐ L¸A¥Z°µ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   r0  z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>˜  s?   ø€ ð Mð Mð MØ<=ð !œL¨¬Ô0µE´JÒ>ð Mð Mð Mr!   z=Stencil kernel with no accesses to relatively indexed arrays.)-rB   rY   rT   r:   r'   rµ   rW   rX   Úneighborhoodr   Úget_tuple_tablerC   rI   rD   r   rJ   r3   rK   rL   r’   rÔ   r[   ÚindexÚhasattrÚbuild_definitionsÚ_definitionsÚ_add_index_offsetsrG   r�   ÚanyÚmapr$  r¾   r   r   r�   r�   r‹   r‘   rE   Úallr”   r9  r   r(   )r-   rl   rà   rg   r=   rÙ   rn   rÚ   rÛ   Úin_arg_namesr/  Ústandard_indexedr¨   rW   rX   Úneed_to_calc_kernelrâ   rã   Útuple_tableÚfound_relative_indexrd   re   rx   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Ø!Ô)Ð*=Ô>ð Nð N�Ø˜OÐ+Ð+Ý$ð &Mñ Nô Nð Nð ,ð Pð  Pð  Pð  PØ%1Ô%9Ð:MÔ%Nð Pñ  Pô  PÐÐð  "ÐàŒ;Ð*Ð*Ð*Ýð <ñ =ô =ð =ð ”˜Vœ[Ô)Ô.ˆØ”ˆØŒjˆà*Ô7¸4Ð?Ðð ð 	FØ! 1 #™IˆMØ  ™)ˆKˆKàEÐE¨<Ô+DÐEÑEÔEˆMØEÐE¨<Ô+DÐEÑEÔEˆKõ Ô.¨~Ñ>Ô>ˆà$Ðð +×0Ò0Ñ2Ô2ð W	"ñ W	"‰LˆE�5ØˆHàœ
ð S&ñ S&�å ¥b¤iÑ0Ô0ð hÝ& t¤zµ2´7Ñ;Ô;ðhà œJœMÐ-JÐJÐJØ œJÔ,Ô1°\ÐAÐAÝ ¥b¤jÑ1Ô1ð Bå ¥bÔ&6Ñ7Ô7ð Bð !œKÔ,°Ð<Ð<Ý$Ð%fÑgÔgÐgõ ˜t¥R¤YÑ/Ô/ñ B.Ý& t¤zµ2´7Ñ;Ô;ñB.à œJœMÐ-JÐJÑJØ œJÔ,Ô1°\ÐAÑAØ œJÔ,Ô1Ð9IÐIÑIØ!%¤Ô!1�Jà ’z�zØ&0 \˜
˜
å" :¨vÑ6Ô6ð F¸:¼?ÈkÐ;YÐ;YØ)4°Z´_Ô)E˜Jõ /7Ô.HÈÑ.XÔ.X�JÔ+ð"Jð "Jð "Jð "Jð "JØ>Hð"Jñ "Jô "J�Jà$ð OØ%)×%<Ò%<¸ZÝ$(¨Ñ$7Ô$7¸À5È#ñ&Oô &O˜
ð +ð 
4õ ' zµ2´6Ñ:Ô:ð DÝÐ LÐ LÀÐ LÑ LÔ LÑMÔMðDå",ð .Cñ #Dô #Dð Då(,­Sµ°mØDNñ.Pô .Pñ )Qô )Q˜å&*­3­s°KÀÑ+LÔ+LÑ&MÔ&M˜Ø/3Ð,ð "&×!8Ò!8¸Ý $ ZÑ 0Ô 0°(¸EÀ3ñ"Hô "H�Jð  ’z�zØ",¨Q¤-˜˜å"$¤&¨µØ3ñ15ô 15Ø69ñ#;ô #;˜å5:Ô5E×5NÒ5NÝ!œJ¨ñ6/ô 6/˜œ W¤\Ñ2å%'¤W×%8Ò%8¸ÀSÑ%IÔ%I˜
Ý')¤y°¸WÀcÑ'JÔ'J˜Ø Ÿš¨Ñ5Ô5Ð5õ ð Mð Mð Mð MØAKðMñ Mô Mñ Nô Nð Qà-1¬\Ø48´JÔ4DÔ4Iô.KÜKPð +Ð*ð .2¬\¸$¼*Ô:JÔ:OÔ-PÐ*å#%¤7§?¢?°4´:Ô3CÀWØLOñ$Qô $Q�Lå3<Ø*Øœ T¤ZÔ%5Ô%:Ô;Øœ W¤\Ô2ñ44ô 44�D”N <Ñ0ð ".�D”Jà—’ Ñ%Ô%Ð%Ñ%Ø!ˆEŒJ‰JØð 	.Ð';ð 	.Ýð -ñ .ô .ð .ð ˜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          ¦  «        r€t          j	        |t          d¦  «        |¦  «        }	t          j        | j        |	j        <   t          j        t          j        ||         |¦  «        |	|¦  «        }
|                     |
¦  «         ||         }t          |t          ¦  «        r€t          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   r0  z2StencilPass._add_index_offsets.<locals>.<listcomp>¸  s"   € ÐEÐEÐE q•
˜1�cÑ"Ô"ÐEÐEÐEr!   Úold_index_varÚ
offset_varÚoffset_stencil_index)rQ   rJ  rG   rI  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-   rP  r=   rx   rW   rX   Ú	out_nodesrQ  r6   rW  r  rX  Ú	index_varr  r   s                  r   rG  zStencilPass._add_index_offsets°  sŸ  € õ
 �:‰Œ¥# mÑ"4Ô"4Ò4Ð4Ð4Ð4õ ÐEÐE¨J°}Ñ,DÐEÑEÔEÑFÔFð 	=å��C ¨]Ñ;Ô;Ñ<Ô<Ð<àˆ	Øˆ
Ý•s˜:‘”Ñ'Ô'ð 1	)ñ 1	)ˆAà& qœMˆMÝ˜-­Ñ-Ô-ð /Ý "¤ uÝ -¨oÑ >Ô >Àñ!Eô !E�å38´:�”˜]Ô/Ñ0Ý!œy­¬°*¸Q´-ÀÑ)EÔ)EØ4AÀ3ñ Hô  H�à× Ò  Ñ.Ô.Ð.à& qÔ)ˆJÝ˜*¥cÑ*Ô*ð /ÝœV EÝ -¨lÑ ;Ô ;¸SñBô B�
å05´
�”˜Zœ_Ñ-Ý!œy­¬°-ÀÔ2BÀCÑ)HÔ)HØ0:¸Cñ Aô  A�à× Ò  Ñ.Ô.Ð.å˜=­%Ñ0Ô0ð Ý! $¤,¨}Ô/AÔ"BÝ$)¤JÔ$8ñ:ô :ðð ”| J¤OÔ4½¼
ÒBÐBÐBÐBØ ×5Ò5°mÀZØ8AÀ5È#ñOô O�	à×!Ò! )Ñ,Ô,Ð,Ùå˜:¥uÑ-Ô-ð Ý! $¤,¨z¬Ô"?Ý$)¤JÔ$8ñ:ô :ðð ”| MÔ$6Ô7½5¼:ÒEÐEÐEÐEØ ×5Ò5°jÀ-Ø8AÀ5È#ñOô O�	à×!Ò! )Ñ,Ô,Ð,Ùåœ˜uÝ)Ð*@ÑAÔAÀ3ñHô HˆIå+0¬:ˆDŒL˜œÑ(ÝœŸš¥x¤|°]Ø0:¸CñAô AˆJà)-¬×)MÒ)MÝ)1¬½¼
ÅEÄJÐ7OÐQSñ*Uô *UˆDŒN˜:Ñ&åœ9 Z°¸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   ra  z+StencilPass._add_offset_to_slice.<locals>.f   s    € Ý˜Yœ_¨vÑ5°y´~ÈÑ7NÑOÔOÐOr!   r'  )rD   r…   Úformatrc  rd  Úexecr   r‹   r'   r:   r&   Úfunc_idrM   Ú__globals__r   r*   r+   r(   rB   r(  r   rI   r3   rÂ   )r-   r  rX  r^  rW   rX   Úf_textra  r4   Úarg_typsÚ
slice_typeÚ_globalsr*  r^   re   Ú	new_indexs                   r   r[  z StencilPass._add_offset_to_sliceô  s/  € å�i¥Ñ'Ô'ð 	1ðç’�y”¨	¬Ñ7Ô7ð ð ˆCÝ�˜˜SÑ!Ô!Ð!Ø�C”ˆAØ�<ˆDÝœ
�}ˆHˆHðPð Pð Pà˜zÐ*ˆDØœ i¤nÔ5ˆJØ"¥E¤JÐ0ˆHØ”<Ô'Ô,Ô8ˆÝ" 1 h°´ÀÄØ#+¨T¬\¸4¼>ñKô Kˆà”;×&Ò&Ñ(Ô(‰ˆˆ5Ý˜% Ñ&Ô&Ð&Ø”J˜r”NÔ(Ô.ˆ	Ø×Ò˜œ C R CœÑ)Ô)Ð)ØÐr!   N)rÎ   Ú
__module__Ú__qualname__r.   rp   rz   rZ   r¹   rº   r¶   rG  r[  r   r!   r   r#   r#   !   s©   € € € € € ðð ð ð:7ð :7ð :7ðx"ð "ð "ð2oð oð oðb ð  ð  ðDð ð ðK*ð K*ð K*ðZ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        }|	                     ||¦  «        5  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        ¬¦  «         d	d	d	¦  «         n# 1 swxY w Y   t          j         |t          j!        ¦   «         ¦  «        }tE          | #                    ¦   «         ¦  «        }tI          | #                    ¦   «         ¦  «        }t          j%         &                    |¦  «         t<          j'        dk    r#tQ          d¦  «         t          j)        |¦  «         i }|j        j         *                    ¦   «         D ]7\  }}tW          j,        |t[          |¦  «        |¦  «        }|||<   |||j.        <   Œ8t          j/        ||¦  «         t<          j'        dk    r#tQ          d¦  «         t          j)        |¦  «         |j        j         *                    ¦   «         D ]
\  }}|||<   Œi }| 0                    ¦   «         D ]Ã}|j1        D ]¹}te          |tV          j3        ¦  «        r�te          |j4        tV          j5        ¦  «        r~t<          j'        dk    r3tQ          d||j4        j6        |j4        j.        |j4        j6        |v ¦  «         ||j4        j6                 j.        ||j4        j.        <   ||j4        j6                 |_4        ŒºŒÄt<          j'        dk    r3tQ          d|¦  «         tQ          d¦  «         t          j)        |¦  «         t          j7        |¦  «         ||_        ||  8                    |¦  «        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_varsrf   rn   zAfter replace arg with arr)9Únumba.core.cpurs  Únumba.core.registryrt  Únumba.core.annotationsru  Únumba.core.typed_passesrv  Ú	kernel_irÚcopyÚdeepcopyrB   r   r±   rT   Útarget_contextÚnested_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   ÚArgrC  Úremove_delsÚget_return_type)rk   r*   r4   rW   rX   rf   r'   r(   rs  rt  ru  rv  Ústencil_func_irrÚ   rß   r+   Útpr^   Ú	min_labelÚ	max_labelÚvar_dictr<  ÚtypÚnew_varr1   Úcall_typrn   re   r7   s                                r   rV   rV     s¬  € ð *Ð)Ð)Ð)Ð)Ð)Ø.Ð.Ð.Ð.Ð.Ð.Ø7Ð7Ð7Ð7Ð7Ð7Ø<Ð<Ð<Ð<Ð<Ð<ð ”l×'Ò'Ñ)Ô)€Oå”] ?Ô#9Ñ:Ô:€NØ+€OÔåÔ0°Ô1GÑHÔH€NØ�ÐÐÝÐQÑRÔRÐRð /Ð.Ð.Ð.Ð.Ð.ØÔ)€IØ	×	"Ò	" 9¨iÑ	8Ô	8ð %ð %Ý˜9 i°°ÑGÔGˆåÔ!×'Ò'Ð(:¸B¼HÑEÔEÐEàH\ÐH\ØŒHÔ ¤Ô 2°B´HÔ4DØŒHŒM˜4ñI!ô I!ÑEˆŒÔ˜"œ(Ô.°´Ô0BÀAð 	×'Ò'Ø”HÔ$Ø”HÔ$Ø”hÔ(ØØØ””ØœÔ,Ýœð 	(ñ 	%ô 	%ð 	%ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %õ( Ô2°>Ý8@Ô8KÑ8MÔ8Mñ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¸$¼*ÅbÄfÑ/MÔ/Mð :ÝÔ)¨QÒ.Ð.Ý˜,¨
°D´JÔ4DØ#œzœ°´
Ô0@ÀJÐ0NñPô Pð Pà3=¸d¼jÔ>NÔ3OÔ3T� ¤
¤Ñ0Ø'¨¬
Ô(8Ô9�”
øð	:õ Ô Ò"Ð"ÝÐ Ñ1Ô1Ð1ÝÐ*Ñ+Ô+Ð+ÝÔ˜^Ñ,Ô,Ð,åÔ˜Ñ(Ô(Ð(Ø+€OÔØ˜B×.Ò.¨tÑ4Ô4°QÔ7¸ÐHÐHs   Â!C+FÆFÆF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__g  sl   € Ø1Ð1Ð1Ð1Ð1Ð1Ø�Y‘[”[ˆŒ
Ø(ˆŒ
ÔØ(ˆŒ
ÔØˆŒ
ŒØ!ˆŒ
ÔØ!ˆŒ
ÔØ!%ˆŒ
ÔØ#ˆŒ
ÔÐÐr!   N)rÎ   rp  rq  r.   r   r!   r   rƒ  rƒ  f  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)rl   r&   r_  Ú	const_vals       r   r;  r;  s  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   )rl   r&   r_  Ú	var_constÚ	index_defs        r   rŸ  rŸ    s    € õ �J�y¥"¤&Ñ)Ô)Ñ*Ô*Ð*åÕ)¨:°wÀ	ÑJÔJ€IØÐØÐåÔ'¨
°IÑ>Ô>€IåÝ˜z¨7°Iñ?ô ?€IàÐØÐåÝ 
¨G°Yñ@ô @€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Úevalrg  )rl   r&   r§  Ú	inner_varr   rL   s         r   r¤  r¤  ¢  sj   € õ �J�y¥"¤'Ñ*Ô*ÐF¨y¬|¸wÒ/FÑGÔGÐGØ”€Iå+¨J¸ÀÑKÔK€IÝ	˜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¯  rg  )rl   r&   r§  Úarg1Úarg2rL   s         r   r¥  r¥  ­  sz   € õ �J�y¥"¤'Ñ*Ô*ÐF¨y¬|¸wÒ/FÑGÔGÐGÝ& z°7¸I¼MÑJÔJ€DÝ& z°7¸I¼MÑJÔJ€DÝ	˜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#   rV   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Ø "Ð "Ð "Ð "Ð "Ð "ðð ð ðkð kð kð kð k�&ñ kô kð kðZVIð VIð VIðp
$ð 
$ð 
$ð 
$ð 
$�Fñ 
$ô 
$ð 
$ð
ð 
ð 
ðð ð ð.
ð 
ð 
ð	.ð 	.ð 	.ð1ð 1ð 1ð 1ð 1r!   