Ë
    ÄÓ^j× ã                  óf  — d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZmZ d dlZd dlZd dlZddlmZ ddlmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZ ddlm Z m!Z! ddl"m#Z# ddl!m$Z$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZFmGZGmHZH erd dlImJZJmKZK ddl(mLZLmMZM ddlNmOZO  ej                   eQ«      ZRd„ ZS G d„ deT«      ZU G d„ d e>«      ZV eV«       j®                  ZX e>«       j®                  ZYej´                  d!ej¶                  d"ej¸                  d#ejº                  d$ej¼                  d%ej¾                  d&ejÀ                  d'ejÂ                  d(ejÄ                  d)ejÆ                  d*ejÈ                  d+ejÊ                  d,ejÌ                  d-iZgd.„ Zhd/„ Zi G d0„ d1e=«      Zjejj×                  d2«        G d3„ d4e9«      ZlejÚ                   G d5„ d6«      «       Znd7„ Zod8„ Zp G d9„ d:eG«      Zq G d;„ d<eH«      Zry)=é    )Ú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                ó"  — t        | t        «      rVd| cxk  rdk  sKn t        j                  t        j                  «      }| |j
                  k(  ry| |j                  k(  ryd| ›d�S t        | t        «      rdt        | «      › d�S t        | «      S )Ni   €iÿÿÿzhl.Int(64).min()zhl.Int(64).max()zhl.i64(ú)zhl.f64()
Ú
isinstanceÚintÚtorchÚiinfoÚint64ÚminÚmaxÚfloatr/   Úrepr)ÚvalÚinfos     úi/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/codegen/halide.pyÚhalide_constantrE   >   s~   € Ü�#”sÔ [°CÔ%E¸:Ô%EÜ�{‰{œ5Ÿ;™;Ó'ˆØ�$—(‘(Š?Ø%Ø�$—(‘(Š?Ø%Ø˜˜˜qÐ!Ð!Ü�#”uÔØœ sÓ+Ð,¨AÐ.Ð.Ü�‹9Ðó    c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )ÚUnsupportedc                ó*   •— t         ‰| �  d|› �«       y )Nz!halide backend does not support: )ÚsuperÚ__init__)ÚselfÚthingÚ	__class__s     €rD   rK   zUnsupported.__init__L   s   ø€ Ü‰ÑÐ<¸U¸GÐDÕErF   ©ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__rK   Ú__classcell__©rN   s   @rD   rH   rH   K   s   ø„ ÷Fñ FrF   rH   c                  óÔ   ‡ — e Zd Zed„ «       Zed„ «       Zd„ Zd„ Zd„ ZeZ	d„ Z
e
Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ fd„Zd„ ZeZd„ Zd„ Z ˆ xZ!S )ÚHalidePrinterc                óD   — dt         j                  j                  › d| › d�S )Núhl.cast(ú, r8   )r"   ÚkernelÚindex_dtype©Úexprs    rD   Ú
cast_indexzHalidePrinter.cast_indexQ   s"   € àœ!Ÿ(™(×.Ñ.Ð/¨r°$°°qÐ9Ð9rF   c                ó   — d| › d�S )Núhl.cast(hl.Float(32), r8   © r^   s    rD   Ú
cast_floatzHalidePrinter.cast_floatU   s   € à'¨ v¨QÐ/Ð/rF   c                ó   — d|› d�S )Núhl.f32(r8   rc   ©rL   r_   s     rD   Ú_print_FloatzHalidePrinter._print_FloatY   s   € Ø˜˜˜aÐ Ð rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   rf   r   r8   ©ÚlenÚargsÚ_printrg   s     rD   Ú_print_ToFloatzHalidePrinter._print_ToFloat\   ó9   € Ü�4—9‘9‹~ Ò"Ð"Ð"à˜Ÿ™ T§Y¡Y¨q¡\Ó2Ð3°1Ð5Ð5rF   c                ó˜   — t        |j                  «      dk(  sJ ‚| j                  d| j                  |j                  d   «      › d�«      S )Nr#   ú	hl.floor(r   r8   ©rk   rl   r`   rm   rg   s     rD   Ú_print_floorzHalidePrinter._print_floora   óB   € Ü�4—9‘9‹~ Ò"Ð"Ð"à�‰ ¨4¯;©;°t·y±yÀ±|Ó+DÐ*EÀQÐGÓHÐHrF   c                ó˜   — t        |j                  «      dk(  sJ ‚| j                  d| j                  |j                  d   «      › d�«      S )Nr#   ú	hl.trunc(r   r8   rr   rg   s     rD   Ú_print_TrunczHalidePrinter._print_Trunch   rt   rF   c                ó˜   — t        |j                  «      dk(  sJ ‚| j                  d| j                  |j                  d   «      › d�«      S )Nr#   úhl.ceil(r   r8   rr   rg   s     rD   Ú_print_ceilingzHalidePrinter._print_ceilingo   sB   € Ü�4—9‘9‹~ Ò"Ð"Ð"à�‰ ¨$¯+©+°d·i±iÀ±lÓ*CÐ)DÀAÐFÓGÐGrF   c                óJ   — d| j                  | j                  |«      «      › d�S ©Nzhl.sqrt(r8   )rd   rm   rg   s     rD   Ú_helper_sqrtzHalidePrinter._helper_sqrtt   s$   € à˜$Ÿ/™/¨$¯+©+°dÓ*;Ó<Ð=¸QÐ?Ð?rF   c                óÎ   — | j                  |j                  d   «      }| j                  |j                  d   «      }| j                  |j                  d   «      }d|› d|› d|› d�S )Nr   r#   r   ú
hl.select(r[   r8   )Údoprintrl   )rL   r_   ÚcÚpÚqs        rD   Ú_print_WherezHalidePrinter._print_Wherex   s_   € Ø�L‰L˜Ÿ™ 1™Ó&ˆØ�L‰L˜Ÿ™ 1™Ó&ˆØ�L‰L˜Ÿ™ 1™Ó&ˆØ˜A˜3˜b   2 a S¨Ð*Ð*rF   c                ó@  — t        |j                  «      dk(  r| j                  |j                  d   «      S t        |j                  «      dz  }| j                  t        |j                  d | Ž «      }| j                  t        |j                  |d  Ž «      }d|› d|› d�S )Nr#   r   r   úhl.min(r[   r8   )rk   rl   rm   r   ©rL   r_   ÚmidÚaÚbs        rD   Ú
_print_Minz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 Ð"Ð"rF   c                ó@  — t        |j                  «      dk(  r| j                  |j                  d   «      S t        |j                  «      dz  }| j                  t        |j                  d | Ž «      }| j                  t        |j                  |d  Ž «      }d|› d|› d�S )Nr#   r   r   úhl.max(r[   r8   )rk   rl   rm   r   r‡   s        rD   Ú
_print_Maxz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 Ð"Ð"rF   c                ó˜   — t        |j                  «      dk(  sJ ‚| j                  d| j                  |j                  d   «      › d�«      S )Nr#   úhl.abs(r   r8   rr   rg   s     rD   Ú
_print_AbszHalidePrinter._print_Abs—   sB   € Ü�4—9‘9‹~ Ò"Ð"Ð"à�‰ ¨¯©°T·Y±Y¸q±\Ó)BÐ(CÀ1ÐEÓFÐFrF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.cos(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_cosz&HalidePrinter._print_OpaqueUnaryFn_cosœ   ro   rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.cosh(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_coshz'HalidePrinter._print_OpaqueUnaryFn_cosh¡   ó9   € Ü�4—9‘9‹~ Ò"Ð"Ð"à˜$Ÿ+™+ d§i¡i°¡lÓ3Ð4°AÐ6Ð6rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.acos(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_acosz'HalidePrinter._print_OpaqueUnaryFn_acos¦   r˜   rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.sin(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_sinz&HalidePrinter._print_OpaqueUnaryFn_sin«   ro   rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.sinh(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_sinhz'HalidePrinter._print_OpaqueUnaryFn_sinh°   r˜   rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.asin(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_asinz'HalidePrinter._print_OpaqueUnaryFn_asinµ   r˜   rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.tan(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_tanz&HalidePrinter._print_OpaqueUnaryFn_tanº   ro   rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.tanh(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_tanhz'HalidePrinter._print_OpaqueUnaryFn_tanh¿   r˜   rF   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )Nr#   úhl.atan(r   r8   rj   rg   s     rD   Ú_print_OpaqueUnaryFn_atanz'HalidePrinter._print_OpaqueUnaryFn_atanÄ   r˜   rF   c                ó   — t        d«      ‚©NÚlog2©ÚNotImplementedErrorrg   s     rD   Ú_print_OpaqueUnaryFn_log2z'HalidePrinter._print_OpaqueUnaryFn_log2É   s   € Ü! &Ó)Ð)rF   c                ó  •— |j                   rt        ‰| �	  |«      S |j                  \  }}| j	                  | j                  |«      «      }| j	                  | j                  |«      «      }| j                  d|› d|› d�«      S )Nrq   z / r8   )Ú
is_integerrJ   Ú_print_FloorDivrl   rd   r€   r`   )rL   r_   ÚxÚdivrN   s       €rD   r¶   zHalidePrinter._print_FloorDivÌ   sr   ø€ Ø�?Š?Ü‘7Ñ*¨4Ó0Ð0à—‘‰ˆˆ3Ø�O‰O˜DŸL™L¨›OÓ,ˆØ�o‰o˜dŸl™l¨3Ó/Ó0ˆØ�‰ ¨1¨#¨S°°°QÐ7Ó8Ð8rF   c                ó˜   — t        |j                  «      dk(  sJ ‚| j                  d| j                  |j                  d   «      › d�«      S )Nr#   ú	hl.round(r   r8   rr   rg   s     rD   Ú_print_RoundzHalidePrinter._print_RoundÕ   rt   rF   c                ó2   — |j                   \  }}d|› d|› d�S )Nú(ú) / (z+hl.f32(0)))rl   )rL   r_   r‰   rŠ   s       rD   Ú_print_IntTrueDivzHalidePrinter._print_IntTrueDivÜ   s$   € Ø�y‰y‰ˆˆ1à�1�#�U˜1˜#˜[Ð)Ð)rF   c                ó~   — |j                   \  }}| j                  |«      }t        |«      }dd| z  ›d|› dd|z  ›d�S )Nrf   g      $@z)*hl.round((z	)*hl.f32(ú)))rl   rm   r:   )rL   r_   rB   Úns       rD   Ú_print_RoundDecimalz!HalidePrinter._print_RoundDecimalá   sL   € Ø—‘‰ˆˆQà�k‰k˜#ÓˆÜ�‹FˆØ˜ 1 "™Ð(¨°S°E¸À4ÈÁ7À+ÈRÐPÐPrF   )"rR   rS   rT   Ústaticmethodr`   rd   rh   rn   rs   Ú_print_FloorToIntrw   Ú_print_TruncToIntrz   r}   r„   r‹   rŽ   r‘   r”   r—   r›   rž   r¡   r¤   r§   rª   r­   r³   r¶   r»   Ú_print_RoundToIntr¿   rÃ   rU   rV   s   @rD   rX   rX   P   sÀ   ø„ Øñ:ó ð:ð ñ0ó ð0ò!ò6ò
Ið
 %ÐòIð
 %ÐòHò
@ò+ò
#ò#òGò
6ò
7ò
7ò
6ò
7ò
7ò
6ò
7ò
7ò
*ô9òIð
 %Ðò*ö
QrF   rX   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                ó   — t         |    S ©N)Ú_halide_type©Údtypes    rD   Úhalide_typerÍ   þ   s   € Ü˜ÑÐrF   c                óð   — t        | «      r/| j                  r#| t        j                  k7  rt        j                  } | t        j
                  t        j                  fv rt        j                  } t        | «      S rÉ   )	r	   Ú	is_signedr;   r=   Úint32Úfloat16Úbfloat16Úfloat32rÍ   rË   s    rD   Úhalide_acc_typerÔ     sM   € Ü˜Ô 5§?¢?°uÄÇÁÒ7KÜ—‘ˆØ”—‘¤§¡Ð/Ñ/Ü—‘ˆÜ�uÓÐrF   c                  ó„  — e Zd Ze	 	 dG	 	 	 dHd„«       ZedId„«       Zed„ «       Zed„ «       Zed„ «       Z	ed„ «       Z
