+
    –°³j­ ã                  ót  € ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
HtHtHt ^ RIt^ RIt^ RIt^RIHt ^RIHt ^RIHtHtHtHt ^RIHtHt ^R	IHt ^R
IH t H!t! ^RI"H#t# ^RI!H$t$ ^RI%H&t&H't' ^RI(H)t) ^RI*H+t+H,t, ^RI-H.t.H/t/H0t0H1t1H2t2 ^RI3H4t5H6t6 ^RI7H8t8H9t9H:t:H;t;H<t<H=t=H>t>H?t?H@t@ ^RIAHBtB ^RICHDtD ^RIEHFtFHGtGHHtH ]'       d   ^ RIIHJtJHKtK ^RI(HLtLHMtM ^RINHOtO ]P                   ! ]Q4      tRR tS ! R R]T4      tU ! R R]>4      tV]V! 4       P®                  tX]>! 4       P®                  tY]P´                  R]P¶                  R]P¸                  R ]Pº                  R!]P¼                  R"]P¾                  R#]PÀ                  R$]PÂ                  R%]PÄ                  R&]PÆ                  R']PÈ                  R(]PÊ                  R)]PÌ                  R*/tgR+ thR, ti ! R- R.]=4      tj]jP×                  R/4        ! R0 R1]94      tl]PÚ                   ! R2 R34      4       tnR4 toR5 tp ! R6 R7]G4      tq ! R8 R9]H4      trR# ):é    )ÚannotationsN)Údefaultdict)ÚAnyÚcastÚTYPE_CHECKING)Úis_integer_dtype)Ú
OrderedSet)ÚFloorDivÚMaxÚMinÚModularIndexing)Úsymbol_is_typeÚSymT)ÚValueRanges)ÚconfigÚir)ÚHalideCodeCache)Úget_reduction_combine_fn)Úis_metric_table_enabledÚlog_kernel_metadata)ÚAddParenHandler)ÚHalideInputSpecÚ
HalideMeta)Úget_bounds_index_exprÚget_kernel_metadataÚparallel_num_threadsÚsympy_index_symbolÚ
sympy_subs)Ú_opsÚV)	ÚBackendFeatureÚCSEVariableÚDeferredLineÚIndentedBufferÚKernelArgTypeÚOpOverridesÚPythonPrinterÚSizeArgÚ	TensorArg)ÚDTYPE_TO_CPP)Úcexpr)Úconstant_reprÚ
SIMDKernelÚSIMDScheduling)ÚCallableÚSequence)ÚReductionTypeÚ	StoreMode)ÚBlockShapeTypec                óN  € \        V \        4      '       da   RT u;8:  d   R8:  gR   M \        P                  ! \        P                  4      pWP
                  8X  d   R# WP                  8X  d   R# RV : R2# \        V \        4      '       d   R\        V 4       R2# \        V 4      # )l        iÿÿÿzhl.Int(64).min()zhl.Int(64).max()zhl.i64(Ú)zhl.f64(i   €)
Ú
isinstanceÚintÚtorchÚiinfoÚint64ÚminÚmaxÚfloatr,   Úrepr)ÚvalÚinfos   & Ú_/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_inductor/codegen/halide.pyÚhalide_constantrB   >   s€   € Ü�#”s×Ò [°CÖ%E¸:Ö%EÜ�{Š{œ5Ÿ;™;Ó'ˆØ—(‘(Œ?Ù%Ø—(‘(Œ?Ù%Ø˜™˜qÐ!Ð!Ü�#”u×ÒØœ sÓ+Ð,¨AÐ.Ð.Ü�‹9Ðó    c                  ó.   a € ] tR t^KtR V 3R lltRtV ;t# )ÚUnsupportedc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚNone© )Úformats   "rA   Ú__annotate__ÚUnsupported.__annotate__L   s   € ÷ Fñ F ñ FrC   c                	ó,   <€ \         SV `  R V 24       R# )z!halide backend does not support: N)ÚsuperÚ__init__)ÚselfÚthingÚ	__class__s   &&€rA   rQ   ÚUnsupported.__init__L   s   ø€ Ü‰ÑÐ<¸U¸GÐDÖErC   rK   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rQ   Ú__static_attributes__Ú__classcell__©rT   s   @rA   rE   rE   K   s   ø† ÷Fö FrC   rE   c                  óÞ   a € ] tR t^Pt]R 4       t]R 4       tR tR tR t	]	t
R t]tR tR tR	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tV 3R ltR t]tR t R t!Rt"V ;t## )ÚHalidePrinterc                	óD   € R \         P                  P                   RV  R2# )úhl.cast(ú, r5   )r    ÚkernelÚindex_dtype©Úexprs   &rA   Ú
cast_indexÚHalidePrinter.cast_indexQ   s"   € àœ!Ÿ(™(×.Ñ.Ð/¨r°$°°qÐ9Ð9rC   c                	ó   € R V  R2# )úhl.cast(hl.Float(32), r5   rK   rd   s   &rA   Ú
cast_floatÚHalidePrinter.cast_floatU   s   € à'¨ v¨QÐ/Ð/rC   c                	ó   € R V R2# )úhl.f32(r5   rK   ©rR   re   s   &&rA   Ú_print_FloatÚHalidePrinter._print_FloatY   s   € Ø˜˜˜aÐ Ð rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )é   úexpected 1 arg, got rm   r5   ©ÚlenÚargsÚAssertionErrorÚ_printrn   s   &&rA   Ú_print_ToFloatÚHalidePrinter._print_ToFloat\   óO   € Üˆt�y‰y‹>˜QÔÜ Ð#7¼¸D¿I¹I»Ð7GÐ!HÓIÐIà˜Ÿ™ T§Y¡Y¨q¥\Ó2Ð3°1Ð5Ð5rC   c                	óâ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hV P                  RV P	                  VP                  ^ ,          4       R24      # )rr   rs   ú	hl.floor(r5   ©ru   rv   rw   rf   rx   rn   s   &&rA   Ú_print_floorÚHalidePrinter._print_floorb   óX   € Üˆt�y‰y‹>˜QÔÜ Ð#7¼¸D¿I¹I»Ð7GÐ!HÓIÐIà�‰ ¨4¯;©;°t·y±yÀµ|Ó+DÐ*EÀQÐGÓHÐHrC   c                	óâ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hV P                  RV P	                  VP                  ^ ,          4       R24      # )rr   rs   ú	hl.trunc(r5   r~   rn   s   &&rA   Ú_print_TruncÚHalidePrinter._print_Truncj   r�   rC   c                	óâ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hV P                  RV P	                  VP                  ^ ,          4       R24      # )rr   rs   úhl.ceil(r5   r~   rn   s   &&rA   Ú_print_ceilingÚHalidePrinter._print_ceilingr   sX   € Üˆt�y‰y‹>˜QÔÜ Ð#7¼¸D¿I¹I»Ð7GÐ!HÓIÐIà�‰ ¨$¯+©+°d·i±iÀµlÓ*CÐ)DÀAÐFÓGÐGrC   c                	óJ   € R V P                  V P                  V4      4       R2# ©zhl.sqrt(r5   )rj   rx   rn   s   &&rA   Ú_helper_sqrtÚHalidePrinter._helper_sqrtx   s$   € à˜$Ÿ/™/¨$¯+©+°dÓ*;Ó<Ð=¸QÐ?Ð?rC   c                	óæ   € V P                  VP                  ^ ,          4      pV P                  VP                  ^,          4      pV P                  VP                  ^,          4      pRV RV RV R2# )r   ú
hl.select(ra   r5   )Údoprintrv   )rR   re   ÚcÚpÚqs   &&   rA   Ú_print_WhereÚHalidePrinter._print_Where|   s_   € Ø�L‰L˜Ÿ™ 1�Ó&ˆØ�L‰L˜Ÿ™ 1�Ó&ˆØ�L‰L˜Ÿ™ 1�Ó&ˆØ˜A˜3˜b   2 a S¨Ð*Ð*rC   c                	óX  € \        VP                  4      ^8X  d#   V P                  VP                  ^ ,          4      # \        VP                  4      ^,          pV P                  \        VP                  RV !  4      pV P                  \        VP                  VR !  4      pRV RV R2# )rr   Núhl.min(ra   r5   )ru   rv   rx   r   ©rR   re   ÚmidÚaÚbs   &&   rA   Ú
_print_MinÚHalidePrinter._print_Min‚   sŠ   € Üˆt�y‰y‹>˜QÔà—;‘;˜tŸy™y¨�|Ó,Ð,ä�$—)‘)‹n Õ!ˆà�K‰Kœ˜TŸY™Y t¨˜_Ñ-Ó.ˆà�K‰Kœ˜TŸY™Y s t˜_Ñ-Ó.ˆØ˜˜˜2˜a˜S Ð"Ð"rC   c                	óX  € \        VP                  4      ^8X  d#   V P                  VP                  ^ ,          4      # \        VP                  4      ^,          pV P                  \        VP                  RV !  4      pV P                  \        VP                  VR !  4      pRV RV R2# )rr   Núhl.max(ra   r5   )ru   rv   rx   r   r˜   s   &&   rA   Ú
_print_MaxÚHalidePrinter._print_MaxŽ   sŠ   € Üˆt�y‰y‹>˜QÔà—;‘;˜tŸy™y¨�|Ó,Ð,ä�$—)‘)‹n Õ!ˆà�K‰Kœ˜TŸY™Y t¨˜_Ñ-Ó.ˆà�K‰Kœ˜TŸY™Y s t˜_Ñ-Ó.ˆà˜˜˜2˜a˜S Ð"Ð"rC   c                	óâ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hV P                  RV P	                  VP                  ^ ,          4       R24      # )rr   rs   úhl.abs(r5   r~   rn   s   &&rA   Ú
_print_AbsÚHalidePrinter._print_Abs›   sX   € Üˆt�y‰y‹>˜QÔÜ Ð#7¼¸D¿I¹I»Ð7GÐ!HÓIÐIà�‰ ¨¯©°T·Y±Y¸qµ\Ó)BÐ(CÀ1ÐEÓFÐFrC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.cos(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_cosÚ&HalidePrinter._print_OpaqueUnaryFn_cos¡   r{   rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.cosh(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_coshÚ'HalidePrinter._print_OpaqueUnaryFn_cosh§   óO   € Üˆt�y‰y‹>˜QÔÜ Ð#7¼¸D¿I¹I»Ð7GÐ!HÓIÐIà˜$Ÿ+™+ d§i¡i°¥lÓ3Ð4°AÐ6Ð6rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.acos(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_acosÚ'HalidePrinter._print_OpaqueUnaryFn_acos­   r®   rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.sin(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_sinÚ&HalidePrinter._print_OpaqueUnaryFn_sin³   r{   rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.sinh(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_sinhÚ'HalidePrinter._print_OpaqueUnaryFn_sinh¹   r®   rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.asin(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_asinÚ'HalidePrinter._print_OpaqueUnaryFn_asin¿   r®   rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.tan(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_tanÚ&HalidePrinter._print_OpaqueUnaryFn_tanÅ   r{   rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.tanh(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_tanhÚ'HalidePrinter._print_OpaqueUnaryFn_tanhË   r®   rC   c                	óÄ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hRV P                  VP                  ^ ,          4       R2# )rr   rs   úhl.atan(r5   rt   rn   s   &&rA   Ú_print_OpaqueUnaryFn_atanÚ'HalidePrinter._print_OpaqueUnaryFn_atanÑ   r®   rC   c                	ó   € \        R 4      h©Úlog2©ÚNotImplementedErrorrn   s   &&rA   Ú_print_OpaqueUnaryFn_log2Ú'HalidePrinter._print_OpaqueUnaryFn_log2×   s   € Ü! &Ó)Ð)rC   c                	ó  <€ VP                   '       d   \        SV `	  V4      # VP                  w  r#V P	                  V P                  V4      4      pV P	                  V P                  V4      4      pV P                  R V RV R24      # )r}   z / r5   )Ú
is_integerrP   Ú_print_FloorDivrv   rj   r�   rf   )rR   re   ÚxÚdivrT   s   &&  €rA   rÔ   ÚHalidePrinter._print_FloorDivÚ   sr   ø€ Ø�?�?ˆ?Ü‘7Ñ*¨4Ó0Ð0à—‘‰ˆØ�O‰O˜DŸL™L¨›OÓ,ˆØ�o‰o˜dŸl™l¨3Ó/Ó0ˆØ�‰ ¨1¨#¨S°°°QÐ7Ó8Ð8rC   c                	óâ   € \        VP                  4      ^8w  d"   \        R\        VP                  4       24      hV P                  RV P	                  VP                  ^ ,          4       R24      # )rr   rs   ú	hl.round(r5   r~   rn   s   &&rA   Ú_print_RoundÚHalidePrinter._print_Roundã   r�   rC   c                	ó0   € VP                   w  r#R V RV R2# )Ú(ú) / (z+hl.f32(0)))rv   )rR   re   rš   r›   s   &&  rA   Ú_print_IntTrueDivÚHalidePrinter._print_IntTrueDivë   s"   € Ø�y‰y‰ˆà�1�#�U˜1˜#˜[Ð)Ð)rC   c                	ó�   € VP                   w  r#V P                  V4      p\        V4      pR RV) ,          : RV RRV,          : R2# )rm   g      $@z)*hl.round((z	)*hl.f32(ú)))rv   rx   r7   )rR   re   r?   Úns   &&  rA   Ú_print_RoundDecimalÚ!HalidePrinter._print_RoundDecimalð   sJ   € Ø—‘‰ˆà�k‰k˜#ÓˆÜ�‹FˆØ˜ 1 "�Ñ(¨°S°E¸À4ÈÅ7Á+ÈRÐPÐPrC   rK   )$rV   rW   rX   rY   Ústaticmethodrf   rj   ro   ry   r   Ú_print_FloorToIntr„   Ú_print_TruncToIntrˆ   rŒ   r”   rœ   r    r¤   r¨   r¬   r±   rµ   r¹   r½   rÁ   rÅ   rÉ   rÐ   rÔ   rÚ   Ú_print_RoundToIntrß   rä   rZ   r[   r\   s   @rA   r^   r^   P   sÆ   ø† Øñ:ó ð:ð ñ0ó ð0ò!ò6òIð %ÐòIð %ÐòHò@ò+ò
#ò#òGò6ò7ò7ò6ò7ò7ò6ò7ò7ò*õ9òIð %Ðò*÷
Qð QrC   r^   z	hl.Bool()zhl.BFloat(16)zhl.Float(16)zhl.Float(32)zhl.Float(64)z	hl.Int(8)z
hl.Int(16)z
hl.Int(32)z
hl.Int(64)z
hl.UInt(8)zhl.UInt(16)zhl.UInt(32)zhl.UInt(64)c                ó   € \         V ,          # ©N)Ú_halide_type©Údtypes   &rA   Úhalide_typerï     s   € Ü˜ÕÐrC   c                ó  € \        V 4      '       d8   V P                  '       d&   V \        P                  8w  d   \        P                  p V \        P
                  \        P                  39   d   \        P                  p \        V 4      # rë   )	r   Ú	is_signedr8   r:   Úint32Úfloat16Úbfloat16Úfloat32rï   rí   s   &rA   Úhalide_acc_typerö     sR   € Ü˜×Ò 5§?§? ?°uÄÇÁÔ7KÜ—‘ˆØ”—‘¤§¡Ð/Ô/Ü—‘ˆÜ�uÓÐrC   c                  ó�  € ] tR tRt]RMR R ll4       t]R R l4       t]R 4       t]R 4       t	]R	 4       t
]R
 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t ]R  4       t!]R! 4       t"]R" 4       t#]R# 4       t$]R$ 4       t%]R% 4       t&]R& 4       t']R' 4       t(]R( 4       t)]R) 4       t*]R* 4       t+]R+ 4       t,]R, 4       t-]R- 4       t.]R. 4       t/]R/ 4       t0]R0 4       t1]R1 4       t2]R2 4       t3]R3 4       t4]R4 4       t5]R5 4       t6]R6 4       t7]R7 4       t8]R8 4       t9]R9 4       t:]R: 4       t;]R; 4       t<]R< 4       t=]R= 4       t>]R> 4       t?]R? 4       t@]R@ 4       tA]RA 4       tB]RB 4       tC]RC 4       tD]RD 4       tE]RNRE l4       tF]RF 4       tG]RG 4       tH]RH 4       tI]RI 4       tJ]RJ RK l4       tKRLtLR# )OÚHalideOverridesi  Nc               ó    € V ^8„  d   QhRRRR/# )rH   rî   útorch.dtypeÚ	src_dtypeútorch.dtype | NonerK   )rL   s   "rA   rM   ÚHalideOverrides.__annotate__  s   € ÷ 5ñ 5àð5ð &ñ5rC   c                	ó\   € V\         P                  8X  d   R V  R2# R\        V4       RV  R2# )rÝ   z != 0)r`   ra   r5   )r8   Úboolrï   )rÕ   rî   rû   Úuse_compute_typess   &&&&rA   Úto_dtypeÚHalideOverrides.to_dtype  s9   € ð ”E—J‘JÔØ�q�c˜�=Ð Øœ+ eÓ,Ð-¨R°¨s°!Ð4Ð4rC   c               ó    € V ^8„  d   QhRRRR/# )rH   rî   rú   rû   rK   )rL   s   "rA   rM   rý   &  s   € ÷ ñ  ;ð ¸;ñ rC   c                	óî   € V\         P                  \         P                  39   d   R \        V4       RV  R2p R\        V4       RV  R2pV\         P                  \         P                  39   d   RV R2pV# )r`   ra   r5   zhl.reinterpret(ri   )r8   ró   rô   rï   )rÕ   rî   rû   Úlines   &&& rA   Úto_dtype_bitcastÚ HalideOverrides.to_dtype_bitcast%  ss   € àœŸ™¬¯©Ð7Ô7Øœ; yÓ1Ð2°"°Q°C°qÐ9ˆAØ ¤¨UÓ!3Ð 4°B°q°c¸Ð;ˆØ”U—]‘]¤E§N¡NÐ3Ô3Ø+¨D¨6°Ð3ˆDØˆrC   c                	ó8   € V P                  \        V4      V4      # rë   )r  rB   )ÚclsÚvaluerî   s   &&&rA   ÚconstantÚHalideOverrides.constant.  s   € à�|‰|œO¨EÓ2°EÓ:Ð:rC   c                	ó   € R V  R2# )r£   r5   rK   ©rÕ   s   &rA   ÚabsÚHalideOverrides.abs2  ó   € ð ˜˜˜1ˆ~ÐrC   c                	ó^   € \        V R 4      '       g   RV  R2# RV  RV P                   RV  R2# )Únamezhl.exp(r5   z"hl.fast_exp(hl.cast(hl.Float(32), z)) if z!.type().bits() <= 32 else hl.exp(©Úhasattrr  r  s   &rA   ÚexpÚHalideOverrides.exp7  sB   € ô �q˜&×!Ò!Ø˜Q˜C˜q�>Ð!Ø3°A°3°f¸Q¿V¹V¸HÐDeÐfgÐehÐhiÐjÐjrC   c                	ó   € R V  R2# r‹   rK   r  s   &rA   ÚsqrtÚHalideOverrides.sqrt>  ó   € ð ˜!˜˜AˆÐrC   c                	ó¨   € \        V R 4      '       g
   RV  RV R2# RV P                   RV R2pRV  RV RV  R	V  RV R
