Ë
    g^(h&V ã                  óŒ  — U 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Zd dl	Z	d dl
mZmZ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mZmZmZmZmZmZmZ d dlmZmZmZ d d	l m!Z! d dl"Z"d d
l"m#Z#m$Z$m%Z% d dl&m'c m(c m)Z* d dl+m,c m-Z. d dl/Z0d dl1Z0d dl2m-c m3Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z>m?Z?m@Z@mAZAmBZB d dlCmDZD d dlEmFZFmGZGmHZHmIZImJZJmKZK d dlLmMZM d dlNmOZOmPZPmQZQ d dlRmSZS ddlTmUZUmVZV ddlWmXZXmYZYmZZZ ddlVm[Z[m\Z\m]Z]m^Z^m_Z_ ddl`maZa ddlbmcZcmdZdmeZemfZf ddlgmhZh ddlimjZjmkZk ddl-mlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{ ddl|m}Z}m~Z~mZ erd dl€m�Z� dd l‚mƒZƒ dd!l„m…Z… dd"l-m†Z† ne‡Zƒd#eˆd$<   	 d dl‰Z‰e‰�j                  Z‹d%ZŒ ed'«      ZŽ ed(«      Z� ed)«      Z�ee‘e#f   Z’d#eˆd*<   ee‘e“e#f   Z”d#eˆd+<    e�j*                  e–«      Z— ej$                  e�j0                  d,¬-«      Z˜e0jú                  �j2                  Z™	 ee‘d.eše›d.f   d/d0eeee‘eše›d.f   d.d/d0f         f   Zœd#eˆd1<    e�j:                  d%¬2«       G d3„ d4«      «       Zž�dd5„ZŸ�dd6„Z �d	d7„Z¡�d	d8„Z¢	 	 	 	 	 	 �d
d9„Z£g d:¢Z¤g d;¢Z¥	 �d	 	 	 	 	 �dd<„Z¦�dd=„Z§	 �d	 	 	 	 	 �dd>„Z¨e�d�dd?„«       Z©e�d�dd@„«       Z©	 �d	 	 	 	 	 �ddA„Z©	 	 	 	 �ddB„Zª	 	 	 	 �ddC„Z«�ddD„Z¬�ddE„Z­�ddF„Z®	 	 	 	 	 	 	 	 �ddG„Z¯	 	 	 	 	 	 �ddH„Z° G dI„ d0«      Z± etd&¬2«       G dJ„ dK«      «       Z²et G dL„ dMe±«      «       Z³�ddN„Z´et G dO„ dPe³«      «       Zµet G dQ„ dReµ«      «       Z¶ e dS«       e dT«       e dU«       e dV«       e dW«       e dX«      dYœZ·dZeˆd[<   	 �d	 	 	 	 	 	 	 �dd\„Z¸et G d]„ d^e³«      «       Z¹eee#   ee#   ge~f   Zº G d_„ d`e¹«      Z» G da„ dbe»«      Z¼ G dc„ dde»«      Z½et G de„ dfe³«      «       Z¾et G dg„ dhe¾«      «       Z¿et G di„ dje³«      «       ZÀ�ddk„ZÁ�ddl„ZÂ	 	 	 	 	 �d	 	 	 	 	 	 	 	 	 	 	 	 	 �ddm„ZÃ	 	 	 	 	 	 �ddn„ZÄet G do„ dpe±«      «       ZÅet G dq„ dreÅ«      «       ZÆet G ds„ dteÅ«      «       ZÇet G du„ dveÅ«      «       ZÈet G dw„ dxeÅ«      «       ZÉet G dy„ dzeÉ«      «       ZÊet G d{„ d|eÅ«      «       ZËet G d}„ d~eÅ«      «       ZÌ G d„ d€eÊ«      ZÍet G d�„ d‚e±«      «       ZÎet G dƒ„ d„eÎ«      «       ZÏet G d…„ d†eÎ«      «       ZÐ	 	 	 	 	 	 �dd‡„ZÑ�ddˆ„ZÒ G d‰„ dŠ«      ZÓet G d‹„ dŒeÓ«      «       ZÔ G d�„ dŽeÔ«      ZÕ G d�„ d�eÔ«      ZÖ G d‘„ d’eÔ«      Z× G d“„ d”e«      ZØ G d•„ d–eÕ«      ZÙet G d—„ d˜eÓ«      «       ZÚ G d™„ dšeÔ«      ZÛ etd&¬2«       G d›„ dœe±«      «       ZÜ etd&¬2«       G d�„ džeÜe²«      «       ZÝ G dŸ„ d eÜ«      ZÞ G d¡„ d¢eÞ«      Zß G d£„ d¤eÞ«      Zàet G d¥„ d¦e±«      «       Záet G d§„ d¨e±«      «       Zâ etd&¬2«       G d©„ dªeÝ«      «       Zã G d«„ d¬eÝ«      Zä G d­„ d®eä«      Zåee‘e“eæe›eçee‘e›e“eæf      f   Zè G d¯„ d°«      Zé G d±„ d²eé«      Zê G d³„ d´eå«      Zë G dµ„ d¶eä«      Zì G d·„ d¸eä«      Zí etd&¬2«       G d¹„ dºeÝ«      «       Zî G d»„ d¼eî«      Zï G d½„ d¾eï«      Zð etd&¬2«       G d¿„ dÀeî«      «       Zñ etd&¬2«       G dÁ„ dÂeñ«      «       Zò G dÃ„ dÄeò«      Zó G dÅ„ dÆeñ«      Zô G dÇ„ dÈeÜ«      Zõ G dÉ„ dÊeñ«      Zö G dË„ dÌeñ«      Z÷ G dÍ„ dÎeñ«      Zø G dÏ„ dÐeñ«      Zù G dÑ„ dÒeñ«      Zú G dÓ„ dÔeú«      Zû G dÕ„ dÖeô«      Zü G d×„ dØeñ«      Zý G dÙ„ dÚeñ«      Zþ G dÛ„ dÜeò«      Zÿ G dÝ„ dÞeñ«      �Z  G dß„ dàeñ«      �Z etd&¬2«       G dá„ dâ«      «       �Z G dã„ däeô«      �Z etd&¬2«       G då„ dæ�e«      «       �Zet G dç„ dèeÓ«      «       �Z G dé„ dêeñ«      �Ze�j:                   G dë„ dìe±«      «       �Z G dí„ d.�e«      �Z G dî„ dï�e«      �Z	 etd&¬2«       G dð„ dñe±«      «       �Z
�d dò„�Z etd&¬2«       G dó„ dôeñ«      «       �Z etd&¬2«       G dõ„ döeñ«      «       �Z	 	 	 	 �d!d÷„�Z etd&¬2«       G dø„ dùeñ«      «       �Z G dú„ dû�e«      �Z G dü„ dýe±«      �Zet G dþ„ dÿ�e«      «       �Zet G �d „ �d�e«      «       �Z G �d„ �d�e«      �Z G �d„ �d�e«      �Z�d"�d„�Zy# e�$ r dZ‹d&ZŒY �Œ,w xY w(#  é    )ÚannotationsN)Ú	GeneratorÚIterableÚSequence)ÚAbstractContextManagerÚnullcontext)ÚEnum)Úpartial)	ÚAnyÚCallableÚClassVarÚLiteralÚOptionalÚoverloadÚTYPE_CHECKINGÚTypeVarÚUnion)Úassert_neverÚNeverÚ	TypeAlias)Úpatch)ÚExprÚIntegerÚSymbol)Úidentity)ÚGraphModuleSerializer)Úcan_auto_functionalize)Úmetrics)Úcompute_required_storage_lengthÚis_boolean_dtypeÚis_float_dtypeÚmake_channels_last_strides_forÚ
StrideType)Úget_schema_info)Úcompute_unbacked_bindingsÚfree_unbacked_symbolsÚrebind_unbackedÚresolve_unbacked_bindingsÚShapeEnvÚSymTypes©Ú
OrderedSet)ÚCleanDivÚFloorDivÚModularIndexing)ÚSymTé   )ÚconfigÚdependencies)ÚBackendFeatureÚget_scheduling_for_deviceÚindex_prevent_reordering)ÚDepÚextract_free_unbacked_symbolsÚ#extract_input_node_reduction_rangesÚextract_read_writesÚvar_builder)ÚLoopBody)ÚOpCounterCSEÚOpCountResultÚReductionTypeÚ	StoreMode)Úbenchmarker)ÚDevicePropertiesÚReductionHint)ÚargsortÚargsort_symÚcache_on_selfÚceildivÚconvert_shape_to_inductorÚconvert_shape_to_symintÚdeveloper_warningÚget_kernel_metadataÚir_dataclassÚ
is_dynamicÚis_gpuÚ	sympy_dotÚsympy_index_symbolÚsympy_index_symbol_with_prefixÚsympy_productÚ
sympy_subs)ÚopsÚOpsValueÚV)ÚNode)ÚCUDATemplate)ÚGraphLowering)ÚIndentedBufferr   rX   TFÚ_TÚ_UÚ_VÚ_IntLikeÚ_NumLikez  ©ÚprefixÚ	TensorBoxr   ÚIRNodeÚ_NodeOrNodes)Úfrozenc                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y	)
ÚGraphPartitionSignaturez5dict[str, Union[IRNode, sympy.Expr, TorchBindObject]]Úinput_nodesúlist[IRNode]Úoutput_nodeszdict[str, bool]Úinput_deallocationÚboolÚskip_cudagraphN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úP/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/ir.pyrg   rg   ¹   s   … ð GÓFØÓð (Ó'ØÔrt   rg   c                ó"   ‡— dˆfd„Š ‰| «       y )Nc                óŠ  •— | €y t        | t        t        f«      r| D ]
  } ‰|«       Œ y t        | t        «      r| j	                  «       D ]
  } ‰|«       Œ y t        | t
        t        t        t        t        j                  j                  j                  t        t        t        t         f	«      sJ dt#        | «      › d�«       ‚y )NzFound zE, which is not a supported top level IR node. See [Note: Inductor IR])Ú
isinstanceÚlistÚtupleÚdictÚvaluesÚ
ExpandViewÚDynamicScalarÚAssertScalarrb   ÚsympyÚlogicÚboolalgÚBooleanr   ÚintÚEffectfulKernelÚShapeAsConstantBufferÚtype)ÚnodesÚnodeÚ_check_tensorboxs     €ru   rŠ   z%validate_ir.<locals>._check_tensorboxÆ   s¸   ø€ ð ˆ=ØÜ˜¤¤e˜}Ô-Øò '�Ù  Õ&ñ'ä˜œtÔ$ØŸ™›ò '�Ù  Õ&ñ'ô ØäÜ!Ü ÜÜ—K‘K×'Ñ'×/Ñ/ÜÜÜ#Ü)ð
ôð ð œ˜e›˜Ð%jÐkóñ rt   )rˆ   úOptional[_NodeOrNodes]ÚreturnÚNoners   )Únode_or_nodesrŠ   s    @ru   Úvalidate_irr�   Å   s   ø€ õñ< �]Õ#rt   c                ó8   ‡ — t        ‰ t        «      sJ ‚dˆ fd„}|S )Nc                 ó0   •—  t        t        ‰«      | i |¤ŽS ©N)ÚgetattrrT   )ÚargsÚkwargsÚnames     €ru   Úfnzops_wrapper.<locals>.fnê   s   ø€ Ø!Œw”s˜DÓ! 4Ð2¨6Ñ2Ð2rt   )r”   Úobjectr•   r˜   rŒ   rU   )rx   Ústr)r–   r—   s   ` ru   Úops_wrapperrš   ç   s   ø€ Ü�dœCÔ Ð Ð õ3ð €Irt   c           
     ób   ‡— t        t        | t        t        | «      «      «      «      Šdˆfd„}|S )Nc                ó�   •— t        | «      t        ‰«      k(  sJ ‚t        t        | «      «      D �cg c]
  }| ‰|      ‘Œ c}S c c}w r’   ©ÚlenÚrange)ÚindexÚiÚ	inv_orders     €ru   Úreindexz inverse_reorder.<locals>.reindexó   s?   ø€ Ü�5‹zœS ›^Ò+Ð+Ð+Ü-2´3°u³:Ó->Ö?¨��i ‘lÓ#Ò?Ð?ùÒ?ó   ±A©r    úSequence[_T]rŒ   r¦   )r{   ÚziprŸ   rž   )Úorderr£   r¢   s     @ru   Úinverse_reorderr©   ð   s*   ø€ Ü”S˜¤¤c¨%£jÓ 1Ó2Ó3€Iõ@ð €Nrt   c                ó   ‡ — dˆ fd„}|S )Nc                ó�   •— t        | «      t        ‰«      k(  sJ ‚t        t        | «      «      D �cg c]
  }| ‰|      ‘Œ c}S c c}w r’   r�   )r    r¡   r¨   s     €ru   r£   zsame_reorder.<locals>.reindexû   s>   ø€ Ü�5‹zœS ›ZÒ'Ð'Ð'Ü).¬s°5«zÓ):Ö; A��e˜A‘h“Ò;Ð;ùÒ;r¤   r¥   rs   )r¨   r£   s   ` ru   Úsame_reorderr¬   ú   s   ø€ õ<ð €Nrt   c                ó   ‡ ‡— dˆ ˆfd„}|S )Nc                ó    •—  ‰ ‰| «      «      S r’   rs   )r    Úreindex1Úreindex2s    €€ru   r£   z fuse_reindexing.<locals>.reindex  s   ø€ Ù™ ›Ó(Ð(rt   )r    r¦   rŒ   zSequence[_V]rs   )r¯   r°   r£   s   `` ru   Úfuse_reindexingr±     s   ù€ ö)ð €Nrt   )é   r   é   r1   )é   r   r²   r³   r1   c                ó<   — |€t        | «      }|S t        || «      }|S )z1
    Convert strides to fill order (argsort)
    )rD   rE   )ÚseqÚ	shape_envÚ
sorted_idxs      ru   Úget_fill_orderr¹     s/   € ð ÐÜ$+¨C£Lˆ
ð Ðô ! ¨CÓ0ˆ
ØÐrt   c                ó    — t        | «      D ��ci c]  \  }}||“Œ
 }}}t        t        | «      «      D �cg c]  }||   ‘Œ	 }}|S c c}}w c c}w )zˆ
    Convert stride order to fill order
    For channel last format,

    stride order = [3, 0, 2, 1] and fill order = [1, 3, 2, 0]
    )Ú	enumeraterŸ   rž   )r¨   ÚidxÚposÚlookupr¡   Ú
fill_orders         ru   Ústride_order2fill_orderrÀ     sR   € ô (1°Ó'7×8™8˜3 ˆc�3‰hÐ8€FÑ8Ü%*¬3¨u«:Ó%6Ö7 �&˜“)Ð7€JÐ7ØÐùó 9ùÚ7s
   �AµAc                óš   — t        | |«      }t        t        | «      «      D �cg c]  }d‘Œ }}t        |«      D ]
  \  }}|||<   Œ |S c c}w )z)
    Convert strides to stride order
    r   )r¹   rŸ   rž   r»   )r¶   r·   r¸   Ú_Úoutr¡   Úelems          ru   Úget_stride_orderrÅ   *  sV   € ô !/¨s°IÓ >€JÜœC ›H“oÖ
&�Š1Ð
&€CÐ
&Ü˜ZÓ(ò ‰ˆˆ4ØˆˆDŠ	ðà€Jùò 's   £	Ac                 ó   — y r’   rs   ©ÚxÚguard_shapes     ru   Úir_node_to_tensorrÊ   7  s   € ØKNrt   c                 ó   — y r’   rs   rÇ   s     ru   rÊ   rÊ   ;  s   € ØLOrt   c                ó¦  — | €y |s%t         j                  j                  j                  }nt        }| j                  «       D �cg c]
  } ||«      ‘Œ }}t        | «      r.| j                  «       j                  D �cg c]
  } ||«      ‘Œ }}nt        j                  |«      }| j                  «       }| j                  «       }t        |«      }t        |«      }t         j                  j                  j                  j                  «       5  t!        j"                  ||||¬«      j%                  «       }d d d «       |S c c}w c c}w # 1 sw Y   S xY w)N)ÚsizeÚstrideÚdtypeÚdevice)rV   ÚgraphÚsizevarsÚ	size_hintr   Úget_sizeÚis_storage_and_layoutÚ
get_layoutrÎ   ÚFlexibleLayoutÚcontiguous_stridesÚ	get_dtypeÚ
get_devicerI   r·   Úsuppress_guardsÚtorchÚempty_stridedÚzero_)	rÈ   rÉ   Úshape_fnÚsrÍ   rÎ   rÏ   rÐ   Úts	            ru   rÊ   rÊ   ?  s  € ð 	€yØñ Ü—7‘7×#Ñ#×-Ñ-‰äˆØ!"§¡£Ö.˜A‰H�Q�KÐ.€DÐ.ä˜QÔØ'(§|¡|£~×'<Ñ'<Ö= !‘(˜1•+Ð=ˆÑ=ä×2Ñ2°4Ó8ˆØ�K‰K‹M€EØ�\‰\‹^€FÜ" 4Ó(€DÜ$ VÓ,€FÜ	
�‰×	Ñ	×	#Ñ	#×	3Ñ	3Ó	5ñ Ü×ÑØ˜f¨E¸&ô
ç
‰%‹'ð 	
÷ð €Hùò /ùò >÷ð €Hús   ÁD<Á;EÄ
(EÅEc                ó0   — t        | t        «      r| sd gS | S r’   )rx   ry   ©Úvalues    ru   Úmay_convert_to_optionalrå   [  s   € ô �%œÔ¡uð ˆvˆØ€Lrt   c                ó   — t        | t        «      s| €| S t        | t        j                  «      r| j                  S t        | t
        t        f«      rt        | j                  «       «      S t        d| › dt	        | «      j                  › d�«       y )Nzget_device_type(ú: ú))rx   r™   rÜ   rÐ   r‡   rc   Ú
OutputSpecÚget_device_typerÚ   r   ro   ©rÈ   s    ru   rê   rê   e  sq   € ô �!”SÔ˜Q˜YØˆÜ	�A”u—|‘|Ô	$Ø�v‰vˆÜ	�Aœ¤
Ð+Ô	,Ü˜qŸ|™|›~Ó.Ð.ÜÐ# A 3 b¬¨a«×)9Ñ)9Ð(:¸!Ð<Õ=rt   c                ó¸   — t        | «      }|dv rt        t        |› d�«      dk(  ryy|�t        |«      x}€yddlm} t        |t        «      sJ ‚t        ||«      S )N)ÚcpuÚcudaÚ_backendÚtritonTFr1   )ÚTritonScheduling)	rê   r“   r2   r5   Úcodegen.tritonrñ   rx   r‡   Ú
issubclass)rÈ   rÐ   Údevice_schedulingrñ   s       ru   Ú	is_tritonrõ   q  sn   € Ü˜QÓ€Fð �Ñ Ü”6˜f˜X XÐ.Ó/°8Ò;ØØàˆÜ!:¸6Ó!BÐBÐÐKàÝ0äÐ'¬Ô.Ð.Ð.ÜÐ'Ð)9Ó:Ð:rt   c                ó   — t        | «      dk(  S )Nrí   )rê   rë   s    ru   Úis_cpur÷   …  s   € Ü˜1Ó Ñ&Ð&rt   c           	     ó¼  ‡ ‡— t        ‰ t        «      r‰ j                  «       €yt        ˆˆ fd„t	        t        ‰ j                  «       «      dz
  «      D «       «      }t        j                  j                  j                  ‰ j                  «       d   «      dk(  xs= t        j                  j                  j                  ‰ j                  «       d   «      dk  }|xr |S )NFc              3  óž   •K  — | ]D  }t         j                  j                  j                  ‰j	                  «       |   «      ‰z  d k(  –— ŒF y­w)r   N)rV   rÑ   rÒ   rÓ   Ú
get_stride)Ú.0r¡   Ú	alignmentrÈ   s     €€ru   ú	<genexpr>z-is_aligned_realized_tensor.<locals>.<genexpr>�  sC   øè ø€ ò àô 
�‰×	Ñ	×	#Ñ	# A§L¡L£N°1Ñ$5Ó	6¸Ñ	BÀqÕHñùs   ƒA
Ar1   éÿÿÿÿ)rx   rc   Úmaybe_get_strideÚallrŸ   rž   rú   rV   rÑ   rÒ   rÓ   rÔ   )rÈ   rü   Úaligned_stridesÚaligned_last_dims   ``  ru   Úis_aligned_realized_tensorr  ‰  s³   ù€ Ü�aœÔ  A×$6Ñ$6Ó$8Ð$@Øäô ä”s˜1Ÿ<™<›>Ó*¨QÑ.Ó/ôó €Oô 	
�‰×Ñ×"Ñ" 1§<¡<£>°"Ñ#5Ó6¸!Ñ;ò 	=Ü�7‰7×Ñ×%Ñ% a§j¡j£l°2Ñ&6Ó7¸1Ñ<ð ð Ò/ Ð/rt   c                óæ  — t        |«      t        | «      k(  rt        | «      t        |«      k(  sJ ‚t        || |«      D ]±  \  }}}t        j                  j                  j                  |d«      rŒ2t        j                  j                  j                  ||«      rŒ]t        j                  j                  j                  |«      t        j                  j                  j                  |«      k(  rŒ± y y)zP
    Returns true if the strides are equal, ignoring dimensions of size 1 .
    r1   FT)rž   r§   rV   rÑ   rÒ   Ústatically_known_leqÚstatically_known_equalsÚsymbolic_hint)Ústrides1Ústrides2ÚshapeÚdimÚs1Ús2s         ru   Úsignificant_strides_equalr  ™  sÂ   € ô ˆu‹:œ˜X›Ò&¬3¨x«=¼CÀ»MÒ+IÐIÐIÜ˜5 (¨HÓ5ò 	‰ˆˆR�Ü�7‰7×Ñ×0Ñ0°°aÔ8Øä�w‰w×Ñ×7Ñ7Ø�õ
ä—'‘'×"Ñ"×0Ñ0°Ó4¼¿¹×8HÑ8H×8VÑ8VØó9
ó 
ñ ð	ð rt   c                óD  — t        | «      s| S t        d„ t        || j                  «       «      D «       «      r| S t	        || j                  «       | j                  «       «      s| S t        | «      \  }}g |j                  ¢}t        | j                  «       «      D ]8  \  }}t        j                  j                  j                  |d«      sŒ1||   ||<   Œ: t        |j                  |j                  |j                   ||j"                  «      }t%        t'        ||¬«      «      S )a  
    Tries to match the strides of the tensor to those in the meta_strides. Strides of insignificant
    dimensions - size 0 or 1 - will be updated.

    If there are real stride differences (NHWC vs NCHW), or the tensor is not realized, then the input will be returned
    c              3  óv   K  — | ]1  \  }}t         j                  j                  j                  ||«      –— Œ3 y ­wr’   ©rV   rÑ   rÒ   r  ©rû   r  r  s      ru   rý   z2try_match_insignificant_strides.<locals>.<genexpr>½  s3   è ø€ ò áˆB�ô 	
�‰×Ñ×0Ñ0°°R×8ñùó   ‚79r1   ©ÚdataÚlayout)rÕ   r   r§   rú   r  rÔ   Úas_storage_and_layoutrÎ   r»   rV   rÑ   rÒ   r  ÚFixedLayoutrÐ   rÏ   rÍ   Úoffsetrb   ÚReinterpretView)ÚtensorÚstridesÚstorageÚ
old_layoutÚ
new_strider¡   rà   Ú
new_layouts           ru   Útry_match_insignificant_stridesr!  °  s  € ô ! Ô(Øˆä
ñ ä˜' 6×#4Ñ#4Ó#6Ó7ôô ð ˆä$ W¨f×.?Ñ.?Ó.AÀ6Ç?Á?ÓCTÔUØˆä/°Ó7Ñ€GˆZØ%�:×$Ñ$Ð%€JÜ˜&Ÿ/™/Ó+Ó,ò '‰ˆˆ1Ü�7‰7×Ñ×0Ñ0°°AÕ6Ø# A™JˆJ�qŠMð'ô Ø×ÑØ×ÑØ�‰ØØ×Ñó€Jô ”_¨'¸*ÔEÓFÐFrt   c                  óä  — e Zd ZU  e«       Zded<    ej                  d¬«      Zded<    ej                  d¬«      Z	ded<    ej                  d¬«      Z
d	ed
<   eej                  dCd„«       «       ZdDd„ZdEd„ZdFd„ZdGd„ZdHd„ZdId„ZdJdKd„Z	 dL	 	 	 	 	 	 	 dMd„ZdNd„ZdOd„ZdPd„ZdQd„ZdRd„ZdSd„ZdTd„ZdUd„ZdVd„Ze dWd„«       Z!dXd„Z"dTd„Z#dYd „Z$dZd[d"„Z%d\d#„Z&d]d$„Z'dTd%„Z(d^d&„Z)d_d'„Z*d`d(„Z+dVd)„Z,dad*„Z-dYd+„Z.dZdbd,„Z/dcd-„Z0dEd.„Z1ddd/„Z2dEd0„Z3	 de	 	 	 	 	 dfd1„Z4dgd2„Z5dhd3„Z6	 de	 	 	 	 	 did4„Z7djd5„Z8dkd6„Z9dld7„Z:dmd8„Z;dnd9„Z<dYd:„Z=dod;„Z>dTd<„Z?dTd=„Z@dpd>„ZAdqd?„ZBdad@„ZCdqdA„ZDeEr
e dNdB„«       ZFy!y!)rrc   zClassVar[OrderedSet[Any]]Ú_current_originsF)ÚinitúOrderedSet[Any]ÚoriginsúOptional[list[str]]Ú	tracebackúOptional[torch.fx.Node]Úorigin_nodec              #  óˆ   K  — t         j                  }|| z  t         _        	 d –— |t         _        y # |t         _        w xY w­wr’   )rc   r#  )r&  Úolds     ru   Úcurrent_originszIRNode.current_originsÞ  s7   è ø€ ô ×%Ñ%ˆØ"%¨¡-ŒÔð	*Ûà&)ŒFÕ#ø cŒFÕ#üs   ‚A¢2 ¦A²?¿Ac                ó2   — t         j                  | ||«       y r’   )r˜   Ú__setattr__)ÚselfÚattrrä   s      ru   Ú_post_init_setattrzIRNode._post_init_setattrè  s   € ô 	×Ñ˜4  uÕ-rt   c                óÞ   — | j                  dt        | j                  «      «       | j                  dt        j                  rt        j                  «       nd «       | j                  dd «       y )Nr&  r(  r*  )r2  r,   r#  r2   Údebug_ir_tracebackr(  Úformat_stack©r0  s    ru   Ú__post_init__zIRNode.__post_init__î  sV   € Ø×Ñ 	¬:°d×6KÑ6KÓ+LÔMØ×ÑØ´V×5NÒ5Nœ×/Ñ/Ô1ÐTXô	
ð 	×Ñ ¨tÕ4rt   c                óB   — t        d„ | j                  «       D «       «      S )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr’   ©r–   ©rû   Údeps     ru   rý   z(IRNode.get_read_names.<locals>.<genexpr>ö  ó   è ø€ Ò? s˜#Ÿ(�(Ñ?ùó   ‚©r,   Ú	get_readsr6  s    ru   Úget_read_nameszIRNode.get_read_namesõ  ó   € ÜÑ?¨d¯n©nÓ.>Ô?Ó?Ð?rt   c                ó   — | j                   S r’   )r(  r6  s    ru   Úget_tracebackzIRNode.get_tracebackø  s   € Ø�~‰~Ðrt   c                ó   — | j                   S r’   ©r*  r6  s    ru   Úget_origin_nodezIRNode.get_origin_nodeû  ó   € Ø×ÑÐrt   c                 ó   — y r’   rs   r6  s    ru   Úget_defining_opzIRNode.get_defining_opþ  ó   € Ørt   c                óX   — dt        | dd«      › �}|rt        |«      dkD  r|d d › d�}|gS )Nzorigins=r&  Ú é@   é=   z...)r“   rž   )r0  Úshortenr&  s      ru   Úcommon_reprzIRNode.common_repr  s@   € ØœW T¨9°bÓ9Ð:Ð;ˆÙ”s˜7“| bÒ(à   "˜˜ cÐ*ˆGØˆyÐrt   c                ó$  — t        |«      t        | j                  |«      «      z   }t        t        t        |«      «      }|r5t	        dj                  |«      «      }t        | «      j                  › d|› d�S t        | «      j                  › d|› d�S )Nz,
z(
z
)ú(rè   )ry   rQ  Úmapr™   ÚindentÚjoinr‡   ro   )r0  ÚlinesrP  Ú	multilineÚ	new_liness        ru   Ú
str_helperzIRNode.str_helper  s„   € ô �U“œd 4×#3Ñ#3°GÓ#<Ó=Ñ=ˆÜ”Sœ˜e“_Ó%ˆÙÜ˜uŸz™z¨%Ó0Ó1ˆIÜ˜4“j×)Ñ)Ð*¨#¨i¨[¸Ð<Ð<ä˜4“j×)Ñ)Ð*¨!¨E¨7°!Ð4Ð4rt   c                ó   — | j                   S r’   ©rÏ   r6  s    ru   rÙ   zIRNode.get_dtype  ó   € Ø�z‰zÐrt   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wr’   )rÙ   ÚNotImplementedErrorr6  s    ru   Úmaybe_get_dtypezIRNode.maybe_get_dtype  s&   € ð	Ø—>‘>Ó#Ð#øÜ"ò 	Ùð	úó   ‚ ’	�c                ó2   — t        dt        | «      › d�«      ‚)Nz#get_layout() is not implemented by ú!©r_  r‡   r6  s    ru   rÖ   zIRNode.get_layout  s   € Ü!Ð$GÌÈTË
À|ÐSTÐ"UÓVÐVrt   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wr’   )rÖ   r_  r6  s    ru   Úmaybe_get_layoutzIRNode.maybe_get_layout  ó&   € ð	Ø—?‘?Ó$Ð$øÜ"ò 	Ùð	úra  c                ó"   — | j                  «       S r’   )rÖ   r6  s    ru   Úget_output_speczIRNode.get_output_spec%  s   € Ø�‰Ó Ð rt   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wr’   )ri  r_  r6  s    ru   Úmaybe_get_output_speczIRNode.maybe_get_output_spec(  s(   € ð	Ø×'Ñ'Ó)Ð)øÜ"ò 	Ùð	úra  c                ó>   — t        | j                  «       t        «      S )z4True for single tensor output (excludes MultiOutput))rx   rk  ÚLayoutr6  s    ru   Úhas_tensor_outputzIRNode.has_tensor_output.  s   € ä˜$×4Ñ4Ó6¼Ó?Ð?rt   c                ó2   — t        dt        | «      › d�«      ‚)Nz!get_size() is not implemented by rc  rd  r6  s    ru   rÔ   zIRNode.get_size2  s   € Ü!Ð$EÄdÈ4ÃjÀ\ÐQRÐ"SÓTÐTrt   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wr’   )rÔ   r_  r6  s    ru   Úmaybe_get_sizezIRNode.maybe_get_size5  ó%   € ð	Ø—=‘=“?Ð"øÜ"ò 	Ùð	úra  c                ó"   — | j                  «       S r’   ©rÔ   r6  s    ru   r
  zIRNode.shape;  s   € à�}‰}‹Ðrt   c                ó4   — t        | j                  «       «      S r’   )rR   rÔ   r6  s    ru   Ú	get_numelzIRNode.get_numel?  s   € Ü˜TŸ]™]›_Ó-Ð-rt   c                ó˜   — t         j                  j                  j                  t	        j
                  | j                  «       d«      «      S ©Nr   ©rV   rÑ   rÒ   Úis_expr_static_and_truer€   ÚEqrv  r6  s    ru   Úis_zero_elementszIRNode.is_zero_elementsB  ó0   € Ü�w‰w×Ñ×7Ñ7¼¿¹ÀÇÁÓAQÐSTÓ8UÓVÐVrt   c                ó0   — t        dt        | «      › �«      ‚)a)  
        If the IRNode refers to data which has not been materialized (e.g.,
        it is a Pointwise/Reduction that could potentially have more
        compute fused into it), realize the IRNode into physical memory,
        ending the possibility of fusing into it, but allowing, e.g., multiple
        users to access the data without having to recompute.

        Check StorageBox.realize for a particularly notable implementation.

        TODO(ezyang): I think, in principle, every IRNode should have an
        implementation of this, and most of the time no-op is OK, but you
        really do have to audit each IRNode for this, so for now, raise
        an error if it's not implemented.  Note that some code in graph.py
        will catch this thrown error and suppress it with a warning.
        zrealize NYI on rd  r6  s    ru   ÚrealizezIRNode.realizeE  s   € ô  " O´D¸³J°<Ð"@ÓAÐArt   Nc                ó0   — t        dt        | «      › �«      ‚)Nzcodegen_reference NYI on rd  ©r0  Úwriters     ru   Úcodegen_referencezIRNode.codegen_referenceW  s   € Ü!Ð$=¼dÀ4»j¸\Ð"JÓKÐKrt   c                 ó   — y r’   rs   r6  s    ru   rÚ   zIRNode.get_deviceZ  rK  rt   c                ó.   — | j                  «       }|€J ‚|S r’   )rÚ   ©r0  rÐ   s     ru   Úget_device_or_errorzIRNode.get_device_or_error]  s   € Ø—‘Ó"ˆØÐ!Ð!Ð!Øˆrt   c                 ó   — y©NFrs   r6  s    ru   Úhas_exceeded_max_readszIRNode.has_exceeded_max_readsb  ó   € Ørt   c                ó>   — t        t        | «      j                  «      ‚r’   ©r_  r‡   ro   r6  s    ru   Úmake_loaderzIRNode.make_loadere  ó   € Ü!¤$ t£*×"5Ñ"5Ó6Ð6rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úmake_indexerzIRNode.make_indexerh  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   rú   zIRNode.get_stridek  r�  rt   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wr’   )rú   r_  r6  s    ru   rÿ   zIRNode.maybe_get_striden  rg  ra  c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_namezIRNode.get_namet  r�  rt   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wr’   )r•  r_  r6  s    ru   Úmaybe_get_namezIRNode.maybe_get_namew  rr  ra  c                 ó   — yr‰  rs   ©r0  Ú	thresholds     ru   Úhas_large_inner_fnzIRNode.has_large_inner_fn}  r‹  rt   c                 ó   — y r’   rs   ©r0  Úuserss     ru   Ú
mark_reusezIRNode.mark_reuse€  ó   € Ørt   c                 ó   — y r’   rs   r6  s    ru   Úrealize_hintzIRNode.realize_hintƒ  r   rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úunwrap_viewzIRNode.unwrap_view†  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úfreeze_layoutzIRNode.freeze_layout‰  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  ©r0  r¨   Úallow_paddings      ru   Úfreeze_layout_with_stride_orderz&IRNode.freeze_layout_with_stride_orderŒ  ó   € ô "¤$ t£*×"5Ñ"5Ó6Ð6rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  ©r0  r¨   s     ru   Úfreeze_layout_with_fill_orderz$IRNode.freeze_layout_with_fill_order‘  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  ©r0  rÎ   s     ru   Úfreeze_layout_with_same_orderz$IRNode.freeze_layout_with_same_order”  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  ©r0  Úexact_stridesr©  s      ru   Ú freeze_layout_with_exact_stridesz'IRNode.freeze_layout_with_exact_strides—  r«  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_read_writeszIRNode.get_read_writesœ  r�  rt   c                ó6   — | j                  «       j                  S r’   ©r·  Úreadsr6  s    ru   r@  zIRNode.get_readsŸ  ó   € Ø×#Ñ#Ó%×+Ñ+Ð+rt   c                ó4   — t        | j                  «       «      S r’   )rž   r@  r6  s    ru   Ú	num_readszIRNode.num_reads¢  s   € Ü�4—>‘>Ó#Ó$Ð$rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_storage_numelzIRNode.get_storage_numel¥  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_unbacked_symbol_useszIRNode.get_unbacked_symbol_uses¨  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_reduction_typezIRNode.get_reduction_type«  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_reduction_sizezIRNode.get_reduction_size®  r�  rt   c                 ó   — yr‰  rs   r6  s    ru   Ú	is_externzIRNode.is_extern±  r‹  rt   c                 ó   — yr‰  rs   r6  s    ru   Úis_no_opzIRNode.is_no_op´  r‹  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r†  s     ru   Úconstant_to_devicezIRNode.constant_to_device·  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_mutation_nameszIRNode.get_mutation_namesº  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_operation_namezIRNode.get_operation_name½  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Úget_inputs_that_alias_outputz#IRNode.get_inputs_that_alias_outputÀ  r�  rt   c                 ó   — y r’   rs   r6  s    ru   rÏ   zIRNode.dtypeÅ  s   € Ø(+rt   )r&  zOrderedSet[Node]rŒ   zGenerator[None, None, None])r1  r™   rä   r   rŒ   r�   ©rŒ   r�   ©rŒ   úOrderedSet[str])rŒ   r'  ©rŒ   r)  ©rŒ   zOptional[Operation]©T)rP  rl   rŒ   úSequence[str])TT)rW  zSequence[object]rP  rl   rX  rl   rŒ   r™   ©rŒ   útorch.dtype)rŒ   zOptional[torch.dtype]©rŒ   rm  )rŒ   zOptional[Layout]©rŒ   ré   )rŒ   zOptional[OutputSpec]©rŒ   rl   ©rŒ   úSequence[Expr])rŒ   úOptional[Sequence[_IntLike]])rŒ   z.Union[_IntLike, sympy.Rel, Sequence[_IntLike]]©rŒ   r   ©rŒ   úOptional[str]r’   ©r‚  zOptional[IndentedBuffer]rŒ   r™   ©rŒ   úOptional[torch.device]©rŒ   útorch.device©rŒ   ú$Callable[[Sequence[Expr]], OpsValue]©rŒ   ú Callable[[Sequence[Expr]], Expr]©rŒ   úSequence[_IntLike]©rŒ   r™   ©rš  úOptional[int]rŒ   rl   ©rž  r„   rŒ   r�   ©rŒ   rc   ©F©r¨   ú	list[int]r©  rl   rŒ   r�   ©r¨   r÷  rŒ   r�   ©rÎ   úlist[_IntLike]rŒ   r�   ©r´  rú  r©  rl   rŒ   r�   ©rŒ   zdependencies.ReadWrites©rŒ   zOrderedSet[Dep]©rŒ   r„   ©rŒ   r^   ©rŒ   úOrderedSet[Symbol]©rŒ   úSequence[sympy.Expr]©rÐ   ré  rŒ   rc   ©rŒ   rÙ  )Gro   rp   rq   r,   r#  rr   ÚdataclassesÚfieldr&  r(  r*  ÚstaticmethodÚ
contextlibÚcontextmanagerr-  r2  r7  rA  rD  rG  rJ  rQ  rZ  rÙ   r`  rÖ   rf  ri  rk  rn  rÔ   rq  Úpropertyr
  rv  r|  r  rƒ  rÚ   r‡  rŠ  rŽ  r‘  rú   rÿ   r•  r—  r›  rŸ  r¢  r¤  r¦  rª  r®  r±  rµ  r·  r@  r½  r¿  rÁ  rÃ  rÅ  rÇ  rÉ  rË  rÍ  rÏ  rÑ  r   rÏ   rs   rt   ru   rc   rc   Ö  s  … Ù2<³,ÐÐ/Ó>ð  1˜{×0Ñ0°eÔ<€Gˆ_Ó<Ø%6 [×%6Ñ%6¸EÔ%B€IÐ"ÓBØ+<¨;×+<Ñ+<À%Ô+H€KÐ(ÓHàØ×Ñò*ó ó ð*ó.ó5ó@óó óôð PTð	5Ø%ð	5Ø04ð	5ØHLð	5à	ó	5óóóWóó!óó@óUóð òó ðó.óWóBô$Lóóó
ó7ó7ó7óó7óôóóó7ó7ð 7<ð7Øð7Ø/3ð7à	ó7ó
7ó7ð DIð7Ø+ð7Ø<@ð7à	ó7ó
7ó,ó%ó7ó7ó7ó7óóó7ó7ó7ó7ñ à	Ú+ó 
Ù+ð rt   c                  ó„   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zy)Ú	Operationc                ó   — d | _         y r’   ©Úoperation_namer6  s    ru   r7  zOperation.__post_init__Ë  s
   € Ø-1ˆÕrt   c                ó   — t         ‚r’   ©r_  r6  s    ru   rÚ   zOperation.get_deviceÎ  ó   € Ü!Ð!rt   c                ó6   — t        | d«      sJ ‚| j                  S ©Nr*  )Úhasattrr*  r6  s    ru   rG  zOperation.get_origin_nodeÑ  s   € Ü�t˜]Ô+Ð+Ð+Ø×ÑÐrt   c                ó6   — t        | d«      sJ ‚| j                  S )Nr&  )r  r&  r6  s    ru   Úget_originszOperation.get_originsÕ  s   € Ü�t˜YÔ'Ð'Ð'Ø�|‰|Ðrt   c                ó6   — | j                   €J ‚| j                   S r’   r  r6  s    ru   rÏ  zOperation.get_operation_nameÙ  s    € Ø×"Ñ"Ð.Ð.Ð.Ø×"Ñ"Ð"rt   c                 ó   — yr‰  rs   r6  s    ru   rÇ  zOperation.is_externÝ  r‹  rt   c                 ó   — yr‰  rs   r6  s    ru   rÉ  zOperation.is_no_opà  r‹  rt   c                ó   — t         ‚r’   r  r6  s    ru   r·  zOperation.get_read_writesã  r  rt   c                ó&   — || j                  «       v S r’   )rA  )r0  r–   s     ru   Ú
is_user_ofzOperation.is_user_ofæ  s   € Ø�t×*Ñ*Ó,Ð,Ð,rt   c                óB   — t        d„ | j                  «       D «       «      S )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr’   r:  r;  s     ru   rý   z+Operation.get_read_names.<locals>.<genexpr>ê  r=  r>  r?  r6  s    ru   rA  zOperation.get_read_namesé  rB  rt   c                ó6   — | j                  «       j                  S r’   r¹  r6  s    ru   r@  zOperation.get_readsì  r»  rt   c                ó   — t         ‚r’   r  r6  s    ru   Úget_outputszOperation.get_outputsï  r  rt   c                ó   — t        «       S r’   r+   r6  s    ru   Úget_unbacked_symbol_defsz"Operation.get_unbacked_symbol_defsò  ó
   € Ü‹|Ðrt   c                ó   — t        «       S )aÝ  
        Returns the unbacked symbols which are required to be in scope in
        order to successfully perform codegen for this buffer.  For example,
        a buffer that corresponds to an extern kernel call that takes i0 as
        an argument would return {i0} here.  This is used to generate necessary
        dependencies that ensure we actually bind i0 in codegen before you
        try to use it.

        Note that this is NOT transitive; in particular, if this buffer takes
        in as input another buffer with dynamic shape (e.g., (i0,)), we will
        not report it here, because you will already have a dependency
        on that buffer, which will eventually have a dependency on i0 if
        necessary.
        r+   r6  s    ru   rÁ  z"Operation.get_unbacked_symbol_usesõ  s   € ô ‹|Ðrt   c                 ó   — y)z§
        Gets extra global memory size needed by this buffer.
        Some algorithms (e.g. group gemm) may require extra global memory in the generated code.
        r   rs   r6  s    ru   Úget_workspace_sizezOperation.get_workspace_size  s   € ð
 rt   NrÓ  ræ  rÖ  )rŒ   r%  rð  rÞ  rü  )r–   r™   rŒ   rl   rÔ  rý  ©rŒ   úlist[Buffer]©rŒ   zOrderedSet[sympy.Symbol]rþ  )ro   rp   rq   r7  rÚ   rG  r  rÏ  rÇ  rÉ  r·  r  rA  r@  r#  r%  rÁ  r)  rs   rt   ru   r  r  É  sN   „ ó2ó"ó óó#óóó"ó-ó@ó,ó"óóô"rt   r  c                  ó0  ‡ — e Zd ZU ded<   ded<   ded<   ded<   dd	„Zdd
„Zd ˆ fd„Zd!d„ZeZd"d„Z	d#d„Z
d$d„Zd$d„Zed%d„«       Zeej"                  fd&d„«       Zed'd„«       Zd(d„Zed!d„«       Zd)d*d„Zdd„Zd+d„Zd,d„Zd-d„Zd.d„Zd/d„Zd0d„Zˆ xZS )1ÚLoopsré  rÐ   rÛ  rÏ   úCallable[..., Any]Úinner_fnrï  Úrangesc                óx   —  t        «       j                  g d„ | j                  D «       ¢| j                  «       ‘­Ž S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   ©r&   ©rû   Úes     ru   rý   z1Loops.get_unbacked_symbol_uses.<locals>.<genexpr>  s   è ø€ Ò<¨1Ô# A×&Ñ<ùó   ‚)r,   Úunionr1  Úinner_fn_free_unbacked_symbolsr6  s    ru   rÁ  zLoops.get_unbacked_symbol_uses  s;   € Ø!Œz‹|×!Ñ!ð 
Ù<°·±Ô<ð
à×/Ñ/Ó1ò
ð 	
rt   c                ó  — | j                  d| j                  j                  › d�t        | j                  «      | j                  «       g|D �cg c]  }|› dt        | |«      › �‘Œ c}z   d| j                  ›�gz   «      S c c}w )Nú'ú=úorigin_node=)rZ  rÐ   r‡   r™   rÏ   Úinner_fn_strr“   r*  )r0  Únamesr–   s      ru   Ú_to_strzLoops._to_str  s‘   € Ø�‰à�D—K‘K×$Ñ$Ð% QÐ'Ü�D—J‘J“Ø×!Ñ!Ó#ðð
 <AÖA°4�$��qœ  tÓ,Ð-Ò.ÒAñBð ˜d×.Ñ.Ð1Ð2Ð3ñ4ó
ð 	
ùò Bs   ÁA?
c                ó"   •— t         ‰| �  «        y r’   )Úsuperr7  ©r0  Ú	__class__s    €ru   r7  zLoops.__post_init__&  s   ø€ Ü‰ÑÕrt   c                ó$   — | j                  d«      S )N©r1  ©r@  r6  s    ru   Ú__str__zLoops.__str__)  s   € Ø�|‰|˜KÓ(Ð(rt   c                ó   — | j                   S r’   ©rÐ   r6  s    ru   rÚ   zLoops.get_device.  ó   € Ø�{‰{Ðrt   c                ó   — | j                   S r’   rF  r6  s    ru   rG  zLoops.get_origin_node1  rH  rt   c                ó   — | j                   S r’   rF  r6  s    ru   rÔ   zLoops.get_size4  rK  rt   c                ó   — | j                   S r’   rF  r6  s    ru   Úget_pointwise_sizezLoops.get_pointwise_size7  rK  rt   c                óè   — |j                  dd «      }|j                  dd «      } | |i |¤Ž}|j                  d|«       |j                  d|xs |j                  «       t        j	                  |«      S )Nr*  r(  )Úpopr2  r(  rb   Úcreate)Úclsr”   r•   r*  ÚtbÚrs         ru   rR  zLoops.create:  so   € à—j‘j °Ó5ˆØ�Z‰Z˜ TÓ*ˆñ �Ð ˜Ñ ˆð 	
×Ñ˜]¨KÔ8Ø	×Ñ˜[¨"Ò*;°·±Ô<Ü×Ñ Ó"Ð"rt   c                óœ   — t        | «      D ��cg c]0  \  }}|dk(  rt        j                  j                  nt	        ||«      ‘Œ2 c}}S c c}}w ©Nr1   )r»   r€   ÚSÚZerorQ   )r1  ra   Únrà   s       ru   Ú_indexzLoops._indexH  sH   € ô " &Ó)÷
á��1ð  šFŒE�G‰G�LŠLÔ(FÀvÈqÓ(QÑQó
ð 	
ùó 
s   �5Ac                ó`  — t        t        j                  «       «      }t        j                  |«      5  t	        j
                  t        dd«      5   | j                  | j                  «       Ž  |j                  «       cd d d «       cd d d «       S # 1 sw Y   nxY wd d d «       y # 1 sw Y   y xY w©NÚallow_indexingT)
r=   rV   ÚMockHandlerÚset_ops_handlerr   r˜   r×   r0  Úinner_fn_argsÚgetvalue)r0  Ú	opcounters     ru   Úinner_fn_opcountzLoops.inner_fn_opcountO  s…   € ä ¤§¡£Ó1ˆ	ä×Ñ˜iÓ(ñ	(ä�L‰LœÐ)9¸4Ó@ñ	(ð ˆD�M‰M˜4×-Ñ-Ó/Ñ0Ø×%Ñ%Ó'÷	(÷ 	(÷ 	(ó 	(ú÷ 	(÷ 	(ñ 	(ús#   ³B$Á-BÁ<	B$ÂB	ÂB$Â$B-c                ó:   — | j                  | j                  «      fS r’   )r[  r1  r6  s    ru   ra  zLoops.inner_fn_argsY  s   € Ø—‘˜DŸK™KÓ(Ð*Ð*rt   c                ór   — t        j                  j                  | j                  g| j	                  «       ¢­Ž S r’   )rV   ÚKernelFormatterHandlerÚir_to_stringr0  ra  r6  s    ru   r>  zLoops.inner_fn_str\  s3   € ä×'Ñ'×4Ñ4Ø�M‰Mð
Ø ×.Ñ.Ó0ò
ð 	
rt   c                óx   — |€d}t        |t        j                  «      }| j                  «       j                  |kD  S rx  )Úmaxr2   Úrealize_opcount_thresholdrd  Únum_opsr™  s     ru   r›  zLoops.has_large_inner_fnb  s9   € ØÐØˆIÜ˜	¤6×#CÑ#CÓDˆ	Ø×$Ñ$Ó&×.Ñ.°Ñ:Ð:rt   c                ód   — | j                  | j                  «      }t        | j                  |«      S r’   )r[  r1  r8   r0  )r0  r    s     ru   r9  z$Loops.inner_fn_free_unbacked_symbolsh  s%   € Ø—‘˜DŸK™KÓ(ˆÜ,¨T¯]©]¸EÓBÐBrt   c                ó|  — t        j                  t        dd«      5  | j                  «       rJt	        | j                  «       | j                  «       | j                  «       «      j                  cd d d «       S t	        | j                  «       | j                  «       «      j                  cd d d «       S # 1 sw Y   y xY wr]  )	r   r˜   r×   rÃ  r:   rŽ  rÔ   rÅ  rº  r6  s    ru   r@  zLoops.get_readsl  s”   € Ü�\‰\œ.Ð*:¸DÓAñ 	Ø×&Ñ&Ô(Ü*Ø×$Ñ$Ó&Ø—M‘M“OØ×+Ñ+Ó-ó÷ ‘%÷	ñ 	ô +Ø×$Ñ$Ó&Ø—M‘M“Oó÷ ‘%÷	÷ 	ò 	ús   œAB2Á71B2Â2B;c                óH   — t        | j                  «       j                  «      S r’   )r,   rd  Úread_buffersr6  s    ru   rA  zLoops.get_read_namesz  s   € Ü˜$×/Ñ/Ó1×>Ñ>Ó?Ð?rt   c                óH   — t        | j                  «       j                  «      S r’   )rž   rd  rp  r6  s    ru   r½  zLoops.num_reads}  s   € Ü�4×(Ñ(Ó*×7Ñ7Ó8Ð8rt   c                ó2   — t        dt        | «      › d�«      ‚)Nz+get_reduction_size() is not implemented by rc  rd  r6  s    ru   rÅ  zLoops.get_reduction_size€  ó   € Ü!Ø9¼$¸t»*¸ÀQÐGó
ð 	
rt   c                ó2   — t        dt        | «      › d�«      ‚)Nz+get_reduction_type() is not implemented by rc  rd  r6  s    ru   rÃ  zLoops.get_reduction_type…  rs  rt   c                ó2   — t        dt        | «      › d�«      ‚)Nz+constant_to_device() is not implemented by rc  rd  r†  s     ru   rË  zLoops.constant_to_deviceŠ  rs  rt   r   )r?  rÙ  rŒ   r™   rÓ  rð  ræ  rÖ  rß  )r”   r   r•   r   rŒ   rb   )r1  rï  ra   r0   rŒ   rà  )rŒ   r>   ©rŒ   zSequence[Sequence[_IntLike]]r’   rñ  rý  rÔ  rþ  r  rã  r  ) ro   rp   rq   rr   rÁ  r@  r7  rH  Ú__repr__rÚ   rG  rÔ   rO  ÚclassmethodrR  r  r0   ÚINDEXr[  rF   rd  ra  r>  r›  r9  r@  rA  r½  rÅ  rÃ  rË  Ú__classcell__©rD  s   @ru   r.  r.    sÐ   ø… àÓØÓØ Ó ØÓó
ó	
õ ó)ð €Hóó óóð ò#ó ð#ð Ø:>¿*¹*ó 
ó ð
ð ò(ó ð(ó+ð ò
ó ð
ô
;óCóó@ó9ó
ó

÷

rt   r.  c               ó„   — |j                   rt        j                  t        d«      |«      S t        j                  d|«      S )NÚnanr   )Úis_floating_pointrT   ÚconstantÚfloat)r¼   rÏ   s     ru   Únop_loader_fnr�  �  s1   € Ø×ÒÜ�|‰|œE %›L¨%Ó0Ð0ä�|‰|˜A˜uÓ%Ð%rt   c                  óD   — e Zd Zdd„Zdd„Zd	d„Z	 	 	 	 	 	 	 	 d
d„Zdd„Zy)Ú	Pointwisec                óp   — | j                  «       rt        t        | j                  ¬«      S | j                  S ©Nr\  )r|  r
   r�  rÏ   r0  r6  s    ru   rŽ  zPointwise.make_loader™  s)   € à× Ñ Ô"Üœ=°·
±
Ô;Ð;à�}‰}Ðrt   c                ó   — g S r’   rs   r6  s    ru   rÅ  zPointwise.get_reduction_size   s   € Øˆ	rt   c                 ó   — y r’   rs   r6  s    ru   rÃ  zPointwise.get_reduction_type£  rK  rt   c                óp   — | j                  «       }t        j                  |xs d ||«       ||«      «      S ©NÚunnamed)rŽ  rT   Ústore©r0  Úoutput_nameÚindexerÚvarsÚloaders        ru   Ústore_outputzPointwise.store_output¦  s2   € ð ×!Ñ!Ó#ˆÜ�y‰y˜Ò1¨	±7¸4³=Á&ÈÃ,ÓOÐOrt   c                óª   — | j                  «       } t        j                  t        d|«      |«      }t	        || j
                  || j                  ¬«      S ©úFMove this to a given device. Requires that all reads are to constants.Úoverride_device©rÐ   rÏ   r0  r1  )rŽ  r   r˜   ÚConstantBufferrƒ  rÏ   r1  ©r0  rÐ   r�  s      ru   rË  zPointwise.constant_to_device¯  sH   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØ §¡°fÀTÇ[Á[ô
ð 	
rt   Nrê  r  rã  ©r�  rä  rŽ  ú!Callable[[Sequence[Expr]], Never]r�  rà  rŒ   r�   r  )ro   rp   rq   rŽ  rÅ  rÃ  r‘  rË  rs   rt   ru   rƒ  rƒ  —  sF   „ óóóðPà"ðPð 3ðPð ð	Pð
 
óPô
rt   rƒ  c                  óF   — e Zd ZU ded<   dZded<   dd„Z	 	 	 	 	 	 	 	 d	d„Zy)
ÚScatterrí  Úoutput_indexerNr@   Úscatter_modec                óÖ   — | j                  «       } t        j                  t        d|«      |«      }t	        || j
                  || j                  | j                  | j                  ¬«      S )r”  r•  )rÐ   rÏ   r0  r1  r�  rž  )	rŽ  r   r˜   r—  rœ  rÏ   r1  r�  rž  r˜  s      ru   rË  zScatter.constant_to_device½  s]   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;Ø×.Ñ.Ø×*Ñ*ô
ð 	
rt   c                ó¦   — | j                  «       }|€d}t        j                  | || j                  |«      «       ||«      | j                  ¬«      S )NrŠ  )Úmode)rŽ  rT   r‹  r�  rž  rŒ  s        ru   r‘  zScatter.store_outputÊ  sT   € ð ×!Ñ!Ó#ˆØÐØ#ˆKÜ�y‰yØÙ�D×'Ñ'¨Ó-Ó.Ù�4‹LØ×"Ñ"ô	
ð 	
rt   r  r™  )ro   rp   rq   rr   rž  rË  r‘  rs   rt   ru   rœ  rœ  ¸  sB   … à4Ó4Ø"€L�)Ó"ó
ð
à"ð
ð 3ð
ð ð	
ð
 
ô
rt   rœ  Ú
logical_orÚmaximumÚminimumÚmulÚaddÚbitwise_xor)Úanyrj  ÚminÚprodÚsumÚxor_sumz"dict[str, Callable[..., OpsValue]]ÚREDUCTION_COMBINE_FNc                ó�   ‡ ‡‡— ‰ t         v r	t         ‰    S ‰ dv r	 	 	 	 	 	 dˆˆˆ fd„}|S ‰ dk(  r	 	 	 	 	 	 dd„}|S t        d‰ › �«      ‚)N©ÚargmaxÚargminc                óÊ  •— | \  }}|\  }}‰dk(  rt        j                  ||«      }nt        j                  ||«      }t        j                  ||«      }t	        ‰«      r€t        j
                  ||«      }t        j
                  ||«      }	t        j                  |t        j                  ||	«      «      }t        j                  |t        j                  ||	«      «      }‰rt        j                  ||«      nt        j                  ||«      }
t        j                  |t        j                  ||
«      «      }t        j                  |||«      t        j                  |||«      fS )Nr±  )	rT   ÚltÚgtÚeqr!   Úner¢  Úlogical_andÚwhere)ÚaÚbÚa_valueÚa_indexÚb_valueÚb_indexÚmaskÚequalÚa_isnanÚb_isnanÚtieÚarg_break_ties_leftrÏ   Úreduction_types              €€€ru   Úargmax_combine_fnz3get_reduction_combine_fn.<locals>.argmax_combine_fní  s  ø€ ð  !ÑˆG�WØ ÑˆG�Wà Ò)Ü—v‘v˜g wÓ/‘ä—v‘v˜g wÓ/�ä—F‘F˜7 GÓ,ˆEÜ˜eÔ$ÜŸ&™& ¨'Ó2�ÜŸ&™& ¨'Ó2�Ü—~‘~ d¬C¯F©F°7¸GÓ,DÓE�ÜŸ™ u¬c¯o©o¸gÀwÓ.OÓP�ñ 'ô —‘�w Ô(ä—V‘V˜G WÓ-ð ô
 —>‘> $¬¯©¸¸sÓ(CÓDˆDä—	‘	˜$ ¨Ó1Ü—	‘	˜$ ¨Ó1ðð rt   Úwelford_combinec                ól   — | \  }}}|\  }}}||z
  }||z   }	||	z  }
|||
z  z   ||z   ||z  |z  |
z  z   |	fS r’   rs   )r¹  rº  Úa_meanÚa_m2Úa_weightÚb_meanÚb_m2Úb_weightÚdeltaÚ
new_weightÚ	w2_over_ws              ru   Úwelford_combine_fnz4get_reduction_combine_fn.<locals>.welford_combine_fn  sm   € ð &'Ñ"ˆF�D˜(Ø%&Ñ"ˆF�D˜(à˜V‘OˆEØ! HÑ,ˆJØ  :Ñ-ˆIà˜ Ñ*Ñ*Ø�t‘˜e e™m¨hÑ6¸ÑBÑBØðð rt   zunknown reduction_type=)r¹  útuple[object, object]rº  rÓ  rŒ   útuple[OpsValue, OpsValue])r¹  ú#tuple[OpsValue, OpsValue, OpsValue]rº  rÕ  rŒ   rÕ  )r­  r_  )rÅ  rÏ   rÄ  rÆ  rÒ  s   ```  ru   Úget_reduction_combine_fnrÖ  å  s�   ú€ ð Ô-Ñ-Ü# NÑ3Ð3à	Ð/Ñ	/ð	Ø$ð	Ø)>ð	à&÷	ð: !Ð à	Ð,Ò	,ð	Ø2ð	à2ð	ð 1ó	ð  "Ð!ô "Ð$;¸NÐ;KÐ"LÓMÐMrt   c                  óÆ  ‡ — e Zd ZU ded<   ded<   ded<   ded<   dd	„ZeZdˆ fd
„Zd d„Zd!d„Z	 	 	 	 	 	 	 	 	 	 d"d„Z	d#d„Z
d$d„Zdd„Zd%d„Ze	 d&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'd„«       Ze	 	 	 	 	 	 	 	 	 	 d(d„«       Zeej&                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d„«       Ze	 	 	 	 	 	 d*d„«       Ze	 	 	 	 	 	 d*d„«       Ze	 	 	 	 	 	 	 	 d+d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 d,d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 d-d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d/d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0d„«       Zˆ xZS )1Ú	Reductionrï  Úreduction_rangesr?   rÅ  rÛ  Ú	src_dtyperC   Úreduction_hintc                ó$   — | j                  d«      S )N)r1  rÙ  rÅ  rG  r6  s    ru   rH  zReduction.__str__,  s   € Ø�|‰|ÐLÓMÐMrt   c                ór   •— t         ‰| �  «        t        «       j                  d„ | j                  D «       Ž z  S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   r4  r5  s     ru   rý   z5Reduction.get_unbacked_symbol_uses.<locals>.<genexpr>3  s   è ø€ ÒF¨1Ô# A×&ÑFùr7  )rB  rÁ  r,   r8  rÙ  rC  s    €ru   rÁ  z"Reduction.get_unbacked_symbol_uses1  s8   ø€ Ü‰wÑ/Ó1Ð4F´J³L×4FÑ4FÙF°×0EÑ0EÔFð5
ñ 
ð 	
rt   c                ó   — | j                   S r’   )rÙ  r6  s    ru   rÅ  zReduction.get_reduction_size6  s   € Ø×$Ñ$Ð$rt   c                ó   — | j                   S r’   )rÅ  r6  s    ru   rÃ  zReduction.get_reduction_type9  ó   € Ø×"Ñ"Ð"rt   c           	     óÐ   — t        j                  | j                  | j                  | j                  | j                  ||«      «      }t        j                  |xs d ||«      |«      S r‰  )rT   Ú	reductionrÏ   rÚ  rÅ  r0  Ústore_reduction)r0  r�  rŽ  r�  Úreduction_varsrä   s         ru   rä  zReduction.store_reduction<  sW   € ô —‘Ø�J‰JØ�N‰NØ×ÑØ�M‰M˜$ Ó/ó	
ˆô ×"Ñ" ;Ò#;°)¹WÀT»]ÈEÓRÐRrt   c                óX   — t        | j                  «      t        | j                  «      z   S r’   )rž   r1  rÙ  r6  s    ru   Úindex_lengthzReduction.index_lengthK  s!   € Ü�4—;‘;Ó¤# d×&;Ñ&;Ó"<Ñ<Ð<rt   c                ó”   — | j                  | j                  «      }| j                  | j                  t        j                  «      }||fS r’   )r[  r1  rÙ  r0   ÚR0_INDEX©r0  r    Úrindexs      ru   ra  zReduction.inner_fn_argsN  s8   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×2Ñ2´D·M±MÓBˆØ�vˆÐrt   c                óº   — | j                  | j                  «      }| j                  | j                  t        j                  «      }t        | j                  ||«      S r’   )r[  r1  rÙ  r0   ré  r8   r0  rê  s      ru   r9  z(Reduction.inner_fn_free_unbacked_symbolsS  sA   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×2Ñ2´D·M±MÓBˆÜ,¨T¯]©]¸EÀ6ÓJÐJrt   c           
     ó
  — | j                  «       } t        j                  t        d|«      |«      }t	        || j
                  || j                  | j                  | j                  | j                  t        j                  ¬«      S )r”  r•  ©rÐ   rÏ   r0  r1  rÙ  rÅ  rÚ  rÛ  )rŽ  r   r˜   r—  rØ  rÏ   r1  rÙ  rÅ  rÚ  rC   ÚDEFAULTr˜  s      ru   rË  zReduction.constant_to_deviceX  sm   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;Ø!×2Ñ2Ø×.Ñ.Ø—n‘nÜ(×0Ñ0ô	
ð 		
rt   Nc	           
     ó¾  — dd„}	t         j                  j                  j                  |«      }
t         j                  j                  j                  t	        |«      «      }|dk(  xsG t         j                  j                  | t        j                  «       xr |dvxr t        j                  } |	|
«      r |	|«      st        j                  dfS t        j                  | «      }|j                  }d}|rat        j                   t         j"                  j$                  | d¬«      }t        j                   t         j"                  j$                  | d¬«      }n	 	 	 	 	 	 dd	„}|}|dk(  rà ||
|«      }|dk(  rt        j&                  |fS |�¬t)        |t*        «      rœt-        j.                  t0        d
d«      5  t3        |«      \  }}d d d «       �h�ft         j                  j                  j                  t	        ||z   «      «      }|
|k(  r,t4        j7                  d|||||«       t        j&                  dfS t        j&                  |fS |
|k  s||dz  dz  k\  rt        j                  dfS t9        | |||||dk7  r|nd|t        j                  ¬«      }dd„} ||«      \  }}|r ||«      \  }}t;        |«      dk(  rt        j                  dfS t=        j>                  |jA                  «       |jC                  «       «      \  \  }}}d}d}|D ]�  }t         j                  j                  jE                  ||«      } t         j                  j                  jG                  | |tI        |jK                  «       «      «      }!tM        d„ |!D «       «      }"|"r|dz  }Œ‰|dz  }Œ� ||kD  rt        j&                   ||
|«      fS t        jN                   ||
|«      fS # 1 sw Y   �ŒxY w)Nc                ó.   — t        | t        t        f«      S r’   )rx   r„   r   rë   s    ru   Ú
_is_staticz(Reduction.num_splits.<locals>._is_statics  s   € Ü˜a¤#¤w Ó0Ð0rt   Úscanr¯  r1   é    T)Úinner_reductionFc                 ó   — yrW  rs   )Úreduction_numel_hintÚ
numel_hints     ru   Úinner_reduction_splitsz4Reduction.num_splits.<locals>.inner_reduction_splits’  s   € ð rt   r^  z°Use previous IRNode's range and reduction_ranges instead of split. current ranges: %s, current reduction ranges: %s, current split: %d, new ranges: %s, new reduction ranges: %srþ   r³   r«  rî  c           	     ó&  ‡— t        d t        | j                  «       | j                  «       | j	                  «       ¬«      | ¬«      }|j                  «       }|j                  €J ‚|j                  D � cg c].  } t        | t        «      rt        | t        j                  «      s| ‘Œ0 }} g }d}t        |j                  d„ ¬«      D ]Ä  Št        ˆfd„|D «       «      sŒ|j                  ‰j                  «       ‰j                   t"        j$                  j&                  v sŒZt"        j$                  j&                  ‰j                      }t)        |j*                  dd «      }|j-                  «        t)        |j*                  dd «      |k7  sŒÃd}ŒÆ ||fS c c} w )	N©rÐ   rÏ   rÍ   ©r–   r  r  Fc                ó   — | j                   S r’   r:  rë   s    ru   ú<lambda>z@Reduction.num_splits.<locals>.get_read_indices.<locals>.<lambda>à  s
   € ¸a¿f¹f€ rt   ©Úkeyc              3  óN   •K  — | ]  }|‰j                   j                  v –— Œ y ­wr’   )r    Úfree_symbols)rû   rU  Úmds     €ru   rý   zAReduction.num_splits.<locals>.get_read_indices.<locals>.<genexpr>á  s    øè ø€ ÒF°a�q˜BŸH™H×1Ñ1Ô1ÑFùs   ƒ"%rÎ   T)ÚComputedBufferr×   rÚ   rÙ   rÔ   r·  Ú
range_varsrx   r   r€   ÚNumberÚsortedrº  r   Úappendr    r–   rV   rÑ   Úname_to_bufferr“   r  Údecide_layout)	rU  ÚcbÚread_writesr  ÚindicesÚchangedÚbufÚoriginal_strider  s	           @ru   Úget_read_indicesz.Reduction.num_splits.<locals>.get_read_indicesÊ  sW  ø€ ÜØÜ%ØŸ<™<›>ØŸ+™+›-ØŸ™›ôð
 ôˆBð ×,Ñ,Ó.ˆKð ×)Ñ)Ð5Ð5Ð5ð %×/Ñ/öàÜ˜a¤Ô&¬z¸!¼U¿\¹\Ô/Jò ðˆJð ð
 ˆGØˆGÜ˜[×.Ñ.Ñ4DÔEò +�ÜÓF¸:ÔFÕFØ—N‘N 2§8¡8Ô,Ø—w‘w¤!§'¡'×"8Ñ"8Ò8ÜŸg™g×4Ñ4°R·W±WÑ=˜Ü*1°#·*±*¸hÈÓ*M˜Ø×)Ñ)Ô+Ü" 3§:¡:¨x¸Ó>À/ÓQØ&*™Gð+ð ˜GÐ#Ð#ùò!s   Á23Fr   c              3  ó&   K  — | ]	  }|d kD  –— Œ y­w©r1   Nrs   ©rû   rà   s     ru   rý   z'Reduction.num_splits.<locals>.<genexpr>ý  s   è ø€ Ò/ !˜˜A�Ñ/ùó   ‚)rÈ   r˜   rŒ   rl   )r÷  r„   rø  r„   rŒ   r„   )rU  rØ  rŒ   ztuple[Sequence[Expr], bool])(rV   rÑ   rÒ   r  rR   Úhas_featurer4   ÚREDUCE_TO_SINGLE_ELEMENTr2   Úsplit_reductionsrC   rï  rB   rR  Úmulti_processor_countÚ	functoolsr
   ÚchoicesÚreduction_split_factorÚINNERrx   rb   r   r˜   r×   r9   ÚlogÚdebugrØ  rž   r3   Úindex_vars_squeezerÔ   rÅ  Úsimplify_with_rangesÚstride_hintsry   Úkeysr   ÚOUTER)#rÐ   Ú	dst_dtyperÚ  r0  r1  rÙ  rÅ  Úreduction_numelÚ
input_noderò  r÷  rø  Úshould_splitÚpropsÚnum_smÚmin_elements_per_threadrù  Úouter_reduction_splitsÚsplitÚ
new_rangesÚnew_reduction_rangesÚextracted_numel_hintrU  r  r  r  rÂ   rå  Úranges1Ú	num_outerÚ	num_innerr¡   Újr  Úouters#                                      ru   Ú
num_splitszReduction.num_splitsg  sö  € ó	1ô  !Ÿw™w×/Ñ/×=Ñ=¸oÓNÐÜ—W‘W×%Ñ%×3Ñ3´MÀ&Ó4IÓJˆ
à%¨Ñ/ò 
Ü—‘×#Ñ# F¬N×,SÑ,SÓTÐTò (Øððò(ô ×'Ñ'ð 	ñ Ð/Ô0±ZÀ
Ô5Kä ×(Ñ(¨!Ð+Ð+ä ×'Ñ'¨Ó/ˆØ×,Ñ,ˆØ"$ÐÙÜ@I×@QÑ@QÜ—	‘	×0Ñ0°&È$ôAÐ"ô AJ×@QÑ@QÜ—	‘	×0Ñ0°&È%ôAÑ"ð
Ø&)ðàðð óð &<Ð"ð ˜Š?Ù*Ð+?ÀÓLˆEØ˜Šzä$×*Ñ*¨EÐ1Ð1ØÐ%¬*°ZÄÔ*KÜ—\‘\¤.Ð2BÀDÓIñ Hô <¸JÓGñØ"Ø,÷Hð
 Ð)Ð.BÐ.NÜ+,¯7©7×+;Ñ+;×+IÑ+IÜ% jÐ3GÑ&GÓHó,Ð(ð ,Ð/CÒCÜŸ	™	ðGð #Ø,Ø!Ø&Ø0ô	ô  -×2Ñ2°BÐ6Ð6Ü ×&Ñ&¨Ð-Ð-à Ð$;Ò;Ø˜V a™Z¨"™_Ò,ä ×(Ñ(¨!Ð+Ð+äØØØØØ-Ø-;¸vÒ-E™>È5ØÜ(×0Ñ0ô	
ˆó	$ñB ,¨AÓ.Ñˆ�ÙÙ)¨!Ó,‰JˆG�Qäˆw‹<˜1Òä ×(Ñ(¨!Ð+Ð+ä'3×'FÑ'FØ�J‰J‹L˜!×.Ñ.Ó0ó(
Ñ$ÑˆˆN˜Wð ˆ	Øˆ	Øò 		ˆAÜ—‘× Ñ ×5Ñ5°a¸ÓAˆAÜ—g‘g×&Ñ&×3Ñ3Ø�>¤4¨¯©«Ó#7óˆGô Ñ/ wÔ/Ó/ˆEÙØ˜Q‘‘	à˜Q‘‘	ð		ð �yÒ Ü ×&Ñ&Ñ(>Ø$ jó)ð ð ô !×&Ñ&Ñ(>Ø$ jó)ð ð ÷MHñ Hús   Æ4OÏOc                ó@  ‡ ‡‡‡‡‡— ‰D �cg c]+  }t         j                  j                  j                  |«      ‘Œ- c}Št	        ||«      Šdˆˆˆfd„Š|dv rAt        dd‰t        j                  ‰«      «      j                  «       Š	 	 	 	 	 	 dˆˆ fd„Šˆfd„S ‰ Š‰S c c}w )z1Convert inner_fn from a reduction to an pointwisec                óž   •‡ — t        j                  ‰ˆ ˆfd„t        j                  ‰D �cg c]  }t	        |«      ‘Œ c}Ž D «       «      S c c}w )Nc              3  ó0   •K  — | ]  } ‰‰|«      –— Œ y ­wr’   rs   )rû   rë  r    Úvalue_fns     €€ru   rý   z=Reduction._unroll_reduction_fn.<locals>.fn.<locals>.<genexpr>  s    øè ø€ ò àñ ˜U F×+ñùó   ƒ)r  ÚreduceÚ	itertoolsÚproductrŸ   )r    rÈ   Ú
combine_fnrÙ  r:  s   ` €€€ru   r—   z*Reduction._unroll_reduction_fn.<locals>.fn  sH   ù€ Ü×#Ñ#Øôä"+×"3Ñ"3Ø,<Ö= qœ% �(Ò=ð#ôóð ùò
 >s   «A
©r±  r°  Nc                ó¸   •— |D �cg c]  }t        j                  |«      ‘Œ }} ‰| |«      t        j                   ‰|«      t        j
                  «      fS c c}w r’   )r€   ÚexpandrT   Ú
index_exprrÜ   Úint64)r    rë  r¡   Úflatten_indexr0  s      €€ru   r:  z0Reduction._unroll_reduction_fn.<locals>.value_fn-  sP   ø€ ð 4:Ö:¨aœ%Ÿ,™, q�/Ð:�Ð:á˜U FÓ+Ü—N‘N¡=°Ó#8¼%¿+¹+ÓFðð ùò ;s   †Ac                ó   •—  ‰| «      d   S rW  rs   )r    r—   s    €ru   rþ  z0Reduction._unroll_reduction_fn.<locals>.<lambda>6  s   ø€ ¡ E£¨1¡€ rt   )r    rï  rŒ   r   )r    rï  rë  rï  rŒ   rÔ  )	rV   rÑ   rÒ   Úevaluate_static_shaperÖ  r  r×   rØ   r‘  )	r0  rÙ  rÅ  rÚ  rÈ   r?  rE  r—   r:  s	   ``   @@@@ru   Ú_unroll_reduction_fnzReduction._unroll_reduction_fn  s³   ý€ ð @Pö
Ø:;ŒA�G‰G×Ñ×2Ñ2°1Õ5ò
Ðô .¨n¸iÓHˆ
÷		ð Ð1Ñ1Ü'ØØØ Ü×1Ñ1Ð2BÓCó	÷
 ‰l‹nð ðØ)ðØ3Eðà*öó .Ð-àˆHØˆIùòM
s   ‹0Bc
                ó<  ‡‡‡‡‡— t         j                  j                  j                  t	        ‰«      «      }
|
dk(  rkdˆfd„} |d«       |d«       |d«       |d«      dœŠ‰‰j                  «       v s
J ‰› d�«       ‚dˆˆˆfd„}t        j                  |||t        |«      ¬«      S |
dk(  r+‰dv rdˆfd	„}ndˆˆfd
„}t        j                  |‰||¬«      S t        |
t        «      rˆt         j                  j                  j                  |
«      t        j                  k  rNt	        |«      dk7  st        |j                  «      r+t        j                  |‰| j!                  ‰‰‰|«      |¬«      S | j#                  |‰|‰|‰‰|
|	«	      \  }}|t$        j&                  k(  r|}|dk(  r4|	€J ‚t)        |	«      \  }}|€J ‚|€J ‚| j+                  |‰|‰|‰||‰|«
      S |dkD  r| j-                  |‰|‰|‰‰||«	      S t.        j                  t1        |‰‰|‰‰||¬«      «      S )Nr   c                óô   •— ‰t         j                  k(  rt        | «      S ‰j                  r't        | t        j
                  «      sJ ‚t        | «      S t        | t        j                  «      sJ ‚t        | «      S r’   )	rÜ   rl   r~  rx   ÚtypingÚSupportsFloatr€  ÚSupportsIntr„   )Úvalr%  s    €ru   Úpy_cnstz!Reduction.create.<locals>.py_cnstN  sa   ø€ Ø¤§
¡
Ò*Ü ›9Ð$Ø×0Ò0Ü% c¬6×+?Ñ+?Ô@Ð@Ð@Ü  ›:Ð%ä% c¬6×+=Ñ+=Ô>Ð>Ð>Ü˜s›8�Ort   r1   )r«  r¬  rª  r¨  z* not supported for zero-dimension tensors!c                ó6   •— t        j                  ‰‰   ‰«      S r’   ©rT   r  )r    r%  rÅ  Úrtypes_to_initss    €€€ru   Úconst_fnz"Reduction.create.<locals>.const_fnd  s   ø€ Ü—|‘| O°NÑ$CÀYÓOÐOrt   r–  r@  c                ó0   •— t        j                  d‰«      S rx  rQ  )r    r%  s    €ru   r—   zReduction.create.<locals>.fnr  s   ø€ ÜŸ<™<¨¨9Ó5Ð5rt   c                ón   •— ‰D �cg c]  }t         j                  j                  ‘Œ }} ‰| |«      S c c}w r’   ©r€   rX  rY  )r    rÂ   Úreduction_indexr0  rÙ  s      €€ru   r—   zReduction.create.<locals>.fnw  s1   ø€ Ø=MÖ&N¸¤u§w¡w§|£|Ð&N�OÐ&NÙ# E¨?Ó;Ð;ùò 'Oó   †!2rþ   rî  )rN  r˜   rŒ   zUnion[bool, float, int])r    r„   rŒ   rU   )rV   rÑ   rÒ   ÚsimplifyrR   r#  rƒ  rR  ry   rx   r   rÓ   r2   Úunroll_reductions_thresholdrN   r‡   rH  r6  rC   rï  r9   Ú!create_multilayer_existing_rangesÚcreate_multilayerrb   rØ  )rS  rÐ   r%  rÚ  r0  r1  rÙ  rÅ  rÛ  r'  r&  rO  rS  r—   Úhintr-  r.  r/  rR  s     ` ` ``          @ru   rR  zReduction.create;  s›  ü€ ô Ÿ'™'×*Ñ*×3Ñ3´MÐBRÓ4SÓTˆà˜aÒõ$ñ ˜q“zÙ" 1›:Ù ›
Ù˜q“zñ	ˆOð " _×%9Ñ%9Ó%;Ñ;ð Ø!Ð"Ð"LÐMóÐ;÷Pô ×#Ñ#ØØØ!Ü˜F“|ð	 $ó ð ð ˜aÒàÐ!5Ñ5ö6ö
<ô ×#Ñ#Ø Y¸ÀFð $ó ð ô
 �¬Ô0Ü—‘× Ñ ×*Ñ*¨?Ó;Ü×0Ñ0ò1ä˜vÓ&¨!Ò+¬v°f·k±kÔ/Bô ×#Ñ#ØØØ×1Ñ1ØÐ.°À	óð ð $ó ð ð —n‘nØØØØØØØØØó

‰ˆˆeð œ]×2Ñ2Ò2Ø!ˆNØ�BŠ;ØÐ)Ð)Ð)Ü/RØó0Ñ,ˆJÐ,ð Ð)Ð)Ð)Ø'Ð3Ð3Ð3Ø×8Ñ8ØØØØØØ ØØ$ØØóð ð �QŠYà×(Ñ(ØØØØØØ ØØØó
ð 
ô ×ÑÜØØØ!ØØ!1Ø-Ø#Ø-ô	ó
ð 	
rt   c           	     óŽ  — | dv rAt        |«      rt        d«      S t        |«      ryt        j                  |«      j
                  S | dv rAt        |«      rt        d«      S t        |«      ryt        j                  |«      j                  S t        |«      rdnd}t        |«      rdnd}|||||||f|||ft        d«      |fd	œ|    S )
N)rj  r°  z-infF)r©  r±  ÚinfTr   r1   )r«  rª  r¬  r¨  Úwelford_reducerÇ  Úonline_softmax_reduce)r!   r€  r    rÜ   Úiinfor©  rj  )rÅ  rÏ   ÚzeroÚones       ru   Údefault_accumulatorzReduction.default_accumulatorÏ  sÖ   € ð Ð.Ñ.Ü˜eÔ$Ü˜V“}Ð$Ü! %Ô(Øä—{‘{ 5Ó)×-Ñ-Ð-ØÐ.Ñ.Ü˜eÔ$Ü˜U“|Ð#Ü! %Ô(Øä—{‘{ 5Ó)×-Ñ-Ð-ä(¨Ô/‰u°QˆÜ& uÔ-‰d°1ˆàØØØØ# T¨4Ð0Ø $ d¨DÐ1Ü&+¨F£m°TÐ%:ñ
ð ñð 	rt   c                ó:   — | dk(  ryt         j                  | |«      S )Nr`  r   )rØ  re  ©rÅ  rÏ   s     ru   Údefault_valuezReduction.default_valueî  s#   € ð Ð-Ò-ØÜ×,Ñ,¨^¸UÓCÐCrt   c                óÈ   — | dk(  r|S | dk  r(|dk  r#|t         j                  k(  rt         j                  S | dk  r(|dk  r#|t         j                  k(  rt         j                  S |S )Nrþ   é   i   é   )rC   r$  Ú
OUTER_TINY)r-  rø  rÛ  s      ru   Ú_multilayer_second_step_hintz&Reduction._multilayer_second_step_hintö  sg   € ð �BŠ;Ø!Ð!Ø�CŠ<˜J¨#Ò-°.ÄM×DWÑDWÒ2WÜ ×+Ñ+Ð+à�TŠMØ˜cÒ!Ø¤-×"5Ñ"5Ò5ä ×+Ñ+Ð+àÐrt   c                óä   ‡‡‡‡‡‡	— t         j                  |‰g«      Š	t        j                  j                  j                  t        j                  ‰|z  d«      «       Š	 	 	 	 	 	 dˆˆˆˆˆˆ	fd„}|S )Nr   c                ó0  •‡‡— |\  }| �^ Š}‰|z  |z   Šdˆˆ	ˆˆfd„}‰
rqt        j                  t        j                  ‰t        j                  «      t        j                  ‰t        j                  «      «      }t        j
                  ||‰«      S  |«       S )Nc                 ó$   •—  ‰‰ ‰‰ g«      «      S r’   rs   )r  r�  Ú	new_indexr£   s   €€€€ru   ÚbodyzCReduction._multilayer_wrap_loader.<locals>.wrapper_fn.<locals>.body  s   ø€ Ù˜i©°'°Ó);Ó<Ð<rt   )rŒ   rU   )rT   r³  rC  rÜ   Úint32Úmasked)r    rW  Úreduction_blockrr  r¿  r  rq  Ú
block_sizeÚdefaultr�  Ú	need_maskr&  r£   s        @@€€€€€€ru   Ú
wrapper_fnz5Reduction._multilayer_wrap_loader.<locals>.wrapper_fn  sƒ   ú€ ð "1Ñˆ_Ø*/Ñ'ˆY˜Ø  ?Ñ2°_ÑDˆG÷=ð =ñ Ü—v‘vÜ—N‘N 7¬E¯K©KÓ8Ü—N‘N ?´E·K±KÓ@ó�ô —z‘z $¨¨gÓ6Ð6á“v�rt   )r    úSequence[Symbol]rW  rz  rŒ   rU   )ÚViewÚdynamic_reshape_indexerrV   rÑ   rÒ   rz  r€   r{  )
rS  r�  rÙ  r&  r-  rv  rw  ry  rx  r£   s
    ` ` `` @@ru   Ú_multilayer_wrap_loaderz!Reduction._multilayer_wrap_loader  sw   ý€ ô ×.Ñ.Ð/?À/ÐARÓSˆÜŸ™×(Ñ(×@Ñ@Ü�H‰H�_ uÑ,¨aÓ0ó
ð 
ˆ	ð	Ø#ð	Ø6Fð	à÷	ò 	ð& Ðrt   c                ó¶   ‡‡‡— t        d„ ‰D «       «      s
J d‰›�«       ‚t        j                  |t        |«      t        |«      z   «      Š	 	 	 	 	 	 dˆˆˆfd„}|S )Nc              3  ó&   K  — | ]	  }|d k(  –— Œ y­wr  rs   ©rû   rU  s     ru   rý   zDReduction._multilayer_wrap_loader_existing_ranges.<locals>.<genexpr>4  s   è ø€ Ò3˜a�1˜•6Ñ3ùr  z8Only enabled for numel_hint == 1, found original_ranges=c           	     ó„   •— | d t        ‰«       }| t        ‰«      d  } ‰| ‰t        |«      t        |«      z   «      «      S r’   )rž   rz   )Úmerged_indexÚnew_reduction_indexÚoriginal_idxrq  r�  Úoriginal_rangesr£   s       €€€ru   ry  zEReduction._multilayer_wrap_loader_existing_ranges.<locals>.wrapper_fn;  sQ   ø€ ð (Ð(>¬#¨oÓ*>Ð?ˆLØ$¤S¨Ó%9Ð%;Ð<ˆIÙØÙœ˜iÓ(¬5Ð1DÓ+EÑEÓFóð rt   )r‚  r  rƒ  r  rŒ   rU   )r   r{  r|  rz   )rS  r�  r…  Úoriginal_reduction_rangesr.  r/  ry  r£   s    ``    @ru   Ú'_multilayer_wrap_loader_existing_rangesz1Reduction._multilayer_wrap_loader_existing_ranges+  sy   ú€ ô Ñ3 ?Ô3Ô3ð 	
ØG°Ð6HÐIó	
Ð3ô ×.Ñ.Ø%¤u¨ZÓ'8¼5ÐAUÓ;VÑ'Vó
ˆð		Ø.ð		à!5ð		ð ÷		ð Ðrt   c                ó  ‡— |t         j                  t         j                  fvr|nt         j                  }t        j                  |||||||	|«      }|j                  «        |j                  «       Š	 	 	 	 	 	 dˆfd„}t        j                  j                  j                  t        |«      «      }| j                  |
||«      }||dt        |«       k(  sJ ‚t        j                  t	        |||||t        |«      d |	||¬«      «      S )úa
        Break a large reduction up into multiple smaller reductions
        recursively
        c                ó   •—  ‰g | ¢|¢«      S r’   rs   )r    rW  Úintermediate_loaders     €ru   Úintermediate_fnz;Reduction.create_multilayer_helper.<locals>.intermediate_fnp  s   ø€ ñ 'Ð'A¨Ð'A°Ð'AÓBÐBrt   Nrî  )r    rï  rW  rï  rŒ   rU   )rÜ   Úfloat16Úbfloat16r€  rØ  rR  r  rŽ  rV   rÑ   rÒ   rÓ   rR   rm  rž   rb   )rS  rÐ   r%  rÚ  ry  r…  r†  r.  r/  rÅ  r-  rÛ  Úintermediate_dtypeÚintermediaterŒ  rø  r‹  s                   @ru   Úcreate_multilayer_helperz"Reduction.create_multilayer_helperH  s(  ø€ ð0 ¤§¡´·±Ð ?Ñ?ñ ä—‘ð 	ô
 !×'Ñ'ØØØØØØ ØØó	
ˆð 	×ÑÔØ*×6Ñ6Ó8Ðð	CØ%ð	CØ8Jð	Càõ	Cô
 —W‘W×%Ñ%×/Ñ/´¸oÓ0NÓOˆ
Ø×9Ñ9Ø�:˜~ó
ˆð  *Ð-C¬s°?Ó/CÐ"DÒDÐDÐDÜ×ÑÜØØØ(Ø&Ø!+¬C°Ó,@Ð,BÐ!CØ-Ø#Ø-ô	ó
ð 	
rt   c
                óÌ   — t        |«      }
t        |
|dz
  z   |«      }| j                  ||«      }| j                  |||
|||«      }| j	                  ||||||g |¢|‘|g|||	«      S )r‰  r1   )rR   r.   rh  r}  r‘  )rS  rÐ   r%  rÚ  r0  r1  rÙ  rÅ  r-  rÛ  r&  rv  rw  ry  s                 ru   r\  zReduction.create_multilayerˆ  s–   € ô$ (Ð(8Ó9ˆÜ˜o°¸±Ñ;¸UÓCˆ
Ø×#Ñ# N°IÓ>ˆØ×0Ñ0ØÐ&¨¸À
ÈGó
ˆ
ð ×+Ñ+ØØØØØØØˆfÐ�eÐØˆLØØØó
ð 	
rt   c                ój   — | j                  |||||«      }| j                  ||||||g |¢|¢||	d|
«      S )r‰  rþ   )r‡  r‘  )rS  rÐ   r%  rÚ  r0  r…  r†  r.  r/  rÅ  rÛ  ry  s               ru   r[  z+Reduction.create_multilayer_existing_ranges¯  sc   € ð$ ×@Ñ@ØØØ%ØØ ó
ˆ
ð ×+Ñ+ØØØØØØ%Ø+ˆoÐ+ 
Ð+Ø ØØØó
ð 	
rt   rð  r   r  rã  ©
r�  rä  rŽ  rš  r�  rà  rå  rz  rŒ   r�   rþ  ©rŒ   zSequence[Sequence[Expr]]r  r’   )rÐ   ré  r%  rÛ  rÚ  rÛ  r0  úCallable[..., OpsValue]r1  rï  rÙ  rï  rÅ  z%Union[ReductionType, Literal['scan']]r&  r   r'  úOptional[IRNode]rŒ   útuple[ReductionHint, _IntLike])
r0  z<Callable[[Sequence[_IntLike], Sequence[_IntLike]], OpsValue]rÙ  rï  rÅ  r™   rÚ  rÛ  rŒ   z(Callable[[Sequence[_IntLike]], OpsValue])rÐ   ré  r%  rÛ  rÚ  rÛ  r0  r/  r1  rà  rÙ  rà  rÅ  r?   rÛ  rC   r'  r—  rŒ   rb   ©rÅ  r™   rÏ   rÛ  rŒ   ú#Union[_NumLike, Sequence[_NumLike]])r-  r^   rø  r„   rÛ  rC   rŒ   rC   )r�  r–  rÙ  rï  r&  r^   r-  r^   rv  r^   rw  rš  rŒ   úCallable[..., object])r�  ú@Callable[[Sequence[sympy.Expr], Sequence[sympy.Expr]], OpsValue]r…  rà  r†  rà  r.  úSequence[Integer]r/  r�  rŒ   rœ  )rÐ   ré  r%  rÛ  rÚ  rÛ  ry  r/  r…  rà  r†  rà  r.  ú
list[Expr]r/  úlist[Integer]rÅ  r?   r-  r^   rÛ  rC   rŒ   rb   )rÐ   ré  r%  rÛ  rÚ  rÛ  r0  r/  r1  rà  rÙ  rà  rÅ  r?   r-  r^   rÛ  rC   rŒ   rb   )rÐ   ré  r%  rÛ  rÚ  rÛ  r0  r/  r…  rà  r†  rà  r.  rŸ  r/  rŸ  rÅ  r?   rÛ  rC   rŒ   rb   )ro   rp   rq   rr   rH  rw  rÁ  rÅ  rÃ  rä  rç  ra  r9  rË  r  r6  rH  rx  rC   rï  rR  re  rh  rm  r}  r‡  r‘  r\  r[  rz  r{  s   @ru   rØ  rØ  $  sœ  ø… à(Ó(Ø!Ó!àÓØ!Ó!óNð €Hõ
ó
%ó#ðSà"ðSð 3ðSð ð	Sð
 )ðSð 
óSó=óó
Kó

ð ð (,ðaØðaàðað ðað *ð	að
 #ðað -ðað >ðað ðað %ðað 
(òaó ðaðF ð-ØNð-à,ð-ð ð-ð ð	-ð
 
2ò-ó ð-ð^ ð )6×(=Ñ(=Ø'+ðQ
àðQ
ð ðQ
ð ð	Q
ð
 %ðQ
ð ðQ
ð )ðQ
ð &ðQ
ð &ðQ
ð %ðQ
ð 
òQ
ó ðQ
ðf ðØðØ$/ðà	,òó ðð< ðDØðDØ$/ðDà	,òDó ðDð ðØðØ%(ðØ:Gðà	òó ðð  ð!à'ð!ð -ð!ð "ð	!ð
 ð!ð ð!ð 5ð!ð 
ò!ó ð!ðF ðàPðð (ðð $2ð	ð
 &ðð 0ðð 
Jòó ðð8 ð=
àð=
ð ð=
ð ð	=
ð
 'ð=
ð (ð=
ð $2ð=
ð ð=
ð ,ð=
ð &ð=
ð ð=
ð &ð=
ð 
ò=
ó ð=
ð~ ð$
àð$
ð ð$
ð ð	$
ð
 %ð$
ð ð$
ð )ð$
ð &ð$
ð ð$
ð &ð$
ð 
ò$
ó ð$
ðL ð$
àð$
ð ð$
ð ð	$
ð
 %ð$
ð (ð$
ð $2ð$
ð "ð$
ð ,ð$
ð &ð$
ð &ð$
ð 
ò$
ó ô$
rt   rØ  c                  ól   ‡ — e Zd ZU ded<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 	 	 	 	 dd„Zˆ xZS )ÚMultiOutputReductionr„   Úoutput_indexc
           
     ó    •‡— t        ‰«      r‰fŠt        ‰«      dk(  r‰d   }
n	 	 	 	 	 	 dˆfd„}
t        ‰| �  |||
|||||¬«       |	| _        y )Nr1   r   c                ó2   •‡ ‡— t        ˆ ˆfd„‰D «       «      S )Nc              3  ó0   •K  — | ]  } |‰‰«      –— Œ y ­wr’   rs   )rû   r—   r¼   Úreduction_idxs     €€ru   rý   z@MultiOutputReduction.__init__.<locals>.loader.<locals>.<genexpr>ô  s   øè ø€ ÒH¸™R  ]×3ÑHùr;  )rz   )r¼   r¦  Ú	inner_fnss   ``€ru   r�  z-MultiOutputReduction.__init__.<locals>.loaderñ  s   ú€ ô ÔH¸iÔHÓHÐHrt   rî  )r¼   rà  r¦  rà  rŒ   ztuple[OpsValue, ...])Úcallablerž   rB  Ú__init__r¢  )r0  rÐ   r%  r§  r1  rÙ  rÅ  rÚ  rÛ  r¢  r�  rD  s      `       €ru   r©  zMultiOutputReduction.__init__Ý  s‚   ù€ ô �IÔØ"˜ˆIô ˆy‹>˜QÒØ˜q‘\‰FðIØ#ðIØ4BðIà%õIô
 	‰ÑØØØØØ-Ø)ØØ)ð 	ô 		
ð )ˆÕrt   c           	     ó<  — t        j                  | j                  | j                  | j                  | j                  ||«      «      }t        |t        t        f«      sJ t        |«      › «       ‚|| j                     }t        j                  |xs d ||«      |«      S r‰  )rT   rã  rÏ   rÚ  rÅ  r0  rx   rz   ry   r‡   r¢  rä  )r0  r�  rŽ  r�  rå  r|   rä   s          ru   rä  z$MultiOutputReduction.store_reduction  s†   € ô —‘Ø�J‰JØ�N‰NØ×ÑØ�M‰M˜$ Ó/ó	
ˆô ˜&¤5¬$ -Ô0ÐC´T¸&³\°NÓCÐ0Ø�t×(Ñ(Ñ)ˆÜ×"Ñ" ;Ò#;°)¹WÀT»]ÈEÓRÐRrt   )rÐ   ré  r%  rÛ  r§  z)Union[INNER_FN_TY, Sequence[INNER_FN_TY]]r1  r�  rÙ  r�  rÅ  r?   rÚ  rÛ  rÛ  rC   r¢  r„   r”  )ro   rp   rq   rr   r©  rä  rz  r{  s   @ru   r¡  r¡  Ú  s¢   ø… ØÓð#)àð#)ð ð#)ð =ð	#)ð
 "ð#)ð ,ð#)ð &ð#)ð ð#)ð &ð#)ð õ#)ðJSà"ðSð 3ðSð ð	Sð
 )ðSð 
÷Srt   r¡  c                  ó^   — e Zd Zeej
                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zy)ÚOnlineSoftmaxReductionNc
           	     óˆ   ‡‡‡‡‡‡‡— t        ˆˆˆˆˆˆˆfd„t        |«      D «       «      }
|
D ]  }|j                  «        Œ |
S )z>
        Create the reduction disregarding splitting.
        c              3  ój   •K  — | ]*  }t         j                  t        ‰‰‰‰‰d ‰‰|«	      «      –— Œ, y­w)ra  N)rb   rR  r¡  )	rû   Ú
output_idxrÐ   r%  r0  r1  rÛ  rÙ  rÚ  s	     €€€€€€€ru   rý   z0OnlineSoftmaxReduction.create.<locals>.<genexpr>%  sI   øè ø€ ò 
ð ô ×ÑÜ$ØØØØØ$Ø+ØØ"Øó
÷ñ
ùs   ƒ03)rz   rŸ   r  )rS  rÐ   r%  rÚ  r0  r1  rÙ  Ú
num_outputrÛ  r'  Úresultsrá   s    `````` `   ru   rR  zOnlineSoftmaxReduction.create  sG   þ€ ô  ÷ 
ñ 
ô $ JÓ/ô
ó 
ˆð  ò 	ˆAØ�I‰I�Kð	àˆrt   )rÐ   ré  r%  rÛ  rÚ  rÛ  r0  r/  r1  rà  rÙ  rà  r°  r„   rÛ  rC   r'  r—  rŒ   úSequence[TensorBox])ro   rp   rq   rx  rC   rï  rR  rs   rt   ru   r¬  r¬    s„   „ Øð )6×(=Ñ(=Ø'+ð!àð!ð ð!ð ð	!ð
 %ð!ð ð!ð )ð!ð ð!ð &ð!ð %ð!ð 
ò!ó ñ!rt   r¬  c                  ó¨   — e Zd Zeej
                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Ze	 	 	 	 	 	 dd„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Z	y)ÚWelfordReductionc                ó¸  ‡‡‡‡‡— |dv sJ ‚t         j                  j                  j                  t	        ‰«      «      }d
ˆˆˆfd„}	|dk(  r |	d«      }
 |	d«      } |	d«      }|
||fS |dk(  r@	 	 	 	 dˆˆˆˆfd„Š|dk(  r ‰|d   «       |	d«       |	d«      fS t        ˆfd„|D «       «      S t        j                  ‰‰‰|d   ‰‰||¬«      \  }}|t        j                  k(  r|}|dkD  r| j                  ‰‰|‰‰|||«      S t        d	«      D �cg c](  }t        j                  t        ‰‰|‰‰|‰||«	      «      ‘Œ* }}|D ]  }|j                  «        Œ |S c c}w )N)r`  rÇ  c                óX   •‡ — dˆˆ fd„}t         j                  ‰‰|t        ‰«      ¬«      S )Nc                ó0   •— t        j                  ‰‰«      S r’   rQ  )r¼   rÏ   rN  s    €€ru   r0  z8WelfordReduction.create.<locals>.const.<locals>.inner_fnK  s   ø€ Ü—|‘|ØØóð rt   r–  ©r¼   rà  rŒ   rU   ©rƒ  rR  ry   )rN  r0  rÐ   rÏ   r1  s   ` €€€ru   Úconstz&WelfordReduction.create.<locals>.constJ  s2   ù€ öô ×#Ñ#ØØØ!Ü˜F“|ð	 $ó ð rt   r   r1   c                óX   •‡ — dˆ ˆfd„}t         j                  ‰‰|t        ‰«      ¬«      S )Nc                ón   •— ‰D �cg c]  }t         j                  j                  ‘Œ }} ‰| |«      S c c}w r’   rV  )r¼   rÂ   rW  r�  rÙ  s      €€ru   r0  z7WelfordReduction.create.<locals>.copy.<locals>.inner_fnc  s1   ø€ Ø=MÖ&N¸¤u§w¡w§|£|Ð&N�OÐ&NÙ! # Ó7Ð7ùò 'OrX  r–  r¸  r¹  )r�  r0  rÐ   rÏ   r1  rÙ  s   ` €€€€ru   Úcopyz%WelfordReduction.create.<locals>.copy`  s2   ù€ ö8ô !×'Ñ'Ø!ØØ%Ü ›<ð	 (ó ð rt   r`  c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr’   rs   )rû   r—   r½  s     €ru   rý   z*WelfordReduction.create.<locals>.<genexpr>q  s   øè ø€ Ò:¨"™T "ŸXÑ:ùó   ƒ)rÅ  r&  r²   )rN  r„   rŒ   rb   )r�  z4Callable[[Sequence[Expr], Sequence[Expr]], OpsValue]rŒ   rb   )rV   rÑ   rÒ   rY  rR   rz   rØ  r6  rC   rï  r\  rŸ   rb   rR  r´  r  )rS  rÐ   rÏ   r§  r1  rÙ  rÅ  rÛ  r&  rº  ÚmeanÚm2Úweightr]  r-  r¯  r±  rá   r½  s    `` ``            @ru   rR  zWelfordReduction.create;  s¼  ü€ ð Ð!FÑFÐFÐFäŸ'™'×*Ñ*×3Ñ3´MÐBRÓ4SÓTˆ÷	ð ˜aÒÙ˜“8ˆDÙ�q“ˆBÙ˜1“XˆFØ˜˜VÐ#Ð#à˜aÒðØLðà÷ð ð Ð!1Ò1Ù˜I a™LÓ)©5°«8±U¸1³XÐ=Ð=äÓ:°	Ô:Ó:Ð:ô&  ×*Ñ*ØØØØ�a‰LØØØ)Ø+ð +ó 	
‰ˆˆeð œ]×2Ñ2Ò2Ø!ˆNØ�1Š9à×(Ñ(ØØØØØ ØØØó	ð 	ô2 $ A›hö
ð ô ×ÑÜ ØØØØØ$Ø"ØØ"Øó
õð
ˆð 
ð  ò 	ˆAØ�I‰I�Kð	àˆùò%
s   Ä-Ec                 ó   — y)N)r   r   r   rs   rg  s     ru   rh  zWelfordReduction.default_value´  s   € ð rt   c	                óø  ‡ ‡‡‡‡‡‡— t        ‰«      Št        j                  j                  j	                  t        j                  ‰‰z  d«      «       }	|	rH|dk7  rC	 	 	 	 	 	 	 	 d
ˆfd„}
‰ j                  |‰|d   t        |
d¬«      t        |
d¬«      f|‰d‰|¬«      S t        ‰‰dz
  z   ‰«      Št        j                  |‰t        ˆˆ ˆˆˆfd„|D «       «      g |¢‰‘‰g||«      }|D ]  }|j                  «        Œ 	 	 	 	 	 	 	 	 dd„Št        j                  j                  j                  t        |«      «      }‰ j                  ‰||«      }t        j                  |‰t        ˆfd	„|D «       «      |‰gd|«      S )r‰  r   rÇ  c                ó0   •— t        j                  |‰«      S r’   rQ  )r¼   r¦  rä   rÏ   s      €ru   r  z4WelfordReduction.create_multilayer.<locals>.constantÓ  s   ø€ ô —|‘| E¨5Ó1Ð1rt   rã   r1   )rÐ   rÏ   r§  r1  rÙ  rÅ  r-  rÛ  c           	   3  óL   •K  — | ]  }‰j                  |‰‰‰‰d ¬«      –— Œ y­w)r   )rw  N)r}  )rû   r�  rv  rS  r&  rÙ  r-  s     €€€€€ru   rý   z5WelfordReduction.create_multilayer.<locals>.<genexpr>ë  s=   øè ø€ ò 
ð ð ×+Ñ+ØØ$Ø#ØØØð ,÷ ñ
ùs   ƒ!$c                ó   —  |g | ¢|¢«      S r’   rs   )r    rW  r�  s      ru   Úintermediate_loader_fnzBWelfordReduction.create_multilayer.<locals>.intermediate_loader_fnþ  s   € ñ
 Ð4˜EÐ4 OÐ4Ó5Ð5rt   c              3  óT   •K  — | ]  }t        ‰|j                  «       ¬ «      –— Œ! y­w))r�  N)r
   rŽ  )rû   r¡   rÈ  s     €ru   rý   z5WelfordReduction.create_multilayer.<locals>.<genexpr>  s*   øè ø€ ò àô Ð.°q·}±}³×GÐGñùó   ƒ%()r¼   rà  r¦  rà  rä   r„   rŒ   rU   )r    rà  rW  rà  r�  rë  rŒ   rU   )rR   rV   rÑ   rÒ   rz  r€   r{  r\  r
   r.   r´  rR  rz   r  rÓ   rm  )rS  rÐ   rÏ   r§  r1  rÙ  rÅ  r-  rÛ  rx  r  Úintermediatesr¡   rø  rv  rÈ  r&  s   ` `  ` `      @@@ru   r\  z"WelfordReduction.create_multilayerº  sÞ  þ€ ô  (Ð(8Ó9ˆÜŸ™×(Ñ(×@Ñ@Ü�H‰H�_ uÑ,¨aÓ0ó
ð 
ˆ	ñ ˜Ð+<Ò<ð2Ø#ð2Ø4Bð2ØKNð2àõ2ð
 ×(Ñ(ØØà˜a‘LÜ˜H¨AÔ.Ü˜H¨AÔ.ðð
 Ø!1Ø0ØØ-ð )ó ð ô ˜o°¸±Ñ;¸UÓCˆ
Ü(×/Ñ/ØØÜ÷ 
ð (ô
ó 
ð ˆfÐ�eÐØˆLØØó#
ˆð& ò 	ˆAØ�I‰I�Kð	ð	6Ø!ð	6à+ð	6ð 9ð	6ð ó		6ô —W‘W×%Ñ%×/Ñ/´¸fÓ0EÓFˆ
Ø×9Ñ9Ø�:˜~ó
ˆô  ×&Ñ&ØØÜó à&ôó ð ØˆGàØó
ð 	
rt   N)rÐ   ré  rÏ   rÛ  r§  úSequence[Callable[..., Any]]r1  rŸ  rÙ  rŸ  rÅ  r?   rÛ  rC   rŒ   r²  r™  )rÐ   ré  rÏ   rÛ  r§  rÌ  r1  rŸ  rÙ  rŸ  rÅ  r?   r-  r^   rÛ  rC   rŒ   r²  )
ro   rp   rq   rx  rC   rï  rR  r  rh  r\  rs   rt   ru   r´  r´  :  s  „ Øð )6×(=Ñ(=ðvàðvð ðvð 0ð	vð
 ðvð (ðvð &ðvð &ðvð 
òvó ðvðp ðØðØ$/ðà	,òó ðð
 ðZ
àðZ
ð ðZ
ð 0ð	Z
ð
 ðZ
ð (ðZ
ð &ðZ
ð ðZ
ð &ðZ
ð 
òZ
ó ñZ
rt   r´  c                  ó^  ‡ — e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   dˆ fd„Zdˆ fd„Z	 	 	 	 	 	 	 	 	 	 d d„Zd!d„Zd"d„Zd#d„Z	d#d„Z
d$d„Zd%d„Zdd„Zeej                   fddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'd„«       Zˆ xZS )(ÚScanrŸ  Úscan_rangesrÍ   ú=Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]]r?  zFCallable[[Sequence[_IntLike], Sequence[_IntLike]], Sequence[_IntLike]]r£   rC   rÛ  r„   r¢  útuple[torch.dtype, ...]Údtypesútuple[Callable[..., Any], ...]r§  c                óÄ   •— t         ‰| �  «        t        «       j                  d„ | j                  D «       Ž z   t        «       j                  d„ | j
                  D «       Ž z  S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   r4  r5  s     ru   rý   z0Scan.get_unbacked_symbol_uses.<locals>.<genexpr>,  ó   è ø€ Ò"VÀÔ#8¸×#;Ñ"Vùr7  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   r4  r5  s     ru   rý   z0Scan.get_unbacked_symbol_uses.<locals>.<genexpr>-  ó   è ø€ Ò"OÀÔ#8¸×#;Ñ"Oùr7  )rB  rÁ  r,   r8  rÏ  rÍ   rC  s    €ru   rÁ  zScan.get_unbacked_symbol_uses&  s[   ø€ ô
 ‰GÑ,Ó.Ø Œj‹l× Ñ Ñ"VÀT×EUÑEUÔ"VÐWñXà Œj‹l× Ñ Ñ"OÀTÇYÁYÔ"OÐPñQð	
rt   c                ó¨   •— t        | j                  «      t        | j                  «      z   t        | j                  «      k(  sJ ‚t        ‰| �  «        y r’   )rž   r1  rÏ  rÍ   rB  r7  rC  s    €ru   r7  zScan.__post_init__0  ó=   ø€ Ü�4—;‘;Ó¤# d×&6Ñ&6Ó"7Ñ7¼3¸t¿y¹y»>ÒIÐIÐIÜ‰ÑÕrt   c                ó  ‡— | j                  ||«      Št        ˆfd„| j                  D «       «      }t        j                  | j
                  | j                  |«      }t        j                  |xs d |‰«      || j                     «      S )Nc              3  ó.   •K  — | ]  } |‰«      –— Œ y ­wr’   rs   ©rû   r0  r¼   s     €ru   rý   z'Scan.store_reduction.<locals>.<genexpr><  ó   øè ø€ ÒD¨‘x —}ÑDùr¿  rŠ  )	r£   rz   r§  rT   ró  rÒ  r?  r‹  r¢  )r0  r�  rŽ  r�  Ú	scan_varsr|   Úresultr¼   s          @ru   rä  zScan.store_reduction4  so   ø€ ð �l‰l˜4 Ó+ˆÜÓD°T·^±^ÔDÓDˆÜ—‘˜$Ÿ+™+ t§¡¸Ó?ˆÜ�y‰yØÒ$˜9¡g¨c£l°F¸4×;LÑ;LÑ4Mó
ð 	
rt   c                 ó   — y)NÚcustomrs   r6  s    ru   rÃ  zScan.get_reduction_typeB  s   € àrt   c                ó   — | j                   S r’   )rÏ  r6  s    ru   rÅ  zScan.get_reduction_sizeF  rH  rt   c                ó   — | j                   S r’   ©rÍ   r6  s    ru   rÔ   zScan.get_sizeI  ó   € Ø�y‰yÐrt   c                ó   — | j                   S r’   rF  r6  s    ru   rO  zScan.get_pointwise_sizeL  rK  rt   c                óX   — t        | j                  «      t        | j                  «      z   S r’   )rž   r1  rÏ  r6  s    ru   rç  zScan.index_lengthO  ó!   € Ü�4—;‘;Ó¤# d×&6Ñ&6Ó"7Ñ7Ð7rt   c                ó¶   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }|fS r’   )r[  r1  rÏ  r0   ré  r£   ©r0  r    rë  r¼   s       ru   ra  zScan.inner_fn_argsR  óE   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×-Ñ-¬t¯}©}Ó=ˆØ�l‰l˜5 &Ó)ˆØˆvˆrt   c                óÜ   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }t        | j                  |«      S r’   )r[  r1  rÏ  r0   ré  r£   r8   r0  rë  s       ru   r9  z#Scan.inner_fn_free_unbacked_symbolsX  óO   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×-Ñ-¬t¯}©}Ó=ˆØ�l‰l˜5 &Ó)ˆÜ,¨T¯]©]¸CÓ@Ð@rt   T)Úcan_fallback_to_atenc               ó¤  ‡‡‡— g |d ‰ ¢|‰dz   d  ¢Š|‰   gŠt         j                  j                  |t        j                  «      sd gt        |«      z  S t        |«      dkD  r=t         j                  j                  |t        j                  «      sd gt        |«      z  S t         j                  j                  }
|
j                  t        ‰«      «      }t        |«      t        |«      k(  sJ ‚|
j                  t        j                  |d«      «      r?t        t        |«      «      D �cg c]!  }t        j                  |||   ||   |¬«      ‘Œ# c}S | j!                  ||d   |d   ‰‰‰||¬«      \  }}t"        }|dkD  r[t$        j&                  j(                  d u xs t*        xr	 t,        dk\  xr t        |«      dk(  }|s|rd gt        |«      z  S d}nt.        }dˆˆˆfd„}t        t        |«      «      D �cg c]0  }t0        j                   |d	|||   |||   ||‰‰||||dœ|	¤Ž«      ‘Œ2 }}|D ]  }|j3                  «        Œ |S c c}w c c}w )
Nr1   r–  r   )rÐ   rÏ   r0  ÚaxisÚpointwise_rangesrÏ  r?  Ú
scan_numelz3.3.0c                ó„   •— t        |«      t        ‰«      k(  sJ ‚t        | «      t        ‰«      k(  sJ ‚g | d ‰ ¢|¢| ‰d  ¢S r’   ©rž   )r    Ú
scan_indexrñ  rò  rÏ  s     €€€ru   r£   zScan.create.<locals>.reindex¡  óS   ø€ Ü�z“?¤c¨+Ó&6Ò6Ð6Ð6Ü�u“:¤Ð%5Ó!6Ò6Ð6Ð6Ø>�U˜5˜D�\Ð> JÐ>°°t°u°Ð>Ð>rt   )rÐ   rÏ   rÒ  r0  r§  rÍ   r1  rÏ  r?  r£   rÛ  r¢  )r    rà  rö  rà  rŒ   rž  rs   )rV   rÑ   r  r4   ÚSCANrž   ÚTUPLE_REDUCTIONrÒ   rY  rR   rz  r€   ÚLerŸ   rƒ  rR  r6  rÎ  rÜ   ÚversionÚhipÚ
has_tritonÚtriton_versionÚ	SplitScanrb   r  )rS  rÐ   rÒ  r§  rÍ   rñ  r?  rÛ  rï  r•   rÒ   ró  r¢  r6  Ú	scan_typeÚsupports_splitr£   r±  rà  rò  rÏ  s        `             @@ru   rR  zScan.create^  sˆ  ú€ ð =˜T % 4˜[Ð<¨4°°q±°
Ð+;Ð<ÐØ˜D‘z�lˆä�w‰w×"Ñ" 6¬>×+>Ñ+>Ô?Ø�6œC ›KÑ'Ð'äˆv‹;˜Š?¤1§7¡7×#6Ñ#6Ø”N×2Ñ2ô$
ð �6œC ›KÑ'Ð'ä—7‘7×#Ñ#ˆØ×&Ñ&¤}°[Ó'AÓBˆ
ä�6‹{œc )›nÒ,Ð,Ð,ð ×+Ñ+¬E¯H©H°ZÀÓ,CÔDô %*¬#¨f«+Ó$6öð !ô × Ñ Ø!Ø  Ñ.Ø& |Ñ4Øð	 !õ òð ð &)§^¡^ØØ˜‘)Ø˜q‘\ØØ-Ø#Ø!Ø!ð &4ó 	&
Ñ"ˆ˜
ô ˆ	Ø˜Š>ä—‘×!Ñ! TÐ)ÒW¬jÒ.V¼^ÈwÑ=Vò%ä�v“; !Ñ#ð ñ "Ù'à ˜6¤C¨£KÑ/Ð/à!"‘Jä%�	÷	?ô. !&¤c¨&£kÓ 2ö%
ð$ ô# ×ÑÙð Ø!Ø  Ñ.Ø!Ø& |Ñ4Ø'ØØ+Ø +Ø)Ø#Ø#1Ø!-ñð ñõð
ˆð 
ð* ò 	ˆFØ�N‰NÕð	ð ˆùòùòN
s   Ä)&IÇ85Ic	           
     óN   ‡‡— dˆˆfd„}	t         j                  ||||	||d|¬«      S )Nc                ó,   •—  ‰g | d ‰ ¢|¢| ‰d  ¢«      S r’   rs   )r¼   r¦  rñ  r0  s     €€ru   ry  z#Scan.num_splits.<locals>.wrapper_fnÍ  s*   ø€ ÙÐF˜c % 4˜jÐF¨=ÐF¸3¸t¸u¸:ÐFÓGÐGrt   ró  )rÐ   r%  rÚ  r0  r1  rÙ  rÅ  r&  )r¼   rà  r¦  rà  rŒ   rU   )rØ  r6  )
rS  rÐ   rÏ   r0  rñ  rò  rÏ  r?  ró  ry  s
      ``     ru   r6  zScan.num_splitsÀ  s;   ù€ ö	Hô ×#Ñ#ØØØØØ#Ø(Ø!Ø&ð $ó 	
ð 		
rt   r   rÓ  )
r�  rä  rŽ  z%Callable[[Sequence[_IntLike]], Never]r�  rà  rß  rz  rŒ   r�   rã  r  rß  rþ  rv  )rÐ   ré  rÒ  rÑ  r§  z+tuple[Callable[[Sequence[Expr]], Any], ...]rÍ   rŸ  rñ  r„   r?  rÐ  rÛ  rC   rï  rl   r•   r   rŒ   úSequence[Optional[TensorBox]])rÐ   ré  rÏ   rÛ  r0  rë  rñ  r„   rò  rŸ  rÏ  rŸ  r?  rÐ  ró  r   rŒ   r˜  )ro   rp   rq   rr   rÁ  r7  rä  rÃ  rÅ  rÔ   rO  rç  ra  r9  rx  rC   rï  rR  r6  rz  r{  s   @ru   rÎ  rÎ    s�  ø… àÓØ
ÓØMÓMØSÓSØ!Ó!ØÓà#Ó#Ø-Ó-õ
õ ð
à"ð
ð 7ð
ð ð	
ð
 $ð
ð 
ó
óó óóó8óóAð ð )6×(=Ñ(=ð_ð &*ñ_àð_ð (ð_ð ?ð	_ð
 ð_ð ð_ð Rð_ð &ð_ð #ð_ð ð_ð 
'ò_ó ð_ðB ð
àð
ð ð
ð 7ð	
ð
 ð
ð (ð
ð #ð
ð Rð
ð ð
ð 
(ò
ó ô
rt   rÎ  c                  ó   — e Zd Zy)rÿ  N©ro   rp   rq   rs   rt   ru   rÿ  rÿ  Ý  s   „ àrt   rÿ  c                  ó,  ‡ — e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   dˆ fd„Zdˆ fd„Z	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zd d„Zd d„Z	d d„Z
d!d„Zd"d„Zdd„Zeej                   f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#d„«       Zˆ xZS )$ÚSortrŸ  Úsort_rangesrÍ   z:Callable[[Sequence[Expr], Sequence[Expr]], Sequence[Expr]]r£   rC   rÛ  r„   r¢  rÑ  rÒ  rÓ  r§  rl   ÚstableÚ
descendingc                óÄ   •— t         ‰| �  «        t        «       j                  d„ | j                  D «       Ž z   t        «       j                  d„ | j
                  D «       Ž z  S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   r4  r5  s     ru   rý   z0Sort.get_unbacked_symbol_uses.<locals>.<genexpr>ö  rÖ  r7  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   r4  r5  s     ru   rý   z0Sort.get_unbacked_symbol_uses.<locals>.<genexpr>÷  rØ  r7  )rB  rÁ  r,   r8  r	  rÍ   rC  s    €ru   rÁ  zSort.get_unbacked_symbol_usesó  sY   ø€ ä‰GÑ,Ó.Ø Œj‹l× Ñ Ñ"VÀT×EUÑEUÔ"VÐWñXà Œj‹l× Ñ Ñ"OÀTÇYÁYÔ"OÐPñQð	
rt   c                ó¨   •— t        | j                  «      t        | j                  «      z   t        | j                  «      k(  sJ ‚t        ‰| �  «        y r’   )rž   r1  r	  rÍ   rB  r7  rC  s    €ru   r7  zSort.__post_init__ú  rÚ  rt   c                ó,  ‡— | j                  ||«      Št        ˆfd„| j                  D «       «      }t        j                  | j
                  || j                  | j                  «      }t        j                  |xs d |‰«      || j                     «      S )Nc              3  ó.   •K  — | ]  } |‰«      –— Œ y ­wr’   rs   rÝ  s     €ru   rý   z'Sort.store_reduction.<locals>.<genexpr>	  rÞ  r¿  rŠ  )
r£   rz   r§  rT   ÚsortrÒ  r
  r  r‹  r¢  )r0  r�  rŽ  r�  rå  r|   rà  r¼   s          @ru   rä  zSort.store_reductionþ  su   ø€ ð �l‰l˜4 Ó0ˆÜÓD°T·^±^ÔDÓDˆÜ—‘˜$Ÿ+™+ v¨t¯{©{¸D¿O¹OÓLˆÜ�y‰yØÒ$˜9¡g¨c£l°F¸4×;LÑ;LÑ4Mó
ð 	
rt   c                 ó   — y)Nr  rs   r6  s    ru   rÃ  zSort.get_reduction_type	  s   € Ørt   c                ó   — | j                   S r’   )r	  r6  s    ru   rÅ  zSort.get_reduction_size	  rH  rt   c                ó   — | j                   S r’   rå  r6  s    ru   rÔ   zSort.get_size	  ræ  rt   c                ó   — | j                   S r’   rF  r6  s    ru   rO  zSort.get_pointwise_size	  rK  rt   c                óX   — t        | j                  «      t        | j                  «      z   S r’   )rž   r1  r	  r6  s    ru   rç  zSort.index_length	  ré  rt   c                ó¶   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }|fS r’   )r[  r1  r	  r0   ré  r£   rë  s       ru   ra  zSort.inner_fn_args	  rì  rt   c                óÜ   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }t        | j                  |«      S r’   )r[  r1  r	  r0   ré  r£   r8   r0  rë  s       ru   r9  z#Sort.inner_fn_free_unbacked_symbols!	  rî  rt   c	                ó®  ‡‡‡— g |d ‰ ¢|‰dz   d  ¢Š|‰   gŠt         j                  j                  |t        j                  «      sd gt        |«      z  S t         j                  j                  }
|
j                  t        ‰«      «      }d}t        j                  j                  xr% |
j                  t        j                  ||«      «      }|sd gt        |«      z  S t        |«      t        |«      k(  sJ ‚|
j                  t        j                  |d«      «      r?t        t        |«      «      D �cg c]!  }t         j#                  |||   ||   |¬«      ‘Œ# c}S dˆˆˆfd„}t        t        |«      «      D �cg c]4  }t$        j#                  t'        d|||   |||   ||‰‰|||||dœ|	¤Ž«      ‘Œ6 }}|D ]  }|j)                  «        Œ |S c c}w c c}w )Nr1   rj  r–  c                ó„   •— t        |«      t        ‰«      k(  sJ ‚t        | «      t        ‰«      k(  sJ ‚g | d ‰ ¢|¢| ‰d  ¢S r’   rõ  )r    Ú
sort_indexrñ  rò  r	  s     €€€ru   r£   zSort.create.<locals>.reindexV	  r÷  rt   )rÐ   rÏ   rÒ  r0  r§  rÍ   r1  r	  r£   rÛ  r¢  r
  r  )r    rà  r  rà  rŒ   rž  rs   )rV   rÑ   r  r4   ÚSORTrž   rÒ   rY  rR   r2   rð   Úpersistent_reductionsrz  r€   rú  rŸ   rƒ  rR  rb   r  r  )rS  rÐ   rÒ  r§  rÍ   rñ  r
  r  rÛ  r•   rÒ   Ú
sort_numelÚ
max_rblockÚis_persistent_kernelr¢  r£   r±  rà  rò  r	  s        `            @@ru   rR  zSort.create'	  sü  ú€ ð =˜T % 4˜[Ð<¨4°°q±°
Ð+;Ð<ÐØ˜D‘z�lˆä�w‰w×"Ñ" 6¬>×+>Ñ+>Ô?Ø�6œC ›KÑ'Ð'ä—7‘7×#Ñ#ˆØ×&Ñ&¤}°[Ó'AÓBˆ
ð ˆ
ä�M‰M×/Ñ/ò SØ×0Ñ0´·±¸*ÀjÓ1QÓRð 	ñ $à�6œC ›KÑ'Ð'ä�6‹{œc )›nÒ,Ð,Ð,ð ×+Ñ+¬E¯H©H°ZÀÓ,CÔDô %*¬#¨f«+Ó$6öð !ô × Ñ Ø!Ø  Ñ.Ø& |Ñ4Øð	 !õ òð ÷	?ô0 !&¤c¨&£kÓ 2ö'
ð& ô% ×ÑÜð Ø!Ø  Ñ.Ø!Ø& |Ñ4Ø'ØØ+Ø +Ø#Ø#1Ø!-Ø!Ø)ñð ñõð
ˆð 
ð, ò 	ˆFØ�N‰NÕð	ð ˆùòQùò
s   Ä2&GÅ99Gr   rÓ  )
r�  rä  rŽ  rí  r�  rà  rå  rà  rŒ   r�   rã  rß  rþ  r•  )rÐ   ré  rÒ  rÑ  r§  z'tuple[Callable[[list[Expr]], Any], ...]rÍ   rŸ  rñ  r„   r
  rl   r  rl   rÛ  rC   r•   r   rŒ   r  )ro   rp   rq   rr   rÁ  r7  rä  rÃ  rÅ  rÔ   rO  rç  ra  r9  rx  rC   rï  rR  rz  r{  s   @ru   r  r  â  s*  ø… ð ÓØ
ÓØGÓGØ!Ó!ØÓà#Ó#Ø-Ó-àƒLØÓõ
õ ð
à"ð
ð 2ð
ð ð	
ð
 'ð
ð 
ó
óó óóó8óóAð ð )6×(=Ñ(=ðLàðLð (ðLð ;ð	Lð
 ðLð ðLð ðLð ðLð &ðLð ðLð 
'òLó ôLrt   r  c                ó>   — 	 t        | d¬«       y# t        $ r Y yw xY w)NF©ÚfreezeT)r  r_  rë   s    ru   rÕ   rÕ   w	  s&   € ðÜ˜a¨Õ.ØøÜò Ùðús   ‚ �	›c                ó¢   — 	 t        | d¬«      \  }}|j                  «       r|j                  «        |j                  «       S # t        $ r Y yw xY w©NFr#  )r  Úshould_pad_stridesÚpad_stridesÚis_contiguousr_  )rÈ   Ú_bufferr  s      ru   Ú is_contiguous_storage_and_layoutr+  	  sR   € ðÜ/°¸%Ô@‰ˆ�ð ×$Ñ$Ô&Ø×ÑÔ Ø×#Ñ#Ó%Ð%øÜò Ùðús   ‚?A Á	AÁAc                óž  — t        | t        «      rt        | j                  |||||¬«      S t        | t        «      r:t        | j                  |||||¬«      \  }}| | j                  j                  «       fS t        | t        «      r‹|rn|r0| j                  «        | j                  «       j                  «       s>J ‚|�| j                  ||¬«       n&|�| j                  ||¬«       n| j                  «        t	        | «      | j                  «       fS t        | t        «      r(t        | j                  |¬«      \  }}|| j                  fS t        ‚)zØ
    Try to simplify x into a StorageBox and a Layout.

    allow_padding only affect how we apply stride_order. When allow_padding
    is True, we have the freedom to add padding when applying the stride_order.
    ©r$  Úwant_contiguousÚstride_orderr©  r´  ©r©  r#  )rx   rb   r  r  Ú
StorageBoxrÖ   ÚBufferr¦  r)  rª  rµ  r
  r  r  r_  )	rÈ   r$  r.  r/  r©  r´  rÂ   r  Úbuffers	            ru   r  r  ‹	  sG  € ô �!”YÔÜ$Ø�F‰FØØ+Ø%Ø'Ø'ô
ð 	
ô �!”ZÔ Ü)Ø�F‰FØØ+Ø%Ø'Ø'ô
‰	ˆˆ6ð �!—&‘&×#Ñ#Ó%Ð%Ð%Ü�!”VÔÙÙØ—‘Ô!Ø—|‘|“~×3Ñ3Ô5Ð5Ð5ØÐ)Ø×1Ñ1Ø °ð 2õ ð Ð*Ø×2Ñ2Ø!°ð 3õ ð —‘Ô!Ü˜!‹}˜aŸl™l›nÐ,Ð,Ü�!”_Ô%ô *Ø�F‰FØô
‰	ˆ�ð �q—x‘xÐÐÜ
Ðrt   c                ód   — 	 t        | d¬«      \  }}|j                  |«      S # t        $ r Y yw xY wr&  )r  Úis_stride_orderedr_  )rÈ   r/  r*  r  s       ru   Ú"is_stride_order_storage_and_layoutr6  Ç	  s:   € ðÜ/°¸%Ô@‰ˆ�Ø×'Ñ'¨Ó5Ð5øÜò Ùðús   ‚ # £	/®/c                  óÄ   — e Zd ZU ded<   dd„Zdd„Zdd„Zdd„Zedd„«       Z	dd„Z
dd	„Zd d
„Zd!d„Zd"d„Zd#d„Zd$d„Zd%d„Zd„ Zd„ Zd$d„Zd$d„Zd&d„Zd'd„Zd„ Zd(d„Zy))ÚBaseViewrc   r  c                ó6   — | j                   j                  «       S r’   ©r  rÁ  r6  s    ru   rÁ  z!BaseView.get_unbacked_symbol_usesÕ	  ó   € Ø�y‰y×1Ñ1Ó3Ð3rt   c                ó   — t        d| › �«      ‚)Nzmake_reindexer NYI on r  r6  s    ru   Úmake_reindexerzBaseView.make_reindexerØ	  s   € Ü!Ð$:¸4¸&Ð"AÓBÐBrt   c                ól   ‡‡— | j                   j                  «       Š| j                  «       Šdˆˆfd„}|S )Nc                ó    •—  ‰ ‰| «      «      S r’   rs   ©r¼   Úinnerr£   s    €€ru   rŽ  z&BaseView.make_indexer.<locals>.indexerß	  ó   ø€ Ù™ ›Ó&Ð&rt   )r¼   rà  rŒ   r   )r  r‘  r=  )r0  rŽ  rA  r£   s     @@ru   r‘  zBaseView.make_indexerÛ	  s/   ù€ Ø—	‘	×&Ñ&Ó(ˆØ×%Ñ%Ó'ˆö	'ð ˆrt   c                ól   ‡‡— | j                   j                  «       Š| j                  «       Šdˆˆfd„}|S )Nc                ó    •—  ‰ ‰| «      «      S r’   rs   r@  s    €€ru   r�  z$BaseView.make_loader.<locals>.loaderè	  rB  rt   r¸  )r  rŽ  r=  )r0  r�  rA  r£   s     @@ru   rŽ  zBaseView.make_loaderä	  s/   ù€ Ø—	‘	×%Ñ%Ó'ˆØ×%Ñ%Ó'ˆö	'ð ˆrt   c                ó6   — | j                   j                  «       S r’   )r  rÙ   r6  s    ru   rÏ   zBaseView.dtypeí	  s   € à�y‰y×"Ñ"Ó$Ð$rt   c                ó6   — | j                   j                  «       S r’   ©r  rÖ   r6  s    ru   rÖ   zBaseView.get_layoutñ	  ó   € Ø�y‰y×#Ñ#Ó%Ð%rt   c                ó6   — | j                   j                  «       S r’   ©r  rÚ   r6  s    ru   rÚ   zBaseView.get_deviceô	  rH  rt   c                 ó   — y r’   rs   r6  s    ru   rG  zBaseView.get_origin_node÷	  rK  rt   c                ó6   — | j                   j                  «       S r’   ©r  r•  r6  s    ru   r•  zBaseView.get_nameú	  ó   € Ø�y‰y×!Ñ!Ó#Ð#rt   c                ó"   — | j                  «       S r’   rt  r6  s    ru   rO  zBaseView.get_pointwise_sizeý	  ó   € Ø�}‰}‹Ðrt   c                ó8   — | j                   j                  |«      S r’   ©r  rŸ  r�  s     ru   rŸ  zBaseView.mark_reuse 
  ó   € Ø�y‰y×#Ñ# EÓ*Ð*rt   c                ó6   — | j                   j                  «       S r’   ©r  rŠ  r6  s    ru   rŠ  zBaseView.has_exceeded_max_reads
  ó   € Ø�y‰y×/Ñ/Ó1Ð1rt   c                ó6   — | j                   j                  «       S r’   ©r  r  r6  s    ru   r  zBaseView.realize
  ó   € Ø�y‰y× Ñ Ó"Ð"rt   c                ó6   — | j                   j                  «       S r’   ©r  r¢  r6  s    ru   r¢  zBaseView.realize_hint	
  ó   € Ø�y‰y×%Ñ%Ó'Ð'rt   c                ó6   — | j                   j                  «       S r’   ©r  r¿  r6  s    ru   r¿  zBaseView.get_storage_numel
  ó   € Ø�y‰y×*Ñ*Ó,Ð,rt   c                ó6   — | j                   j                  «       S r’   ©r  rÇ  r6  s    ru   rÇ  zBaseView.is_extern
  ó   € Ø�y‰y×"Ñ"Ó$Ð$rt   c                ó6   — | j                   j                  «       S r’   )r  Úis_module_bufferr6  s    ru   rd  zBaseView.is_module_buffer
  ó   € Ø�y‰y×)Ñ)Ó+Ð+rt   c                ó6   — | j                   j                  «       S r’   ©r  rA  r6  s    ru   rA  zBaseView.get_read_names
  ó   € Ø�y‰y×'Ñ'Ó)Ð)rt   c                óÈ   — t        j                  t        dd«      5  t        | j	                  «       | j                  «       «      j                  cd d d «       S # 1 sw Y   y xY wr]  )r   r˜   r×   r:   rŽ  rÔ   rº  r6  s    ru   r@  zBaseView.get_reads
  sL   € Ü�\‰\œ.Ð*:¸DÓAñ 	Ü&Ø× Ñ Ó"Ø—‘“ó÷ ‰e÷		÷ 	ò 	ús   œ2AÁA!c                ód   — | }t        |t        «      r|j                  }t        |t        «      rŒ|S r’   )rx   r8  r  )r0  rÈ   s     ru   r¤  zBaseView.unwrap_view
  s+   € ØˆÜ˜œHÔ%Ø—‘ˆAô ˜œHÕ%àˆrt   c                óº   — | j                  «       } t        j                  t        d|«      |«      }t	        || j                  «       || j                  «       ¬«      S r“  )rŽ  r   r˜   r—  rƒ  rÙ   rÔ   r˜  s      ru   rË  zBaseView.constant_to_device%
  sP   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—.‘.Ó"ØØ—=‘=“?ô	
ð 	
rt   Nr   )rŒ   z*Callable[[Sequence[Expr]], Sequence[Expr]]rì  rê  rÚ  rÜ  ræ  rÖ  rð  rß  ró  rÞ  rã  rÔ  rý  r  )ro   rp   rq   rr   rÁ  r=  r‘  rŽ  r  rÏ   rÖ   rÚ   rG  r•  rO  rŸ  rŠ  r  r¢  r¿  rÇ  rd  rA  r@  r¤  rË  rs   rt   ru   r8  r8  Ñ	  s€   … à
ƒLó4óCóóð ò%ó ð%ó&ó&óó$óó+ó2ó#ò(ò-ó%ó,ó*óòô	
rt   r8  c                  óF   — e Zd ZU ded<   ed„ «       Zed„ «       Zdd„Zd„ Z	y)	r}   rž  rÍ   c                ór  — t         j                  j                  }t        t	        t
        j                  |«      «      }| j                  «       }dgt        |«      t        |«      z
  z  t        |«      z   }t        |«      t        |«      k(  sJ ‚t        t        |«      «      D ]’  }||   dk(  r||   €J ‚||   ||<   Œ||   �Lt         j                  j                  j                  j                  t        j                  ||   d«      d¬«      rŒm|j                  ||   ||   z
  d¬«      dk(  rŒ�J d«       ‚ |S )	zReplace `-1` with correct sizesNrþ   r1   T©Úsize_obliviousr   ©ÚfallbackzKBroadcast failed in ExpandView({x.get_size()}, {new_size}) on dimension {i})rV   rÑ   rÒ   ry   rT  r€   rB  rÔ   rž   rŸ   r·   Úevaluate_exprr{  rÓ   )rÈ   Únew_sizerÒ   Úold_sizer¡   s        ru   Ú_normalize_sizezExpandView._normalize_size5
  s1  € ô —7‘7×#Ñ#ˆÜœœEŸL™L¨(Ó3Ó4ˆØ—:‘:“<ˆØ�6œS ›]¬S°«]Ñ:Ñ;¼dÀ8»nÑLˆÜ�8‹}¤ H£Ò-Ð-Ð-Ü”s˜8“}Ó%ò 	ˆAØ˜‰{˜bÒ Ø ‘{Ð.Ð.Ð.Ø& q™k�˜’Ø˜!‘Ð$¬¯©×(8Ñ(8×(BÑ(B×(PÑ(PÜ—‘˜ !™ aÓ(¸ð )Qô )ð ð  ×)Ñ)¨(°1©+¸À¹Ñ*CÈaÐ)ÓPÐTUÓUð ØaóÐUð	ð" ˆrt   c           	     ó¾  — | j                  ||«      }t        |«      �r3t        |«      \  }}t        |«      t        |j                  «      z
  }|dk\  sJ ‚t
        j                  j                  g|z  }t        |j                  |j                  «      D ]y  \  }}|j                  t        j                  j                  j                  j                  t        j                   |d«      d¬«      s|nt
        j                  j                  «       Œ{ t#        |j$                  |j&                  t)        |«      ||j*                  «      }	t-        ||	¬«      S t/        ||¬«      S )Nr   r1   Trn  r  )r  rÍ   )ru  rÕ   r  rž   rÍ   r€   rX  rY  r§   rÎ   r  rV   rÑ   rÒ   r·   rr  r{  r  rÐ   rÏ   ry   r  r  r}   )
rS  rÈ   rs  r  r  Úskipr  rÎ   rÍ   r   s
             ru   rR  zExpandView.createP
  s'  € à×&Ñ& q¨(Ó3ˆä  Õ#Ü"7¸Ó":ÑˆG�ZÜ�x“=¤3 z§¡Ó#7Ñ7ˆDØ˜1’9Ð�9ÜŸ'™'Ÿ,™,˜¨$Ñ.ˆJÜ # J×$5Ñ$5°z·±Ó Gò ‘�˜Ø×!Ñ!äŸ7™7×+Ñ+×5Ñ5×CÑCÜŸ™  qÓ)¸$ð Dô ñ ô Ÿ™Ÿ™õðô %Ø×!Ñ!Ø× Ñ Ü�X“ØØ×!Ñ!óˆJô #¨¸
ÔCÐCä˜q xÔ0Ð0rt   c                ó   — | j                   S r’   rå  r6  s    ru   rÔ   zExpandView.get_sizel
  ræ  rt   c                ó˜   ‡‡— | j                  «       }| j                  j                  «       Št        |«      t        ‰«      z
  Šˆˆfd„}|S )Nc                óÔ   •— t        | ‰d  «      } t        | «      t        ‰«      k(  sJ ‚t        t        ‰«      «      D ](  }‰|   dk(  sŒt        j                  j
                  | |<   Œ* | S rW  )ry   rž   rŸ   r€   rX  rY  )r    r¡   Úactualrw  s     €€ru   r£   z*ExpandView.make_reindexer.<locals>.reindext
  sd   ø€ Ü˜˜t˜u˜Ó&ˆEÜ�u“:¤ V£Ò,Ð,Ð,Üœ3˜v›;Ó'ò ,�Ø˜!‘9 “>ä$Ÿw™wŸ|™|�E˜!’Hð,ð ˆLrt   )rÔ   r  rž   )r0  Útargetr£   r{  rw  s      @@ru   r=  zExpandView.make_reindexero
  s>   ù€ Ø—‘“ˆØ—‘×#Ñ#Ó%ˆÜ�6‹{œS ›[Ñ(ˆõ	ð ˆrt   Nrß  )
ro   rp   rq   rr   r  ru  rx  rR  rÔ   r=  rs   rt   ru   r}   r}   1
  s8   … à
Óàñó ðð4 ñ1ó ð1ó6órt   r}   c                  óF   — e Zd ZU ded<   ed„ «       Zed„ «       Zdd„Zd„ Zy)	ÚPermuteViewrž  Údimsc           
     óº  — | j                  |«      }t        |«      t        t        t        |«      «      «      k(  sJ ‚t	        |«      r~t        |«      \  }}t        |j                  |j                  |D �cg c]  }|j                  |   ‘Œ c}|D �cg c]  }|j                  |   ‘Œ c}|j                  «      }t        ||¬«      S t        ||¬«      S c c}w c c}w )Nr  )r  r  )Ú_map_neg_dimsr,   rŸ   rž   rÕ   r  r  rÐ   rÏ   rÍ   rÎ   r  r  r~  )rS  rÈ   r  r  r  r¡   r   s          ru   rR  zPermuteView.create„
  sÃ   € à× Ñ  Ó&ˆÜ˜$Ó¤:¬e´C¸³IÓ.>Ó#?Ò?Ð?Ð?ä  Ô#Ü"7¸Ó":ÑˆG�ZÜ$Ø×!Ñ!Ø× Ñ Ø-1Ö2¨�—‘ Ó#Ò2Ø/3Ö4¨!�×"Ñ" 1Ó%Ò4Ø×!Ñ!óˆJô #¨¸
ÔCÐCä ¨Ô-Ð-ùò 3ùÚ4s   Á5CÂCc                óR   — |D �cg c]  }|dk\  r|nt        |«      |z   ‘Œ c}S c c}w rx  rõ  )rS  r  r  s      ru   r�  zPermuteView._map_neg_dims–
  s)   € à@DÖE¸�s˜a’x‘¤S¨£Y°¡_Ñ4ÒEÐEùÒEs   …$c                ó  — t        | j                  | j                  «      «      t        t        t	        | j                  «      «      «      k(  sJ ‚| j
                  j                  «       }| j                  D �cg c]  }||   ‘Œ	 c}S c c}w r’   )r,   r�  r  rŸ   rž   r  rÔ   )r0  rÍ   r¡   s      ru   rÔ   zPermuteView.get_sizeš
  so   € Ü˜$×,Ñ,¨T¯Y©YÓ7Ó8¼JÜ”#�d—i‘i“.Ó!ó=
ò 
ð 	
ð 
ð �y‰y×!Ñ!Ó#ˆØ!%§¡Ö+˜A��Q“Ò+Ð+ùÒ+s   Á7Bc                óB  ‡— t        | j                  «      D ��ci c]  \  }}||“Œ
 c}}Št        t        | j                  «      «      D �cg c]  }‰|   ‘Œ	 c}Št	        ‰«      t	        t        t        | j                  «      «      «      k(  sJ ‚ˆfd„}|S c c}}w c c}w )Nc                ó4   •— ‰D �cg c]  }| |   ‘Œ	 c}S c c}w r’   rs   )r    r¡   Úinvs     €ru   r£   z+PermuteView.make_reindexer.<locals>.reindex¦
  s   ø€ Ø&)Ö* �E˜!“HÒ*Ð*ùÒ*s   †)r»   r  rŸ   rž   r,   )r0  r¡   r4  r£   r†  s       @ru   r=  zPermuteView.make_reindexer¡
  s}   ø€ Ü )¨$¯)©)Ó 4×5™˜˜1ˆq�!‰tÓ5ˆÜ$¤S¨¯©£^Ó4Ö5˜!ˆs�1‹vÒ5ˆÜ˜#‹¤*¬U´3°t·y±y³>Ó-BÓ"CÒCÐCÐCô	+ð ˆùó 6ùÚ5s   šBÁBNrß  )	ro   rp   rq   rr   rx  rR  r�  rÔ   r=  rs   rt   ru   r~  r~  €
  s:   … à
Óàñ.ó ð.ð" ñFó ðFó,órt   r~  c                  ó<   — e Zd Zeddœd„«       Zedd„«       Zdd„Zy)ÚSqueezeViewN)r  c          	     óŽ  — t        |«      �rt        |«      \  }}g }g }|�6t        |t        «      sJ d«       ‚d|k  r|t	        |j
                  «      k  sJ ‚t        t        |j
                  |j                  «      «      D ]g  \  }\  }}	|€)|dk7  sŒ|j                  |«       |j                  |	«       Œ4||k7  r#|j                  |«       |j                  |	«       Œ\|dk(  rŒbJ d«       ‚ t        |j                  |j                  |||j                  «      }
t        ||
¬«      S |€8t        j!                  ||j#                  «       D �cg c]
  }|dk7  sŒ	|‘Œ c}«      S |j#                  «       |   dk(  sJ ‚t        j!                  |t        |j#                  «       «      D ��cg c]  \  }}||k7  sŒ|‘Œ c}}«      S c c}w c c}}w )Nzexpected integer dim argumentr   r1   zexpected squeezed size to be 1r  )rÕ   r  rx   r„   rž   rÍ   r»   r§   rÎ   r  r  rÐ   rÏ   r  r  r{  rR  rÔ   )rS  rÈ   r  r  r  rs  r  r¡   rÍ   rÎ   r   rà   s               ru   rR  zSqueezeView.create®
  s¤  € ä  Õ#Ü"7¸Ó":ÑˆG�ZØˆHØˆJØˆÜ! #¤sÔ+ÐLÐ-LÓLÐ+Ø˜C’x C¬#¨j¯o©oÓ*>Ò$>Ð>Ð>ä%.¬s°:·?±?ÀJ×DUÑDUÓ/VÓ%Wò 
KÑ!�‘>�D˜&Ø�;Ø˜q“yØ Ÿ™¨Ô-Ø"×)Ñ)¨&Õ1à˜C’xØ Ÿ™¨Ô-Ø"×)Ñ)¨&Õ1à# q›yÐJÐ*JÓJ˜yð
Kô %Ø×!Ñ!Ø× Ñ ØØØ×!Ñ!óˆJô #¨¸
ÔCÐCàˆ;ä—;‘;˜q¨a¯j©j«lÖ"E¨¸aÀ1»f¢1Ò"EÓFÐFà—:‘:“< Ñ$¨Ò)Ð)Ð)Ü—;‘;˜q´¸1¿:¹:»<Ó1H×"U©¨¨AÈAÐQTËH¢1Ó"UÓVÐVùò #Fùó #Vs   Å
F<
ÅF<
Æ"GÆ0Gc                óº   ‡‡— | D �cg c]
  }|dk7  sŒ	|‘Œ }}t        | «      D ��cg c]  \  }}|dk7  sŒ|‘Œ c}}Št        | «      Šdˆˆfd„}||fS c c}w c c}}w )Nr1   c                óÎ   •— t        | «      t        ‰«      k(  sJ | › d‰› �«       ‚t        j                  j                  g‰z  }t	        ‰| «      D ]
  \  }}|||<   Œ t        |«      S )Nú )rž   r€   rX  rY  r§   rz   )r    rq  r¼   rà   ÚlengthÚnot_ones       €€ru   r£   z%SqueezeView.squeezer.<locals>.reindexÚ
  sk   ø€ Ü�u“:¤ W£Ò-ÐC°%°¸¸'¸Ð/CÓCÐ-ÜŸ™Ÿ™˜¨Ñ/ˆIÜ˜g uÓ-ò #‘��QØ!"�	˜#’ð#ä˜Ó#Ð#rt   )r    zlist[sympy.Expr]rŒ   ztuple[sympy.Expr, ...])r»   rž   )rÍ   rà   rs  r¡   r£   r�  rŽ  s        @@ru   ÚsqueezerzSqueezeView.squeezerÔ
  s]   ù€ à#Ö.˜! q¨A£v’AÐ.ˆÐ.Ü!*¨4£×;™˜˜A°A¸³F’1Ó;ˆÜ�T“ˆö	$ð ˜Ð Ð ùò /ùÛ;s   ‡
A’A¦A´Ac                ó   — t        d«      ‚)Nzuse SqueezeView.create())ÚAssertionError)r0  r  s     ru   r©  zSqueezeView.__init__ã
  s   € ÜÐ7Ó8Ð8rt   )rÍ   r  rÓ  )ro   rp   rq   rx  rR  r  r�  r©  rs   rt   ru   rˆ  rˆ  ¬
  s3   „ àØ"ó #Wó ð#WðJ ò!ó ð!ô9rt   rˆ  c                  óT   — e Zd ZU ded<   ded<   d„ Zdd„Zdd„ZeZed„ «       Z	dd	„Z
y
)ÚGenericViewrž  rÍ   r/  r£   c                ó   — | j                   S r’   )r£   r6  s    ru   r=  zGenericView.make_reindexerì
  ó   € Ø�|‰|Ðrt   c                ó  — t        t        | j                  «      «      D �cg c]  }t        t        j
                  |«      ‘Œ }}t        | j                  |«      «      }ddj                  t        t        |«      «      › d|› �S c c}w )Nzlambda ú, rç   )rŸ   rž   rÍ   rQ   r0   ry  ry   r£   rV  rT  r™   )r0  rZ  Ú	index_oldÚ	index_news       ru   Úreindex_strzGenericView.reindex_strï
  ss   € äCHÌÈTÏYÉYËÓCXö
Ø>?Ô*¬4¯:©:°qÕ9ð
ˆ	ð 
ô ˜Ÿ™ iÓ0Ó1ˆ	Ø˜Ÿ™¤3¤s¨IÓ#6Ó7Ð8¸¸9¸+ÐFÐFùò	
s   ¡!Bc                óz   — | j                  | j                  d| j                  › �d| j                  «       › �g«      S )Núsize=zreindex=)rZ  r  rÍ   rš  r6  s    ru   rH  zGenericView.__str__ö
  s=   € Ø�‰Ø�Y‰Y˜% §	¡	˜{Ð+¨x¸×8HÑ8HÓ8JÐ7KÐ-LÐMó
ð 	
rt   c                ó*   —  | |t        |«      |¬«      S )N©r  rÍ   r£   )ry   )rS  rÈ   rs  r£   s       ru   rR  zGenericView.createý
  s   € á˜¤ X£¸Ô@Ð@rt   c                ó   — | j                   S r’   rå  r6  s    ru   rÔ   zGenericView.get_size  ræ  rt   Nrð  rß  )ro   rp   rq   rr   r=  rš  rH  rw  rx  rR  rÔ   rs   rt   ru   r“  r“  ç
  s>   … à
ÓØÓòóGó
ð
 €HàñAó ðAôrt   r“  c                  ó\   — e Zd Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Z	y)r{  c                óø   — t        j                  | «      } t        j                  |«      }t        j                  j                  j
                  j                  } |t        j                  | d«      «      r| |z   } | S rx  )r€   rB  rV   rÑ   rÒ   r·   rr  ÚLt)r¼   rÍ   rr  s      ru   Úhandle_negative_indexzView.handle_negative_index  sZ   € ä�l‰l˜3ÓˆÜ�|‰|˜DÓ!ˆÜŸ™×(Ñ(×2Ñ2×@Ñ@ˆÙœŸ™ # qÓ)Ô*Ø˜‘*ˆCØˆ
rt   c                ó  ‡	— t        |t        t        f«      sJ ‚| j                  |j	                  «       |«      \  Š	}t
        j                  j                  j                  ‰	|«      r|S d}t        t        ‰	«      «      dkD  st        t        |«      «      dkD  rd}d|v rˆ	fd„} | |t        |«      |¬«      S t        |«      s|r¡|rBt        |«      s7t        j                  |t        j                  |j	                  «       «      «      }t!        |d¬«      \  }}t#        |j$                  |j&                  |t        j                  |«      |j(                  «      }t+        ||¬«      S | j-                  ‰	|«      } | |t        |«      |¬«      S )NFr   Tc                ó4   •— t        dgt        ‰«      z  «      S rx  )rz   rž   )r    rt  s    €ru   Úfake_reindexz!View.create.<locals>.fake_reindex"  s   ø€ Ü˜a˜S¤3 x£=Ñ0Ó1Ð1rt   rž  )r.  r  )rx   rz   ry   Úresolve_negative_sizerÔ   rV   rÑ   rÒ   Ústatically_known_list_equalsrž   r&   r+  ÚExternKernelÚrequire_exact_stridesr×   rØ   r  r  rÐ   rÏ   r  r  r|  )
rS  rÈ   rs  Úunbacked_symbols_in_sizesr¦  r  r  r   r£   rt  s
            @ru   rR  zView.create  sd  ø€ ä˜(¤U¬D MÔ2Ð2Ð2Ø ×6Ñ6°q·z±z³|ÀXÓNÑˆ�(ô �7‰7×Ñ×8Ñ8¸À8ÔLØˆHà$)Ð!äÔ% hÓ/Ó0°1Ò4ÜÔ(¨Ó2Ó3°aÒ7à(,Ð%à�‰=ô2ñ ˜A¤D¨£N¸LÔIÐIä-¨aÔ0Ñ4MÙ(Ô2RÐSTÔ2Uô !×6Ñ6Ø”~×8Ñ8¸¿¹»ÓFó�ô #8¸È4Ô"PÑˆG�ZÜ$Ø×!Ñ!Ø× Ñ ØÜ×1Ñ1°(Ó;Ø×!Ñ!óˆJô #¨¸
ÔCÐCà×-Ñ-¨h¸ÓAˆÙ˜¤ X£¸Ô@Ð@rt   c                óF  — |D �cg c]+  }t         j                  j                  j                  |«      ‘Œ- }}| D �cg c]+  }t         j                  j                  j                  |«      ‘Œ- } }t	        |«      }t        t        |«      «      D ]J  }||   dk(  sŒt        j                  j                  ||<   t        t        | «      t        |«      «      ||<    n t         j                  j                  j                  t        | «      t        |«      «       | |fS c c}w c c}w )Nrþ   )rV   rÑ   rÒ   rY  ry   rŸ   rž   r€   rX  ÚOner-   rR   Úguard_equals)rt  rs  rÈ   r¡   s       ru   r§  zView.resolve_negative_size?  sç   € à:BÖC°Q”A—G‘G×$Ñ$×-Ñ-¨aÕ0ÐCˆÐCØ:BÖC°Q”A—G‘G×$Ñ$×-Ñ-¨aÕ0ÐCˆÐCä˜“>ˆÜ”s˜8“}Ó%ò 	ˆAØ˜‰{˜bÓ Ü#Ÿg™gŸk™k�˜‘Ü&¤}°XÓ'>ÄÈhÓ@WÓX�˜‘Ùð		ô 	
�‰×Ñ×%Ñ%¤m°HÓ&=¼}ÈXÓ?VÔWØ˜Ð!Ð!ùò DùÚCs
   …0D»0Dc                óÐ   — 	 | j                  ||«      }|S # t        t        f$ r@ t        |«      g}| j                  ||«      }| j                  ||«      }t	        ||«      }Y |S w xY wr’   )Ú_dynamic_reshape_indexerr‘  Ú
IndexErrorrR   r±   )rS  rt  rs  r£   Úflatr¯   r°   s          ru   r|  zView.dynamic_reshape_indexerN  sx   € ð	:Ø×2Ñ2°8¸XÓFˆGð ˆøô ¤
Ð+ò 	:ä! (Ó+Ð,ˆDØ×3Ñ3°H¸dÓCˆHØ×3Ñ3°D¸(ÓCˆHÜ% h°Ó9‰GØˆð	:ús   ‚ –AA%Á$A%c                óF  ‡‡— t         j                  j                  j                  }t	        t        |«      «      D �cg c]  }t        t        j                  |«      ‘Œ c}Št        t        ‰|«      «      }t        | «      }g Š|�r=|�r:|j                  «       }|j                  «       \  }}|dk(  r>‰j                  t        j                  j                  «       |j                  ||f«       �nÎ|dk(  r|j                  |«       �n¶ ||«       ||«      k(  r=‰j                  |«       t         j                  j                  j!                  ||«       �nh ||«       ||«      k  r ||«       ||«      k  r2|j                  «       \  }	}
|	|z  |z   }||
z  } ||«       ||«      k  rŒ2‰j                  |«       t         j                  j                  j!                  ||«       nØ ||«       ||«      kD  rÁt        j                  j"                  }|}‰j                  t%        |||«      «       ||z  } ||«       ||«      kD  rH|j                  «       }‰j                  t%        |||«      «       ||z  }||z  } ||«       ||«      kD  rŒHt         j                  j                  j!                  ||«       nt&        ‚|r|r�Œ:|rf|j                  «       }t         j                  j                  j!                  |d«       ‰j                  t        j                  j                  «       |rŒf|r@|j                  «       \  }}t         j                  j                  j!                  |d«       |rŒ@‰j)                  «        t        ‰«      t        | «      k(  sJ ‚ˆˆfd„}|S c c}w )zG
        Perform a reshape entirely by modifying indexing math
        r1   c                ó¼   •‡— t        | «      t        ‰«      k(  sJ t        | «      t        ‰«      f«       ‚t        t        ‰| «      «      Št        ˆfd„‰D «       «      S )Nc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr’   )rS   )rû   rÈ   Úreplacementss     €ru   rý   zAView._dynamic_reshape_indexer.<locals>.reindex.<locals>.<genexpr>™  s   øè ø€ ÒH¸œ A |×4ÑHùs   ƒ)rž   r{   r§   rz   )r    r¶  r�  Ú	view_exprs    @€€ru   r£   z.View._dynamic_reshape_indexer.<locals>.reindex–  sM   ù€ Ü�u“:¤ T£Ò*ÐC¬S°«Z¼¸T»Ð,CÓCÐ*Ü¤ D¨%Ó 0Ó1ˆLÜÓH¸iÔHÓHÐHrt   )rV   rÑ   rÒ   rÓ   rŸ   rž   rQ   r0   ÚVIEWry   r§   rQ  r  r€   rX  rY  r®  r­  r/   r‘  Úreverse)rt  rs  rÓ   r¡   Ú	stack_newÚ	stack_oldÚsize_oldÚvarÚsize_newÚvar2Ú	size_new2ÚdivisorÚmodulusr£   r�  r·  s                 @@ru   r°  zView._dynamic_reshape_indexerZ  s	  ù€ ô
 —G‘G×$Ñ$×.Ñ.ˆ	ô CHÌÈHËÓBVö
Ø=>Ô*¬4¯9©9°aÕ8ò
ˆô œ˜T 8Ó,Ó-ˆ	Ü˜“Nˆ	àˆ	ÚšIØ —}‘}“ˆHØ%ŸM™M›O‰MˆC�Ø˜1Š}Ø× Ñ ¤§¡§¡Ô.Ø× Ñ  # x Ö1Ø˜Q’Ø× Ñ  Ö*Ù˜8Ó$©	°(Ó(;Ò;Ø× Ñ  Ô%Ü—‘× Ñ ×-Ñ-¨h¸ÖAÙ˜8Ó$¡y°Ó':Ò:Ù Ó)©I°hÓ,?Ò?Ø&/§m¡m£o‘O�D˜)Ø ™/¨CÑ/�CØ'¨)Ñ3�Hñ   Ó)©I°hÓ,?Ó?ð × Ñ  Ô%Ü—‘× Ñ ×-Ñ-¨h¸ÕAÙ˜8Ó$¡y°Ó':Ò:ÜŸ'™'Ÿ+™+�Ø"�Ø× Ñ ¤°°g¸wÓ!GÔHØ! GÑ+�Ù Ó)©I°hÓ,?Ò?Ø'Ÿm™m›o�GØ×$Ñ$¤_°S¸'À7Ó%KÔLØ%¨Ñ/�GØ'¨'Ñ1�Hñ	   Ó)©I°hÓ,?Ó?ô
 —‘× Ñ ×-Ñ-¨h¸ÕAä$Ð$ñ= ›Iñ@ Ø —}‘}“ˆHÜ�G‰G×Ñ×)Ñ)¨(°AÔ6Ø×ÑœUŸW™WŸ\™\Ô*ò ñ
 Ø%ŸM™M›O‰MˆC�Ü�G‰G×Ñ×)Ñ)¨(°AÔ6ò ð 	×ÑÔÜ�9‹~¤ X£Ò.Ð.Ð.õ	Ið
 ˆùòs
s   ½!NN)
ro   rp   rq   r  r£  rx  rR  r§  r|  r°  rs   rt   ru   r{  r{    si   „ àñó ðð ñ,Aó ð,Að\ ñ"ó ð"ð ñ	ó ð	ð ñ@ó ñ@rt   r{  c                  ó¨   ‡ — e Zd ZU dZded<   dˆ fd„Zdd„ZeZd„ Zdd„Z	dd„Z
ed	„ «       Zdd
„Zd„ Zdd„Zdd„Zdd„Zd„ Zdd„Zddd„Zdd„Zˆ xZS )r  z*Pretend our storage has a different layoutrm  r  c                ó¶   •— t         ‰| �  «        t        | j                  t        «      r0t
        j                  | d| j                  j                  «       «       y y )Nr  )rB  r7  rx   r  r8  r˜   r/  r¤  rC  s    €ru   r7  zReinterpretView.__post_init__¤  s@   ø€ Ü‰ÑÔÜ�d—i‘i¤Ô*Ü×Ñ˜t V¨T¯Y©Y×-BÑ-BÓ-DÕEð +rt   c                óP   — | j                  | j                  | j                  g«      S r’   )rZ  r  r  r6  s    ru   rH  zReinterpretView.__str__©  s&   € Ø�‰à—	‘	Ø—‘ðó
ð 	
rt   c                ó6   — | j                   j                  «       S r’   rM  r6  s    ru   r•  zReinterpretView.get_name³  rN  rt   c                ó.   — | j                   j                  S r’   )r  rÐ   r6  s    ru   rÚ   zReinterpretView.get_device¶  s   € Ø�{‰{×!Ñ!Ð!rt   c                 ó   — y r’   rs   r6  s    ru   rG  zReinterpretView.get_origin_node¹  rK  rt   c                ó.   — | j                   j                  S r’   )r  rÏ   r6  s    ru   rÏ   zReinterpretView.dtype¼  s   € à�{‰{× Ñ Ð rt   c                ó@   — t        | j                  j                  «      S r’   )ry   r  rÍ   r6  s    ru   rÔ   zReinterpretView.get_sizeÀ  s   € Ü�D—K‘K×$Ñ$Ó%Ð%rt   c                ó@   — t        | j                  j                  «      S r’   )ry   r  rÎ   r6  s    ru   rú   zReinterpretView.get_strideÃ  s   € Ü�D—K‘K×&Ñ&Ó'Ð'rt   c                ó   ‡ — dˆ fd„}|S )Nc                óT  •— ‰j                   j                  «       }t        j                  ‰j	                  «        || «      «      }‰j                   j
                  ‰j                  j
                  k7  r5t        j                  |‰j
                  ‰j                  j
                  «      S |S r’   )r  r‘  rT   Úloadr•  rÏ   r  Úto_dtype_bitcast)r    rŽ  Ú
tmp_loaderr0  s      €ru   r�  z+ReinterpretView.make_loader.<locals>.loaderÇ  sp   ø€ Ø—k‘k×.Ñ.Ó0ˆGÜŸ™ $§-¡-£/±7¸5³>ÓBˆJØ�{‰{× Ñ  D§I¡I§O¡OÒ3Ü×+Ñ+¨J¸¿
¹
ÀDÇIÁIÇOÁOÓTÐTà!Ð!rt   ©r    rà  rŒ   rU   rs   ©r0  r�  s   ` ru   rŽ  zReinterpretView.make_loaderÆ  s   ø€ õ	"ð ˆrt   c                ó6   — | j                   j                  «       S r’   )r  r‘  r6  s    ru   r‘  zReinterpretView.make_indexerÑ  ó   € Ø�{‰{×'Ñ'Ó)Ð)rt   c                ó   — | j                   S r’   ©r  r6  s    ru   rÖ   zReinterpretView.get_layoutÔ  rK  rt   c                 ó   — y r’   rs   r6  s    ru   r¦  zReinterpretView.freeze_layout×  r   rt   c                óÀ   — t        | j                  j                  «      t        | j                  j                  «      z  t        | j                  j                  «      z  S r’   )r&   r  rÍ   rÎ   r  r6  s    ru   rÁ  z(ReinterpretView.get_unbacked_symbol_usesÚ  sG   € ä! $§+¡+×"2Ñ"2Ó3Ü# D§K¡K×$6Ñ$6Ó7ñ8ä# D§K¡K×$6Ñ$6Ó7ñ8ð	
rt   c                ót  — t         j                  j                  j                  | j                  | j
                  j                  | j
                  j                  | j
                  j                  |�|j                  n#t         j                  j                  j                  | j
                  j                  ¬«      S r…  )rV   rÑ   Úwrapper_codeÚcodegen_reinterpret_viewr  r  rÍ   rÎ   r  Ú	writelinerÏ   r�  s     ru   rƒ  z!ReinterpretView.codegen_referenceá  s�   € ô �w‰w×#Ñ#×<Ñ<Ø�I‰IØ�K‰K×ÑØ�K‰K×ÑØ�K‰K×ÑØ &Ð 2ˆF×Ò¼¿¹×8LÑ8L×8VÑ8VØ—+‘+×#Ñ#ð =ó 
ð 	
rt   c                 ó   — yrW  rs   r6  s    ru   r½  zReinterpretView.num_readsî  ó   € Ørt   rÓ  rð  ræ  rÖ  rß  rê  rì  rÜ  r,  r’   rå  rþ  )ro   rp   rq   Ú__doc__rr   r7  rH  rw  r•  rÚ   rG  r  rÏ   rÔ   rú   rŽ  r‘  rÖ   r¦  rÁ  rƒ  r½  rz  r{  s   @ru   r  r  ž  sm   ø… á4àƒNõFó

ð €Hò$ó"óð ñ!ó ð!ó&ò(ó	ó*óòó
ô
÷rt   r  c                  óX   — e Zd ZU dZded<   ed„ «       Zd
d„ZeZe	d„ «       Z
dd„Zdd„Zy	)Ú	DtypeViewz(Pretend our storage has a different typerÛ  Útarget_dtypec                óÖ   — t        |«      rRt        |«      \  }}t        |j                  ||j                  |j
                  |j                  «      }t        ||¬«      S t        ||¬«      S )Nr  )r  râ  )	rÕ   r  r  rÐ   rÍ   rÎ   r  r  rá  )rS  rÈ   Ú	new_dtyper  r  r   s         ru   rR  zDtypeView.createø  sd   € ä  Ô#Ü"7¸Ó":ÑˆG�ZÜ$Ø×!Ñ!ØØ—‘Ø×!Ñ!Ø×!Ñ!óˆJô #¨¸
ÔCÐCÜ˜a¨iÔ8Ð8rt   c                óP   — | j                  | j                  | j                  g«      S r’   )rZ  r  râ  r6  s    ru   rH  zDtypeView.__str__  s    € Ø�‰ §	¡	¨4×+<Ñ+<Ð=Ó>Ð>rt   c                ó   — | j                   S r’   )râ  r6  s    ru   rÏ   zDtypeView.dtype  s   € à× Ñ Ð rt   c                ó6   — | j                   j                  «       S r’   ©r  rÔ   r6  s    ru   rÔ   zDtypeView.get_size  rN  rt   c                óJ   ‡ ‡— ‰ j                   j                  «       Šˆˆ fd„}|S )Nc                óz   •— t        j                   ‰| «      ‰j                  ‰j                  j                  «      S r’   )rT   rÏ  râ  r  rÏ   )r¼   rA  r0  s    €€ru   r�  z%DtypeView.make_loader.<locals>.loader  s*   ø€ Ü×'Ñ'©¨c«
°D×4EÑ4EÀtÇyÁyÇÁÓWÐWrt   ©r  rŽ  )r0  r�  rA  s   ` @ru   rŽ  zDtypeView.make_loader  s"   ù€ Ø—	‘	×%Ñ%Ó'ˆõ	Xð ˆrt   Nrð  rß  rê  )ro   rp   rq   rß  rr   rx  rR  rH  rw  r  rÏ   rÔ   rŽ  rs   rt   ru   rá  rá  ò  sE   … á2àÓàñ9ó ð9ó?ð €Hàñ!ó ð!ó$ôrt   rá  c                  ó.   — e Zd Zed„ «       Zedd„«       Zy)Ú	SliceViewc                óT  ‡ ‡‡‡‡	‡
— t         j                  j                  Š
|j                  «       |   Št	        d„ ||‰fD «       «      r!t
        j                  Š	t
        j                  Šn‰
j                  Š	‰
j                  Šˆˆ	ˆ
fd„Šˆˆ ˆfd„} ||d‰d«      } |||‰‰«      }||fS )zz
        Normalize start and end such that both are in the range
        [0, x.get_size()[dim]] and start <= end.
        c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   r4  ©rû   rÈ   s     ru   rý   z0SliceView.normalize_start_end.<locals>.<genexpr>%  s   è ø€ ÒH¨AÔ$ Q×'ÑHùr7  c                ó€   •— ‰j                  | |«      r| n ‰| |«      }‰j                  ||«      r|}|S  ‰||«      }|S r’   )Ústatically_known_geqr  )rÈ   ÚlowerÚupperÚclamped_lowerÚclamped_fullÚmax_funcÚmin_funcrÒ   s        €€€ru   Úclampz,SliceView.normalize_start_end.<locals>.clamp,  s`   ø€ à×2Ñ2°1°eÔ<‘Á(È1ÈeÓBTð ð
 ×0Ñ0°ÀÔFð ð ð
  Ðñ ˜m¨UÓ3ð ð
  Ðrt   c                óD   •— | €|S ‰j                  | ‰«      }  ‰| ||«      S r’   )r£  )rN  ró  rô  rw  rù  rS  Údim_sizes       €€€ru   Ú
clamp_wrapz1SliceView.normalize_start_end.<locals>.clamp_wrap7  s.   ø€ Øˆ{Ø�Ø×+Ñ+¨C°Ó:ˆCÙ˜˜e UÓ+Ð+rt   r   )
rV   rÑ   rÒ   rÔ   r¨  r€   ÚMinÚMaxÚevaluate_minÚevaluate_max)rS  rÈ   r  ÚstartÚendrü  rù  rû  r÷  rø  rÒ   s   `     @@@@@ru   Únormalize_start_endzSliceView.normalize_start_end  s—   ý€ ô —7‘7×#Ñ#ˆØ—:‘:“< Ñ$ˆäÑH°%¸¸hÐ1GÔHÔHÜ—y‘yˆHÜ—y‘y‰Hà×,Ñ,ˆHØ×,Ñ,ˆHö		 ö	,ñ ˜5 ! X¨qÓ1ˆÙ˜˜e X¨xÓ8ˆØ�cˆzÐrt   c           	     ó„  ‡‡‡‡— t        j                  ‰«      Št        ‰t         j                  «      s‰dkD  sJ ‚	 ‰dk(  r|dk\  r‰dk(  r|S t        |j                  «       «      Š|r| j                  |‰‰|«      \  Š}t        |‰z
  ‰dz
  z   ‰«      ‰‰<   t        |«      r{t        |«      \  }}t        |j                  «      }	|	‰   ‰z  |	‰<   t        |j                  |j                  ‰|	|j                  |j                  ‰   ‰z  z   «      }
t!        ||
¬«      S ˆˆˆˆfd„}t#        |‰|¬«      S # t        $ r Y Œñw xY w)Nr   l   ÿÿÿÿ r1   r  c                ó‚   •— t        | «      t        ‰«      k(  sJ d| › d‰› �«       ‚t        | «      } | ‰   ‰z  ‰z   | ‰<   | S )Nzwrong ndim rŒ  )rž   ry   )r    r  rs  r  Ústeps    €€€€ru   r£   z!SliceView.create.<locals>.reindexc  sP   ø€ Ü�u“:¤ X£Ò.ÐP°+¸e¸WÀAÀhÀZÐ0PÓPÐ.Ü˜“KˆEØ˜s™ dÑ*¨UÑ2ˆE�#‰JØˆLrt   rž  )r€   rB  rx   r   Ú	TypeErrorry   rÔ   r  r.   rÕ   r  rÎ   r  rÐ   rÏ   r  r  rí  )rS  rÈ   r  r  r  r  rù  r  r  r  r   r£   rs  s     `` `      @ru   rR  zSliceView.createA  sJ  û€ ä�|‰|˜DÓ!ˆÜ˜$¤§
¡
Ô+¨t°aªxÐ7Ð7ð	Ø˜Šz˜c YÒ.°4¸1²9Ø�ô ˜Ÿ
™
›Ó%ˆñ
 Ø×0Ñ0°°C¸ÀÓD‰JˆE�3ä   u¡°°q±Ñ!9¸4Ó@ˆ�‰ä  Ô#ä"7¸Ó":ÑˆG�ZÜ˜j×/Ñ/Ó0ˆJØ(¨™o°Ñ4ˆJ�s‰OÜ$Ø×!Ñ!Ø× Ñ ØØØ×!Ñ! J×$5Ñ$5°cÑ$:¸UÑ$BÑBóˆJô #¨¸
ÔCÐC÷	ô ˜a h¸Ô@Ð@øôE ò 	Ùð	ús   ¼D3 Ä3	D?Ä>D?N)r1   T)ro   rp   rq   rx  r  rR  rs   rt   ru   rí  rí    s+   „ Øñ"ó ð"ðH ò(Aó ñ(Art   rí  c                  óB   — e Zd ZU ded<   ded<   d
d„Zdd„Zdd„Zdd„Zy	)ÚBaseConstantrÛ  rÏ   ré  rÐ   c                 ó   — y©Nrs   rs   r6  s    ru   rÔ   zBaseConstant.get_sizer  s   € Ørt   c                ó   — | j                   S r’   rJ  r6  s    ru   rÚ   zBaseConstant.get_deviceu  rK  rt   c                 ó   — y r’   rs   r6  s    ru   rG  zBaseConstant.get_origin_nodex  rK  rt   c                ó   — t        «       S r’   r+   r6  s    ru   r@  zBaseConstant.get_reads{  r&  rt   Nrß  ræ  rÖ  rý  )ro   rp   rq   rr   rÔ   rÚ   rG  r@  rs   rt   ru   r	  r	  m  s"   … àÓØÓóóóôrt   r	  c                  óD   — e Zd ZU ded<   ded<   ded<   dd„Zdd„Zdd	„Zy
)ÚConstantr   rä   rÛ  rÏ   ré  rÐ   c                ó   ‡ — dˆ fd„}|S )Nc                óX   •— t        j                  ‰j                  ‰j                  «      S r’   )rT   r  rä   rÏ   ©r    r0  s    €ru   r�  z$Constant.make_loader.<locals>.loader†  s   ø€ Ü—<‘< §
¡
¨D¯J©JÓ7Ð7rt   rÑ  rs   rÒ  s   ` ru   rŽ  zConstant.make_loader…  s   ø€ õ	8ð ˆrt   c                 ó   — y r’   rs   r6  s    ru   r  zConstant.realize‹  r   rt   c                óF   — t        | j                  | j                  |¬«      S )N)rä   rÏ   rÐ   )r  rä   rÏ   r†  s     ru   rË  zConstant.constant_to_deviceŽ  s   € Ü˜dŸj™j°·
±
À6ÔJÐJrt   Nrê  rã  r  )ro   rp   rq   rr   rŽ  r  rË  rs   rt   ru   r  r    s#   … àƒJØÓØÓóóôKrt   r  c                  ó<   — e Zd ZU ded<   ded<   ded<   d
d„Zdd„Zy	)ÚIndexingConstantr   r    rÛ  rÏ   ré  rÐ   c                ó   ‡ — dˆ fd„}|S )Nc                óX   •— t        j                  ‰j                  ‰j                  «      S r’   )rT   rC  r    rÏ   r  s    €ru   r�  z,IndexingConstant.make_loader.<locals>.loader™  s   ø€ Ü—>‘> $§*¡*¨d¯j©jÓ9Ð9rt   rÑ  rs   rÒ  s   ` ru   rŽ  zIndexingConstant.make_loader˜  s   ø€ õ	:ð ˆrt   c                óF   — t        | j                  | j                  |¬«      S )N)r    rÏ   rÐ   )r  r    rÏ   r†  s     ru   rË  z#IndexingConstant.constant_to_devicež  s   € Ü d§j¡j¸¿
¹
È6ÔRÐRrt   Nrê  r  )ro   rp   rq   rr   rŽ  rË  rs   rt   ru   r  r  ’  s   … àƒJØÓØÓóôSrt   r  c           	     ób   — t        d„ t        | t        j                  |«      |«      D «       «      S )Nc              3  ó<   K  — | ]  \  }}}|d k(  xs ||k(  –— Œ y­wr  rs   )rû   ÚleftÚrightrÍ   s       ru   rý   z2is_contiguous_strides_for_shape.<locals>.<genexpr>¥  s.   è ø€ ò áˆD�%˜ð 	�‰	Ò"�T˜U‘]Ó"ñùó   ‚)r   r§   r×   rØ   )rÎ   r
  s     ru   Úis_contiguous_strides_for_shaper   ¢  s5   € ô ñ ä!$Ø”N×5Ñ5°eÓ<¸eó"
ôó ð rt   c                ó<   — t         j                  | j                  z  S r’   )r2   Úpadding_alignment_bytesÚitemsizer\  s    ru   Úget_align_for_dtyper$  ­  s   € Ü×)Ñ)¨U¯^©^Ñ;Ð;rt   c                  ó    — e Zd ZdZdd„Zdd„Zy)ré   zxAbstract base for Layout, MultiOutputLayout, NoneLayout.
    Represents the memory layout of the output of an Operation.c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   rÚ   zOutputSpec.get_deviceµ  r�  rt   c                ó>   — t        t        | «      j                  «      ‚r’   r�  r6  s    ru   Ústorage_sizezOutputSpec.storage_size¸  r�  rt   Nræ  rþ  )ro   rp   rq   rß  rÚ   r(  rs   rt   ru   ré   ré   ±  s   „ ñCó7ô7rt   ré   c                  óÆ   — e Zd Zd ed«      f	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„ZeZdd„Zdd„Ze		 	 	 	 	 	 dd„«       Z
dd„Zdd	„Zd
„ Ze	d„ «       Zd„ Zd„ Zd„ Zdd„Zdd„Zdd„Zy)rm  Nr   c                óè   — |€t         j                  |«      }|| _        || _        t	        |«      t	        |«      k(  sJ d|› d|› �«       ‚t        d„ |D «       «      sJ ‚|| _        || _        || _        y )Nrœ  ú	, stride=c              3  óH   K  — | ]  }t        |t        t        f«      –— Œ y ­wr’   )rx   r   r„   r  s     ru   rý   z"Layout.__init__.<locals>.<genexpr>Ë  s   è ø€ Ò<°!”:˜a¤$¬ ×-Ñ<ùó   ‚ ")	r×   rØ   rÐ   rÏ   rž   r   rÍ   rÎ   r  )r0  rÐ   rÏ   rÍ   rÎ   r  s         ru   r©  zLayout.__init__¾  sx   € ð ˆ>Ü#×6Ñ6°tÓ<ˆFØˆŒØˆŒ
Ü�4‹yœC ›KÒ'ÐH¨5°°°iÀ¸xÐ)HÓHÐ'ÜÑ<°tÔ<Ô<Ð<Ð<Ø $ˆŒ	Ø"(ˆŒØ"ˆ�rt   c                óX  — d}| j                   dk7  rd| j                   › �}| j                  j                  €dnd| j                  j                  › �}t        | «      j                  › d| j                  j                  › |› d| j
                  › d| j                  › d| j                  › |› d	�S )
NrM  r   z	, offset=ú:z('z', z, size=r+  rè   )r  rÐ   r    r‡   ro   rÏ   rÍ   rÎ   )r0  r  Údevice_index_strs      ru   rH  zLayout.__str__Ð  s¦   € ØˆØ�;‰;˜!ÒØ  §¡ Ð.ˆFà!%§¡×!2Ñ!2Ð!:™2À!ÀDÇKÁK×DUÑDUÐCVÐ@WÐä�D‹z×"Ñ"Ð# 2 d§k¡k×&6Ñ&6Ð%7Ð8HÐ7IÈÈTÏZÉZÈLð YØ—I‘I�;˜i¨¯© }°V°H¸Að?ð	
rt   c                ó   — | j                   S r’   rJ  r6  s    ru   rÚ   zLayout.get_deviceÝ  rK  rt   c                óB   — t        | j                  | j                  «      S r’   )r   rÎ   rÍ   r6  s    ru   r)  zLayout.is_contiguousà  s   € Ü.¨t¯{©{¸D¿I¹IÓFÐFrt   c                óŒ   — t        | «      }|dvs| d   dk(  ryt        |t        | «      | «      D ]  \  }}}|dk7  sŒ||k7  sŒ y y)N)r´   é   r1   FT)rž   r§   r"   )r
  r  Úndimr  r  rÍ   s         ru   Úis_channels_last_contiguousz"Layout.is_channels_last_contiguousã  sa   € ô �5‹zˆØ�vÑ  q¡¨Q¢ØÜ!$ØÔ3°EÓ:¸Eó"
ò 	ÑˆD�%˜ð �q‹y˜T U›]Ùð		ð
 rt   c                óâ   — t        | j                  t        t        j	                  t        t        | j                  «      «      «      «      | j                  «      D ]  \  }}}|dk7  sŒ||k7  sŒ y y)Nr1   FT)r§   rÎ   Úreversedr×   rØ   ry   rÍ   )r0  r  r  rÍ   s       ru   Úis_transposedzLayout.is_transposedñ  sc   € Ü!$Ø�K‰KÜ”^×6Ñ6´t¼HÀTÇYÁYÓ<OÓ7PÓQÓRØ�I‰Ió"
ò 	ÑˆD�%˜ð
 �q‹y˜T U›]Ùð	ð rt   c                óÖ  — t        | j                  «      t        |«      k(  sJ ‚t        | j                  «      D ��cg c]5  \  }}t        j
                  j                  j                  |d¬«      dk7  r|‘Œ7 }}}|D �cg c]  }| j                  |   ‘Œ }}|D �cg c]  }||   ‘Œ	 }}d„ } ||«      }dgt        |«      z  }t        t        |«      «      D ]  }||   |||   <   Œ t        t        |«      dz
  «      D ][  }||   ||dz      kD  }t        |t        «      s7t        j
                  j                  j                  ||   ||dz      kD  d¬«      }|sŒ[ y yc c}}w c c}w c c}w )	Nr³   rp  r1   c                ó`   — t        | «      }| D �cg c]  }|j                  |«      ‘Œ c}S c c}w r’   )r  r    )ÚarrÚ
sorted_arrÚelements      ru   Úsorted_indicesz0Layout.is_stride_ordered.<locals>.sorted_indices  s*   € Ü ›ˆJØ=@ÖA°'�J×$Ñ$ WÕ-ÒAÐAùÒAs   �+rþ   Trn  F)rž   rÎ   r»   rÍ   rV   rÑ   rÒ   rÓ   rŸ   rx   rl   Ú
_shape_envrr  )	r0  r¨   r¡   r  Únon_1_indicesrÎ   r?  Ústride_orderedÚexprs	            ru   r5  zLayout.is_stride_orderedû  s~  € Ü�4—;‘;Ó¤3 u£:Ò-Ð-Ð-ô
 $ D§I¡IÓ.÷
á��3Ü�w‰w×Ñ×)Ñ)¨#¸Ð)Ó:¸aÒ?ò ð
ˆñ 
ð +8Ö8 Q�$—+‘+˜a“.Ð8ˆÐ8Ø#0Ö1˜a��q“Ð1ˆÐ1ò	Bñ
 ˜uÓ%ˆð ˜¤ E£
Ñ*ˆÜ”s˜5“zÓ"ò 	1ˆAØ'-¨a¡yˆN˜5 ™8Ò$ð	1ô ”s˜5“z A‘~Ó&ò 	ˆAØ! !Ñ$ ~°a¸!±eÑ'<Ñ<ˆDÜ˜d¤DÔ)Ü—w‘w×)Ñ)×7Ñ7Ø" 1Ñ%¨°q¸1±uÑ(=Ñ=Èdð 8ó �ò Ùð	ð ùó;
ùò 9ùÚ1s   ¼:EÁ=E!ÂE&c                ó²   — dgt        t        t        dt        | j                  «      dz
  «      «      «      z   }t        |«      g|z   }| j                  |«      S ©Nr   r1   )ry   r8  rŸ   rž   rÎ   r5  r­  s     ru   Úis_channels_last_stride_orderedz&Layout.is_channels_last_stride_ordered  sN   € à�”dœ8¤E¨!¬S°·±Ó-=ÀÑ-AÓ$BÓCÓDÑDˆÜ�U“�˜uÑ$ˆØ×%Ñ% eÓ,Ð,rt   c                óÖ  — t        |«      }t        | «      dk(  r| S t        j                  st        j                  || «      r| S t        j                  «       }t        |d«      r|j                  j                  dd«      r| S t        d„ t        j                  | |«      D «       «      s| S t        | «      }t        |«      }t!        t        | «      «      D �cg c]  }d‘Œ }}d||d   <   d}	t#        |dd d¬«      D ]I  \  }
}||
dz
     }||   ||   z  }|t        j$                  kD  r||z  dk7  rt'        ||«      |z  }d	}	|||<   ŒK |	s| S t(        xj*                  dz  c_        |S c c}w )
zŽ
        The padding does not change stride order but makes sure all strides larger
        than the threshold are multiple of align.
        r   ÚmetaÚdislike_paddingFc              3  ó\   K  — | ]$  }t        |t        t        j                  f«      –— Œ& y ­wr’   )rx   r„   r€   r   r  s     ru   rý   z&Layout._pad_strides.<locals>.<genexpr>>  s(   è ø€ ò 
àô �qœ3¤§¡Ð.×/ñ
ùó   ‚*,r1   N)r  T)r$  rž   r2   Úpad_channels_lastrm  r6  rV   Úget_current_noder  rH  Úgetr   r=  ÚchainrÅ   rÀ   rŸ   r»   Úpadding_stride_thresholdrG   r   Únum_comprehensive_padding)Ú
in_stridesrÍ   rÏ   ÚalignÚcurrent_fx_noder/  r¿   rÂ   Únew_stridesÚpaddedÚrankr¼   Úprev_idxrÎ   s                 ru   Ú_pad_strideszLayout._pad_strides$  s�  € ô $ EÓ*ˆÜˆz‹?˜aÒØÐä×'Ò'¬F×,NÑ,NØ�*ô-
ð Ðä×,Ñ,Ó.ˆÜ�? FÔ+°×0DÑ0D×0HÑ0HØ˜uô1
ð Ðô ñ 
ä—_‘_ Z°Ó6ô
ô 
ð Ðä'¨
Ó3ˆÜ,¨\Ó:ˆ
ä"'¬¨J«Ó"8Ö9˜Q’qÐ9ˆÐ9ð &'ˆ�J˜q‘MÑ"àˆÜ" :¨a¨b >¸Ô;ò 	&‰IˆD�#Ø! $¨¡(Ñ+ˆHØ  Ñ*¨T°(©^Ñ;ˆFàœ×7Ñ7Ò7¸FÀU¹NÈaÒ<OÜ  ¨Ó/°%Ñ7�Ø�Ø%ˆK˜Òð	&ñ ð Ðä×)Ò)¨QÑ.Õ)ØÐùò- :s   Ã	E&c                ó°   — t        | t        «      sJ ‚| j                  €J ‚| j                  | j                  | j                  | j
                  «      | _        y r’   )rx   r×   rÎ   rY  rÍ   rÏ   r6  s    ru   r(  zLayout.pad_strides_  sD   € Ü˜$¤Ô/Ð/Ð/Ø�{‰{Ð&Ð&Ð&Ø×'Ñ'¨¯©°T·Y±YÀÇ
Á
ÓKˆ�rt   c                óF   — t         j                  xr t        | t        «      S r’   )r2   Úcomprehensive_paddingrx   r×   r6  s    ru   r'  zLayout.should_pad_stridesd  s   € Ü×+Ñ+ÒP´
¸4ÄÓ0PÐPrt   c                óè   — t        | t        «      r| S | j                  «       r| j                  «        t        | j                  | j
                  | j                  | j                  | j                  «      S r’   )	rx   r  r'  r(  rÐ   rÏ   rÍ   rÎ   r  r6  s    ru   Úas_fixedzLayout.as_fixedg  sY   € Ü�dœKÔ(ØˆKà×"Ñ"Ô$Ø×ÑÔÜØ�K‰KØ�J‰JØ�I‰IØ�K‰KØ�K‰Kó
ð 	
rt   c                óš   — t         j                  sJ dt        | «      j                  › d�«       ‚| j	                  «       j                  «       S )Nzconvert z to FixedLayout first)r×   r^  r‡   ro   r^  r‘  r6  s    ru   r‘  zLayout.make_indexeru  sG   € Ü×,Ò,ð 	
Ø”t˜D“z×*Ñ*Ð+Ð+@ÐAó	
Ð,ð �}‰}‹×+Ñ+Ó-Ð-rt   c                ó  — | j                   |j                   k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r’   ©rÐ   rÏ   rÍ   rÎ   r  )r0  Úothers     ru   Ú__eq__zLayout.__eq__{  so   € à�K‰K˜5Ÿ<™<Ñ'ò ,Ø—
‘
˜eŸk™kÑ)ò,à—	‘	˜UŸZ™ZÑ'ò,ð —‘˜uŸ|™|Ñ+ò,ð —‘˜uŸ|™|Ñ+ð	
rt   c                óX   — t        | j                  | j                  | j                  «      S r’   )r   rÍ   rÎ   r  r6  s    ru   r(  zLayout.storage_size„  s   € Ü.¨t¯y©y¸$¿+¹+ÀtÇ{Á{ÓSÐSrt   )rÐ   ré  rÏ   rÛ  rÍ   rž  rÎ   zOptional[list[Expr]]r  r   rŒ   r�   rð  rè  rÞ  )r
  rï  r  rï  rŒ   rl   rì  ©rŒ   z
sympy.Expr)ro   rp   rq   r   r©  rH  rw  rÚ   r)  r  r6  r9  r5  rF  rY  r(  r'  r^  r‘  rc  r(  rs   rt   ru   rm  rm  ¼  sÖ   „ ð (,Ù˜q“zð#àð#ð ð#ð ð	#ð
 %ð#ð ð#ð 
ó#ó$	
ð €HóóGð ðØ!ðØ,>ðà	òó ðóó!òF-ð ñ8ó ð8òtLò
Qò
ó.ó
ôTrt   rm  c                  ó   — e Zd ZdZdd„Zy)r  z A Tensor layout we cannot changec                ó   ‡ — ˆ fd„}|S )z1A closure containing math to read a given elementc                ó  •— t        | «      t        ‰j                  «      k(  sJ ‚t        | «      t        ‰j                  «      k(  sJ ‚‰j                  }t	        | ‰j                  ‰j                  «      D ]  \  }}}|dk7  sŒ|||z  z   }Œ |S rW  )rž   rÎ   rÍ   r  r§   )r    rà  r¼   rÎ   Úszr0  s        €ru   rŽ  z)FixedLayout.make_indexer.<locals>.indexerŽ  sƒ   ø€ Ü�u“:¤ T§[¡[Ó!1Ò1Ð1Ð1Ü�u“:¤ T§Y¡Y£Ò/Ð/Ð/Ø—[‘[ˆFÜ#& u¨d¯k©k¸4¿9¹9Ó#Eò 3‘��V˜RØ˜“7Ø# c¨F¡lÑ2‘Fð3ð ˆMrt   rs   ©r0  rŽ  s   ` ru   r‘  zFixedLayout.make_indexer‹  s   ø€ ô	ð ˆrt   Nrì  )ro   rp   rq   rß  r‘  rs   rt   ru   r  r  ˆ  s
   „ Ù*ôrt   r  c                  ó–   ‡ — e Zd ZdZdZed„ «       Zed„ «       Zed„ «       Zed„ «       Z	ed„ «       Z
dd„Zdd	„Zd
„ Zd„ Zddˆ fd„Zˆ xZS )r×   z(A Tensor layout we are allowed to changeFc                óÔ   — t        | «      dk(  rg S t        j                  j                  g}t	        | dd  «      D ]  }|j                  ||d   z  «       Œ t        t	        |«      «      S )Nr   r1   rþ   )rž   r€   rX  r­  r8  r  ry   )ÚsizesÚreversed_stridesrÍ   s      ru   rØ   z!FlexibleLayout.contiguous_strides   sh   € äˆu‹:˜Š?ØˆIÜ!ŸG™GŸK™K˜=ÐÜ˜U 1 2˜YÓ'ò 	AˆDØ×#Ñ# DÐ+;¸BÑ+?Ñ$?Õ@ð	Aä”HÐ-Ó.Ó/Ð/rt   c                óä   — t        t        t        | «      «      «      t        |«      k(  s	J | |f«       ‚t        j                  j
                  }dgt        |«      z  }|D ]  }|||<   || |   z  }Œ |S )z¢
        Create a stride based on the order the dimensions should be filled in.

        In this format, channels last would be:
            [1, 3, 2, 0]
        N)r,   rŸ   rž   r€   rX  r­  )rm  r¨   Únext_strider  r¡   s        ru   Úfill_orderedzFlexibleLayout.fill_ordered©  sx   € ô œ%¤ E£
Ó+Ó,´
¸5Ó0AÒAÐQÀEÈ5À>ÓQÐAÜ—g‘g—k‘kˆØ�&œ3˜u›:Ñ%ˆàò 	1ˆAØ$ˆG�A‰JØ%¨¨a©Ñ0‰Kð	1ð ˆrt   c                óš   — t        t        t        | «      «      «      t        |«      k(  sJ ‚t        |«      }t        j                  | |«      S )zš
        Create a stride based on the sorted order of a permuted range.

        In this format, channels last would be:
            [3, 0, 2, 1]
        )r,   rŸ   rž   rÀ   r×   rq  )rm  r¨   r¿   s      ru   rB  zFlexibleLayout.stride_orderedº  sB   € ô œ%¤ E£
Ó+Ó,´
¸5Ó0AÒAÐAÐAÜ,¨UÓ3ˆ
Ü×*Ñ*¨5°*Ó=Ð=rt   c                ó>  — |t         j                  k(  rt        j                  | t        «      S |t         j
                  k(  rt        j                  | t        «      S |t         j                  k(  rt        j                  | «      S t        j                  d|«       t        ‚)aq  
        Create a stride based on a memory format.

        Memory format is translasted into a stride order,
        so channels_last is the same as:
            FlexibleLayout.stride_ordered(sizes, [3, 0, 2, 1])

        This interface does not support memory_format `torch.preserve_format`
        which should be used to deduce a format from another source
        z>stride_ordered_for_memory_format, unsuppored memory_format: %s)rÜ   Úchannels_lastr×   rB  ÚNHWC_STRIDE_ORDERÚchannels_last_3dÚNHWDC_STRIDE_ORDERÚcontiguous_formatrØ   r  r  r_  )rm  Úmemory_formats     ru   Ú stride_ordered_for_memory_formatz/FlexibleLayout.stride_ordered_for_memory_formatÆ  s�   € ð œE×/Ñ/Ò/Ü!×0Ñ0°Ô8IÓJÐJØœe×4Ñ4Ò4Ü!×0Ñ0°Ô8JÓKÐKØœe×5Ñ5Ò5Ü!×4Ñ4°UÓ;Ð;ä�I‰IØPØôô &Ð%rt   c                ó(  — t        | «      t        |«      k(  sJ ‚|D �cg c]+  }t        j                  j                  j	                  |«      ‘Œ- }}t        t        t        |«      «      |j                  ¬«      }t        j                  | |«      S c c}w )z»
        Create a stride that has the same stride order as given stride

        For example, if given stride is [1000, 1, 100, 10],
        the fill order should be [1, 3, 2, 0]
        rÿ  )
rž   rV   rÑ   rÒ   rÓ   r  rŸ   Ú__getitem__r×   rq  )rm  rÎ   rÈ   r¿   s       ru   Úsame_orderedzFlexibleLayout.same_orderedß  sv   € ô �5‹zœS ›[Ò(Ð(Ð(Ø9?Ö@°A”!—'‘'×"Ñ"×,Ñ,¨QÕ/Ð@ˆÐ@ÜœE¤# f£+Ó.°F×4FÑ4FÔGˆ
Ü×*Ñ*¨5°*Ó=Ð=ùò As   ž0Bc                ó  — | j                  | j                  |«      }| j                  «       r)|r'| j                  || j                  | j                  «      }t        | j                  | j                  | j                  || j                  «      S r’   )rB  rÍ   r'  rY  rÏ   r  rÐ   r  )r0  r¨   r©  r  s       ru   Úas_stride_orderzFlexibleLayout.as_stride_orderì  sn   € Ø×(Ñ(¨¯©°EÓ:ˆ
Ø×"Ñ"Ô$©Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJäØ�K‰KØ�J‰JØ�I‰IØØ�K‰Kó
ð 	
rt   c                óæ   — |}| j                  «       r)|r'| j                  || j                  | j                  «      }t	        | j
                  | j                  | j                  || j                  «      S r’   )r'  rY  rÍ   rÏ   r  rÐ   r  )r0  r´  r©  r  s       ru   Úas_exact_strideszFlexibleLayout.as_exact_stridesù  s]   € Ø"ˆ
Ø×"Ñ"Ô$©Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJäØ�K‰KØ�J‰JØ�I‰IØØ�K‰Kó
ð 	
rt   c                ó  — | j                  | j                  |«      }| j                  «       r'| j                  || j                  | j                  «      }t        | j                  | j                  | j                  || j                  «      S r’   )rq  rÍ   r'  rY  rÏ   r  rÐ   r  )r0  r¨   r  s      ru   Úas_fill_orderzFlexibleLayout.as_fill_order  sl   € Ø×&Ñ& t§y¡y°%Ó8ˆ
Ø×"Ñ"Ô$Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJÜØ�K‰KØ�J‰JØ�I‰IØØ�K‰Kó
ð 	
rt   c                ó  — | j                  | j                  |«      }| j                  «       r'| j                  || j                  | j                  «      }t        | j                  | j                  | j                  || j                  «      S r’   )r}  rÍ   r'  rY  rÏ   r  rÐ   r  )r0  rÎ   r  s      ru   Úas_same_orderzFlexibleLayout.as_same_order  sl   € Ø×&Ñ& t§y¡y°&Ó9ˆ
Ø×"Ñ"Ô$Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJÜØ�K‰KØ�J‰JØ�I‰IØØ�K‰Kó
ð 	
rt   c                ó†   •— |rt         j                  ||«      }nt         j                  |«      }t        ‰| �  ||||«       y r’   )r×   rq  rØ   rB  r©  )r0  rÐ   rÏ   rÍ   r/  r  rD  s         €ru   r©  zFlexibleLayout.__init__  s;   ø€ ÙÜ$×1Ñ1°$¸ÓE‰Gä$×7Ñ7¸Ó=ˆGÜ‰Ñ˜ ¨¨gÕ6rt   rõ  r’   rÓ  )ro   rp   rq   rß  r^  r  rØ   rq  rB  rz  r}  r  r�  rƒ  r…  r©  rz  r{  s   @ru   r×   r×   š  s�   ø„ Ù2à€Nð ñ0ó ð0ð ñó ðð  ñ	>ó ð	>ð ñ&ó ð&ð0 ñ
>ó ð
>ó
ó
ò

ò

÷7ò 7rt   r×   c                  ó2   ‡ — e Zd ZdZdˆ fd„Zdd„Zd„ Zˆ xZS )ÚNonOwningLayoutz,Is a view into the storage of another tensorc                ó¨   •— |j                  «       }t        ‰| �	  |j                  |j                  |j
                  |j                  «       || _        y r’   )rÖ   rB  r©  rÐ   rÏ   rÍ   rÎ   Úview)r0  rŠ  r  rD  s      €ru   r©  zNonOwningLayout.__init__)  sA   ø€ Ø—‘Ó"ˆÜ‰ÑØ�M‰MØ�L‰LØ�K‰KØ�M‰Mô		
ð ˆ�	rt   c                ó>   — | j                  «       j                  «       S r’   )r^  r‘  r6  s    ru   r‘  zNonOwningLayout.make_indexer3  s   € Ø�}‰}‹×+Ñ+Ó-Ð-rt   c                ó¶   — | j                   j                  «       j                  }|dk(  ryddlm} t
        j                  j                  j                  ||«      S )Nr   Tr1   )Ú	ALIGNMENT)	rŠ  rÖ   r  Úutilsr�  rV   rÑ   rÒ   Ústatically_known_multiple_of)r0  r  r�  s      ru   Úmaybe_guard_alignedz#NonOwningLayout.maybe_guard_aligned6  sD   € Ø—‘×%Ñ%Ó'×.Ñ.ˆØ�QŠ;ØÝ$ä�w‰w×Ñ×<Ñ<¸VÀYÓOÐOrt   )rŠ  zUnion[BaseView, TensorBox]rŒ   r�   rì  )ro   rp   rq   rß  r©  r‘  r�  rz  r{  s   @ru   rˆ  rˆ  &  s   ø„ Ù6õó.öPrt   rˆ  c                  ó   — e Zd ZdZy)ÚCommBufferTypeÚsymm_memN)ro   rp   rq   ÚSYMM_MEMrs   rt   ru   r’  r’  ?  s   „ Ø�Hrt   r’  c                  óF   ‡ — e Zd ZU dZded<   ded<   	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚCommBufferLayoutax  
    A layout that signifies the buffer is a comm buffer.
    In terms of striding, the layout is identical to `FixedLayout`.

    Buffers with this layout do not participate in in-place reuse - it can be
    neither the source nor the target for in-place reuse.

    For detailed motivation and usage of this layout, see
    NOTE [lowering-time collective optimization].
    r’  Úcomm_buffer_typer™   Ú
group_namec                ó  •— t        |t        «      st        d|› d�«      ‚|j                  «       }t        ‰| �  |j                  |j                  |j                  |j                  |j                  ¬«       || _        || _        y )NzJA `CommBufferLayout` can only be initialized with a `FlexibleLayout` (got z).ra  )rx   r×   r‘  r^  rB  r©  rÐ   rÏ   rÍ   rÎ   r  r—  r˜  )r0  r  r—  r˜  ÚfixedrD  s        €ru   r©  zCommBufferLayout.__init__R  s�   ø€ ô ˜&¤.Ô1Ü ð+Ø+1¨(°"ð6óð ð
 —‘Ó!ˆÜ‰ÑØ—<‘<Ø—+‘+Ø—‘Ø—<‘<Ø—<‘<ð 	ô 	
ð !1ˆÔØ$ˆ�rt   )r  r×   r—  r’  r˜  r™   )ro   rp   rq   rß  rr   r©  rz  r{  s   @ru   r–  r–  C  s;   ø… ñ	ð %Ó$ØƒOð%àð%ð )ð%ð ÷	%ñ %rt   r–  c                  ó’   — e Zd ZU ded<    ej
                  d„ ¬«      Zded<    ej
                  d„ ¬«      Zded<   dd	„Zd
„ Z	dd„Z
y)Ú
NoneLayoutrç  rÐ   c                 ó   — dgS rx  rs   rs   rt   ru   rþ  zNoneLayout.<lambda>u  s   € ÀÀ€ rt   ©Údefault_factoryr÷  rÍ   c                 ó   — dgS rx  rs   rs   rt   ru   rþ  zNoneLayout.<lambda>v  s   € À1À#€ rt   rÎ   c                 ó   — yrx  rs   r6  s    ru   r(  zNoneLayout.storage_sizex  rÞ  rt   c                ó   — | S r’   rs   r6  s    ru   r^  zNoneLayout.as_fixed{  ó   € Øˆrt   c                ó   — | j                   S r’   rJ  r6  s    ru   rÚ   zNoneLayout.get_device~  rK  rt   Nrþ  ræ  )ro   rp   rq   rr   r  r  rÍ   rÎ   r(  r^  rÚ   rs   rt   ru   rœ  rœ  j  sG   … ð #Ó"Ø'�k×'Ñ'¹ÔD€Dˆ)ÓDØ)˜×)Ñ)¹+ÔF€FˆIÓFóòôrt   rœ  c                  óŽ   ‡ — e Zd Zd
ˆ fd„Zedd„«       Zej                  dd„«       Zdd„Zdd„Zd„ Z	e
dd„«       Zd„ Zdd	„Zˆ xZS )ÚMutationLayoutSHOULDREMOVEc                ó  •— t         ‰| �  |j                  «       |j                  «       |j	                  «       d «       || _        | j                  «       j                  «       }t        j                  j                  |«       y r’   )rB  r©  r‡  rÙ   rÔ   r|  Ú
get_bufferr•  rV   rÑ   Úmark_buffer_mutated)r0  r|  r–   rD  s      €ru   r©  z#MutationLayoutSHOULDREMOVE.__init__ƒ  se   ø€ Ü‰ÑØ×&Ñ&Ó(Ø×ÑÓØ�O‰OÓØô		
ð ˆŒØ�‰Ó ×)Ñ)Ó+ˆÜ	�‰×#Ñ# DÕ)rt   c                ó6   — | j                  «       j                  S r’   )Úreal_layoutrÎ   r6  s    ru   rÎ   z!MutationLayoutSHOULDREMOVE.strideŽ  s   € à×ÑÓ!×(Ñ(Ð(rt   c                 ó   — y r’   rs   )r0  rä   s     ru   rÎ   z!MutationLayoutSHOULDREMOVE.stride’  s   € àrt   c                ó>   — | j                  «       j                  «       S r’   )r«  r(  r6  s    ru   r(  z'MutationLayoutSHOULDREMOVE.storage_size–  s   € Ø×ÑÓ!×.Ñ.Ó0Ð0rt   c                ód   ‡— ˆfd„Š ‰| j                   «      }t        |t        «      sJ d«       ‚|S )Nc                óÜ   •— t        | t        «      r ‰| j                  «      S t        | t        «      r ‰| j	                  «       «      S t        | t
        «      r ‰| j                  «      S | S r’   )rx   r¦  r|  r8  r¤  Ú
MutableBoxr  )r|  Úunwrap_viewss    €ru   r±  z;MutationLayoutSHOULDREMOVE.get_buffer.<locals>.unwrap_viewsš  sY   ø€ Ü˜&Ô"<Ô=Ù# F§M¡MÓ2Ð2Ü˜&¤(Ô+Ù# F×$6Ñ$6Ó$8Ó9Ð9Ü˜&¤*Ô-Ù# F§K¡KÓ0Ð0ØˆMrt   z1MutationLayoutSHOULDREMOVE must refer to a buffer)r|  rx   r2  )r0  rà  r±  s     @ru   r¨  z%MutationLayoutSHOULDREMOVE.get_buffer™  s9   ø€ ô	ñ ˜dŸk™kÓ*ˆÜ˜&¤&Ô)ð 	
Ø?ó	
Ð)ð ˆrt   c                ó6   — | j                  «       j                  S r’   )r¨  r  r6  s    ru   r«  z&MutationLayoutSHOULDREMOVE.real_layout©  ó   € Ø�‰Ó ×'Ñ'Ð'rt   c                óø  — |j                  «        t        j                  j                  |j	                  «       «       t        |t        «      r|j                  }|j                  «        |s®t        j                  |j                  «       |j                  «       |j                  «       t        |j                  «       |j                  «       «      D ��cg c]/  \  }}t        j                  j                   j#                  ||«      ‘Œ1 c}}¬«      j                  }|j                  «        t        |j                  j$                  t&        «      sJ ‚t)        |«      |j                  _        |j                  S c c}}w )Nr–  )r  rV   rÑ   r©  r•  rx   rb   r  r¢  rƒ  rR  rÚ   rÙ   rŽ  r§   rÔ   rÒ   r®  r  r×   r¦  )rS  ÚsrcÚdstÚunsafe_aliasr¹  rº  s         ru   Úrealize_intoz'MutationLayoutSHOULDREMOVE.realize_into¬  s  € à�‰Œô 	
�‰×#Ñ# C§L¡L£NÔ3ä�cœ9Ô%Ø—(‘(ˆCð 	×ÑÔáÜ×"Ñ"Ø—~‘~Ó'Ø—m‘m“oØŸ™Ó*ô !$ C§L¡L£N°C·L±L³NÓ C÷á˜˜1ô —G‘G×$Ñ$×1Ñ1°!°QÕ7óð	 #ó ÷ ‰dð ð 	�‰ŒÜ˜#Ÿ(™(Ÿ/™/¬>Ô:Ð:Ð:Ü4°SÓ9ˆ�‰ŒØ�x‰xˆùós   Ã4E6c                ó   — | S r’   rs   r6  s    ru   r^  z#MutationLayoutSHOULDREMOVE.as_fixedÏ  r£  rt   c                ó6   — | j                   j                  «       S r’   )r|  r‘  r6  s    ru   r‘  z'MutationLayoutSHOULDREMOVE.make_indexerÒ  rÔ  rt   )r|  rc   rŒ   r�   ©rŒ   rž  )rä   r   rŒ   r�   re  )rŒ   r2  rõ  rì  )ro   rp   rq   r©  r  rÎ   Úsetterr(  r¨  r«  rx  r¸  r^  r‘  rz  r{  s   @ru   r¦  r¦  ‚  sb   ø„ õ	*ð ò)ó ð)ð ‡]�]òó ðó1óò (ð ò ó ð òD÷*rt   r¦  c                  ó  ‡ — e Zd ZU ded<   ded<   d!ˆ fd„Zd"d„Zd#d„Zd$d„Zd%d	„Ze	d&d
„«       Z
d'd„Zd(d„Zd)d„Zd*d„Zd+d„Zd„ Zd„ Zd,d!d„Zd!d„Zd!d„Z	 d,	 d!d„Zd„ Zd-d„Zd.d/d„Zd„ Zd0d„Zd0d„Zd1d„Zd2d„Zd2d„Zd3d„Zd4d „Z ˆ xZ!S )5r2  rä  r–   ré   r  c                óF   •— t         ‰| �  «        | j                  dd «       y r  )rB  r7  r2  rC  s    €ru   r7  zBuffer.__post_init__à  s   ø€ Ü‰ÑÔØ×Ñ ¨tÕ4rt   c                ó>   — | j                  «       j                  «       S r’   )rÖ   r‘  r6  s    ru   r‘  zBuffer.make_indexerä  s   € Ø�‰Ó ×-Ñ-Ó/Ð/rt   c                ó@   — | j                   sJ | «       ‚| j                   S r’   r:  r6  s    ru   r•  zBuffer.get_nameç  s   € Ø�yŠyÐ˜$ÓˆyØ�y‰yÐrt   c                ó>   — | j                  «       j                  «       S r’   )ri  rÚ   r6  s    ru   rÚ   zBuffer.get_deviceë  s   € Ø×#Ñ#Ó%×0Ñ0Ó2Ð2rt   c                 ó   — y r’   rs   r6  s    ru   rJ  zBuffer.get_defining_opî  rK  rt   c                ó6   — | j                  «       j                  S r’   )rÖ   rÏ   r6  s    ru   rÏ   zBuffer.dtypeñ  s   € à�‰Ó ×&Ñ&Ð&rt   c                ó:   — g | j                  «       j                  ¢S r’   )rÖ   rÍ   r6  s    ru   rÔ   zBuffer.get_sizeõ  s   € Ø(�—‘Ó"×'Ñ'Ð(Ð(rt   c                ó:   — g | j                  «       j                  ¢S r’   )rÖ   rÎ   r6  s    ru   rú   zBuffer.get_strideø  s   € Ø*�—‘Ó"×)Ñ)Ð*Ð*rt   c                ó6   — | j                  «       j                  S r’   )rÖ   r  r6  s    ru   Ú
get_offsetzBuffer.get_offsetû  r³  rt   c                óž   — t        | j                  t        «      r| j                  S t        t	        | j                  «      j
                  «      ‚r’   )rx   r  rm  r_  r‡   ro   r6  s    ru   rÖ   zBuffer.get_layoutþ  s4   € Ü�d—k‘k¤6Ô*Ø—;‘;ÐÜ!¤$ t§{¡{Ó"3×"<Ñ"<Ó=Ð=rt   c                ó   — | j                   S r’   rÖ  r6  s    ru   ri  zBuffer.get_output_spec  rK  rt   c                ó"   — | j                  «       S r’   )rv  r6  s    ru   r¿  zBuffer.get_storage_numel  s   € Ø�~‰~ÓÐrt   c                ó®   — t        | j                  t        «      r;t        | j                  t        «      s | j                  j	                  «       | _        y y y r’   )rx   r  rm  rˆ  r^  r6  s    ru   r¦  zBuffer.freeze_layout	  s>   € Ü�d—k‘k¤6Ô*´:Ø�K‰Kœô4
ð Ÿ+™+×.Ñ.Ó0ˆD�Kð4
Ð*rt   c                ó€   — t        | j                  t        «      sJ ‚| j                  j                  ||¬«      | _        y ©Nr0  )rx   r  r×   r  r¨  s      ru   rª  z&Buffer.freeze_layout_with_stride_order  s1   € Ü˜$Ÿ+™+¤~Ô6Ð6Ð6Ø—k‘k×1Ñ1°%À}Ð1ÓUˆ�rt   c                ó|   — t        | j                  t        «      sJ ‚| j                  j                  |«      | _        y r’   )rx   r  r×   rƒ  r­  s     ru   r®  z$Buffer.freeze_layout_with_fill_order  s,   € Ü˜$Ÿ+™+¤~Ô6Ð6Ð6Ø—k‘k×/Ñ/°Ó6ˆ�rt   c                ó|   — t        | j                  t        «      sJ ‚| j                  j                  |«      | _        y r’   )rx   r  r×   r…  r°  s     ru   r±  z$Buffer.freeze_layout_with_same_order  s,   € Ü˜$Ÿ+™+¤~Ô6Ð6Ð6Ø—k‘k×/Ñ/°Ó7ˆ�rt   c                ó€   — t        | j                  t        «      sJ ‚| j                  j                  ||¬«      | _        y rÍ  )rx   r  r×   r�  r³  s      ru   rµ  z'Buffer.freeze_layout_with_exact_strides  s8   € ô ˜$Ÿ+™+¤~Ô6Ð6Ð6Ø—k‘k×2Ñ2Ø¨ð 3ó 
ˆ�rt   c                ó˜   — t         j                  j                  j                  t	        j
                  | j                  «       d«      «      S rx  ry  r6  s    ru   r|  zBuffer.is_zero_elements#  r}  rt   c                óp   ‡ — ‰ j                  «       rt        t        ‰ j                  «       ¬«      S ˆ fd„}|S )Nr\  c                óx   •— ‰j                  «       }t        j                  ‰j                  xs d || «      «      S r‰  )r‘  rT   rÎ  r–   ©r    rŽ  r0  s     €ru   r�  z"Buffer.make_loader.<locals>.loader+  s/   ø€ Ø×'Ñ'Ó)ˆGÜ—8‘8˜DŸI™IÒ2¨±G¸E³NÓCÐCrt   )r|  r
   r�  rÙ   rÒ  s   ` ru   rŽ  zBuffer.make_loader&  s0   ø€ à× Ñ Ô"Üœ=°·±Ó0@ÔAÐAô	Dð ˆrt   c                ó"   — | j                  «       S r’   ©r•  r�  s     ru   rƒ  zBuffer.codegen_reference1  rP  rt   c                 ó   — y r’   rs   r6  s    ru   r
  zBuffer.decide_layout4  r   rt   c                ó‚   — t        | j                  t        «      r%| j                  j                  j	                  «       gS yr  )rx   r  rˆ  rŠ  r•  r6  s    ru   rÑ  z#Buffer.get_inputs_that_alias_output7  s/   € Ü�d—k‘k¤?Ô3Ø—K‘K×$Ñ$×-Ñ-Ó/Ð0Ð0Ørt   c                ó‚   — t        | j                  t        «      r%| j                  j                  j	                  «       gS yr  )rx   r  r¦  r|  r•  r6  s    ru   rÍ  zBuffer.get_mutation_names<  s0   € Ü�d—k‘kÔ#=Ô>Ø—K‘K×&Ñ&×/Ñ/Ó1Ð2Ð2Ørt   c                ó6   — t        | j                  «       g«      S r’   )r,   r•  r6  s    ru   rA  zBuffer.get_read_namesA  s   € Ü˜4Ÿ=™=›?Ð+Ó,Ð,rt   c                ó   — t        «       S r’   r+   r6  s    ru   rÁ  zBuffer.get_unbacked_symbol_usesD  r&  rt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  zBuffer.get_unbacked_symbol_defsG  r&  rt   c                 ó   — y r’   rs   r6  s    ru   r  zBuffer.realizeJ  r   rt   c                 ó   — yr‰  rs   r6  s    ru   Úshould_allocatezBuffer.should_allocateM  s   € àrt   rÓ  rì  rð  ræ  r×  rÚ  rß  r»  râ  rÜ  rÝ  rõ  rê  r’   rå  r  rÔ  r,  rã  rÞ  )"ro   rp   rq   rr   r7  r‘  r•  rÚ   rJ  r  rÏ   rÔ   rú   rÇ  rÖ   ri  r¿  r¦  rª  r®  r±  rµ  r|  rŽ  rƒ  r
  rÑ  rÍ  rA  rÁ  r%  r  rß  rz  r{  s   @ru   r2  r2  Ö  s»   ø… ð ÓØÓõ
5ó0óó3óð ò'ó ð'ó)ó+ó(ó>ó
ò ò1ôVó7ó8ð
 ,1ð
à	ó
òWó	ôòóó
ó
-óóó÷rt   r2  c                  ó<   — e Zd Zdd„Zdd„Zej                  Zdd„Zy)ÚOperationBufferc                ó   — | gS r’   rs   r6  s    ru   r#  zOperationBuffer.get_outputsU  s	   € Øˆvˆrt   c                ó   — | S r’   rs   r6  s    ru   rJ  zOperationBuffer.get_defining_opX  r£  rt   c                óX   — t         j                  | «       t        j                  | «       y r’   )r2  r7  r  r6  s    ru   r7  zOperationBuffer.__post_init__^  s   € Ü×Ñ˜TÔ"Ü×Ñ Õ%rt   Nr*  ©rŒ   r  rÓ  )ro   rp   rq   r#  rJ  r  rÏ  r7  rs   rt   ru   rá  rá  R  s   „ óóð #×5Ñ5Ðô&rt   rá  c                  ó   — e Zd Zdd„Zy)ÚInputBufferc                 ó   — yrW  rs   r6  s    ru   r½  zInputBuffer.num_readsd  rÞ  rt   Nrþ  )ro   rp   rq   r½  rs   rt   ru   rç  rç  c  s   „ ôrt   rç  c                  ó   — e Zd ZdZy)ÚDonatedBufferaY  
    Represents a donated buffer which is a saved tensor that is not alias to any
    fwd inputs, fwd user outputs, and bwd outputs. We generally cannot inplace
    reuse the input tensor memory during backward since it might be used in another
    function. However, donated buffer can be inplace reused during backward
    to save memory.
    N)ro   rp   rq   rß  rs   rt   ru   rê  rê  h  s   „ òrt   rê  c                  ó,   — e Zd ZU dZded<   dd„Zdd„Zy)r—  Nrç  r•  c                ó   ‡ — dˆ fd„}|S )Nc                óä   •— ‰j                  «       j                  «       }t        j                  t        j
                  j                  ‰j                  «       ‰j                  «       || «      «      S r’   )	rÖ   r‘  rT   rÎ  rV   rÑ   Úconstant_namer•  r•  rÔ  s     €ru   r�  z*ConstantBuffer.make_loader.<locals>.loaderv  sP   ø€ Ø—o‘oÓ'×4Ñ4Ó6ˆGÜ—8‘8Ü—‘×%Ñ% d§m¡m£o°t×7KÑ7KÓLÙ˜“óð rt   rÑ  rs   rÒ  s   ` ru   rŽ  zConstantBuffer.make_loaderu  s   ø€ õ	ð ˆrt   c                óˆ   — t        t        j                  j                  | j	                  «       |«      | j
                  ¬«      S ©N)r–   r  )r—  rV   rÑ   rî  r•  r  r†  s     ru   rË  z!ConstantBuffer.constant_to_device  s/   € ÜÜ—‘×&Ñ& t§}¡}£¸Ó?ÈÏÉô
ð 	
rt   rê  r  )ro   rp   rq   r•  rr   rŽ  rË  rs   rt   ru   r—  r—  r  s   … Ø.2€OÐ+Ó2óô
rt   r—  c                  ó6   — e Zd Zdd„Zdd„Zd	d
d„Zdd„Zdd„Zy)ÚNoneAsConstantBufferc                ó   — t        «       S r’   r+   r6  s    ru   r@  zNoneAsConstantBuffer.get_reads‡  r&  rt   c                ó   — t        «       S r’   r+   r6  s    ru   rÁ  z-NoneAsConstantBuffer.get_unbacked_symbol_usesŠ  r&  rt   Nc                óJ   — t         j                  j                  j                  S r’   )rV   rÑ   rÚ  Únone_strr�  s     ru   rƒ  z&NoneAsConstantBuffer.codegen_reference�  s   € Ü�w‰w×#Ñ#×,Ñ,Ð,rt   c                ó   — t        d ¬«      S ©NrJ  )rœ  r6  s    ru   ri  z$NoneAsConstantBuffer.get_output_spec�  s   € Ü Ô&Ð&rt   c                 ó   — yr‰  rs   r6  s    ru   rn  z&NoneAsConstantBuffer.has_tensor_output“  r‹  rt   rý  r,  r’   rå  rÝ  rÞ  )ro   rp   rq   r@  rÁ  rƒ  ri  rn  rs   rt   ru   rò  rò  …  s   „ óóô-ó'ôrt   rò  c                  ó2   — e Zd ZU ded<   dd„Zdd	d„Zd
d„Zy)r†   r   rC  c                ó,   — t        | j                  «      S r’   )r&   rC  r6  s    ru   rÁ  z.ShapeAsConstantBuffer.get_unbacked_symbol_uses›  s   € Ü$ T§Y¡YÓ/Ð/rt   Nc                óh   — t         j                  j                  j                  | j                  «      S r’   )rV   rÑ   rÚ  Úcodegen_sizevarrC  r�  s     ru   rƒ  z'ShapeAsConstantBuffer.codegen_referencež  s!   € Ü�w‰w×#Ñ#×3Ñ3°D·I±IÓ>Ð>rt   c                 ó   — yr‰  rs   r6  s    ru   rn  z'ShapeAsConstantBuffer.has_tensor_output¡  r‹  rt   r,  r’   rå  rÞ  )ro   rp   rq   rr   rÁ  rƒ  rn  rs   rt   ru   r†   r†   —  s   … à
ƒJó0ô?ôrt   r†   c                  óÞ   ‡ — e Zd ZU ded<   dd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dˆ fd	„Z
dd
„Zdd„Zdd„Ze	 	 dd„«       Z	 	 d 	 	 	 	 	 d!d„Ze	 d"d„«       Zd#d„Zdd„Zd$d„Zd$d„Zd%d„Zˆ xZS )&r  r.  r  c                óŒ   — | j                   �| j                   S t        | j                  d«      r| j                  j                   S y)z•
        Returns self.name if it exists, otherwise returns the name of the data node if that exists.
        If neither exist, returns None.
        Nr–   )r–   r  r  r6  s    ru   Úget_computed_buffer_namez'ComputedBuffer.get_computed_buffer_name©  s7   € ð
 �9‰9Ð Ø—9‘9ÐÜ�4—9‘9˜fÔ%Ø—9‘9—>‘>Ð!Ørt   c                ó6   — | j                   j                  «       S r’   ©r  r½  r6  s    ru   r½  zComputedBuffer.num_reads´  rb  rt   c                ó6   — | j                   j                  «       S r’   ©r  r@  r6  s    ru   r@  zComputedBuffer.get_reads·  rb  rt   c                ó6   — | j                   j                  «       S r’   rg  r6  s    ru   rA  zComputedBuffer.get_read_namesº  rh  rt   c                ó¤  — t        j                  t        dd«      5  | j                  j	                  «       rTt        | j                  «       | j                  j                  «       | j                  j                  «       «      cd d d «       S t        | j                  «       | j                  j                  «       «      cd d d «       S # 1 sw Y   y xY wr]  )
r   r˜   r×   r  rÃ  r:   Úget_store_functionrO  rÅ  rÔ   r6  s    ru   r·  zComputedBuffer.get_read_writes½  sœ   € Ü�\‰\œ.Ð*:¸DÓAñ 	Ø�y‰y×+Ñ+Ô-Ü*Ø×+Ñ+Ó-Ø—I‘I×0Ñ0Ó2Ø—I‘I×0Ñ0Ó2ó÷	ñ 	ô +Ø×+Ñ+Ó-Ø—I‘I×&Ñ&Ó(ó÷	÷ 	ò 	ús   œA%CÂ1CÃCc                óÒ   — t        | j                  «       «      t        | j                  «       «      z  t        | j                  «       «      z  | j                  j                  «       z  S r’   )r&   rÔ   rú   rÇ  r  rÁ  r6  s    ru   rÁ  z'ComputedBuffer.get_unbacked_symbol_usesË  sV   € ô& " $§-¡-£/Ó2Ü# D§O¡OÓ$5Ó6ñ7ä# D§O¡OÓ$5Ó6ñ7ð �i‰i×0Ñ0Ó2ñ3ð	
rt   c                óæ   •— | j                  «       sS| j                  t        j                  j                  vr-| j                  «       dk(  r| j                  j                  «       S t        ‰| �  «       S rx  )	rÃ  r–   rV   rÑ   Úmutated_buffersr½  r  rŽ  rB  rC  s    €ru   rŽ  zComputedBuffer.make_loaderä  sW   ø€ à×'Ñ'Ô)Ø—	‘	¤§¡×!8Ñ!8Ñ8Ø—‘Ó  AÒ%ð —9‘9×(Ñ(Ó*Ð*Ü‰wÑ"Ó$Ð$rt   c                óˆ  — | j                  «       j                  «       j                  «       }t        | j                  t
        t        t        f«      r+t        | j                  j                  | j                  |«      S t        | j                  t        «      sJ ‚t        | j                  j                  | j                  |«      S r’   )rÖ   r^  r‘  rx   r  rØ  rÎ  r  r
   rä  r–   rƒ  r‘  rj  s     ru   r  z!ComputedBuffer.get_store_functionî  sƒ   € Ø—/‘/Ó#×,Ñ,Ó.×;Ñ;Ó=ˆÜ�d—i‘i¤)¬T´4Ð!8Ô9Ü˜4Ÿ9™9×4Ñ4°d·i±iÀÓIÐIä˜dŸi™i¬Ô3Ð3Ð3Ü˜4Ÿ9™9×1Ñ1°4·9±9¸gÓFÐFrt   c                óP  — t        | j                  t        «      �r{t        j                  | j
                  j                  «       | j
                  j                  «       «      \  \  }}}| j                  «       j                  }t        d„ |D «       «      sJ ‚|D ��cg c]_  }t        |t        j                  «      rCt        |j                  |D �ci c]#  }|dk7  sŒ	|t        j                  j                   “Œ% c}«      ‘Œa }}}|r“t        | j
                  t"        t$        f«      r| j
                  j'                  ||«      }n|}|D �cg c],  }t(        j*                  j,                  j/                  ||«      ‘Œ. }	}ddlm}
  |
|	| j5                  «       «      S yc c}w c c}}w c c}w )al  
        If our layout is still flexible, try to determine the stride order based on stride orders of reads.

        TODO(jansel): A better algorithm here would look at downstream consumers of this
                      value and try to do global graph-level layout optimization.
                      This is also something just begging to be autotuned.
        c              3  óp   K  — | ].  }t        |t        j                  t        j                  f«      –— Œ0 y ­wr’   )rx   r3   ÚStarDepÚ	MemoryDepr€  s     ru   rý   z0ComputedBuffer.get_fill_order.<locals>.<genexpr>  s0   è ø€ ò àô ˜1œ|×3Ñ3´\×5KÑ5KÐL×Mñùs   ‚46r   r1   ©Úpick_loop_orderN)rx   r  r×   r3   r   r  rO  rÅ  r·  rº  r   r  rS   r    r€   rX  rY  rÎ  r  r£   rV   rÑ   rÒ   r"  Ú	schedulerr  rÔ   )r0  Ú
index_varsrå  rÂ   rº  rU  Úvr  rC  Ústride_lengthsr  s              ru   r¹   zComputedBuffer.get_fill_orderö  sj  € ô �d—k‘k¤>Õ2Ü.:×.MÑ.MØ—	‘	×,Ñ,Ó.°·	±	×0LÑ0LÓ0Nó/Ñ+Ñ(ˆZ˜¨!ð ×(Ñ(Ó*×0Ñ0ˆEô ñ àôô ð ð ð ÷àÜ˜a¤×!7Ñ!7Ô8ô ˜1Ÿ7™7¸nÖ$W¸ÐPQÐUVÓPV Q¬¯©¯©¡_Ò$WÕXðˆEñ ñ Ü˜dŸi™i¬$´¨Ô6Ø"Ÿi™i×/Ñ/°
¸NÓK‘Gà(�GàMRö"ØEI”A—G‘G×$Ñ$×1Ñ1°$¸Õ@ð"�ð "õ 7á& ~°t·}±}³ÓGÐGàùò# %Xùóùò"s$   Â3FÃ
FÃFÃ6	FÅ1F#ÆFc                ó¢   — t        | j                  t        «      r5| j                  «       }|r| j	                  |«       y | j                  «        y y r’   )rx   r  r×   r¹   r®  r¦  r­  s     ru   r
  zComputedBuffer.decide_layout  s@   € Ü�d—k‘k¤>Ô2Ø×'Ñ'Ó)ˆEÙØ×2Ñ2°5Õ9à×"Ñ"Õ$ð 3rt   c                óz  — t        j                  | j                  j                  «       | j                  j	                  «       d¬«      \  }}t        j                  t        d| j                  «       «      5  t        | j                  «       | j                  «       r|n|d d |g|¢­Ž }d d d «       g }g }g }g }|j                  «       D ]^  \  }}	||d   v r'|rJ ‚|j                  |«       |j                  |	«       Œ4||d   v sJ ‚|j                  |«       |j                  |	«       Œ` ||f||ffS # 1 sw Y   Œ‹xY w)NÚqr`   r•  r1   r   )r3   r   r  rO  rÅ  r   r˜   r—  rÚ   r<   r  rÃ  Úitemsr  )
r0  r”   Ú
var_rangesrr  r  Úreduce_varsÚ
index_sizeÚreduce_sizer  rà   s
             ru   Úget_default_sizes_bodyz%ComputedBuffer.get_default_sizes_body%  sI  € ô (×:Ñ:Ø�I‰I×(Ñ(Ó*¨D¯I©I×,HÑ,HÓ,JÐSVô
Ñˆˆjô �\‰\œ.Ð*;¸T¿_¹_Ó=NÓOñ 	ÜØ×'Ñ'Ó)Ø×0Ñ0Ô2‘¸¸R¸a¸Øðð ò	ˆD÷	ð ˆ
Ø!#ˆØˆ
ØˆØ×$Ñ$Ó&ò 	&‰DˆAˆqØ�D˜‘G‰|Ù&Ð&�Ø×!Ñ! !Ô$Ø×!Ñ! !Õ$à˜D ™G‘|Ð#�|Ø×"Ñ" 1Ô%Ø×"Ñ" 1Õ%ð	&ð ˜KÐ(¨$°¸[Ð0IÐIÐI÷)	ð 	ús   Á52D1Ä1D:c                óº  ‡ ‡‡— ‰ j                  «       \  \  }}}\  }}|r |||f|||f«      \  \  }}}\  }}g |j                  j                  «       ¢Š|��t        |t        «      rt        |«      dk(  sJ ‚|\  }}	t        |t        «      sJ ‚t        |	t        «      sJ ‚t        d„ |	D «       «      sJ ‚|j                  }
|
|k(  s	J |
|f«       ‚|	D �cg c]	  }|‰vsŒ|‘Œ }	}‰|	z  Šg |j                  «       ¢Št        j                  j                  ‰ t        j                  «      s‰j!                  |j#                  «       «       ˆˆˆ fd„}||z   }t%        t'        ‰ «      «       xs t(        j*                   } |||||«      \  }}} |||||«      \  }}}t-        j.                  ||d¬«      \  \  }}}t1        | ||«       ||«      g|||«      }||f|fS c c}w )an  
        This is a main place where we do loop transformations in a
        backend-agnostic way.

        Here we:
            1) Remove any 1 dimensions
            2) Fuse contiguous dimensions together
            3) Reorder dimensions based on stride orders

        Optional argument extra_indexing_constraints can be used to append additional
        indexing expressions to existing ones derived from buffer's body. This can be useful
        to fuse scheduler nodes with compatible ranges, e.g. (s0*s1*...,) and (s0, s1, s2, ...)
        on CPU by preventing indexing simplifications and obtaining index/reduce ranges for
        the scheduler node compatible with other nodes.
        Optional argument recompute_sizes_body_func can be used to recompute sizes and body
        on the default body. This can be useful to append additional loop transformations.
        r³   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr’   )rx   r   )rû   Úfs     ru   rý   z6ComputedBuffer.simplify_and_reorder.<locals>.<genexpr>t  s   è ø€ ÒH¨q”z !¤T×*ÑHùr  c           	     óä   •— ‰j                  | ||‰
«      \  }}} || «      } |rGt        j                  j                  j	                  | |t        ‰	| |«      «      \  }}}t        ||«      }n|}|||fS r’   )Ú_apply_loop_reorderingrV   rÑ   rÒ   Ú_simplify_loopsr6   r±   )Úx_varsÚsupport_varsrm  Úsimplify_loopsÚreindex0r¯   r°   Ú_pruner£   Úindex_formulasÚmemory_addrsr0  s            €€€ru   Úsimplify_and_reorderzAComputedBuffer.simplify_and_reorder.<locals>.simplify_and_reorder…  s…   ø€ Ø(,×(CÑ(CØ˜ e¨\ó)Ñ%ˆE�8˜Xñ ˜fÓ%ˆFáÜ*+¯'©'×*:Ñ*:×*JÑ*JØØÜ,¨^¸VÀUÓKó+Ñ'��x ô
 *¨(°HÓ=‘à"�Ø˜' 8Ð+Ð+rt   Úpr`   )r  Úindexing_exprsr|   rx   rz   rž   r{   ry   r   r  Úget_write_exprsrV   rÑ   r  r4   ÚPREFER_STORE_LOOP_ORDERÚextendÚget_read_exprsrN   rê   r2   Úloop_ordering_after_fusionr3   Úindex_vars_no_squeezer<   )r0  Úextra_indexing_constraintsÚrecompute_sizes_body_funcr  r  rr  r  r  Úextra_indexing_rangesÚextra_indexing_exprÚexpected_var_rangesr6  r-  r'  Úshould_merge_loopsÚiter_rangesÚiter_reindexrÂ   Úreduce_rangesÚreduce_reindexÚ	iter_varsr  r+  r,  s   `                     @@ru   r-  z#ComputedBuffer.simplify_and_reorderF  s`  ú€ ð4 ×'Ñ'Ó)ñ		
Ù%ˆZ˜ØÙ%ˆZ˜ñ %ñ
 *Ø˜[Ð)¨4°*¸kÐ1Jóñ	Ù)�˜[ØÙ)�˜[ð
 9˜4×.Ñ.×5Ñ5Ó7Ð8ˆØ%Ð1äÐ5´uÔ=ÜÐ2Ó3°qÒ8ðð9ð :TÑ6Ð!Ð#6ÜÐ3´TÔ:Ð:Ð:ÜÐ1´4Ô8Ð8Ð8ÜÑHÐ4GÔHÔHÐHÐHà"&§/¡/ÐØ&Ð*?Ò?ð Ø#Ø%ðBó Ð?ð /ö#Ø°!¸>Ò2I’ð#Ðð #ð Ð1Ñ1ˆNà0˜×-Ñ-Ó/Ð0ˆÜ�w‰w×"Ñ" 4¬×)OÑ)OÔPØ×Ñ × 3Ñ 3Ó 5Ô6ö	,ð$ " KÑ/ˆä” tÓ,Ó-Ð-ÒV´V×5VÑ5VÐ1Vð 	ñ (<ØØØØó	(
Ñ$ˆ�\ 1ñ ,@Ø˜ {Ð4Fó,
Ñ(ˆ�~ qô
 0<×/QÑ/QØØØô0
Ñ,Ñ ˆ�K *ô
 ØÙ˜)Ó$¡n°[Ó&AÐBØØØó
ˆð ˜]Ð+¨TÐ1Ð1ùòw#s   Ã	GÃGc           
     óX  — ddl m} |€g }	 |D �cg c]-  }t        j                  j                  j                  || |«      ‘Œ/ }}t        |«      t        |«      k(  rt        |d   «      t        | «      k(  sJ ‚t        t         ||||«      «      «      }|D �	cg c]  }	||	   ‘Œ	 }}	|t#        |«      t%        |«      fS c c}w # t        $ rZ t        j                  r*t        j                  dt        t        | |«      «      |«       t        t!        t        |«      «      «      }Y Œ�w xY wc c}	w )zU
        Shuffle the order of loops around to hopefully improve performance.
        r1   r  r   z%Did not simplify complex index:
%s
%s)r  r  rV   rÑ   rÒ   r"  rž   ry   r8  Ú	Exceptionr2   r  r  Úwarningr{   r§   rŸ   r¬   r©   )
r  r'  rm  r,  Úpriority_idxr  rC  r  r¨   r¡   s
             ru   r$  z%ComputedBuffer._apply_loop_reordering¹  s'  € õ 	/àÐØˆLð	,ð )öàô —‘× Ñ ×-Ñ-¨d°JÀÕMðˆGð ô �w“<¤3 |Ó#4Ò4¼¸WÀQ¹Z»ÌCØóMò :ð ð ô œ¡/°'¸5À,Ó"OÓPÓQˆEð $)Ö)˜a��q“Ð)ˆÐ)Ø”l 5Ó)¬?¸5Ó+AÐAÐAùò#øô ò 	,Ü�|Š|Ü—‘Ø=Üœ˜Z¨Ó/Ó0Ø ôô
 œœs 5›zÓ*Ó+ŠEð	,üò *s*   ŒC �2B<ÁAC ÂD'Â<C ÃA D$Ä#D$c                ó6   — | j                   j                  «       S r’   ©r  rÅ  r6  s    ru   rÅ  z!ComputedBuffer.get_reduction_sizeÝ  ó   € Ø�y‰y×+Ñ+Ó-Ð-rt   c                ó6   — | j                   j                  «       S r’   ©r  rÃ  r6  s    ru   rÃ  z!ComputedBuffer.get_reduction_typeà  rG  rt   c                ó6   — | j                   j                  «       S r’   )r  r|  r6  s    ru   rÉ  zComputedBuffer.is_no_opã  re  rt   c                 ó   — y©NTrs   r6  s    ru   rß  zComputedBuffer.should_allocateæ  rK  rt   c                ó8   — | j                   j                  |«      S )r”  ©r  rË  r†  s     ru   rË  z!ComputedBuffer.constant_to_deviceé  s   € à�y‰y×+Ñ+¨FÓ3Ð3rt   rã  rþ  rý  rÔ  rü  r,  rê  )rŒ   zCallable[..., None])rŒ   zOptional[list[int]]rÓ  )rŒ   zetuple[tuple[list[sympy.Expr], list[sympy.Expr]], LoopBody, tuple[list[sympy.Expr], list[sympy.Expr]]]©NN)r6  ú*Optional[tuple[dict[Any, Any], list[Any]]]r7  úOptional[Callable[..., Any]]rŒ   z:tuple[tuple[list[sympy.Expr], list[sympy.Expr]], LoopBody]r’   r  rÞ  r  )ro   rp   rq   rr   r  r½  r@  rA  r·  rÁ  rŽ  r  r¹   r
  rF   r  r-  r  r$  rÅ  rÃ  rÉ  rß  rË  rz  r{  s   @ru   r  r  ¥  sÅ   ø… à
ƒKó	ó%ó%ó*óó
õ2%óGó%óN%ð ðJð
òJó ðJðD RVØBFðq2à$Nðq2ð $@ðq2ð 
Dó	q2ðf ð ò!Bó ð!BóF.ó.ó,ó÷4rt   r  c                  ón   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 d	ˆ fd„Zd
d„Zd„ Zdd„Zdd„Zdd„Z		 	 d	 	 	 dd„Z
ˆ xZS )ÚTemplateBufferzt
    Represents a Triton (in the future other type) of template operator
    that we can fuse an epilogue onto.
    c                óð   •— t         ‰| �  d |¬«       t        j                  |«      | _        || _        t        j                  j                  | «      | _	        t        j                  j                  | «       y rð  )rB  r©  ÚInputsKernelÚunwrap_storageÚinputsÚmake_kernel_renderrV   rÑ   Úregister_bufferr–   Úregister_operation)r0  r  rW  rX  rD  s       €ru   r©  zTemplateBuffer.__init__ô  sY   ø€ ô 	‰Ñ˜d¨6ÐÔ2Ü"×1Ñ1°&Ó9ˆŒØ"4ˆÔÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                ó&   — | j                  d¬«      S )NT©Ú	normalize)r:   r6  s    ru   r·  zTemplateBuffer.get_read_writes   s   € Ø×'Ñ'°$Ð'Ó7Ð7rt   c           	     ó¬  ‡‡‡— | j                  «       Š| j                  «       j                  «       Šˆˆfd„}t        j                  || j                  «       d|¬«      }| j                  D ]f  Š‰j                  j                  «       Šˆˆfd„}|xj                  t        j                  |‰j                  «       dd¬«      j                  z  c_        Œh |S )Nc                ó^   •— t        |«      dk(  sJ ‚t        j                  ‰ ‰| «      d«      S )Nr   Úfake)rž   rT   r‹  )r    rë  rŽ  r–   s     €€ru   Údummyz1TemplateBuffer.extract_read_writes.<locals>.dummy  s,   ø€ Ü�v“; !Ò#Ð#Ð#Ü—9‘9˜T¡7¨5£>°6Ó:Ð:rt   rs   r\  c                óz   •— t        |«      dk(  sJ ‚t        j                  ‰j                  «        ‰| «      «       y rx  )rž   rT   rÎ  r•  )r    rë  rŽ  Úinps     €€ru   ra  z1TemplateBuffer.extract_read_writes.<locals>.dummy  s-   ø€ Ü˜6“{ aÒ'Ð'Ð'Ü—‘˜Ÿ™›©°«Õ8rt   T)	r•  rÖ   r‘  r3   r:   rÔ   rW  r  rº  )r0  r]  ra  ÚdepsrŽ  rc  r–   s       @@@ru   r:   z"TemplateBuffer.extract_read_writes  s­   ú€ Ø�}‰}‹ˆØ—/‘/Ó#×0Ñ0Ó2ˆõ	;ô ×/Ñ/Ø�4—=‘=“? B°)ô
ˆð —;‘;ò 		ˆCØ—j‘j×-Ñ-Ó/ˆGõ9ð �JŠJœ,×:Ñ:Ø�s—|‘|“~ r°Tôç‰eñŽJð		ð ˆrt   c                ó6   — t         j                  j                  S r’   )r€   rX  r­  r6  s    ru   rÅ  z!TemplateBuffer.get_reduction_size  s   € Ü�w‰w�{‰{Ðrt   c                 ó   — y r’   rs   r6  s    ru   rÃ  z!TemplateBuffer.get_reduction_type  rK  rt   c                 ó   — yrL  rs   r6  s    ru   rß  zTemplateBuffer.should_allocate"  rK  rt   c                ó*   — | j                  «       dfd fS r  rt  )r0  r6  r7  s      ru   r-  z#TemplateBuffer.simplify_and_reorder%  s$   € ð —‘“Øðð ð
ð 	
rt   )r  rm  rW  úSequence[IRNode]rX  r/  rŒ   r�   rü  r  rã  rÞ  rO  )r6  rP  r7  rQ  )ro   rp   rq   rß  r©  r·  r:   rÅ  rÃ  rß  r-  rz  r{  s   @ru   rS  rS  î  sn   ø„ ñð

)àð
)ð !ð
)ð /ð	
)ð
 
õ
)ó8òó2óóð
 RVØBFð
à$Nð
ð $@÷
rt   rS  c                  óH   ‡ — e Zd Z	 	 d	 	 	 	 	 dˆ fd„Zdd„Zdd„Zd	d„Zˆ xZS )
ÚTritonTemplateBufferc           
     ó*  •— t         ‰
| �  |||«       || _        | g| _        |�Òt        j
                  j                  j                  t        j
                  j                  j                  f}t        j                  j                  j                  }||v sJ d|› d|› �«       ‚| j                  d   j                  «       }| xj                  |D �	cg c]  }	t        t!        |¬«      |	| «      ‘Œ c}	z  c_        |r|| _        yt#        «       | _        yc c}	w )a÷  
        NOTE:[TritonTemplates with multiple outputs]
        We want the ability for TritonTemplates to output multiple tensors. Triton
        kernels have no notion of outputs and this is done by creating tensors that
        are then mutated by the kernel. Currenlty our STORE_OUTPUT codegen doesn't
        support creating multinode outputs for triton templates.
        We work around this by creating an extra input buffer during the lowering
        and we mark them as mutated inputs.
        Nz$Mutated inputs are only allowed for z	 but got r   rJ  )rB  r©  Úmutated_inputsÚoutputsrÜ   rT   Úhigher_orderÚflex_attentionÚflex_attention_backwardrV   rÑ   Úcurrent_noder|  rW  rÚ   ÚMutationOutputrœ  r,   Úallowed_prologue_inps)r0  r  rW  rX  rm  rt  Úallowed_setrr  rÐ   r  rD  s             €ru   r©  zTritonTemplateBuffer.__init__4  s  ø€ ô" 	‰Ñ˜ Ð);Ô<Ø,ˆÔØ&* VˆŒØÐ%ô —	‘	×&Ñ&×5Ñ5Ü—	‘	×&Ñ&×>Ñ>ðˆKô Ÿ7™7×/Ñ/×6Ñ6ˆLØ ;Ñ.ð Ø6°{°mÀ9È\ÈNÐ[óÐ.ð —[‘[ ‘^×.Ñ.Ó0ˆFØ�LŠLà)öàô œz°Ô8¸#¸tÕDòñ �Lñ &;Ð!ð 	Õ"Ü@JÃð 	Õ"ùòs   ÃDc                ó   — | j                   S r’   )rn  r6  s    ru   r#  z TritonTemplateBuffer.get_outputs\  r•  rt   c                ó   — | j                   S r’   )rt  r6  s    ru   Úget_allowed_prologue_inpsz.TritonTemplateBuffer.get_allowed_prologue_inps_  s   € Ø×)Ñ)Ð)rt   c                ó&   — d| j                   › d�}|S )NzTritonTemplateBuffer(layout=rè   rÖ  )r0  rÃ   s     ru   rH  zTritonTemplateBuffer.__str__b  s   € Ø,¨T¯[©[¨M¸Ð;ˆØˆ
rt   rO  )rm  zOptional[Iterable[IRNode]]rt  zOptional[OrderedSet[str]]rŒ   r�   r*  rÔ  rð  )ro   rp   rq   r©  r#  rx  rH  rz  r{  s   @ru   rk  rk  3  s>   ø„ ð 6:Ø;?ð&
ð
 3ð&
ð  9ð&
ð 
õ&
óPó*÷rt   rk  c                  ón   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d
ˆ fd„Zdd„Zdd„Zd„ Zdd„Zdd„Z	dd„Z
dd	„Zˆ xZS )ÚChoiceCallera.  
    Represents a possible choice used in autotune_process.py.
    During autotuning, self.benchmark() is first called to get benchmark result,
    and if this choice is selected, self.output_node() is called to get the output_node.

    Children classes: TritonTemplateCaller, CUDATemplateCaller.
    c                óZ   •— t         ‰| �  «        || _        || _        || _        || _        y r’   )rB  r©  r–   r  rh   Údescription)r0  r–   rh   r  r}  rD  s        €ru   r©  zChoiceCaller.__init__s  s0   ø€ ô 	‰ÑÔØˆŒ	ØˆŒØ&ˆÔð 'ˆÕrt   c               óT   — | j                  «       }t        j                  ||d|i«      S )NrÃ   )Úto_callablerA   Ú	benchmark)r0  rÃ   r”   Úalgos       ru   r€  zChoiceCaller.benchmark‚  s)   € Ø×ÑÓ!ˆÜ×$Ñ$ T¨4°%¸°Ó>Ð>rt   c                ó   — t         ‚r’   r  r6  s    ru   Ú	call_namezChoiceCaller.call_name†  r  rt   c                ó   — t         ‚r’   r  r6  s    ru   r  zChoiceCaller.to_callable‰  r  rt   c                ó   — t         ‚r’   r  r6  s    ru   Úhash_keyzChoiceCaller.hash_keyŒ  r  rt   c                ó   — t         ‚r’   r  r6  s    ru   Úoutput_nodezChoiceCaller.output_node�  r  rt   c                ó   — i S )zRInformation returned here is logged to the autotune log file when that is enabled.rs   r6  s    ru   Ú	info_dictzChoiceCaller.info_dict’  s   € àˆ	rt   c                 ó   — y)NÚunsupported_choicers   r6  s    ru   Úautoheuristic_idzChoiceCaller.autoheuristic_id–  s   € Ø#rt   )
r–   r™   rh   r+  r  rm  r}  r™   rŒ   r�   )rŒ   r€  rð  )rŒ   rb   )rŒ   z<dict[str, Union[PrimitiveInfoType, list[PrimitiveInfoType]]])ro   rp   rq   rß  r©  r€  rƒ  r  r†  rˆ  rŠ  r�  rz  r{  s   @ru   r{  r{  j  s`   ø„ ñð'àð'ð "ð'ð ð	'ð
 ð'ð 
õ'ó?ó"ò"ó"ó"ó÷$rt   r{  c                  ó   — e Zd Zdd„Zy)ÚTritonTemplateCallerBasec                ó   — t         ‚r’   r  r6  s    ru   Úget_make_kernel_renderz/TritonTemplateCallerBase.get_make_kernel_render›  r  rt   N)rŒ   r   )ro   rp   rq   r‘  rs   rt   ru   r�  r�  š  s   „ ô"rt   r�  c                  ó–   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zed	d„«       Zed
d„«       Zej                  dd„«       Z
dd„Zdd„Zˆ xZS )ÚMultiTemplateBufferaG  
    Represents a Buffer with multiple backing implementation choices.

    Choices can be TritonTemplates or ExternKernels. During scheduling if there is a potential
    epilogue we will benchmark each of the choices with the epilogue to determine an implementation.
    Otherwise, the fastest base choice will be chosen.
    c                ó„   •— t         ‰| �  ||d |¬«       || _        d | _        || _        t        d„ |D «       «      | _        y )N)r  rW  rX  rt  c              3  ó¸   K  — | ]R  }t        |t        «      xs< t        |t        j                  j                  j
                  «      xr |j                  –— ŒT y ­wr’   )rx   r�  rÜ   Ú	_inductorÚselect_algorithmÚExternKernelCallerÚhas_out_variant)rû   Úchoices     ru   rý   z/MultiTemplateBuffer.__init__.<locals>.<genexpr>¹  sT   è ø€ ò %
ð ô �vÔ7Ó8ò ä˜6¤5§?¡?×#CÑ#C×#VÑ#VÓWò +Ø×*Ñ*óñ%
ùs   ‚AA)rB  r©  Ú_choice_timings_fnÚ_choice_timingsÚoriginal_inputsr   Ú_output_plannable)r0  r  rW  Úchoice_timingsÚunfiltered_choicesrt  rD  s         €ru   r©  zMultiTemplateBuffer.__init__¨  sY   ø€ ô 	‰ÑØØØ#Ø"7ð	 	ô 	
ð #1ˆÔØDHˆÔØ%ˆÔÜ!$ñ %
ð -ô%
ó "
ˆÕrt   c                ó   — | j                   S )z^
        Are all possible choices TritonTemplates or Extern Kernels with out variants
        )rž  r6  s    ru   Úoutput_plannablez$MultiTemplateBuffer.output_plannableÂ  s   € ð
 ×%Ñ%Ð%rt   c                ó\   — | j                   €| j                  «       | _         | j                   S r’   )rœ  r›  r6  s    ru   rŸ  z"MultiTemplateBuffer.choice_timingsÉ  s+   € à×ÑÐ'Ø#'×#:Ñ#:Ó#<ˆDÔ Ø×#Ñ#Ð#rt   c              #  ó  K  — t        |t        j                  j                  j                  «      sJ ‚| j
                  |j
                  k(  sJ ‚| j                  }|j                  «       | _        	 d –— || _        y # || _        w xY w­wr’   )rx   rÜ   r–  r—  ÚTritonTemplateCallerr  rX  r‘  )r0  ÚcallerÚrenders      ru   Úswap_as_triton_callerz)MultiTemplateBuffer.swap_as_triton_callerÏ  sp   è ø€ ä˜&¤%§/¡/×"BÑ"B×"WÑ"WÔXÐXÐXØ�{‰{˜fŸm™mÒ+Ð+Ð+à×(Ñ(ˆØ"(×"?Ñ"?Ó"AˆÔð	-Ûà&,ˆDÕ#ø fˆDÕ#üs   ‚A-BÁ0A< Á4BÁ<	BÂBc                ó2  — t        |t        j                  j                  j                  «      sJ ‚| j                  «       |j                  j                  k(  sJ ‚| j                  «       |j                  j                  k(  sJ ‚|j                  «       | _        y r’   )rx   rÜ   r–  r—  r¥  rÔ   r  rÍ   rú   rÎ   r‘  rX  )r0  r¦  s     ru   Úfinalize_as_triton_callerz-MultiTemplateBuffer.finalize_as_triton_callerÛ  sp   € Ü˜&¤%§/¡/×"BÑ"B×"WÑ"WÔXÐXÐXØ�}‰}‹ &§-¡-×"4Ñ"4Ò4Ð4Ð4Ø�‰Ó  F§M¡M×$8Ñ$8Ò8Ð8Ð8Ø"(×"?Ñ"?Ó"AˆÕrt   c                óz   — t        | j                  | j                  j                  ¬«      }|| j                  |   fS )Nrÿ  )r©  rŸ  rN  )r0  Ú
min_choices     ru   Úget_min_choicez"MultiTemplateBuffer.get_min_choiceá  s6   € Ü˜×,Ñ,°$×2EÑ2E×2IÑ2IÔJˆ
Ø˜D×/Ñ/°
Ñ;Ð<Ð<rt   )r  rm  rW  ri   rŸ  z'Callable[[], dict[ChoiceCaller, float]]r   zlist[ChoiceCaller]rt  rÕ  rŒ   r�   rÞ  )rŒ   zdict[ChoiceCaller, float])r¦  r�  )r¦  r�  rŒ   r�   )rŒ   ztuple[ChoiceCaller, float])ro   rp   rq   rß  r©  r  r¢  rŸ  r	  r
  r¨  rª  r­  rz  r{  s   @ru   r“  r“  Ÿ  s•   ø„ ñð
àð
ð ð
ð @ð	
ð
 /ð
ð  /ð
ð 
õ
ð4 ò&ó ð&ð ò$ó ð$ð
 ×Ñò	-ó ð	-óB÷=rt   r“  c                  ó2   ‡ — e Zd Z	 	 	 	 	 	 dˆ fd„Zd„ Zˆ xZS )ÚCUDATemplateBufferc                óD   •— t         ‰| �  |||«       || _        || _        y r’   )rB  r©  Úworkspace_sizeÚtemplate)r0  r  rW  rX  r±  r²  rD  s         €ru   r©  zCUDATemplateBuffer.__init__ç  s&   ø€ ô 	‰Ñ˜ Ð);Ô<à,ˆÔØ ˆ�rt   c                ó6   — | j                   �| j                   S dS rx  )r±  r6  s    ru   r)  z%CUDATemplateBuffer.get_workspace_sizeô  s   € Ø&*×&9Ñ&9Ð&Eˆt×"Ñ"ÐLÈ1ÐLrt   )r±  r„   r²  rX   rŒ   r�   )ro   rp   rq   r©  r)  rz  r{  s   @ru   r¯  r¯  æ  s,   ø„ ð!ð
 ð!ð ð!ð 
õ!öMrt   r¯  c                  ó,   ‡ — e Zd Zdˆ fd„Zdˆ fd„Zˆ xZS )ÚCppTemplateBufferc                óR   •— t         ‰| �  |||«       || _        || _        d | _        y r’   )rB  r©  r²  rš  rn  )r0  r  rW  rX  r²  rš  rD  s         €ru   r©  zCppTemplateBuffer.__init__ù  s*   ø€ Ü‰Ñ˜ Ð);Ô<Ø ˆŒØˆŒØ/3ˆ�rt   c                ó  •— t        | j                  t        «      r]t        | j                  t        «      sJ ‚| j                  d   }t        |t
        «      sJ ‚|j                  }t        |t        «      sJ ‚|S t        ‰| �!  «       S rx  )	rx   r  ÚMultiOutputLayoutrn  r   r2  rm  rB  rÖ   )r0  Úfirst_outputr  rD  s      €ru   rÖ   zCppTemplateBuffer.get_layoutÿ  sq   ø€ Ü�d—k‘kÔ#4Ô5Ü˜dŸl™l¬HÔ5Ð5Ð5ØŸ<™<¨™?ˆLÜ˜l¬FÔ3Ð3Ð3Ø!×(Ñ(ˆFÜ˜f¤fÔ-Ð-Ð-ØˆMä‘7Ñ%Ó'Ð'rt   rÓ  rÜ  )ro   rp   rq   r©  rÖ   rz  r{  s   @ru   rµ  rµ  ø  s   ø„ õ4÷	(ñ 	(rt   rµ  c                  óZ   — e Zd ZU ded<   d
d„Zdd„Zedd„«       Zed„ «       Z	dd„Z
dd„Zy	)rU  r+  rW  c                óä  ‡— t        t        j                     «       }t        j                  Š| j                  D ]c  }t        |t        «      r|j                  ˆfd„|D «       «       Œ.t        |t        «      rŒ?|j                   ‰|j                  «       «      «       Œe t        t        j                     ˆfd„| j                  «       D «       «      }t        j                  ||t        «       ¬«      S )Nc              3  óJ   •K  — | ]  } ‰|j                  «       «      –— Œ y ­wr’   rÖ  )rû   rÈ   r  s     €ru   rý   z/InputsKernel.get_read_writes.<locals>.<genexpr>  s   øè ø€ ÒB°q™W Q§Z¡Z£\×2ÑBùó   ƒ #c              3  óJ   •K  — | ]  } ‰|j                  «       «      –— Œ y ­wr’   rÖ  )rû   r  r  s     €ru   rý   z/InputsKernel.get_read_writes.<locals>.<genexpr>  s!   øè ø€ ò .
Ø(+‰G�C—L‘L“N×#ñ.
ùr½  )rº  ÚwritesÚindex_exprs)r,   r3   r7   r  rW  rx   ry   Úupdater†   r¦  r•  r#  Ú
ReadWrites)r0  rº  Úinputr¿  r  s       @ru   r·  zInputsKernel.get_read_writes  sÃ   ø€ Üœ<×+Ñ+Ñ,Ó.ˆÜ×&Ñ&ˆØ—[‘[ò 	5ˆEÜ˜%¤Ô&Ø—‘ÓB¸EÔBÕBÜ˜EÔ#8Ô9àà—	‘	™' %§.¡.Ó"2Ó3Õ4ð	5ô œL×,Ñ,Ñ-ó .
Ø/3×/?Ñ/?Ó/Aô.
ó 
ˆô ×&Ñ&ØØÜ"›ô
ð 	
rt   c                ó6   — | j                  «       j                  S r’   r¹  r6  s    ru   r@  zInputsKernel.get_reads%  r»  rt   c                ó€  — t        |t        «      r|j                  }t        |t        «      r|j                  }t        |t        «      r%t        |t
        «      st        j                  |«      }t        |t        «      r| j                  |«      S t        |t        «      r|S t        |t        t
        f«      sJ |«       ‚|S r’   )rx   rb   r  r1  r8  r  r©  Úrealize_inputÚunwrap_storage_for_inputÚTorchBindObjectr2  ©rS  rÈ   s     ru   rÇ  z%InputsKernel.unwrap_storage_for_input(  s–   € ä�aœÔ#Ø—‘ˆAÜ�aœÔ$Ø—‘ˆAÜ�aœÔ"¬:°a¼Ô+IÜ×*Ñ*¨1Ó-ˆAÜ�aœÔ#ð
 ×/Ñ/°Ó2Ð2Ü�aœÔ)ØˆHÜ˜!œf¤oÐ6Ô7Ð:¸Ó:Ð7Øˆrt   c                óÔ   — g }| D ][  }t        |t        «      r#|D �cg c]  }t        j                  |«      ‘Œ }}nt        j                  |«      }|j	                  |«       Œ] |S c c}w r’   )rx   ry   rU  rÇ  r  )rW  Ú
inputs_newrÈ   r¡   s       ru   rV  zInputsKernel.unwrap_storage;  sj   € àˆ
Øò 	!ˆAÜ˜!œTÔ"ØGHÖIÀ!”\×:Ñ:¸1Õ=ÐI�ÑIä ×9Ñ9¸!Ó<�Ø×Ñ˜aÕ ð	!ð Ðùò	 Js   œA%c                 ó   — yrL  rs   r6  s    ru   rÇ  zInputsKernel.is_externF  rK  rt   c                 ó   — yrW  rs   r6  s    ru   r½  zInputsKernel.num_readsI  rÞ  rt   Nrü  rý  )rÈ   rc   rŒ   rc   rÞ  rþ  )ro   rp   rq   rr   r·  r@  rx  rÇ  r  rV  rÇ  r½  rs   rt   ru   rU  rU    sD   … àÓó
ó,,ð òó ðð$ ñó ðóôrt   rU  c                  ó   — e Zd Zdd„Zdd„Zy)Ú	NopKernelc                 ó   — yrL  rs   r6  s    ru   rÉ  zNopKernel.is_no_opN  rK  rt   c                ó   — t        «       S r’   r+   r6  s    ru   r@  zNopKernel.get_readsQ  r&  rt   NrÞ  rý  )ro   rp   rq   rÉ  r@  rs   rt   ru   rÏ  rÏ  M  s   „ óôrt   rÏ  c                  óJ   — e Zd ZdZed„ «       Zedd„«       Zed„ «       Zdd„Zy)	ÚConcatKernelzn
    There isn't actually a real kernel for concat, we just change the
    storage for the upstream data.
    c                ó,	  — |d   j                  «       }|d   j                  «       }t        |d   j                  «       «      }dg}||   g}d|cxk  rt	        |«      k  sJ ‚ J ‚t        dt	        |«      «      D ]æ  }||   j                  «       }	|j                  ||   «       t	        |	«      t	        |«      k(  sJ ‚||   j                  «       |k(  sJ ‚||   j                  «       |k(  sJ ‚t        t	        |«      «      D ]I  }
|
|k(  r||
   |	|
   z   ||
<   Œt        j                  j                  j                  ||
   |	|
   «      ||
<   ŒK |j                  ||   «       Œè t        j                  |«      }t        j                  r$t        j!                  |||d   j"                  «      }t        t	        |«      «      D ]k  }||   }t%        |«      sŒ|j'                  «       }t)        |t*        «      sŒ5t        j-                  |j.                  |j0                  «      sŒ`t3        |«      } n t5        d„ |D «       «      }t        j                  j6                  j8                  d   }t)        |t        «      sJ ‚|du rt5        d„ |D «       «      rt3        |«      }t;        d t+        ||||¬«      g ¬«      }t=        |«      }g }t        t	        |«      «      D ]ý  }| j?                  ||   t@        jC                  ||||   ||   d¬«      «      }|jD                  j                  |«       t)        ||   jF                  tH        «      r||   jF                  jK                  «       }n||   jF                  }|jM                  «       sŒ¬tO        ||   j                  «       jP                  «      sŒÓtS        |«      rŒß|j                  |jU                  «       «       Œÿ t	        |«      dkD  rMt        j                  jW                  |tX        jZ                  «      rt        j                  j]                  |«       t        j                  j_                  |«      |_0        | jc                  |jD                  «      |_"        t        j                  je                  |«       |S )	Nr   r1   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   )rÕ   rð  s     ru   rý   z&ConcatKernel.create.<locals>.<genexpr>„  s   è ø€ Ò-WÈ1Ô.CÀA×.FÑ-Wùr7  Fc              3  óô   K  — | ]p  }d |j                   v xr\ |j                   d    j                  t        j                  ¬«      xs- |j                   d    j                  t        j                  ¬«      –— Œr y­w)rN  ©ry  N)rH  r)  rÜ   rt  rv  )rû   Úargs     ru   rý   z&ConcatKernel.create.<locals>.<genexpr>ˆ  sq   è ø€ ò <
ð ð �S—X‘XÐò à—‘˜‘×-Ñ-¼E×<OÑ<OÐ-ÓPò WØ—8‘8˜E‘?×0Ñ0¼u×?UÑ?UÐ0ÓVóñ<
ùs   ‚A6A8)rÐ   rÏ   rÍ   rÎ   ©r–   r  rW  )rù  )3rÚ   rÙ   ry   rÔ   rž   rŸ   r  rV   rÑ   rÒ   r®  r×   rØ   r2   r\  rm  rY  rÏ   rÕ   rÖ   rx   r  r6  rÍ   rÎ   r"   r¨  rr  r”   rÓ  r1  r¸  rí  rR  rW  r  r8  r¤  Úis_input_bufferrN   r‡   rM   rÏ  r  r4   ÚFOREACHÚregister_operation_listrY  r–   rV  rZ  )rS  rW  r  rÐ   rÏ   rs  Úoffsets_startÚoffsets_endr¡   Ú
input_sizer4  Úoutput_striderÈ   r  Úany_input_is_storage_and_layoutÚfx_node_argsÚconcat_kernelÚkernelÚop_namesÚinput_bufferÚinput_unwrappeds                        ru   rR  zConcatKernel.create[  s  € à˜‘×%Ñ%Ó'ˆØ�q‘	×#Ñ#Ó%ˆÜ˜˜q™	×*Ñ*Ó,Ó-ˆØ˜ˆØ ‘}�oˆØ�CÔ'œ#˜h›-Ò'Ð'Ñ'Ð'Ð'Ü�qœ#˜f›+Ó&ò 	.ˆAØ ™×+Ñ+Ó-ˆJØ× Ñ  ¨#¡Ô/Ü�z“?¤c¨(£mÒ3Ð3Ð3Ø˜!‘9×&Ñ&Ó(¨EÒ1Ð1Ð1Ø˜!‘9×'Ñ'Ó)¨VÒ3Ð3Ð3Üœ3˜x›=Ó)ò �Ø˜’8Ø"*¨1¡+°
¸1±Ñ"=�H˜Q’Kä"#§'¡'×"2Ñ"2×"?Ñ"?Ø  ™ Z°¡]ó#�H˜Q’Kð	ð ×Ñ˜x¨™}Õ-ð	.ô '×9Ñ9¸(ÓCˆÜ×'Ò'ä"×/Ñ/Ø˜x¨°©¯©óˆMô
 ”s˜6“{Ó#ò 		ˆAØ�q‘	ˆAÜ$ QÕ'ØŸ™›�ÜØœKõä×8Ñ8¸¿¹ÀfÇmÁmÕTä$BÀ8Ó$L�MÙð		ô +.Ñ-WÐPVÔ-WÓ*WÐ'Ü—w‘w×+Ñ+×0Ñ0°Ñ3ˆÜ˜,¬Ô-Ð-Ð-à*¨eÑ3¼ñ <
ð $ô<
ô 9
ô ;¸8ÓDˆMä$ØÜØØØØ$ô	ð ô	
ˆô ˜MÓ*ˆØˆÜ”s˜6“{Ó#ò 	CˆAØ×+Ñ+Ø�q‘	Ü× Ñ Ø˜C ¨qÑ!1°;¸q±>Èð !ó óˆLð × Ñ ×'Ñ'¨Ô5ä˜& ™)Ÿ.™.¬(Ô3Ø"(¨¡)§.¡.×"<Ñ"<Ó">‘à"(¨¡)§.¡.�ð  ×/Ñ/Õ1Ü˜6 !™9×/Ñ/Ó1×6Ñ6Õ7Ü" <Õ0à—‘ × ?Ñ ?Ó AÕBð'	Cô* ˆx‹=˜1Ò¤§¡×!4Ñ!4°V¼^×=SÑ=SÔ!TÜ�G‰G×+Ñ+¨HÔ5äŸW™W×4Ñ4°]ÓCˆÔØ"×1Ñ1°-×2FÑ2FÓGˆÔÜ	�‰×"Ñ" =Ô1àˆrt   Nc                ód  — t        |t        «      r| j                  |j                  |«      S t        |j                  t        «      rªt        |j                  j
                  t        «      r|j                  j                  sy|€yt        |j                  «       «      t        |j                  «       «      k(  syt        d„ t        |j                  «       |j                  «       «      D «       «      S t        |j                  j
                  t        «      xr t        |j                  t        «       S )NFTc              3  óv   K  — | ]1  \  }}t         j                  j                  j                  ||«      –— Œ3 y ­wr’   r  r  s      ru   rý   z=ConcatKernel.can_realize_into_without_copy.<locals>.<genexpr>Ò  s3   è ø€ ò á�B˜ô —‘× Ñ ×8Ñ8¸¸R×@ñùr  )rx   rb   Úcan_realize_into_without_copyr  r“  r  r  r¢  rž   rú   r   r§   r×   ÚExternKernelAlloc)rS  rµ  r¶  s      ru   rê  z*ConcatKernel.can_realize_into_without_copy¼  sè   € ä�cœ9Ô%à×4Ñ4°S·X±X¸sÓCÐCä�c—h‘hÔ 3Ô4ä˜sŸx™xŸ™´Ô<Ø—x‘x×0Ò0àð ˆ{Øô �s—~‘~Ó'Ó(¬C°·±Ó0@Ó,AÒAØäñ ä! #§.¡.Ó"2°C·N±NÓ4DÓEôó ð ô
 ˜#Ÿ(™(Ÿ/™/¬>Ó:ò 
Ä:Ø�H‰HÔ'óD
ð @
ð 	
rt   c                óL  — t        |t        «      s&t        |«      rt        |«      \  }}t        ||¬«      }t        |t        «      sJ |«       ‚t        |t        «      r| j                  |j                  |«      S t        |t        «      r`|j                  «        t        |j                  d«      sJ ‚| j                  ||«      r&t        |«      |j                  _        |j                  S t        j                  |j                  «       |j!                  «       |j#                  «       t%        |j'                  «       |j'                  «       «      D ��cg c]/  \  }}t(        j*                  j,                  j/                  ||«      ‘Œ1 c}}¬«      }| j                  ||«      S c c}}w )Nr  r  r–  )rx   r  rÕ   r  rb   r¸  r  r1  r  r  rê  rˆ  r  rƒ  rR  rÚ   rÙ   rŽ  r§   rÔ   rV   rÑ   rÒ   r®  )rS  rµ  r¶  r  r  r¹  rº  Úpws           ru   r¸  zConcatKernel.realize_intoÛ  sH  € ô
 ˜#œÔ/Ü$ SÔ)Ü"7¸Ó"<‘�˜Ü%¨7¸6ÔB�Ü˜#œÔ/Ð4°Ó4Ð/Ü�cœ9Ô%à×#Ñ# C§H¡H¨cÓ2Ð2ä�cœ:Ô&Ø�K‰KŒMä˜3Ÿ8™8 XÔ.Ð.Ð.Ø×0Ñ0°°cÔ:Ü"1°#Ó"6�—‘”Ø—x‘x�ä×ÑØ—>‘>Ó#Ø—-‘-“/Ø—_‘_Ó&ô   §¡£°·±³Ó?÷á�A�qô —‘× Ñ ×-Ñ-¨a°Õ3óð	 ó 
ˆð ×Ñ  CÓ(Ð(ùós   Å4F c                 ó   — yrL  rs   r6  s    ru   rß  zConcatKernel.should_allocateü  rK  rt   r’   rÞ  )	ro   rp   rq   rß  rx  rR  rê  r¸  rß  rs   rt   ru   rÓ  rÓ  U  sL   „ ñð
 ñ^ó ð^ð@ ò
ó ð
ð< ñ)ó ð)ô@rt   rÓ  c                  ó¶  ‡ — e Zd ZU dZded<    ej                  e¬«      Zded<   dZ	ded	<   dZ
d
ed<   dZd
ed<    ej                  e¬«      Zded<   dZded<   dZded<   dZded<    ej                  e¬«      Zded<    ej                  e¬«      Zded<   	 	 	 	 	 	 	 d9	 d:ˆ fd„Zd;d„Zd<d„Zd„ Zd„ Zd:d„Zd„ Zd=d>d „Zd?d!„Zd"„ Zed#„ «       Ze	 	 d@d$„«       Z ed%„ «       Z!ed&„ «       Z"ed'„ «       Z#e	 	 	 dA	 	 	 dBd(„«       Z$edCd)„«       Z%edCd*„«       Z&ed+„ «       Z'ed,„ «       Z(ed-„ «       Z)d:d.„Z*d/„ Z+d=dDd0„Z,d1„ Z-d2„ Z.dCd3„Z/d:d4„Z0d5„ Z1d6„ Z2d<d7„Z3dEd8„Z4e4Z5ˆ xZ6S )Fr©  rs   ztuple[Any, ...]Úconstant_argsrž  zdict[str, Any]r•   NzOptional[ReinterpretView]Úoutput_viewrä  Úpython_kernel_nameÚcpp_kernel_namezIterable[str]Úordered_kwargs_for_cpp_kernelzFOptional[Union[torch._ops.OpOverload, torch._ops.HigherOrderOperator]]Úop_overloadzOptional[list[dict[str, Any]]]Úarg_propertiesz#Optional[dict[str, dict[str, Any]]]Úkwarg_propertiesz"dict[sympy.Symbol, pytree.KeyPath]Úunbacked_bindingszlist[MutationOutput]Úmutation_outputsc                ó6  •— t         ‰| �  |||¬«       || _        |r|ni | _        || _        |
| _        | j                  |«       | j                  |«       |	| _        | j                  «        i | _
        g | _        t        j                  j                  | _        y ©NrÙ  )rB  r©  rð  r•   rñ  rõ  Úset_cpp_kernel_nameÚset_python_kernel_namerô  Úcollect_arg_kwarg_propertiesrø  rù  rV   rÑ   rr  Úfx_node)r0  r–   r  rW  rð  r•   rñ  rò  ró  rô  rõ  rD  s              €ru   r©  zExternKernel.__init__  s—   ø€ ô 	‰ÑØØØð 	ô 	
ð
 +ˆÔÙ &‘f¨BˆŒØ&ˆÔØ&ˆÔØ× Ñ  Ô1Ø×#Ñ#Ð$6Ô7Ø-JˆÔ*Ø×)Ñ)Ô+Ø!#ˆÔØ "ˆÔÜ—w‘w×+Ñ+ˆ�rt   c                ó    — | g| j                   ¢S r’   )rù  r6  s    ru   r#  zExternKernel.get_outputs4  s   € ØÐ-�t×,Ñ,Ð-Ð-rt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  z%ExternKernel.get_unbacked_symbol_defs7  r&  rt   c                ó@  — t        | j                  t        j                  j                  «      r\| j                  j
                  j                  D �cg c]2  }|j                  s$|j                  |j                  |j                  dœ‘Œ4 c}n+t        t        | j                  «      «      D �cg c]  }i ‘Œ c}| _        t        | j                  t        j                  j                  «      rP| j                  j
                  j                  D �ci c]&  }|j                  |j                  |j                  dœ“Œ( c}ni | _        t        | j                  t        j                  j                  «      r—| j                   sJ| j                  j
                  j                  D �cg c]  }|j                  sŒ|j                  ‘Œ c}| _        | j                  j
                  j                  D �cg c]  }|j                  sŒ|‘Œ c}| _        y y c c}w c c}w c c}w c c}w c c}w )N)r–   r‡   rh  )r‡   rh  )rx   rõ  rÜ   Ú_opsÚ
OpOverloadÚ_schemaÚ	argumentsÚ
kwarg_onlyr–   Ú	real_typerh  rŸ   rž   rW  rö  Úallarg_propertiesrô  Úschema_kwargs)r0  rÈ   r¡   s      ru   rþ  z)ExternKernel.collect_arg_kwarg_properties:  s   € ô ˜$×*Ñ*¬E¯J©J×,AÑ,AÔBð ×)Ñ)×1Ñ1×;Ñ;öð Ø—|’|ð ŸF™FØŸK™KØ%&§_¡_óóô $¤C¨¯©Ó$4Ó5Ö6˜’"Ò6ð 	Ôô$ ˜$×*Ñ*¬E¯J©J×,AÑ,AÔBð ×)Ñ)×1Ñ1×;Ñ;öàð —‘ §¡¸q¿¹ÑOÑOóð
 ð 	Ôô �d×&Ñ&¬¯
©
×(=Ñ(=Ô>Ø×5Ò5à$(×$4Ñ$4×$<Ñ$<×$FÑ$Fö6Ø È!Ï,Ë,�A—F“Fò6�Ô2ð  ×+Ñ+×3Ñ3×=Ñ=ö"ØÀÇÃ’ò"ˆDÕð ?ùò-ùò 7ùòùò6ùò"s*   Á7HÂ+	HÄ+HÆHÆ/HÇ'HÇ9Hc                óz   — t        | j                  t        «      r!| j                  «        | j	                  «        y y r’   )rx   r  r×   Úapply_constraintr¦  r6  s    ru   r
  zExternKernel.decide_layout]  s-   € Ü�d—k‘k¤>Ô2Ø×!Ñ!Ô#Ø×ÑÕ ð 3rt   c                óJ   — t        | |«      \  }}|r|j                  |«       y y r’   )rK   rÜ  )r0  ÚwrapperÚ
origin_strÚ_detailed_origin_strs       ru   Úcodegen_commentzExternKernel.codegen_commentb  s*   € Ü+>¸tÀWÓ+MÑ(ˆ
Ð(ÙØ×Ñ˜jÕ)ð rt   c                ó   — t         ‚r’   r  ©r0  r  s     ru   ÚcodegenzExternKernel.codegeng  r  rt   c                óÔ  — || _         t        j                  j                  r.t	        | j
                  t        j                  j                  «      sy | j
                  }| j                   €€|j                  dk(  rU|j                  dk(  r|j                  j                  d«      d   n|j                  j                  dd«      }d|› d�| _         y |j                  j                  | _         y y )NÚatenrw  ú.r   rÂ   z
at::_ops::z::call)ró  rV   rÑ   Úcpp_wrapperrx   rõ  rÜ   r  r  Ú	namespaceÚ_overloadnamero   r-  Úreplacer  r–   )r0  ró  rä  Úopnames       ru   rü  z ExternKernel.set_cpp_kernel_namej  sÉ   € Ø.ˆÔÜ�w‰w×"Ò"¬*Ø×ÑœeŸj™j×3Ñ3ô+
ð à×!Ñ!ˆØ×ÑÐ'à×Ñ 6Ò)ð ×+Ñ+¨yÒ8ð —O‘O×)Ñ)¨#Ó.¨qÒ1àŸ™×0Ñ0°°cÓ:ð ð
 *4°F°8¸6Ð'B�Õ$à'-§~¡~×':Ñ':�Õ$ð (rt   c                ó  — || _         |�y | j                  }|€y t        |t        j                  j
                  «      rd|j                  › �| _         y |j                  j                  dd«      › d|j                  › �| _         y )Nztorch.ops.higher_order.z._ops.z.ops.r  )	rò  rõ  rx   rÜ   r  ÚHigherOrderOperatorro   rp   r  )r0  rò  rä  s      ru   rý  z#ExternKernel.set_python_kernel_name‚  s   € Ø"4ˆÔØÐ)Øà×!Ñ!ˆØˆ>ØÜ˜¤§
¡
× >Ñ >Ô?Ø(?ÀÇÁÐ?PÐ&QˆDÕ#ð ×$Ñ$×,Ñ,¨X°wÓ?Ð@ÀÀ&Ç/Á/ÐARÐSð Õ#rt   c                ó&  — | j                  «       x}r|j                  nt        j                  j                  }t        j                  j
                  r4t        j                  j                  j                  | j                  |«      S | j                  S r’   )
rÚ   r‡   rV   rÑ   Údevice_typer  rÚ  Úget_c_shim_func_nameró  rò  )r0  ÚdrÐ   s      ru   Úget_kernel_namezExternKernel.get_kernel_name‘  sn   € Ø!%§¡Ó!2Ð2˜AÐ2�—’¼¿¹×9LÑ9Lˆô �w‰w×"Ò"ô �G‰G× Ñ ×5Ñ5°d×6JÑ6JÈFÓSð	
ð ×(Ñ(ð	
rt   c           	     ó  — t         j                  | j                  «       | j                  «       | j	                  «       | j                  «       | j                  «       | j                  «       ¬«      }|j                  «        |S )N)rÐ   rÏ   r0  r1  r*  r(  )	rƒ  rR  rÚ   rÙ   rŽ  rÔ   rG  rD  r  )rÈ   rí  s     ru   Ú
copy_inputzExternKernel.copy_input™  sa   € ä×ÑØ—<‘<“>Ø—+‘+“-Ø—]‘]“_Ø—:‘:“<Ø×)Ñ)Ó+Ø—o‘oÓ'ð ó 
ˆð 	�
‰
ŒØˆ	rt   c                óH  ‡‡— ||dœ}t        j                  |«      \  }Šg Šg }g }|D ]«  }‰j                  t        |t        «      xr t        |t
        «       «       ‰d   r|j                  |«       ŒLt        |t        j                  «      r5t        j                  j                  j                  j                  |d ¬«      }|j                  |«       Œ­ ˆˆfd„}	|D �
cg c]  }
| j                  |
«      ‘Œ }}
|D ]  }
t        |
«      sŒt        |
d¬«       Œ g }|D �]×  }
t        |
t         «      se|
j#                  «       t        j                  j$                  v r;|j                  t        j                  j$                  |
j#                  «          «       Œyt        |
t         «      se|
j#                  «       t        j                  j&                  v r;|j                  t        j                  j&                  |
j#                  «          «       Œît        |
t(        «      r!|j                  |
j+                  «       «       �Œt        |
t,        j.                  j0                  j
                  «      ro|
j2                  j4                  }|
j2                  j6                  dk(  r|€J ‚|j                  t,        j8                  j:                  |   j=                  «       «       �Œ¼|j                  t?        |
d¬«      «       �ŒÚ  |	||«      \  }} ||i |¤Ž}d }t        j@                  j                  x}rOtC        |t        jD                  |«       tG        ||t        jD                  jH                  jK                  d	«      «      }t        |tL        tN        f«      s|gn|}|D ]~  }t        |t,        jP                  «      sŒ|jR                  sŒ+d
}t        j                  jD                  jH                  jK                  dd «      x}r|› d|› �}|t        j                  _*        Œ€ ||||	|fS c c}
w )N)r”   r•   rþ   )r]  c                ó$  •— g }t        | «      }t        |«      }‰D ]9  }|r|j                  t        |«      «       Œ |j                  t        |«      «       Œ; t        j                  |‰«      }|j                  dg «      |j                  di «      fS )Nr”   r•   )Úiterr  ÚnextÚpytreeÚtree_unflattenrN  )	Únew_tensor_argsÚnew_non_tensor_argsrà  Ú
it_tensorsÚit_non_tensorsÚ	is_tensorrU  Ú	args_specÚis_arg_tensors	          €€ru   Úunflatten_argsz3ExternKernel.process_kernel.<locals>.unflatten_argsÃ  s†   ø€ ØˆFÜ˜oÓ.ˆJÜ!Ð"5Ó6ˆNØ*ò 8�	ÙØ—M‘M¤$ zÓ"2Õ3à—M‘M¤$ ~Ó"6Õ7ð	8ô
 ×%Ñ% f¨iÓ8ˆAØ—5‘5˜ Ó$ a§e¡e¨H°bÓ&9Ð9Ð9rt   Tr#  rî   )rÉ   rN  zEsparsity not handled. Please file issue for sparse inference weights.Ústack_tracez Found from : 
 )+r*  Útree_flattenr  rx   rc   ÚGeneratorStater€   r   rV   rÑ   rÒ   r·   Úcreate_symintnoderÆ  rÕ   r  r8  r•  Ú	constantsÚtorchbind_constantsrÈ  Úget_real_objrÜ   r–  ÚirrÐ   r    r‡   rî   Údefault_generatorsÚclone_staterÊ   Ú	fake_moder'   rr  r%   rH  rN  ry   rz   ÚTensorÚ	is_sparseÚdisable_cudagraphs_reason)rS  rä  r”   r•   Úbinded_argsÚ	args_flatÚtensor_argsÚnon_tensor_argsrØ  r3  rÈ   Úexample_argsÚdevice_indexÚnew_argsÚ
new_kwargsÚexample_outputrø  r·   Úexample_out_lirá   Úmsgr4  r1  r2  s                         @@ru   Úprocess_kernelzExternKernel.process_kernel¦  s{  ù€ ð  $¨vÑ6ˆä%×2Ñ2°;Ó?Ñˆ	�9àˆàˆØ%'ˆØò 		,ˆCØ× Ñ Ü˜3¤Ó'ÒO´
¸3ÄÓ0OÐ,Oôð ˜RÒ Ø×"Ñ" 3Õ'ä˜c¤5§:¡:Ô.ÜŸ'™'×*Ñ*×4Ñ4×FÑFÀsÐQUÐFÓV�CØ×&Ñ& sÕ+ð		,õ
	:ð 6AÖA°�s×(Ñ(¨Õ+ÐAˆÐAð ò 	6ˆAÜ$ QÕ'Ü% a°Ö5ð	6ð ð 	ð ó 	LˆAô ˜a¤Ô*¨q¯z©z«|¼q¿w¹w×?PÑ?PÑ/PØ×#Ñ#¤A§G¡G×$5Ñ$5°a·j±j³lÑ$CÕDä˜q¤(Ô+Ø—J‘J“L¤A§G¡G×$?Ñ$?Ñ?à×#Ñ#¤A§G¡G×$?Ñ$?ÀÇ
Á
ÃÑ$MÕNÜ˜AœÔ/Ø×#Ñ# A§N¡NÓ$4Ö5Ü˜AœuŸ™×1Ñ1×@Ñ@ÔAØ Ÿx™xŸ~™~�Ø—x‘x—}‘}¨Ò.°<Ð3KÐKÐKØ×#Ñ#Ü—J‘J×1Ñ1°,Ñ?×KÑKÓMöð ×#Ñ#Ô$5°aÀTÔ$JÖKð'	Lñ*  .¨l¸OÓLÑˆ�*Ù Ð8¨ZÑ8ˆàJNÐÜŸ™×-Ñ-Ð-ˆ9Ð-Ü˜I¤q§~¡~°~ÔFÜ 9Ø˜>¬1¯>©>×+>Ñ+>×+BÑ+BÀ5Ó+Ió!Ðô ˜n¬t´U¨mÔ<ð Ñàð 	ð
  ò 	8ˆAÜ˜!œUŸ\™\Õ*¨q¯{«{Ø]�Ü"#§'¡'×"6Ñ"6×";Ñ";×"?Ñ"?ÀÈtÓ"TÐT�;ÐTØ ˜EÐ!2°;°-Ð@�CØ47”—‘Õ1ð	8ð ØØØØð
ð 	
ùò{ Bs   Ã Pc           
     óê  — t        |t        «      sJ ‚t        |t        «      r|S |j                  «       }t        j
                  j                  |j                  «       «      }|€J ‚|j                  «       }|�«d|j                  v r�t        |j                  t        «      rƒ|j                  d   j                  t        j                  ¬«      s-|j                  d   j                  t        j                  ¬«      r)|j!                  t#        |j%                  «       «      «       n|j'                  «        t)        j*                  |j%                  «       d¬«      \  }}|d   } |j-                  «       |«      }t        j
                  j.                  j1                  ||«      }t        j
                  j.                  j3                  ||«      }	t        j
                  j.                  j5                  ||«      }
t7        ||	«      |
z   }||k7  rt8        j;                  d|	|
|«       t<        ‚t        |j>                  tA        |jC                  «       |jE                  «       |j%                  «       |	|
¬«      ¬«      S )	z 
        In order to pass this to an extern kernel we need a
        ReinterpretView not a View.  This allows us to avoid some
        unneeded copies.
        rN  r×  rU  r`   r   z@convert_to_reinterpret_view failed: stride=%s offset=%s index=%sra  r  )#rx   r8  r  r¤  rV   rÑ   r¨  r•  rG  rH  r  r×   r)  rÜ   rt  rv  r±  r"   rÔ   r¦  r3   r   r‘  rÒ   r!  Ústride_varsÚ
offset_varrO   r  r  r_  r  r  r‡  rÙ   )rS  rÈ   Úx_unwrap_viewr  Úx_unwrap_view_fx_nodeÚ
index_argsr  r  r    r  r  Úexpecteds               ru   Úconvert_to_reinterpret_viewz(ExternKernel.convert_to_reinterpret_view  s  € ô ˜!œXÔ&Ð&Ð&Ü�aœÔ)ØˆHð Ÿ™›ˆÜ�g‰g× Ñ  ×!7Ñ!7Ó!9Ó:ˆØˆÐˆØ #× 3Ñ 3Ó 5Ðð "Ð-ØÐ.×3Ñ3Ñ3Ü˜=×/Ñ/´Ô@à%×*Ñ*¨5Ñ1×?Ñ?Ü"'×"5Ñ"5ð @ô ð )×-Ñ-¨eÑ4×BÑBÜ"'×"8Ñ"8ð Cô ð
 ×7Ñ7Ü.¨}×/EÑ/EÓ/GÓHõð ×'Ñ'Ô)ä!-×!@Ñ!@Ø�J‰J‹LØô"
Ñˆ
�Jð   ‘]ˆ
Ø �—‘Ó  Ó,ˆä—‘× Ñ ×5Ñ5°e¸ZÓHˆÜ—'‘'×"Ñ"×.Ñ.¨u°jÓAˆÜ—‘×!Ñ!×,Ñ,¨U°JÓ?ˆÜ˜Z¨Ó1°FÑ:ˆà�HÒÜ�I‰IØRØØØô	ô &Ð%äØ—‘ÜØ×,Ñ,Ó.Ø—k‘k“mØ—Z‘Z“\ØØôô	
ð 		
rt   c                óÚ  — |€
t        «       S t        |t        j                  t        j                  j
                  j                  t        f«      rt        |¬«      S t        |t        «      r[t        j                  j                  t        j                  |j                  |j!                  «       |j#                  «       ¬«      «      S t        |t$        «      r|S t        |t&        «      r| j)                  |j*                  «      S t        |t,        «      r4t-        | j)                  |j*                  «      |j/                  «       ¬«      S t        |t0        «      r;|j3                  «        t5        |j7                  «       «      r	 | j9                  |«      S t        |t<        «      r|j3                  «        |S t        |t>        t        f«      r|S | jA                  |«      S # t:        $ r Y ŒVw xY w)N)rC  )rÏ   rÐ   r  )!rò  rx   r€   r   r�   r‚   rƒ   r„   r†   r  rV   rÑ   Úadd_tensor_constantrÜ   r  rä   rÙ   rÚ   r—  rb   rÆ  r  r  rÖ   r8  r  rÕ   r¤  rU  r_  r1  ÚNonTensorObjr%  rÉ  s     ru   rÆ  zExternKernel.realize_inputY  sm  € àˆ9Ü'Ó)Ð)Ü�aœ%Ÿ*™*¤e§k¡k×&9Ñ&9×&AÑ&AÄ3ÐGÔHÜ(¨aÔ0Ð0Ü�aœÔ"Ü—7‘7×.Ñ.Ü—‘˜QŸW™W¨A¯K©K«MÀ!Ç,Á,Ã.ÔQóð ô �aœÔ(ØˆHÜ�aœÔ#Ø×$Ñ$ Q§V¡VÓ,Ð,Ü�aœÔ)Ü"Ø×&Ñ& q§v¡vÓ.°q·|±|³~ôð ô �aœÔ"Ø�I‰IŒKÜ$ Q§]¡]£_Ô5ðØ×:Ñ:¸1Ó=Ð=ô �aœÔ$à�I‰IŒKØˆHÜ�aœ,Ô(=Ð>Ô?ØˆHØ�~‰~˜aÓ Ð øô +ò Ùðús   ÆG Ç	G*Ç)G*c                ó²   — t        |«      r<t        |j                  «       «      dk(  r|S |j                  «       D ]  }|dk(  sŒ	|c S  | j                  |«      S rE  )rÕ   rž   rú   r%  )rS  rÈ   rÎ   s      ru   Úrequire_stride1zExternKernel.require_stride1z  sT   € ä  Ô#Ü�1—<‘<“>Ó" aÒ'Ø�ØŸ,™,›.ò �Ø˜Q“;Ø’Hðð �~‰~˜aÓ Ð rt   c                óž	  — |€|€J ‚|j                  «       dv r|s|S t        |«      �rt        |j                  «       t        «      r}|rht        |ddt        ||«      rJt        t        j                  j                  j                  |j                  «       j                  «      «      n||¬«       |S t        |ddd ||¬«       |S t        |j                  «       t        t        f«      rf|r|j                  «       j                  |«      s5|rCt!        ||j                  «       j                  |j#                  «       «      r|�t%        ||«      S |S t        |j                  «       t&        «      r×t        |j                  «       j)                  «       t        «      rt+        d«      ‚t        |j                  «       j)                  «       t        «      rt|r-|j                  «       j)                  «       j                  |«      sC|rCt!        ||j                  «       j)                  «       j                  |j#                  «       «      r|S t        |t,        «      rX|r|j                  «       j                  |«      s5|r5t!        ||j                  «       j                  |j#                  «       «      r|S t        |t.        «      rÃt        |j0                  t2        «      r©t        |j0                  t4        «      s�t        |j7                  «       «      rvt        |j7                  «       j0                  t8        «      sN	 | j;                  |j0                  «      |_        |r| j=                  |||¬«      S |r| j?                  |||¬«      S 	 d }|j#                  «       }|�´t        j                  j                  }tC        tE        |j#                  «       «      «      D �cg c]<  }|jG                  ||   d«      r%|jI                  |j#                  «       |   d	«      r|‘Œ> }}|D ].  }	tJ        jL                  jN                  jQ                  ||	dd
«      }Œ0 | jS                  |«      }t        |dd|||¬«       |rt        ||«      sJ ‚|S |r<|�|€J ‚tJ        jL                  jN                  jU                  ||«      }t%        ||«      S |S # t@        $ r Y �ŒHw xY wc c}w )N)r   r1   TF)r$  r.  r/  r©  r-  zHthe MutationLayoutSHOULDREMOVE's real layout shouldn't be FlexibleLayoutr0  r   r³   r1   )+rv  rÕ   rx   rÖ   r×   r  r6  rÅ   rV   rÑ   rÒ   Ú
size_hintsrÎ   r  rˆ  r5  r  rÔ   r!  r¦  r«  r‘  rç  rb   r  r8  r  r¤  rë  rU  Úrequire_stride_orderrª  r_  rŸ   rž   r  rò  rÜ   r–  ÚloweringÚslice_r%  rB  )
rS  rÈ   r¨   r´  r©  Úexpanded_dimsÚ	orig_sizerÒ   r¡   r  s
             ru   Úrequire_strideszExternKernel.require_strides„  s>  € ð Ð  MÐ$=Ð=Ð=à�;‰;‹=˜FÑ"©=ØˆHô ! Õ#Ü˜!Ÿ,™,›.¬.Ô9Ùô *ØØ#Ø(-ô
  BÀ!ÀUÔKô -Ü !§¡× 0Ñ 0× ;Ñ ;¸A¿L¹L»N×<QÑ<QÓ Rôð "'à&3õð �Hô *ØØ#Ø(-Ø%)Ø&3Ø&3õð �HÜ˜AŸL™L›N¬[¼/Ð,JÔKÙ˜1Ÿ<™<›>×;Ñ;¸EÔBá!Ü1Ø% q§|¡|£~×'<Ñ'<¸a¿j¹j»lôð %Ð0ô 4°A°}ÓEðð ðô
 ˜AŸL™L›NÔ,FÔGÜ˜aŸl™l›n×8Ñ8Ó:¼NÔKÜ(Øbóð ô   §¡£× :Ñ :Ó <¼kÔJÙ˜qŸ|™|›~×9Ñ9Ó;×MÑMÈeÔTá%Ü5Ø)ØŸL™L›N×6Ñ6Ó8×?Ñ?ØŸJ™J›Lôð �Hô �aœÔ%Ù�q—|‘|“~×7Ñ7¸Ô>áÜ-Ø! 1§<¡<£>×#8Ñ#8¸!¿*¹*»,ôð
 ˆHä�qœ)Ô$Ü˜1Ÿ6™6¤8Ô,Ü˜qŸv™v¤Ô7Ü% a§m¡m£oÔ6Ü˜qŸ}™}›×3Ñ3Ô5FÔGðØ×8Ñ8¸¿¹Ó@�”ÙØ×3Ñ3Ø˜5°ð 4ó ð ñ #Ø×4Ñ4Ø˜=¸ð 5ó ð ð #ð .2ˆØ—J‘J“Lˆ	ØÐ$Ü—w‘w×'Ñ'ˆHô œs 1§:¡:£<Ó0Ó1öàØ×3Ñ3°MÀ!Ñ4DÀaÔHØ×1Ñ1°!·*±*³,¸q±/À1ÔEò ðˆMð ð %ò B�Ü—O‘O×,Ñ,×3Ñ3°A°s¸A¸qÓA‘ðBð
 �N‰N˜1ÓˆäØØØ!ØØ'Ø'õ	
ñ Ü5°a¸Ô?Ð?Ð?ð ˆñ ØÐ(¨]Ð-FÐFÐFÜ—‘×(Ñ(×/Ñ/°°9Ó=ˆAä2°1°mÓDÐDàˆøôW 'ò Úðüòs   Ì15R: Í'R: ÏAS
Ò:	SÓSc                ó*   — | j                  |||¬«      S )N)r´  r©  ©rb  )rS  rÈ   r´  r©  s       ru   rª  z"ExternKernel.require_exact_strides!  s!   € à×"Ñ"Ø˜]¸-ð #ó 
ð 	
rt   c                ó*   — | j                  |||¬«      S )N)r¨   r©  rd  )rS  rÈ   r¨   r©  s       ru   r]  z!ExternKernel.require_stride_order'  s   € à×"Ñ" 1¨EÀÐ"ÓOÐOrt   c                ó.   — | j                  |t        «      S r’   )r]  ru  rÉ  s     ru   Úrequire_channels_lastz"ExternKernel.require_channels_last+  s   € à×'Ñ'¨Ô+<Ó=Ð=rt   c                ó.   — | j                  |t        «      S r’   )r]  rw  rÉ  s     ru   Úrequire_channels_last_3dz%ExternKernel.require_channels_last_3d/  s   € à×'Ñ'¨Ô+=Ó>Ð>rt   c                óŠ   — | j                  |t        t        t        t	        |j                  «       «      «      «      «      «      S r’   )r]  ry   r8  rŸ   rž   rÔ   rÉ  s     ru   Úrequire_contiguouszExternKernel.require_contiguous3  s/   € à×'Ñ'¨¬4´¼¼sÀ1Ç:Á:Ã<Ó?PÓ9QÓ0RÓ+SÓTÐTrt   c                 ó   — y r’   rs   r6  s    ru   r  zExternKernel.apply_constraint7  r   rt   c                ó¾  — t        |t        t        f«      sJ ‚t        |t        «      rt        |«      }| j                  sJ d«       ‚t	        |«      }t	        | j                  «      }||k  rqt
        j                  d| j                  ||z
  «       t        ||«      D ]>  }| j                  |   d   }|j                  ||v r||   n| j                  |   d   «       Œ@ |S )Nz/ExternKernel.arg_properties should not be emptyzv%s has %d unprovided positional arguments. Will check if they are in the keyword arguments or will use default values.r–   rh  )
rx   ry   rz   rö  rž   r  r  rõ  rŸ   r  )r0  r”   r•   Ún_argsÚ
n_pos_argsr¡   Úarg_names          ru   Úfill_non_provided_argsz#ExternKernel.fill_non_provided_args:  së   € ô ˜$¤¤u Ô.Ð.Ð.Ü�dœEÔ"Ü˜“:ˆDØ×"Ò"ÐUÐ$UÓUÐ"ä�T“ˆÜ˜×,Ñ,Ó-ˆ
ð �JÒÜ�I‰Ið^à× Ñ Ø˜VÑ#ô	ô ˜6 :Ó.ò �Ø×.Ñ.¨qÑ1°&Ñ9�Ø—‘à 6Ñ)ð ˜8Ò$à×,Ñ,¨QÑ/°Ñ@õðð ˆrt   c                ó8  — t         j                  j                  �rCg }d }|r]| j                  rQt	        | j
                  «      t	        |«      k(  sJ d«       ‚| j                  D �ci c]  }|j                  d«      |“Œ }}t        | j
                  «      D ]Æ  \  }}|�*|j                  ||   «      }|r|j                  d«      nd }n\t	        | j                  «      |z   }	| j                  r6|	t	        | j                  «      k  r| j                  |	   j                  d«      nd }|j                  t         j                  j                  j                  ||«      «       ŒÈ |S t        t         j                  j                  j                  | j
                  «      S c c}w )NzDnames passed to codegen_const_args does not match self.constant_argsr–   r‡   )rV   rÑ   r  rö  rž   rð  rN  r»   rW  r  rÚ  Úval_to_arg_strrT  )
r0  r?  rà  Úname_to_arg_propertiesrØ  r¡   rÈ   ÚpropÚtype_r¼   s
             ru   Úcodegen_const_argszExternKernel.codegen_const_args\  ss  € Ü�7‰7×ÓØˆFð
 &*Ð"Ù˜×,Ò,Ü˜4×-Ñ-Ó.´#°e³*Ò<ð ØZóÐ<ð 59×4GÑ4Gö*Ø-0�C—G‘G˜F“O SÑ(ð*Ð&ð *ô " $×"4Ñ"4Ó5ò M‘��1Ø)Ð5Ø1×5Ñ5°e¸A±hÓ?�DÙ04˜DŸH™H VÔ,¸$‘Eä˜dŸk™kÓ*¨QÑ.�Cð  ×.Ò.°3¼¸T×=PÑ=PÓ9QÒ3Qð ×+Ñ+¨CÑ0×4Ñ4°VÔ<à!ð ð
 —‘œaŸg™g×2Ñ2×AÑAÀ!ÀUÓKÕLðMð ˆMä”q—w‘w×+Ñ+×:Ñ:¸D×<NÑ<NÓOÐOùò%*s   Á$Fc                óò  — t         j                  j                  rC| j                  �7| j	                  g | j
                  ¢| j                  ¢| j                  «      }d}n| j
                  }d}g }t        |«      D ]Ú  \  }}t         j                  j                  rƒ| j                  r|t        | j                  «      k  sJ d«       ‚| j                  |   j                  d«      }|j                  t         j                  j                  j                  ||«      «       Œ£|j                  t         j                  j                  j                  |«      «       ŒÜ |r|j                  | j!                  «       «       |S )NFTz-Invalid access to ExternKernel.arg_propertiesr‡   )rV   rÑ   r  rõ  rq  rW  rð  r•   r»   rö  rž   rN  r  rÚ  rs  r2  rw  )r0  rW  Úneed_codegen_constant_argsr”   r¡   rÈ   rv  s          ru   Úcodegen_argszExternKernel.codegen_args|  s5  € Ü�7‰7×Ò 4×#3Ñ#3Ð#?à×0Ñ0Ø3�$—+‘+Ð3 × 2Ñ 2Ð3°T·[±[óˆFð */Ñ&à—[‘[ˆFØ)-Ð&àˆÜ˜fÓ%ò 	D‰DˆAˆqÜ�w‰w×"Ò"Ø×*Ò*¨q´3°t×7JÑ7JÓ3KÒ/Kð ØCóÐKð ×+Ñ+¨AÑ.×2Ñ2°6Ó:�Ø—‘œAŸG™G×0Ñ0×?Ñ?ÀÀ5ÓIÕJà—‘œAŸG™G×0Ñ0×?Ñ?ÀÓBÕCð	Dñ &Ø�K‰K˜×/Ñ/Ó1Ô2Øˆrt   c                ó"  — ||v r|j                  |«      S || j                  v r| j                  j                  |«      S | j                  r8|| j                  v r*| j                  j                  |«      j                  d«      S t        |› d�«      ‚)zÚGiven an argument name, queries for values in (in order):
        1. any provided kwargs for this function.
        2. the class self.kwargs member.
        3. any available default arguments in self.allarg_properties.rh  z not in self.allarg_properties)rN  r•   r	  r‘  )r0  rp  r•   s      ru   Úget_kwargs_valuezExternKernel.get_kwargs_value–  s…   € ð
 �vÑØ—:‘:˜hÓ'Ð'Ø�t—{‘{Ñ"Ø—;‘;—?‘? 8Ó,Ð,Ø×!Ò! h°$×2HÑ2HÑ&HØ×)Ñ)×-Ñ-¨hÓ7×;Ñ;¸OÓLÐLÜ ˜zÐ)GÐHÓIÐIrt   c           	     óô  — t         j                  j                  rÿ| j                  �t	        | j
                  «      dk(  rg S g }| j                  D ]Æ  }|r|dk(  rŒ| j                  |«      }t        |t        j                  «      r|j                  |«       ŒH| j                  r8|| j                  v r*| j                  j                  |«      j                  d«      nd }|j                  t         j                  j                  j                  ||«      «       ŒÈ |S | j                   j#                  «       D ��cg c]3  \  }}|› dt         j                  j                  j                  |«      › �‘Œ5 }}}|S c c}}w )Nr   rÃ   r‡   r<  )rV   rÑ   r  rõ  rž   r
  rô  r|  rx   r€   r   r  r	  rN  rÚ  rs  r•   r  )r0  Úskip_outr•   rp  r  rv  Úks          ru   Úcodegen_kwargszExternKernel.codegen_kwargs£  sO  € Ü�7‰7×ÒØ×ÑÐ+´°D×4FÑ4FÓ0GÈ1Ò0Là�	àˆFØ ×>Ñ>ò Q�Ù ¨EÒ 1àà×)Ñ)¨(Ó3�Ü˜a¤§¡Ô,Ø—M‘M !Õ$ð  ×1Ò1°hÀ$×BXÑBXÑ6Xð ×.Ñ.×2Ñ2°8Ó<×@Ñ@ÀÔHà!ð ð
 —M‘M¤!§'¡'×"6Ñ"6×"EÑ"EÀaÈÓ"OÕPðQð( ˆð !ŸK™K×-Ñ-Ó/÷á�A�qð �#�Q”q—w‘w×+Ñ+×:Ñ:¸1Ó=Ð>Ò?ðˆFñ ð ˆùó	s   Ä78E4c           	     óÄ  — t         j                  rÐt        j                  j                  sµt        | j                  «       «      dk(  ry t        j                  j                  j                  | j                  «       «      }t        j                  j                  j                  | j                  «       «      }|j                  d| j                  «       › d|› d|› d�«       y y y )Nr   zassert_size_stride(r—  rè   )r2   Úsize_assertsrV   rÑ   r  rR   rÔ   rÚ  Úcodegen_shape_tuplerú   rÜ  r•  )r0  r  rÍ   rÎ   s       ru   Úcodegen_size_assertsz!ExternKernel.codegen_size_assertsÀ  s£   € Ü×Ò¤q§w¡w×':Ò':ä˜TŸ]™]›_Ó-°Ò2ØÜ—7‘7×'Ñ'×;Ñ;¸D¿M¹M»OÓLˆDÜ—W‘W×)Ñ)×=Ñ=¸d¿o¹oÓ>OÓPˆFØ×ÑØ% d§m¡m£oÐ%6°b¸¸¸bÀÀÈÐJõð (;Ðrt   c                óN   — | j                  «       }| j                  «       }|g g|fS )zD
        get output sizes and strides, for template_codegen
        )rÔ   rú   )r0  Ú_sizeÚ_strides      ru   Úget_group_stridezExternKernel.get_group_strideË  s*   € ð —‘“ˆØ—/‘/Ó#ˆà�rˆ{˜GÐ#Ð#rt   c                ó¨  — t         j                  j                  }| j                  «       }| j	                  «       }|D �cg c]  }|j                  |«      ‘Œ }}t        t        |«      «      D �cg c]  }t        d|› �«      ‘Œ }}t        t        t        |«      «      |j                  d¬«      }t        |«      D ��	ci c]  \  }}	|	|“Œ
 }
}}	t        t        |
«      «      D �cg c]  }|
|   ‘Œ	 }}|D �cg c]  }||   ‘Œ	 }}| j                  «       } ||«      }t         j                  j                  j                  |||g«      \  }}}t        d«      \  }}t        t!        | ||D �cg c]
  } ||«      ‘Œ c}«      «      «      }t#        t%        j&                  |«      |«      }|t)        |«      fS c c}w c c}w c c}	}w c c}w c c}w c c}w )zC
        Manually get canonicalization of the output index
        r"  T)r   r¹  Úc)rV   rÑ   rÒ   rÔ   rú   rÓ   rŸ   rž   rP   r  r|  r»   r‘  r%  r;   r{   r§   rS   r€   rB  rz   )r0  rÒ   rm  r  rÈ   r¡   r  Úindex_orderr¼   r½   r¾   r¨   rŽ  r    Ú	new_sizesr£   r*  rÂ   Úadd_varÚreplacements                       ru   ÚcanonicalizezExternKernel.canonicalizeÔ  s›  € ô
 —7‘7×#Ñ#ˆØ—‘“ˆØ—/‘/Ó#ˆØ29Ö:¨Q�8×%Ñ% aÕ(Ð:ˆÐ:ä;@ÄÀUÃÓ;LÖM°aÔ(¨1¨Q¨C¨Õ1ÐMˆ
ÐMäœU¤3 w£<Ó0°g×6IÑ6IÐSWÔXˆÜ+4°[Ó+A×B™x˜s C�#�s‘(ÐBˆÑBÜ$)¬#¨f«+Ó$6Ö7˜q�˜“Ð7ˆÐ7Ø-2Ö3¨�j “mÐ3ˆ
Ð3Ø×#Ñ#Ó%ˆÙ˜
Ó#ˆä%&§W¡W×%5Ñ%5×%EÑ%EØ˜ ˜wó&
Ñ"ˆ	�7˜Fô ! Ó%‰
ˆˆ7Üœ3˜z©7È	Ö3RÀ1±G¸AµJÒ3RÓ+SÓTÓUˆäœ5Ÿ<™<¨Ó.°Ó<ˆØ”e˜IÓ&Ð&Ð&ùò+ ;ùâMùó CùÚ7ùÚ3ùò 4Ss#   ¿F5Á/F:Â>F?Ã$GÃ6G
Å+Gc                óÔ   — t        t        j                     «       }| j                  D ]  }|t	        |«      z  }Œ | j
                  j                  «       D ]  }|t	        |«      z  }Œ |S r’   )r,   r€   r   rð  Úmaybe_free_unbacked_symbolsr•   r|   )r0  rU  rØ  s      ru   rÁ  z%ExternKernel.get_unbacked_symbol_usesó  sk   € ô ”u—|‘|Ñ$Ó&ˆØ×%Ñ%ò 	2ˆCØÔ,¨SÓ1Ñ1‰Að	2à—;‘;×%Ñ%Ó'ò 	2ˆCØÔ,¨SÓ1Ñ1‰Að	2àˆrt   c           
     ó"  — t        | dd «      }d|›�g}|t        j                  | «      D �cg c]'  }|j                  › dt        | |j                  «      › �‘Œ) c}z  }|j	                  d| j
                  ›�«       | j                  |«      S c c}w )Nrò  zpython_kernel_name=r<  r=  )r“   r  Úfieldsr–   r  r*  rZ  )r0  Úkernel_namerW  r  s       ru   rH  zExternKernel.__str__ý  sš   € Ü˜dÐ$8¸$Ó?ˆà! + Ð1ð
ˆð 	ä$×+Ñ+¨DÓ1ö
àð �z‰zˆl˜!œG D¨%¯*©*Ó5Ð6Ò7ò
ñ 	
ˆð 	�‰�| D×$4Ñ$4Ð#7Ð8Ô9Ø�‰˜uÓ%Ð%ùò
s   ¬,B©rs   NNNNrs   NrÓ  r*  r,  r’   ©ró  rä  rŒ   r�   )rò  rä  rŒ   r�   )rŒ   zituple[Any, list[Any], list[Any], Callable[[Any, Any], Any], Optional[dict[sympy.Symbol, pytree.KeyPath]]])NNF)r¨   zOptional[Sequence[int]]r´  rá  rõ  )r?  r'  rð  )7ro   rp   rq   rð  rr   r  r  r{   r•   rñ  rò  ró  ry   rô  rõ  rö  r÷  rø  rù  r©  r#  r%  rþ  r
  r  r  rü  rý  r#  r  r%  rx  rM  rU  rÆ  rZ  rb  rª  r]  rg  ri  rk  r  rq  rw  rz  r|  r€  r„  rˆ  r�  rÁ  rH  rw  rz  r{  s   @ru   r©  r©     sv  ø… à%'€M�?Ó'Ø.˜[×.Ñ.¸tÔD€FˆNÓDØ-1€KÐ*Ó1Ø(,Ð˜Ó,Ø%)€O�]Ó)ð 4E°;×3DÑ3DØô4Ð! =ó ð
 	ð ð ó ð 6:€NÐ2Ó9Ø<@ÐÐ9Ó@Ø<M¸K×<MÑ<MØô=ÐÐ9ó ð .?¨[×->Ñ->ÈtÔ-TÐÐ*ÓTð ØØØØØ&(Øð,ð 
õ,ó<.óò!òF!ó
*ò
"ô;ó0ò
ð ñ
ó ð
ð ðk
ð
òk
ó ðk
ðZ ñB
ó ðB
ðH ñ!ó ð!ð@ ñ!ó ð!ð ð *.Ø6:ØðZð 'ðZð 4ò	Zó ðZðx ò
ó ð
ð
 òPó ðPð ñ>ó ð>ð ñ?ó ð?ð ñUó ðUóò ôDPò@ò4Jóó:	ò$ò'ó>ó
&ð „Hrt   r©  c                  óB   ‡ — e Zd Zdd„Z	 	 	 	 	 	 	 d	 dˆ fd„Zdd„Zˆ xZS )ÚExternKernelOutc                ó  — | j                  |«       g | j                  «       ¢| j                  d¬«      ¢}| j                  «       }t        j
                  j                  r| j                  dk(  rd}n| j                  «       }| j                  «       x}r|j                  nt        j
                  j                  }|j                  || j                  «       | j                  r| j                  j                  «       nd ||«       y )NT)r~  ztorch::inductor::_mm_plus_mmÚaoti_torch__mm_plus_mm_out)r  rz  r€  r#  rV   rÑ   r  ró  rÚ   r‡   r   Úgenerate_extern_kernel_outrƒ  rñ  )r0  r  r”   r”  r"  rÐ   s         ru   r  zExternKernelOut.codegen  sÚ   € Ø×Ñ˜WÔ%ØJ�×"Ñ"Ó$ÐJ t×':Ñ':ÀDÐ':Ó'IÐJˆØ×*Ñ*Ó,ˆä�G‰G×ÒØ×$Ñ$Ð(FÒFð 7‰Kà×.Ñ.Ó0ˆKØ!%§¡Ó!2Ð2˜AÐ2�—’¼¿¹×9LÑ9LˆØ×*Ñ*ØØ×"Ñ"Ó$Ø48×4DÒ4DˆD×Ñ×.Ñ.Ô0È$ØØõ	
rt   c
                óâ   •— t         ‰
| �  d || j                  |«      ||xs i d ||||	«
       t        j                  j                  | «      | _        t        j                  j                  | «       y r’   )rB  r©  rV  rV   rÑ   rY  r–   rZ  )r0  r  rW  rð  r•   rñ  rò  ró  rô  rõ  rD  s             €ru   r©  zExternKernelOut.__init__#  si   ø€ ô 	‰ÑØØØ×Ñ Ó'ØØŠL�bØØØØ)Øô	
ô —G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                 ó   — yrL  rs   r6  s    ru   rß  zExternKernelOut.should_allocate>  rK  rt   rÓ  r•  rÞ  )ro   rp   rq   r  r©  rß  rz  r{  s   @ru   r˜  r˜    s3   ø„ ó
ð2 ØØØØØ&(Øð)ð 
õ)÷6rt   r˜  c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )ÚRandomSeedsc                ó  •— t        j                  t         j                  «      }t        ‰| �  t        |t         j                  |g¬«      g |j                  |j                  |ggddt        j                  j                  ¬«       y )Nrû  zaten.randint.low_outzat::_ops::randint_low_out::call)r  rW  rð  rò  ró  rõ  )rÜ   rb  rD  rB  r©  r  r©  rj  r  ÚrandintÚlow_out)r0  ÚcountrÐ   ÚlimitsrD  s       €ru   r©  zRandomSeeds.__init__C  sl   ø€ Ü—‘œUŸ[™[Ó)ˆÜ‰ÑÜØÜ—k‘kØ�Wôð
 Ø!Ÿ:™: v§z¡z°E°7Ð;Ø5ð >ÜŸ™×,Ñ,ð 	õ 	
rt   )r£  r„   rÐ   ré  rŒ   r�   ©ro   rp   rq   r©  rz  r{  s   @ru   rŸ  rŸ  B  s   ø„ ÷
ñ 
rt   rŸ  c                  óF   ‡ — e Zd Zdd„Z	 	 	 	 	 	 d	 dˆ fd„Zdd„Zd„ Zˆ xZS )rë  c                ó  — | j                  |«       g | j                  «       ¢| j                  «       ¢}t        j                  j
                  j                  | |«       t        | j                  t        «      r| j                  |«       y y r’   )r  rz  r€  rV   rÑ   rÚ  Úgenerate_extern_kernel_allocrx   r  rm  r„  ©r0  r  r”   s      ru   r  zExternKernelAlloc.codegenW  sl   € Ø×Ñ˜WÔ%Ø=�×"Ñ"Ó$Ð= t×':Ñ':Ó'<Ð=ˆÜ	�‰×Ñ×9Ñ9¸$ÀÔEÜ�d—k‘k¤6Ô*Ø×%Ñ% gÕ.ð +rt   c	                óð   •— t         ‰	| �  d || j                  |«      ||xs i d ||||«
       g | _        t        j
                  j                  | «      | _        t        j
                  j                  | «       y r’   )	rB  r©  rV  rn  rV   rÑ   rY  r–   rZ  )
r0  r  rW  rð  r•   rò  ró  rô  rõ  rD  s
            €ru   r©  zExternKernelAlloc.__init__^  sp   ø€ ô 	‰ÑØØØ×Ñ Ó'ØØŠL�bØØØØ)Øô	
ð ')ˆŒÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                 ó   — yr‰  rs   r6  s    ru   rß  z!ExternKernelAlloc.should_allocate|  r‹  rt   c                ó   — t         ‚r’   r  r6  s    ru   r  z"ExternKernelAlloc.apply_constraint  r  rt   rÓ  )rs   NNNrs   NrÞ  )ro   rp   rq   r  r©  rß  r  rz  r{  s   @ru   rë  rë  V  s5   ø„ ó/ð ØØØØ&(Øð)ð 
õ)ó<ö"rt   rë  c                  ó:   ‡ — e Zd ZdZdˆ fd„Zdd„Zd„ Zdd„Zˆ xZS )	rs  zP
    An output buffer that represents the mutation of a pre-existing buffer
    c                óì   •— t         ‰| �  d |¬«       |j                  «       }t        j                  j                  |«       |g| _        || _        t        j                  j                  | «      | _	        y rð  )
rB  r©  r•  rV   rÑ   r©  Úmutation_namesÚmutating_noderY  r–   )r0  r  Úmutated_noder°  Úmutated_node_namerD  s        €ru   r©  zMutationOutput.__init__ˆ  s`   ø€ Ü‰Ñ˜d¨6ÐÔ2Ø(×1Ñ1Ó3ÐÜ	�‰×#Ñ#Ð$5Ô6Ø0Ð1ˆÔØ(5ˆÔÜ—G‘G×+Ñ+¨DÓ1ˆ�	rt   c                ó   — | j                   S r’   )r°  r6  s    ru   rJ  zMutationOutput.get_defining_op�  s   € Ø×!Ñ!Ð!rt   c                ó   — | j                   S r’   )r¯  r6  s    ru   rÍ  z!MutationOutput.get_mutation_names“  rá  rt   c                 ó   — yr‰  rs   r6  s    ru   rß  zMutationOutput.should_allocate–  r‹  rt   )r°  r  rŒ   r�   rå  rÞ  )	ro   rp   rq   rß  r©  rJ  rÍ  rß  rz  r{  s   @ru   rs  rs  ƒ  s   ø„ ñõ2ó"ò#÷rt   rs  c                  óv   ‡ — e Zd ZU dZi Zded<   e	 d	 	 	 	 	 	 	 dd„«       Z	 d	 	 	 	 	 	 	 	 	 d	ˆ fd„Zd
d„Z	ˆ xZ
S )ÚTMADescriptora$  
    An IR node representing a host-side TMA descriptor in the Triton API
    (the ones obtained via create_{1d,2d}_tma_descriptor calls). Mostly
    useful for user-defined Triton kernels relying on host-side TMA; but
    can, in principle, be used for Inductor's Triton templates, too.
    zdict[Any, TMADescriptor]Ú_CACHEc                ó�   — t        |«      |||f}|| j                  vrt        ||||«      | j                  |<   | j                  |   S r’   )Úidr¸  r·  )rS  r  r  Ú
block_dimsÚelement_sizer   s         ru   rR  zTMADescriptor.create¦  sH   € ô �&‹z˜4 ¨\Ð:ˆØ�c—j‘jÑ Ü+¨F°D¸*ÀlÓSˆC�J‰J�s‰OØ�z‰z˜#‰Ðrt   c           
     óN  •— t        |«      dv sJ ‚t        |«      t        |«      k(  sJ ‚|€|j                  «       j                  }|| _        || _        || _        || _        t        | j                  «      | _        |g}g | j                  ¢| j
                  ¢| j                  ‘}t        ‰| �%  d t        t        ||j                  «       ¬«      «      |t        |«      d «       t        j                  j!                  | «      | _        t        j                  j%                  | «       y )N)r1   r³   r  )rž   rÙ   r#  r  r  r»  r¼  rW  rB  r©  rˆ  r  rÖ   rz   rV   rÑ   rY  r–   rZ  )r0  r  r  r»  r¼  rW  rð  rD  s          €ru   r©  zTMADescriptor.__init__³  s  ø€ ô �4‹y˜FÑ"Ð"Ð"Ü�4‹yœC 
›OÒ+Ð+Ð+àÐØ!×+Ñ+Ó-×6Ñ6ˆLàˆŒØˆŒ	Ø$ˆŒØ(ˆÔÜ˜Ÿ	™	“NˆŒ	à�ˆð
Ø�Y‰Yð
à�_‰_ð
ð ×Ñð
ˆô 	‰ÑØô ÜØØ!×,Ñ,Ó.ôóð Ü�-Ó Øô	
ô  —G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                ó&   — |j                  | «       y r’   )Úgenerate_tma_descriptorr  s     ru   r  zTMADescriptor.codegenà  ó   € Ø×'Ñ'¨Õ-rt   r’   )r  rc   r  úlist[Union[int, torch.SymInt]]r»  rÁ  r¼  rò  )
r  rc   r  rÁ  r»  rÁ  r¼  rò  rŒ   r�   rÓ  )ro   rp   rq   rß  r¸  rr   rx  rR  r©  r  rz  r{  s   @ru   r·  r·  š  s’   ø… ñð (*€FÐ$Ó)àð '+ð
àð
ð -ð
ð 3ð	
ð
 $ò
ó ð
ð" '+ð+)àð+)ð -ð+)ð 3ð	+)ð
 $ð+)ð 
õ+)÷Z.rt   r·  c                  óV   ‡ — e Zd Zd„ Zdd„Zd	ˆ fd„Zd	d„Z	 	 dˆ fd„Zd
d„Zdd„Z	ˆ xZ
S )ÚUserDefinedTritonKernelc                óD  ‡— ddl m} ddlm} |j	                  | j
                  «      Šg }g }g }t        ‰|«      rát        ‰d«      r%|j                  ˆfd„‰j                  D «       «       n)t        ‰d«      sJ ‚|j                  ‰j                  «       t        ‰d«      r:‰j                  D ]*  }|j                  ‰j                  j                  |   «       Œ, n)t        ‰d«      sJ ‚|j                  ‰j                  «       ‰j                   }‰j                  Š‰|||fS )	Nr   )Ú	Autotuner)Úkernel_side_tableÚrestore_idxc              3  óP   •K  — | ]  }‰j                   j                  |   –— Œ y ­wr’   )r—   Ú	arg_names)rû   r¡   rä  s     €ru   rý   zBUserDefinedTritonKernel.get_kernel_and_metadata.<locals>.<genexpr>ò  s%   øè ø€ ò *Ø/0�F—I‘I×'Ñ'¨Õ*ñ*ùs   ƒ#&Úrestore_valueÚ	reset_idxÚreset_to_zero)Útriton.runtime.autotunerrÅ  Ú*torch._higher_order_ops.triton_kernel_wraprÆ  Ú
get_kernelÚ
kernel_idxrx   r  r2  rÇ  rÊ  rË  r  r—   rÉ  rÌ  Úconfigs)r0  rÅ  rÆ  rÑ  Úrestore_value_argsÚreset_to_zero_argsr¡   rä  s          @ru   Úget_kernel_and_metadataz/UserDefinedTritonKernel.get_kernel_and_metadataå  s  ø€ Ý6åPà"×-Ñ-¨d¯o©oÓ>ˆØˆØ(*ÐØ(*ÐÜ�f˜iÔ(ô �v˜}Ô-Ø"×)Ñ)ó *Ø4:×4FÑ4Fô*õ ô ˜v Ô7Ð7Ð7Ø"×)Ñ)¨&×*>Ñ*>Ô?ä�v˜{Ô+Ø×)Ñ)ò F�AØ&×-Ñ-¨f¯i©i×.AÑ.AÀ!Ñ.DÕEñFô ˜v Ô7Ð7Ð7Ø"×)Ñ)¨&×*>Ñ*>Ô?à—n‘nˆGØ—Y‘YˆFØ�wÐ 2Ð4FÐFÐFrt   c           
     óæ  — ddl m} | j                  «       \  }}}}|j                  ||| j                  ||| j
                  «      \  }}}	| j                  D �
ci c]  }
|
| j                  |
«      “Œ }}
t        |j                  D �cg c]  }|j                  |   ‘Œ c}«      }g }g }g }t        j                  |j                  «       t        t        j                  d«      |	«      «      D �]C  \  }}|j!                  |«       t#        |t$        «      r?|j!                  |j'                  «       «       |j!                  |j)                  «       «       Œgt#        |t*        t,        t.        t0        j2                  f«      r,|j!                  |«       |j!                  t5        |«      «       Œ½||v r'|j!                  d«       |j!                  t*        «       Œè|€B	  |«       r(|j!                  d«       |j!                  t*        «       �Œ|j7                  «        �Œ,t9        dt5        |«      › d|› �«      ‚ | j;                  |«       |j=                  |||||d| j?                  «       ¬«       y c c}
w c c}w )	Nr   )Útriton_version_uses_attrs_dictrM  rþ   zUnsupported arg type: rç   T)Ú	arg_typesÚraw_argsÚtriton_metarð   rÐ   ) Útorch._inductor.utilsrÖ  rÔ  Ú!define_user_defined_triton_kernelr•   Úgridrô  r|  r,   Ú
constexprsrÉ  r=  rO  r  r§   Úrepeatr  rx   rc   rƒ  rÙ   r„   r€  rl   r€   r   r‡   rQ  r_  r  Úgenerate_kernel_callrÚ   )r0  r  rÖ  rä  rÑ  rÒ  rÓ  Únew_namerÙ  Úextra_launch_argsr  Ú
named_argsr¡   Úconstexpr_namesr”   r×  Úraw_args_filteredr–   rØ  s                      ru   r  zUserDefinedTritonKernel.codegen  sA  € ÝHð ×(Ñ(Ó*ñ	
ØØØØð ×5Ñ5ØØØ�K‰KØØØ�I‰Ió
ñ		
ØØØð 26×1SÑ1Sö
Ø,-ˆAˆt×$Ñ$ QÓ'Ñ'ð
ˆ
ð 
ô %À6×CTÑCTÖ%U¸a f×&6Ñ&6°qÓ&9Ò%UÓVˆàˆØ!ˆ	Ø')ÐÜ"Ÿ™Ø×ÑÓ¤¤I×$4Ñ$4°RÓ$8Ð:KÓ Ló
ó 	W‰IˆD�#ð ×$Ñ$ SÔ)Ü˜#œvÔ&Ø—‘˜C×1Ñ1Ó3Ô4Ø× Ñ  §¡£Õ1Ü˜C¤#¤u¬d´E·J±JÐ!?Ô@Ø—‘˜CÔ Ø× Ñ ¤ c£Õ+Ø˜Ñ(ð —‘˜B”Ø× Ñ ¤Õ%Ø�ðñ 2Ô3Ø—K‘K ”OØ×$Ñ$¤SÖ)à%×)Ñ)Ö+ä)Ð,BÄ4ÈÃ9À+ÈRÐPSÈuÐ*UÓVÐVð?	WðB 	×Ñ˜WÔ%Ø×$Ñ$ØØØØ&Ø#ØØ—?‘?Ó$ð 	%õ 	
ùòU
ùò &Vs   ÁI)ÂI.c                óL   •— t         ‰| �  «       t        | j                  «      z  S r’   )rB  rÁ  r&   rÜ  rC  s    €ru   rÁ  z0UserDefinedTritonKernel.get_unbacked_symbol_usesO  s"   ø€ ô ‰wÑ/Ó1Ô4IÈ$Ï)É)Ó4TÑTÐTrt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  z0UserDefinedTritonKernel.get_unbacked_symbol_defsT  r&  rt   c               óä  •— g }i }g }|j                  «       D ]ƒ  \  }}	t        |	t        «      rXt        j	                  | j                  |	«      «      }
||v rt        j                  |
g||   ¢­Ž }
|j                  |
«       |
||<   Œn|j                  |	«       |	||<   Œ… t        |«      dk7  sJ ‚|d   j                  «       | _        t        ‰| �5  d t        | j                  ¬«      |t        |«      |«       || _        || _        | j%                  «       \  }}}}|j&                  D �cg c]	  }||v sŒ|‘Œ c}| _        ddlm} t        |«      dkD  r|d   j.                  ni } ||i |¥|¥«      D �cg c]  }||   ‘Œ	 c}| _        | j0                  D �cg c]#  }t3        t        | j                  ¬«      || «      ‘Œ% c}| _        t6        j8                  j;                  | «       y c c}w c c}w c c}w )Nr   rJ  )Úidentify_mutated_tensors)r  rx   rb   rU  rÇ  rÆ  r·  rR  r  rž   rÚ   rÐ   rB  r©  rœ  rz   rÐ  rÜ  rÔ  rÉ  rô  rÎ  rè  r•   Úmutable_argsrs  rù  rV   rÑ   rZ  )r0  rÐ  rÜ  Útma_descriptor_metadataÚkernel_argsrW  r•   rð  r  r  rá   rä  rÑ  rÂ   rØ  rè  Úautotuned_kwargsr   r  rD  s                      €ru   r©  z UserDefinedTritonKernel.__init__W  sø  ø€ ð ˆØˆØˆØ×%Ñ%Ó'ò 		‰DˆAˆqÜ˜!œYÔ'Ü ×9Ñ9¸$×:LÑ:LÈQÓ:OÓP�ØÐ/Ñ/Ü%×,Ñ,¨QÐLÐ1HÈÑ1KÒL�AØ—‘˜aÔ Ø��q’	à×$Ñ$ QÔ'Ø��q’	ð		ô �6‹{˜aÒÐÐØ˜Q‘i×*Ñ*Ó,ˆŒä‰ÑØÜ˜dŸk™kÔ*ØÜ�-Ó Øô	
ð %ˆŒØˆŒ	à $× <Ñ <Ó >Ñˆ�˜˜Að "×+Ñ+ö.
Ø¨s°kÒ/AŠCò.
ˆÔ*õ 	Xä03°G³¸qÒ0@˜7 1™:×,Ò,ÀbÐñ 0ØÐ;˜;Ð;Ð*:Ð;óö
àð ˜Óò
ˆÔð ×(Ñ(ö!
àô œ:¨T¯[©[Ô9¸3ÀÕEò!
ˆÔô 	
�‰×"Ñ" 4Õ(ùò%.
ùò
ùò!
s   Ä'	G#Ä1G#Å1G(Æ(G-c                ó,   — t        | j                  «      S r’   )ry   rù  r6  s    ru   r#  z#UserDefinedTritonKernel.get_outputsŒ  s   € Ü�D×)Ñ)Ó*Ð*rt   c                ó   — | j                   S r’   rJ  r6  s    ru   rÚ   z"UserDefinedTritonKernel.get_device�  rK  rt   rÓ  r,  r*  ræ  )ro   rp   rq   rÔ  r  rÁ  r%  r©  r#  rÚ   rz  r{  s   @ru   rÃ  rÃ  ä  s3   ø„ òGó>I
õVUó
ð3)à	õ3)ój+÷rt   rÃ  c                  óB   ‡ — e Zd ZdZdd„Zdd„Zd„ Zd	d„Zdˆ fd„Zˆ xZ	S )
ÚInplaceBernoulliFallbackúE
    This needs to be a custom class to handle mutation properly
    c                óÐ  — d„ | j                   D «       \  }t        j                  j                  r\|j	                  | j                  «       › d|› ddj                  t        t        | j                  «      «      › d|j                  › �«       y |j	                  | j                  «       › d|› ddj                  t        t        | j                  «      «      › d|j                  › �«       y )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr’   ©rƒ  ©rû   rá   s     ru   rý   z3InplaceBernoulliFallback.codegen.<locals>.<genexpr>™  s   è ø€ Ò;¨!�×#Ñ#×%Ñ;ùr  rS  r—  z, NULL)rè   )rW  rV   rÑ   r  rÜ  r#  rV  rT  Úreprrð  Úending)r0  r  rÈ   s      ru   r  z InplaceBernoulliFallback.codegen˜  sÇ   € Ù;¨t¯{©{Ô;‰ˆä�7‰7×Òð ×ÑØ×'Ñ'Ó)Ð*¨!¨A¨3¨b°·±¼3¼tÀT×EWÑEWÓ;XÓ1YÐ0ZÐZaÐbi×bpÑbpÐaqÐrõð ×ÑØ×'Ñ'Ó)Ð*¨!¨A¨3¨b°·±¼3¼tÀT×EWÑEWÓ;XÓ1YÐ0ZÐZ[Ð\c×\jÑ\jÐ[kÐlõrt   c                 ó   — yr‰  rs   r6  s    ru   rß  z(InplaceBernoulliFallback.should_allocate¦  r‹  rt   c                ó>   — | j                   d   j                  «       gS rx  ©rW  r•  r6  s    ru   rÍ  z+InplaceBernoulliFallback.get_mutation_names©  ó   € Ø—‘˜A‘×'Ñ'Ó)Ð*Ð*rt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  z1InplaceBernoulliFallback.get_unbacked_symbol_defs¬  r&  rt   c                ó^  •— t         ‰| �  d t        |j                  «       ¬«      | j	                  |g«      ||¬«       t
        j                  j                  |j                  «       «       t
        j                  j                  | «      | _
        t
        j                  j                  | «       y )NrJ  ©rõ  )rB  r©  rœ  rÚ   rV  rV   rÑ   r©  r•  rY  r–   rZ  )r0  rõ  rÈ   rð  rD  s       €ru   r©  z!InplaceBernoulliFallback.__init__¯  s~   ø€ Ü‰ÑØÜ˜aŸl™l›nÔ-Ø×Ñ  Ó$ØØ#ð 	ô 	
ô 	
�‰×#Ñ# A§J¡J£LÔ1Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   rÓ  rÞ  r,  ©
ro   rp   rq   rß  r  rß  rÍ  r%  r©  rz  r{  s   @ru   rð  rð  “  s&   ø„ ñóóò+ó÷
)ñ 
)rt   rð  c                  óZ   ‡ — e Zd ZdZdd„Zd	d„Zd„ Zd
d„Z	 	 dˆ fd„Ze	ddd„«       Z
ˆ xZS )ÚInplaceCopyFallbackrñ  c                óR   — | j                  «       \  }}}|j                  |||«       y r’   )rz  Úcodegen_device_copy)r0  r  r¶  rµ  Únon_blockings        ru   r  zInplaceCopyFallback.codegenÂ  s)   € Ø#'×#4Ñ#4Ó#6Ñ ˆˆc�<Ø×#Ñ# C¨¨lÕ;rt   c                 ó   — yr‰  rs   r6  s    ru   rß  z#InplaceCopyFallback.should_allocateÆ  r‹  rt   c                ó>   — | j                   d   j                  «       gS rx  rú  r6  s    ru   rÍ  z&InplaceCopyFallback.get_mutation_namesÉ  rû  rt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  z,InplaceCopyFallback.get_unbacked_symbol_defsÌ  r&  rt   c                ó  •— t         ‰| �  d |||dd¬«       t        j                  j	                  |d   j                  «       «       t        j                  j                  | «      | _        t        j                  j                  | «       y )Nz
aten.copy_Úaoti_torch_copy_)rò  ró  r   )	rB  r©  rV   rÑ   r©  r•  rY  r–   rZ  )r0  r  rW  rð  rD  s       €ru   r©  zInplaceCopyFallback.__init__Ï  sr   ø€ ô 	‰ÑØØØØØ+Ø.ð 	ô 	
ô 	
�‰×#Ñ# F¨1¡I×$6Ñ$6Ó$8Ô9Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                ó    — ||fD �cg c]  }| j                  |«      ‘Œ }}|f}t        t        |j                  «       ¬«      ||«      }|S c c}w rø  )rÆ  r  rœ  rÚ   )rS  r¶  rµ  r  rá   rW  rð  rà  s           ru   rR  zInplaceCopyFallback.createá  sV   € à14°c°
Ö;¨1�#×#Ñ# AÕ&Ð;ˆÐ;Ø%˜ˆÜ$Ü˜cŸn™nÓ.Ô/ØØó
ˆð
 ˆùò <s   ‡ArÓ  rÞ  r,  rõ  )r  rl   )ro   rp   rq   rß  r  rß  rÍ  r%  r©  rx  rR  rz  r{  s   @ru   r  r  ½  s?   ø„ ñó<óò+óð)ð
 
õ)ð$ óó ôrt   r  c                  ó6   — e Zd ZdZdd„Zd	d„Zd„ Zd
d„Zd	d„Zy)ÚMutatingFirstArgExternKernelrñ  c                óâ   — g d„ | j                   D «       ¢t        t        | j                  «      ¢}|j	                  | j                  «       › ddj                  |«      › d|j                  › �«       y )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr’   rô  rõ  s     ru   rý   z7MutatingFirstArgExternKernel.codegen.<locals>.<genexpr>ô  s   è ø€ Ò9¨ˆa×!Ñ!×#Ñ9ùr  rS  r—  rè   )rW  rT  rö  rð  rÜ  r#  rV  r÷  )r0  r  Úargrefss      ru   r  z$MutatingFirstArgExternKernel.codegenò  sl   € ð
Ù9¨T¯[©[Ô9ð
ä”�t×)Ñ)Ó*ð
ˆð 	×ÑØ×#Ñ#Ó%Ð& a¨¯	©	°'Ó(:Ð';¸1¸W¿^¹^Ð<LÐMõ	
rt   c                 ó   — yr‰  rs   r6  s    ru   rß  z,MutatingFirstArgExternKernel.should_allocateû  r‹  rt   c                ó>   — | j                   d   j                  «       gS rx  rú  r6  s    ru   rÍ  z/MutatingFirstArgExternKernel.get_mutation_namesþ  rû  rt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  z5MutatingFirstArgExternKernel.get_unbacked_symbol_defs  r&  rt   c                 ó   — yrL  rs   r6  s    ru   Úhas_side_effectsz-MutatingFirstArgExternKernel.has_side_effects  rK  rt   NrÓ  rÞ  r,  )	ro   rp   rq   rß  r  rß  rÍ  r%  r  rs   rt   ru   r  r  í  s    „ ñó
óò+óôrt   r  c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )ÚResizeStorageBytesc                ó*  •— t        |t        «      sJ d«       ‚t        ‰| �  d t	        |j                  «       ¬«      | j                  |g«      |f¬«       t        j                  j                  |j                  «       «       t        j                  j                  | «      | _        t        j                  j                  | «       d| _        d| _        t        j                  j                   j#                  |j$                  j                  «       «       y )NzTODO: dynamic shapesrJ  )rð  z"inductor_ops.resize_storage_bytes_z&torch::inductor::resize_storage_bytes_)rx   r„   rB  r©  rœ  rÚ   rV  rV   rÑ   r©  r•  rY  r–   rZ  rò  ró  Únever_reuse_buffersr¦  r  )r0  Úvariablers  rD  s      €ru   r©  zResizeStorageBytes.__init__	  sÎ   ø€ Ü˜(¤CÔ(Ð@Ð*@Ó@Ð(Ü‰ÑØÜ˜h×1Ñ1Ó3Ô4Ø×Ñ  
Ó+Ø#˜+ð	 	ô 	
ô 	
�‰×#Ñ# H×$5Ñ$5Ó$7Ô8Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Ô(Ø"FˆÔØGˆÔÜ	�‰×#Ñ#×'Ñ'¨¯©×(>Ñ(>Ó(@ÕArt   rÓ  r¥  r{  s   @ru   r  r    s   ø„ ÷Bñ Brt   r  c                  ó(   ‡ — e Zd Zdˆ fd„Zdd„Zˆ xZS )ÚSetSourceTensorKernelc                ó¨  •— |j                  «        t        ‰| �	  |j                  «       ||gdt        j
                  j                  j                  j                  ¬«       t        j                  j                  j                  |j                  j                  «       «       t        j                  j                  j                  |j                  «       «       t        j                  j                  j                  | j                  «       «       |j                  «       }t!        t#        |¬«      || «      t!        t#        |¬«      || «      g| _        y )Nz!torch.ops.aten.set_.source_Tensor)rò  rõ  rJ  )r¦  rB  r©  rÖ   rÜ   rT   r  Úset_Úsource_TensorrV   rÑ   r  r¦  r  r•  rÚ   rs  rœ  rù  )r0  Úself_tensorÚstorage_tensorrÐ   rD  s       €ru   r©  zSetSourceTensorKernel.__init__  sñ   ø€ Ø×$Ñ$Ô&Ü‰ÑØ×%Ñ%Ó'Ø˜.Ð)ØBÜŸ	™	Ÿ™×+Ñ+×9Ñ9ð	 	ô 	
ô 	
�‰×#Ñ#×'Ñ'¨×(8Ñ(8×(AÑ(AÓ(CÔDÜ	�‰×#Ñ#×'Ñ'¨×(?Ñ(?Ó(AÔBÜ	�‰×#Ñ#×'Ñ'¨¯©«Ô8Ø×*Ñ*Ó,ˆäœ:¨VÔ4°kÀ4ÓHÜœ:¨VÔ4°nÀdÓKð!
ˆÕrt   c                óv   — | j                   d   j                  «       | j                   d   j                  «       gS rE  rú  r6  s    ru   rÑ  z2SetSourceTensorKernel.get_inputs_that_alias_output+  s/   € Ø—‘˜A‘×'Ñ'Ó)¨4¯;©;°q©>×+BÑ+BÓ+DÐEÐErt   rÓ  r  )ro   rp   rq   r©  rÑ  rz  r{  s   @ru   r  r    s   ø„ õ
÷"Frt   r  c                  óX   ‡ — e Zd ZdZd
d„Zdd„Zd„ Zdd„Zdddœ	 	 	 	 	 	 	 dˆ fd	„Zˆ xZ	S )ÚScatterFallbackzÅ
    This needs to be a custom class to handle mutation properly.
    This class handles both aten.scatter_ and aten.scatter_reduce_.
    It also handle the case `src` being a scalar properly.
    c           
     ó¬  — | j                   d   }t        j                  j                  rdddœ}||v r||   }| j                  rd„ | j
                  D «       \  }}}n%d„ | j
                  D «       \  }}| j                  d   }|j                  ||| j                  d   ||g| j                  | j                  | j                  || j                  «       «       y )	Nr<  r«  rª  )r¦  Úmultiplyc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr’   rô  rõ  s     ru   rý   z*ScatterFallback.codegen.<locals>.<genexpr>?  s   è ø€ ÒJ¸˜q×2Ñ2×4ÑJùr  c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr’   rô  rõ  s     ru   rý   z*ScatterFallback.codegen.<locals>.<genexpr>A  s   è ø€ ÒE°A˜!×-Ñ-×/ÑEùr  r1   r   )r•   rV   rÑ   r  Úsrc_is_tensorrW  rð  Úgenerate_scatter_fallbackró  rò  r€  )r0  r  r<  Úget_operator_enumrÈ   r    rµ  s          ru   r  zScatterFallback.codegen6  sÌ   € Ø—‘˜XÑ&ˆÜ�7‰7×Òà(-¸6Ñ BÐØÐ*Ñ*Ø*¨6Ñ2�à×ÒÙJ¸d¿k¹kÔJ‰OˆQ�‘sáE¸¿¹ÔE‰JˆQ�Ø×$Ñ$ QÑ'ˆCØ×)Ñ)ØØ�×"Ñ" 1Ñ% u¨cÐ2Ø× Ñ Ø×#Ñ#Ø×ÑØØ×ÑÓ!õ	
rt   c                 ó   — yr‰  rs   r6  s    ru   rß  zScatterFallback.should_allocateM  r‹  rt   c                ó>   — | j                   d   j                  «       gS rx  rú  r6  s    ru   rÍ  z"ScatterFallback.get_mutation_namesP  rû  rt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  z(ScatterFallback.get_unbacked_symbol_defsS  r&  rt   NT©r<  Úinclude_selfc          
     óf  •— t        |t        «      | _        | j                  r%|||fD �cg c]  }| j                  |«      ‘Œ }	}|f}
n$||fD �cg c]  }| j                  |«      ‘Œ }	}||f}
t        ‰| �  d t        |j                  «       ¬«      | j                  |	«      |
||dœt        |«      ddg|¬«       t        j                  j                  |j                  «       «       t        j                  j                  | «      | _        t        j                  j!                  | «       y c c}w c c}w )NrJ  r.  r<  r/  )rò  rô  rõ  )rx   rb   r(  rÆ  rB  r©  rœ  rÚ   rV  r™   rV   rÑ   r©  r•  rY  r–   rZ  )r0  rõ  rÈ   r  r    rµ  r<  r/  rá   Útensorsrð  rD  s              €ru   r©  zScatterFallback.__init__V  s  ø€ ô (¨¬YÓ7ˆÔð ×ÒØ78¸%À°oÖF°�t×)Ñ)¨!Õ,ÐFˆGÐFØ ˜F‰Mà78¸%°jÖA°�t×)Ñ)¨!Õ,ÐAˆGÐAØ  #˜JˆMä‰ÑØÜ˜aŸl™l›nÔ-Ø×Ñ Ó(ØØ¨|Ñ<Ü" ;Ó/Ø+3°^Ð*DØ#ð 	ô 		
ô 	
�‰×#Ñ# A§J¡J£LÔ1Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(ùò% Gùò Bs   ªD)ÁD.rÓ  rÞ  r,  )r  r„   r<  rä  r/  rl   rŒ   r�   rÿ  r{  s   @ru   r#  r#  /  sV   ø„ ñó
ó.ò+óð !%Ø!ñ!)ð ð	!)ð ð!)ð ð!)ð 
÷!)ñ !)rt   r#  c                  óB   ‡ — e Zd ZdZdd„Zdd„Zd„ Zd	d„Zdˆ fd„Zˆ xZ	S )
ÚIndexPutFallbackzQ
    This needs to be a custom class to handle mutation and indices properly
    c                ó¢  — d„ | j                   D «       ^}}}g }t        |«      }t        | j                  «      D ]b  \  }}| j                  |   �|j	                  t        |«      «       Œ0|j	                  t        j                  j                  j                  «       Œd  |j                  | j                  «       |||g| j                  «       ¢­Ž  y )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr’   rô  rõ  s     ru   rý   z+IndexPutFallback.codegen.<locals>.<genexpr>€  s   è ø€ Ò&RÀ q×':Ñ':×'<Ñ&Rùr  )rW  r(  r»   r  r  r)  rV   rÑ   rÚ  rö  Úgenerate_index_put_fallbackr#  rw  )	r0  r  rÈ   r|   Úvalid_indicesr  Úiter_valid_indicesr¡   rÂ   s	            ru   r  zIndexPutFallback.codegen  s´   € Ù&RÀdÇkÁkÔ&RÐ#ˆˆF�]ØˆÜ! -Ó0ÐÜ˜dŸl™lÓ+ò 	>‰DˆAˆqØ�|‰|˜A‰Ð*Ø—‘œtÐ$6Ó7Õ8à—‘œqŸw™w×3Ñ3×<Ñ<Õ=ð		>ð 	,ˆ×+Ñ+Ø× Ñ Ó" A w°ð	
Ø9=×9PÑ9PÓ9Rô	
rt   c                 ó   — yr‰  rs   r6  s    ru   rß  z IndexPutFallback.should_allocate�  r‹  rt   c                ó>   — | j                   d   j                  «       gS rx  rú  r6  s    ru   rÍ  z#IndexPutFallback.get_mutation_names�  rû  rt   c                ó   — t        «       S r’   r+   r6  s    ru   r%  z)IndexPutFallback.get_unbacked_symbol_defs“  r&  rt   c           	     ó
  •— || _         |D �cg c]  }|€Œ|‘Œ	 }}||g|¢D �cg c]  }| j                  |«      ‘Œ }}d}	t        ‰
| �  d t	        j                  «       ¬«      | j                  |«      |fd|	|¬«       t        j                  j                  | j                  d   j                  «       «       t        j                  j                  | «      | _        t        j                  j                  | «       y c c}w c c}w )NÚaoti_torch_index_put_outrJ  zaten.index_put_)rò  ró  rõ  r   )r  rÆ  rB  r©  rœ  rÚ   rV  rV   rÑ   r©  rW  r•  rY  r–   rZ  )r0  rõ  rÈ   r  r|   Ú
accumulater¡   r7  r1  ró  rD  s             €ru   r©  zIndexPutFallback.__init__–  sâ   ø€ ØˆŒØ$+Ö=˜q¨q©}šÐ=ˆÐ=Ø34°fÐ2M¸}Ð2MÖN¨Q�4×%Ñ% aÕ(ÐNˆÐNØ4ˆÜ‰ÑØÜ˜aŸl™l›nÔ-Ø×Ñ Ó(ØˆMØ0Ø+Ø#ð 	ô 	
ô 	
�‰×#Ñ# D§K¡K°¡N×$;Ñ$;Ó$=Ô>Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(ùò >ùÚNs   �C;•C;£D rÓ  rÞ  r,  rÿ  r{  s   @ru   r3  r3  z  s&   ø„ ñó
óò+ó÷)ñ )rt   r3  c                  ó$   — e Zd Zed„ «       Zdd„Zy)Ú
DeviceCopyc                óö  — |j                  «       sKt        d„ |j                  «       D «       «      r+t        j                  j
                  s|j                  |«      S t        j                  j                  |«       t        j                  j                  |j                  «       «       t        d«       |f}t        t        ||j                  «       |j                  «       ¬«      | j!                  |«      g|«      S )Nc              3  óT   K  — | ]   }|t         j                  j                  v –— Œ" y ­wr’   )rV   rÑ   r8  r€  s     ru   rý   z$DeviceCopy.create.<locals>.<genexpr>®  s   è ø€ ÒG¨q�AœŸ™×*Ñ*Ô*ÑGùs   ‚&(zDeviceCopy in input programrû  )rÇ  r   rA  r2   Úaot_inductorÚuse_runtime_constant_foldingrË  rV   rÑ   Úadd_device_inforÚ   rJ   r@  r×   rÙ   rÔ   rÆ  )rS  rÈ   rÐ   r  rð  s        ru   rR  zDeviceCopy.createª  s¾   € ð —‘”ÜÑG°A×4DÑ4DÓ4FÔGÔGÜ×'Ñ'×DÒDà×'Ñ'¨Ó/Ð/ä	�‰×Ñ Ô'Ü	�‰×Ñ §¡£Ô/äÐ7Ô8Ø%˜ˆÜÜØØ—k‘k“mØ—Z‘Z“\ôð
 ×Ñ˜qÓ!Ð"Øó
ð 	
rt   c                ó  — | j                  «       }t        |«      dk(  sJ ‚| j                  r2|j                  |d   | j                  j	                  «       |d   «       y |j                  |d   | j	                  «       |d   «       y )Nr³   r   r1   )rz  rž   rñ  r  rƒ  r©  s      ru   r  zDeviceCopy.codegenÂ  s{   € Ø× Ñ Ó"ˆÜ�4‹y˜AŠ~Ðˆ~Ø×ÒØ×'Ñ'Ø�Q‘˜×)Ñ)×;Ñ;Ó=¸tÀA¹wõð ×'Ñ'¨¨Q©°×1GÑ1GÓ1IÈ4ÐPQÉ7ÕSrt   NrÓ  )ro   rp   rq   rx  rR  r  rs   rt   ru   r@  r@  ©  s   „ Øñ
ó ð
ô.Trt   r@  c                  óD   ‡ — e Zd ZdZdd„Zdd„Zd	ˆ fd„Zd
d„Zd	d„Zˆ xZ	S )r~   z;
    The result of a call to aten._local_scalar_dense.
    c                ó   — t        «       S r’   r+   r6  s    ru   r@  zDynamicScalar.get_readsÒ  r&  rt   c                 ó   — yr‰  rs   r6  s    ru   rß  zDynamicScalar.should_allocateÕ  r‹  rt   c                ó¾   •— |j                  «        t        ‰| �	  d t        t	        j
                  d«      ¬«      | j                  |g«      «       || _        || _        y ©Nrí   rJ  )	r  rB  r©  rœ  rÜ   rÐ   rV  ÚsymÚkeypath)r0  rL  rM  r  rD  s       €ru   r©  zDynamicScalar.__init__Ø  sK   ø€ Ø�‰ŒÜ‰ÑØ”*¤E§L¡L°Ó$7Ô8¸$×:MÑ:MÈtÈfÓ:Uô	
ð ˆŒØˆ�rt   c                ó.   — t        | j                  g«      S r’   )r,   rL  r6  s    ru   r%  z&DynamicScalar.get_unbacked_symbol_defsà  s   € Ü˜4Ÿ8™8˜*Ó%Ð%rt   c                ó&   — |j                  | «       y r’   )Úcodegen_dynamic_scalarr  s     ru   r  zDynamicScalar.codegenã  s   € Ø×&Ñ& tÕ,rt   rý  rÞ  rÓ  r,  )
ro   rp   rq   rß  r@  rß  r©  r%  r  rz  r{  s   @ru   r~   r~   Í  s!   ø„ ñóóõó&÷-rt   r~   c                  óJ   ‡ — e Zd ZdZdd„Zd	d„Zd
ˆ fd„Zd	d„Zd„ Zd
d„Z	ˆ xZ
S )r   z5
    The result of a call to aten._assert_scalar
    c                ó   — t        «       S r’   r+   r6  s    ru   r@  zAssertScalar.get_readsì  r&  rt   c                 ó   — yr‰  rs   r6  s    ru   rß  zAssertScalar.should_allocateï  r‹  rt   c                ó~   •— t         ‰| �  d t        t        j                  d«      ¬«      g «       || _        || _        y rK  )rB  r©  rœ  rÜ   rÐ   ÚscalarrL  )r0  rU  rL  rD  s      €ru   r©  zAssertScalar.__init__ò  s7   ø€ Ü‰ÑàÜœeŸl™l¨5Ó1Ô2àô	
ð ˆŒØˆ�rt   c                 ó   — yrL  rs   r6  s    ru   r  zAssertScalar.has_side_effectsý  rK  rt   c                ó,   — t        | j                  «      S r’   )r&   rU  r6  s    ru   rÁ  z%AssertScalar.get_unbacked_symbol_uses   s   € Ü$ T§[¡[Ó1Ð1rt   c           	     óˆ  — t         j                  sy t        t        | j	                  «       «      «      }t
        j                  j                  rad|› d�}t
        j                  j                  j                  | j                  d¬«      }|j                  d|› d| j                  › d|› d�«       y t
        j                  j                  j                  | j                  d¬«      }|j                  d	|› d
�«       |j                  dt        | j                  «      › d�«       |j                  | j                  «       › d�«       y )Nzstd::to_string(rè   F)rY  zif (!(z()) { throw std::runtime_error("Expected z but received " + z); }zif not r/  z    raise RuntimeError(z = None)r2   Úscalar_assertsr)  r(  rÁ  rV   rÑ   r  rÚ  Úcodegen_cpp_sizevarrU  rÜ  rL  Úcodegen_python_sizevarrö  r•  )r0  r  ÚsymbolÚ
symbol_strÚsizevars        ru   r  zAssertScalar.codegen  s  € Ü×$Ò$Øô ”d˜4×8Ñ8Ó:Ó;Ó<ˆÜ�7‰7×ÒØ*¨6¨(°!Ð4ˆJÜ—g‘g×*Ñ*×>Ñ>Ø—‘ eð ?ó ˆGð ×ÑØ˜˜	Ð!JÈ4Ï8É8È*ÐTfÐgqÐfrÐrwÐxõô —g‘g×*Ñ*×AÑAØ—‘ eð Bó ˆGð ×Ñ ¨ y°Ð2Ô3Ø×ÑÐ 7¼¸T¿X¹X»Ð7GÀqÐIÔJð ×Ñ §¡£Ð 1°Ð9Õ:rt   rý  rÞ  rÓ  )ro   rp   rq   rß  r@  rß  r©  r  rÁ  r  rz  r{  s   @ru   r   r   ç  s&   ø„ ñóóõ	óò2÷;rt   r   c                  ó"   — e Zd ZU ded<   ded<   y)ÚExternKernelNoder™   r–   zexport_schema.Noder‰   Nrn   rs   rt   ru   r`  r`     s   … à
ƒIØ
Ôrt   r`  c                  óž   ‡ — e Zd Z	 dddœ	 dˆ fd„Zdd„Zdd„Zd„ Zed„ «       Zd„ Z	d	„ Z
d
„ Zd„ Zdd„Zedd„«       Zed„ «       Zˆ fd„Zˆ xZS )ÚFallbackKernelN©rø  c               ó\  •‡ — t         ‰‰ �  |t        |«      t        |«      |¬«       d‰ _        |‰ _        t        |t        j                  j                  t        j                  j                  f«      sJ d|› dt        |«      › d�«       ‚|‰ _        |‰ _        |€i n|‰ _        t        j                  j!                  ‰ j"                  «       g ‰ _        g ‰ _        t        ‰ j                  t        j                  j                  «      ry d‰ j                  j)                  «       v ry ‰ j                  j*                  }t        j,                  j.                  j1                  ‰ j                  «      r-‰ j&                  j3                  |d   j5                  «       «       y |j6                  rt9        |«      st;        d|› �«      ‚‰ j                  ‰ j<                  ‰ j>                  «      \  }	}d
ˆ fd	„}
t        j,                  j.                  jA                  ||	|«      D ]  \  }} |
||«       Œ y )Nrþ  Fz#Fails to create FallbackKernel for rç   z not supportedÚ_c10d_functionalr   z'NYI: Can't generate FallbackKernel for c                óÒ  •‡ — t        ‰ j                  t        j                  «      rt        |t        t
        f«      sJ ‚t        j                  ‰ j                  «      rt        |t
        t        f«      rJ ‚|€y ‰ j                  €y dˆ ˆfd„}t        j                  ‰ j                  «      r|�|D ]
  } ||«       Œ y y t        j                  ‰ j                  «      sJ ‚ ||«       y )Nc                ó  •— ‰j                   j                  | j                  «       «       ‰j                  j                  r?‰j
                  j                  t        t        | j                  «       ¬«      | ‰«      «       y y rø  )	Úalias_namesr  r•  Ú
alias_infoÚis_writerù  rs  rœ  rÚ   )rá   Úinfor0  s    €€ru   Ú	add_aliaszPFallbackKernel.__init__.<locals>.handle_aliasing_and_mutation.<locals>.add_alias�  sZ   ø€ Ø× Ñ ×'Ñ'¨¯
©
«Ô5Ø—?‘?×+Ò+Ø×)Ñ)×0Ñ0Ü&¤z¸¿¹»Ô'HÈ!ÈTÓRõð ,rt   rÓ  )
rx   r‡   rÜ   ÚListTypery   rz   Úlibrary_utilsÚis_tensor_like_typeri  Úis_tensorlist_like_type)rk  rØ  rl  Úoptional_tensor_argr0  s   `   €ru   Úhandle_aliasing_and_mutationz=FallbackKernel.__init__.<locals>.handle_aliasing_and_mutations  sÃ   ù€ ä˜$Ÿ)™)¤U§^¡^Ô4Ü! #¬¬e }Ô5Ð5Ð5Ü×0Ñ0°·±Ô;ô & c¬E´4¨=Ô9Ð9Ð9àˆ{ØØ�‰Ð&Øöô ×4Ñ4°T·Y±YÔ?Ø�?Ø/2ò 7Ð+Ù!Ð"5Õ6ñ7ð #ô %×8Ñ8¸¿¹ÔCÐCÐCÙ˜#•rt   rÓ  )!rB  r©  rz   Úuse_runtime_dispatchrø  rx   rÜ   r  r  r  r‡   rõ  r3  r•   rV   rÑ   Úwarn_fallbackrò  rh  r¯  r–   r  Ú_libraryrŽ  Úmutates_and_returns_first_argr  r•  Ú
is_mutabler   r_  rW  rð  Ú
zip_schema)r0  r  rä  rD  Únontensor_argsr3  r•   rø  Úschemar”   rr  rk  rØ  rD  s   `            €ru   r©  zFallbackKernel.__init__'  sò  ù€ ô 	‰ÑØÜ�+ÓÜ�.Ó!Øð	 	ô 	
ð %*ˆÔ!Ø!2ˆÔäØä—
‘
×%Ñ%Ü—
‘
×.Ñ.ðô
ð 	Xð 1°°¸¼4À»<¸.ÈÐWó	Xð 
ð "ˆÔØ,ˆÔØ"˜N‘b°ˆŒÜ	�‰×Ñ˜d×5Ñ5Ô6ð ')ˆÔà)+ˆÔä�d×&Ñ&¬¯
©
×(FÑ(FÔGð à ×!1Ñ!1×!6Ñ!6Ó!8Ñ8ð
 à×!Ñ!×)Ñ)ˆô �>‰>×Ñ×=Ñ=¸d×>NÑ>NÔOØ×Ñ×&Ñ& {°1¡~×'>Ñ'>Ó'@ÔAØà×ÒÔ%;¸FÔ%CÜ%Ø9¸&¸ÐBóð ð ×*Ñ*¨4¯;©;¸×8JÑ8JÓK‰ˆˆfõ	ô: Ÿ™×-Ñ-×8Ñ8¸ÀÀvÓNò 	4‰IˆD�#Ù(¨¨sÕ3ñ	4rt   c           	     ón   — |j                  | j                  «       | j                  t        | dd «      «      S ©Nrø  )Ú(codegen_unbacked_symbol_defs_for_outputsr•  rn  r“   r  s     ru   Úcodegen_unbacked_symbol_defsz+FallbackKernel.codegen_unbacked_symbol_defs“  s0   € Ø×?Ñ?Ø�M‰M‹O˜TŸ\™\¬7°4Ð9LÈdÓ+Só
ð 	
rt   c                ó¸   — t        | dd «      x}rBt        t        j                  j                  j
                  |«      }|€J ‚|j                  «       S t        «       S r|  ©r“   r(   rV   rÑ   rÒ   r·   r#  r,   ©r0  rø  Úresolveds      ru   r%  z'FallbackKernel.get_unbacked_symbol_defs˜  óZ   € Ü '¨Ð.AÀ4Ó HÐHÐÐHÜ0Ü—‘× Ñ ×*Ñ*Ð,=óˆHð Ð'Ð'Ð'Ø—=‘=“?Ð"ä“<Ðrt   c                ó,  — t         j                   G d„ d«      «       }| j                  D �cg c]  } ||j                  «       «      ‘Œ }}| j	                  || j
                  «      \  }}t        j                  j                  r¯t        | j                  t        j                  j                  «      r�| j                  ||«      }t        | j                  j                   j"                  |«      D ��cg c]9  \  }}t        j                  j$                  j'                  ||j(                  «      ‘Œ; }}}n6|D �cg c]+  }t        j                  j$                  j'                  |«      ‘Œ- }}| j*                  j-                  |«       |S c c}w c c}}w c c}w )Nc                  ó    — e Zd ZU ded<   dd„Zy)ú)FallbackKernel.codegen_args.<locals>.Shimr   Úrefc                ó   — | j                   S r’   )r‡  r6  s    ru   rw  z2FallbackKernel.codegen_args.<locals>.Shim.__repr__§  s   € Ø—x‘x�rt   Nrð  )ro   rp   rq   rr   rw  rs   rt   ru   ÚShimr†  £  s   … à‹Hô rt   r‰  )r  Ú	dataclassrW  rƒ  r3  rð  rV   rÑ   r  rx   rõ  rÜ   r  r  rq  r§   r  r  rÚ  rs  r  r•   rÁ  )r0  r‰  rÈ   rD  r”   r•   Úparams          ru   rz  zFallbackKernel.codegen_args¢  sH  € Ü	×	Ñ	÷	 ð 	 ó 
ð	 ð =A¿K¹KÖH°q‘t˜A×/Ñ/Ó1Õ2ÐHˆÐHØ×*Ñ*¨;¸×8JÑ8JÓK‰ˆˆfÜ�7‰7×Ò¤:¨d×.>Ñ.>ÄÇ
Á
×@UÑ@UÔ#VØ×.Ñ.¨t°VÓ<ˆDô !$ D×$4Ñ$4×$<Ñ$<×$FÑ$FÈÓ M÷á�E˜1ô —‘×$Ñ$×3Ñ3°A°u·±ÕGðˆDò ð
 EIÖI¸q”A—G‘G×(Ñ(×7Ñ7¸Õ:ÐIˆDÐIð 	�‰×Ñ˜6Ô"Øˆùò Iùóùò
 Js   ¬FÃ1>FÄ70Fc                ó²  — | r3| D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|d   S t        |t        j                  «      r|j                  S t        |t
        t        f«      r\t        d„ |D «       «      }|D �cg c]  }|sŒ|‘Œ	 }}t        |«      dk(  r|d   S |D ]  }t        |j                  «      sŒ|c S  |d   S y c c}w c c}w )Nr   c              3  óH   K  — | ]  }t         j                  d |«      –— Œ y ­wr’   )rb  Úfind_devicerð  s     ru   rý   z-FallbackKernel.find_device.<locals>.<genexpr>Á  s"   è ø€ ò $Ø89”×*Ñ*¨4°×3ñ$ùr-  r1   )rÚ   rx   rÜ   r?  rÐ   ry   rz   r,   rž   rN   r‡   )rD  rJ  rØ  ÚdevicesÚ
device_setrÐ   s         ru   rŽ  zFallbackKernel.find_device¹  sÙ   € áØ3>ÖS¨CÀ#Ç.Á.ÕBR�s—~‘~Õ'ÐSˆGÐSØ˜1‘:ÐÜ�n¤e§l¡lÔ3Ø!×(Ñ(Ð(Ü�n¤t¬U mÔ4Ü#ñ $Ø=Kô$ó ˆJð -7ÖA &º&’vÐAˆGÐAÜ�7‹|˜qÒ Ø˜q‘zÐ!Ø!ò "�Ü˜&Ÿ+™+Õ&Ø!’Mð"ð ˜1‘:ÐØùò! Tùò Bs   ‡C�CÂCÂCc                ó¦   — t        | j                  t        j                  j                  «      ryt        | j                  «      j                  «       S r‰  )rx   rõ  rÜ   r  r  r$   rw  r6  s    ru   r  zFallbackKernel.has_side_effectsÎ  s9   € Ü�d×&Ñ&¬¯
©
×(FÑ(FÔGØÜ˜t×/Ñ/Ó0×;Ñ;Ó=Ð=rt   c                ó   — | j                   S r’   )rh  r6  s    ru   rÑ  z+FallbackKernel.get_inputs_that_alias_outputÓ  rH  rt   c                óN   — t        | j                  «      dk  sJ ‚| j                  S rW  )rž   r¯  r6  s    ru   rÍ  z!FallbackKernel.get_mutation_namesÖ  s'   € Ü�4×&Ñ&Ó'¨1Ò,Ð,Ð,Ø×"Ñ"Ð"rt   c           	     óÊ  — t         j                  d| j                  «       | j                  «       t	        | t
        «      sJ ‚| j                  | j                  | j                  «      \  }}| j                  ||«      }| j                  D �cg c]  } | j                  |fi |¤Ž‘Œ }}| j                  }t        j                  j                  sg |¢|¢S t        d d «      }|j!                  |||«      }d„ }t	        |t"        j$                  j&                  j(                  «      r#|j+                  |d   |d   «      j,                  }	n|j.                  j,                  }	t1        |	«      dk(  r>| j2                  r| j2                  n| j4                  }
|	d   j6                  } |||
«      g}n9t9        |	| j2                  «      D ��cg c]  \  }} ||j6                  |«      ‘Œ }}}t;        | j                  «       t=        j>                  | j                  jA                  «       ||i ¬«      ¬«      }t        j                  jB                  jE                  |«       g |¢|¢S c c}w c c}}w )Nz4Extern kernel node added for node %s with target %s.c           	     óp  — t        | t        j                  «      ro|}t        |t        t        f«      rt        |«      dk(  sJ ‚|d   }t        j                  j                  t        j                  |j                  «       ¬«      ¬«      S t        | t        j                  «      rxt        | j                  «       t        j                  «      rPt        j                  j                  |D �cg c]&  }t        j                  |j                  «       ¬«      ‘Œ( c}¬«      S t        dt        | «      › �«      ‚c c}w )Nr1   r   r:  )Ú	as_tensor)Ú
as_tensorszUnsupported return type )rx   rÜ   Ú
TensorTypery   rz   rž   Úexport_schemaÚArgumentrR  ÚTensorArgumentr•  rm  ÚgetElementTypeÚRuntimeErrorr‡   )Úreturn_typeÚoutputrÃ   s      ru   Úhandle_single_outputzFFallbackKernel.export_extern_kernel_node.<locals>.handle_single_outputø  s  € Ü˜+¤u×'7Ñ'7Ô8à�Ü˜f¤t¬U mÔ4Ü˜v›;¨!Ò+Ð+Ð+Ø  ™)�CÜ$×-Ñ-×4Ñ4Ü+×:Ñ:ÀÇÁÃÔOð 5ó ð ô ˜K¬¯©Ô8¼ZØ×*Ñ*Ó,¬e×.>Ñ.>ô>ô %×-Ñ-×4Ñ4ð $*ö àô &×4Ñ4¸#¿,¹,».ÖIò ð 5ó ð ô #Ð%=¼dÀ;Ó>OÐ=PÐ#QÓRÐRùò s   Ã)+D3r   r1   )r|  rW  rn  Úmetadata)r–   r‰   )#r  r  r•  rõ  rx   rb  r3  rW  rð  rq  rô  r|  rV   rÑ   Úaot_moder   Úserialize_inputsrÜ   Ú_higher_order_opsÚ	torchbindÚCallTorchBindrz  Úreturnsr  rž   rn  rù  r  r§   r`  r™  rW   r–   Úextern_kernel_nodesr  )r0  r”   r•   r   Úordered_kwargsr|  Ú
serializerÚnamed_argumentsr   r§  rn  rž  Úoutput_argumentsÚreturn_schemarŸ  r‰   s                   ru   Úexport_extern_kernel_nodez(FallbackKernel.export_extern_kernel_nodeà  s-  € Ü�	‰	ØBØ�M‰M‹OØ×Ñô	
ô ˜$¤Ô/Ð/Ð/Ø×*Ñ*¨4¯;©;¸×8JÑ8JÓK‰ˆˆfØ×*Ñ*¨4°Ó8ˆð ×9Ñ9ö
àð "ˆD×!Ñ! #Ñ0¨Ó0ð
ˆð 
ð ×!Ñ!ˆä�w‰w×Òà+�TÐ+˜NÐ+Ð+ä*¨4°Ó6ˆ
Ø$×5Ñ5°f¸dÀFÓKˆò	Sô. �fœe×5Ñ5×?Ñ?×MÑMÔNØ—m‘m D¨¡G¨T°!©WÓ5×=Ñ=‰Gà—n‘n×,Ñ,ˆGÜˆw‹<˜1Òð '+§l¢l�d—l’l¸×8MÑ8MˆGØ! !™*×.Ñ.ˆKÙ 4°[À'Ó JÐKÑô .1°¸$¿,¹,Ó-G÷ á)�M 6ñ % ]×%<Ñ%<¸fÕEð Ðñ  ô
  Ø—‘“Ü×#Ñ#Ø×'Ñ'×,Ñ,Ó.Ø&Ø(Øô	ô
ˆô 	
�‰×#Ñ#×*Ñ*¨4Ô0à'�Ð'˜Ð'Ð'ùòG
ùód s   ÂIÇIc                ó.  ‡ ‡‡— ‰ j                   }|j                  dk(  rqt        |t        j                  j
                  «      sJ ‚t        j                  j                  r‡ddl	m
} t        |«      |vrtt        j                  d|«       d‰ _        nV|j                  dk(  r&t        |t        j                  j
                  «      s#J ‚t        j                  j                  rd‰ _        d
ˆ ˆfd„}dd„Š‰ j                  ‰«       ‰ j                  r |«        nïg ‰ j!                  «       ¢‰ j#                  «       ¢}t        j                  j                  r^t        |t        j                  j
                  «      r:t%        ˆfd	„t'        ||j(                  j*                  «      D «       «      r |«        nUt        j                  j,                  j/                  ‰ |«       t        ‰ j0                  t2        «      r‰ j5                  ‰«       ‰ j7                  ‰«       y )Nr  r   )Úinductor_fallback_opszG%s is missing a c-shim implementation, using proxy executor as fallbackTÚ
_quantizedc            	     óþ   •— d } ‰j                  «       }‰j                  ‰j                  «       ‰j                  ‰j                  | ‰j
                  |‰j                  r‰j                  «       y ‰j                  «       y r’   )r®  Ú,generate_fallback_kernel_with_runtime_lookupr•  rò  ró  rõ  rn  rù  )r”   Úexported_argsr0  r  s     €€ru   Údo_runtime_dispatchz3FallbackKernel.codegen.<locals>.do_runtime_dispatchF  sk   ø€ ØˆDØ ×:Ñ:Ó<ˆMà×@Ñ@Ø—‘“Ø×'Ñ'Ø×$Ñ$ØØ× Ñ Øà $§¢�—‘õ	ð 37×2GÑ2Gõ	rt   c                óÂ   — t        | t        j                  «      xsD t        | t        j                  «      xr( t        | j	                  «       t        j                  «      S r’   )rx   rÜ   Ú
NumberTypeÚOptionalTyperœ  )rá   s    ru   Ú	is_numberz)FallbackKernel.codegen.<locals>.is_numberU  sK   € Ü˜a¤×!1Ñ!1Ó2ò Ü˜1œe×0Ñ0Ó1ò EÜ˜q×/Ñ/Ó1´5×3CÑ3CÓDðrt   c              3  óT   •K  — | ]  \  }}d |v xr  ‰|j                   «      –— Œ! y­w)zc10::complexN)r  )rû   Úarg_strÚop_argr¹  s      €ru   rý   z)FallbackKernel.codegen.<locals>.<genexpr>c  s5   øè ø€ ò á'˜ ð # gÐ-ÒM±)¸F×<LÑ<LÓ2MÓMñùrÊ  rÓ  )rá   ztorch.JitTyperŒ   rl   )rõ  r  rx   rÜ   r  r  rV   rÑ   r  Útorchgen.aoti.fallback_opsr°  r™   r  rC  rs  r  rz  r€  r¨  r§   r  r  rÚ  Úgenerate_fallback_kernelr  rm  r„  r~  )r0  r  rä  r°  rµ  r”   r¹  s   ``    @ru   r  zFallbackKernel.codegen/  s‹  ú€ Ø×!Ñ!ˆØ×Ñ˜vÒ%ä˜f¤e§j¡j×&;Ñ&;Ô<Ð<Ð<Ü�w‰w×"Ò"ÝLä�v“;Ð&;Ñ;ô —K‘KØaØôð 15�DÕ-Ø×Ñ Ò-ä˜f¤e§j¡j×&;Ñ&;Ô<Ð<Ð<Ü�W‰W× Ò à(,ˆDÔ%ö	ó	ð 	×Ñ˜WÔ%Ø×$Ò$ÙÕ!àA�T×&Ñ&Ó(ÐA¨4×+>Ñ+>Ó+@ÐAˆDä—‘×#Ò#Ü˜v¤u§z¡z×'<Ñ'<Ô=Üó ä+.¨t°V·^±^×5MÑ5MÓ+Nôô ñ $Õ%ä—‘×$Ñ$×=Ñ=¸dÀDÔIÜ˜dŸk™k¬6Ô2Ø×-Ñ-¨gÔ6à×)Ñ)¨'Õ2rt   c           	     ó¢   — t        | j                  | j                  t        | j	                  «       «      t        | j                  «       «      «      S r’   )r  rÐ   rÏ   rH   rÍ   rÎ   )rŸ  s    ru   Útensor_to_layoutzFallbackKernel.tensor_to_layoutu  s9   € äØ�M‰MØ�L‰LÜ% f§k¡k£mÓ4Ü% f§m¡m£oÓ6ó	
ð 	
rt   c                óø  ‡ ‡‡— t         j                  f}||vrt        j                  j                  n	t        «       }|5   ‰ j                  |g|¢­i |¤Ž\  }}}}	}
d d d «       ‰ j                  «      }|€ ‰ t        |¬«      ||	
¬«      Šn!|sJ d«       ‚ ‰ t        |¬«      ||	
¬«      Šˆ ˆˆfd„Š ‰|g «      }t        |t        t        t        f«      r	|‰_        |S |g‰_        |S # 1 sw Y   Œ•xY w)NrJ  rc  z"Not sure where to find device infoc                óN  •‡ ‡— t        ‰ t        t        f«      r. t        ‰ «      ˆˆˆ fd„t	        t        ‰ «      «      D «       «      S t        ‰ t        «      r:‰ j                  «       D ��ci c]  \  }}| ‰|‰t        ‰ «      |fgz   «      “Œ  c}}S t        ‰ t        j                  «      rt        ‰j                  ‰ «      ‰‰«      S t        ‰ t        «      r‰ S t        ‰ t        j                  «      r‰ j                  j                  S ‰ �J dt        ‰ «      › d�«       ‚y c c}}w )Nc              3  óT   •K  — | ]  } ‰‰|   ‰t        ‰«      |fgz   «      –— Œ! y ­wr’   )r‡   )rû   r¡   Úgenerate_outputr  rŸ  s     €€€ru   rý   zAFallbackKernel.create.<locals>.generate_output.<locals>.<genexpr>¥  s5   øè ø€ ò $àñ $ F¨1¡I¨w¼4À»<ÈÐ:KÐ9LÑ/L×Mñ$ùrÊ  zFallbackKernel output type z is not supported)rx   ry   rz   r‡   rŸ   rž   r{   r  rÜ   r?  ÚMultiOutputrÀ  r„   ÚSymIntr‰   rC  )rŸ  r  r   rN  rS  rÄ  Úpackeds   ``  €€€ru   rÄ  z.FallbackKernel.create.<locals>.generate_output£  s  ú€ Ü˜&¤4¬ -Ô0Ø#”t˜F“|õ $ä"¤3 v£;Ó/ô$ó ð ô ˜F¤DÔ)ð %+§L¡L£N÷á ˜˜Sð ™¨¨g¼$¸v»,ÈÐ9LÐ8MÑ.MÓNÑNóð ô ˜F¤E§L¡LÔ1Ü"Ø×(Ñ(¨Ó0ØØóð ô
 ˜F¤CÔ(Ø�Ü˜F¤E§L¡LÔ1Ø—{‘{×'Ñ'Ð'à�~ð Ø1´$°v³,°Ð?PÐQó�~ð ùó%s   Á+#D!)r  Ú*_fused_moving_avg_obs_fq_helper_functionalrV   rÑ   r>  r   rM  rŽ  rœ  r¸  rx   ry   rz   r{   rn  )rS  rä  r”   r•   Úfake_incorrect_kernelsÚcontextrJ  rD  rE  r3  rø  rÐ   rn  rÄ  rÇ  s   `            @@ru   rR  zFallbackKernel.create~  s'  ú€ ä"&×"QÑ"QÐ!SÐà!'Ð/EÑ!EŒA�G‰G×ÒÌ;Ë=ð 	ð ñ 	<ð #�×"Ñ" 6Ð;¨DÒ;°FÑ;ñØØØØØ!÷	<ð —‘ ¨nÓ=ˆØÐ!ÙÜ &Ô)ØØØØØ"3ô‰Fñ Ð?Ð?Ó?�6ÙÜ!¨Ô0ØØØØØ"3ôˆFö	ñ6 " .°"Ó5ˆÜ�g¤¤e¬TÐ2Ô3Ø$ˆFŒNð ˆð &˜YˆFŒNØˆ÷	<ð 	<ús   ¿C0Ã0C9c                ó    •— t         ‰| �  «       S r’   )rB  r  rC  s    €ru   r  zFallbackKernel.apply_constraintÅ  s   ø€ Ü‰wÑ'Ó)Ð)rt   r’   rÓ  r,  )rŸ  útorch.Tensor)ro   rp   rq   r©  r~  r%  rz  r  rŽ  r  rÑ  rÍ  r®  r  rÀ  rx  rR  r  rz  r{  s   @ru   rb  rb  &  sš   ø„ ð ðj4ð ñj4ð 
õj4óX
ó
 òð. ñó ðò(>ò
 ò#òM(ó^D3ðL ò
ó ð
ð ñDó ðD÷L*ð *rt   rb  c                  ó<   ‡ — e Zd ZdZdd„Zdd„Zddœ	 d	ˆ fd„Zˆ xZS )
ÚComplexViewz9View a complex number as two dtyped numbers or vice versac                 ó   — yr‰  rs   r6  s    ru   rß  zComplexView.should_allocateÍ  r‹  rt   c                ó>   — | j                   d   j                  «       gS rx  rú  r6  s    ru   rÑ  z(ComplexView.get_inputs_that_alias_outputÐ  s   € à—‘˜A‘×'Ñ'Ó)Ð*Ð*rt   Nrc  c               ó0   •— t         ‰| �  ||||||¬«       y )Nrc  )rB  r©  )r0  r  rä  rD  ry  r3  rø  rD  s          €ru   r©  zComplexView.__init__Ô  s)   ø€ ô 	‰ÑØØØØØØ/ð 	õ 	
rt   rÞ  r  rÓ  )ro   rp   rq   rß  rß  rÑ  r©  rz  r{  s   @ru   rÎ  rÎ  É  s)   ø„ áCóó+ð ñ
ð 
÷
ñ 
rt   rÎ  c                  ó    — e Zd ZU ded<   dd„Zy)r¸  ré  rÐ   c                ó   — | j                   S r’   rJ  r6  s    ru   rÚ   zMultiOutputLayout.get_deviceì  rK  rt   Nræ  )ro   rp   rq   rr   rÚ   rs   rt   ru   r¸  r¸  è  s   … àÓôrt   r¸  c                  óR   ‡ — e Zd Zd„ Zdd„Z	 	 	 	 	 	 dˆ fd„Zd	d„Zd
d„Zdd„Zˆ xZ	S )rÅ  c                óÄ  — t        |«      dkD  rÑ|d   \  }}t        |t        «      r| j                  |› d|› d�|dd  «      S t        |t        «      rWt
        j                  j                  j                  || j                  «       t        |«      «      }| j                  ||dd  «      S t        |t        «      r| j                  |› d|› d�|dd  «      S t        d|«      ‚|S )Nr   ú[ú]r1   z['z']znon supported index type: )rž   ró   ry   Úcodegen_list_tuple_accessrz   rV   rÑ   rÚ  Úcodegen_tuple_accessr•  r™   r{   r‘  )r0  Úbasenamer  Úityper¡   Útuple_accesss         ru   rØ  z%MultiOutput.codegen_list_tuple_accessô  sâ   € Üˆw‹<˜!ÒØ˜q‘z‰HˆE�1Ü˜%¤Ô&Ø×5Ñ5¸¸
À!ÀAÀ3ÀaÐ6HÈ'ÐRSÐRTÈ+ÓVÐVÜ˜E¤5Ô)ä Ÿw™w×3Ñ3×HÑHØ˜dŸm™m›o¬s°1«vó �ð ×5Ñ5°lÀGÈAÈBÀKÓPÐPÜ˜E¤4Ô(Ø×5Ñ5¸¸
À"ÀQÀCÀrÐ6JÈGÐTUÐTVÈKÓXÐXä$Ð%AÀ5ÓIÐIàˆOrt   c                óÐ   — |j                  | j                  «       | j                  | j                  d   j                  «       | j                  «      «       | j                  |«       y rx  )Úcodegen_multi_outputr•  rØ  rW  r  r„  r  s     ru   r  zMultiOutput.codegen  sN   € Ø×$Ñ$Ø�M‰M‹OØ×*Ñ*¨4¯;©;°q©>×+BÑ+BÓ+DÀdÇlÁlÓSô	
ð 	×!Ñ! 'Õ*rt   c                óÀ   •— t         ‰| �  d ||gd«       t        j                  j	                  | «      | _        t        j                  j                  | «       || _        y r  )rB  r©  rV   rÑ   rY  r–   rZ  r  )r0  r  rÃ  r  rD  s       €ru   r©  zMultiOutput.__init__  sI   ø€ ô 	‰Ñ˜˜v¨ w°Ô3Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Ô(Øˆ�rt   c                ó<   — | j                   d   j                  «       S rx  )rW  rÁ  r6  s    ru   rÁ  z$MultiOutput.get_unbacked_symbol_uses  s   € Ø�{‰{˜1‰~×6Ñ6Ó8Ð8rt   c                óp   — t        | j                  «      dk(  rt        | j                  d   t        «      ryy)Nr1   r   TF)rž   rW  rx   rµ  r6  s    ru   rß  zMultiOutput.should_allocate  s,   € Üˆt�{‰{Ó˜qÒ Ü�t—{‘{ 1‘~Ô'8Ô9àØrt   c                ó´   — | j                   D �cg c]>  }t        |t        «      r,t        |j	                  «       «      dkD  r|j                  «       ‘Œ@ c}S c c}w rx  )rW  rx   rb  rž   rÑ  r•  )r0  rc  s     ru   rÑ  z(MultiOutput.get_inputs_that_alias_output"  sN   € ð —{‘{ö
àÜ˜#œ~Ô.Ü�C×4Ñ4Ó6Ó7¸!Ò;ð �L‰L�Nò
ð 	
ùò 
s   �AArÓ  )r  ré   r  zlist[tuple[Any, ...]]rŒ   r�   r,  rÞ  r  )
ro   rp   rq   rØ  r  r©  rÁ  rß  rÑ  rz  r{  s   @ru   rÅ  rÅ  ð  s=   ø„ òó$+ð	àð	ð 'ð		ð
 
õ	ó9ó÷
rt   rÅ  c                  ó‚  — e Zd ZU dZded<   d+d„Zd,d„Zd-d„Zd.d„Zd/d„Z	d0d	„Z
d1d2d„Zd3d„Zd4d„Zd5d„Zd4d„Z	 d6	 	 	 	 	 d7d„Zd8d„Zd9d„Z	 d6	 	 	 	 	 d:d„Zd;d„Zd<d„Zd=d„Zd>d„Zd?d„Zd@d„Zd+d„Zd+d„ZdAd„ZdBd„Zd0d„ZdBd„Zd?d „Z dCd!„Z!dDd"„Z"dEd#„Z#d1dFd$„Z$e%dGd%„«       Z&dHd&„Z'dGd'„Z(dId(„Z)e%d)„ «       Z*d0d*„Z+e+Z,y
)Jr°  zC
    TensorBox / StorageBox allow in-place mutation of Tensors
    rc   r  c                ó6   — | j                   j                  «       S r’   rU  r6  s    ru   rŠ  z!MutableBox.has_exceeded_max_reads5  rV  rt   c                ó6   — | j                   j                  «       S r’   rJ  r6  s    ru   rÚ   zMutableBox.get_device8  rH  rt   c                ó6   — | j                   j                  «       S r’   rë  r6  s    ru   rŽ  zMutableBox.make_loader;  ó   € Ø�y‰y×$Ñ$Ó&Ð&rt   c                ó6   — | j                   j                  «       S r’   )r  r‘  r6  s    ru   r‘  zMutableBox.make_indexer>  r\  rt   c                ó6   — | j                   j                  «       S r’   )r  rú   r6  s    ru   rú   zMutableBox.get_strideA  rH  rt   c                ó6   — | j                   j                  «       S r’   rM  r6  s    ru   r•  zMutableBox.get_nameD  rN  rt   Nc                ó8   — | j                   j                  |«      S r’   )r  r›  r™  s     ru   r›  zMutableBox.has_large_inner_fnG  s   € Ø�y‰y×+Ñ+¨IÓ6Ð6rt   c                ó8   — | j                   j                  |«      S r’   rR  r�  s     ru   rŸ  zMutableBox.mark_reuseJ  rS  rt   c                ó6   — | j                   j                  «       S r’   r[  r6  s    ru   r¢  zMutableBox.realize_hintM  r\  rt   c                ó6   — | j                   j                  «       S r’   )r  r¤  r6  s    ru   r¤  zMutableBox.unwrap_viewP  rç  rt   c                ó6   — | j                   j                  «       S r’   )r  r¦  r6  s    ru   r¦  zMutableBox.freeze_layoutS  s   € Ø�y‰y×&Ñ&Ó(Ð(rt   c                ó:   — | j                   j                  ||«      S r’   )r  rª  r¨  s      ru   rª  z*MutableBox.freeze_layout_with_stride_orderV  s   € ð �y‰y×8Ñ8¸ÀÓNÐNrt   c                ó8   — | j                   j                  |«      S r’   )r  r®  r­  s     ru   r®  z(MutableBox.freeze_layout_with_fill_order[  s   € Ø�y‰y×6Ñ6°uÓ=Ð=rt   c                ó8   — | j                   j                  |«      S r’   )r  r±  r°  s     ru   r±  z(MutableBox.freeze_layout_with_same_order^  s   € Ø�y‰y×6Ñ6°vÓ>Ð>rt   c                ó:   — | j                   j                  ||«      S r’   )r  rµ  r³  s      ru   rµ  z+MutableBox.freeze_layout_with_exact_stridesa  s   € ð �y‰y×9Ñ9¸-ÈÓWÐWrt   c                ó6   — | j                   j                  «       S r’   )r  r·  r6  s    ru   r·  zMutableBox.get_read_writesf  ó   € Ø�y‰y×(Ñ(Ó*Ð*rt   c                ó6   — | j                   j                  «       S r’   r  r6  s    ru   r@  zMutableBox.get_readsi  rb  rt   c                ó6   — | j                   j                  «       S r’   r  r6  s    ru   r½  zMutableBox.num_readsl  rb  rt   c                ó6   — | j                   j                  «       S r’   r^  r6  s    ru   r¿  zMutableBox.get_storage_numelo  r_  rt   c                ó6   — | j                   j                  «       S r’   rI  r6  s    ru   rÃ  zMutableBox.get_reduction_typer  rG  rt   c                ó6   — | j                   j                  «       S r’   rF  r6  s    ru   rÅ  zMutableBox.get_reduction_sizeu  rG  rt   c                ó6   — | j                   j                  «       S r’   ra  r6  s    ru   rÇ  zMutableBox.is_externx  rb  rt   c                ó6   — | j                   j                  «       S r’   )r  rÉ  r6  s    ru   rÉ  zMutableBox.is_no_op{  rN  rt   c                ó8   — | j                   j                  |«      S r’   rN  r†  s     ru   rË  zMutableBox.constant_to_device~  s   € Ø�y‰y×+Ñ+¨FÓ3Ð3rt   c                ó6   — | j                   j                  «       S r’   )r  rÍ  r6  s    ru   rÍ  zMutableBox.get_mutation_names�  rG  rt   c                ó6   — | j                   j                  «       S r’   )r  rÏ  r6  s    ru   rÏ  zMutableBox.get_operation_name„  rG  rt   c                ó6   — | j                   j                  «       S r’   )r  rÑ  r6  s    ru   rÑ  z'MutableBox.get_inputs_that_alias_output‡  s   € Ø�y‰y×5Ñ5Ó7Ð7rt   c                ó6   — | j                   j                  «       S r’   rX  r6  s    ru   r  zMutableBox.realizeŠ  rY  rt   c                ó6   — | j                   j                  «       S r’   r:  r6  s    ru   rÁ  z#MutableBox.get_unbacked_symbol_uses�  r;  rt   c                ó6   — | j                   j                  «       S r’   rg  r6  s    ru   rA  zMutableBox.get_read_names�  rh  rt   c                ó6   — | j                   j                  «       S r’   )r  rJ  r6  s    ru   rJ  zMutableBox.get_defining_op“  rõ  rt   c                ó8   — | j                   j                  |«      S r’   )r  rƒ  r�  s     ru   rƒ  zMutableBox.codegen_reference–  s   € Ø�y‰y×*Ñ*¨6Ó2Ð2rt   c                ó6   — | j                   j                  «       S r’   ©r  ri  r6  s    ru   r  zMutableBox.layout™  s   € ð �y‰y×(Ñ(Ó*Ð*rt   c                ó6   — | j                   j                  «       S r’   rG  r6  s    ru   rÖ   zMutableBox.get_layoutž  rH  rt   c                ó6   — | j                   j                  «       S r’   r	  r6  s    ru   ri  zMutableBox.get_output_spec¡  rõ  rt   c                ó6   — | j                   j                  «       S r’   rè  r6  s    ru   rÔ   zMutableBox.get_size¤  rN  rt   c                ó.   — | j                   j                  S r’   )r  rÏ   r6  s    ru   rÏ   zMutableBox.dtype§  s   € à�y‰y�‰Ðrt   c                ót  — t        | j                  t        «      rQt        | «      j                  › dt        | j                  «      j                  › d�}d}| j                  j                  }n&t        | «      j                  › d�}| j                  }d}|t        t        |«      «      |g}dj                  |«      S )NrS  z))rè   ú
)rx   r  r°  r‡   ro   rU  r™   rV  )r0  Úline0ÚendlrA  rW  s        ru   rH  zMutableBox.__str__«  sŸ   € Ü�d—i‘i¤Ô,Ü˜D“z×*Ñ*Ð+¨1¬T°$·)±)«_×-EÑ-EÐ,FÀaÐHˆEØˆDØ—I‘I—N‘N‰Eä˜D“z×*Ñ*Ð+¨1Ð-ˆEØ—I‘IˆEØˆDð Ü”3�u“:ÓØð
ˆð
 �y‰y˜ÓÐrt   rÞ  ræ  rê  rì  rî  rð  r’   rñ  ró  rÓ  rô  rõ  rö  rø  rù  rû  rü  rý  rþ  rÿ  rã  r  r  r  r,  rÔ  r×  rå  rÝ  rÜ  rß  )-ro   rp   rq   rß  rr   rŠ  rÚ   rŽ  r‘  rú   r•  r›  rŸ  r¢  r¤  r¦  rª  r®  r±  rµ  r·  r@  r½  r¿  rÃ  rÅ  rÇ  rÉ  rË  rÍ  rÏ  rÑ  r  rÁ  rA  rJ  rƒ  r  r  rÖ   ri  rÔ   rÏ   rH  rw  rs   rt   ru   r°  r°  -  s5  … ñð ƒLó2ó&ó'ó(ó&ó$ô7ó+ó(ó'ó)ð 7<ðOØðOØ/3ðOà	óOó
>ó?ð DIðXØ+ðXØ<@ðXà	óXó
+ó%ó%ó-ó.ó.ó%ó$ó4ó.ó.ó8ó#ó4ó*ó+ô3ð ò+ó ð+ó&ó+ó$ð ñó ðó ð" �Hrt   r°  c                  ó   — e Zd Zed„ «       Zy)rb   c                óN   — t        | t        «      r| S t        t        | «      «      S r’   )rx   r†   rb   r1  )r  s    ru   rR  zTensorBox.createÀ  s"   € ä�dÔ1Ô2ØˆKÜœ DÓ)Ó*Ð*rt   N)ro   rp   rq   r  rR  rs   rt   ru   rb   rb   ¿  s   „ Øñ+ó ñ+rt   c                  óD   — e Zd Zd„ Zd„ Zd
d„Zdd„Zdd„Zd„ Zdd„Z	d„ Z
y	)r1  c                ó¬   — t        | j                  t        t        f«      r4| j                  j	                  «       t
        j                  j                  v S yr‰  )rx   r  rç  r  r•  rV   rÑ   Úgraph_inputsr6  s    ru   rÚ  zStorageBox.is_input_bufferÈ  s:   € Ü�d—i‘i¤+¬Ð!?Ô@Ø—9‘9×%Ñ%Ó'¬1¯7©7×+?Ñ+?Ð?Ð?Ørt   c                ó¢   — t        | j                  t        «      xr4 | j                  j                  «       t        j
                  j                  v S r’   )rx   r  r—  r•  rV   rÑ   r8  r6  s    ru   rd  zStorageBox.is_module_bufferÍ  s9   € ä�t—y‘y¤>Ó3ò :Ø—	‘	×"Ñ"Ó$¬¯©×(9Ñ(9Ð9ð	
rt   c           	     óÎ  — t        | j                  t        t        t        t
        t        f«      r| j                  j                  «       S t        | j                  t        t        t        t        f«      sJ t        | j                  «      «       ‚| j                  j                  «       }| j                  j                  «       }t        d t        | j                  j!                  «       | j                  j#                  «       | j                  j%                  «       ¬«      | j                  ¬«      | _        t&        j(                  j+                  | j                  «      | j                  _        t&        j(                  j/                  | j                  «       | j0                  | j                  _        || j                  _        || j                  _        | j                  j,                  S )Nrû  rü  )rx   r  r  rU  rç  r  rS  r•  rƒ  rØ  rÎ  r  r‡   rG  rD  r×   rÚ   rÙ   rÔ   rV   rÑ   rY  r–   rZ  r&  r*  r(  )r0  r*  r(  s      ru   r  zStorageBox.realizeÓ  sO  € ÜØ�I‰IäÜÜÜÜðô	
ð —9‘9×%Ñ%Ó'Ð'Ü˜$Ÿ)™)¤i´¼DÄ$Ð%GÔHð 	
Ì$Ø�I‰IóK
ó 	
ÐHð —i‘i×/Ñ/Ó1ˆØ—I‘I×+Ñ+Ó-ˆ	Ü"ØÜ!Ø—y‘y×+Ñ+Ó-Ø—i‘i×)Ñ)Ó+Ø—Y‘Y×'Ñ'Ó)ôð
 —‘ô
ˆŒ	ô Ÿ™×0Ñ0°·±Ó;ˆ�	‰	ŒÜ	�‰×"Ñ" 4§9¡9Ô-Ø ŸL™Lˆ�	‰	ÔØ +ˆ�	‰	ÔØ'ˆ�	‰	ÔØ�y‰y�~‰~Ðrt   c                ó¶   — t        | j                  t        t        f«      r9| j                  j	                  «       j
                  dkD  r| j                  «        yyy)zL
        Called on buffers we expect to be forced to realize later.
        r1   N)rx   r  rƒ  rØ  rd  Únontrivial_read_countr  r6  s    ru   r¢  zStorageBox.realize_hintô  sF   € ô
 �t—y‘y¤9¬iÐ"8Ô9Ø—	‘	×*Ñ*Ó,×BÑBÀQÒFà�L‰L�Nð Gð :rt   c                ó    — t        | j                  t        «      xr3 | j                  «       t        j
                  kD  xs | j                  «       S r’   )rx   r  rƒ  r½  r2   Úrealize_acc_reads_thresholdr›  r6  s    ru   rŠ  z!StorageBox.has_exceeded_max_readsþ  s@   € Ü˜$Ÿ)™)¤YÓ/ò 
Ø�N‰NÓœv×AÑAÑAò )Ø×&Ñ&Ó(ð	
rt   c                óF  ‡— |dkD  r›t        | j                  t        t        f«      r{t	        | j                  «      r3| j                  j                  «       Šddg}t        ˆfd„|D «       «      ry| j                  «       t        j                  kD  xs | j                  «       S y)zj
        A heuristic to decide if we should realize a tensor
        that is used multiple times.
        r1   ÚexpÚsigmoidc              3  ó:   •K  — | ]  }|‰j                   v –— Œ y ­wr’   )Úused_ops)rû   rÈ   Úopcounts     €ru   rý   z5StorageBox.should_realize_on_reuse.<locals>.<genexpr>  s   øè ø€ Ò@°�q˜G×,Ñ,Ô,Ñ@ùs   ƒTF)rx   r  rƒ  rØ  r÷   rd  r¨  r½  r2   Úrealize_reads_thresholdr›  )r0  rž  Ú	heavy_opsr 	  s      @ru   Úshould_realize_on_reusez"StorageBox.should_realize_on_reuse  s‡   ø€ ð
 �1Š9œ D§I¡I´	¼9Ð/EÔFÜ�d—i‘iÔ àŸ)™)×4Ñ4Ó6�Ø" IÐ.�	ÜÓ@°iÔ@Ô@Øà—‘Ó ¤6×#AÑ#AÑAò -Ø×*Ñ*Ó,ðð rt   c                óH   — | j                  |«      r| j                  «        y y r’   )r#	  r  r�  s     ru   rŸ  zStorageBox.mark_reuse  s   € Ø×'Ñ'¨Ô.Ø�L‰L�Nð /rt   c                ó6   — | j                   j                  «       S r’   r  r6  s    ru   r½  zStorageBox.num_reads  rb  rt   Nrã  rÓ  rÞ  ró  )ro   rp   rq   rÚ  rd  r  r¢  rŠ  r#	  rŸ  r½  rs   rt   ru   r1  r1  Ç  s+   „ òò

óóBó
òó$ó%rt   r1  c                  ó0   — e Zd ZU ded<   ded<   dZded<   y)ÚSubgraphr™   r–   ztorch.fx.GraphModuleÚgraph_moduleNzOptional[GraphLowering]rÑ   )ro   rp   rq   rr   rÑ   rs   rt   ru   r'	  r'	    s   … à
ƒIØ&Ó&Ø%)€EÐ"Ô)rt   r'	  c                ó¸   — | D �cg c]$  }t        |t        «      r|j                  «       n|‘Œ& } }t        t	        d„ | D «       «      «      t        | «      k  S c c}w )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr’   )rº  )rû   r3  s     ru   rý   z'_has_aliased_buffers.<locals>.<genexpr>+  s   è ø€ Ò;¨œ"˜VŸ*Ñ;ùr7  )rx   r  r¤  rž   r,   )Úbuffersr3  s     ru   Ú_has_aliased_buffersr,	  %  s^   € ð öàô !+¨6´?Ô Cˆ×ÑÔÈÑOð€Gð ô
 ŒzÑ;°7Ô;Ó;Ó<¼sÀ7»|ÑKÐKùòs   …)Ac                  óv   ‡ — e Zd ZU dZded<   dZded<   dZded<   	 	 	 	 	 	 	 	 dˆ fd„Zedd	„«       Z	dd
„Z
ˆ xZS )ÚInvokeSubgraphNúOptional[Subgraph]ÚsubgraphzOptional[list[TensorBox]]ÚoperandsúOptional[list[MultiOutput]]rn  c                ó¾   •— t         ‰| �  d ||¬«       || _        t        j                  j                  | «      | _        t        j                  j                  | «       y rû  )rB  r©  r0	  rV   rÑ   rY  r–   rZ  )r0  r0	  r1	  r  rD  s       €ru   r©  zInvokeSubgraph.__init__4  sQ   ø€ ô 	‰ÑØØØð 	ô 	
ð
 !ˆŒÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                ó  ‡— t         j                  j                  j                  d   }|D �cg c]  }|j                  d   ‘Œ }}|D �cg c]  }| j                  |«      ‘Œ }}d„ }g }t        |«      D ]a  \  }}	t        |	t        «      r|j                  |	«       Œ( |||   j                  «       «      }
|j                  | j                  |	|
«      «       Œc |}|j                  €|t         j                  j                  |j                  ||j                  ¬«      |_        t        j                  |j                  «      5   |j                  j                   |Ž  d d d «       |j                  j"                  }d }|D ]$  }	t        |	t        «      rŒ|	j%                  «       } n |€J ‚t'        ||t)        |¬«      ¬«      Šdˆfd„}t        |«      D ��cg c]  \  }} |||«      ‘Œ }}}|‰_        |S c c}w c c}w # 1 sw Y   Œ£xY wc c}}w )	Nrþ   rN  c                óŒ   — | D �cg c]4  }t        |t        j                  «      r|j                  j                  n|‘Œ6 c}S c c}w r’   )rx   rÜ   rÆ  r‰   rC  )rÎ   rà   s     ru   Úhandle_sym_exprz.InvokeSubgraph.create.<locals>.handle_sym_exprK  s0   € ØOUÖVÈ!¤:¨a´·±Ô#>�A—F‘F—K’KÀAÑEÒVÐVùÒVs   …9A©ÚgmÚexample_inputsÚsubgraph_namerJ  )r0	  r1	  r  c           
     ó  •— t        | t        t        f«      r| S t        t	        | j                  «       | j                  «       | j                  «       | j                  «       | j                  «       j                  ¬«      ‰t        |fg«      S )Nra  )rx   r†   rò  rÅ  r  rÚ   rÙ   rÔ   rú   rÖ   r  ry   )rŸ  ÚindÚinvoke_subgraphs     €ru   Úcreate_outputz,InvokeSubgraph.create.<locals>.create_outputs  s|   ø€ Ü˜&Ô#8Ô:NÐ"OÔPØ�ä"ÜØ%×0Ñ0Ó2Ø$×.Ñ.Ó0Ø#Ÿ_™_Ó.Ø%×0Ñ0Ó2Ø%×0Ñ0Ó2×9Ñ9ôð $Ü˜C�[�Mó
ð 
rt   )rŸ  rc   r<	  r„   )rV   rÑ   rr  r”   rH  rÆ  r»   rx   r†   r  rÎ   rª  Úmake_subgraphr(	  r–   Úset_graph_handlerÚrunÚgraph_outputsrÚ   r.	  r¸  rn  )rS  r0	  r1	  Úfx_operandsrÈ   Úfake_operandsr6	  Únew_operandsr¼   ÚoperandÚexample_stridern  rÐ   r>	  r¡   rŸ  r=	  s                   @ru   rR  zInvokeSubgraph.create@  sû  ø€ ô —g‘g×*Ñ*×/Ñ/°Ñ3ˆØ0;Ö<¨1˜Ÿ™ ›Ð<ˆÐ<ð
 3;Ö;¨Q�C×%Ñ% aÕ(Ð;ˆÐ;ò	Wð ˆÜ% hÓ/ò 	X‰LˆC�Ü˜'Ô#8Ô9Ø×#Ñ# GÕ,á!0°¸sÑ1C×1JÑ1JÓ1LÓ!M�Ø×#Ñ# C×$=Ñ$=¸gÀ~Ó$VÕWð	Xð  ˆà�>‰>Ð!äŸW™W×2Ñ2Ø×(Ñ(Ø,Ø&Ÿm™mð 3ó ˆHŒNô
 ×$Ñ$ X§^¡^Ó4ñ 3Ø"�—‘×"Ñ" MÑ2÷3ð —.‘.×.Ñ.ˆð ˆØò 	ˆGÜ˜gÔ'<Õ=Ø ×+Ñ+Ó-�Ùð	ð Ð!Ð!Ð!ä(ØØÜ$¨FÔ3ô
ˆõ	ô  >GÀwÓ=O×P±	°°6‘= ¨Õ+ÐPˆÑPØ")ˆÔØˆùòC =ùò
 <÷,3ð 3üóH Qs   ­G1Á	G6Ä?G;ÇHÇ;Hc                ó&   — |j                  | «       y r’   )Úcodegen_invoke_subgraphr  s     ru   r  zInvokeSubgraph.codegen‡  rÀ  rt   )r0	  r'	  r1	  zlist[TensorBox]r  r¸  rŒ   r�   )r0	  r'	  rÓ  )ro   rp   rq   r0	  rr   r1	  rn  r©  rx  rR  r  rz  r{  s   @ru   r.	  r.	  .  se   ø… à#'€HÐ Ó'Ø*.€HÐ'Ó.Ø+/€GÐ(Ó/ð
)Ø ð
)Ø,;ð
)ØEVð
)à	õ
)ð òDó ðD÷L.rt   r.	  c                  ó¶   ‡ — e Zd ZU dZded<   dZded<   dZded<   dZded<   dZd	ed
<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	e
	 	 	 	 	 	 	 	 dd„«       Zdd„Zdd„Zˆ xZS )ÚConditionalNr—  Ú	predicateú7Optional[list[Union[TensorBox, ShapeAsConstantBuffer]]]r1	  r/	  Útrue_subgraphÚfalse_subgraphr2	  rn  c                ó   •— || _         || _        || _        || _        t	        |g|z   «      \  }}t
        ‰	| �  d |||¬«       |�|| _        t        j                  j                  | «      | _        t        j                  j                  | «       y ©N)r–   r  rW  rð  )rL	  r1	  rN	  rO	  Ú_split_by_sym_typerB  r©  rø  rV   rÑ   rY  r–   rZ  )
r0  rL	  r1	  rN	  rO	  r  rø  Úsym_argsrD  rD  s
            €ru   r©  zConditional.__init__“  s�   ø€ ð #ˆŒØ ˆŒØ*ˆÔØ,ˆÔä 2°I°;ÀÑ3IÓ JÑˆ�+ä‰ÑØØØØ"ð	 	ô 	
ð Ð(Ø%6ˆDÔ"ä—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                óÚ  — | j                  |«      }|D �cg c]  }| j                  |«      ‘Œ }}t        j                  j                  j                  d   }|D �cg c]  }|j
                  d   ‘Œ }}||fD ]‹  }|j                  �Œt        j                  j                  |j                  ||j                  ¬«      |_        t        j                  |j                  «      5   |j                  j                  |Ž  d d d «       Œ� |j                  j                  }	|j                  j                  }
d|	fd|
ffD ]!  \  }}t        |	«      sŒt        d|› d|› �«      ‚ t        |	«      t        |
«      k(  s	J |	|
f«       ‚t        t!        |	|
«      «      D ]�  \  }\  }}|j#                  «       |j#                  «       k(  s
J |||f«       ‚|j%                  «       |j%                  «       k(  s
J |||f«       ‚|j'                  «       j(                  |j'                  «       j(                  k(  rŒ•J |||f«       ‚ t+        d„ |g|z   D «       «      }t-        t        j                  j.                  j0                  t        j                  j                  j
                  j3                  d	d «      «      }|€J d
«       ‚t5        ||||t7        |¬«      |¬«      }dd„}t        t!        |	t        j                  j                  j
                  d   «      «      D ����cg c]¢  \  }\  }}t9        t;        |j#                  «       |j%                  «       |j=                  «       D �cg c]
  } ||«      ‘Œ c}|j?                  «       D �cg c]
  } ||«      ‘Œ c}|j'                  «       j(                  ¬«      |t@        |fg«      ‘Œ¤ }}}}}||_!        |S c c}w c c}w # 1 sw Y   �ŒaxY wc c}w c c}w c c}}}}w )Nrþ   rN  r7	  Útrue_fnÚfalse_fnzVOutput aliasing is currently not supported in compiled torch.cond. The outputs of the z% subgraph of torch.cond are aliased: c              3  ó\   K  — | ]$  }t        |t        «      s|j                  «       –— Œ& y ­wr’   )rx   r†   rÚ   )rû   Úos     ru   rý   z%Conditional.create.<locals>.<genexpr>Ø  s)   è ø€ ò 
àÜ˜aÔ!6Ô7ð �L‰L�Nñ
ùrK  rø  zcannot determine devicerJ  )rL	  r1	  rN	  rO	  r  rø  c                óR   — t        | t        «      r| S | j                  j                  S r’   )rx   r„   r‰   rC  )rà   s    ru   Ú_maybe_exprz'Conditional.create.<locals>._maybe_exprë  s   € Ü˜!œSÔ!Ø�Ø—6‘6—;‘;Ðrt   ra  )rà   zUnion[int, torch.SymInt]rŒ   zUnion[int, sympy.expr])"rÆ  rV   rÑ   rr  r”   rH  r?	  r(	  r–   r@	  rA	  rB	  r,	  r‘  rž   r»   r§   rÚ   rÙ   rÖ   r  r)  r(   rÒ   r·   rN  rK	  r¸  rÅ  r  rÍ   rÎ   ry   rn  )rS  rL	  rU	  rV	  r1	  rÈ   rC	  rD	  r0	  Útrue_outputsÚfalse_outputsr–   rn  r¡   ÚtoÚforÐ   rø  ÚconditionalrZ	  rŸ  Úmerged_outputri  s                          ru   rR  zConditional.create¯  s¸  € ð ×%Ñ% iÓ0ˆ	Ø2:Ö;¨Q�C×%Ñ% aÕ(Ð;ˆÐ;Ü—g‘g×*Ñ*×/Ñ/°Ñ3ˆØ0;Ö<¨1˜Ÿ™ ›Ð<ˆÐ<à  (Ð+ò 		7ˆHØ�~‰~Ñ%ä!"§¡×!6Ñ!6Ø×,Ñ,Ø#0Ø"*§-¡-ð "7ó "�”ô
 ×(Ñ(¨¯©Ó8ñ 7Ø&�H—N‘N×&Ñ&¨Ñ6÷7ð 7ð		7ð —}‘}×2Ñ2ˆØ Ÿ™×4Ñ4ˆà(¨,Ð7¸*ÀmÐ9TÐUò 	‰MˆD�'Ü# LÕ1Ü$ð*Ø*.¨Ð/TÐU\ÐT]ð_óð ð	ô �<Ó ¤C¨Ó$6Ò6ÐU¸À}Ð8UÓUÐ6Ü$¤S¨°}Ó%EÓFò 	Q‰KˆA‰x��BØ—=‘=“? b§m¡m£oÒ5ÐB¸¸2¸r°{ÓBÐ5Ø—<‘<“> R§\¡\£^Ò3Ð@°a¸¸R°[Ó@Ð3Ø—=‘=“?×)Ñ)¨R¯]©]«_×-CÑ-CÓCÐPÀaÈÈRÀ[ÓPÐCð	Qô
 ñ 
à�[ 8Ñ+ô
ó 
ˆô
 6Ü�G‰G×Ñ×&Ñ&Ü�G‰G× Ñ ×%Ñ%×)Ñ)Ð*=¸tÓDó
Ðð Ð!Ð<Ð#<Ó<Ð!Ü!ØØØ!Ø#Ü$¨FÔ3Ø/ô
ˆó	ô& /8Ü�L¤!§'¡'×"6Ñ"6×";Ñ";¸EÑ"BÓCó/÷
ñ 
ñ +�Ñ*�F˜Mô ÜØ!×,Ñ,Ó.Ø ×*Ñ*Ó,Ø4A×4FÑ4FÓ4HÖI¨b™+ b�/ÒIØ6C×6JÑ6JÓ6LÖM°™K¨�OÒMØ!×,Ñ,Ó.×5Ñ5ôð Ü˜��õ
ð
ˆó 
ð& &ˆÔØˆùòY <ùâ<÷7ñ 7üòb JùÚMùõ
s<   –OÁO	Ã!OÌAO%
ÍOÍ#O%
Í7O Î0O%
ÏO	Ï
O%
c           	     ó’   — |j                  | «       |j                  | j                  «       | j                  t	        | di «      «       y r|  )Úcodegen_conditionalr}  r•  rn  r“   r  s     ru   r  zConditional.codegen  s9   € Ø×#Ñ# DÔ)Ø×8Ñ8Ø�M‰M‹O˜TŸ\™\¬7°4Ð9LÈbÓ+Qõ	
rt   c                ó¸   — t        | dd «      x}rBt        t        j                  j                  j
                  |«      }|€J ‚|j                  «       S t        «       S r|  r€  r�  s      ru   r%  z$Conditional.get_unbacked_symbol_defs  rƒ  rt   )rL	  rc   r1	  ú-list[Union[TensorBox, ShapeAsConstantBuffer]]rN	  r'	  rO	  r'	  r  r¸  rø  z,Optional[dict[sympy.Symbol, pytree.KeyPath]]rŒ   r�   )rL	  rb   rU	  r'	  rV	  r'	  r1	  rd	  rÓ  r,  )ro   rp   rq   rL	  rr   r1	  rN	  rO	  rn  r©  rx  rR  r  r%  rz  r{  s   @ru   rK	  rK	  ‹  sÑ   ø… à"&€IÐÓ&ØHL€HÐEÓLØ(,€MÐ%Ó,Ø)-€NÐ&Ó-Ø+/€GÐ(Ó/ð)àð)ð @ð)ð  ð	)ð
 !ð)ð "ð)ð Hð)ð 
õ)ð8 ðTàðTð ðTð ð	Tð
 @òTó ðTól
÷ rt   rK	  c                óš   — g }g }| D ]?  }t        |t        «      r|j                  |j                  «       Œ/|j                  |«       ŒA ||fS r’   )rx   r†   r  rC  )r”   Únon_sym_argsrS	  rØ  s       ru   rR	  rR	    sS   € ð €LØ€HØò %ˆÜ�cÔ0Ô1Ø�O‰O˜CŸH™HÕ%à×Ñ Õ$ð	%ð �\Ð!Ð!rt   c                  óª   ‡ — e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded	<   	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd
„Z	e
	 	 	 	 	 	 	 	 dd„«       Zdd„Zˆ xZS )Ú	WhileLoopNrM	  Úcarried_inputsÚadditional_inputsr/	  Úcond_subgraphÚbody_subgraphr2	  rn  c                ó  •— || _         || _        || _        || _        t	        ||z   «      \  }}t
        ‰| �  d |||¬«       t        j                  j                  | «      | _
        t        j                  j                  | «       y rQ	  )ri	  rj	  rk	  rl	  rR	  rB  r©  rV   rÑ   rY  r–   rZ  )	r0  ri	  rj	  rk	  rl	  r  rS	  rD  rD  s	           €ru   r©  zWhileLoop.__init__-  s‚   ø€ ð -ˆÔØ!2ˆÔØ*ˆÔØ*ˆÔä 2°>ÐDUÑ3UÓ VÑˆ�+Ü‰ÑØØØØ"ð	 	ô 	
ô —G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(rt   c                ó&	  — |D �cg c]  }| j                  |«      ‘Œ }}|D �cg c]  }| j                  |«      ‘Œ }}||z   }t        j                  j                  j                  d   t        j                  j                  j                  d   z   }|D �cg c]  }|j
                  d   ‘Œ }}||fD ]‹  }	|	j                  �Œt        j                  j                  |	j                  ||	j                  ¬«      |	_        t        j                  |	j                  «      5   |	j                  j                  |Ž  d d d «       Œ� |j                  j                  }
|j                  j                  }t        |«      rt        d|› �«      ‚t        |
«      dk(  sJ |
«       ‚|
d   }t        |t         «      sK|j#                  «       t$        j&                  k(  sJ |«       ‚t        |j)                  «       «      dk(  sJ |«       ‚t        |«      dkD  sJ d«       ‚|d   j+                  «       }t        |«      t        |«      k(  s	J ||f«       ‚t-        t/        ||«      «      D ]ò  \  }\  }}	 	 	 	 	 	 dd	„} ||j)                  «       |j)                  «       «        ||j1                  «       |j1                  «       «       |j+                  «       |j+                  «       k(  sJ ||||f«       ‚|j#                  «       |j#                  «       k(  s
J |||f«       ‚|j3                  «       j4                  |j3                  «       j4                  k(  rŒêJ |||f«       ‚ t7        ||||t9        |¬
«      ¬«      }t-        |«      D ��cg c]w  \  }}t;        t=        |j+                  «       |j#                  «       |j)                  «       |j1                  «       |j3                  «       j4                  ¬«      |t>        |fg«      ‘Œy }}}t/        ||«      D ]g  \  }}|jA                  «       t        j                  jB                  v sŒ1t        j                  jD                  jG                  |jA                  «       «       Œi ||_$        |S c c}w c c}w c c}w # 1 sw Y   �ŒÙxY wc c}}w )Néþÿÿÿrþ   rN  r7	  zŽOutput aliasing is currently not supported in compiled torch.while_loop. The outputs of the body_fn subgraph of torch.while_loop are aliased: r1   r   z9torch.while_loop is assumed to have at least one operand.c                ó€   — t        | |«      D ]/  \  }}t        j                  j                  j	                  ||«       Œ1 y r’   )r§   rV   rÑ   rÒ   r®  )Ú	lhs_exprsÚ	rhs_exprsÚlhsÚrhss       ru   Ú_guard_list_equalsz,WhileLoop.create.<locals>._guard_list_equalsy  s8   € ô !$ I¨yÓ 9ò <‘H�C˜Ü—G‘G×$Ñ$×1Ñ1°#°sÕ;ñ<rt   rJ  )ri	  rj	  rk	  rl	  r  ra  )rq	  úlist[Union[int, sympy.expr]]rr	  rv	  rŒ   r�   )%rÆ  rV   rÑ   rr  r”   rH  r?	  r(	  r–   r@	  rA	  rB	  r,	  r‘  rž   rx   r†   rÙ   rÜ   rl   rÔ   rÚ   r»   r§   rú   rÖ   r  rh	  r¸  rÅ  r  ry   r•  r	  r  r¦  rn  )rS  Úcond_fnÚbody_fnri	  rj	  rÈ   Ú
all_inputsÚfx_all_inputsÚfake_all_inputsr0	  Úcond_outputsÚbody_outputsr.  rÐ   r¡   ÚopÚboru	  Ú
while_looprŸ  rn  rc  rÃ   s                          ru   rR  zWhileLoop.createE  s@  € ð 9GÖG°1˜#×+Ñ+¨AÕ.ÐGˆÐGØ;LÖM°a˜S×.Ñ.¨qÕ1ÐMÐÐMØ#Ð&7Ñ7ˆ
äŸ™×,Ñ,×1Ñ1°"Ñ5¼¿¹×8LÑ8L×8QÑ8QÐRTÑ8UÑUˆØ2?Ö@¨Q˜1Ÿ6™6 %›=Ð@ˆÐ@à  'Ð*ò 		9ˆHØ�~‰~Ñ%ä!"§¡×!6Ñ!6Ø×,Ñ,Ø#0Ø"*§-¡-ð "7ó "�”ô
 ×(Ñ(¨¯©Ó8ñ 9Ø&�H—N‘N×&Ñ&¨Ñ8÷9ð 9ð		9ð —}‘}×2Ñ2ˆØ—}‘}×2Ñ2ˆä Ô-Ü ðXØXdÐWeðgóð ô �<Ó  AÒ%Ð3 |Ó3Ð%Ø˜‰OˆÜ˜!Ô2Ô3Ø—;‘;“=¤E§J¡JÒ.Ð1°Ó1Ð.Ü�q—z‘z“|Ó$¨Ò)Ð,¨1Ó,Ð)ä�:‹ Ò"ð 	
ØGó	
Ð"ð ˜A‘×)Ñ)Ó+ˆô �>Ó"¤c¨,Ó&7Ò7ÐW¸.È,Ð9WÓWÐ7Ü$¤S¨¸Ó%FÓGò 	Q‰KˆA‰x��Bð<Ø7ð<à7ð<ð ó<ñ ˜rŸ{™{›}¨b¯k©k«mÔ<Ù˜rŸ}™}›°·±³Ô@ð —=‘=“? b§m¡m£oÒ5ÐJ¸¸2¸rÀ6Ð7JÓJÐ5Ø—<‘<“> R§\¡\£^Ò3Ð@°a¸¸R°[Ó@Ð3Ø—=‘=“?×)Ñ)¨R¯]©]«_×-CÑ-CÓCÐPÀaÈÈRÀ[ÓPÐCð	Qô" Ø)Ø/Ø!Ø!ä$¨FÔ3ô
ˆ
ô* ' |Ó4÷
ñ ��6ô ÜØ!×,Ñ,Ó.Ø ×*Ñ*Ó,ØŸ™Ó*Ø!×,Ñ,Ó.Ø!×,Ñ,Ó.×5Ñ5ôð Ü˜��õ
ð
ˆñ 
ô ˜N¨GÓ4ò 	@‰HˆC�Ø�|‰|‹~¤§¡×!5Ñ!5Ò5ô —‘×+Ñ+×/Ñ/°·±³Õ?ð	@ð %ˆ
ÔØˆùò{ HùÚMùò A÷9ñ 9üój
s#   …Q1£Q6ÂQ;ÄR Í3A<RÒ R
	c                ó&   — |j                  | «       y r’   )Úcodegen_while_loopr  s     ru   r  zWhileLoop.codegen¬  s   € Ø×"Ñ" 4Õ(rt   )ri	  rd	  rj	  rd	  rk	  r'	  rl	  r'	  r  r¸  rŒ   r�   )rw	  r'	  rx	  r'	  ri	  rd	  rj	  rd	  rÓ  )ro   rp   rq   ri	  rr   rj	  rk	  rl	  rn  r©  rx  rR  r  rz  r{  s   @ru   rh	  rh	  %  sÃ   ø… àNR€NÐKÓRØQUÐÐNÓUØ(,€MÐ%Ó,Ø(,€MÐ%Ó,Ø+/€GÐ(Ó/ð)àEð)ð Ið)ð  ð	)ð
  ð)ð "ð)ð 
õ)ð0 ðdàðdð ðdð Fð	dð
 Iòdó ðd÷L)rt   rh	  c                  ó@   ‡ — e Zd Z	 dddœ	 dˆ fd„Zdˆ fd„Zd	d„Zˆ xZS )
r…   Nrc  c          	     ój  •— t         ‰| �  |||||d |¬«       ddlm} |D �	cg c]   }	t	        |	t
        «      r|	j                  n|	‘Œ" }
}	 ||g |¢|
¢­|«      }|€J ‚|| _        t        j                  j                  j                  |d «      | _        | t        j                  j                  |<   y c c}	w )N)r•   rø  r   )Úget_effect_key)rB  r©  Útorch._higher_order_ops.effectsr…	  rx   rÈ  rä   Úeffect_typerV   rÑ   Úeffectful_opsrN  Úprev_effect_buffer)r0  r  rä  rD  ry  r3  r•   rø  r…	  r¹  Úuncovered_argsr‡	  rD  s               €ru   r©  zEffectfulKernel.__init__±  sÊ   ø€ ô 	‰ÑØØØØØØØ/ð 	ô 	
õ 	Cð GRö
ØAB”z !¤_Ô5ˆA�GŠG¸1Ñ<ð
ˆð 
ñ % VÐ-O¨~Ð-OÀÑ-OÐQWÓXˆØÐ&Ð&Ð&Ø&ˆÔÜ"#§'¡'×"7Ñ"7×";Ñ";¸KÈÓ"NˆÔØ-1Œ�‰×Ñ˜kÒ*ùò
s   ¢%B0c                óÈ   •— t         ‰| �  «       }| j                  �F|j                  j	                  t        j                  | j                  j                  «       «      «       |S r’   )rB  r·  r‰	  rº  r¦  r3   r  r•  )r0  r  rD  s     €ru   r·  zEffectfulKernel.get_read_writesÑ  sU   ø€ Ü‘gÑ-Ó/ˆà×"Ñ"Ð.Ø×Ñ×!Ñ!Ü×$Ñ$ T×%<Ñ%<×%EÑ%EÓ%GÓHôð Ðrt   c                 ó   — yrL  rs   r6  s    ru   r  z EffectfulKernel.has_side_effectsÛ  rK  rt   r’   rÓ  rü  rÞ  )ro   rp   rq   r©  r·  r  rz  r{  s   @ru   r…   r…   °  s,   ø„ ð ð2ð ñ2ð 
õ2õ@÷rt   r…   c                  ó   — e Zd Zy)rX  Nr  rs   rt   ru   rX  rX  ß  s   „ Ørt   rX  c                  óV   — e Zd ZU ddlmZ ded<   ded<   d„ Zddd	„Zdd
„Zdd„Z	dd„Z
y)rÈ  r   )ÚFakeScriptObjectr™   r–   ú+Union[FakeScriptObject, torch.ScriptObject]rä   c                ó   — | j                   S r’   r:  r6  s    ru   r•  zTorchBindObject.get_nameê  ræ  rt   Nc                ó   — | j                   S r’   r:  r�  s     ru   rƒ  z!TorchBindObject.codegen_referenceí  ræ  rt   c                ó   — | j                   S r’   rã   r6  s    ru   Ú	get_valuezTorchBindObject.get_valueð  r]  rt   c                óŽ   — t        | j                  t        j                  «      r| j                  S | j                  j                  S r’   )rx   rä   rÜ   ÚScriptObjectÚreal_objr6  s    ru   r:  zTorchBindObject.get_real_objó  s0   € Ü�d—j‘j¤%×"4Ñ"4Ô5Ø—:‘:Ðà—:‘:×&Ñ&Ð&rt   c                óN  — | j                  «       }t        |j                  «       «      }t        j                  |«      d   }|D �cg c]=  }t        |t        j                  «      r!|j                  «       |j                  «       z  ‘Œ? }}t        j                  d„ |d«      S c c}w )Nr   c                ó   — | |z   S r’   rs   )rÈ   Úys     ru   rþ  z/TorchBindObject.get_buf_bytes.<locals>.<lambda>  s
   € ¨Q°©U€ rt   )r:  r{   Ú__obj_flatten__r*  r5  rx   rÜ   r?  r¼  Únumelr  r<  )r0  Úreal_script_objÚ	flat_dictÚ
flat_elemsrÈ   Ú
flat_sizess         ru   Úget_buf_byteszTorchBindObject.get_buf_bytesù  s”   € à×+Ñ+Ó-ˆÜ˜×8Ñ8Ó:Ó;ˆ	Ü×(Ñ(¨Ó3°AÑ6ˆ
ð  ö
àÜ˜!œUŸ\™\Ô*ð �N‰NÓ˜qŸw™w›yÓ(ð
ˆ
ð 
ô
 ×ÑÑ 2°JÀÓBÐBùò
s   ÁAB"r’   rå  )rŒ   r�	  )rŒ   ztorch.ScriptObjectrþ  )ro   rp   rq   Ú"torch._library.fake_class_registryr�	  rr   r•  rƒ  r”	  r:  r¡	  rs   rt   ru   rÈ  rÈ  ã  s*   … åCà
ƒIØ6Ó6òôóó'ô
Crt   rÈ  c                  ó2   — e Zd ZU ded<   ded<   d„ Zdd	d„Zy)
r6  r™   r–   ré  rÐ   c                ó   — | j                   S r’   r:  r6  s    ru   r•  zGeneratorState.get_name  ræ  rt   Nc                ó   — | j                   S r’   r:  r�  s     ru   rƒ  z GeneratorState.codegen_reference  ræ  rt   r’   rå  )ro   rp   rq   rr   r•  rƒ  rs   rt   ru   r6  r6    s   … à
ƒIØÓòõrt   r6  c                  óV   — e Zd Zdd„Zdd„Zdd	d„Ze	 	 	 	 d
d„«       Ze	 	 dd„«       Zy)Ú_CollectiveKernelc                 ó   — yr‰  rs   r6  s    ru   rß  z!_CollectiveKernel.should_allocate  r‹  rt   c                 ó   — yrL  rs   r6  s    ru   r  z"_CollectiveKernel.has_side_effects  rK  rt   Nc                óH  — t        | j                  «      t        j                  j                  u sJ d«       ‚| j                  }|j
                  j                  | _        |j
                  j                  D �cg c]  }|j                  sŒ|j                  ‘Œ c}| _
        y c c}w )Nz,Setting cpp kernel needs a valid op_overload)r‡   rõ  rÜ   r  r  r  r–   ró  r  r  rô  )r0  ró  rä  rÈ   s       ru   rü  z%_CollectiveKernel.set_cpp_kernel_name  s�   € Ü�D×$Ñ$Ó%¬¯©×)>Ñ)>Ñ>ð 	
Ø:ó	
Ð>ð ×!Ñ!ˆØ%Ÿ~™~×2Ñ2ˆÔð #ŸN™N×4Ñ4ö.
Ø¸¿»ˆA�F‹Fò.
ˆÕ*ùò .
s   Á6BÂBc           
     ó*  — t         j                  j                  5   | j                  ||g|¢­i |¤Ž\  }}}}}	d d d «       	rJ |› d|	› �«       ‚D ]  }
|
j	                  «        Œ |d   j                  «       } | t        |¬«      ||«      }t        j                  |«      }|j                  j                  |D �cg c]  }t        t        |¬«      ||«      ‘Œ c}«       |j                  j                  |D �cg c]  }|j                  «       ‘Œ c}«       d|v r`|j                  j                  t        t        |¬«      |d   |«      «       |j                  j                  |d   j                  «       «       y y # 1 sw Y   �ŒGxY wc c}w c c}w )NrŒ  r   rJ  rÃ   )rV   rÑ   r>  rM  r  rÚ   rœ  r*  Útree_leavesrù  r2  rs  rh  r•  r  )rS  rä  rW  r”   r•   Ú_example_outputrD  rE  r3  rø  Ú
tensor_argrÐ   rÇ  Úinpsr  rc  s                   ru   Úcreate_inplacez _CollectiveKernel.create_inplace,  s’  € ô �W‰W×Ññ 	Dð #�×"Ñ" 6¨6ÐC°DÒC¸FÑCñØØØØØ!÷	Dñ %ÐE¨¨°Ð2CÐ1DÐ&EÓEÐ$Ø%ò 	!ˆJØ×ÑÕ ð	!ð ˜Q‘×*Ñ*Ó,ˆÙÜ˜fÔ%ØØØØó
ˆô ×!Ñ! &Ó)ˆØ×Ñ×&Ñ&ØOSÖTÈŒ^œJ¨fÔ5°s¸FÕCÒTô	
ð
 	×Ñ×!Ñ!¸TÖ"B°c 3§<¡<¥>Ò"BÔCØ�F‰?Ø×#Ñ#×*Ñ*Üœz°Ô8¸&À¹-ÈÓPôð ×Ñ×%Ñ% f¨U¡m×&<Ñ&<Ó&>Õ?ð ÷9	Dñ 	Düò. Uùò #Cs   ›E>Â=FÃ;FÅ>Fc           
     óJ  — t         j                  j                  5   | j                  ||g|¢­i |¤Ž\  }}}}}	d d d «       	rJ |› d|	› �«       ‚D ]  }
|
j	                  «        Œ t        t        «      rx| j                  ||«      } | t        |¬«      ||«      }t        |«      D ��cg c](  \  }}t        | j                  |«      |t        |fg«      ‘Œ* c}}|_        |j                  S  | | j                  |«      ||«      }|g|_        |S # 1 sw Y   ŒÛxY wc c}}w )Nr—  rJ  )rV   rÑ   r>  rM  r  rx   ry   rŽ  r¸  r»   rÅ  rÀ  rn  )rS  rä  rW  r”   r•   rJ  rD  rE  r3  rø  r®	  rÐ   rÇ  r¡   r  s                  ru   Úcreate_out_of_placez%_CollectiveKernel.create_out_of_placei  sY  € ô �W‰W×Ññ 	Dð #�×"Ñ" 6¨6ÐC°DÒC¸FÑCñØØØØØ!÷	Dñ %ÐF¨¨°Ð3DÐ2EÐ&FÓFÐ$Ø%ò 	!ˆJØ×ÑÕ ð	!ô �n¤dÔ+Ø—_‘_ [°.ÓAˆFÙÜ!¨Ô0ØØØØóˆFô "+¨>Ó!:÷ñ �A�vô Ø×(Ñ(¨Ó0ØÜ˜A�Y�KõóˆFŒNð —>‘>Ð!áØ×$Ñ$ ^Ó4ØØØØóˆFð %˜XˆFŒNØˆM÷O	Dð 	Düó*s   ›DÂ,-DÄDrÞ  r’   r–  )rW  ú!Union[TensorBox, list[TensorBox]]rŒ   r�   )rW  r³	  )	ro   rp   rq   rß  r  rü  rx  r°	  r²	  rs   rt   ru   r§	  r§	    sV   „ óóô
	
ð" ð$@Ø>ð$@à	ò$@ó ð$@ðx ð*Ø>ò*ó ñ*rt   r§	  c                  ó8   ‡ — e Zd Zd„ Zedd„«       Zdˆ fd„Zˆ xZS )Ú_WaitKernelc                ó
  — | j                   d   }t        |t        «      r|j                   d   gS t        |t        «      rC|j                   d   }t        |t        «      r"|j                  d   \  }}|j                   |   gS g S g S rx  )rW  rx   r§	  rÅ  r  )r0  rc  ÚcollrÂ   r¼   s        ru   Úget_volatile_readsz_WaitKernel.get_volatile_reads˜  s}   € Ø�k‰k˜!‰nˆÜ�cÔ,Ô-à—J‘J˜q‘M�?Ð"Ü˜œ[Ô)ð —:‘:˜a‘=ˆDä˜$Ô 1Ô2ØŸ™ Q™‘��3ØŸ™ CÑ(Ð)Ð)àˆIð ˆIrt   c                ór  — t         j                  j                  5  | j                  ||«      \  }}}}}d d d «       rJ |› d|› �«       ‚ | t	        |j                  «       ¬«      |«      }|j                  j                  t        t	        |j                  «       ¬«      ||«      «       y # 1 sw Y   ŒzxY w)NrŒ  rJ  )	rV   rÑ   r>  rM  rœ  rÚ   rù  r  rs  )	rS  rä  rc  r­	  rD  rE  r3  rø  rÇ  s	            ru   Úcreate_waitz_WaitKernel.create_wait­  sº   € ä�W‰W×Ññ 	0ð ×"Ñ" 6¨3Ó/ñØØØØØ!÷	0ñ %ÐE¨¨°Ð2CÐ1DÐ&EÓEÐ$ÙÜ˜cŸn™nÓ.Ô/ØØØØó
ˆð 	×Ñ×&Ñ&Üœ:¨S¯^©^Ó-=Ô>ÀÀVÓLõ	
÷!	0ð 	0ús   ›B-Â-B6c                óÊ   •— t         ‰| �  «       }| j                  «       }|D ]>  }|j                  j	                  t        j                  |j                  «       «      «       Œ@ |S r’   )rB  r·  r¸	  rº  r¦  r3   r  r•  )r0  r  Úvolatile_readsÚvrrD  s       €ru   r·  z_WaitKernel.get_read_writesÃ  sZ   ø€ Ü‘gÑ-Ó/ˆà×0Ñ0Ó2ˆØ ò 	GˆBØ×Ñ×!Ñ!¤,×"6Ñ"6°r·{±{³}Ó"EÕFð	GàÐrt   )rc  rb   rŒ   r�   rü  )ro   rp   rq   r¸	  rx  rº	  r·  rz  r{  s   @ru   rµ	  rµ	  —  s&   ø„ òð* ò
ó ð
÷*ñ rt   rµ	  c                ó2  — t        | t        t        f«      rt        | «      S t        | t        t
        f«      r2t        t        j                     «       }| D ]  }|t        |«      z  }Œ |S t        | t        j                  «      rt        | «      S t        «       S r’   )rx   r*   r   r&   rz   ry   r,   r€   r   r‘  rÜ   r?  )rà   rU  rá   s      ru   r‘  r‘  Ï  s€   € Ü�!”h¤Ð%Ô&ä$ QÓ'Ð'Ü	�Aœœt�}Ô	%Ü”u—|‘|Ñ$Ó&ˆØò 	0ˆAØÔ,¨QÓ/Ñ/‰Að	0àˆÜ	�A”u—|‘|Ô	$ä$ QÓ'Ð'ä‹|Ðrt   )rŽ   r‹   rŒ   r�   )r–   r™   rŒ   r–  )r¨   úSequence[int]rŒ   z&Callable[[Sequence[_T]], Sequence[_T]])r¯   z&Callable[[Sequence[_U]], Sequence[_V]]r°   z&Callable[[Sequence[_T]], Sequence[_U]]rŒ   z&Callable[[Sequence[_T]], Sequence[_V]]r’   )r¶   z(Sequence[Union[int, torch.SymInt, Expr]]r·   zOptional[ShapeEnv]rŒ   r¿	  )r¨   úSequence[Union[int, Integer]]rŒ   r¿	  rØ  )rÈ   zLiteral[None]rÉ   rl   rŒ   r�   )rÈ   rc   rÉ   rl   rŒ   rÌ  )rÈ   r—  rÉ   rl   rŒ   zOptional[torch.Tensor])rä   zOptional[Sequence[_T]]rŒ   z Optional[Sequence[Optional[_T]]])rÈ   z2Union[IRNode, OutputSpec, torch.device, None, str]rŒ   rä  )rÈ   z&Union[IRNode, torch.device, None, str]rŒ   rl   )rÈ   zUnion[Buffer, TensorBox]rü   r„   rŒ   rl   )r  rï  r	  rï  r
  rï  rŒ   rl   )r  úUnion[TensorBox, BaseView]r  z"Sequence[Union[int, torch.SymInt]]rŒ   rÁ	  )r¼   zUnion[Expr, Sequence[Expr]]rÏ   rÛ  rŒ   rU   )rÅ  r™   rÏ   rÛ  rÄ  rl   rŒ   r›  )rÈ   rc   rŒ   rl   )TFNFN)rÈ   rc   r$  rl   r.  rl   r/  ú'Optional[Sequence[Union[int, Integer]]]r©  rl   r´  rÂ	  rŒ   ztuple[StorageBox, Layout])rÈ   rc   r/  rÀ	  rŒ   rl   )rÎ   rï  r
  rï  rŒ   rl   )rÏ   rÛ  rŒ   r„   )r+	  ri  rŒ   rl   )r”   z	list[Any]rŒ   z-tuple[list[ShapeAsConstantBuffer], list[Any]])rà   r˜   rŒ   r  (  Ú
__future__r   r	  r  r  r=  ÚloggingÚtextwrapr(  rK  Úcollections.abcr   r   r   r   r   Úenumr	   r
   r   r   r   r   r   r   r   r   r   Útyping_extensionsr   r   r   Úunittest.mockr   r€   r   r   r   Útorch._export.serde.schemaÚ_exportÚserderz  r™  Útorch._library.utilsru  rŽ  rn  Útorch._loggingrÜ   Útorch.fxÚtorch.utils._pytreeÚ_pytreer*  Útorch._dynamo.utilsr   Útorch._export.serde.serializer   Ú*torch._higher_order_ops.auto_functionalizer   Útorch._inductorr   Útorch._prims_commonr   r    r!   r"   r#   Útorch._subclasses.fake_tensorr$   Ú%torch.fx.experimental.symbolic_shapesr%   r&   r'   r(   r)   r*   Útorch.utils._ordered_setr,   Útorch.utils._sympy.functionsr-   r.   r/   Útorch.utils._sympy.symbolr0   rM  r2   r3   Úcodegen.commonr4   r5   r6   r7   r8   r9   r:   r;   Ú	loop_bodyr<   Úops_handlerr=   r>   r?   r@   Úruntime.benchmarkingrA   Úruntime.hintsrB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   ÚvirtualizedrT   rU   rV   Útorch.fx.noderW   Úcodegen.cuda.cuda_templaterX   rÑ   rY   rZ   r˜   rr   rð   Ú__version__rþ  rý  ÚImportErrorr[   r\   r]   r„   r^   r€  r_   Ú	getLoggerro   r  rU  r  r{   r™   rd   rŠ  rg   r�   rš   r©   r¬   r±   ru  rw  r¹   rÀ   rÅ   rÊ   rå   rê   rõ   r÷   r  r  r!  rc   r  r.  r�  rƒ  rœ  r­  rÖ  rØ  ÚINNER_FN_TYr¡  r¬  r´  rÎ  rÿ  r  rÕ   r+  r  r6  r8  r}   r~  rˆ  r“  r{  r  rá  rí  r	  r  r  r   r$  ré   rm  r  r×   rˆ  r’  r–  rœ  r¦  r2  rá  rç  rê  r—  rò  r†   r  rS  rk  rl   ry   ÚPrimitiveInfoTyper{  r�  r“  r¯  rµ  rU  rÏ  rÓ  r©  r˜  rŸ  rë  rs  r·  rÃ  rð  r  r  r  r  r#  r3  r@  r~   r   r`  rb  rÎ  r¸  rÅ  r°  rb   r1  r'	  r,	  r.	  rK	  rR	  rh	  r…   rX  rÈ  r6  r§	  rµ	  r‘  rs   rt   ru   ú<module>ré	     sL  ðÞ "ã Û Û Û Û Û Û Û ß 9Ñ 9ß :Ý Ý ÷
÷ 
õ 
÷ =Ñ <Ý ã ß 'Ñ 'ç 2Ó 2ß ,Ð ,Û Û ß $Ð $Ý (Ý ?Ý MÝ #÷õ õ :÷÷ õ 0ß LÑ LÝ *ç "÷ñ ÷
õ õ  ß NÓ NÝ -ß :÷÷ ÷ ÷ ó ÷$ *Ñ )ñ Ý"å8Ý$Þ%ð %€L�)Ó$ðÛà×'Ò'€NØ€Jñ ˆTƒ]€ÙˆTƒ]€ÙˆTƒ]€à˜C ˜IÑ&€ˆ)Ó &Ø˜C ¨Ð,Ñ-€ˆ)Ó -à€g×Ò˜Ó!€Ø	ˆ×	Ñ	˜8Ÿ?š?°4Ô	8€Ø‡y�y‡~‚~€ð'ðT  ØØØˆˆkÐ	ÑØØØØ��s˜D  kÐ!1Ñ2°KÀÈ8ÐSÑTÑUñðñ	€ˆió 	ð €×Ò˜dÔ#÷ð ó $ðô$ôDôôðØ4ðà4ðð ,ôò !Ð Ú$Ð ð TXñØ	1ðØ>Pðàôô	ð TXñ
Ø	1ð
Ø>Pð
àô
ð 
Ý Nó 
Ø Nð 
Ý Oó 
Ø Oð .2ñØðØ&*ðàôð8Ø!ðà%ôð	>Ø9ð	>àô	>ô;ô('ô0ð Ø ðà ðð ðð 
ô	ð.#GØ&ð#Gà/ð#Gð  ô#G÷Lp,ñ p,ñf �UÔ÷Að Aó ðAðH ô~
ˆFó ~
ó ð~
ôB&ð ô
�ó 
ó ð
ð@ ô
ˆió 
ó ð
ñF �|Ó$Ù�yÓ!Ù�yÓ!Ù˜ÓÙ�uÓÙ˜=Ó)ñ<Ð Ð8ó ð JNñ<NØð<NØ +ð<NØBFð<Nàô<Nð~ ôo

�ó o

ó ðo

ðd ˜ ™¨°©Ð7¸ÐAÑB€ô7S˜9ô 7Sôt#Ð1ô #ôL[
Ð+ô [
ð| ô@
ˆ5ó @
ó ð@
ðH ô	�ó 	ó ð	ð ôQˆ5ó Qó ðQôhô	ð Ø!Ø<@ØØ=Añ9Øð9àð9ð ð9ð :ð	9ð
 ð9ð ;ð9ð ô9ðxØðØ:ðà	ôð ô\
ˆvó \
ó ð\
ð~ ôK�ó Kó ðKð\ ô(�(ó (ó ð(ðV ô79�(ó 79ó ð79ðt ô�(ó ó ðð: ôUˆ;ó Uó ðUðp ôP�hó Pó ðPðf ô%�ó %ó ð%ôPOA�ô OAðd ô�6ó ó ðð" ôKˆ|ó Kó ðKð$ ôS�|ó Só ðSðØðØ'9ðà	ôô<÷7ñ 7ð ôHTˆZó HTó ðHTôV�&ô ô$I7�Vô I7ôXP�fô Pô2�Tô ô$%�{ô $%ðN ô�ó ó ðô.Q* ô Q*ñh �UÔôxˆVó xó ðxñv �UÔô&�f˜ió &ó ð&ô �&ô ô
�Kô ô
�[ô 
ð& ô˜6ó ó ðð" ô
˜Fó 
ó ð
ñ �UÔôE4�_ó E4ó ðE4ôP
B
�_ô B
ôJ1˜>ô 1ðh ˜#˜u d¨C°°e¸CÀÀeÈTÐ<QÑ6RÑ1SÐSÑTÐ ÷-$ñ -$ô`"˜|ô "ô
D=Ð.ô D=ôNM˜ô Mô$(˜ô (ñ& �UÔô>�?ó >ó ð>ôB�ô ôh�9ô hñV �UÔôH�<ó Hó ðHñV �UÔô2�ló 2ó ð2ôj
�/ô 
ô(*"˜ô *"ôZ�Vô ô.G.�Lô G.ôTl˜lô lô^&)˜|ô &)ôT-˜,ô -ô` <ô ô6BÐ5ô Bô"FÐ-ô Fô,H)�lô H)ôV,)�|ô ,)ô^!T�ô !TôH-�Lõ -ô46;�<õ 6;ñr �UÔ÷ð ó ñô
`*Ð&õ `*ñF �UÔô
‘.ó 
ó ñ
ð< ô˜
ó ó ñô8
�,õ 8
ðz ×ÒôN�ó Nó ñNôb+‘
õ +ôT%‘õ T%ñn �UÔô*ˆvó *ó ñ*õLñ �UÔôY.�\ó Y.ó ñY.ñx �UÔôH �,ó H ó ñH ðV"Ø
ð"à2õ"ñ �UÔôG)�ó G)ó ñG)ôT,‘nõ ,ô^	�6õ 	ð ôC‘ló Có ñCðD ö‘\ó ó ñöB™õ BöJ2Ñ#õ 2÷pøðyr ò Ø€NØƒJðús   Æb6 â6	cãc