ed„ «       Zed	„ «       Zed
„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Z ed„ «       Z!ed„ «       Z"ed „ «       Z#ed!„ «       Z$ed"„ «       Z%ed#„ «       Z&ed$„ «       Z'ed%„ «       Z(ed&„ «       Z)ed'„ «       Z*ed(„ «       Z+ed)„ «       Z,ed*„ «       Z-ed+„ «       Z.ed,„ «       Z/ed-„ «       Z0ed.„ «       Z1ed/„ «       Z2ed0„ «       Z3ed1„ «       Z4ed2„ «       Z5ed3„ «       Z6ed4„ «       Z7ed5„ «       Z8ed6„ «       Z9ed7„ «       Z:ed8„ «       Z;ed9„ «       Z<ed:„ «       Z=ed;„ «       Z>ed<„ «       Z?ed=„ «       Z@ed>„ «       ZAed?„ «       ZBed@„ «       ZCedJdA„«       ZDedB„ «       ZEedC„ «       ZFedD„ «       ZGedE„ «       ZHe	 	 	 	 	 	 	 	 	 	 dKdF„«       ZIy)LÚHalideOverridesNc                óX   — |t         j                  k(  rd| › d�S dt        |«      › d| › d�S )Nr½   z != 0)rZ   r[   r8   )r;   ÚboolrÍ   )r·   rÌ   Ú	src_dtypeÚuse_compute_typess       rD   Úto_dtypezHalideOverrides.to_dtype  s9   € ð ”E—J‘JÒØ�q�c˜�=Ð Øœ+ eÓ,Ð-¨R°¨s°!Ð4Ð4rF   c                óâ   — |t         j                  t         j                  fv rdt        |«      › d| › d�} dt        |«      › d| › d�}|t         j                  t         j                  fv rd|› d�}|S )NrZ   r[   r8   zhl.reinterpret(rb   )r;   rÑ   rÒ   rÍ   )r·   rÌ   rÙ   Úlines       rD   Úto_dtype_bitcastz 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ØˆrF   c                ó8   — | j                  t        |«      |«      S rÉ   )rÛ   rE   )ÚclsÚvaluerÌ   s      rD   ÚconstantzHalideOverrides.constant  s   € à�|‰|œO¨EÓ2°EÓ:Ð:rF   c                ó   — d| › d�S )Nr�   r8   rc   ©r·   s    rD   ÚabszHalideOverrides.abs#  ó   € ð ˜˜˜1ˆ~ÐrF   c                óR   — t        | d«      sd| › d�S d| › d| j                  › d| › d�S )NÚnamezhl.exp(r8   z"hl.fast_exp(hl.cast(hl.Float(32), z)) if z!.type().bits() <= 32 else hl.exp(©Úhasattrrè   rä   s    rD   ÚexpzHalideOverrides.exp(  s?   € ô �q˜&Ô!Ø˜Q˜C˜q�>Ð!Ø3°A°3°f¸Q¿V¹V¸HÐDeÐfgÐehÐhiÐjÐjrF   c                ó   — d| › d�S r|   rc   rä   s    rD   ÚsqrtzHalideOverrides.sqrt/  ó   € ð ˜!˜˜AˆÐrF   c                óœ   — t        | d«      s	d| › d|› d�S d| j                  › d|› d�}d| › d|› d	| › d
| › d|› d| j                  › d| › d|› d�S )Nrè   r†   r[   r8   rZ   ú	.type(), úhl.select((ú<ú)|hl.is_nan(ú), ú) if z.type().is_float() else hl.min(ré   ©r‰   rŠ   s     rD   ÚminimumzHalideOverrides.minimum4  ó   € ô �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ÐsrF   c                óœ   — t        | d«      s	d| › d|› d�S d| j                  › d|› d�}d| › d|› d	| › d
| › d|› d| j                  › d| › d|› d�S )Nrè   r�   r[   r8   rZ   rð   rñ   ú>ró   rô   rõ   z.type().is_float() else hl.max(ré   rö   s     rD   ÚmaximumzHalideOverrides.maximum=  rø   rF   c                óX   — t        |d«      rd|j                  › d|› d�}d| › d|› d|› d�S )Nrè   rZ   rð   r8   r   r[   ré   )r‰   rŠ   r�   s      rD   ÚwherezHalideOverrides.whereF  sA   € ô �1�fÔØ˜1Ÿ6™6˜( )¨A¨3¨aÐ0ˆAØ˜A˜3˜b   2 a S¨Ð*Ð*rF   c                ó   — d| › d�S )Nr“   r8   rc   rä   s    rD   ÚcoszHalideOverrides.cosM  ræ   rF   c                ó   — d| › d�S )Nr�   r8   rc   rä   s    rD   ÚsinzHalideOverrides.sinR  ræ   rF   c                ó   — t        d«      ‚)NÚlgamma©rH   rä   s    rD   r  zHalideOverrides.lgammaW  ó   € ô ˜(Ó#Ð#rF   c                ó   — d| › d�S )Nzhl.erf(r8   rc   rä   s    rD   ÚerfzHalideOverrides.erf\  ræ   rF   c                ó   — d| › d�S )Nr–   r8   rc   rä   s    rD   ÚcoshzHalideOverrides.cosha  rî   rF   c                ó   — d| › d�S )Nr    r8   rc   rä   s    rD   ÚsinhzHalideOverrides.sinhf  rî   rF   c                ó   — d| › d�S )Nrš   r8   rc   rä   s    rD   ÚacoszHalideOverrides.acosk  rî   rF   c                ó   — d| › d�S )Nz	hl.acosh(r8   rc   rä   s    rD   ÚacoshzHalideOverrides.acoshp  ó   € ð ˜1˜#˜QÐÐrF   c                ó   — d| › d�S )Nr£   r8   rc   rä   s    rD   ÚasinzHalideOverrides.asinu  rî   rF   c                ó   — d| › d�S )Nz	hl.asinh(r8   rc   rä   s    rD   ÚasinhzHalideOverrides.asinhz  r  rF   c                ó   — d| › d|› d�S )Nz	hl.atan2(r[   r8   rc   ©r·   Úys     rD   Úatan2zHalideOverrides.atan2  ó   € ð ˜1˜#˜R ˜s !Ð$Ð$rF   c                ó   — d| › d�S )Nr¬   r8   rc   rä   s    rD   ÚatanzHalideOverrides.atan„  rî   rF   c                ó   — d| › d�S )Nz	hl.atanh(r8   rc   rä   s    rD   ÚatanhzHalideOverrides.atanh‰  r  rF   c                ó   — t        d«      ‚)NÚcopysignr  r  s     rD   r  zHalideOverrides.copysignŽ  s   € ô ˜*Ó%Ð%rF   c                ó   — t        d«      ‚)NÚerfinvr  rä   s    rD   r!  zHalideOverrides.erfinv“  r  rF   c                ó   — d| › d|› d�S )Nz	hl.hypot(r[   r8   rc   r  s     rD   ÚhypotzHalideOverrides.hypot˜  r  rF   c                ó   — t        d«      ‚)NÚ	nextafterr  r  s     rD   r%  zHalideOverrides.nextafter�  s   € ô ˜+Ó&Ð&rF   c                ó   — | › d|› �S ©Nz & rc   rö   s     rD   Úlogical_andzHalideOverrides.logical_and¢  ó   € ð ��C˜�sˆ|ÐrF   c                ó   — | › d�S )Nz == 0rc   ©r‰   s    rD   Úlogical_notzHalideOverrides.logical_not§  s   € à��Eˆ{ÐrF   c                ó   — | › d|› �S ©Nz | rc   rö   s     rD   Ú
logical_orzHalideOverrides.logical_or«  r)  rF   c                ó   — d| › d|› d�S )Nr½   ú ^ r8   rc   rö   s     rD   Úlogical_xorzHalideOverrides.logical_xor°  s   € ð �1�#�S˜˜˜1ˆ~ÐrF   c                ó   — | › d|› �S r'  rc   rö   s     rD   Úbitwise_andzHalideOverrides.bitwise_andµ  ó   € à��C˜�sˆ|ÐrF   c                ó   — d| › �S )Nú~rc   r+  s    rD   Úbitwise_notzHalideOverrides.bitwise_not¹  s   € à�1�#ˆwˆrF   c                ó   — | › d|› �S r.  rc   rö   s     rD   Ú
bitwise_orzHalideOverrides.bitwise_or½  r5  rF   c                ó   — | › d|› �S )Nr1  rc   rö   s     rD   Úbitwise_xorzHalideOverrides.bitwise_xorÁ  r5  rF   c                ó   — | › d|› �S )Nz << rc   rö   s     rD   Úbitwise_left_shiftz"HalideOverrides.bitwise_left_shiftÅ  ó   € à��D˜˜ˆ}ÐrF   c                ó   — | › d|› �S )Nz >> rc   rö   s     rD   Úbitwise_right_shiftz#HalideOverrides.bitwise_right_shiftÉ  r?  rF   c                ó   — d| › d|› d�S )Nzhalide_helpers.rand(r[   r8   rc   ©ÚseedÚoffsets     rD   ÚrandzHalideOverrides.randÍ  s   € à% d V¨2¨f¨X°QÐ7Ð7rF   c                ó   — d| › d|› d�S )Nzhalide_helpers.randn(r[   r8   rc   rC  s     rD   ÚrandnzHalideOverrides.randnÑ  s   € à& t f¨B¨v¨h°aÐ8Ð8rF   c                ó&   — d| › d|› d|› d|› d|› d�S )Nz!halide_helpers.rand_eager_kernel(r[   r8   rc   )rD  Úbase_offsetÚthreads_per_roundÚtidÚvecs        rD   Ú
rand_eagerzHalideOverrides.rand_eagerÕ  s2   € à2°4°&¸¸;¸-ÀrÐJ[ÐI\Ð\^Ð_bÐ^cÐceÐfiÐejÐjkÐlÐlrF   c           	     ó    — d| › d|› d|› d|› d�	S )Nzhalide_helpers.randint64(r[   r8   rc   )rD  rE  ÚlowÚhighs       rD   Ú	randint64zHalideOverrides.randint64Ù  s#   € à*¨4¨&°°6°(¸"¸S¸EÀÀDÀ6ÈÐKÐKrF   c                óˆ   — t        j                  | d«      › dt        j                  j                  j                  d|«      › �S )Nr   ú + Úload_seed_offset)ÚopsÚloadr"   r\   rl   Úseed_offset)rè   rE  s     rD   Ú	load_seedzHalideOverrides.load_seedÝ  s7   € ä—(‘(˜4 Ó#Ð$ C¬¯©¯©×(AÑ(AÐBTÐV\Ó(]Ð'^Ð_Ð_rF   c                ó   — d| › d�S )Nz1./hl.sqrt(r8   rc   rä   s    rD   ÚrsqrtzHalideOverrides.rsqrtá  s   € ð ˜Q˜C˜qÐ!Ð!rF   c                ó   — d| › d�S )Nr¦   r8   rc   rä   s    rD   ÚtanzHalideOverrides.tanç  ræ   rF   c                ó   — d| › d�S )Nr©   r8   rc   rä   s    rD   ÚtanhzHalideOverrides.tanhì  rî   rF   c                ó   — d| › d�S )Nz3(hl.reinterpret(hl.UInt(32), hl.cast(hl.Float(32), z)) >> 31) != 0rc   rä   s    rD   ÚsignbitzHalideOverrides.signbitñ  s   € ð EÀQÀCÀ~ÐVÐVrF   c                ó   — | › d| › d|› d|› �S )Nz - hl.trunc(ú/z)*rc   rö   s     rD   ÚfmodzHalideOverrides.fmodö  s!   € ð ��L   1 Q C r¨!¨Ð-Ð-rF   c                ó   — d| › d|› d�S )Nzhl.pow(r[   r8   rc   rö   s     rD   ÚpowzHalideOverrides.powü  s   € à˜˜˜2˜a˜S Ð"Ð"rF   c                ó   — t        d«      ‚)NÚldexpr  )r·   rÂ   s     rD   rh  zHalideOverrides.ldexp   s   € ô ˜'Ó"Ð"rF   c                ó   — d| › d�S )Nzhl.log(r8   rc   rä   s    rD   ÚlogzHalideOverrides.log  ræ   rF   c                ó   — t        d«      ‚r¯   r±   rä   s    rD   r°   zHalideOverrides.log2
  s   € ä! &Ó)Ð)rF   c                ó   — d| › d�S )Nz hl.is_inf(hl.cast(hl.Float(32), rÁ   rc   rä   s    rD   ÚisinfzHalideOverrides.isinf  ó   € ð 2°!°°BÐ7Ð7rF   c                ó   — d| › d�S )Nz hl.is_nan(hl.cast(hl.Float(32), rÁ   rc   rä   s    rD   ÚisnanzHalideOverrides.isnan  rn  rF   c                ó   — d| › d�S )Nrº   r8   rc   rä   s    rD   ÚroundzHalideOverrides.round  r  rF   c                ó   — d| › d�S )Nrq   r8   rc   rä   s    rD   ÚfloorzHalideOverrides.floor  r  rF   c                ó   — d| › d|› d�S )Nr½   r¾   z + hl.f32(0))rc   rö   s     rD   Úint_truedivzHalideOverrides.int_truediv$  s   € à�1�#�U˜1˜#˜]Ð+Ð+rF   c                ó.   — d| j                   › d| › d|› d�S )Nz"hl.floor(hl.cast(hl.Float(max(32, ú.type().bits())), ú) / r8   ©rè   rö   s     rD   ÚfloordivzHalideOverrides.floordiv(  s)   € ð 1°·±°Ð8JÈ1È#ÈTÐRSÐQTÐTUÐVð	