V P                   RV  RV R2# )r  r—   ra   r5   r`   ú	.type(), úhl.select((Ú<ú)|hl.is_nan(ú), ú) if z.type().is_float() else hl.min(r  ©rš   r›   s   &&rA   ÚminimumÚHalideOverrides.minimumC  ó‚   € ô �q˜&×!Ò!Ø˜Q˜C˜r !  AÐ&Ð&Ø�q—v‘v�h˜i¨ s¨!Ð,ˆØ˜Q˜C˜q   <°¨s°#°a°S¸¸1¸#¸UÀ1Ç6Á6À(ÐJiÐjkÐilÐlnÐopÐnqÐqrÐsÐsrC   c                	ó¨   € \        V R 4      '       g
   RV  RV R2# RV P                   RV R2pRV  RV RV  R	V  RV R
V P                   RV  RV R2# )r  rŸ   ra   r5   r`   r  r  Ú>r   r!  r"  z.type().is_float() else hl.max(r  r#  s   &&rA   ÚmaximumÚHalideOverrides.maximumL  r&  rC   c                	ó   € R V  RV R2# )rŸ   ra   r5   rK   r#  s   &&rA   ÚfmaximumÚHalideOverrides.fmaximumU  s   € ð ˜˜˜2˜a˜S Ð"Ð"rC   c                	ód   € \        VR 4      '       d   RVP                   RV R2pRV  RV RV R2# )r  r`   r  r5   r�   ra   r  )rš   r›   r‘   s   &&&rA   ÚwhereÚHalideOverrides.whereZ  sD   € ô �1�f×ÒØ˜1Ÿ6™6˜( )¨A¨3¨aÐ0ˆAØ˜A˜3˜b   2 a S¨Ð*Ð*rC   c                	ó   € R V  R2# )r§   r5   rK   r  s   &rA   ÚcosÚHalideOverrides.cosa  r  rC   c                	ó   € R V  R2# )r´   r5   rK   r  s   &rA   ÚsinÚHalideOverrides.sinf  r  rC   c                	ó   € \        R 4      h)Úlgamma©rE   r  s   &rA   r8  ÚHalideOverrides.lgammak  ó   € ô ˜(Ó#Ð#rC   c                	ó   € R V  R2# )zhl.erf(r5   rK   r  s   &rA   ÚerfÚHalideOverrides.erfp  r  rC   c                	ó   € R V  R2# )r«   r5   rK   r  s   &rA   ÚcoshÚHalideOverrides.coshu  r  rC   c                	ó   € R V  R2# )r¸   r5   rK   r  s   &rA   ÚsinhÚHalideOverrides.sinhz  r  rC   c                	ó   € R V  R2# )r°   r5   rK   r  s   &rA   ÚacosÚHalideOverrides.acos  r  rC   c                	ó   € R V  R2# )z	hl.acosh(r5   rK   r  s   &rA   ÚacoshÚHalideOverrides.acosh„  ó   € ð ˜1˜#˜QÐÐrC   c                	ó   € R V  R2# )r¼   r5   rK   r  s   &rA   ÚasinÚHalideOverrides.asin‰  r  rC   c                	ó   € R V  R2# )z	hl.asinh(r5   rK   r  s   &rA   ÚasinhÚHalideOverrides.asinhŽ  rK  rC   c                	ó   € R V  RV R2# )z	hl.atan2(ra   r5   rK   ©rÕ   Úys   &&rA   Úatan2ÚHalideOverrides.atan2“  ó   € ð ˜1˜#˜R ˜s !Ð$Ð$rC   c                	ó   € R V  R2# )rÈ   r5   rK   r  s   &rA   ÚatanÚHalideOverrides.atan˜  r  rC   c                	ó   € R V  R2# )z	hl.atanh(r5   rK   r  s   &rA   ÚatanhÚHalideOverrides.atanh�  rK  rC   c                	ó   € \        R 4      h)Úcopysignr9  rS  s   &&rA   r_  ÚHalideOverrides.copysign¢  s   € ô ˜*Ó%Ð%rC   c                	ó   € \        R 4      h)Úerfinvr9  r  s   &rA   rb  ÚHalideOverrides.erfinv§  r;  rC   c                	ó   € R V  RV R2# )z	hl.hypot(ra   r5   rK   rS  s   &&rA   ÚhypotÚHalideOverrides.hypot¬  rW  rC   c                	ó   € \        R 4      h)Ú	nextafterr9  rS  s   &&rA   rh  ÚHalideOverrides.nextafter±  s   € ô ˜+Ó&Ð&rC   c                	ó   € V  R V 2# ©z & rK   r#  s   &&rA   Úlogical_andÚHalideOverrides.logical_and¶  ó   € ð ��C˜�sˆ|ÐrC   c                	ó   € V  R 2# )z == 0rK   ©rš   s   &rA   Úlogical_notÚHalideOverrides.logical_not»  s   € à��Eˆ{ÐrC   c                	ó   € V  R V 2# ©z | rK   r#  s   &&rA   Ú
logical_orÚHalideOverrides.logical_or¿  rn  rC   c                	ó   € R V  RV R2# )rÝ   ú ^ r5   rK   r#  s   &&rA   Úlogical_xorÚHalideOverrides.logical_xorÄ  s   € ð �1�#�S˜˜˜1ˆ~ÐrC   c                	ó   € V  R V 2# rk  rK   r#  s   &&rA   Úbitwise_andÚHalideOverrides.bitwise_andÉ  ó   € à��C˜�sˆ|ÐrC   c                	ó   € R V  2# )Ú~rK   rp  s   &rA   Úbitwise_notÚHalideOverrides.bitwise_notÍ  s   € à�1�#ˆwˆrC   c                	ó   € V  R V 2# rt  rK   r#  s   &&rA   Ú
bitwise_orÚHalideOverrides.bitwise_orÑ  r~  rC   c                	ó   € V  R V 2# )rx  rK   r#  s   &&rA   Úbitwise_xorÚHalideOverrides.bitwise_xorÕ  r~  rC   c                	ó   € V  R V 2# )z << rK   r#  s   &&rA   Úbitwise_left_shiftÚ"HalideOverrides.bitwise_left_shiftÙ  ó   € à��D˜˜ˆ}ÐrC   c                	ó   € V  R V 2# )z >> rK   r#  s   &&rA   Úbitwise_right_shiftÚ#HalideOverrides.bitwise_right_shiftÝ  rŒ  rC   c                	ó   € R V  RV R2# )zhalide_helpers.rand(ra   r5   rK   ©ÚseedÚoffsets   &&rA   ÚrandÚHalideOverrides.randá  s   € à% d V¨2¨f¨X°QÐ7Ð7rC   c                	ó   € R V  RV R2# )zhalide_helpers.randn(ra   r5   rK   r‘  s   &&rA   ÚrandnÚHalideOverrides.randnå  s   € à& t f¨B¨v¨h°aÐ8Ð8rC   c                	ó&   € R V  RV RV RV RV R2# )z!halide_helpers.rand_eager_kernel(ra   r5   rK   )r’  Úbase_offsetÚthreads_per_roundÚtidÚvecs   &&&&&rA   Ú
rand_eagerÚHalideOverrides.rand_eageré  s2   € à2°4°&¸¸;¸-ÀrÐJ[ÐI\Ð\^Ð_bÐ^cÐceÐfiÐejÐjkÐlÐlrC   c           	     	ó    € R V  RV RV RV R2	# )zhalide_helpers.randint64(ra   r5   rK   )r’  r“  ÚlowÚhighs   &&&&rA   Ú	randint64ÚHalideOverrides.randint64í  s#   € à*¨4¨&°°6°(¸"¸S¸EÀÀDÀ6ÈÐKÐKrC   c                	óŠ   € \         P                  ! V ^ 4       R\        P                  P                  P                  RV4       2# )r   ú + Úload_seed_offset)ÚopsÚloadr    rb   rv   Úseed_offset)r  r“  s   &&rA   Ú	load_seedÚHalideOverrides.load_seedñ  s7   € ä—(’(˜4 Ó#Ð$ C¬¯©¯©×(AÑ(AÐBTÐV\Ó(]Ð'^Ð_Ð_rC   c                	ó   € R V  R2# )z1./hl.sqrt(r5   rK   r  s   &rA   ÚrsqrtÚHalideOverrides.rsqrtõ  s   € ð ˜Q˜C˜qÐ!Ð!rC   c                	ó   € R V  R2# )rÀ   r5   rK   r  s   &rA   ÚtanÚHalideOverrides.tanû  r  rC   c                	ó   € R V  R2# )rÄ   r5   rK   r  s   &rA   ÚtanhÚHalideOverrides.tanh   r  rC   c                	ó   € R V  R2# )z3(hl.reinterpret(hl.UInt(32), hl.cast(hl.Float(32), z)) >> 31) != 0rK   r  s   &rA   ÚsignbitÚHalideOverrides.signbit  s   € ð EÀQÀCÀ~ÐVÐVrC   c                	ó   € V  R V  RV RV 2# )z - hl.trunc(Ú/z)*rK   r#  s   &&rA   ÚfmodÚHalideOverrides.fmod
  s!   € ð ��L   1 Q C r¨!¨Ð-Ð-rC   c                	ó   € R V  RV R2# )zhl.pow(ra   r5   rK   r#  s   &&rA   ÚpowÚHalideOverrides.pow  s   € à˜˜˜2˜a˜S Ð"Ð"rC   c                	ó   € \        R 4      h)Úldexpr9  )rÕ   rã   s   &&rA   rÁ  ÚHalideOverrides.ldexp  s   € ô ˜'Ó"Ð"rC   c                	ó   € R V  R2# )zhl.log(r5   rK   r  s   &rA   ÚlogÚHalideOverrides.log  r  rC   c                	ó   € \        R 4      hrÌ   rÎ   r  s   &rA   rÍ   ÚHalideOverrides.log2  s   € ä! &Ó)Ð)rC   c                	ó   € R V  R2# )z hl.is_inf(hl.cast(hl.Float(32), râ   rK   r  s   &rA   ÚisinfÚHalideOverrides.isinf"  ó   € ð 2°!°°BÐ7Ð7rC   c                	ó   € R V  R2# )z hl.is_nan(hl.cast(hl.Float(32), râ   rK   r  s   &rA   ÚisnanÚHalideOverrides.isnan(  rË  rC   c                	ó   € R V  R2# )rÙ   r5   rK   r  s   &rA   ÚroundÚHalideOverrides.round.  rK  rC   c                	ó   € R V  R2# )r}   r5   rK   r  s   &rA   ÚfloorÚHalideOverrides.floor3  rK  rC   c                	ó   € R V  RV R2# )rÝ   rÞ   z + hl.f32(0))rK   r#  s   &&rA   Úint_truedivÚHalideOverrides.int_truediv8  s   € à�1�#�U˜1˜#˜]Ð+Ð+rC   c                	ó.   € R V P                    RV  RV R2# )z"hl.floor(hl.cast(hl.Float(max(32, ú.type().bits())), ú) / r5   ©r  r#  s   &&rA   ÚfloordivÚHalideOverrides.floordiv<  s)   € ð 1°·±°Ð8JÈ1È#ÈTÐRSÐQTÐTUÐVð	
rC   c                	ó<  € \         P                  ! \         P                  ! R V4      \        P                  4      p\         P                  ! \         P                  ! VR 4      \        P                  4      p\         P
                  ! W#4      pRVP                   RV R2# )Ú0r`   r  r5   )r¨  r  Últr8   Úint8Úsubr  )r	  rÕ   ÚleftÚrightrâ  s   &&   rA   ÚsignÚHalideOverrides.signC  se   € ä�|Š|œCŸFšF 3¨›N¬E¯J©JÓ7ˆÜ—’œSŸVšV A s›^¬U¯Z©ZÓ8ˆÜ�gŠg�dÓ"ˆØ˜!Ÿ&™&˜ ¨3¨%¨qÐ1Ð1rC   c                	ó   € R V  R2# )rƒ   r5   rK   r  s   &rA   ÚtruncÚHalideOverrides.truncJ  rK  rC   c                	ó.   € R V P                    RV  RV R2# )z"hl.trunc(hl.cast(hl.Float(max(32, rÙ  rÚ  r5   rÛ  r#  s   &&rA   ÚtruncdivÚHalideOverrides.truncdivO  s)   € ð 1°·±°Ð8JÈ1È#ÈTÐRSÐQTÐTUÐVð	
rC   c                	ó   € R V  R2# )r‡   r5   rK   r  s   &rA   ÚceilÚHalideOverrides.ceilX  r  rC   c                	ó   € R V  R2# )rŸ   z, 0)rK   r  s   &rA   ÚreluÚHalideOverrides.relu]  s   € à˜˜˜4Ð Ð rC   c                	ó„  € \         P                  P                  V4      p\         P                  P                  \         P                  P	                  V4      \         P                  P                  V4      \        V4      R 7      pV\        P                  \        P                  39  d   \        P                  ! WB4      # V# ©)Úbounds)r    rb   Úprepare_indexingÚgenfuncÚindex_to_strÚused_dims_from_indexr   r8   rò   r:   r¨  r  ©r	  re   rî   ÚindexÚvars   &&&  rA   Ú
index_exprÚHalideOverrides.index_expra  s†   € ä—‘×)Ñ)¨$Ó/ˆÜ�h‰h×ÑÜ�H‰H×!Ñ! %Ó(Ü�H‰H×)Ñ)¨%Ó0Ü(¨Ó.ð ó 
ˆð
 œŸ™¤e§k¡kÐ2Ô2Ü—<’< Ó+Ð+Øˆ
rC   c                	ó6  € \         P                  P                  V4      p\         P                  P                  \         P                  P	                  V4      \         P                  P                  V4      \        V4      R 7      p\        P                  ! WB4      # rô  )	r    rb   rö  r÷  rø  rù  r   r¨  r  rú  s   &&&  rA   Ú
value_exprÚHalideOverrides.value_exprm  sl   € ä—‘×)Ñ)¨$Ó/ˆÜ�h‰h×ÑÜ�H‰H×!Ñ! %Ó(Ü�H‰H×)Ñ)¨%Ó0Ü(¨Ó.ð ó 
ˆô
 �|Š|˜CÓ'Ð'rC   c                	ó®   € \         P                  ! V\        P                  4      p\         P                  ! WV4      pW!n        \        \        V4      4      # rë   )r¨  r  r8   rò   Úhalide_clampÚindirect_indexing_sizer   Ústr)r	  Ú	index_varÚsizeÚcheckÚwrap_negs   &&&&&rA   Úindirect_indexingÚ!HalideOverrides.indirect_indexingw  s?   € ô —L’L ¬E¯K©KÓ8ˆ	Ü×$Ò$ Y°eÓ<ˆ	Ø+/Ô(Ü!¤# i£.Ó1Ð1rC   c                	ó  € \         P                  P                  \         P                  P                  V4      ^,
          4      p\	        V\
        \        P                  34      '       g   RVP                   RV R2pRV RV R2# )rr   r`   r  r5   z	hl.clamp(z, 0, )	r    rb   ÚkexprÚrename_indexingr6   r7   ÚsympyÚIntegerr  )r	  r
  r  r  Úends   &&&& rA   r  ÚHalideOverrides.halide_clamp  sm   € ä�h‰h�n‰nœQŸX™X×5Ñ5°dÓ;¸aÕ?Ó@ˆÜ˜$¤¤e§m¡mÐ 4×5Ò5Ø˜UŸZ™Z˜L¨	°#°°aÐ8ˆCð ˜5˜'  s e¨1Ð-Ð-rC   c                	óÈ  € \         P                  P                  W4      ;_uu_ 4       pV! 4       pR R R 4       XP                  P                  '       d   \        V4      p\         P                  P                  RVP                   R\        V4       R2. \        P                  ! V4      VP                  R7      p\        P                  ! XWB4      #   + '       g   i     L©; i)Nr`   r  r5   ©rõ  Úshape)r    rb   Ú
mask_loadsrõ  Úis_boolrÿ   r÷  r  rB   r   Úwrapr  r¨  r/  )ÚmaskÚbodyÚotherÚnew_maskÚresults   &&&  rA   ÚmaskedÚHalideOverrides.maskedˆ  s«   € ä�X‰X× Ñ  ×-Ô-°Ù“VˆF÷ .ð �=‰=× × Ð Ü˜“KˆEô —‘× Ñ Ø�v—{‘{�m 9¬_¸UÓ-CÐ,DÀAÐFØÜ×#Ò# EÓ*Ø—,‘,ð	 !ó 
ˆô �yŠy˜ 6Ó1Ð1÷ .×-ús   ¨CÃC!	c                	ó   € \        R 4      h)ÚfrexprÎ   r  s   &rA   r!  ÚHalideOverrides.frexpš  s   € ô " 'Ó*Ð*rC   c                	ó   € \        R 4      h)Údevice_assert_asyncrÎ   )ÚcondÚmsgs   &&rA   r$  Ú#HalideOverrides.device_assert_asyncŸ  s   € ä!Ð"7Ó8Ð8rC   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rH   r  r  Úreduction_typer
  r"   Ú
extra_metazdict[str, Any]rI   rJ   rK   )rL   s   "rA   rM   rý   ¥  s:   € ÷ "ñ "Øð"àð"ð ð"ð #ð	"ð
 