rF   c                ó4  — t        j                  t        j                  d|«      t        j                  «      }t        j                  t        j                  |d«      t        j                  «      }t        j
                  ||«      }d|j                  › d|› d�S )NÚ0rZ   rð   r8   )rV  rÛ   Últr;   Úint8Úsubrè   )rà   r·   ÚleftÚrightr€  s        rD   ÚsignzHalideOverrides.sign/  sg   € ä�|‰|œCŸF™F 3¨›N¬E¯J©JÓ7ˆÜ—‘œSŸV™V A s›^¬U¯Z©ZÓ8ˆÜ�g‰g�d˜EÓ"ˆØ˜!Ÿ&™&˜ ¨3¨%¨qÐ1Ð1rF   c                ó   — d| › d�S )Nrv   r8   rc   rä   s    rD   ÚtrunczHalideOverrides.trunc6  r  rF   c                ó.   — d| j                   › d| › d|› d�S )Nz"hl.trunc(hl.cast(hl.Float(max(32, rx  ry  r8   rz  rö   s     rD   ÚtruncdivzHalideOverrides.truncdiv;  s)   € ð 1°·±°Ð8JÈ1È#ÈTÐRSÐQTÐTUÐVð	
rF   c                ó   — d| › d�S )Nry   r8   rc   rä   s    rD   ÚceilzHalideOverrides.ceilD  rî   rF   c                ó   — d| › d�S )Nr�   z, 0)rc   rä   s    rD   ÚreluzHalideOverrides.reluI  s   € à˜˜˜4Ð Ð rF   c                ó~  — t         j                  j                  |«      }t         j                  j                  t         j                  j	                  |«      t         j                  j                  |«      t        |«      ¬«      }|t        j                  t        j                  fvrt        j                  ||«      S |S ©N)Úbounds)r"   r\   Úprepare_indexingÚgenfuncÚindex_to_strÚused_dims_from_indexr   r;   rÐ   r=   rV  rÛ   ©rà   r_   rÌ   ÚindexÚvars        rD   Ú
index_exprzHalideOverrides.index_exprM  sˆ   € ä—‘×)Ñ)¨$Ó/ˆÜ�h‰h×ÑÜ�H‰H×!Ñ! %Ó(Ü�H‰H×)Ñ)¨%Ó0Ü(¨Ó.ð ó 
ˆð
 œŸ™¤e§k¡kÐ2Ñ2Ü—<‘<  UÓ+Ð+Øˆ
rF   c                ó6  — t         j                  j                  |«      }t         j                  j                  t         j                  j	                  |«      t         j                  j                  |«      t        |«      ¬«      }t        j                  ||«      S r�  )	r"   r\   r�  r�  r‘  r’  r   rV  rÛ   r“  s        rD   Ú
value_exprzHalideOverrides.value_exprY  sn   € ä—‘×)Ñ)¨$Ó/ˆÜ�h‰h×ÑÜ�H‰H×!Ñ! %Ó(Ü�H‰H×)Ñ)¨%Ó0Ü(¨Ó.ð ó 
ˆô
 �|‰|˜C Ó'Ð'rF   c                ó®   — t        j                  |t        j                  «      }t        j                  |||«      }||_        t        t        |«      «      S rÉ   )rV  rÛ   r;   rÐ   Úhalide_clampÚindirect_indexing_sizer   Ústr)rà   Ú	index_varÚsizeÚcheckÚwrap_negs        rD   Úindirect_indexingz!HalideOverrides.indirect_indexingc  sC   € ô —L‘L ¬E¯K©KÓ8ˆ	Ü×$Ñ$ Y°°eÓ<ˆ	Ø+/ˆ	Ô(Ü!¤# i£.Ó1Ð1rF   c                óø   — t         j                  j                  t         j                  j                  |«      dz
  «      }t	        |t
        t        j                  f«      sd|j                  › d|› d�}d|› d|› d�S )Nr#   rZ   rð   r8   z	hl.clamp(z, 0, )	r"   r\   ÚkexprÚrename_indexingr9   r:   ÚsympyÚIntegerrè   )rà   rá   rž  rŸ  Úends        rD   rš  zHalideOverrides.halide_clampk  sj   € ä�h‰h�n‰nœQŸX™X×5Ñ5°dÓ;¸aÑ?Ó@ˆÜ˜$¤¤e§m¡mÐ 4Ô5Ø˜UŸZ™Z˜L¨	°#°°aÐ8ˆCð ˜5˜'  s e¨1Ð-Ð-rF   c                óž  — t         j                  j                  | |«      5 } |«       }d d d «       j                  j                  rt        |«      }t         j                  j                  d|j                  › dt        |«      › d�g t        j                  |«      |j                  ¬«      }t        j                  ||«      S # 1 sw Y   Œ›xY w)NrZ   rð   r8   ©rŽ  Úshape)r"   r\   Ú
mask_loadsrŽ  Úis_boolrØ   r�  rè   rE   r   Úwraprª  rV  rý   )ÚmaskÚbodyÚotherÚnew_maskÚresults        rD   ÚmaskedzHalideOverrides.maskedt  s°   € ä�X‰X× Ñ   uÓ-ð 	°Ù“VˆF÷	ð �=‰=× Ò Ü˜“KˆEô —‘× Ñ Ø�v—{‘{�m 9¬_¸UÓ-CÐ,DÀAÐFØÜ×#Ñ# EÓ*Ø—,‘,ð	 !ó 
ˆô �y‰y˜ 6¨5Ó1Ð1÷	ð 	ús   ¡CÃCc                ó   — t        d«      ‚)NÚfrexpr±   rä   s    rD   rµ  zHalideOverrides.frexp†  s   € ô " 'Ó*Ð*rF   c                ó   — t        d«      ‚)NÚdevice_assert_asyncr±   )ÚcondÚmsgs     rD   r·  z#HalideOverrides.device_assert_async‹  s   € ä!Ð"7Ó8Ð8rF   c                ó   — t         ‚rÉ   r±   )rè   Úreduction_typerá   Ú
extra_metas       rD   Úpartial_accumulatez"HalideOverrides.partial_accumulate�  s
   € ô "Ð!rF   ©NT)rÌ   útorch.dtyperÙ   útorch.dtype | None)rÌ   r¿  rÙ   r¿  )TT)
rè   rœ  r»  rœ  rá   r%   r¼  zdict[str, Any]rP   rQ   )JrR   rS   rT   rÄ   rÛ   rÞ   Úclassmethodrâ   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/  r2  r4  r8  r:  r<  r>  rA  rF  rH  rN  rR  rY  r[  r]  r_  ra  rd  rf  rh  rj  r°   rm  rp  rr  rt  rv  r{  rƒ  r…  r‡  r‰  r‹  r–  r˜  r¡  rš  r³  rµ  r·  r½  rc   rF   rD   rÖ   rÖ   
  sº  „ Øð )-Øð	5àð5ð &ò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ð ð"Øð"àð"ð ð"ð #ð	"ð
 
ò"ó ñ"rF   rÖ   Úhalidec                  ór   ‡ — e Zd Z ej                  d«      Z	 	 d	 	 	 	 	 	 	 dˆ fd„Zd„ Zd„ Zd	d„Z	d„ Z
ˆ xZS )
ÚHalideCSEVariablez\b(tmp\d+)\[\?\]c                ó:   •— t         ‰| �  ||||¬«       d | _        y ©N©rª  )rJ   rK   Ú	used_dims)rL   rè   rŽ  rÌ   rª  rN   s        €rD   rK   zHalideCSEVariable.__init__   s"   ø€ ô 	‰Ñ˜˜v u°EÐÔ:Ø48ˆ�rF   c                óT  — t        | j                  xs d«      }t        j                  ||j	                  «       «      D ]D  }t        |t        «      sŒ|j                  €
J |||f«       ‚|j                  |j                  «       ŒF t        j                  j                  |«      | _        y )Nrc   )r
   rÈ  Ú	itertoolsÚchainÚvaluesr9   rÄ  Úupdater"   r\   Úsort_used_dims)rL   rè   rl   ÚkwargsÚusedÚargs         rD   Úupdate_on_argsz HalideCSEVariable.update_on_argsª  s„   € Ü˜$Ÿ.™.Ò.¨BÓ/ˆÜ—?‘? 4¨¯©«Ó9ò 	+ˆCÜ˜#Ô0Õ1Ø—}‘}Ð0ÐC°4¸¸dÐ2CÓCÐ0Ø—‘˜CŸM™MÕ*ð	+ô Ÿ™×0Ñ0°Ó6ˆ�rF   c                óš   — t        |«      dk(  r| j                  › d�S | j                  › ddj                  t        t        |«      «      › d�S )Nr   z[()]ú[r[   ú])rk   rè   ÚjoinÚmaprœ  )rL   Údimss     rD   Ú	index_strzHalideCSEVariable.index_str²  sE   € Üˆt‹9˜Š>Ø—i‘i�[ Ð%Ð%à—)‘)�˜A˜dŸi™i¬¬C°«Ó7Ð8¸Ð:Ð:rF   c                ón   — | j                   €| j                  › d�S | j                  | j                   «      S )Nz[?])rÈ  rè   rÙ  )rL   s    rD   Ú__str__zHalideCSEVariable.__str__¸  s0   € Ø�>‰>Ð!à—i‘i�[ Ð$Ð$Ø�~‰~˜dŸn™nÓ-Ð-rF   c           	     óÒ   — | j                   �t        d„ | j                   D «       «      sJ ‚| j                  | j                   D �cg c]  }|j                  ||«      ‘Œ c}«      S c c}w )Nc              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrÉ   ©r9   r¥  ÚExpr©Ú.0r·   s     rD   ú	<genexpr>z-HalideCSEVariable.subs_str.<locals>.<genexpr>¿  s    è ø€ ò 2
Ø*+ŒJ�qœ%Ÿ*™*×%ñ2
ùó   ‚$&)rÈ  ÚallrÙ  Úget)rL   ÚreplacementsrÂ   s      rD   Úsubs_strzHalideCSEVariable.subs_str¾  s^   € Ø�~‰~Ð)¬cñ 2
Ø/3¯~©~ô2
ô /
ð 	
ð 
ð �~‰~¸t¿~¹~ÖN¸!˜|×/Ñ/°°1Õ5ÒNÓOÐOùÒNs   ÁA$)NN)rŽ  zValueRanges[Any]rÌ   rÀ  rª  r6   rP   rQ   )rP   rœ  )rR   rS   rT   ÚreÚcompileÚundefined_rerK   rÒ  rÙ  rÛ  rç  rU   rV   s   @rD   rÄ  rÄ  �  s^   ø„ Ø�2—:‘:Ð1Ó2€Lð %)Ø $ð9ð !ð9ð "ð	9ð
 ð9ð 
õ9ò7ò;ó.öPrF   rÄ  c                  óH   ‡ — e Zd ZU ded<   ded<   ded<   dˆ fd„Zd	d„Zˆ xZS )
ÚDimensionInfozsympy.Expr | Noner_   ú
sympy.Exprrž  Ústridec                ó¬   •— t         ‰| �  «        t        j                  j                  j                  |d«      r| }| }|| _        || _        || _        y ©Nr   )	rJ   rK   r"   ÚgraphÚsizevarsÚstatically_known_ltr_   rž  rî  )rL   r_   rž  rî  rN   s       €rD   rK   zDimensionInfo.__init__Ë  sK   ø€ Ü‰ÑÔÜ�7‰7×Ñ×/Ñ/°¸Ô:Ø�WˆFØ�5ˆDØˆŒ	ØˆŒ	Øˆ�rF   c                óè  — | j                   €J ‚| j                   }|r|dk(  ry|r°i |¥}|j                  D ]‘  }t        |t        j                  «      sŒt        |t        j                  «      sJ ‚t        j                  j                  |j                  «      }t        |t        «      sJ ‚t        |j                  |«      «      ||<   Œ“ t        ||«      }t        j                  j!                  |«      S )Nr   úhl.Var())r_   Úfree_symbolsr   r   ÚTMPr9   r¥  ÚSymbolr"   r\   Úlookup_cse_varrè   rÄ  r   rç  r    r‘  )rL   ræ  Ú	zero_varsr_   Úsymr•  s         rD   rÙ  zDimensionInfo.index_strÔ  sÑ   € Ø�y‰yÐ$Ð$Ð$Ø�y‰yˆÙ˜ šØÙØ+˜lÐ+ˆLà×(Ñ(ò W�Ü! #¤t§x¡xÕ0Ü% c¬5¯<©<Ô8Ð8Ð8ÜŸ(™(×1Ñ1°#·(±(Ó;�CÜ% cÔ+<Ô=Ð=Ð=Ü(:¸3¿<¹<ÈÓ;UÓ(V�L Ò%ðWô ˜d LÓ1ˆDÜ�x‰x×$Ñ$ TÓ*Ð*rF   rO   ©NF)rR   rS   rT   Ú__annotations__rK   rÙ  rU   rV   s   @rD   rì  rì  Å  s   ø… à
ÓØ
ÓØÓõ÷+rF   rì  c                ó|   — t         j                  j                  j                  t	        j
                  | |«      «      S rÉ   )r"   rñ  rò  Úguard_or_falser¥  ÚEq)r�  r‚  s     rD   Úeqr  æ  s(   € Ü�7‰7×Ñ×*Ñ*¬5¯8©8°D¸%Ó+@ÓAÐArF   c                óÀ   — t         j                  j                  j                  t	        j
                  | |«      «      ryt	        j                  | |«      }|| k(  r| |k7  S y)z3Compare sizes: only use on inputs known to be >= 0.TF)r"   rñ  rò  rÿ  r¥  ÚLtÚgcd)r�  r‚  r  s      rD   r~  r~  ê  sN   € ä‡w�w×Ñ×&Ñ&¤u§x¡x°°eÓ'<Ô=Øô �)‰)�D˜%Ó
 €CØ
ˆd‚{Ø�u‰}ÐàrF   c                  ó¤  ‡ — e Zd ZU eZeZded<   	 	 	 	 d$ˆ fd„Zd%d„Z	d&d„Z
d'ˆ fd„Zd„ Zd	„ Z	 	 d(ˆ fd
„Zd„ Zd)d„Zd„ Zd„ Zd(d„Zd„ Zd*d„Zd+d„Zd,d„Z	 d-	 	 	 	 	 	 	 	 	 d.d„Z	 	 	 	 	 	 	 	 	 	 d/d„Zd„ Z	 	 	 	 	 	 	 	 d0d„Z ej:                  «       ddœ	 	 	 d1d„Zddœd1d„Zd,d„Z d„ Z!d2d„Z"d-d„Z#e$d „ «       Z%d3d4d!„Z&d"„ Z'	 	 	 	 	 	 	 	 d5d#„Z(ˆ xZ)S )6ÚHalideKernelzCallable[[sympy.Expr], str]r£  c                óx  •— t        ‰| �  |fi |¤Ž | j                  | _        | j                  | _        | j                  | _        t        «       | _        | j                  | _	        | j                  | _
        i | _        i | _        i | _        i | _        i | _        i | _        t#        t$        «      | _        d| _        y rü  )rJ   rK   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)rL   ÚtilingrÏ  rN   s      €rD   rK   zHalideKernel.__init__  s¤   ø€ ô
 	‰Ñ˜Ñ* 6Ò*à—y‘yˆŒØ—Y‘YˆŒ
Ø—i‘iˆŒÜ!/Ó!1ˆÔØ"&×"7Ñ"7ˆÔØ!×2Ñ2ˆÔØACˆÔØ57ˆÔà;=ˆÔà@BˆÔàCEˆÔàHJˆÔä4?ÄÓ4EˆÔØ%*ˆÕ"rF   c                ó   — t        |«      S rÉ   )rÍ   )rL   rÌ   s     rD   Údtype_to_strzHalideKernel.dtype_to_str  s   € Ü˜5Ó!Ð!rF   Nc                ó`   — | j                   j                  |› d|›d�«       t        ||||«      S )Nz = hl.Func(r8   )r¯  Ú	writelinerÄ  )rL   rè   rŽ  rÌ   rª  s        rD   Úcreate_cse_varzHalideKernel.create_cse_var!  s2   € Ø�	‰	×Ñ˜t˜f K°¨x°qÐ9Ô:ä   v¨u°eÓ<Ð<rF   c           
     ó®  •‡‡‡— | j                   s| j                  s| j                  rJ ‚t        j                  t
        j                  j                  j                  t        j                  ¬«      Št        j                  t        t        ‰ | �<  |«      «      }t!        t"           «       Št$        j&                  j)                  | j*                  D �cg c]  }|j,                  j/                  «       ‘Œ c}«      D �ci c]  }|j1                  «       |“Œ c}Šd„ }ˆˆfd„}ˆˆfd„}|D ]ì  }|j3                  t4        «      rV|j7                  t5        t9        j:                  d«      t9        j:                  d«      t9        j:                  d«      «      |«       |j3                  t<        «      rB|j7                  t=        t9        j:                  d«      t9        j:                  d«      «      |«       ‰j?                  t        ‰ | �=  |«      j@                  «       Œî tC        d„ ‰D «       «      | _"        d	}tG        | j*                  «      D �]  }|j,                  j/                  «       D �cg c]  }|j1                  «       ‰v sŒ|‘Œ }	}|	jI                  ˆfd
„¬«       |	s+|	jK                  |jM                  d|jN                  «      «       d}
t8        jP                  jR                  }g }|
tU        |	«      k  �r�tW        |jN                  |«      �sv|	D �cg c]+  }tW        |jX                  |«      sŒ ||jZ                  «      ‘Œ- }}|
tU        |«      z  }
|sJ |	«       ‚|t        j\                  d„ |«      z  }|j_                  |	D �cg c]C  }ta        ||jX                  «      r+ta        |jX                  |«      r ||jX                  |z  «      ‘ŒE c}«       |�rˆt        j\                  t8        jb                  |«      }tW        |d«      r2 ||jN                  |z  «      }tW        |d«      rJ ‚g }tU        |	«      }
d}te        dtU        | j                  «      › �«      }|jf                  r.te        dtU        | j                  «      › �«      | j                  |<   || j                  |<   |jK                  ||f«       ||z  }|	D �cg c]%  }tW        |jX                  |«      sŒ|jZ                  ‘Œ' }}|
tU        |«      z  }
tU        |«      }|D �cg c]&  }tW        ||«      st9        jh                  ||z  «      ‘Œ( }}tU        |«      |k  s|dk(  sJ ‚|j_                  |«       |r�Œˆ|
tU        |	«      k  rtW        |jN                  |«      s�Œv|	D ]Æ  }	 d}d}tW        |jX                  |«      s)||   \  }}|dz  }||z  }tW        |jX                  |«      sŒ)d}t8        jP                  jj                  }tW        |jZ                  |«      s1||   \  }}|dz  }|||z  z  }||z  }tW        |jZ                  |«      sŒ1|| j                   |j1                  «       <   ŒÈ �Œ | j                  D ]-  }| jp                  js                  |› d|jt                  ›d�«       Œ/ | j                  rL| jw                  d| j                  jy                  «       D ��ci c]  \  }}|| j                  |   “Œ c}}«       yyc c}w c c}w c c}w c c}w c c}w c c}w c c}w # tl        $ rÁ |sJ ‚t8        jP                  jj                  }t8        jP                  jR                  }|D ]  \  }}|||z  z  }||z  }Œ t
        j                  j                  jo                  t5        ||jX                  |jZ                  «      | j                  «      | j                   |j1                  «       <   Y �ŒMw xY wc c}}w )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
        ©Úfallbackc                óz   — t        j                  t        j                  j                  j                  | «      «      S rÉ   )r¥  Úsimplifyr"   rñ  rò  Úremove_precomputed_replacementsr^   s    rD   r"  z0HalideKernel.finalize_indexing.<locals>.simplifyA  s+   € Ü—>‘>Ü—‘× Ñ ×@Ñ@ÀÓFóð rF   c                ó  •— | ‰v rˆ‰|    }‰j                  |j                  j                  |j                  |z  t        j
                  j                  j                  |t        |j                  |«      «      «      j                  «       «       y y rÉ   )ÚaddÚrootÚlookupÚdivisorr"   rñ  rò  Úevaluate_minr   ÚlengthÚsymbol)Úbaser(  ÚmodulusÚnodeÚall_used_symbolsÚsym_to_nodes       €€rD   Úvisit_modular_indexingz>HalideKernel.finalize_indexing.<locals>.visit_modular_indexingF  sx   ø€ Ø�{Ñ"Ø" 4Ñ(�Ø ×$Ñ$Ø—I‘I×$Ñ$ØŸ™ wÑ.ÜŸ™×(Ñ(×5Ñ5Ø#Ü$ T§[¡[°'Ó:óó÷ ‘f“hõð #rF   c           	     óÎ   •— | ‰v r`‰|    }‰j                  |j                  j                  |j                  |z  t	        |j
                  |«      «      j                  «       «       y y rÉ   )r%  r&  r'  r(  r   r*  r+  )r,  r(  r.  r/  r0  s      €€rD   Úvisit_floor_divz7HalideKernel.finalize_indexing.<locals>.visit_floor_divS  s]   ø€ Ø�{Ñ"Ø" 4Ñ(�Ø ×$Ñ$Ø—I‘I×$Ñ$ØŸ™ wÑ.Ü  §¡¨gÓ6ó÷ ‘f“hõ	ð #rF   r,  r(  r-  c              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrÉ   )r   r   ÚINDIRECT)rá  rû  s     rD   râ  z1HalideKernel.finalize_indexing.<locals>.<genexpr>r  s    è ø€ ò )
Ø36ŒN˜3¤§¡×.ñ)
ùrã  Fc                ó(   •—  ‰| j                   «      S rÉ   )r(  )rÂ   Ú	size_hints    €rD   ú<lambda>z0HalideKernel.finalize_indexing.<locals>.<lambda>y  s   ø€ ¡Y¨q¯y©yÓ%9€ rF   ©Úkeyr#   r   c                óV   — t         j                  j                  j                  | |«      S rÉ   )r"   rñ  rò  Úevaluate_maxrö   s     rD   r8  z0HalideKernel.finalize_indexing.<locals>.<lambda>‡  s   € ¤§¡×!1Ñ!1×!>Ñ!>¸qÀ!Ó!D€ rF   TÚhÚhrz
 = hl.Var(r8   ÚrdomN)=r  r  r  Ú	functoolsÚpartialr"   rñ  rò  Úoptimization_hintÚsysÚmaxsizeÚdictÚfromkeysr×  rJ   r�  r
   r   rÊ  rË  Úfrom_iterableÚrange_treesÚnodesrÌ  r+  Úhasr   Úreplacer¥  ÚWildr   rÍ  rö  Úanyr  ÚreversedÚsortÚappendr'  ÚnumelÚSÚOnerk   r  r(  r*  ÚreduceÚextendr~  r  r   Úis_reductionr"  ÚZeroÚ
IndexErrorÚsimplify_with_rangesÚindexing_coder  rè   Úcodegen_rdomÚitems)!rL   ÚindicesÚtreerÂ   r"  r1  r3  r”  Úhad_fallbackrI  Úhandled_countr(  Úadded_sym_sizeÚsizes_to_addr§  Ú	next_sizerû  Ú	new_sizesÚ	prior_lenÚsr.  Úidxrž  r*  r_   Ú
full_indexrî  ÚvÚrvr/  r7  r0  rN   s!                                @@@€rD   Úfinalize_indexingzHalideKernel.finalize_indexing&  s÷  û€ ð ×#Ò# t×'7Ò'7¸4×;QÒ;Qð	
ð 
ô ×%Ñ%Ü�G‰G×Ñ×.Ñ.¼¿¹ô
ˆ	ô —-‘-¤¤E¡GÑ$<¸gÓ FÓGˆÜ%¤c™?Ó,Ðô —_‘_×2Ñ2Ø15×1AÑ1AÖB¨�—‘×"Ñ"Õ$ÒBóö
àð �H‰H‹J˜‰Mò
ˆò	õ
	õ	ð ò 	RˆEØ�y‰yœÔ)Ø—‘Ü#ÜŸ
™
 6Ó*ÜŸ
™
 9Ó-ÜŸ
™
 9Ó-óð
 +ôð �y‰yœÔ"Ø—‘ÜÜŸ
™
 6Ó*ÜŸ
™
 9Ó-óð $ôð ×#Ñ#¤E¡GÑ$<¸UÓ$C×$PÑ$PÕQð%	Rô( &)ñ )
Ø:Jô)
ó &
ˆÔ"ð ˆÜ˜T×-Ñ-Ó.ó V	ˆDØ $§
¡
× 1Ñ 1Ó 3ÖV˜1°q·x±x³zÐEUÒ7U’QÐVˆEÐVØ�J‰JÓ9ˆJÔ:ÙØ—‘˜TŸ[™[¨¨D¯J©JÓ7Ô8ØˆMÜ—g‘g—k‘kˆGØˆNà¤# e£*Ó,´R¸¿
¹
ÀGÕ5Là05ö Ø+,¼¸A¿I¹IÀwÕ9O‘H˜QŸX™XÕ&ð �ð  ð ¤ \Ó!2Ñ2�Ù#Ð* UÓ*�|Ø¤	× 0Ñ 0ÙDØ ó!ñ �ð ×#Ñ#ð "'öàÜ˜g q§y¡yÔ1´b¸¿¹ÀCÔ6Hñ ! §¡¨WÑ!4Õ5òôò #Ü )× 0Ñ 0´·±¸LÓ I�IÜ˜) QÔ'ñ %-¨T¯Z©Z¸'Ñ-AÓ$B˜	Ü#% i°Ô#3Ð3Ð3Ø')˜Ü(+¨E«
˜Ø'+˜Ü,¨q´°T×5EÑ5EÓ1FÐ0GÐ-HÓI�Cà×(Ò(Ü6HØ ¤ T×%5Ñ%5Ó!6Ð 7Ð8ó7˜×.Ñ.¨sÑ3ð -6�D×$Ñ$ SÑ)Ø"×)Ñ)¨3°	Ð*:Ô;Ø˜yÑ(�GØ38Ö S¨a¼B¸q¿y¹yÈ'Õ<R §£Ð S�IÐ SØ!¤S¨£^Ñ3�MÜ # LÓ 1�Ið ".ö$àÜ! ! YÔ/ô Ÿ™ q¨9¡}Õ5ð$�Lð $ô
 ˜|Ó,¨yÒ8¸IÈºNÐJÐJØ ×'Ñ'¨	Ô2ó9 #ð%  ¤# e£*Ò,´R¸¿
¹
ÀGÖ5Lðb ò �ðØ�CØ�GÜ  §¡¨wÔ7Ø$2°3Ñ$7™	˜˜TØ˜q™˜Ø 4™˜ô ! §¡¨wÕ7ð �FÜ Ÿ7™7Ÿ<™<�DÜ  §¡¨fÔ5Ø$2°3Ñ$7™	˜˜TØ˜q™˜Ø ¨¡Ñ,˜Ø $™˜ô	 ! §¡¨fÕ5ð
 >B�D×+Ñ+¨D¯K©K«MÒ:òðuV	ðr ×#Ñ#ò 	JˆCØ×Ñ×(Ñ(¨C¨5°
¸3¿8¹8¸,ÀaÐ)HÕIð	Jà×!Ò!Ø×ÑØØ6:×6LÑ6L×6RÑ6RÓ6T×U©U¨Q°��T×%Ñ% aÑ(Ñ(ÓUõð "ùòk Cùò
ùò| Wùò ùòùò4 !Tùò$øô2 "ò Ù'Ð'˜<Ü!&§¡§¡�JÜ"ŸW™WŸ[™[�FØ%3ò '™	˜˜TØ" f¨s¡lÑ2˜
Ø $™™ð'ô Ÿ™×(Ñ(×=Ñ=Ü+¨J¸¿¹ÀdÇkÁkÓRØ ×,Ñ,óð ×+Ñ+¨D¯K©K«MÔ:ðüó( Vsd   Ã![!Ã;[&É$[+É<[+Ì[0Ì([0Í>A[5
Ò8[:Ó[:Ô+[?ÖA\×A"\Ø*\Ú=_ÜC_ß_c           
     óú  — | j                   rdnd}|| j                  v r| j                  |   S i }| j                  D ]c  }| j                   s|| j                  v rŒt	        j
                  d|j                  «      }|sJ ‚t        d|› |j                  d«      › �«      ||<   Œe | j                  |› d�|j                  «       D ��ci c]  \  }}|| j                  |   “Œ c}}«       || j                  |<   |S c c}}w )zCRDom based indexing uses explicit iteration ranges for Func updatesÚiÚoz^h(\d+)$r=  r#   Údom)r  r  r  r  rè  Úmatchrè   r   Úgroupr[  r\  )rL   ÚprefixÚrenamesr•  Úmri  rj  s          rD   Úsetup_dom_indexingzHalideKernel.setup_dom_indexingØ  sþ   € à×-Ò-‘°3ˆØ�T×%Ñ%Ñ%Ø×#Ñ# FÑ+Ð+àˆØ×#Ñ#ò 	HˆCØ×(Ò(¨S°D×4JÑ4JÑ-JØÜ—‘˜ c§h¡hÓ/ˆAÙˆH�1Ü-°°&°¸!¿'¹'À!»*¸Ð.FÓGˆG�CŠLð	Hð 	×ÑØˆh�cˆNÀ'Ç-Á-Ã/×R¹¸¸B˜R ×!1Ñ!1°!Ñ!4Ñ4ÓRô	