ñ"rC   c                	ó   € \         hrë   rÎ   )r  r)  r
  r*  s   &&&&rA   Úpartial_accumulateÚ"HalideOverrides.partial_accumulate£  s
   € ô "Ð!rC   rK   ©NT)TT)MrV   rW   rX   rY   ræ   r  r  Úclassmethodr  r  r  r  r$  r)  r,  r/  r2  r5  r8  r=  r@  rC  rF  rI  rM  rP  rU  rY  r\  r_  rb  re  rh  rl  rq  ru  ry  r|  r�  r„  r‡  rŠ  rŽ  r”  r—  rž  r£  r«  r®  r±  r´  r·  r»  r¾  rÁ  rÄ  rÍ   rÉ  rÍ  rÐ  rÓ  rÖ  rÜ  rå  rè  rë  rî  rñ  rý  r   r
  r  r  r!  r$  r,  rZ   rK   rC   rA   rø   rø     s†  † Øö5ó ð5ð ôó ðð ñ;ó ð;ð ñó ðð ñkó ðkð
 ñó ðð ñtó ðtð ñtó ðtð ñ#ó ð#ð ñ+ó ð+ð
 ñó ðð ñó ðð ñ$ó ð$ð ñó ðð ñó ðð ñó ðð ñó ðð ñ ó ð ð ñó ðð ñ ó ð ð ñ%ó ð%ð ñó ðð ñ ó ð ð ñ&ó ð&ð ñ$ó ð$ð ñ%ó ð%ð ñ'ó ð'ð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñ8ó ð8ð ñ9ó ð9ð ñmó ðmð ñLó ðLð ñ`ó ð`ð ñ"ó ð"ð ñó ðð ñó ðð ñWó ðWð ñ.ó ð.ð ñ#ó ð#ð ñ#ó ð#ð ñó ðð ñ*ó ð*ð ñ8ó ð8ð ñ8ó ð8ð ñ ó ð ð ñ ó ð ð ñ,ó ð,ð ñ
ó ð
ð ñ2ó ð2ð ñ ó ð ð ñ
ó ð
ð ñó ðð ñ!ó ð!ð ñ	ó ð	ð ñ(ó ð(ð ó2ó ð2ð ñ.ó ð.ð ñ2ó ð2ð" ñ+ó ð+ð ñ9ó ð9ð ô"ó ô"rC   rø   Úhalidec                  ót   a € ] tR tRt]P
                  ! R4      tRR V 3R llltR tR t	R R lt
R	 tR
tV ;t# )ÚHalideCSEVariablei±  z\b(tmp\d+)\[\?\]c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rH   rõ  zValueRanges[Any]rî   rü   r  r3   rI   rJ   rK   )rL   s   "rA   rM   ÚHalideCSEVariable.__annotate__´  s4   € ÷ 9ñ 9ð !ð9ð "ð	9ð
 ð9ð 
ñ9rC   c                	ó8   <€ \         SV `  WW4R 7       RV n        R# )©r  N)rP   rQ   Ú	used_dims)rR   r  rõ  rî   r  rT   s   &&&&&€rA   rQ   ÚHalideCSEVariable.__init__´  s   ø€ ô 	‰Ñ˜ uÐÔ:Ø48ˆŽrC   c                	ó~  € \        V P                  ;'       g    R4      p\        P                  ! W#P	                  4       4       FQ  p\        V\        4      '       g   K  VP                  f   \        WV34      hVP                  VP                  4       KS  	  \        P                  P                  V4      V n        R # )NrK   )r	   r7  Ú	itertoolsÚchainÚvaluesr6   r2  rw   Úupdater    rb   Úsort_used_dims)rR   r  rv   ÚkwargsÚusedÚargs   &&&&  rA   Úupdate_on_argsÚ HalideCSEVariable.update_on_args¾  s�   € Ü˜$Ÿ.™.×.Ð.¨BÓ/ˆÜ—?’? 4¯©«Ö9ˆCÜ˜#Ô0×1Ô1Ø—=‘=Ò(Ü(¨$°TÐ):Ó;Ð;Ø—‘˜CŸM™MÖ*ñ	 :ô
 Ÿ™×0Ñ0°Ó6ˆŽrC   c                	óž   € \        V4      ^ 8X  d   V P                   R2# V P                   RRP                  \        \        V4      4       R2# )r   z[()]Ú[ra   Ú])ru   r  ÚjoinÚmapr  )rR   Údimss   &&rA   Ú	index_strÚHalideCSEVariable.index_strÇ  sE   € Üˆt‹9˜Œ>Ø—i‘i�[ Ð%Ð%à—)‘)�˜A˜dŸi™i¬¬C°«Ó7Ð8¸Ð:Ð:rC   c               ó   € V ^8„  d   QhRR/# )rH   rI   r  rK   )rL   s   "rA   rM   r4  Í  s   € ÷ .ñ .˜ñ .rC   c                	ór   € V P                   f   V P                   R2# V P                  V P                   4      # )Nz[?])r7  r  rJ  )rR   s   &rA   Ú__str__ÚHalideCSEVariable.__str__Í  s0   € Ø�>‰>Ò!à—i‘i�[ Ð$Ð$Ø�~‰~˜dŸn™nÓ-Ð-rC   c           	     	óL  € V P                   eO   \        ;QJ d&    R V P                    4       F  '       d   K   RM	  RM! R V P                    4       4      '       g   \        R4      hT P                  V P                    Uu. uF  q!P	                  W"4      NK  	  up4      # u upi )Nc              3  óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5irë   ©r6   r  ÚExpr©Ú.0rÕ   s   & rA   Ú	<genexpr>Ú-HalideCSEVariable.subs_str.<locals>.<genexpr>Ö  s   é € ÐF±~°!”J˜q¤%§*¡*×-Ð-³~ùó   ‚')FTz'used_dims must be set sympy expressions)r7  Úallrw   rJ  Úget)rR   Úreplacementsrã   s   && rA   Úsubs_strÚHalideCSEVariable.subs_strÓ  so   € à�N‰NÒ&ß“ÑF°t·~²~ÓF——’ÑF°t·~²~ÓF×FÒFä Ð!JÓKÐKØ�~‰~¸t¿~º~ÓN¹~¸!×/Ñ/°Ö5¹~ÑNÓOÐOùÒNs   ÂB!)r7  )NN)rV   rW   rX   rY   ÚreÚcompileÚundefined_rerQ   rB  rJ  rN  r\  rZ   r[   r\   s   @rA   r2  r2  ±  s7   ø† Ø—:’:Ð1Ó2€L÷9ò 9ò7ò;õ.÷Pð PrC   r2  c                  óX   a € ] tR tRt$ R]R&   R]R&   R]R&   R V 3R lltRR	 ltR
tV ;t# )ÚDimensionInfoiÜ  zsympy.Expr | Nonere   ú
sympy.Exprr  Ústridec               ó   € V ^8„  d   QhRR/# rG   rK   )rL   s   "rA   rM   ÚDimensionInfo.__annotate__â  s   € ÷ ñ ¨dñ rC   c                	ó´   <€ \         SV `  4        \        P                  P                  P                  V^ 4      '       d   V) pV) pWn        W n        W0n        R# )r   N)	rP   rQ   r    ÚgraphÚsizevarsÚstatically_known_ltre   r  rd  )rR   re   r  rd  rT   s   &&&&€rA   rQ   ÚDimensionInfo.__init__â  sH   ø€ Ü‰ÑÔÜ�7‰7×Ñ×/Ñ/°¸×:Ò:Ø�WˆFØ�5ˆDØŒ	ØŒ	ØŽrC   c                	ó–  € V P                   f   \        R4      hV P                   pV'       d
   V^ 8X  d   R# V'       dî   / VCpVP                   FÎ  p\        V\        P
                  4      '       g   K%  \        V\        P                  4      '       g   \        R\        V4       24      h\        P                  P                  VP                  4      p\        V\        4      '       g   \        R\        V4       24      h\        VP!                  V4      4      W&   KÐ  	  \#        W14      p\        P                  P%                  V4      # )Nzexpr must not be Noneúhl.Var()úexpected sympy.Symbol, got ú expected HalideCSEVariable, got )re   rw   Úfree_symbolsr   r   ÚTMPr6   r  ÚSymbolÚtyper    rb   Úlookup_cse_varr  r2  r   r\  r   rø  )rR   r[  Ú	zero_varsre   Úsymrü  s   &&&   rA   rJ  ÚDimensionInfo.index_strë  sþ   € Ø�9‰9ÒÜ Ð!8Ó9Ð9Ø�y‰yˆß˜ œÙßØ+˜lÐ+ˆLà×(Ô(�Ü! #¤t§x¡x×0Ô0Ü% c¬5¯<©<×8Ò8Ü,Ð/JÌ4ÐPSË9È+Ð-VÓWÐWÜŸ(™(×1Ñ1°#·(±(Ó;�CÜ% cÔ+<×=Ò=Ü,Ø>¼tÀC»y¸kÐJóð ô );¸3¿<¹<ÈÓ;UÓ(V�LÓ%ñ )ô ˜dÓ1ˆDÜ�x‰x×$Ñ$ TÓ*Ð*rC   )re   r  rd  ©NF)	rV   rW   rX   rY   Ú__annotations__rQ   rJ  rZ   r[   r\   s   @rA   rb  rb  Ü  s)   ø‡ à
ÓØ
ÓØÓ÷ð ÷+ò +rC   rb  c                ó|   € \         P                  P                  P                  \        P
                  ! W4      4      # rë   )r    rh  ri  Úguard_or_falser  ÚEq)rã  rä  s   &&rA   Úeqr}    s&   € Ü�7‰7×Ñ×*Ñ*¬5¯8ª8°DÓ+@ÓAÐArC   c                óÐ   € \         P                  P                  P                  \        P
                  ! W4      4      '       d   R# \        P                  ! W4      pW 8X  d   W8g  # R# )z3Compare sizes: only use on inputs known to be >= 0.TF)r    rh  ri  r{  r  ÚLtÚgcd)rã  rä  r€  s   && rA   rà  rà    sI   € ä‡w�w×Ñ×&Ñ&¤u§x¢x°Ó'<×=Ò=Ùô �)Š)�DÓ
 €CØ
„{Ø‰}ÐárC   c                  ó¬  a € ] tR tRt$ ]t]tR]R&   R V 3R llt	R R lt
R7R	 ltR
 V 3R lltR tR tR V 3R lltR tR R ltR tR tR R ltR tR8R ltR R ltR R ltR9R R lltR R  ltR! tR" R# ltR$]P<                  ! 4       R%R/R& R' lltR%R/R( R) llt R* R+ lt!R, t"R- R. lt#R9R/ lt$]%R0 4       t&R:R1 R2 llt'R3 t(R4 R5 lt)R6t*V ;t+# );ÚHalideKerneli  zCallable[[sympy.Expr], str]r  c               ó    € V ^8„  d   QhRRRR/# )rH   Útilingzdict[str, sympy.Expr]rI   rJ   rK   )rL   s   "rA   rM   ÚHalideKernel.__annotate__  s   € ÷ +ñ +à%ð+ð 