ð $+ˆ×Ñ˜Ñ Øˆùó	 Ss   ÃC7c           	     óv  — |j                  «       D �cg c]&  }d| j                  | j                  |«      «      › d�‘Œ( }}| j                  j	                  |› ddj                  |«      › d�«       t        |j                  «       «      D ])  \  }}| j                  j	                  |› d|› d|› d�«       Œ+ y c c}w )	Núhl.Range(0, r8   z = hl.RDom([r[   ú])ú = rÔ  rÕ  )rÌ  r£  r¤  rZ  r  rÖ  Ú	enumerateÚkeys)rL   rè   Úvarsrž  Úrsizesrm  Úrsyms          rD   r[  zHalideKernel.codegen_rdomí  s¾   € ð Ÿ™›ö
àð ˜4Ÿ:™: d×&:Ñ&:¸4Ó&@ÓAÐBÀ!ÒDð
ˆð 
ð 	×Ñ×$Ñ$¨ v¨\¸$¿)¹)ÀFÓ:KÐ9LÈBÐ%OÔPÜ  §¡£Ó-ò 	B‰GˆAˆtØ×Ñ×(Ñ(¨D¨6°°T°F¸!¸A¸3¸aÐ)@ÕAñ	Bùò
s   “+B6c                ó¶   •— t         ‰| �  |«      }t        || j                  «      }t        j
                  j                  j                  || j                  «      S rÉ   )	rJ   r�  r    r  r"   rñ  rò  rY  r  )rL   r”  rN   s     €rD   r�  zHalideKernel.prepare_indexingö  sI   ø€ ô ‘Ñ(¨Ó/ˆÜ˜5 $×"9Ñ"9Ó:ˆÜ�w‰w×Ñ×4Ñ4°U¸D×<LÑ<LÓMÐMrF   c                óž   — t        |t        j                  «      r%| j                  |j                  «      j
                  S | j                  |   S )zThe size of an index symbol)r   r   r÷  rù  rè   r›  r  )rL   rû  s     rD   Úsym_sizezHalideKernel.sym_sizeþ  s<   € ä˜#œtŸx™xÔ(Ø×&Ñ& s§x¡xÓ0×GÑGÐGØ×Ñ Ñ$Ð$rF   c           	     ó 	  ‡ ‡‡— g Št        |j                  d„ ¬«      D ]~  }t        |t        j                  t        j
                  f«      r‰j                  |«       Œ?t        |t        j                  t        j                  t        j                  f«      rŒyJ |«       ‚ t        j                  j                  }t        j                  ‰t        j                  j                  «      }g }t        j                  ‰ j!                  |«      «      }t#        |t        j$                  «      r|j&                  n|gD ]Ù  }|j                  D �	cg c]	  }	|	|v sŒ|	‘Œ }
}	t)        |
«      dk(  r||z  }Œ5t)        |
«      dk(  r||
d   xx   |z  cc<   ŒTg }t+        t)        |«      «      D ]e  }||   €J ‚||   \  }}t-        |«      t-        |
«      z  r*|
j/                  |D �	cg c]	  }	|	|
vsŒ|	‘Œ c}	«       ||z  }ŒS|j                  ||f«       Œg g |¢|
|f‘}ŒÛ ˆˆ ˆfd„}g }|D ]8  \  }}|D ]  }	||j1                  |	«      z  }Œ |j                   |||«      «       Œ: |j3                  «       D ]  \  }}|j                   |||g«      «       Œ  |j5                  d„ ¬«       |sA‰ j6                  r²|j                  t9        t        j                  j                  dd«      «       n}t:        j<                  j>                  jA                  |d   jB                  d«      sF|jE                  dt9        t        j                  j                  ‰rdn|d   jB                  d«      «       |r·‰sµ|‰ jF                  v rit:        j<                  j>                  jI                  |‰ jF                  |   «      r2‰ jK                  ||‰ jF                  |   z
  «       ‰ jF                  |   }n>t:        j<                  j>                  jM                  |d«      r‰ jK                  ||«       d}|}tO        jP                  «       D ]W  }‰ jS                  |||‰«      r||fc S ‰rJ ‚|› d|› �}|‰ jT                  |   vsŒ:‰ jT                  |   j                  |«       ŒY yc c}	w c c}	w )	zEConvert address-based indexing into dimensions using self.halide_varsc                ó   — | j                   S rÉ   rz  rä   s    rD   r8  z5HalideKernel.indexing_to_dimensions.<locals>.<lambda>  s
   € ¸A¿F¹F€ rF   r9  r   r#   Nc                ó   •— t        j                  | «      } t        |«      dk(  rUt        j                  d‰
¬«      }| j	                  ||d   z  «      }|r%t        |d   ‰	j                  |d   «      ||   «      S ‰rJ | «       ‚t        j                  t        | |D �ci c]  }|‰	j                  |«      dz
  “Œ c}«      dz   «      }t         j                  j                  }t        | t         j                  «      rt| j                  D ]e  }t        |t         j                  «      sŒ||z  }t        j                  | |z  «      } t        j                  t        j                  ||z  «      «      }Œg t        | ||«      S c c}w )Nr#   Úwild)Úexcluder   )r¥  Úfactorrk   rL  rp  rì  r�  r"  r    rR  rS  r9   ÚMulrl   r¦  Úceiling)r_   ÚsymsÚstride_wildrt  rû  r*  rî  ÚtermÚis_storerL   Úsymbolss           €€€rD   Úexpr_to_dimensionz>HalideKernel.indexing_to_dimensions.<locals>.expr_to_dimension+  sG  ø€ Ü—<‘< Ó%ˆDÜ�4‹y˜AŠ~Ü#Ÿj™j¨¸ÔA�Ø—J‘J˜{¨T°!©WÑ4Ó5�ÙÜ(Ø˜Q™ §¡¨t°A©wÓ!7¸¸;¹óð ñ  Ð% Ó%�<Ü—^‘^Ü˜4ÈÖ!NÀ# # t§}¡}°SÓ'9¸AÑ'=Ñ"=Ò!NÓOÐRSÑSóˆFô —W‘W—[‘[ˆFÜ˜$¤§	¡	Ô*Ø ŸI™Iò N�DÜ! $¬¯©Õ6Ø $™˜Ü$Ÿ~™~¨d°T©kÓ:˜Ü!&§¡´·±¸fÀt¹mÓ0LÓ!M™ð	Nô
 !  v¨vÓ6Ð6ùò "Os   ÂE;c                óˆ   — t         j                  j                  j                  | j                  t
        j                  ¬«      S )Nr  )r"   rñ  rò  rB  rî  rC  rD  )Úds    rD   r8  z5HalideKernel.indexing_to_dimensions.<locals>.<lambda>J  s-   € œ!Ÿ'™'×*Ñ*×<Ñ<Ø—‘¤3§;¡;ð =ó € rF   Ú_view)+Úsortedrö  r   r   ÚHALIDEr÷  rP  ÚUNBACKED_INTÚSIZEÚPRECOMPUTED_SIZEr¥  rR  rW  rE  rF  Úexpandr¤  r9   ÚAddrl   rk   Úranger
   rU  Úpopr\  rO  r  rì  r"   rñ  rò  Ústatically_known_equalsrî  Úinsertr  Ústatically_known_geqÚapply_offset_to_dimensionÚstatically_known_gtrÊ  ÚcountÚinstall_dimsr  )rL   r•  r”  r�  rû  rE  Ú
split_exprÚsplit_failedÚpartri  Ú	part_varsÚnew_split_failedrm  Ú
other_varsÚ
other_partr�  rØ  rŠ  r_   Úorig_varrŽ  s   `  `                @rD   Úindexing_to_dimensionsz#HalideKernel.indexing_to_dimensions  s2  ú€ àˆÜ˜%×,Ñ,Ñ2BÔCò 	ˆCÜ˜c¤D§K¡K´·±Ð#:Ô;Ø—‘˜sÕ#ä%Øä×)Ñ)ÜŸ	™	Ü×-Ñ-ðõð ð óð ð		ô —‘—‘ˆÜ—]‘] 7¬E¯G©G¯L©LÓ9ˆ
ØDFˆÜ—‘˜T×1Ñ1°%Ó8Ó9ˆÜ",¨U´E·I±IÔ">�E—J’JÀUÀGò 	FˆDØ$(×$5Ñ$5ÖI˜q¸¸jºšÐIˆIÐIÜ�9‹~ Ò"Ø˜$‘‘Ü�Y“ 1Ò$Ø˜9 Q™<Ó(¨DÑ0Ô(à#%Ð Üœs <Ó0Ó1ò J�AØ'¨™?Ð6Ð6Ð6Ø-9¸!©_Ñ*�J 
Ü! *Ó-´
¸9Ó0EÒEØ!×(Ñ(°ZÖ)V°À1ÈIÒCUª!Ò)VÔWØ 
Ñ*™à(×/Ñ/°¸ZÐ0HÕIðJð  FÐ!1ÐE°I¸tÐ3DÐE‘ð!	Fö$	7ð. ˆØ&ò 	7‰JˆD�$Øò *�Ø˜
Ÿ™ qÓ)Ñ)‘ð*à�K‰KÑ)¨$°Ó5Õ6ð	7ð $×)Ñ)Ó+ò 	8‰IˆC�Ø�K‰KÑ)¨$°°Ó6Õ7ð	8à�	‰	ñð 	ô 	
ñ Ø×)Ò)à—‘œM¬%¯'©'¯,©,¸¸1Ó=Õ>Ü—‘×!Ñ!×9Ñ9¸$¸q¹'¿.¹.È!Ô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Ò ÙÐ�<Ø�J˜e A 3Ð'ˆCØ˜$×-Ñ-¨hÑ7Ò7Ø×#Ñ# HÑ-×4Ñ4°SÕ9ñ	:ùò] Jùò *Ws   Å	RÅRÇ	RÇ"Rc                óf  — || j                   vr|| j                   |<   || j                  |<   y| j                  |   |k7  s$t        | j                   |   «      t        |«      k7  ry|r| j                   |   |k(  S t        | j                   |   |«      D ]�  \  }}|j                  |j                  k7  r y|j
                  |j
                  k7  s|j                  |j                  k7  sŒTt        j                  j                  j                  |j
                  |j
                  «      |_        d|_        ŒŸ y)z>Try to set self.buffer_dimensions[var], return True on successTFN)r  r  rk   Úziprî  rž  r_   r"   rñ  rò  r<  )rL   r•  rØ  rE  r�  ÚoldÚnews          rD   r¢  zHalideKernel.install_dimsp  s  € à�d×,Ñ,Ñ,Ø*.ˆD×"Ñ" 3Ñ'Ø'-ˆD×Ñ Ñ$ØØ×Ñ˜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�”Ø�•ð	 ð rF   c                ó‚  — |dk(  ry t        t        t        |«      «      «      D ]’  }||   j                  dk(  s8t        j
                  j                  j                  |||   j                  «      sŒMt        |||   j                  «      }||||   j                  z  z  }||   xj                  |z  c_	        Œ” |dk(  sJ ‚y )Nr   r#   )
rN  rš  rk   rî  r"   rñ  rò  rž  r   r_   )rL   rØ  rE  rm  r¥  s        rD   rŸ  z&HalideKernel.apply_offset_to_dimension„  sª   € Ø�QŠ;ØÜœ%¤ D£	Ó*Ó+ò 	%ˆAØ�A‰w�~‰~ Ò"¤a§g¡g×&6Ñ&6×&KÑ&KØ˜˜Q™Ÿ™õ'ô   ¨¨Q©¯©Ó7�Ø˜$  a¡§¡Ñ/Ñ/�Ø�Q‘—’ Ñ$–ð	%ð ˜Š{Ð‰{rF   c                óš  — t        t        j                     «       }|j                  D �]  }t	        |t        j                  «      sJ ‚t        |t        j                  «      rU| j                  |j                  «      }t	        |t        «      r|j                  €J ‚|j                  |j                  «       Œ�t        |t        j                  «      r|j                  |«       Œ»t        |t        j                  t        j                   t        j"                  t        j$                  f«      r�Œt'        d|› �«      ‚ | j)                  |«      S )zIDetect which range trees are used to populate HalideCSEVariable.used_dimszunhandled symbol )r
   r¥  rø  rö  r9   r   r   r÷  rù  rè   rÄ  rÈ  rÍ  r”  r%  r•  r–  r—  ÚINDEXr²   rÎ  )rL   r”  rÈ  rû  Úcse_vars        rD   r’  z!HalideKernel.used_dims_from_index�  s  € äœuŸ|™|Ñ,Ó.ˆ	Ø×%Ñ%ó 	EˆCÜ˜c¤5§<¡<Ô0Ð0Ð0Ü˜c¤4§8¡8Ô,à×-Ñ-¨c¯h©hÓ7�ä˜wÔ(9Ô:Ø×)Ñ)Ð5ðð6ð × Ñ  ×!2Ñ!2Õ3Ü ¤T§[¡[Ô1Ø—‘˜cÕ"ÜØ”d×'Ñ'¬¯©´D×4IÑ4IÌ4Ï:É:ÐVôñ ä)Ð,=¸c¸UÐ*CÓDÐDð#	Eð$ ×"Ñ" 9Ó-Ð-rF   c                óü   — t        d„ |D «       «      sJ ‚t        j                  | j                  | j                  j                  «       «      D �cg c]  }||v r|‘Œ
 }}t        |«      t        |«      k(  sJ ‚|S c c}w )Nc              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrÉ   rÞ  rà  s     rD   râ  z.HalideKernel.sort_used_dims.<locals>.<genexpr>¨  s   è ø€ Ò@°”:˜a¤§¡×,Ñ@ùrã  )rä  rÊ  rË  r  r  rÌ  rk   )rL   rÈ  rû  Úordereds       rD   rÎ  zHalideKernel.sort_used_dims§  s„   € ÜÑ@°iÔ@Ô@Ð@Ð@ô !—‘Ø× Ñ  $×"8Ñ"8×"?Ñ"?Ó"Aóö