ñ	+rC   c                	ó|  <€ \         SV `  ! V3/ VB  V P                  V n        V P                  V n        V P                  V n        \        4       V n        V P                  V n	        V P                  V n
        / V n        / V n        / V n        / V n        / V n        / V n        \#        \$        4      V n        R V n        R# )FN)rP   rQ   r  ÚcomputeÚloadsÚstoresr$   Úindexing_code_domÚinside_reductionÚneeds_dom_indexingÚhas_reductionÚbuffer_dimensionsÚbuffer_offsetsÚhalide_varsÚindex_replacementsÚreduction_renamesÚdom_renamesr   ÚlistÚbuffer_aliasesÚhas_indirect_indexing)rR   r„  r?  rT   s   &&,€rA   rQ   ÚHalideKernel.__init__  s¤   ø€ ô
 	‰Ò˜Ñ* 6Ò*à—y‘yˆŒØ—Y‘YˆŒ
Ø—i‘iˆŒÜ!/Ó!1ˆÔØ"&×"7Ñ"7ˆÔØ!×2Ñ2ˆÔØACˆÔØ57ˆÔà;=ˆÔà@BˆÔàCEˆÔàHJˆÔä4?ÄÓ4EˆÔØ%*ˆÖ"rC   c               ó    € V ^8„  d   QhRRRR/# )rH   rî   rú   rI   r  rK   )rL   s   "rA   rM   r…  9  s   € ÷ "ñ " +ð "°#ñ "rC   c                	ó   € \        V4      # rë   )rï   )rR   rî   s   &&rA   Údtype_to_strÚHalideKernel.dtype_to_str9  s   € Ü˜5Ó!Ð!rC   Nc                	ó^   € V P                   P                  V R V: R24       \        WW44      # )z = hl.Func(r5   )r  Ú	writeliner2  )rR   r  rõ  rî   r  s   &&&&&rA   Úcreate_cse_varÚHalideKernel.create_cse_var=  s.   € Ø�	‰	×Ñ˜t˜f K°©x°qÐ9Ô:ä  ¨uÓ<Ð<rC   c               ó   € V ^8„  d   QhRR/# )rH   ÚindiceszSequence[sympy.Expr]rK   )rL   s   "rA   rM   r…  B  s   € ÷ uñ uÐ)=ñ urC   c           
     ó¸  <aaa€ V P                   '       g%   V P                  '       g   V P                  '       d   \        R4      h\        P
                  ! \        P                  P                  P                  \        P                  R7      o\        P                  \        \        S V `@  V4      4      p\"        \$        ,          ! 4       o\&        P(                  P+                  V P,                   Uu. uF  q"P.                  P1                  4       NK  	  up4       Uu/ uF  pVP3                  4       VbK  	  upoR pVV3R lpVV3R lpV Fÿ  pVP5                  \6        4      '       dZ   VP9                  \7        \:        P<                  ! R4      \:        P<                  ! R4      \:        P<                  ! R4      4      V4       VP5                  \>        4      '       dE   VP9                  \?        \:        P<                  ! R4      \:        P<                  ! R4      4      V4       SPA                  \        S V `A  V4      PB                  4       EK  	  \D        ;QJ d    R	 S 4       F  '       g   K   R
M	  RM! R	 S 4       4      V n#        Rp\I        V P,                  4       EFz  pVP.                  P1                  4        Uu. uF  q3P3                  4       S9   g   K  VNK  	  p	pV	PK                  V3R lR7       V	'       g,   V	PM                  VPO                  ^VPP                  4      4       ^ p
\:        PR                  PT                  p. pV
\W        V	4      8  Edñ   \Y        VPP                  V4      '       EgÔ   V	 Uu. uF3  p\Y        VPZ                  V4      '       g   K!  V! VP\                  4      NK5  	  ppV
\W        V4      ,          p
V'       g   \        V	4      hV\        P^                  ! R V4      ,          pTPa                  V	 Uu. uFW  p\c        W³PZ                  4      '       g   K   \c        VPZ                  V4      '       g   K>  V! VPZ                  V,          4      NKY  	  up4       V'       g   EK/  \        P^                  ! \:        Pd                  V4      p\Y        V^4      '       dF   V! VPP                  V,          4      p\Y        V^4      '       d   \        R4      h. p\W        V	4      p
R
p\g        R\W        V P                  4       24      pVPh                  '       d/   \g        R\W        V P                  4       24      V P                  V&   WðP                  V&   VPM                  VV34       W¿,          pV	 Uu. uF-  p\Y        VPZ                  V4      '       g   K!  VP\                  NK/  	  ppV
\W        V4      ,          p
\W        V4      pV Uu. uF4  p\Y        VV4      '       d   K  \:        Pj                  ! VV,          4      NK6  	  pp\W        V4      V8  g   V^ 8X  g   \        R4      hVPa                  V4       EKÝ  V	 FÉ  p ^ p^p\Y        VPZ                  V4      '       g!   VV,          w  ppV^,          pVV,          pK<  ^p\:        PR                  Pl                  p\Y        VP\                  V4      '       g1   VV,          w  ppV^,          pVVV,          ,          pVV,          pKL  VV P                   VP3                  4       &   KË  	  EK}  	  V P                   F/  pV Pr                  Pu                  V RVPv                  : R24       K1  	  V P                  '       dT   T Py                  RV P                  P{                  4        UUu/ uF  w  ppVV P                  V,          bK  	  upp4       R# R# u upi u upi u upi u upi u upi u upi u upi   \n         dá    T'       g   \        R4      Rh\:        PR                  Pl                  p\:        PR                  PT                  pT F  w  ppTTT,          ,          pTT,          pK!  	  \        P                  P                  Pq                  \7        TTPZ                  TP\                  4      T P                  4      T P                   TP3                  4       &    EK…  i ; iu uppi )a¹  
Hook called right before codegen with every index that will be
used in the fused kernel.

This populates self.halide_vars/index_replacements/reduction_renames which is an alternate indexing
scheme that avoids using divide and modulus.  Instead of xindex/yindex/rindex
we base indexing on a larger number of vars whose product combines to those.

This function populates self.halide_vars, self.index_replacements, and self.reduction_renames
z5indexing state must be empty before finalize_indexing©Úfallbackc                ó|   € \         P                  ! \        P                  P                  P                  V 4      4      # rë   )r  Úsimplifyr    rh  ri  Úremove_precomputed_replacementsrd   s   &rA   r¦  Ú0HalideKernel.finalize_indexing.<locals>.simplify^  s+   € Ü—>’>Ü—‘× Ñ ×@Ñ@ÀÓFóð rC   c                ó8  <€ V S9   d’   SV ,          pSP                  VP                  P                  VP                  V,          \        P
                  P                  P                  V\        VP                  V4      4      4      P                  4       4       R # R # rë   )ÚaddÚrootÚlookupÚdivisorr    rh  ri  Úevaluate_minr
   ÚlengthÚsymbol)Úbaser­  ÚmodulusÚnodeÚall_used_symbolsÚsym_to_nodes   &&& €€rA   Úvisit_modular_indexingÚ>HalideKernel.finalize_indexing.<locals>.visit_modular_indexingc  sx   ø€ Ø�{Ô"Ø" 4Õ(�Ø ×$Ñ$Ø—I‘I×$Ñ$ØŸ™ wÕ.ÜŸ™×(Ñ(×5Ñ5Ø#Ü$ T§[¡[°'Ó:óó÷ ‘f“höñ #rC   c           	     óè   <€ V S9   dj   SV ,          pSP                  VP                  P                  VP                  V,          \	        VP
                  V4      4      P                  4       4       R # R # rë   )rª  r«  r¬  r­  r
   r¯  r°  )r±  r­  r³  r´  rµ  s   && €€rA   Úvisit_floor_divÚ7HalideKernel.finalize_indexing.<locals>.visit_floor_divp  s]   ø€ Ø�{Ô"Ø" 4Õ(�Ø ×$Ñ$Ø—I‘I×$Ñ$ØŸ™ wÕ.Ü  §¡¨gÓ6ó÷ ‘f“hö	ñ #rC   r±  r­  r²  c              3  óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5irë   )r   r   ÚINDIRECT)rU  rv  s   & rA   rV  Ú1HalideKernel.finalize_indexing.<locals>.<genexpr>�  s"   é € ð )
Ù:J°3ŒN˜3¤§¡×.Ð.Ó:JùrX  TFc                ó(   <€ S! V P                   4      # rë   )r­  )rã   Ú	size_hints   &€rA   Ú<lambda>Ú0HalideKernel.finalize_indexing.<locals>.<lambda>–  s   ø€ ¡Y¨q¯y©yÔ%9rC   ©Úkeyc                óT   € \         P                  P                  P                  W4      # rë   )r    rh  ri  Úevaluate_maxr#  s   &&rA   rÀ  rÁ  ¥  s   € ¤§¡×!1Ñ!1×!>Ñ!>¸qÔ!DrC   z fallback next_size must not be 1ÚhÚhrzsizes_to_add must shrinkzIndexError without fallbackNz
 = hl.Var(r5   Úrdom)>r‘  r�  r’  rw   Ú	functoolsÚpartialr    rh  ri  Úoptimization_hintÚsysÚmaxsizeÚdictÚfromkeysrH  rP   rö  r	   r   r:  r;  Úfrom_iterableÚrange_treesÚnodesr<  r°  Úhasr   Úreplacer  ÚWildr
   r=  rp  Úanyr–  ÚreversedÚsortÚappendr¬  ÚnumelÚSÚOneru   r}  r­  r¯  ÚreduceÚextendrà  r€  r   Úis_reductionr¦  ÚZeroÚ
IndexErrorÚsimplify_with_rangesÚindexing_coder�  r  Úcodegen_rdomÚitems)!rR   r¡  Útreerã   r¦  r¶  r¹  rû  Úhad_fallbackrÒ  Úhandled_countr­  Úadded_sym_sizeÚsizes_to_addr  Ú	next_sizerv  Ú	new_sizesÚ	prior_lenÚsr³  Úidxr  r¯  re   Ú
full_indexrd  ÚvÚrvr´  r¿  rµ  rT   s!   &&                           @@@€rA   Úfinalize_indexingÚHalideKernel.finalize_indexingB  s  û€ ð ×"×"Ð" d×&6×&6Ð&6¸$×:P×:PÐ:PÜ ØGóð ô ×%Ò%Ü�G‰G×Ñ×.Ñ.¼¿¹ô
ˆ	ô —-‘-¤¤E¡GÑ$<¸gÓ FÓGˆÜ%¤cž?Ó,Ðô —_‘_×2Ñ2Ø15×1AÒ1AÓBÑ1A¨—‘×"Ñ"Ö$Ñ1AÑBôó
ñ�ð �H‰H‹J˜ŠMññ
ˆò	ö
	ö	ó ˆEØ�y‰yœ×)Ò)Ø—‘Ü#ÜŸ
š
 6Ó*ÜŸ
š
 9Ó-ÜŸ
š
 9Ó-óð
 +ôð �y‰yœ×"Ò"Ø—‘ÜÜŸ
š
 6Ó*ÜŸ
š
 9Ó-óð $ôð ×#Ñ#¤E¡GÑ$<¸UÓ$C×$PÑ$P×Qñ% ÷( &)£Sñ )
Ù:Jó)
§S§S¢Sñ )
Ù:Jó)
ó &
ˆÔ"ð ˆÜ˜T×-Ñ-×.ˆDØ $§
¡
× 1Ñ 1Ô 3ÓVÑ 3˜1·x±x³zÐEUÑ7U—Q�QÑ 3ˆEÐVØ�J‰JÔ9ˆJÔ:ßØ—‘˜TŸ[™[¨¨D¯J©JÓ7Ô8ØˆMÜ—g‘g—k‘kˆGØˆNà¤# e£*Õ,´R¸¿
¹
ÀG×5LÓ5Lá05ó Ù05¨1¼¸A¿I¹IÀw×9OÔ&‘H˜QŸX™XÖ&±ð ð  ð ¤ \Ó!2Õ2�ß#Ü(¨Ó/Ð/Ø¤	× 0Ò 0ÙDØ ó!õ �ð ×#Ñ#ñ "'óá!&˜AÜ˜g§y¡y×1ô 6ä68¸¿¹ÀC×6Hô 6™ §¡¨WÕ!4Ö5Ù!&ñô÷ #’lÜ )× 0Ò 0´·±¸LÓ I�IÜ˜) Q×'Ò'ñ %-¨T¯Z©Z¸'Õ-AÓ$B˜	Ü˜i¨×+Ò+Ü"0Ð1SÓ"TÐTØ')˜Ü(+¨E«
˜Ø'+˜Ü,¨q´°T×5EÑ5EÓ1FÐ0GÐ-HÓI�Cà×(×(Ð(Ü6HØ ¤ T×%5Ñ%5Ó!6Ð 7Ð8ó7˜×.Ñ.¨sÑ3ð -6×$Ñ$ SÑ)Ø"×)Ñ)¨3°	Ð*:Ô;ØÕ(�GÙ38Ó S±5¨a¼B¸q¿y¹yÈ'×<R¤ §¤±5�IÐ SØ!¤S¨£^Õ3�MÜ # LÓ 1�Iñ ".ó$á!-˜AÜ! ! Y×/ô 6œŸš q¨9¥}Ö5Ù!-ð !ð $ô
   Ó-°	Ô9¸YÈ!¼^Ü,Ð-GÓHÐHØ ×'Ñ'¨	×2ó �ðØ�CØ�GÜ  §¡¨w×7Ò7Ø$2°3Õ$7™	˜˜TØ˜q�˜Ø 4�šØ�FÜ Ÿ7™7Ÿ<™<�DÜ  §¡¨f×5Ò5Ø$2°3Õ$7™	˜˜TØ˜q�˜Ø ¨¥Õ,˜Ø $�šØ=A�D×+Ñ+¨D¯K©K«MÓ:ô ñ{ /ðz ×#Ô#ˆCØ×Ñ×(Ñ(¨C¨5°
¸3¿8¹8¹,ÀaÐ)HÖIñ $à×!×!Ð!Ø×ÑØØ6:×6LÑ6L×6RÑ6RÔ6TÔUÑ6T©U¨Q°��T×%Ñ% aÕ(Ò(Ñ6TÒUöñ "ùòs Cùò
ùò| Wùò ùòùò6 !Tùò$øô4 "ô ß'Ü,Ð-JÓKÐQUÐUÜ!&§¡§¡�JÜ"ŸW™WŸ[™[�FÛ%3™	˜˜TØ" f¨s¥lÕ2˜
Ø $�šñ &4ô Ÿ™×(Ñ(×=Ñ=Ü+¨J¸¿¹ÀdÇkÁkÓRØ ×,Ñ,óð ×+Ñ+¨D¯K©K«MÕ:ðüó* Vsn   Ã2"_Ä_
Ë _Ë_Í<_Î_Ð
_
Ð,_
Ñ
_
Ö_Ö&_×_#×2!_#ÙC_(Þ cß(cß;Ccãcc           
     óf  € V P                   '       d   RMRpWP                  9   d   V P                  V,          # / pV P                   F‰  pV P                   '       g   W0P                  9   d   K'  \        P
                  ! RVP                  4      pV'       g   \        RVP                   24      h\        RV VP                  ^4       24      W#&   K‹  	  T P                  V R2VP                  4        UUu/ uF  w  rVW`P                  V,          bK  	  upp4       W P                  V&   V# u uppi )zCRDom based indexing uses explicit iteration ranges for Func updatesÚiÚoz^h(\d+)$zunexpected halide var name rÆ  Údom)r‹  r“  r�  r’  r^  Úmatchr  rw   r   Úgrouprä  rå  )rR   ÚprefixÚrenamesrü  Úmrñ  rò  s   &      rA   Úsetup_dom_indexingÚHalideKernel.setup_dom_indexingù  s  € à×-×-Ð-‘°3ˆØ×%Ñ%Ô%Ø×#Ñ# FÕ+Ð+àˆØ×#Ô#ˆCØ×(×(Ð(¨S×4JÑ4JÔ-JÙÜ—’˜ c§h¡hÓ/ˆAßÜ$Ð'BÀ3Ç8Á8À*Ð%MÓNÐNÜ-°°&°¸!¿'¹'À!»*¸Ð.FÓGˆG‹Lñ $ð 	×ÑØˆh�cˆNÀ'Ç-Á-Ä/ÔRÁ/¹¸˜R×!1Ñ!1°!Õ!4Ò4Á/ÒRô	
ð $+×Ñ˜Ñ Øˆùó	 Ss   Ã7D-c           	     	ó~  € VP                  4        Uu. uF'  pR V P                  V P                  V4      4       R2NK)  	  ppV P                  P	                  V RRP                  V4       R24       \        VP                  4       4       F)  w  rVV P                  P	                  V RV RV R24       K+  	  R# u upi )	úhl.Range(0, r5   z = hl.RDom([ra   ú])ú = rE  rF  N)r<  r  r  rã  r�  rG  Ú	enumerateÚkeys)rR   r  Úvarsr  Úrsizesrö  Úrsyms   &&&    rA   rä  ÚHalideKernel.codegen_rdom  s¸   € ð Ÿ™œó
á%�ð ˜4Ÿ:™: d×&:Ñ&:¸4Ó&@ÓAÐBÀ!ÓDÙ%ð 	ð 
ð 	×Ñ×$Ñ$¨ v¨\¸$¿)¹)ÀFÓ:KÐ9LÈBÐ%OÔPÜ  §¡£Ö-‰GˆAØ×Ñ×(Ñ(¨D¨6°°T°F¸!¸A¸3¸aÐ)@ÖAó .ùò
s   “-B:c               ó   € V ^8„  d   QhRR/# ©rH   rû  rc  rK   )rL   s   "rA   rM   r…    s   € ÷ Nñ NàñNrC   c                	ó²   <€ \         SV `  V4      p\        WP                  4      p\        P
                  P                  P                  WP                  4      # rë   )	rP   rö  r   r‘  r    rh  ri  râ  r�  )rR   rû  rT   s   &&€rA   rö  ÚHalideKernel.prepare_indexing  sE   ø€ ô ‘Ñ(¨Ó/ˆÜ˜5×"9Ñ"9Ó:ˆÜ�w‰w×Ñ×4Ñ4°U×<LÑ<LÓMÐMrC   c                ó²   € \        V\        P                  4      '       d&   V P                  VP                  4      P
                  # V P                  V,          # )zThe size of an index symbol)r   r   rq  rt  r  r  r�  )rR   rv  s   &&rA   Úsym_sizeÚHalideKernel.sym_size   s?   € ä˜#œtŸx™x×(Ò(Ø×&Ñ& s§x¡xÓ0×GÑGÐGØ×Ñ Õ$Ð$rC   c               ó$   € V ^8„  d   QhRRRRRR/# )rH   rü  r  rû  rc  Úis_storerÿ   rK   )rL   s   "rA   rM   r…  &  s&   € ÷ n:ñ n:¨#ð n:°jð n:ÈDñ n:rC   c           	     óÊ
  a aa€ . o\        VP                  R R7       F�  p\        V\        P                  \        P
                  34      '       d   SP                  V4       KF  \        V\        P                  \        P                  \        P                  34      '       d   K‡  \        V4      h	  \        P                  P                  p\        P                  S\        P                  P                  4      p. p\        P                   ! S P#                  V4      4      p\%        V\        P&                  4      '       d   VP(                  MV. EF  pVP                   U	u. uF  q™V9   g   K  V	NK  	  p
p	\+        V
4      ^ 8X  d   WX,          pKA  \+        V
4      ^8X  d   Wj^ ,          ;;,          V,          uu&   Kn  . p\-        \+        V4      4       Fˆ  pW|,          f   \        R4      hW|,          w  rÞ\/        V4      \/        V
4      ,          '       d4   T
P1                  V U	u. uF  q™V
9  g   K  V	NK  	  up	4       WŽ,          pKv  VP                  WÞ34       KŠ  	  . VOW¨3NpEK  	  VV V3R lp. pV F?  w  ppV F  p	VVP3                  V	4      ,          pK  	  VP                  V! VV4      4       KA  	  VP5                  4        F  w  ppVP                  V! VV.4      4       K!  	  VP7                  R R7       V'       gH   S P8                  '       d5   VP                  \;        \        P                  P                  ^^4      4       M‘\<        P>                  P@                  PC                  V^ ,          PD                  ^4      '       gQ   TPG                  ^ \;        \        P                  P                  S'       d   ^MV^ ,          PD                  ^4      4       V'       dÝ   S'       gÕ   VS PH                  9   d€   \<        P>                  P@                  PK                  VS PH                  V,          4      '       d?   S PM                  VVS PH                  V,          ,
          4       S PH                  V,          pMD\<        P>                  P@                  PO                  V^ 4      '       d   S PM                  VV4       ^ pTp\P        PR                  ! 4        Fy  pS PU                  VVVS4      '       d   VV3u # S'       d   \        R4      hV RV 2pVS PV                  V,          9  g   KW  S PV                  V,          P                  V4       K{  	  R# u up	i u up	i )	zEConvert address-based indexing into dimensions using self.halide_varsc                ó   € V P                   # rë   rÛ  r  s   &rA   rÀ  Ú5HalideKernel.indexing_to_dimensions.<locals>.<lambda>)  s   € ¸A¿FºFrC   rÂ  Nz#split_failed entry must not be Nonec                ó’  <€ \         P                  ! V 4      p \        V4      ^8X  do   \         P                  ! RS
R7      pV P	                  W!^ ,          ,          4      pV'       d1   \        V^ ,          S	P                  V^ ,          4      W2,          4      # S'       d   \        V 4      h\         P                  ! \        Y Uu/ uF  qDS	P                  V4      ^,
          bK  	  up4      ^,           4      p\         P                  P                  p\        V \         P                  4      '       dŠ   V P                   Fy  p\        V\         P                  4      '       g   K%  Wg,          p\         P                  ! W,          4      p \         P                  ! \         P                   ! WW,          4      4      pK{  	  \        WV4      # u upi )rr   Úwild)Úexclude)r  Úfactorru   rÕ  rù  rb  r  rw   r¦  r   rÛ  rÜ  r6   ÚMulrv   r  Úceiling)re   ÚsymsÚstride_wildrý  rv  r¯  rd  Útermr  rR   Úsymbolss   &&      €€€rA   Úexpr_to_dimensionÚ>HalideKernel.indexing_to_dimensions.<locals>.expr_to_dimensionO  s=  ø€ Ü—<’< Ó%ˆDÜ�4‹y˜AŒ~Ü#Ÿjšj¨¸ÔA�Ø—J‘J˜{°!­WÕ4Ó5�ßÜ(Ø˜Q� §¡¨t°A­wÓ!7¸½óð ÷ Ü$ TÓ*Ð*Ü—^’^Ü˜4ÈÓ!NÉÀ# t§}¡}°SÓ'9¸AÕ'=Ò"=ÉÑ!NÓOÐRSÕSóˆFô —W‘W—[‘[ˆFÜ˜$¤§	¡	×*Ò*Ø ŸIœI�DÜ! $¬¯©×6Ô6Ø�˜Ü$Ÿ~š~¨d­kÓ:˜Ü!&§¢´·²¸f½mÓ0LÓ!Mšñ	 &ô
 ! ¨vÓ6Ð6ùò "Os   Ã!Gc                óˆ   € \         P                  P                  P                  V P                  \
        P                  R 7      # )r£  )r    rh  ri  rË  rd  rÌ  rÍ  )Úds   &rA   rÀ  r  o  s+   € œ!Ÿ'™'×*Ñ*×<Ñ<Ø—‘¤3§;¡;ð =ô rC   z$install_dims must succeed for storesÚ_view),Úsortedrp  r   r   ÚHALIDErq  rÙ  ÚUNBACKED_INTÚSIZEÚPRECOMPUTED_SIZErw   r  rÛ  rà  rÎ  rÏ  Úexpandr  r6   ÚAddrv   ru   Úranger	   rÞ  Úpoprå  rØ  r–  rb  r    rh  ri  Ústatically_known_equalsrd  Úinsertr�  Ústatically_known_geqÚapply_offset_to_dimensionÚstatically_known_gtr:  ÚcountÚinstall_dimsr•  )rR   rü  rû  r  rv  r“  Ú
split_exprÚsplit_failedÚpartrñ  Ú	part_varsÚnew_split_failedrö  Ú
other_varsÚ
other_partr   rI  r  re   Úorig_varr  s   f&&f                @rA   Úindexing_to_dimensionsÚ#HalideKernel.indexing_to_dimensions&  s/  ú€ àˆÜ˜%×,Ñ,Ñ2B×CˆCÜ˜c¤D§K¡K´·±Ð#:×;Ò;Ø—‘˜sÖ#ä%Øä×)Ñ)ÜŸ	™	Ü×-Ñ-ð÷ô ô )¨Ó-Ð-ñ Dô —‘—‘ˆÜ—]‘] 7¬E¯G©G¯L©LÓ9ˆ
ØDFˆÜ—’˜T×1Ñ1°%Ó8Ó9ˆÜ",¨U´E·I±I×">Ò">�E—J’JÀUÀGÓKˆDØ$(×$5Ò$5ÓIÑ$5˜q¸j¹Ÿ˜Ñ$5ˆIÐIÜ�9‹~ Ô"Ø•’Ü�Y“ 1Ô$Ø Q�<×(¨DÕ0Õ(à#%Ð Üœs <Ó0Ö1�AØ#•Ò.Ü,Ð-RÓSÐSØ-9­_Ñ*�JÜ! *Ó-´
¸9Ó0E×EÔEØ!×(Ñ(±ZÓ)V±Z°ÈIÑCU¯!¨!±ZÑ)VÔWØÕ*šà(×/Ñ/°Ð0HÖIñ 2ð  FÐ!1ÐE°IÐ3DÐE“ñ# L÷&	7ð0 ˆÛ&‰JˆD�$Û�Ø˜
Ÿ™ qÓ)Õ)’ñ à�K‰KÑ)¨$°Ó5Ö6ñ 'ð $×)Ñ)Ö+‰IˆC�Ø�K‰KÑ)¨$°°Ó6Ö7ñ ,à�	‰	ñð 	ô 	
÷ Ø×)×)Ð)à—‘œM¬%¯'©'¯,©,¸¸1Ó=Ô>øÜ—‘×!Ñ!×9Ñ9¸$¸q½'¿.¹.È!×LÒLà�K‰KØ”=¤§¡§¡·H©qÀ$ÀqÅ'Ç.Á.ÐRSÓTô÷ ŸØ�d×)Ñ)Ô)¬a¯g©g×.>Ñ.>×.SÑ.SØ˜×+Ñ+¨CÕ0÷/ò /ð ×.Ñ.¨t°V¸d×>QÑ>QÐRUÕ>VÕ5VÔWØ×,Ñ,¨SÕ1‘Ü—‘×!Ñ!×5Ñ5Ø˜÷ò ð ×.Ñ.¨t°VÔ<Ø�àˆÜ—’Ö"ˆAØ× Ñ   d¨F°H×=Ò=Ø˜D�yÒ ßÜ$Ð%KÓLÐLØ�J˜e A 3Ð'ˆCØ˜$×-Ñ-¨hÕ7Ö7Ø×#Ñ# HÕ-×4Ñ4°SÖ9ó #ùòa Jùò *Ws   Å"UÅ/UÈ&U È3U c                ó²  € WP                   9  d   W P                   V&   W0P                  V&   R# V P                  V,          V8w  g+   \        V P                   V,          4      \        V4      8w  d   R# V'       d   V P                   V,          V8H  # \        V P                   V,          V4       F¥  w  rVVP                  VP                  8w  d    R# VP
                  VP
                  8w  g   VP                  VP                  8w  g   K[  \        P                  P                  P                  VP
                  VP
                  4      Vn        RVn        K§  	  R# )z>Try to set self.buffer_dimensions[var], return True on successTFN)rŽ  r�  ru   Úziprd  r  re   r    rh  ri  rÅ  )rR   rü  rI  r“  r  ÚoldÚnews   &&&&&  rA   r4  ÚHalideKernel.install_dims–  s  € à×,Ñ,Ô,Ø*.×"Ñ" 3Ñ'Ø'-×Ñ Ñ$ÙØ×Ñ˜sÕ# vÔ-´Ø×"Ñ" 3Õ'ó2
ä�‹Yô2ñ ßØ×)Ñ)¨#Õ.°$Ñ6Ð6Ü˜D×2Ñ2°3Õ7¸Ö>‰HˆCØ�z‰z˜SŸZ™ZÔ'ÚØ�x‰x˜3Ÿ8™8Ô# s§x¡x°3·8±8Ö';ÜŸ7™7×+Ñ+×8Ñ8¸¿¹À3Ç8Á8ÓL�”Ø�–ñ ?ñ rC   c                	óð  € V^ 8X  d   R# \        \        \        V4      4      4       F¶  pW,          P                  ^8X  gC   \        P
                  P                  P                  W!V,          P                  4      '       g   K\  \        W!V,          P                  4      pW$W,          P                  ,          ,          pW,          ;P                  V,          un	        K¸  	  V^ 8w  d   \        RV 24      hR# )r   Nz"offset must be fully applied, got )r×  r,  ru   rd  r    rh  ri  r0  r
   re   rw   )rR   rI  r“  rö  r7  s   &&&  rA   r1  Ú&HalideKernel.apply_offset_to_dimensionª  s±   € Ø�QŒ;ÙÜœ%¤ D£	Ó*Ö+ˆAØ�w�~‰~ Ô"¤a§g¡g×&6Ñ&6×&KÑ&KØ˜Q�Ÿ™÷'ô 'ô   ¨Q­¯©Ó7�Ø ¥§¡Õ/Õ/�Ø•—’ Õ$—ñ ,ð �QŒ;Ü Ð#EÀfÀXÐ!NÓOÐOñ rC   c               ó   € V ^8„  d   QhRR/# r  rK   )rL   s   "rA   rM   r…  ·  s   € ÷ .ñ .¨*ñ .rC   c                ó(  € \         \        P                  ,          ! 4       pVP                   EFQ  p\	        V\        P                  4      '       g   \        R\        V4       24      h\        V\        P                  4      '       dh   V P                  VP                  4      p\	        V\        4      '       d   VP                  f   \        R4      hVP                  VP                  4       KÂ  \        V\        P                  4      '       d   VP!                  V4       Kõ  \        V\        P"                  \        P$                  \        P&                  \        P(                  34      '       d   EKF  \+        RV 24      h	  V P-                  V4      # )zIDetect which range trees are used to populate HalideCSEVariable.used_dimsrn  z0cse_var must be HalideCSEVariable with used_dimszunhandled symbol )r	   r  rr  rp  r6   rw   rs  r   r   rq  rt  r  r2  r7  r=  r&  rª  r'  r(  r)  ÚINDEXrÏ   r>  )rR   rû  r7  rv  Úcse_vars   &&   rA   rù  Ú!HalideKernel.used_dims_from_index·  s'  € äœuŸ|™|Ö,Ó.ˆ	Ø×%Õ%ˆCÜ˜c¤5§<¡<×0Ò0Ü$Ð'BÄ4ÈÃ9À+Ð%NÓOÐOÜ˜c¤4§8¡8×,Ò,à×-Ñ-¨c¯h©hÓ7�ä˜wÔ(9×:Ò:Ø×)Ñ)Ò5ä(ØJóð ð × Ñ  ×!2Ñ!2Ö3Ü ¤T§[¡[×1Ò1Ø—‘˜cÖ"ÜØ”d×'Ñ'¬¯©´D×4IÑ4IÌ4Ï:É:ÐV÷ò ò ä)Ð,=¸c¸UÐ*CÓDÐDñ+ &ð, ×"Ñ" 9Ó-Ð-rC   c                	ó²  € \         ;QJ d    R  V 4       F  '       d   K   RM	  RM! R  V 4       4      '       g   \        R4      h\        P                  ! V P                  V P
                  P                  4       4       Uu. uF  pW!9   g   K  VNK  	  pp\        V4      \        V4      8w  d$   \        R\        V4       R\        V4       24      hV# u upi )c              3  óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5irë   rR  rT  s   & rA   rV  Ú.HalideKernel.sort_used_dims.<locals>.<genexpr>Ó  s   é € Ð@±i°”:˜a¤§¡×,Ð,³iùrX  FTz'used_dims must all be sympy expressionsú	expected z ordered dims, got )rY  rw   r:  r;  r�  r’  r<  ru   )rR   r7  rv  Úordereds   &&  rA   r>  ÚHalideKernel.sort_used_dimsÒ  sÇ   € ß‹sÑ@±iÓ@�s�sŠsÑ@±iÓ@×@Ò@Ü Ð!JÓKÐKô !—’Ø× Ñ  $×"8Ñ"8×"?Ñ"?Ó"Aôó
ñ�ð Ñ÷	 ˆCñð 	ð 
ô ˆw‹<œ3˜y›>Ô)Ü ØœC 	›NÐ+Ð+>¼sÀ7»|¸nÐMóð ð ˆùò
s   ÂCÂCc                	ó”   aa€ R P                  VV3R lV 4       4      p\        V4      ^ 8X  d   RpV# \        V4      ^8X  d   V R2pV# )ra   c              3  óF   <"  € T F  qP                  SS4      x € K  	  R # 5irë   )rJ  )rU  r#  r[  ru  s   & €€rA   rV  Ú.HalideKernel.make_index_str.<locals>.<genexpr>ã  s   øé € ÐQÉDÀqŸk™k¨,¸	×BÐBËDùs   ƒ!ú()Ú,)rG  ru   )rR   rI  r[  ru  rJ  s   &&ff rA   Úmake_index_strÚHalideKernel.make_index_strâ  sM   ù€ Ø—I‘IÕQÉDÓQÓQˆ	Üˆt‹9˜Œ>ØˆIð Ðô �‹Y˜!Œ^à$˜+ Q˜ˆIØÐrC   c               ó    € V ^8„  d   QhRRRR/# )rH   r  r  rû  rc  rK   )rL   s   "rA   rM   r…  ë  s   € ÷ (Hñ (H˜ð (H Zñ (HrC   c                óh  € V P                   P                  V4      pV P                  V4      pV P                  W2R4      w  r4V RV P	                  V4       R2p\
        P                  P                  V4      pV\        P                  \        P                  39   d   \        P                  pRV R2pV P                  '       EdÐ   \        V P                  \        4      '       d   V P                  P                  f   \!        R4      h\#        . V P%                  V4      OV P                  P                  O54      pV P'                  V P)                  V4      4      pVP                  '       dì   V P*                  P-                  VP.                   R24       V P*                  P-                  VP.                   RV P                   R24       T P1                  V P2                  ;'       g    ^ 4      p	V P*                  P-                  V R	\5        V4       R