àð �iÑò	 ð
ˆð 
ô �7‹|œs 9›~Ò-Ð-Ð-Øˆùò
s   ÁA9c                óŠ   ‡‡— dj                  ˆˆfd„|D «       «      }t        |«      dk(  rd}|S t        |«      dk(  r|› d�}|S )Nr[   c              3  óB   •K  — | ]  }|j                  ‰‰«      –— Œ y ­wrÉ   )rÙ  )rá  r‘  ræ  rú  s     €€rD   râ  z.HalideKernel.make_index_str.<locals>.<genexpr>´  s   øè ø€ ÒQÀq˜aŸk™k¨,¸	×BÑQùs   ƒr   ú()r#   ú,)rÖ  rk   )rL   rØ  ræ  rú  rÙ  s     `` rD   Úmake_index_strzHalideKernel.make_index_str³  sM   ù€ Ø—I‘IÔQÈDÔQÓQˆ	Üˆt‹9˜Š>ØˆIð Ðô �‹Y˜!Š^à$˜+ Q˜ˆIØÐrF   c                ó"  — | j                   j                  |«      }| j                  |«      }| j                  ||d«      \  }}|› d| j	                  |«      › d�}t
        j                  j                  |«      }|t        j                  t        j                  fv rt        j                  }d|› d�}| j                  �r²t        | j                  t        «      r| j                  j                  €J ‚t!        g | j#                  |«      ¢| j                  j                  ¢­«      }| j%                  | j'                  |«      «      }|j                  rå| j(                  j+                  |j,                  › d�«       | j(                  j+                  |j,                  › d| j                  › d�«       | j/                  | j0                  xs d«      }	| j(                  j+                  |› d	t3        |«      › d
|	› d�«       | j(                  j+                  |› d|› dt3        |«      › d
|j,                  › d�«       |S | j(                  j+                  |› d| j                  › d
|› dt3        |«      › d�«       |S | j5                  || j#                  |«      «      S )z"Codegen a load from an InputBufferFrÔ  rÕ  rb   r8   z!_mask = hl.RDom([hl.Range(0, 1)])z_mask.where(r   z = hl.cast(r[   ry  z + hl.cast(z_mask)z = hl.select(z
, hl.cast(z, 0)))rl   Úinputr�  r«  r»  r"   rñ  Ú	get_dtyper;   rÑ   rÒ   rÓ   Ú
_load_maskr9   rÄ  rÈ  r
   r’  ÚnewfuncrÎ  r¯  r  rè   r£  Ú_load_otherrÍ   r�  )
rL   rè   r”  r•  rØ  rÝ   rÌ   rÈ  r²  r°  s
             rD   rW  zHalideKernel.load¼  sL  € à�i‰i�o‰o˜dÓ#ˆØ×%Ñ% eÓ,ˆØ×/Ñ/°°U¸EÓB‰	ˆˆTØ��a˜×+Ñ+¨DÓ1Ð2°!Ð4ˆÜ—‘×!Ñ! $Ó'ˆØ”U—]‘]¤E§N¡NÐ3Ñ3Ü—M‘MˆEØ+¨D¨6°Ð3ˆDà�?‹?ä˜4Ÿ?™?Ô,=Ô>Ø—O‘O×-Ñ-Ð9ðð:ô #Ø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°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à—<‘<  d×&?Ñ&?ÀÓ&FÓGÐGrF   c                ó^   — | j                   j                  t        j                  dd|«         S )Nz\[.*Ú )ÚcseÚvarname_maprè  r€  ©rL   rè   s     rD   rù  zHalideKernel.lookup_cse_varã  s$   € Ø�x‰x×#Ñ#¤B§F¡F¨7°B¸Ó$=Ñ>Ð>rF   c                ó(  — t        |t        «      sJ ‚| j                  j                  |«      }| j	                  |«      }| j                  ||d«      \  }}| j                  |«      s|�„| j                  «       }| j                  ||«      }|j                  |«      }	dj                  dgt        |«      z  «      xs d}
| j                  j                  t        ||› d|
› d|› d�«      «       n| j                  |d¬	«      }t        |«      }	t         j"                  j%                  |«      }|€|› d|› d
t'        |«      › d|	› d�}n+|dk(  r|› d|› dt'        |«      › d|	› d�}nt)        d|› �«      ‚| j                  j                  t        ||«      «       y)z"Codegen a store to an OutputBufferTNr[   rõ  r¹  rÔ  z] = hl.undef(z.type()))rú  z] = hl.cast(r8   Ú
atomic_addz] += hl.cast(zstore mode=)r9   rÄ  rl   Úoutputr�  r«  Úis_indirect_indexingru  r»  rç  rÖ  rk   r¯  r  r&   rœ  r"   rñ  r¾  rÍ   r²   )rL   rè   r”  rá   Úmoder•  rØ  ræ  rÙ  Ú	value_strÚ
undef_dimsrÌ   rÝ   s                rD   ÚstorezHalideKernel.storeæ  s•  € ô ˜%Ô!2Ô3Ð3Ð3Ø�i‰i×Ñ˜tÓ$ˆØ×%Ñ% eÓ,ˆØ×/Ñ/°°U¸DÓA‰	ˆˆTØ×$Ñ$ UÔ+¨tÐ/?Ø×2Ñ2Ó4ˆLØ×+Ñ+¨D°,Ó?ˆIØŸ™ |Ó4ˆIØŸ)™) Z L´3°t³9Ñ$<Ó=ÒFÀ$ˆJØ�I‰I×ÑÜ˜T c 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¨¨tÓ4Õ5rF   c           	     óv  — | j                   sJ ‚| j                  rJ ‚|||f}|| j                  j                  v r| j                  j                  |   S t	        |t
        «      r1|dk(  sJ ‚ | j                  |Ž x| j                  j                  |<   }|S t	        |t        «      r|j                  €J ‚t        | j                  «      }| j                  |j                  D �cg c]	  }||vsŒ|‘Œ c}«      }	|t        |j                  «      z
  rF| j                  |› | j                  t        g |j                  ¢|¢­«      «      |j                  ¬«      }|j                  | j                  «      }
t         j"                  j%                  ||«      }t'        |«      }|dv rÄ|	j(                  › d|› �}| j*                  j-                  |› d|› d|
› d�«       g }d	}t/        | j                  «      D ]C  \  }}|j1                  |› d
|› d�«       |d	k7  r|dxx   d|› �z  cc<   || j2                  |   z  }ŒE | j*                  j-                  |	› ddj5                  |«      › �«       n®|dk(  r| j7                  ||«      }	n–t9        ||«      }t;        j<                  t?        tA        «       «      «      5   ||	|
«      }ddd«       d|› dtC        |«      › d�}| j*                  j-                  |	› d|› �«       | j*                  j-                  |	› d› �«       |	| j                  j                  |<   |	S c c}w # 1 sw Y   Œ{xY w)zCodegen a reduction operationÚwelford_combineNrÇ  )ÚargmaxÚargminÚ_z = hl.z(rdom, r8   r#   rÔ  rÕ  éÿÿÿÿÚ*ry  rT  Úwelford_reducerZ   r[   )"r  r¿  rÄ  Úreduction_cacher9   ÚtupleÚwelford_combine_implrÄ  rÈ  r
   r  rÀ  r�  rÎ  rª  rç  r   Ú	ReductionÚdefault_accumulatorrÔ   rè   r¯  r  rz  rP  r  rÖ  Úwelford_reduce_fallbackr   r"   Úset_ops_handlerr   rÖ   rE   )rL   rÌ   rÙ   r»  rá   Ú	cache_keyÚresult_tupleÚreduction_varsri  Ú
result_varrÌ  ÚdefaultÚacc_typer”  Úpartsrî  rm  rû  Ú
combine_fnÚcombine_strÚdefault_strs                        rD   Ú	reductionzHalideKernel.reduction  s-  € ð ×$Ò$Ð$Ð$Ø—?’?Ð"Ð"Ø °Ð6ˆ	Ø˜Ÿ™×0Ñ0Ñ0Ø—8‘8×+Ñ+¨IÑ6Ð6ä�eœUÔ#Ø!Ð%6Ò6Ð6Ð6à)�×)Ñ)¨5Ð1ðˆD�H‰H×$Ñ$ YÑ/°,ð  Ðä˜%Ô!2Ô3¸¿¹Ð8SÐSÐSÜ# D×$:Ñ$:Ó;ˆØ—\‘\ØŸ™ÖC�1¨1°NÒ+BŠQÒCó
ˆ
ð œJ u§¡Ó7Ò7Ø—L‘LØ�'Ø×#Ñ#¤JÐ/R°·±Ð/RÀ>Ñ/RÓ$SÓTØ—k‘kð !ó ˆEð
 —N‘N 4×#9Ñ#9Ó:ˆ	Ü—,‘,×2Ñ2°>À9ÓMˆÜ" 5Ó)ˆàÐ1Ñ1Ø!—‘Ð' q¨Ð(8Ð9ˆEØ�I‰I×Ñ 5 '¨°Ð/?¸wÀyÀkÐQRÐ SÔTàˆEØˆFÜ# D×$:Ñ$:Ó;ò 0‘��3à—‘ ˜w a¨ s¨!˜_Ô-Ø˜Q’;à˜"“I 1 V H Ñ-“IØ˜$×*Ñ*¨3Ñ/Ñ/‘ð0ð �I‰I×Ñ : ,¨c°%·*±*¸UÓ2CÐ1DÐ EÕFØÐ/Ò/à×5Ñ5°e¸UÓC‰Jä1°.À(ÓKˆJÜ×"Ñ"¤?´?Ó3DÓ#EÓFñ @Ù(¨°YÓ?�÷@à$ X J¨b´ÀÓ1IÐ0JÈ!ÐLˆKØ�I‰I×Ñ : ,¨c°+°Ð ?Ô@Ø�I‰I×Ñ : ,¨c°+°Ð ?Ô@à.8ˆ�‰× Ñ  Ñ+ØÐùòM D÷>@ð @ús   Ã 	L*Ã*L*Ê+
L/Ì/L8c                óà  — t        |t        «      r|j                  €J ‚t        |t        «      r|j                  €J ‚t        |t        «      r|j                  €J ‚t        g |j                  ¢|j                  ¢|j                  ¢­xs | j                  «      }|t        | j
                  «      z  }| j                  | j                  |«      «      }|||fD �cg c]  }d|j                  › d�‘Œ }}|j                  }| j                  j                  |› ddj                  |«      › d�«       | j                  j                  |› d|› d�«       | j                  j                  |› d|› d	�«       | j                  j                  |› d
|› d�«       | j                  j                  |› d|j                  | j
                  «      › �«       | j                  j                  |› d|j                  | j
                  «      › �«       | j                  j                  |› d|j                  | j
                  «      › �«       | j                  j                  |› d|› d|› d�«       | j                  j                  |› d|› d|› d�«       | j                  j                  |› d|› d|› d|› d�«       |› d|› d|› d�|› d|› d|› d|› d|› d|› d�|› d�g}	| j                  j                  |› ddj                  |	«      › d�«       g }
t        d «      D ]S  }|
j                  | j                  |j                  «      «       | j                  j                  |
d!   › d"|› d#|› d$�«       ŒU t        |
«      S c c}w )%NrZ   z.type(), 0)z = hl.Tuple([r[   rx  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   rÔ  ry  rÔ  rÕ  )r9   rÄ  rÈ  r
   r  r  rÀ  rÎ  rè   r¯  r  rÖ  rç  rš  rP  rØ  )rL   ÚmeanÚm2ÚweightrÈ  rá  r·   râ  ÚpfxrÍ  Úunpackedrm  s               rD   rÙ  z!HalideKernel.welford_combine_implC  se  € Ü˜$Ô 1Ô2°t·~±~Ð7QÐQÐQÜ˜"Ô/Ô0°R·\±\Ð5MÐMÐMÜ˜&Ô"3Ô4¸×9IÑ9IÐ9UÐUÐUÜØ?ˆd�n‰nÐ?˜rŸ|™|Ð?¨f×.>Ñ.>Ñ?ÒSÀ4×CSÑCSó
ˆ	ð 	”Z × 6Ñ 6Ó7Ñ7ˆ	Ø—\‘\ $×"5Ñ"5°iÓ"@ÓAˆ
Ø<@À"ÀfÐ;MÖN°a�X˜aŸf™f˜X [Ò1ÐNˆÐ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“ò 	GˆAØ�O‰O˜DŸL™L¨×)=Ñ)=Ó>Ô?Ø�I‰I×Ñ 8¨B¡< .°°J°<¸qÀÀÀ1Ð EÕFð	Gô �X‹Ðùò7 Os   ÃM+c           
     óN  — | j                   sJ ‚t        |«      t        |«      k(  sJ ‚g }t        t        j                     «       }|D ]Ã  }t        |t        «      r|j                  €J ‚t        |j                  «      t        | j                  «      z  r|j                  |«       nK|j                  | j                  |› g |j                  ¢g | j                  ¢d d ‘|j                  ¬«      «       |j                  |j                  «       ŒÅ | j                  | j                  |«      «      }|j                  r+t        |j                  «      t        | j                  «      z  sJ ‚t        ||«      D ��cg c]  \  }}dt!        |«      › d|› d�‘Œ }	}}| j#                  | j%                  | j&                  d   j(                  «      «      }