V	 R24       V P*                  P-                  V RV R\5        V4       R
VP.                   R24       V# V P*                  P-                  V RV P                   R
V R\5        V4       R24       V# V P7                  WPP%                  V4      4      # )z"Codegen a load from an InputBufferFrE  rF  ri   r5   z3_load_mask must be HalideCSEVariable with used_dimsz!_mask = hl.RDom([hl.Range(0, 1)])z_mask.where(z = hl.cast(ra   r  z + hl.cast(z_mask)z = hl.select(z
, hl.cast(z, 0)))rv   Úinputrö  r=  rV  r    rh  Ú	get_dtyper8   ró   rô   rõ   Ú
_load_maskr6   r2  r7  rw   r	   rù  Únewfuncr>  r  r�  r  r  Ú_load_otherrï   r÷  )
rR   r  rû  rü  rI  r  rî   r7  r  r  s
   &&&       rA   r©  ÚHalideKernel.loadë  sW  € à�i‰i�o‰o˜dÓ#ˆØ×%Ñ% eÓ,ˆØ×/Ñ/°¸EÓB‰	ˆØ��a˜×+Ñ+¨DÓ1Ð2°!Ð4ˆÜ—‘×!Ñ! $Ó'ˆØ”U—]‘]¤E§N¡NÐ3Ô3Ü—M‘MˆEØ+¨D¨6°Ð3ˆDà�?�?‰?ä˜4Ÿ?™?Ô,=×>Ò>Ø—O‘O×-Ñ-Ò9ä$ØIóð ô #ØO�$×+Ñ+¨EÓ2ÐO°T·_±_×5NÑ5NÑOóˆIð —\‘\ $×"5Ñ"5°iÓ"@ÓAˆFØ××ÐØ—	‘	×#Ñ# v§{¡{ mÐ3TÐ$UÔVØ—	‘	×#Ñ# v§{¡{ m°<ÀÇÁÐ?PÐPQÐ$RÔSØŸ
™
 4×#3Ñ#3×#8Ð#8°qÓ9�Ø—	‘	×#Ñ#Ø�h˜k¬+°eÓ*<Ð)=¸RÀ¸wÀaÐHôð —	‘	×#Ñ#Ø�h˜c $  {´;¸uÓ3EÐ2FÀbÈÏÉÈÐU[Ð\ôð ˆMð —	‘	×#Ñ#Ø�h˜m¨D¯O©OÐ+<¸B¸t¸fÀJÌ{Ð[`ÓOaÐNbÐbgÐhôð ˆMà—<‘< ×&?Ñ&?ÀÓ&FÓGÐGrC   c               ó   € V ^8„  d   QhRR/# ©rH   r  r  rK   )rL   s   "rA   rM   r…    s   € ÷ ?ñ ? 3ñ ?rC   c                	óh   € V P                   P                  \        P                  ! R RV4      ,          # )z\[.*Ú )ÚcseÚvarname_mapr^  râ  ©rR   r  s   &&rA   rt  ÚHalideKernel.lookup_cse_var  s$   € Ø�x‰x×#Ñ#¤B§F¢F¨7°B¸Ó$=Õ>Ð>rC   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )rH   r  r  rû  rc  r
  r"   Úmoder2   rI   rJ   rK   )rL   s   "rA   rM   r…    s4   € ÷ 6ñ 6Øð6Ø *ð6Ø3>ð6ØFOð6à	ñ6rC   c                ó‚  € \        V\        4      '       g   \        R\        V4       24      hV P                  P                  V4      pV P                  V4      pV P                  WRR4      w  rVV P                  V4      '       g   Ve�   V P                  4       pV P                  Wg4      pVP                  V4      p	RP                  R.\        V4      ,          4      ;'       g    Rp
V P                  P                  \!        W RV
 RV R	24      4       MV P                  VRR
7      p\#        V4      p	\$        P&                  P)                  V4      pVf   V RV R\+        V4       RV	 R2pM-VR8X  d   V RV R\+        V4       RV	 R2pM\-        RV 24      hV P                  P                  \!        W4      4       R# )z"Codegen a store to an OutputBufferro  TNra   rm  rT  rE  z] = hl.undef(z.type()))ru  z] = hl.cast(r5   Ú
atomic_addz] += hl.cast(zstore mode=)r6   r2  rw   rs  rv   Úoutputrö  r=  Úis_indirect_indexingrþ  rV  r\  rG  ru   r  r�  r#   r  r    rh  r[  rï   rÏ   )rR   r  rû  r
  ri  rü  rI  r[  rJ  Ú	value_strÚ
undef_dimsrî   r  s   &&&&&        rA   ÚstoreÚHalideKernel.store  s¥  € ô ˜%Ô!2×3Ò3Ü Ð#CÄDÈÃKÀ=Ð!QÓRÐRØ�i‰i×Ñ˜tÓ$ˆØ×%Ñ% eÓ,ˆØ×/Ñ/°¸DÓA‰	ˆØ×$Ñ$ U×+Ò+¨tÒ/?Ø×2Ñ2Ó4ˆLØ×+Ñ+¨DÓ?ˆIØŸ™ |Ó4ˆIØŸ)™) Z L´3°t³9Õ$<Ó=×FÐFÀ$ˆJØ�I‰I×ÑÜ˜T U¨!¨J¨<°}ÀSÀEÈÐ#RÓSõð ×+Ñ+¨D¸DÐ+ÓAˆIÜ˜E›
ˆIä—‘×!Ñ! $Ó'ˆØŠ<Ø�U˜!˜I˜; l´;¸uÓ3EÐ2FÀbÈÈÐSTÐU‰DØ�\Ô!Ø�U˜!˜I˜; m´KÀÓ4FÐ3GÀrÈ)ÈÐTUÐV‰Dä%¨°D°6Ð&:Ó;Ð;Ø�	‰	×ÑœL¨Ó4Ö5rC   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rH   rî   rú   rû   r)  r1   r
  z%CSEVariable | tuple[CSEVariable, ...]rI   rK   )rL   s   "rA   rM   r…  6  sC   € ÷ Bñ BàðBð ðBð &ð	Bð
 5ðBð 
/ñBrC   c           	     ól  € V P                   '       g   \        R4      hV P                  '       d   \        R4      hW#V3pWPP                  P                  9   d   V P                  P                  V,          # \        V\        4      '       dA   VR8w  d   \        RV 24      hV P                  ! V!  ;V P                  P                  V&   pV# \        V\        4      '       d   VP                  f   \        R4      h\        V P                  4      pT P                  VP                   Uu. uF  qˆV9  g   K  VNK  	  up4      p	V\        VP                  4      ,
          '       dG   V P                  V V P                  \        . VP                  OVO54      4      VP                  R7      pVP!                  V P                  4      p
\"        P$                  P'                  W24      p\)        V4      pVR9   dØ   V	P*                   RV 2pV P,                  P/                  V R	V R
V
 R24       . p^p\1        V P                  4       FU  w  ppVP3                  V RV R24       V^8w  d   VR;;,          RV 2,          uu&   WðP4                  V,          ,          pKW  	  V P,                  P/                  V	 RRP7                  V4       24       M¶VR8X  d   V P9                  W4      p	M�\;        W<4      p\<        P>                  ! \A        \C        4       4      4      ;_uu_ 4        V! Wš4      pRRR4       RV R\E        V4       R2pV P,                  P/                  V	 RV 24       V P,                  P/                  V	 RX 24       W�P                  P                  V&   V	# u upi   + '       g   i     L�; i)zCodegen a reduction operationz"reduction called outside reductionzreduction with active load maskÚwelford_combinezexpected welford_combine, got Nú.value must be HalideCSEVariable with used_dimsr6  Ú_z = hl.z(rdom, r5   rE  rF  Ú*r  r¦  Úwelford_reducer`   ra   )ÚargmaxÚargminéÿÿÿÿ)#r‹  rw   r\  rd  Úreduction_cacher6   ÚtupleÚwelford_combine_implr2  r7  r	   r’  r]  r÷  r>  r  r\  r   Ú	ReductionÚdefault_accumulatorrö   r  r  r�  r  rÙ  r�  rG  Úwelford_reduce_fallbackr   r    Úset_ops_handlerr   rø   rB   )rR   rî   rû   r)  r
  Ú	cache_keyÚresult_tupleÚreduction_varsrñ  Ú
result_varrn  ÚdefaultÚacc_typerû  Úpartsrd  rö  rv  Ú
combine_fnÚcombine_strÚdefault_strs   &&&&&                rA   Ú	reductionÚHalideKernel.reduction6  sB  € ð ×$×$Ð$Ü Ð!EÓFÐFØ�?�?ˆ?Ü Ð!BÓCÐCØ°Ð6ˆ	ØŸ™×0Ñ0Ô0Ø—8‘8×+Ñ+¨IÕ6Ð6ä�eœU×#Ò#ØÐ!2Ô2Ü$Ð'EÀnÐEUÐ%VÓWÐWà×)Ò)¨5Ñ1ðˆD�H‰H×$Ñ$ YÑ/°,ð  Ðä˜5Ô"3×4Ò4¸¿¹Ò9TÜ Ð!QÓRÐRÜ# D×$:Ñ$:Ó;ˆØ—\‘\ØŸšÓC™�1°NÑ+B�QˆQ™ÑCó
ˆ
ð œJ u§¡Ó7×7Ô7Ø—L‘LØ�'Ø×#Ñ#¤JÐ/R°·±Ð/RÀ>Ñ/RÓ$SÓTØ—k‘kð !ó ˆEð
 —N‘N 4×#9Ñ#9Ó:ˆ	Ü—,‘,×2Ñ2°>ÓMˆÜ" 5Ó)ˆàÐ1Ô1Ø!—‘Ð' q¨Ð(8Ð9ˆEØ�I‰I×Ñ 5 '¨°Ð/?¸wÀyÀkÐQRÐ SÔTàˆEØˆFÜ# D×$:Ñ$:Ö;‘��3à—‘ ˜w a¨ s¨!˜_Ô-Ø˜Q”;à˜"—I 1 V H Õ-“IØ×*Ñ*¨3Õ/Õ/’ñ <ð �I‰I×Ñ : ,¨c°%·*±*¸UÓ2CÐ1DÐ EÕFØÐ/Ô/à×5Ñ5°eÓC‰Jä1°.ÓKˆJÜ×"Ò"¤?´?Ó3DÓ#E×FÕFÙ(¨Ó?�÷ Gà$ X J¨b´ÀÓ1IÐ0JÈ!ÐLˆKØ�I‰I×Ñ : ,¨c°+°Ð ?Ô@Ø�I‰I×Ñ : ,¨c°+°Ð ?Ô@à.8�‰× Ñ  Ñ+ØÐùòM D÷> G×Fús   Ä)NÄ6NÌ!	N#Î#N3	c                	óh  € \        V\        4      '       d   VP                  f   \        R4      h\        V\        4      '       d   VP                  f   \        R4      h\        V\        4      '       d   VP                  f   \        R4      h\	        . VP                  OVP                  OVP                  O5;'       g    V P
                  4      pV\	        V P                  4      ,          pV P                  V P                  V4      4      pWV3 Uu. uF  pRVP                   R2NK  	  ppVP                  pV P                  P                  V RRP                  V4       R24       V P                  P                  V R	V R