|j*                  › d�}|› d�}| j,                  j/                  |› d	|
› d
�«       t        | j                  «      dk(  sJ d«       ‚g | j                  ¢\  }|t1        |«      i}|t1        |«      dz
  i}t        |«      dk(  r(d„ }|j3                  |«      g}|j3                  |«      g}nqd„ }t5        t        |«      «      D �cg c]  }|j3                  |«      d|› d�z   ‘Œ }}t5        t        |«      «      D �cg c]  }|j3                  |«      d|› d�z   ‘Œ }}| j,                  j/                  |› d ||	«      › �«       t7        j8                  t;        t=        «       «      «      5   |||«      }d d d «       | j,                  j/                  |j3                  |«      › d |«      › �«       t        |«      dk(  r|fS |D �cg c]"  }| j                  | j                  |«      «      ‘Œ$ }}t?        |«      D ])  \  }}| j,                  j/                  |› d|› d|› d�«       Œ+ tA        |«      S c c}}w c c}w c c}w # 1 sw Y   ŒÎxY wc c}w )Nr#   rÇ  rZ   r[   r8   rÔ  Ú_rdomz.xz = hl.RDom([hl.Range(1, z)])z&multi-dimensional scan not implementedc                ó   — | d   S rð  rc   rä   s    rD   Úmaybe_tuplez&HalideKernel.scan.<locals>.maybe_tupleš  s   € Ø˜‘t�rF   c                ó,   — ddj                  | «      › d�S )Nz
hl.Tuple([r[   rx  )rÖ  rä   s    rD   rö  z&HalideKernel.scan.<locals>.maybe_tuple¡  s   € Ø# D§I¡I¨a£L >°Ð4Ð4rF   rÔ  rÕ  ry  )!r  rk   r
   r¥  rø  r9   rÄ  rÈ  r  rP  r�  rª  rÍ  rÀ  rÎ  r­  rÔ   r£  r¤  rH  rQ  rè   r¯  r  r   rç  rš  r"   rÝ  r   rÖ   rz  rØ  )rL   Údtypesrå  Úvalues_origrÌ  Úall_used_dimsrá   rá  rÌ   Úinitialr*  Úscan_domÚscanÚscan_varÚscan_renames_curÚscan_renames_prirö  Ú	read_leftÚ
read_rightrm  ræ  rÓ  Úunpack_varsri  s                           rD   rý  zHalideKernel.scani  s5  € ð ×$Ò$Ð$Ð$Ü�6‹{œc +Ó.Ò.Ð.Ð.Ø*,ˆÜ"¤5§<¡<Ñ0Ó2ˆà ò 	2ˆEÜ˜eÔ%6Ô7¸E¿O¹OÐ<WÐWÐWÜ˜%Ÿ/™/Ó*¬Z¸×8NÑ8NÓ-OÒOØ—‘˜eÕ$à—‘Ø—L‘LØ ˜'ØI˜%Ÿ/™/ÐIÐ+D¨T×-CÑ-CÐ+DÀRÀaÐ+HÐIØ#Ÿk™kð !ó ôð × Ñ  §¡Õ1ð	2ð —\‘\ $×"5Ñ"5°mÓ"DÓEˆ
Ø×#Ò#¬
°:×3GÑ3GÓ(HÌ:Ø×"Ñ"óL
ò )
ð 	
ð 
ô
 !$ F¨FÓ 3÷
á��uð ” uÓ-Ð.¨b°°°qÒ9ð
ˆñ 
ð
 —‘˜D×0Ñ0°×1AÑ1AÀ"Ñ1E×1KÑ1KÓLÓMˆØ —o‘oÐ& eÐ,ˆØ�˜2ˆˆØ�	‰	×Ñ˜x˜jÐ(@ÀÀÈÐLÔMä�4×)Ñ)Ó*¨aÒ/ð 	
Ø4ó	
Ð/ð 0˜×.Ñ.Ð/‰ˆØ$Ô&8¸Ó&>Ð?ÐØ$Ô&8¸Ó&>ÀÑ&BÐCÐäˆv‹;˜!Òòð $×,Ñ,Ð-=Ó>Ð?ˆIØ$×-Ñ-Ð.>Ó?Ð@‰Jò5ô
 œs 6›{Ó+öàð ×#Ñ#Ð$4Ó5¸!¸A¸3¸a¸Ó@ðˆIð ô œs 6›{Ó+öàð ×#Ñ#Ð$4Ó5¸!¸A¸3¸a¸Ó@ðˆJð ð
 	�	‰	×Ñ˜z˜l¨#©k¸'Ó.BÐ-CÐDÔEô ×Ñœ¬Ó/@ÓAÓBñ 	<Ù$ Y°
Ó;ˆK÷	<à�	‰	×ÑØ×"Ñ"Ð#3Ó4Ð5°S¹À[Ó9QÐ8RÐSô	
ô ˆv‹;˜!ÒØ�=Ð àQWÖXÈA�t—|‘| D×$7Ñ$7¸Ó$FÕGÐXˆÐXÜ˜kÓ*ò 	<‰DˆAˆqØ�I‰I×Ñ 1 # S¨¨°A°a°S¸Ð :Õ;ð	<ä�[Ó!Ð!ùók
ùò:ùò÷	<ð 	<üò Ys$   Å5PÊPËPÌ?
PÎ'P"ÐPr©  c               óŠ   — | j                   j                  | j                  |||¬«      }t        |t        «      sJ ‚||_        |S )Nr©  )rÄ  Úgenerater¯  r9   rÄ  rÈ  )rL   rÝ   rÈ  rŽ  rª  r•  s         rD   r�  zHalideKernel.genfunc¾  sB   € ð �h‰h×Ñ §	¡	¨4¸ÀeÐÓLˆÜ˜#Ô0Ô1Ð1Ð1Ø!ˆŒØˆ
rF   rÇ  c               óp   — | j                   j                  |¬«      }t        |t        «      sJ ‚||_        |S rÆ  )rÄ  Únewvarr9   rÄ  rÈ  )rL   rÈ  rª  r•  s       rD   rÀ  zHalideKernel.newfuncË  s3   € Ø�h‰h�o‰o EˆoÓ*ˆÜ˜#Ô0Ô1Ð1Ð1Ø!ˆŒØˆ
rF   c                óx   — t         j                  j                  |«      j                  «       j	                  «       S )a  
        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"   rñ  Ú
get_bufferÚ
get_layoutÚstorage_sizerÆ  s     rD   Úhalide_buffer_numelz HalideKernel.halide_buffer_numelÑ  s+   € ô �w‰w×!Ñ! $Ó'×2Ñ2Ó4×AÑAÓCÐCrF   c                óŒ  ‡— d„ }g }| j                   j                  «       \  }}}}t        t        ||«      |¬«      D ]„  \  }Š|j	                  |‰f«       t        ‰t        «      sŒ*‰j                  dk(  r‰j                  �J ‚|j                  ˆfd„| j                  j                  ‰j                  d«      D «       «       Œ† |S )zX
        Halide requires scalar inputs before outputs, so need to reorder args.
        c                ón   — | \  }}t        |t        «      ryd|j                  v ryd|j                  v sJ ‚y)Nr#   Úout_ptrr   Úin_ptrr   )r9   r+   rè   )Ú	arg_tupleÚ	_call_strrÑ  s      rD   Ú	arg_orderz.HalideKernel.halide_argdefs.<locals>.arg_orderÞ  s<   € Ø&‰NˆI�sÜ˜#œwÔ'ØØ˜cŸh™hÑ&Øà 3§8¡8Ñ+Ð+Ð+ØrF   r9  r   c           	   3  ó’   •K  — | ]>  }d t        |‰j                  ‰j                  ‰j                  ‰j                  ¬«      f–— Œ@ y ­w)N)Úalias_of)r,   ÚbufferrÌ   rE  rè   )rá  ÚaliasrÑ  s     €rD   râ  z.HalideKernel.halide_argdefs.<locals>.<genexpr>î  sG   øè ø€ ò ð ð Ü!Ø!ØŸJ™JØŸI™IØŸJ™JØ%(§X¡Xôô	ñùs   ƒAArc   )rl   Úpython_argdefsr“  r­  rP  r9   r,   rE  r  rU  r  rå  rè   )rL   r  r²  rÓ  r‰   rŠ   Úcall_strrÑ  s          @rD   Úhalide_argdefszHalideKernel.halide_argdefsÙ  s¶   ø€ ò
	ð :<ˆØ—Y‘Y×-Ñ-Ó/‰
ˆˆ1ˆa�Ü#¤C¨¨1£I°9Ô=ò 	‰MˆH�cØ�M‰M˜8 S˜/Ô*Ü˜#œyÕ)Ø—z‘z Q’¨3¯<©<Ð+?Ð?Ð?Ø—‘ó ð "&×!4Ñ!4×!8Ñ!8¸¿¹À2Ó!Fôõ ð		ð" ˆrF   c                óò  — g }| j                  «       D �]4  \  }}t        |t        «      r	d}d}d}d}ná| j                  |j                     D �cg c]&  }t        | j                  |j                  «      «      ‘Œ( }}| j                  |j                     D �cg c]&  }t        | j                  |j                  «      «      ‘Œ( }}t        |«      t        |«      k(  sJ ‚t        | j                  |j                     «      }t        |j                     › d�}|j                  t        ||j                  ||||j                  ¬«      «       �Œ7 t         j"                  j%                  «       }	|	j&                  dk(  rDt(        j*                  j,                  g}
t(        j*                  j.                  }dt1        «       i}d}ný|	j&                  dk(  sJ d«       ‚|	j2                  d	k  sJ d
«       ‚t(        j*                  j4                  g}
t(        j*                  j6                  }t8        j:                  j=                  |	«      }d|
d	   vrAdD ]<  \  }}|j>                  |k\  sŒ|j@                  |k\  sŒ&|
j                  d|› |› �«        n |
j                  d«       d|jB                  i}tE        d	|	j2                  «      }|
j                  d«       |
j                  d«       t(        j*                  jF                  s|
j                  d«       t(        j*                  jH                  r|
j                  d«       d| jJ                  v r|
j                  d«       tM        |djO                  |
«      |||¬«      S c c}w c c}w )z)Compute metadata required by codecache.pyNÚlongrÕ  )rª  rî  rE  r  ÚcpuÚparallelismÚcudazonly cpu/cuda supportedr   zonly default device supportedÚcuda_capability))é   é   )r!  r   )é   é   )r#  r   )r"  r#   Úcuda_capability_Úuser_contextÚstrict_floatÚ
no_runtimeÚ
no_assertsÚdebugÚ64Úlarge_buffersú-)ÚtargetÚ	schedulerÚscheduler_flagsÚcuda_device)(r  r9   r+   r  rè   r.   r¤  rž  rî  rk   r  r-   rÌ   rP  r   r  r"   rñ  Úget_current_device_or_throwÚtyper   rÂ  Ú
cpu_targetÚscheduler_cpur   r”  Ú
gpu_targetÚscheduler_cudar;   r  Úget_device_propertiesÚmajorÚminorÚmulti_processor_countr?   Úassertsr*  r]   r   rÖ  )rL   ÚargtypesrÓ  rÑ  rª  rî  rE  rÌ   r·   Úcurrent_devicer.  r/  r0  r1  Ú
capabilityr9  r:  s                    rD   Úhalide_kernel_metazHalideKernel.halide_kernel_metaý  s  € àˆØ×)Ñ)Ó+ó 	‰FˆAˆsÜ˜#œwÔ'Ø�Ø�Ø�Ø‘ð "×3Ñ3°C·H±HÑ=öàô ˜$×.Ñ.¨q¯v©vÓ6Õ7ð�ð ð "×3Ñ3°C·H±HÑ=öàô ˜$×.Ñ.¨q¯x©xÓ8Õ9ð�ð ô ˜5“z¤S¨£[Ò0Ð0Ð0Ü˜t×2Ñ2°3·8±8Ñ<Ó=�Ü'¨¯	©	Ñ2Ð3°1Ð5�Ø�O‰OÜØØ—H‘HØØ!Ø!Ø Ÿ\™\ôö	ð%	ô: Ÿ™×<Ñ<Ó>ˆØ×Ñ %Ò'Ü—m‘m×.Ñ.Ð/ˆFÜŸ™×3Ñ3ˆIàÔ3Ó5ðˆOð ‰Kà!×&Ñ&¨&Ò0ÐKÐ2KÓKÐ0Ø!×'Ñ'¨1Ò,ÐMÐ.MÓMÐ,Ü—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˜.Ô)à˜z×?Ñ?ðˆOô
 ˜a ×!5Ñ!5Ó6ˆKð 	�‰�nÔ%ð 	�‰�lÔ#ä�}‰}×$Ò$Ø�M‰M˜,Ô'ä�=‰=×ÒØ�M‰M˜'Ô"à�4×#Ñ#Ñ#à�M‰M˜/Ô*äØØ—8‘8˜FÓ#ØØ+Ø#ô
ð 	
ùòCùòs   Á+M/Â+M4c                ó†
  ‡ — ‰ j                   j                  rt        d«      ‚‰ j                  «       }t	        «       }|j                  dd¬«       |j                  «        ‰ j                  «       D ]Ä  \  }}t        |t        «      r,|j                  |j                  › d‰ j                  › d�«       ŒB|j                  sJ |«       ‚d|j                  v rdnd	}t        |j                  «      }t!        ‰ j"                  |j                     «      }|j                  |j                  › d