24       V P                  P                  V RV R24       V P                  P                  V RV R24       V P                  P                  V RVP                  V P                  4       24       V P                  P                  V RVP                  V P                  4       24       V P                  P                  V RVP                  V P                  4       24       V P                  P                  V RV RV R24       V P                  P                  V RV RV R24       V P                  P                  V RV RV RV R24       V RV RV R2V RV R V RV RV R!V R2V R"2.p	V P                  P                  V RRP                  V	4       R24       . p
\        ^4       FX  pV
P                  V P                  VP                  4      4       V P                  P                  V
R&,           R#V R$V R%24       KZ  	  \!        V
4      # u upi )'Nz-mean must be HalideCSEVariable with used_dimsz+m2 must be HalideCSEVariable with used_dimsz/weight must be HalideCSEVariable with used_dimsr`   z.type(), 0)z = hl.Tuple([ra   r  z
_mean_1 = z[0]z_m2_1 = z[1]z_weight_1 = z[2]z
_mean_2 = z_m2_2 = z_weight_2 = z	_delta = z
_mean_2 - Ú_mean_1z_new_weight = z_weight_1 + Ú	_weight_2z_w2_over_w = hl.select(z_new_weight == 0.0, 0.0, z_weight_2 / z_new_weight)z
_mean_1 + z	_delta * Ú
_w2_over_wz_m2_1 + z_m2_2 + z_weight_1 * Ú_new_weightr  rE  rF  r{  )r6   r2  r7  rw   r	   r�  r’  r]  r>  r  r  r�  rG  r\  r,  rÙ  r}  )rR   ÚmeanÚm2Úweightr7  r†  rÕ   r‡  Úpfxr=  Úunpackedrö  s   &&&&        rA   r~  Ú!HalideKernel.welford_combine_implz  s}  € Ü˜4Ô!2×3Ò3¸¿¹Ò8RÜ Ð!PÓQÐQÜ˜2Ô0×1Ò1°b·l±lÒ6NÜ Ð!NÓOÐOÜ˜6Ô#4×5Ò5¸&×:JÑ:JÒ:VÜ Ð!RÓSÐSÜØ?ˆd�n‰nÐ?˜rŸ|™|Ð?¨f×.>Ñ.>Ñ?×SÐSÀ4×CSÑCSó
ˆ	ð 	”Z × 6Ñ 6Ó7Õ7ˆ	Ø—\‘\ $×"5Ñ"5°iÓ"@ÓAˆ
Ø<@ÀfÑ;MÓNÑ;M°a�X˜aŸf™f˜X [Ó1Ñ;MˆÐNØ�o‰oˆØ�	‰	×Ñ˜z˜l¨-¸¿	¹	À'Ó8JÐ7KÈ2ÐNÔOØ�	‰	×Ñ˜s˜e :¨j¨\¸Ð=Ô>Ø�	‰	×Ñ˜s˜e 8¨J¨<°sÐ;Ô<Ø�	‰	×Ñ˜s˜e <°
¨|¸3Ð?Ô@Ø�	‰	×Ñ˜s˜e :¨d¯m©m¸D×<RÑ<RÓ.SÐ-TÐUÔVØ�	‰	×Ñ˜s˜e 8¨B¯K©K¸×8NÑ8NÓ,OÐ+PÐQÔRØ�	‰	×ÑØˆe�< §¡°×0FÑ0FÓ GÐHÐIô	
ð 	�	‰	×Ñ˜s˜e 9¨S¨E°¸C¸5ÀÐHÔIØ�	‰	×Ñ˜s˜e >°#°°lÀ3À%ÀyÐQÔRØ�	‰	×ÑØˆeÐ*¨3¨%Ð/HÈÈÈ\ÐZ]ÐY^Ð^jÐkô	
ð ˆe�:˜c˜U )¨C¨5°
Ð;Øˆe�8˜C˜5 ¨¨¨Y°s°e¸9ÀSÀEÈÐVYÐUZÐZdÐeØˆe�;Ðð
ˆð
 	�	‰	×Ñ˜z˜l¨-¸¿	¹	À&Ó8IÐ7JÈ"ÐMÔNàˆÜ�q–ˆAØ�O‰O˜DŸL™L¨×)=Ñ)=Ó>Ô?Ø�I‰I×Ñ 8¨B¥< .°°J°<¸qÀÀÀ1Ð EÖFñ ô �X‹Ðùò7 Os   ÄN/c               ó(   € V ^8„  d   QhRRRRRRRR/# )rH   Údtypesztuple[torch.dtype, ...]rŠ  zUCallable[[tuple[CSEVariable, ...], tuple[CSEVariable, ...]], tuple[CSEVariable, ...]]Úvalues_origztuple[CSEVariable, ...]rI   rK   )rL   s   "rA   rM   r…  £  s8   € ÷ ["ñ ["à'ð["ð
ð["ð -ð["ð 
!ñ["rC   c           	     	ó”	  € V P                   '       g   \        R 4      h\        V4      \        V4      8w  d$   \        R\        V4       R\        V4       24      h. p\        \        P
                  ,          ! 4       pV Fã  p\        V\        4      '       d   VP                  f   \        R4      h\        VP                  4      \        V P                  4      ,          '       d   VP                  V4       MOVP                  V P                  V . VP                  O. V P                  OR,          NVP                  R7      4       VP                  VP                  4       Kå  	  V P                  V P                  V4      4      pVP                  '       d6   \        VP                  4      \        V P                  4      ,          '       g   \        R4      h\!        W4       UUu. uF  w  r†R\#        V4       R	V R
2NK  	  p	ppV P%                  V P'                  V P(                  R,          P*                  4      4      p
VP,                   R2pV R2pV P.                  P1                  V RV
 R24       \        V P                  4      ^8w  d   \        R4      h. V P                  Ow  pV\3        V4      /pV\3        V4      ^,
          /p\        V4      ^8X  d)   R pVP5                  V4      .pVP5                  V4      .pM}R p\7        \        V4      4       Uu. uF  pVP5                  V4      RV R2,           NK!  	  pp\7        \        V4      4       Uu. uF  pVP5                  V4      RV R2,           NK!  	  ppV P.                  P1                  V RV! V	4       24       \8        P:                  ! \=        \?        4       4      4      ;_uu_ 4        V! VV4      pRRR4       V P.                  P1                  VP5                  V4       RV! X4       24       \        V4      ^8X  d   V3# V Uu. uF#  pV P                  V P                  V4      4      NK%  	  pp\A        V4       F*  w  ppV P.                  P1                  V RV RV R24       K,  	  \C        V4      # u uppi u upi u upi   + '       g   i     LÛ; iu upi )zscan called outside reductionrN  z dtypes, got Nru  :Nrr   Nr6  z"result_var must use reduction dimsr`   ra   r5   Ú_rdomz.xz = hl.RDom([hl.Range(1, z)])z&multi-dimensional scan not implementedc                ó   € V ^ ,          # )r   rK   r  s   &rA   Úmaybe_tupleÚ&HalideKernel.scan.<locals>.maybe_tupleÜ  s   € Ø˜•t�rC   c                ó,   € R RP                  V 4       R2# )z
hl.Tuple([ra   r  )rG  r  s   &rA   r   r¡  ã  s   € Ø# D§I¡I¨a£L >°Ð4Ð4rC   rE  rF  r  r{  )"r‹  rw   ru   r	   r  rr  r6   r2  r7  r’  rÙ  r÷  r  r=  r]  r>  r@  rö   r  r  rÑ  rÚ  r  r  r�  r   r\  r,  r    r‚  r   rø   r  r}  )rR   r›  rŠ  rœ  r<  Úall_used_dimsr
  r†  rî   Úinitialr¯  Úscan_domÚscanÚscan_varÚscan_renames_curÚscan_renames_prir   Ú	read_leftÚ
read_rightrö  r‹  rv  Úunpack_varsrñ  s   &&&&                    rA   r¦  ÚHalideKernel.scan£  sj  € ð ×$×$Ð$Ü Ð!@ÓAÐAÜˆv‹;œ#˜kÓ*Ô*Ü ØœC Ó,Ð-¨]¼3¸v»;¸-ÐHóð ð +-ˆÜ"¤5§<¡<Ö0Ó2ˆã ˆEä˜5Ô"3×4Ò4¸¿¹Ò9Tä$Ð%UÓVÐVÜ˜%Ÿ/™/Ó*¬Z¸×8NÑ8NÓ-O×OÔOØ—‘˜eÕ$à—‘Ø—L‘LØ ˜'ØI˜%Ÿ/™/ÐIÐ+D¨T×-CÑ-CÐ+DÀRÕ+HÐIØ#Ÿk™kð !ó ôð × Ñ  §¡Ö1ñ !ð  —\‘\ $×"5Ñ"5°mÓ"DÓEˆ
à× × Ð Ü˜:×/Ñ/Ó0´:¸d×>TÑ>TÓ3U×UÔUä Ð!EÓFÐFô !$ FÔ 3ô
á 3‘�ð ” uÓ-Ð.¨b°°°qÓ9Ù 3ð 	ñ 
ð
 —‘˜D×0Ñ0°×1AÑ1AÀ"Õ1E×1KÑ1KÓLÓMˆØ —o‘oÐ& eÐ,ˆØ�˜2ˆˆØ�	‰	×Ñ˜x˜jÐ(@ÀÀÈÐLÔMäˆt×%Ñ%Ó&¨!Ô+Ü Ð!IÓJÐJØ/˜×.Ñ.Ð/‰ˆØ$Ô&8¸Ó&>Ð?ÐØ$Ô&8¸Ó&>ÀÕ&BÐCÐäˆv‹;˜!Ôòð $×,Ñ,Ð-=Ó>Ð?ˆIØ$×-Ñ-Ð.>Ó?Ð@‰Jò5ô
 œs 6›{Ô+óá+�Að ×#Ñ#Ð$4Ó5¸!¸A¸3¸a¸×@Ð@Ù+ð ð ô œs 6›{Ô+óá+�Að ×#Ñ#Ð$4Ó5¸!¸A¸3¸a¸×@Ð@Ù+ð ð ð
 	�	‰	×Ñ˜z˜l¨#©k¸'Ó.BÐ-CÐDÔEô ×Òœ¬Ó/@ÓA×BÕBÙ$ Y°
Ó;ˆK÷ Cà�	‰	×ÑØ×"Ñ"Ð#3Ó4Ð5°S¹À[Ó9QÐ8RÐSô	
ô ˆv‹;˜!ÔØ�=Ð áQWÓXÑQWÈA�t—|‘| D×$7Ñ$7¸Ó$FÖGÑQWˆÐXÜ˜kÖ*‰DˆAˆqØ�I‰I×Ñ 1 # S¨¨°A°a°S¸Ð :Ö;ñ +ä�[Ó!Ð!ùói
ùò8ùò÷ C×Büò Ys$   Ç%R"Ì%R(Í%R-Ï
R2Ð3)SÒ2S	rõ  r  c               ó    € V ^8„  d   QhRRRR/# ©rH   r  r3   rI   r2  rK   )rL   s   "rA   rM   r…     s    € ÷ ñ ð ðð 
ñrC   c               	ó¼   € V P                   P                  V P                  WVR 7      p\        V\        4      '       g   \        R\        V4       24      hW%n        V# )r  ro  )rd  Úgenerater  r6   r2  rw   rs  r7  )rR   r  r7  rõ  r  rü  s   &&&$$ rA   r÷  ÚHalideKernel.genfunc   sR   € ð �h‰h×Ñ §	¡	¨4ÀeÐÓLˆÜ˜#Ô0×1Ò1Ü Ð#CÄDÈÃIÀ;Ð!OÓPÐPØ!ŒØˆ
rC   c               ó    € V ^8„  d   QhRRRR/# r¯  rK   )rL   s   "rA   rM   r…    s   € ÷ ñ ¨>ð ÐEVñ rC   c               	ó¤   € V P                   P                  VR 7      p\        V\        4      '       g   \	        R\        V4       24      hWn        V# )r6  ro  )rd  Únewvarr6   r2  rw   rs  r7  )rR   r7  r  rü  s   &&$ rA   r]  ÚHalideKernel.newfunc  sE   € Ø�h‰h�o‰o EˆoÓ*ˆÜ˜#Ô0×1Ò1Ü Ð#CÄDÈÃIÀ;Ð!OÓPÐPØ!ŒØˆ
rC   c               ó   € V ^8„  d   QhRR/# ra  rK   )rL   s   "rA   rM   r…    s   € ÷ Dñ D¨ñ DrC   c                óx   € \         P                  P                  V4      P                  4       P	                  4       # )zõ
We map all tensors to 1D buffers in Halide since Halide has trouble representing some strides that PyTorch
supports.  If there are gaps in the underlying layout the numel we pass to Halide includes the gaps while
PyTorch's numel excludes them.
)r    rh  Ú
get_bufferÚ
get_layoutÚstorage_sizerf  s   &&rA   Úhalide_buffer_numelÚ HalideKernel.halide_buffer_numel  s+   € ô �w‰w×!Ñ! $Ó'×2Ñ2Ó4×AÑAÓCÐCrC   c                ó´  a€ R p. pV P                   P                  4       w  r4rS\        \        WE4      VR7       Fš  w  poVP	                  VS34       \        S\        4      '       g   K1  SP                  ^ 8X  d   SP                  e   \        R4      hVP                  V3R lV P                  P                  SP                  R4       4       4       Kœ  	  V# )zH
Halide requires scalar inputs before outputs, so need to reorder args.
c                ó¶   € V w  r\        V\        4      '       d   ^# RVP                  9   d   ^# RVP                  9  d   \        RVP                   24      h^ # )rr   Úout_ptrÚin_ptrz!expected in_ptr in arg name, got )r6   r(   r  rw   )Ú	arg_tupleÚ	_call_strrA  s   &  rA   Ú	arg_orderÚ.HalideKernel.halide_argdefs.<locals>.arg_order"  sN   € Ø&‰NˆIÜ˜#œw×'Ò'ÙØ˜cŸh™hÔ&Ùà 3§8¡8Ô+Ü(Ð+LÈSÏXÉXÈJÐ)WÓXÐXÙrC   rÂ  z,TensorArg must have zero offset and no aliasc           
   3  ó˜   <"  € T F?  pR \        VSP                  SP                  SP                  SP                  R7      3x € KA  	  R # 5i)N)Úalias_of)r)   Úbufferrî   r“  r  )rU  ÚaliasrA  s   & €rA   rV  Ú.HalideKernel.halide_argdefs.<locals>.<genexpr>4  sJ   øé € ð ñ "G˜ð Ü!Ø!ØŸJ™JØŸI™IØŸJ™JØ%(§X¡Xôõ	ó "Gùs   ƒAA
rK   )rv   Úpython_argdefsr%  r@  rÙ  r6   r)   r“  rÇ  rw   rÞ  r•  rZ  r  )rR   rÄ  r  rv  rš   r›   Úcall_strrA  s   &      @rA   Úhalide_argdefsÚHalideKernel.halide_argdefs  s´   ø€ ò
		ð :<ˆØ—Y‘Y×-Ñ-Ó/‰
ˆˆaÜ#¤C¨£I°9×=‰MˆH�cØ�M‰M˜8 S˜/Ô*Ü˜#œy×)Ô)ØŸ
™
 aœ¨C¯L©LÒ,@Ü(Ð)WÓXÐXØ—‘ô ð "&×!4Ñ!4×!8Ñ!8¸¿¹À2Ô!Fóö ñ >ð$ ˆrC   c               ó   € V ^8„  d   QhRR/# )rH   rI   r   rK   )rL   s   "rA   rM   r…  C  s   € ÷ V
ñ V
 Jñ V
rC   c                óÈ  € . pV P                  4        EFr  w  r#\        V\        4      '       d   RpRpRpRpEMV P                  VP                  ,           Uu. uF'  p\        V P                  VP                  4      4      NK)  	  ppV P                  VP                  ,           Uu. uF'  p\        V P                  VP                  4      4      NK)  	  pp\        V4      \        V4      8w  d$   \        R\        V4       R\        V4       24      h\        V P                  VP                  ,          4      p\        VP                  ,           R2pVP                  \        VVP                  VVVVP                   R7      4       EKu  	  \"        P$                  P'                  4       p	V	P(                  R8X  dF   \*        P,                  P.                  .p
\*        P,                  P0                  pR\3        4       /pRpEMV	P(                  R	8w  d   \        R
4      hV	P4                  ^ 8”  d   \        R4      h\*        P,                  P6                  .p
\*        P,                  P8                  p\:        P<                  P?                  V	4      pRV
^ ,          9  dI   R FB  w  ppVP@                  V8¼  g   K  VPB                  V8¼  g   K,  V
P                  RV V 24        M	  V
P                  R4       RVPD                  /p\G        ^ V	P4                  4      pV
P                  R4       V
P                  R4       \*        P,                  PH                  '       g   V
P                  R4       \*        P,                  PJ                  '       d   V
P                  R4       RV PL                  9   d   V
P                  R4       \O        VRPQ                  V
4      VVVR7      # u upi u upi )z)Compute metadata required by codecache.pyNÚlongzshape/stride length mismatch: z vs rw  )r  rd  r“  rÇ  ÚcpuÚparallelismÚcudazonly cpu/cuda supportedzonly default device supportedÚcuda_capabilityÚcuda_capability_Úuser_contextÚstrict_floatÚ
no_runtimeÚ
no_assertsÚdebugÚ64Úlarge_buffersÚ-)ÚtargetÚ	schedulerÚscheduler_flagsÚcuda_device))é   é   )rã  r   )é   é   )rå  r   )rä  rr   ))rÍ  r6   r(   rŽ  r  r+   r  r  rd  ru   rw   r�  r*   rî   rÙ  r   rÇ  r    rh  Úget_current_device_or_throwrs  r   r0  Ú
cpu_targetÚscheduler_cpur   rû  Ú
gpu_targetÚscheduler_cudar8   rÔ  Úget_device_propertiesÚmajorÚminorÚmulti_processor_countr<   ÚassertsrÛ  rc   r   rG  )rR   Úargtypesrv  rA  r  rd  r“  rî   rÕ   Úcurrent_devicerß  rà  rá  râ  Ú
capabilityrí  rî  s   &                rA   Úhalide_kernel_metaÚHalideKernel.halide_kernel_metaC  sD  € àˆØ×)Ñ)×+‰FˆAÜ˜#œw×'Ò'Ø�Ø�Ø�Ø’ð "×3Ñ3°C·H±HÖ=óá=˜ô ˜$×.Ñ.¨q¯v©vÓ6Ö7Ù=ð ð ð "×3Ñ3°C·H±HÖ=óá=˜ô ˜$×.Ñ.¨q¯x©xÓ8Ö9Ù=ð ð ô �u“:¤ V£Ô,Ü(Ø8¼¸U»¸ÀDÌÈVËÈÐVóð ô ˜t×2Ñ2°3·8±8Õ<Ó=�Ü'¨¯	©	Õ2Ð3°1Ð5�Ø�O‰OÜØØ—H‘HØØ!Ø!Ø Ÿ\™\ô÷	ñ+ ,ô@ Ÿ™×<Ñ<Ó>ˆØ×Ñ %Ô'Ü—m‘m×.Ñ.Ð/ˆFÜŸ™×3Ñ3ˆIàÔ3Ó5ðˆOð ŠKà×"Ñ" fÔ,Ü$Ð%>Ó?Ð?Ø×#Ñ# aÔ'Ü$Ð%DÓEÐEÜ—m‘m×.Ñ.Ð/ˆFÜŸ™×4Ñ4ˆIÜŸ™×9Ñ9¸.ÓIˆJØ ¨¨q­	Ô1Û$L‘L�E˜5Ø!×'Ñ'¨5Ö0°Z×5EÑ5EÈÖ5NØŸ™Ð(8¸¸À¸wÐ&GÔHÙñ %Mð �M‰M˜.Ô)à˜z×?Ñ?ðˆOô
 ˜a ×!5Ñ!5Ó6ˆKð 	�‰�nÔ%ð 	�‰�lÔ#ä�}‰}×$×$Ð$Ø�M‰M˜,Ô'ä�=‰=××ÐØ�M‰M˜'Ô"à�4×#Ñ#Ô#à�M‰M˜/Ô*äØØ—8‘8˜FÓ#ØØ+Ø#ô
ð 	
ùòMùòs   Á-OÂ&-Oc                ó  a € S P                   P                  '       d   \        R4      hS P                  4       p\	        4       pVP                  RRR7       VP                  4        S P                  4        FÜ  w  rE\        V\        4      '       d.   VP                  VP                   RS P                   R24       KH  VP                  '       g   \        V4      hRVP                  9   d   RMR	p\        VP                   4      p\#        S P$                  VP                  ,          4      pVP                  VP                   R
V RV RV R24       KÞ  	  VP                  R4       VP                  4        S P                  4        F/  w  rEVP                  VP                   RVP                   24       K1  	  S P                   P'                  4        F  w  ršVP                  V	 R
V
 24       K  	  VP                  S P(                  4       V 3R lpS P*                  P,                   FI  p\        V\.        4      '       d    \0        P2                  P5                  W¼4      pVP                  V4       KK  	  VP                  R4       VP                  R4       S P                  4        EFØ  w  rE\        V\        4      '       dY   \6        P8                  P:                  P=                  VP>                  ^R7      pVP                  VP                   RV R24       Kt  S P$                  VP                  ,          p. p\A        V4       EF  w  ppS PC                  \6        P8                  P:                  P=                  VPD                  ^R7      V4      pVPG                  RV R24       RVP                  9  g   Kt  VP                  VP                   RV R24        VP                  VP                   RV R\I        VPJ                  4       R24        VP                  VP                   RV R\I        VPD                  4       R24       EK  	  VP                  VP                   RRPO                  V4       R24       EKÛ  	  VPQ                  ^4       VP                  RPS                  4       4       VPT                  '       dq   VP                  R\V        PX                  ! VPT                  4      : RVPZ                  : RVPT                  : RVP\                  : R2	RR7       VP_                  4       # VP                  R VPZ                  : R!2RR7       VP_                  4       #   \L         d     ELdi ; i  \L         d     EKD  i ; i)"z3Called at the end to generate a final kernel stringÚinplace_bufferszÒ
            import halide as hl
            from torch._inductor.runtime import halide_helpers
            from math import inf, nan

            @hl.generator(name="kernel")
            class Kernel:
        T©Ústripz = hl.InputScalar(r5   Úoutzhl.OutputBufferzhl.InputBufferr  rÝ   ra   z&
            def generate(g):
        z = g.c                óÀ   <€ \        \        SP                  P                  V P	                  ^4      ,          4      pVP
                  f   \        V4      h\        V4      # )rr   )r   r2  rd  re  rú  r7  rw   r  )rý  rü  rR   s   & €rA   Úupdate_indexÚ1HalideKernel.codegen_kernel.<locals>.update_indexÃ  sE   ø€ ÜÔ(¨$¯(©(×*>Ñ*>¸q¿w¹wÀq»zÕ*JÓKˆCØ�}‰}Ò$Ü$ SÓ)Ð)Ü�s“8ˆOrC   rc  zassert g.using_autoscheduler()r£  z.set_estimate(r  z.dim(z).set_min(0)z).set_stride(z).set_extent(z.set_estimates([r  zN
            if __name__ == "__main__":
                hl.main()
            z:
                else:
                    hl.load_plugin(z))
                    target = hl.Target(z=)
                    autoscheduler = hl.AutoschedulerParams(a�  )
                    with hl.GeneratorContext(target, autoscheduler):
                        gen = Kernel()
                        pipeline = gen._build_pipeline()
                        # gen.compile_to_callable() does not run the autoscheduler
                        pipeline.apply_autoscheduler(target, autoscheduler)
                        kernel = pipeline.compile_to_callable([
                                gen._get_input_parameter(a.name)._to_argument()
                                for a in gen._get_arginfos()
                                if a.dir == hl.ArgInfoDirection.Input
                            ], target)
                zR
                  else:
                      with hl.GeneratorContext(hl.Target(zX)):
                          kernel = Kernel().compile_to_callable()
                  )0rv   r÷  rE   rô  r$   ÚspliceÚ	do_indentrÍ  r6   r(   r�  r  rc   rÈ  rw   rï   rî   ru   rŽ  Úaliasesrã  r  Ú_linesr  r2  r`  râ  r    rh  ri  rË  re   r  Ú_autoscheduler_workaroundsr  rÙ  r7   rd  Ú	TypeErrorrG  Údo_unindentÚrstriprà  r   Úfind_libautoschedulerß  rá  Úgetvalue)rR   r  ÚmetaÚcoderv  rA  ÚargclsÚargtypeÚndimrA  rB  rü  r  ÚhintrI  Úrange_hintsrö  Údims   f&                rA   Úcodegen_kernelÚHalideKernel.codegen_kernel›  sÀ  ø€ à�9‰9×$×$Ð$ÜÐ/Ó0Ð0Ø×&Ñ&Ó(ˆÜÓˆØ�‰ðð ð 	ô 
	
ð 	�‰ÔØ×)Ñ)Ö+‰FˆAÜ˜#œw×'Ò'Ø—‘ #§(¡( Ð+=¸d×>NÑ>NÐ=OÈqÐQÖRà—z—z�zÜ(¨Ó-Ð-Ø.3°s·x±xÔ.?Ñ*ÐEU�Ü% c§i¡iÓ0�Ü˜4×1Ñ1°#·(±(Õ;Ó<�Ø—‘ #§(¡( ¨3¨v¨h°a¸°yÀÀ4À&ÈÐJÖKñ ,ð 	�‰ðô	
ð
 	�‰ÔØ×)Ñ)Ö+‰FˆAØ�N‰N˜cŸh™h˜Z u¨S¯X©X¨JÐ7Ö8ñ ,àŸ	™	×)Ñ)Ö+‰HˆCØ�N‰N˜c˜U # c UÐ+Ö,ñ ,à�‰�D×&Ñ&Ô'õ	ð —I‘I×$Ô$ˆDÜ˜$¤×$Ò$ä(×5Ñ5×9Ñ9¸,ÓM�Ø�N‰N˜4Ö ñ	 %ð
 	�‰�rÔØ�‰Ð7Ô8à×)Ñ)×+‰FˆAô ˜#œw×'Ò'Ü—w‘w×'Ñ'×9Ñ9¸#¿(¹(ÈQÐ9ÓO�Ø—‘ #§(¡( ¨>¸$¸¸qÐAÖBà×-Ñ-¨c¯h©hÕ7�Ø �Ü'¨Ÿo‘F�A�sØ×:Ñ:ÜŸ™×(Ñ(×:Ñ:¸3¿8¹8ÈaÐ:ÓPÐRVó�Dð  ×&Ñ&¨°d°V¸1Ð'=Ô>Ø C§H¡HÖ,ØŸ™¨#¯(©(¨°5¸¸¸<Ð'HÔIð!Ø ŸN™NØ#&§8¡8 *¨E°!°°MÄ#ÀcÇjÁjÃ/ÐARÐRSÐ Tôð
!Ø ŸN™NØ#&§8¡8 *¨E°!°°MÄ#ÀcÇhÁhÃ-ÀÐPQÐ R÷ñ .ð( —‘ #§(¡( Ð+;¸D¿I¹IÀkÓ<RÐ;SÐSUÐV×Wñ= ,ð@ 	×Ñ˜ÔØ�‰ð÷ ‘“ô		
ð �>�>ˆ>Ø�K‰Kð$ä$3×$HÒ$HÈÏÉÓ$XÑ#[ð \(Ø(,¯©¡ð 7<Ø<@¿N¹NÑ;MÈRÐPT×PdÑPdÑOgð hð	ð  ð# ô ð8 �}‰}‹Ðð �K‰Kð:à:>¿+¹+¹ð Iðð
 ð ô ð �}‰}‹Ðøô]  )ô !Ú ð!ûô  )ô !Û ð!ús$   Ï7U*Ð7U<Õ*U9Õ8U9Õ<VÖVc                	óÖ   € \        V4      ^8X  dY   \        P                  P                  R8X  d:   \        P
                  P                  4       P                  R8X  d   \        ^V 4      p V # )rr   ÚAnderson2021rÔ  )	ru   r   r0  rë  r    rh  rç  rs  r<   )rã   rI  s   &&rA   r  Ú'HalideKernel._autoscheduler_workarounds  sN   € ô �‹I˜ŒNÜ—‘×,Ñ,°Ô>Ü—‘×3Ñ3Ó5×:Ñ:¸fÔDô �A�q“	ˆAØˆrC   c               ó    € V ^8„  d   QhRRRR/# )rH   r  r  Údeallocate_wsrÿ   rK   )rL   s   "rA   rM   r…  "  s   € ÷ 
ñ 
 ð 
¸tñ 
rC   c                óÀ  € \         P                  P                  pV P                  4        UUu. uF  w  rVVP                  e   K  V NK  	  ppp\         P                  P                  4       pVP                  R8X  dF   VP                  VP                  \         P                  P                  4      p	VP                  V	4       VP                  VVVRR7       R# u uppi )zCodegen a call to this kernelNrÔ  F)ÚdeviceÚtriton)r    rh  Úwrapper_coderÍ  rÇ  rç  rs  Úwrite_get_raw_streamrû  r  rÙ  Úgenerate_kernel_call)
rR   r  r³  r  Úwrapperrã   rA  Ú	call_argsrò  Ústream_names
   &&&&      rA   Úcall_kernelÚHalideKernel.call_kernel"  s¶   € ä—'‘'×&Ñ&ˆØ*.×*=Ñ*=Ô*?ÔXÑ*?¡ À3Ç<Á<”V˜�s’VÑ*?ˆ	ÑXÜŸ™×<Ñ<Ó>ˆØ×Ñ &Ô(Ø!×6Ñ6Ø×$Ñ$¤a§g¡g§l¡lóˆKð ×Ñ˜[Ô)Ø×$Ñ$ØØØ!Øð	 	%ö 	
ùó Ys   ®CÁCc                	ó   € R # )FrK   )rR   r  s   &&rA   Úgenerate_assertÚHalideKernel.generate_assert3  s   € ÙrC   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rH   re   rc  r  Úlowerrÿ   ÚupperrK   )rL   s   "rA   rM   r…  6  s,   € ÷ ñ ØðØ&0ðØ9=ðØFJñrC   c                	ó   € R # rë   rK   )rR   re   r  r&  r'  s   &&&&&rA   Úcheck_boundsÚHalideKernel.check_bounds6  s   € ñ 	rC   )r•  rŽ  r�  r‡  r“  r�  r–  r�  r‘  rŠ  rˆ  rŒ  r’  r‰  )NNNrx  rë   r.  ),rV   rW   rX   rY   rø   Ú	overridesÚtexprr  ry  rQ   rš  rž  ró  rþ  rä  rö  r  r=  r4  r1  rù  r>  rV  r©  rt  rp  r�  r~  r¦  r   Úunknownr÷  r]  r¼  rÍ  rô  r  ræ   r  r   r#  r)  rZ   r[   r\   s   @rA   r‚  r‚    s  ø‡ Ø€IØ).€EÐ&Ó.÷+ð +õ6"ô=÷
uð uònò,B÷Nð Nò%õn:ò`ò(Põ.ò6ô õ(HõT?÷6õ<BòH'õR["ðzð
 ×"Ò"Ó$ðð !%÷ð¸D÷ õDò$õLV
ôpzðx ñó ð÷
ò"÷ó rC   r‚  c                  ó6   € ] tR tRt]t]R R l4       tR tRt	R# )ÚHalideSchedulingi<  c               ó    € V ^8„  d   QhRRRR/# )rH   r  ztorch.devicerI   zOrderedSet[BackendFeature]rK   )rL   s   "rA   rM   ÚHalideScheduling.__annotate__@  s   € ÷ 
ñ 
¨,ð 
Ð;Uñ 
rC   c                	óô   € \        \        P                  \        P                  \        P                  .4      p\
        P                  P                  '       d    VP                  \        P                  4       V# rë   )
r	   r!   ÚTUPLE_REDUCTIONÚPREFER_STORE_LOOP_ORDERÚREDUCE_TO_SINGLE_ELEMENTr   r0  Úscan_kernelsrª  ÚSCAN)r	  r  r  s   && rA   Úget_backend_featuresÚ%HalideScheduling.get_backend_features?  sU   € ää×.Ñ.Ü×6Ñ6Ü×7Ñ7ðó
ˆô �=‰=×%×%Ð%Ø�J‰J”~×*Ñ*Ô+ØˆrC   c                ó0  € \         P                  P                  pWP                  9   d   VP                  V,          pV# RVP	                  4        2pWTP                  V&   VP                  R4       \        4       pVP                  RVP                  4       : R24       VP                  VRR7       VP                  R4       \        W$4      w  rxV RV 2p	VP                  WVP                  4       V	4       \        R	4      '       d   \        VR
V4       V# )z6Codegen kernel definition to go in output wrapper codeÚhalide_kernel_zEfrom torch._inductor.runtime.hints import HalideMeta, HalideInputSpeczasync_compile.halide(z, '''Trø  z''')Ú
Úkernel_metadatarc  )r    rh  r  Úsrc_to_kernelÚnext_kernel_suffixÚadd_import_oncer$   r�  rô  rþ  r   Údefine_kernelr  r   r   )
rR   Úsrc_codeÚnode_schedulerb   r  Úkernel_nameÚcompile_wrapperÚoriginsÚdetailed_originsÚmetadata_comments
   &&&&      rA   rA  ÚHalideScheduling.define_kernelL  s  € ä—'‘'×&Ñ&ˆØ×,Ñ,Ô,Ø!×/Ñ/°Õ9ˆKð. Ðð+ +¨7×+EÑ+EÓ+GÐ*HÐIˆKØ.9×!Ñ! (Ñ+Ø×#Ñ#ØWôô -Ó.ˆOØ×%Ñ%Ø'¨×(AÑ(AÓ(CÑ'FÀeÐLôð ×"Ñ" 8°4Ð"Ô8Ø×%Ñ% fÔ-ä(;¸MÓ(SÑ%ˆGØ") ¨"Ð-=Ð,>Ð?ÐØ×!Ñ!Ø×5Ñ5Ó7Ð9Iôô 'Ð'8×9Ò9Ü# K°°XÔ>àÐrC   rK   N)
rV   rW   rX   rY   r‚  Úkernel_typer/  r8  rA  rZ   rK   rC   rA   r/  r/  <  s   † Ø€Kàô
ó ð
örC   r/  )sÚ
__future__r   ÚdataclassesrÉ  r:  Úloggingr^  rÌ  Úcollectionsr   Útypingr   r   r   r  r8   Útorch._loggingÚ_prims_commonr   Úutils._ordered_setr	   Úutils._sympy.functionsr
   r   r   r   Úutils._sympy.symbolr   r   Úutils._sympy.value_rangesr   rc  r   r   Ú	codecacher   r   Úmetricsr   r   Úops_handlerr   Úruntime.hintsr   r   Úutilsr   r   r   r   r   Úvirtualizedr   r¨  r    Úcommonr!   r"   r#   r$   r%   r&   r'   r(   r)   Úcppr*   Ú	cpp_utilsr+   Úsimdr,   r-   r.   Úcollections.abcr/   r0   r1   r2   Úshape_propagationr3   Ú	getLoggerrV   rÄ  rB   ÚRuntimeErrorrE   r^   r�   r,  Úpexprrÿ   rô   ró   rõ   Úfloat64rá  Úint16rò   r:   Úuint8Úuint16Úuint32Úuint64rì   rï   rö   rø   Ú_initialize_pointwise_overridesr2  Ú	dataclassrb  r}  rà  r‚  r/  rK   rC   rA   Ú<module>rm     sÖ  ðå "ã Û Û Û Û 	Û 
Ý #ß +Ñ +ã ã Û å -Ý ,ß IÓ Iß 7Ý 4ß Ý 'Ý )ß BÝ )ß 7÷õ ÷ )÷
÷ 
õ 
õ Ý ß ;Ñ ;÷ ß2ç6Ý2à×Ò˜Ó!€ò
ôF�,ô Fô
eQ�Mô eQñP 	‹×Ñ€Ù‹×Ñ€ð 
‡J�J�Ø	‡N�N�OØ	‡M�M�>Ø	‡M�M�>Ø	‡M�M�>Ø	‡J�J�Ø	‡K�K�Ø	‡K�K�Ø	‡K�K�Ø	‡K�K�Ø	‡L�L�-Ø	‡L�L�-Ø	‡L�L�-ð€ò"òôR"�kô R"ðj × /Ñ /°Ô 9ô(P˜ô (PðV ×Ñ÷"+ð "+ó ð"+òJBòô(_�:ô _ôD!+�~ö +rC   