|› d|› d|› d�«       ŒÆ |j                  d«       |j                  «        ‰ j                  «       D ]/  \  }}|j                  |j                  › d|j                  › �«       Œ1 ‰ j                   j%                  «       D ]  \  }	}
|j                  |	› d
|
› �«       Œ |j                  ‰ j&                  «       ˆ fd„}‰ j(                  j*                  D ]C  }t        |t,        «      r t.        j0                  j3                  ||«      }|j                  |«       ŒE |j                  d«       |j                  d«       ‰ j                  «       D �]Ç  \  }}t        |t        «      rWt4        j6                  j8                  j;                  |j<                  d¬«      }|j                  |j                  › d|› d�«       Œn‰ j"                  |j                     }g }t?        |«      D �]   \  }}‰ jA                  t4        j6                  j8                  j;                  |jB                  d¬«      |«      }|jE                  d|› d�«       d|j                  vsŒp|j                  |j                  › d|› d�«       	 |j                  |j                  › d|› dtG        |jH                  «      › d�«       	 |j                  |j                  › d|› dtG        |jB                  «      › d�«       �Œ |j                  |j                  › ddjM                  |«      › d�«       �ŒÊ |jO                  d«       |j                  djQ                  «       «       |jR                  rk|j                  dtU        jV                  |jR                  «      ›d|jX                  ›d |jR                  ›d|jZ                  ›d!�	d¬«       |j]                  «       S |j                  d"|jX                  ›d#�d¬«       |j]                  «       S # tJ        $ r Y �ŒRw xY w# tJ        $ r Y �Œ+w xY w)$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(r8   Úoutzhl.OutputBufferzhl.InputBufferry  r½   r[   z&
            def generate(g):
        z = g.c                ó¬   •— t        t        ‰j                  j                  | j	                  d«         «      }|j
                  €J |«       ‚t        |«      S )Nr#   )r   rÄ  rÄ  rÅ  rq  rÈ  rœ  )rt  r•  rL   s     €rD   Úupdate_indexz1HalideKernel.codegen_kernel.<locals>.update_indexw  sE   ø€ ÜÔ(¨$¯(©(×*>Ñ*>¸q¿w¹wÀq»zÑ*JÓKˆCØ—=‘=Ð,Ð1¨cÓ1Ð,Ü�s“8ˆOrF   rÃ  zassert g.using_autoscheduler()r#   r  z.set_estimate(rw  z.dim(z).set_min(0)z).set_stride(z).set_extent(z.set_estimates([rx  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()
                  )/rl   rB  rH   r@  r'   ÚspliceÚ	do_indentr  r9   r+   r  rè   r]   r  rÍ   rÌ   rk   r  ÚaliasesrZ  r¯  Ú_linesrœ  rÄ  rê  r€  r"   rñ  rò  rB  r_   rz  Ú_autoscheduler_workaroundsrž  rP  r:   rî  Ú	TypeErrorrÖ  Údo_unindentÚrstripr/  r   Úfind_libautoscheduler.  r0  Úgetvalue)rL   rè   ÚmetaÚcoderÓ  rÑ  ÚargclsÚargtypeÚndimr®  r¯  rG  rÝ   ÚhintrØ  Úrange_hintsrm  Údims   `                 rD   Úcodegen_kernelzHalideKernel.codegen_kernelP  sÛ  ø€ à�9‰9×$Ò$ÜÐ/Ó0Ð0Ø×&Ñ&Ó(ˆÜÓˆØ�‰ðð ð 	ô 
	
ð 	�‰ÔØ×)Ñ)Ó+ò 	L‰FˆAˆsÜ˜#œwÔ'Ø—‘ #§(¡( Ð+=¸d×>NÑ>NÐ=OÈqÐQÕRà—z’zÐ& 3Ó&�zØ.3°s·x±xÑ.?Ñ*ÐEU�Ü% c§i¡iÓ0�Ü˜4×1Ñ1°#·(±(Ñ;Ó<�Ø—‘ #§(¡( ¨3¨v¨h°a¸°yÀÀ4À&ÈÐJÕKð	Lð 	�‰ðô	
ð
 	�‰ÔØ×)Ñ)Ó+ò 	9‰FˆAˆsØ�N‰N˜cŸh™h˜Z u¨S¯X©X¨JÐ7Õ8ð	9àŸ	™	×)Ñ)Ó+ò 	-‰HˆC�Ø�N‰N˜c˜U # c UÐ+Õ,ð	-à�‰�D×&Ñ&Ô'ô	ð
 —I‘I×$Ñ$ò 	!ˆDÜ˜$¤Ô$ä(×5Ñ5×9Ñ9¸,ÈÓM�Ø�N‰N˜4Õ ð		!ð
 	�‰�rÔØ�‰Ð7Ô8à×)Ñ)Ó+ó 	X‰FˆAˆsô ˜#œ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ð=	Xð@ 	×Ñ˜ÔØ�‰ð÷ ‘“ô		
ð �>Š>Ø�K‰Kð$ä$3×$HÑ$HÈÏÉÓ$XÐ#[ð \(Ø(,¯© ð 7<Ø<@¿N¹NÐ;MÈRÐPT×PdÑPdÐOgð hð	ð  ð# ô ð8 �}‰}‹Ðð �K‰Kð:à:>¿+¹+¸ð Iðð
 ð ô ð �}‰}‹Ðøô]  )ò !Ú ð!ûô  )ò !Ú ð!ús$   Î&7T#Ï7T3Ô#	T0Ô/T0Ô3	U Ô?U c                óÊ   — t        |«      dk(  rTt        j                  j                  dk(  r7t        j
                  j                  «       j                  dk(  rt        d| «      } | S )Nr#   ÚAnderson2021r  r   )	rk   r   rÂ  r7  r"   rñ  r2  r3  r?   )rÂ   rØ  s     rD   rL  z'HalideKernel._autoscheduler_workaroundsÊ  sN   € ô �‹I˜ŠNÜ—‘×,Ñ,°Ò>Ü—‘×3Ñ3Ó5×:Ñ:¸fÒDô �A�q“	ˆAØˆrF   c                ó²  — t         j                  j                  }| j                  «       D ��cg c]  \  }}|j                  �Œ|› ‘Œ }}}t         j                  j                  «       }|j                  dk(  rE|j                  |j                  t         j                  j                  «      }	|j                  |	«       |j                  |||d¬«       yc c}}w )zCodegen a call to this kernelNr  F)ÚdeviceÚtriton)r"   rñ  Úwrapper_coder  r  r2  r3  Úwrite_get_raw_streamr”  rè   rP  Úgenerate_kernel_call)
rL   rè   r.  Údeallocate_wsÚwrapperrÂ   rÑ  Ú	call_argsr>  Ústream_names
             rD   Úcall_kernelzHalideKernel.call_kernelÕ  s¶   € ä—'‘'×&Ñ&ˆØ*.×*=Ñ*=Ó*?×X¡  3À3Ç<Á<ÑCW˜�s‘VÐXˆ	ÑXÜŸ™×<Ñ<Ó>ˆØ×Ñ &Ò(Ø!×6Ñ6Ø×$Ñ$¤a§g¡g§l¡lóˆKð ×Ñ˜[Ô)Ø×$Ñ$ØØØ!Øð	 	%õ 	
ùó Ys   ®CÁCc                 ó   — yrü  rc   )rL   rŸ  s     rD   Úgenerate_assertzHalideKernel.generate_assertæ  s   € ØrF   c                 ó   — y rÉ   rc   )rL   r_   rž  ÚlowerÚuppers        rD   Úcheck_boundszHalideKernel.check_boundsé  s   € ð 	rF   )r  zdict[str, sympy.Expr]rP   rQ   )rÌ   r¿  rP   rœ  )NNN)r]  zSequence[sympy.Expr])r”  rí  )r•  rœ  r”  rí  r�  rØ   rü  )rè   rœ  r”  rí  )rè   rœ  rÉ   )
rè   rœ  r”  rí  rá   r%   rË  r5   rP   rQ   )
rÌ   r¿  rÙ   r¿  r»  r4   rá   ú%CSEVariable | tuple[CSEVariable, ...]rP   rn  )rø  ztuple[torch.dtype, ...]rå  zUCallable[[tuple[CSEVariable, ...], tuple[CSEVariable, ...]], tuple[CSEVariable, ...]]rù  útuple[CSEVariable, ...]rP   ro  )rª  r6   rP   rÄ  )rP   r   r¾  )rè   rœ  rc  rØ   )r_   rí  rž  rí  rk  rØ   rl  rØ   )*rR   rS   rT   rÖ   Ú	overridesÚtexprr£  rý  rK   r  r  rk  ru  r[  r�  r�  r«  r¢  rŸ  r’  rÎ  r»  rW  rù  rÎ  rè  rÙ  rý  r   Úunknownr�  rÀ  r  r  r@  rZ  rÄ   rL  rg  ri  rm  rU   rV   s   @rD   r  r  þ  s»  ø… Ø€IØ).€EÐ&Ó.ð+à%ð+ð 
õ	+ó6"ó=õ
pòdò*BðNàõNò%ój:òXò(
ó.ò.
óó%HóN?ð SWð6Øð6Ø *ð6Ø3>ð6ØFOð6à	ó6ð:>àð>ð ð>ð &ð	>ð
 5ð>ð 
/ó>ò@$ðLS"à'ðS"ð
ðS"ð -ðS"ð 
!óS"ðt #ˆ{×"Ñ"Ó$Ø $ñð ðð 
óð =Aõ óDò"óHQ
ófxðt ñó ðô
ò"ðØðØ&0ðØ9=ðØFJ÷rF   r  c                  ó(   — e Zd ZeZedd„«       Zd„ Zy)ÚHalideSchedulingc                óè   — t        t        j                  t        j                  t        j                  g«      }t
        j                  j                  r|j                  t        j                  «       |S rÉ   )
r
   r$   ÚTUPLE_REDUCTIONÚPREFER_STORE_LOOP_ORDERÚREDUCE_TO_SINGLE_ELEMENTr   rÂ  Úscan_kernelsr%  ÚSCAN)rà   r^  r²  s      rD   Úget_backend_featuresz%HalideScheduling.get_backend_featuresò  sR   € ää×.Ñ.Ü×6Ñ6Ü×7Ñ7ðó
ˆô �=‰=×%Ò%Ø�J‰J”~×*Ñ*Ô+ØˆrF   c                ó  — t         j                  j                  }||j                  v r|j                  |   }|S d|j	                  «       › �}||j                  |<   |j                  d«       t        «       }|j                  d|j                  «       ›d�«       |j                  |d¬«       |j                  d«       t        ||«      \  }}|› d|› �}	|j                  ||j                  «       |	«       t        d	«      rt        |d
|«       |S )z6Codegen kernel definition to go in output wrapper codeÚhalide_kernel_zEfrom torch._inductor.runtime.hints import HalideMeta, HalideInputSpeczasync_compile.halide(z, '''TrC  z''')ú
Úkernel_metadatarÃ  )r"   rñ  r`  Úsrc_to_kernelÚnext_kernel_suffixÚadd_import_oncer'   r  r@  rH  r   Údefine_kernelrQ  r   r   )
rL   Úsrc_codeÚnode_scheduler\   rd  Úkernel_nameÚcompile_wrapperÚoriginsÚdetailed_originsÚmetadata_comments
             rD   rƒ  zHalideScheduling.define_kernelÿ  s"  € ä—'‘'×&Ñ&ˆØ�w×,Ñ,Ñ,Ø!×/Ñ/°Ñ9ˆKð. Ðð+ +¨7×+EÑ+EÓ+GÐ*HÐIˆKØ.9ˆG×!Ñ! (Ñ+Ø×#Ñ#ØWôô -Ó.ˆOØ×%Ñ%Ø'¨×(AÑ(AÓ(CÐ'FÀeÐLôð ×"Ñ" 8°4Ð"Ô8Ø×%Ñ% fÔ-ä(;¸MÈ7Ó(SÑ%ˆGÐ%Ø") ¨"Ð-=Ð,>Ð?ÐØ×!Ñ!Ø˜_×5Ñ5Ó7Ð9Iôô 'Ð'8Ô9Ü# K°°XÔ>àÐrF   N)r^  ztorch.devicerP   zOrderedSet[BackendFeature])rR   rS   rT   r  Úkernel_typerÁ  r{  rƒ  rc   rF   rD   rt  rt  ï  s   „ Ø€Kàò
ó ð
órF   rt  )sÚ
__future__r   Údataclassesr@  rÊ  Úloggingrè  rC  Úcollectionsr   Útypingr   r   r   r¥  r;   Útorch._loggingÚ_prims_commonr	   Úutils._ordered_setr
   Úutils._sympy.functionsr   r   r   r   Úutils._sympy.symbolr   r   Úutils._sympy.value_rangesr   rÃ  r   r   Ú	codecacher   r   Úmetricsr   r   Úops_handlerr   Úruntime.hintsr   r   Úutilsr   r   r   r   r    Úvirtualizedr!   rV  r"   Úcommonr$   r%   r&   r'   r(   r)   r*   r+   r,   Úcppr-   Ú	cpp_utilsr.   Úsimdr/   r0   r1   Úcollections.abcr2   r3   r4   r5   Úshape_propagationr6   Ú	getLoggerrR   rj  rE   ÚRuntimeErrorrH   rX   r€   rq  ÚpexprrØ   rÒ   rÑ   rÓ   Úfloat64r  Úint16rÐ   r=   Úuint8Úuint16Úuint32Úuint64rÊ   rÍ   rÔ   rÖ   Ú_initialize_pointwise_overridesrÄ  Ú	dataclassrì  r  r~  r  rt  rc   rF   rD   ú<module>r®     sØ  ðå "ã Û Û Û Û 	Û 
Ý #ß +Ñ +ã ã Û å -Ý ,ß IÓ Iß 7Ý 4ß Ý 'Ý )ß BÝ )ß 7÷õ ÷ )÷
÷ 
õ 
õ Ý ß ;Ñ ;ñ ß2ç6Ý2à€g×Ñ˜Ó!€ò
ôF�,ô Fô
VQ�Mô VQñr 	‹×Ñ€Ù‹×Ñ€ð 
‡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�-ð€ò"òôM"�kô M"ð` × /Ñ /°Ô 9ô%P˜ô %PðP ×Ñ÷+ð +ó ð+ò@Bòô(n�:ô nôb+�~õ +rF   