Ë
    ÄÓ^jO ã                  óN  — 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
Z
d dlmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ 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!m"Z"m#Z# d d	l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d d
l+m,Z, d dl-Z-d dl-m.Z.m/Z/m0Z0 d dl1m2c m3c m4Z5 d dl6m7c m8Z8 d dl9m7c m:Z; d dl<Z=d dl>Z=d dl?m:c m@ZA d dlBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZK d dlLmMZM d dlNmOZO d dlPmQZQmRZR d dlSmTZTmUZUmVZVmWZWmXZXmYZY d dlZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZe d dlfmgZg d dlhmiZi d dljmkZk d dllmmZmmnZnmoZompZpmqZqmrZr d dlsmtZt ddlumvZvmwZw ddlxmyZymzZzm{Z{m|Z|m}Z} ddlwm~Z~mZm€Z€m�Z�m‚Z‚mƒZƒ ddl„m…Z… dd l†m‡Z‡mˆZˆm‰Z‰mŠZŠ dd!l‹mŒZŒ dd"l�mŽZŽm�Z� dd#l:m�Z�m‘Z‘m’Z’m“Z“m”Z”m•Z•m–Z–m—Z—m˜Z˜m™Z™mšZšm›Z›mœZœ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© e r+d d%lZmªZª d d&lfm«Z« d d'l¬m­Z­ 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·�jp                  Z¹d.Zº e(d0«      Z¼ e"d1«      Z½ e"d2«      Z¾ e"d3«      Z¿eÀe.z  ZÁd,e¶d4<   eÀeÂz  e.z  ZÃd,e¶d5<   e=�jˆ                  �jŠ                  e=�jˆ                  �jŒ                  z  ZÇd,e¶d6<    e�j�                  eÉ«      ZÊ ej*                  e	�j–                  d7¬8«      ZËe=�jN                  �j˜                  ZÌ	 e#eÀd9eÍeÎd9f   d:d;ee#eÀeÍeÎd9f   d9d:d;f   dz     f   ZÏd,e¶d<<   �dBd=„ZÐ e�j¢                  d.¬>«       G d?„ d@«      «       ZÒ�dCdA„ZÓ�dDdB„ZÔ�dEdC„ZÕ�dEdD„ZÖ	 	 	 	 	 	 �dFdE„Z×g dF¢ZØg dG¢ZÙ	 �dG	 	 	 	 	 �dHdH„ZÚ�dIdI„ZÛ	 �dG	 	 	 	 	 �dHdJ„ZÜe�dJ�dKdK„«       ZÝe	 �dJ	 	 	 	 	 �dLdL„«       ZÝ	 �dJ	 	 	 	 	 �dMdM„ZÝ	 	 	 	 �dNdN„ZÞ	 	 	 	 �dOdO„Zß�dPdP„Zà�dPdQ„Zá�dQdR„Zâ	 	 	 	 	 	 	 	 �dRdS„Zã	 	 	 	 	 	 �dSdT„Zä�dTdU„Zå�dUdV„ZædW„ Zç G dX„ d;«      Zè e�d/¬>«       G dY„ dZ«      «       Zée� G d[„ d\eè«      «       Zê�dVd]„Zëe� G d^„ d_eê«      «       Zìe� G d`„ daeì«      «       Zí eÔdb«       eÔdc«       eÔdd«       eÔde«       eÔdf«       eÔdf«       eÔdg«      dhœZîdie¶dj<   	 �dW	 	 	 	 	 	 	 �dXdk„Zïe� G dl„ dmeê«      «       Zðd e/d «      f	 	 	 	 	 	 	 �dYdn„Zñeee.   ee.   ge¨f   Zòd,e¶do<    G dp„ dqeð«      Zó G dr„ dseó«      Zô G dt„ dueó«      Zõ G dv„ dweó«      Zöe� G dx„ dyeê«      «       Z÷e� G dz„ d{e÷«      «       Zøe� G d|„ d}eê«      «       Zù�dZd~„Zú�dZd„Zû�dZd€„Zü	 	 	 	 	 �d[	 	 	 	 	 	 	 	 	 	 	 	 	 �d\d�„Zý	 	 	 	 	 	 �d]d‚„Zþ�d^dƒ„Zÿe� G d„„ d…eè«      «       �Z e� G d†„ d‡�e «      «       �Ze� G dˆ„ d‰�e «      «       �Ze� G dŠ„ d‹�e «      «       �Ze� G dŒ„ d��e «      «       �Ze� G dŽ„ d��e«      «       �Ze� G d�„ d‘�e «      «       �Ze� G d’„ d“�e «      «       �Z G d”„ d•�e«      �Ze� G d–„ d—eè«      «       �Z	e� G d˜„ d™�e	«      «       �Z
e� G dš„ d›�e	«      «       �Z	 	 	 	 	 	 �d_dœ„�Z�d`d�„�Z G dž„ dŸ«      �Ze� 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e� G d¬„ d­�e«      «       �Z G d®„ d¯�e«      �Z e�d/¬>«       G d°„ d±eèez«      «       �Z e�d/¬>«       G d²„ d³�eeé«      «       �Z G d´„ dµ�e«      �Z G d¶„ d·�e«      �Z G d¸„ d¹�e«      �Ze� G dº„ d»eè«      «       �Ze� G d¼„ d½eè«      «       �Z e�d/¬>«       G d¾„ d¿�e«      «       �Z e�j¢                  d.¬>«       G dÀ„ dÁ«      «       �Z G dÂ„ dÃ�e«      �Z  G dÄ„ dÅ�e «      �Z!eÀeÂz  �e"z  eÎz  �e#eÀeÎz  eÂz  �e"z     z  �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) G dÐ„ dÑ�e «      �Z* G dÒ„ dÓ�e «      �Z+	 	 	 	 �dadÔ„�Z, e�d/¬>«       G dÕ„ dÖ�e«      «       �Z- G d×„ dØ�e-«      �Z. G dÙ„ dÚ�e.«      �Z/e�j`                  �dbdÛ„«       �Z1	 	 	 	 �dcdÜ„�Z2 e�d/¬>«       G dÝ„ dÞ�e-«      «       �Z3 e�d/¬>«       G dß„ dà�e3«      «       �Z4 G dá„ dâ�e4«      �Z5 G dã„ dä�e3«      �Z6 G då„ dæ�e«      �Z7 G dç„ dè�e3«      �Z8 G dé„ dê�e8«      �Z9 G dë„ dì�e8«      �Z: G dí„ dî�e3«      �Z; G dï„ dð�e3«      �Z< G dñ„ dò�e3«      �Z= G dó„ dô�e3«      �Z> G dõ„ dö�e3«      �Z? G d÷„ dø�e?«      �Z@ G dù„ dú�e6«      �ZA G dû„ dü�e3«      �ZB G dý„ dþ�e3«      �ZC G dÿ„ �d �e4«      �ZD G �d„ �d�e3«      �ZE G �d„ �d�e3«      �ZF G �d„ �d�e3«      �ZG G �d„ �d�e3«      �ZH e�d/¬>«       G �d	„ �d
«      «       �ZI G �d„ �d�e6«      �ZJ e�d/¬>«       G �d„ �d�eJ«      «       �ZK G �d„ �d�eJ«      �ZLe� G �d„ �d�e«      «       �ZM G �d„ �d�e3«      �ZN G �d„ �d�eN«      �ZO G �d„ �d�eN«      �ZP�dd�d„�ZQ G �d„ �d�eJ«      �ZRe�j¢                   G �d„ �deè«      «       �ZS G �d„ d9�eS«      �ZT G �d„ �d �eS«      �ZU e�d/¬>«       G �d!„ �d"eè«      «       �ZV�de�d#„�ZW e�d/¬>«       G �d$„ �d%�e3«      «       �ZX e�d/¬>«       G �d&„ �d'�e3«      «       �ZY	 	 	 	 �df�d(„�ZZ e�d/¬>«       G �d)„ �d*�e3«      «       �Z[ G �d+„ �d,�eJ«      �Z\ G �d-„ �d.eè«      �Z]e� G �d/„ �d0�e]«      «       �Z^e� G �d1„ �d2�e]«      «       �Z_e� G �d3„ �d4�e]«      «       �Z`e� G �d5„ �d6�e]«      «       �Za G �d7„ �d8�eJ«      �Zb G �d9„ �d:�eb«      �Zc G �d;„ �d<�eb«      �Zd G �d=„ �d>�eb«      �Ze�dg�d?„�Zf�dg�d@„�Zg�dh�dA„�Zhy# e»$ r dZ¹d/ZºY �	Œ–w xY w(i  é    )ÚannotationsN)ÚCallableÚ	GeneratorÚIterableÚIteratorÚSequence)ÚAbstractContextManagerÚnullcontext)ÚEnum)Úpartial)ÚNumber)ÚAnyÚcastÚClassVarÚLiteralÚoverloadÚSupportsFloatÚSupportsIntÚTYPE_CHECKINGÚ	TypeAliasÚTypeVarÚUnion)Úassert_neverÚNeverÚoverrideÚ	ParamSpecÚSelfÚTypeIs)Úpatch)ÚExprÚIntegerÚSymbol)Úenable_python_dispatcher)Úidentity)ÚGraphModuleSerializer)Úcan_auto_functionalize)Úmetrics©Úget_free_symbols)ÚFakeScriptObject)Úget_opaque_obj_reprÚis_opaque_value)Úcompute_required_storage_lengthÚis_boolean_dtypeÚ(is_contiguous_for_memory_format_or_falseÚis_float_dtypeÚmake_channels_last_strides_forÚ
StrideType)Ú&_remove_effect_token_unbacked_bindingsÚcompute_unbacked_bindingsÚfree_symbolsÚfree_unbacked_symbolsÚGuardOnDataDependentSymNodeÚhas_free_unbacked_symbolsÚIterateExprsÚrebind_unbackedÚresolve_unbacked_bindingsÚShapeEnvÚSymTypes)ÚNode©Ú
OrderedSet)Ú_disable_current_modes)ÚCleanDivÚFloorDivÚMaxÚMinÚModÚModularIndexing)ÚSymTé   )ÚconfigÚdependencies)ÚBackendFeatureÚCodegenSymbolÚget_scheduling_for_deviceÚindex_prevent_reorderingÚKernel)ÚDepÚextract_free_symbolsÚ#extract_input_node_reduction_rangesÚextract_read_writesÚSymbolUsageCollectorOpsHandlerÚvar_builder)ÚLoopBody)ÚOpCounterCSEÚOpCountResultÚReductionTypeÚ	StoreMode)Úbenchmarker)ÚDevicePropertiesÚReductionHint)ÚargsortÚargsort_symÚcache_on_selfÚcache_on_self_and_argsÚceildivÚconvert_shape_to_inductorÚconvert_shape_to_symintÚdeveloper_warningÚdo_bench_using_profilingÚdtype_from_sizeÚget_dtype_sizeÚget_kernel_metadataÚGPU_ALIGN_BYTESÚir_dataclassÚ
is_dynamicÚis_gpuÚ	sympy_dotÚsympy_index_symbolÚsympy_index_symbol_with_prefixÚsympy_productÚ
sympy_subsÚtensor_is_aligned)ÚopsÚOpsValueÚV)ÚSympyBoolean)ÚArgument)ÚIntLikeType)ÚCUTLASSTemplate)ÚPythonWrapperCodegen)ÚGraphLowering)ÚIndentedBufferr   r{   TFÚ_PÚ_TÚ_UÚ_VÚ_IntLikeÚ_NumLikeÚ_OpOverloadsz  ©ÚprefixÚ	TensorBoxr"   ÚIRNodeÚ_NodeOrNodesc                ó.   — t        | t        t        f«      S ©N)Ú
isinstanceÚintr!   ©Úxs    ú]/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/ir.pyÚ
_is_staticr’   ß   s   € Ü�aœ#œw˜Ó(Ð(ó    )Úfrozenc                  óJ   — e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   y)ÚGraphPartitionSignatureúOrderedSet[sympy.Symbol]Úsymbol_inputsz*dict[str, IRNode | Expr | TorchBindObject]Úinput_nodesúlist[IRNode]Úoutput_nodeszdict[str, bool]Úinput_deallocationÚboolÚskip_cudagraphú	list[str]Úconstant_namesN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r“   r‘   r–   r–   ã   s.   … ð ,Ó+ð <Ó;ØÓð (Ó'ØÓð Ôr“   r–   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         t"        f
«      sJ dt%        | «      › d�«       ‚y )NzFound zE, which is not a supported top level IR node. See [Note: Inductor IR])r�   ÚlistÚtupleÚdictÚvaluesÚ
ExpandViewÚDynamicScalarÚAssertScalarrˆ   ÚsympyÚlogicÚboolalgÚBooleanr    rŽ   ÚEffectfulKernelÚShapeAsConstantBufferÚOpaqueMultiOutputÚtype)ÚnodesÚnodeÚ_check_tensorboxs     €r‘   rº   z%validate_ir.<locals>._check_tensorbox÷   s»   ø€ ð ˆ=ØÜ˜¤¤e˜}Ô-Øò '�Ù  Õ&ñ'ä˜œtÔ$ØŸ™›ò '�Ù  Õ&ñ'ô ØäÜ!Ü ÜÜ—K‘K×'Ñ'×/Ñ/ÜÜÜ#Ü)Ü%ðôð ð œ˜e›˜Ð%jÐkóñ r“   )r¸   ú_NodeOrNodes | NoneÚreturnÚNoner¦   )Únode_or_nodesrº   s    @r‘   Úvalidate_irr¿   ö   s   ø€ õñ> �]Õ#r“   c                óT   ‡ — t        ‰ t        «      sJ t        ‰ «      «       ‚dˆ fd„}|S )Nc                 ó0   •—  t        t        ‰«      | i |¤ŽS rŒ   )Úgetattrru   )ÚargsÚkwargsÚnames     €r‘   Úfnzops_wrapper.<locals>.fn  s   ø€ Ø!Œw”s˜DÓ! 4Ð2¨6Ñ2Ð2r“   )rÃ   ÚobjectrÄ   rÇ   r¼   rv   )r�   Ústrr·   )rÅ   rÆ   s   ` r‘   Úops_wrapperrÉ     s(   ø€ Ü�dœCÔ Ð,¤$ t£*Ó,Ð õ3ð €Ir“   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     €r‘   Ú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     @r‘   Úinverse_reorderrØ   "  s*   ø€ Ü”S˜¤¤c¨%£jÓ 1Ó2Ó3€Iõ@ð €Nr“   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     €r‘   rÒ   zsame_reorder.<locals>.reindex-  s>   ø€ Ü�5‹zœS ›ZÒ'Ð'Ð'Ü).¬s°5«zÓ):Ö; A��e˜A‘h“Ò;Ð;ùÒ;rÓ   rÔ   r¦   )r×   rÒ   s   ` r‘   Úsame_reorderrÛ   ,  s   ø€ õ<ð €Nr“   c                ó   ‡ ‡— dˆ ˆfd„}|S )Nc                ó    •—  ‰ ‰| «      «      S rŒ   r¦   )rÏ   Úreindex1Úreindex2s    €€r‘   rÒ   z fuse_reindexing.<locals>.reindex8  s   ø€ Ù™ ›Ó(Ð(r“   )rÏ   rÕ   r¼   zSequence[_V]r¦   )rÞ   rß   rÒ   s   `` r‘   Úfuse_reindexingrà   4  s   ù€ ö)ð €Nr“   )é   r   é   rI   )é   r   rá   râ   rI   c                ó`   — |�t        d„ | D «       «      rt        | «      }|S t        || «      }|S )z1
    Convert strides to fill order (argsort)
    c              3  ó\   K  — | ]$  }t        |t        t        j                  f«      –— Œ& y ­wrŒ   ©r�   rŽ   r°   r!   ©Ú.0Úss     r‘   ú	<genexpr>z!get_fill_order.<locals>.<genexpr>H  s    è ø€ ÒQÈ¤
¨1¬s´E·M±MÐ.B× CÑQùó   ‚*,)Úallr_   r`   )ÚseqÚ	shape_envÚ
sorted_idxs      r‘   Úget_fill_orderrð   B  s<   € ð ÐœCÑQÈSÔQÔQÜ$+¨C£Lˆ
ð Ðô ! ¨CÓ0ˆ
ØÐr“   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         r‘   Ústride_order2fill_orderr÷   P  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          r‘   Úget_stride_orderrü   \  sV   € ô !/¨s°IÓ >€JÜœC ›H“oÖ
&�Š1Ð
&€CÐ
&Ü˜ZÓ(ò ‰ˆˆ4ØˆˆDŠ	ðà€Jùò 's   £	Ac                 ó   — y rŒ   r¦   ©r�   Úreplace_symbols_with_hintss     r‘   Úir_node_to_tensorr   i  s   € ØRUr“   c                 ó   — y rŒ   r¦   rþ   s     r‘   r   r   m  s   € ð r“   c                ó¦  — | €y |r%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)rw   ÚgraphÚsizevarsÚoptimization_hintr$   Úget_sizeÚis_storage_and_layoutÚ
get_layoutr  ÚFlexibleLayoutÚcontiguous_stridesÚ	get_dtypeÚ
get_devicere   rî   Úsuppress_guardsÚtorchÚempty_stridedÚzero_)	r�   rÿ   Úshape_fnré   r  r  r  r  Úts	            r‘   r   r   s  s  € ð 	€yØñ "Ü—7‘7×#Ñ#×5Ñ5‰äˆØ!"§¡£Ö.˜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Œ   )r�   r©   ©Úvalues    r‘   Úmay_convert_to_optionalr  •  s   € ô �%œÔ¡uð ˆvˆØ€Lr“   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(ú: ú))r�   rÈ   r  r  r·   r‰   Ú
OutputSpecÚget_device_typer  r   r¢   r�   s    r‘   r  r  Ÿ  sq   € ô �!”SÔ˜Q˜YØˆÜ	�A”u—|‘|Ô	$Ø�v‰vˆÜ	�Aœ¤
Ð+Ô	,Ü˜qŸ|™|›~Ó.Ð.äÐ# A 3 b¬¨a«×)9Ñ)9Ð(:¸!Ð<Õ=r“   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        |«      «       ‚t        ||«      S )N)ÚcpuÚcudaÚxpuÚ_backendÚtritonTFrI   )ÚTritonScheduling)	r  rÂ   rJ   rN   Úcodegen.tritonr&  r�   r·   Ú
issubclass)r�   r  Údevice_schedulingr&  s       r‘   Ú	is_tritonr*  ¬  sz   € Ü˜QÓ€Fð Ð'Ñ'Ü”6˜f˜X XÐ.Ó/°8Ò;ØØàˆÜ!:¸6Ó!BÐBÐÐKàÝ0äÐ'¬Ô.ÐG´Ð5FÓ0GÓGÐ.ÜÐ'Ð)9Ó:Ð:r“   c                ó   — t        | «      dk(  S )Nr!  )r  r�   s    r‘   Úis_cpur,  À  s   € Ü˜1Ó Ñ&Ð&r“   c                ó@  ‡— t        | t        «      rB| j                  «       �2t        | j	                  «       «      st        | j                  «       «      ryt        j                  ˆfd„| j	                  «       d d D «       Ž }t        j                  t        j                  | j	                  «       d   d«      t        j                  | j                  «       d   d«      «      }t        j                  ||«      }t        j                  j                  j                  |«      S )NFc              3  ó^   •K  — | ]$  }t        j                  t        |‰«      d «      –— Œ& y­w©r   N)r°   ÚEqrF   )rè   ré   Ú	alignments     €r‘   rê   z-is_aligned_realized_tensor.<locals>.<genexpr>Î  s#   øè ø€ Ò	F¨QŒ%�(‰(”3�q˜)Ó$ a×
(Ñ	Fùs   ƒ*-éÿÿÿÿrI   )r�   r‰   Úmaybe_get_strider6   Ú
get_strider
  r°   ÚAndÚOrr0  ÚLerw   r  r  Úguard_or_false)r�   r1  Úaligned_stridesÚaligned_last_dimÚ
is_aligneds    `   r‘   Úis_aligned_realized_tensorr<  Ä  sÐ   ø€ ä�qœ&Ô!Ø×ÑÓÐ'Ü  §¡£Ô0Ü  §¡£Ô.àä—i‘iÛ	F°!·,±,³.ÀÀ"Ð2EÔ	Fð€Oô —x‘xÜ�‰�—‘“ Ñ# QÓ'¬¯©°!·*±*³,¸rÑ2BÀAÓ)FóÐô —‘˜?Ð,<Ó=€Jô �7‰7×Ñ×*Ñ*¨:Ó6Ð6r“   c                ód  — t        |«      t        | «      k(  rt        | «      t        |«      k(  sJ ‚t        || |«      D ]p  \  }}}t        j                  j                  j                  |d«      rŒ2t        j                  j                  j                  t        j                  ||«      «      rŒp y y)zP
    Returns true if the strides are equal, ignoring dimensions of size 1 .
    rI   FT)	rÍ   rÖ   rw   r  r  Ústatically_known_leqr8  r°   r0  )Ústrides1Ústrides2ÚshapeÚdimÚs1Ús2s         r‘   Úsignificant_strides_equalrE  Ù  s�   € ô ˆu‹:œ˜X›Ò&¬3¨x«=¼CÀ»MÒ+IÐIÐIÜ˜5 (¨HÓ5ò ‰ˆˆR�Ü�7‰7×Ñ×0Ñ0°°aÔ8Øä�w‰w×Ñ×.Ñ.¬u¯x©x¸¸BÓ/?Õ@Ùðð r“   c                óZ  — 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"                  |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Œ   ©rw   r  r  Ústatically_known_equals©rè   rC  rD  s      r‘   rê   z2try_match_insignificant_strides.<locals>.<genexpr>ø  s3   è ø€ ò áˆB�ô 	
�‰×Ñ×0Ñ0°°R×8ñùó   ‚79rI   ©ÚdataÚlayout)r  rì   rÖ   r4  rE  r
  Úas_storage_and_layoutr  rò   rw   r  r  r>  ÚFixedLayoutr  r  r  ÚoffsetÚ	is_pinnedrˆ   ÚReinterpretView)ÚtensorÚstridesÚstorageÚ
old_layoutÚ
new_striderÐ   ré   Ú
new_layouts           r‘   Útry_match_insignificant_stridesrZ  ë  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ÐFr“   c                óÔ   — | j                   j                  d¬«      d   }t        |j                  «      D ��cg c]  \  }}|‘Œ	 c}}|j                  d<   ddlm}  || «       y c c}}w )NÚoutput©Úopr   Úuser_visible_output_idxs)Úrecord_original_output_strides)r  Ú
find_nodesrò   rÃ   ÚmetaÚtorch._inductor.compile_fxr`  )ÚgmÚoutput_noderó   rù   r`  s        r‘   Úgm_original_output_stridesrf    sa   € Ø—(‘(×%Ñ%¨Ð%Ó2°1Ñ5€Kä# K×$4Ñ$4Ó5÷4Ù��QŠó4€K×ÑÐ/Ñ0õ Já" 2Õ&ùó4s   ¸A$c                ó²   — t        «       }| D ]>  }|t        |j                  «       d¬«      z  }|t        |j                  «       d¬«      z  }Œ@ t	        |«      S )NF©Úunbacked_only)r@   r)   r
  r4  r©   )ÚinputsÚsym_varsÚinps      r‘   Úget_symbolic_inputsrm    sW   € Ü!+£€HØò LˆØÔ$ S§\¡\£^À5ÔIÑIˆØÔ$ S§^¡^Ó%5ÀUÔKÑK‰ðLô �‹>Ðr“   c                óö   — t        | t        «      r| j                  } t        | t        «      r| j	                  «       } t        | t
        «      r| j                  } t        | t        «      r| j                  «       S d S rŒ   )r�   rˆ   rM  ÚBaseViewÚunwrap_viewÚ
StorageBoxÚBufferÚget_namer�   s    r‘   Útry_get_namert  %  sW   € Ü�!”YÔØ�F‰FˆÜ�!”XÔØ�M‰M‹OˆÜ�!”ZÔ Ø�F‰FˆÜ% a¬Ô0ˆ1�:‰:‹<Ð:°dÐ:r“   c                  óÐ  — e Zd ZU dZ e«       Zded<   d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j                  d¬«      Zded<    ej                  d¬«      Zded<   eej"                  dRd„«       «       Zeej"                  	 	 	 	 dSd„«       «       ZedTd„«       ZdUd„ZdVd„ZdWd„ZdXd„ZdYd„ZdZd„Zd[d„Zd\d„ZdXd„Zd]d^d „Z	 d_	 	 	 	 	 	 	 d`d!„Zdad"„Z dbd#„Z!dcd$„Z"ddd%„Z#ded&„Z$dfd'„Z%dgd(„Z&dhd)„Z'did*„Z(e)djd+„«       Z*dkd,„Z+dgd-„Z,dld.„Z-dmdnd/„Z.dod0„Z/dpd1„Z0dgd2„Z1dqd3„Z2drd4„Z3dhd5„Z4did6„Z5dsd7„Z6dld8„Z7dgd9„Z8dmdtd:„Z9dd;œdud<„Z:dWd=„Z;dUd>„Z<dWd?„Z=	 dv	 	 	 	 	 dwd@„Z>dxdA„Z?dydB„Z@	 dv	 	 	 	 	 dzdC„ZAd{dD„ZBd|dE„ZCd}dF„ZDd~dG„ZE	 dv	 	 	 ddH„ZFdldI„ZGd€dJ„ZHdgdK„ZIdgdL„ZJd�dM„ZKd‚dN„ZLdsdO„ZMd‚dP„ZNeOr
e)dadQ„«       ZPyy)ƒr‰   záBase class for all intermediate representation (IR) nodes in TorchInductor.

    Note:
        This is an abstract base class. Most methods raise NotImplementedError
        and must be overridden by concrete subclasses.
    zClassVar[OrderedSet[Any]]Ú_current_originsNzClassVar[int | None]Ú_current_stream_idxF)ÚinitúOrderedSet[Any]Úoriginsúlist[str] | NoneÚ	tracebackútorch.fx.Node | NoneÚorigin_nodeúdict[str, Any]r   ú
int | NoneÚ
stream_idxc              #  óˆ   K  — t         j                  }|| z  t         _        	 d –— |t         _        y # |t         _        w xY w­wrŒ   )r‰   rv  )rz  Úolds     r‘   Úcurrent_originszIRNode.current_originsD  s7   è ø€ ô ×%Ñ%ˆØ"%¨¡-ŒÔð	*Ûà&)ŒFÕ#ø cŒFÕ#üs   ‚A¢2 ¦A²?¿Ac              #  ó‚   K  — t         j                  }| t         _        	 d –— |t         _        y # |t         _        w xY w­wrŒ   )r‰   rw  )r�  rƒ  s     r‘   Úcurrent_stream_idxzIRNode.current_stream_idxN  s3   è ø€ ô
 ×(Ñ(ˆØ%/ŒÔ"ð	-Ûà),ŒFÕ&ø¨ŒFÕ&üs   ‚?Ÿ/ £?¯<¼?c                óL   — t        | t        t        t        t        t
        f«      S rŒ   )r�   ÚComputedBufferÚInputsKernelÚInputBufferrS  ÚTemplateBuffer)r¹   s    r‘   Úis_realized_nodezIRNode.is_realized_nodeZ  s&   € äØäÜÜÜÜðó	
ð 		
r“   c                ó,   — t         j                  | «      S rŒ   ©rˆ   Úcreate©Úselfs    r‘   Úwrap_for_loweringzIRNode.wrap_for_loweringg  s   € Ü×Ñ Ó%Ð%r“   c                ó2   — t         j                  | ||«       y rŒ   )rÇ   Ú__setattr__)r‘  Úattrr  s      r‘   Ú_post_init_setattrzIRNode._post_init_setattrj  s   € ô 	×Ñ˜4  uÕ-r“   c                ó>  — t        | j                  «      }| j                  d|«       | j                  dt        j                  rt        j                  «       nd «       | j                  dd «       | j                  di «       | j                  d| j                  «       y )Nrz  r|  r~  r   r�  )r@   rv  r–  rJ   Údebug_ir_tracebackr|  Úformat_stackrw  )r‘  rz  s     r‘   Ú__post_init__zIRNode.__post_init__p  s�   € Ü˜T×2Ñ2Ó3ˆØ×Ñ 	¨7Ô3Ø×ÑØ´V×5NÒ5Nœ×/Ñ/Ô1ÐTXô	
ð 	×Ñ ¨tÔ4à×Ñ ¨rÔ2Ø×Ñ ¨d×.FÑ.FÕGr“   c                óB   — t        d„ | j                  «       D «       «      S )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wrŒ   ©rÅ   ©rè   Údeps     r‘   rê   z(IRNode.get_read_names.<locals>.<genexpr>|  ó   è ø€ Ò? s˜#Ÿ(�(Ñ?ùó   ‚©r@   Ú	get_readsr�  s    r‘   Úget_read_nameszIRNode.get_read_names{  ó   € ÜÑ?¨d¯n©nÓ.>Ô?Ó?Ð?r“   c                ó   — | j                   S rŒ   )r|  r�  s    r‘   Úget_tracebackzIRNode.get_traceback~  s   € Ø�~‰~Ðr“   c                ó   — | j                   S rŒ   ©r~  r�  s    r‘   Úget_origin_nodezIRNode.get_origin_node�  ó   € Ø×ÑÐr“   c                 ó   — y rŒ   r¦   r�  s    r‘   Úget_defining_opzIRNode.get_defining_op„  ó   € Ør“   c                ó   — g S )z'Return subgraphs contained in this noder¦   r�  s    r‘   Úget_subgraphszIRNode.get_subgraphs‡  ó   € àˆ	r“   c                ót  — t        «       }| j                  }t        | t        «      r(| j	                  «       }| j
                  rt        |g«      }|D ]ä  }t        |d«      r(|j                  r|j                  |j                  «       Œ7t        j                  j                  j                  j                  di «      j                  |j                  g «      }t        |t        «      sŒ–|D ]J  }t        j                  j                  j                   j                  |d «      }|sŒ:|j                  |«       ŒL Œæ |S )NÚstack_traceÚ	postToPre)r@   rz  r�   ÚExternKernelrª  r~  Úhasattrr³  Úaddr  Ú	_inductorÚdebugÚ _inductor_post_to_pre_grad_nodesÚgetrÅ   r©   Ú#_inductor_pre_grad_node_stack_trace)r‘  Ústack_tracesrz  r~  r¹   Úpre_grad_nodesÚ	node_namer³  s           r‘   Úget_stack_traceszIRNode.get_stack_traces‹  s  € ô )3«ˆØ—,‘,ˆÜ�dœLÔ)Ø×.Ñ.Ó0ˆKØ×ÒÜ$ k ]Ó3�Øò 	6ˆDÜ�t˜]Ô+°×0@Ò0@à× Ñ  ×!1Ñ!1Õ2ô —O‘O×)Ñ)×JÑJ×NÑNØ#Øó÷ ‘c˜$Ÿ)™) RÓ(ð ô " .´$Ô7ØØ!/ò 6�IäŸ™×-Ñ-×QÑQ×UÑUØ% tóð  ò
 #Ø$×(Ñ(¨Õ5ñ6ð	6ð, Ðr“   Tc                ó  — dt        | dd«      › �}|rt        |«      dkD  r|d d › d�}| j                  «       s|gS g }| j                  «       D ]8  }|j                  d«       ||j	                  d«      z  }|j                  d	«       Œ: |g|z   S )
Nzorigins=rz  Ú é@   é=   z...zstack_traces = {ú
ú})rÂ   rÍ   rÀ  ÚappendÚsplit)r‘  Úshortenrz  Ústack_trace_strr³  s        r‘   Úcommon_reprzIRNode.common_repr¬  sª   € ØœW T¨9°bÓ9Ð:Ð;ˆÙ”s˜7“| bÒ(à   "˜˜ cÐ*ˆGØ×$Ñ$Ô&Ø�9ÐàˆØ×0Ñ0Ó2ò 	(ˆKØ×"Ñ"Ð#5Ô6Ø˜{×0Ñ0°Ó6Ñ6ˆOØ×"Ñ" 3Õ'ð	(ð ˆy˜?Ñ*Ð*r“   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  )r©   rË  ÚmaprÈ   ÚindentÚjoinr·   r¢   )r‘  ÚlinesrÉ  Ú	multilineÚ	new_liness        r‘   Ú
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Ð4r“   c                ó   — | j                   S rŒ   ©r  r�  s    r‘   r  zIRNode.get_dtypeÇ  ó   € Ø�z‰zÐr“   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrŒ   )r  ÚNotImplementedErrorr�  s    r‘   Úmaybe_get_dtypezIRNode.maybe_get_dtypeÊ  s&   € ð	Ø—>‘>Ó#Ð#øÜ"ò 	Ùð	úó   ‚ ’	�c                ó2   — t        dt        | «      › d�«      ‚)Nz#get_layout() is not implemented by ú!©rÙ  r·   r�  s    r‘   r  zIRNode.get_layoutÐ  s   € Ü!Ð$GÌÈTË
À|ÐSTÐ"UÓVÐVr“   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrŒ   )r  rÙ  r�  s    r‘   Úmaybe_get_layoutzIRNode.maybe_get_layoutÓ  ó&   € ð	Ø—?‘?Ó$Ð$øÜ"ò 	Ùð	úrÛ  c                ó"   — | j                  «       S rŒ   )r  r�  s    r‘   Úget_output_speczIRNode.get_output_specÙ  s   € Ø�‰Ó Ð r“   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrŒ   )rã  rÙ  r�  s    r‘   Úmaybe_get_output_speczIRNode.maybe_get_output_specÜ  s(   € ð	Ø×'Ñ'Ó)Ð)øÜ"ò 	Ùð	úrÛ  c                ó>   — t        | j                  «       t        «      S )z4True for single tensor output (excludes MultiOutput))r�   rå  ÚLayoutr�  s    r‘   Úhas_tensor_outputzIRNode.has_tensor_outputâ  s   € ä˜$×4Ñ4Ó6¼Ó?Ð?r“   c                ó2   — t        dt        | «      › d�«      ‚)Nz!get_size() is not implemented by rÝ  rÞ  r�  s    r‘   r
  zIRNode.get_sizeæ  s   € Ü!Ð$EÄdÈ4ÃjÀ\ÐQRÐ"SÓTÐTr“   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrŒ   )r
  rÙ  r�  s    r‘   Úmaybe_get_sizezIRNode.maybe_get_sizeé  ó%   € ð	Ø—=‘=“?Ð"øÜ"ò 	Ùð	úrÛ  c                ó"   — | j                  «       S rŒ   ©r
  r�  s    r‘   rA  zIRNode.shapeï  s   € à�}‰}‹Ðr“   c                ó4   — t        | j                  «       «      S rŒ   )rr   r
  r�  s    r‘   Ú	get_numelzIRNode.get_numeló  s   € Ü˜TŸ]™]›_Ó-Ð-r“   c                ó˜   — t         j                  j                  j                  t	        j
                  | j                  «       d«      «      S ©Nr   ©rw   r  r  Ústatically_known_truer°   r0  rð  r�  s    r‘   Úis_zero_elementszIRNode.is_zero_elementsö  ó0   € Ü�w‰w×Ñ×5Ñ5´e·h±h¸t¿~¹~Ó?OÐQRÓ6SÓTÐTr“   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 rÞ  r�  s    r‘   ÚrealizezIRNode.realizeù  s   € ô  " O´D¸³J°<Ð"@ÓAÐAr“   c                ó0   — t        dt        | «      › �«      ‚)Nzcodegen_reference NYI on rÞ  ©r‘  Úwriters     r‘   Úcodegen_referencezIRNode.codegen_reference  s   € Ü!Ð$=¼dÀ4»j¸\Ð"JÓKÐKr“   c                 ó   — y rŒ   r¦   r�  s    r‘   r  zIRNode.get_device  r®  r“   c                ó.   — | j                  «       }|€J ‚|S rŒ   )r  ©r‘  r  s     r‘   Úget_device_or_errorzIRNode.get_device_or_error  s   € Ø—‘Ó"ˆØÐ!Ð!Ð!Øˆr“   c                 ó   — y©NFr¦   r�  s    r‘   Úhas_exceeded_max_readszIRNode.has_exceeded_max_reads  ó   € Ør“   c                ó>   — t        t        | «      j                  «      ‚rŒ   ©rÙ  r·   r¢   r�  s    r‘   Úmake_loaderzIRNode.make_loader  ó   € Ü!¤$ t£*×"5Ñ"5Ó6Ð6r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úmake_indexerzIRNode.make_indexer  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   r4  zIRNode.get_stride  r  r“   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrŒ   )r4  rÙ  r�  s    r‘   r3  zIRNode.maybe_get_stride"  rá  rÛ  c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   rs  zIRNode.get_name(  r  r“   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrŒ   )rs  rÙ  r�  s    r‘   Úmaybe_get_namezIRNode.maybe_get_name+  rì  rÛ  c                óv   — 	 | j                  «       t        j                  j                  v S # t        $ r Y yw xY wr  )rs  rw   r  Úgraph_inputsrÙ  r�  s    r‘   Úis_input_bufferzIRNode.is_input_buffer1  s4   € ð	Ø—=‘=“?¤a§g¡g×&:Ñ&:Ð:Ð:øÜ"ò 	Ùð	ús   ‚), ¬	8·8c                 ó   — yr  r¦   ©r‘  Ú	thresholds     r‘   Úhas_large_inner_fnzIRNode.has_large_inner_fn7  r  r“   ©Úgraph_reusec                ó   — y)al  
        Hint that this node's value will be reused.

        `users` estimates the reuse count. When `graph_reuse` is true, this
        represents graph fanout and can trigger fanout-based realization
        heuristics. When false, the reuse comes from loop-level indexing, such
        as a broadcast expand, and should not be treated as graph fanout.
        Nr¦   ©r‘  Úusersr  s      r‘   Ú
mark_reusezIRNode.mark_reuse:  s   � r“   c                 ó   — y rŒ   r¦   r�  s    r‘   Úrealize_hintzIRNode.realize_hintD  ó   € Ør“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   rp  zIRNode.unwrap_viewG  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úfreeze_layoutzIRNode.freeze_layoutJ  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  ©r‘  r×   Úallow_paddings      r‘   Úfreeze_layout_with_stride_orderz&IRNode.freeze_layout_with_stride_orderM  ó   € ô "¤$ t£*×"5Ñ"5Ó6Ð6r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  ©r‘  r×   s     r‘   Úfreeze_layout_with_fill_orderz$IRNode.freeze_layout_with_fill_orderR  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  ©r‘  r  s     r‘   Úfreeze_layout_with_same_orderz$IRNode.freeze_layout_with_same_orderU  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  ©r‘  Úexact_stridesr%  s      r‘   Ú freeze_layout_with_exact_stridesz'IRNode.freeze_layout_with_exact_stridesX  r'  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úget_read_writeszIRNode.get_read_writes]  r  r“   c                ó6   — | j                  «       j                  S rŒ   ©r3  Úreadsr�  s    r‘   r£  zIRNode.get_reads`  ó   € Ø×#Ñ#Ó%×+Ñ+Ð+r“   c                ó4   — t        | j                  «       «      S rŒ   )rÍ   r£  r�  s    r‘   Ú	num_readszIRNode.num_readsc  s   € Ü�4—>‘>Ó#Ó$Ð$r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úget_storage_numelzIRNode.get_storage_numelf  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  ©r‘  ri  s     r‘   Úget_free_symbol_useszIRNode.get_free_symbol_usesi  r'  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úget_reduction_typezIRNode.get_reduction_typen  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úget_reduction_sizezIRNode.get_reduction_sizeq  r  r“   c                 ó   — yr  r¦   r�  s    r‘   Ú	is_externzIRNode.is_externt  r  r“   c                 ó   — yr  r¦   r�  s    r‘   Úis_no_opzIRNode.is_no_opw  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  rÿ  s     r‘   Úconstant_to_devicezIRNode.constant_to_devicez  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úget_mutation_nameszIRNode.get_mutation_names}  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úget_operation_namezIRNode.get_operation_name€  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   Úget_inputs_that_alias_outputz#IRNode.get_inputs_that_alias_outputƒ  r  r“   c                 ó   — y rŒ   r¦   r�  s    r‘   r  zIRNode.dtypeˆ  s   € Ø(+r“   )rz  zOrderedSet[Node]r¼   úGenerator[None, None, None])r�  r€  r¼   rP  ©r¹   r‰   r¼   r�   ©r¼   r‰   )r•  rÈ   r  r   r¼   r½   ©r¼   r½   ©r¼   úOrderedSet[str])r¼   r{  ©r¼   r}  ©r¼   zOperation | None©r¼   zlist[Subgraph]©T)rÉ  r�   r¼   úSequence[str])TT)rÑ  zSequence[object]rÉ  r�   rÒ  r�   r¼   rÈ   ©r¼   útorch.dtype)r¼   ztorch.dtype | None©r¼   rç  )r¼   zLayout | None©r¼   r  )r¼   zOutputSpec | None©r¼   r�   ©r¼   úSequence[_IntLike])r¼   úSequence[_IntLike] | None)r¼   z)_IntLike | sympy.Rel | Sequence[_IntLike]©r¼   r    ©r¼   ú
str | NonerŒ   ©rû  zIndentedBuffer | Noner¼   rÈ   ©r¼   útorch.device | None©r¼   útorch.device©r¼   ú$Callable[[Sequence[Expr]], OpsValue]©r¼   ú Callable[[Sequence[Expr]], Expr]©r¼   rÈ   ©r  r€  r¼   r�   ©r  rŽ   r  r�   r¼   r½   ©F©r×   úSequence[int]r%  r�   r¼   r½   ©r×   rt  r¼   r½   ©r  ra  r¼   r½   ©r0  ra  r%  r�   r¼   r½   ©r¼   údependencies.ReadWrites©r¼   zOrderedSet[Dep]©r¼   rŽ   ©r¼   rƒ   ©ri  r�   r¼   r—   ©r¼   úSequence[Expr]©r  rj  r¼   r‰   ©r¼   rZ  )Qr¢   r£   r¤   Ú__doc__r@   rv  r¥   rw  ÚdataclassesÚfieldrz  r|  r~  r   r�  ÚstaticmethodÚ
contextlibÚcontextmanagerr„  r†  rŒ  r’  r–  rš  r¤  r§  rª  r­  r°  rÀ  rË  rÔ  r  rÚ  r  rà  rã  rå  rè  r
  rë  ÚpropertyrA  rð  rõ  rø  rü  r  r   r  r  r
  r4  r3  rs  r  r  r  r  r  rp  r"  r&  r*  r-  r1  r3  r£  r9  r;  r>  r@  rB  rD  rF  rH  rJ  rL  rN  r   r  r¦   r“   r‘   r‰   r‰   /  sÌ  … ññ 3=³,ÐÐ/Ó>Ø04ÐÐ-Ó4ð  1˜{×0Ñ0°eÔ<€Gˆ_Ó<à"3 +×"3Ñ"3¸Ô"?€IÐÓ?Ø(9¨×(9Ñ(9¸uÔ(E€KÐ%ÓEà"3 +×"3Ñ"3¸Ô"?€K�Ó?à.˜[×.Ñ.°EÔ:€J�
Ó:àØ×Ñò*ó ó ð*ð Ø×Ñð-Øð-à	$ò-ó ó ð-ð ò

ó ð

ó&ó.ó	Hó@óó óóóôB+ð  PTð
5Ø%ð
5Ø04ð
5ØHLð
5à	ó
5óóóWóó!óó@óUóð òó ðó.óUóBô$Lóóó
ó7ó7ó7óó7óóôð =Aõ óó7ó7ð ;@ð7Ø"ð7Ø37ð7à	ó7ó
7ó7ð HMð7Ø/ð7Ø@Dð7à	ó7ó
7ó,ó%ó7ð %*ð7Ø!ð7à	!ó7ó
7ó7óóó7ó7ó7ó7ñ à	Ú+ó 
Ù+ð r“   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d"d„Z	 d#	 	 	 d$d„Zd%d„Zy)&Ú	Operationc                ó    — d | _         i | _        y rŒ   )Úoperation_nameÚ_config_patchesr�  s    r‘   rš  zOperation.__post_init__Ž  s   € Ø*.ˆÔØ/1ˆÕr“   c                ó   — t         ‚rŒ   ©rÙ  r�  s    r‘   r  zOperation.get_device’  ó   € Ü!Ð!r“   c                ó6   — t        | d«      sJ ‚| j                  S ©Nr~  )r¶  r~  r�  s    r‘   rª  zOperation.get_origin_node•  s   € Ü�t˜]Ô+Ð+Ð+Ø×ÑÐr“   c                ó6   — t        | d«      sJ ‚| j                  S )Nrz  )r¶  rz  r�  s    r‘   Úget_originszOperation.get_origins™  s   € Ü�t˜YÔ'Ð'Ð'Ø�|‰|Ðr“   c                ó6   — t        | d«      sJ ‚| j                  S )Nr�  )r¶  r�  r�  s    r‘   Úget_stream_idxzOperation.get_stream_idx�  s   € Ü�t˜\Ô*Ð*Ð*Ø�‰Ðr“   c                ó6   — | j                   €J ‚| j                   S rŒ   )rŒ  r�  s    r‘   rL  zOperation.get_operation_name¡  s    € Ø×"Ñ"Ð.Ð.Ð.Ø×"Ñ"Ð"r“   c                ó   — | j                   S )zHGet config patches for this operation (e.g., coordinate_descent_tuning).©r�  r�  s    r‘   Úget_config_patcheszOperation.get_config_patches¥  s   € à×#Ñ#Ð#r“   c                ó   — || _         y)z&Set config patches for this operation.Nr™  )r‘  Úpatchess     r‘   Úset_config_patcheszOperation.set_config_patches©  s
   € à&ˆÕr“   c                 ó   — yr  r¦   r�  s    r‘   rD  zOperation.is_extern­  r  r“   c                 ó   — yr  r¦   r�  s    r‘   rF  zOperation.is_no_op°  r  r“   c                ó   — t         ‚rŒ   r�  r�  s    r‘   r3  zOperation.get_read_writes³  r�  r“   c                ó&   — || j                  «       v S rŒ   )r¤  ©r‘  rÅ   s     r‘   Ú
is_user_ofzOperation.is_user_of¶  s   € Ø�t×*Ñ*Ó,Ð,Ð,r“   c                óB   — t        d„ | j                  «       D «       «      S )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wrŒ   r�  rž  s     r‘   rê   z+Operation.get_read_names.<locals>.<genexpr>º  r   r¡  r¢  r�  s    r‘   r¤  zOperation.get_read_names¹  r¥  r“   c                ó6   — | j                  «       j                  S rŒ   r5  r�  s    r‘   r£  zOperation.get_reads¼  r7  r“   c                ó   — t         ‚rŒ   r�  r�  s    r‘   Úget_outputszOperation.get_outputs¿  r�  r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   Úget_unbacked_symbol_defsz"Operation.get_unbacked_symbol_defsÂ  ó
   € Ü‹|Ðr“   c                ó   — t        «       S )a—  
        When unbacked_only=True:
        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.

        When unbacked_only=False:
        Similar to `unbacked_only=True` but including all free symbols
        instead of only free unbacked symbols.
        r?   r=  s     r‘   r>  zOperation.get_free_symbol_usesÅ  s   € ô, ‹|Ðr“   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   r¦   r�  s    r‘   Úget_workspace_sizezOperation.get_workspace_sizeÝ  s   € ð
 r“   NrS  rg  rV  )r¼   ry  )r¼   r€  ro  )r¼   r  )rœ  r  r¼   r½   r_  rx  )rÅ   rÈ   r¼   r�   rT  rz  ©r¼   úlist[Buffer]©r¼   r—   rr  r}  r{  )r¢   r£   r¤   rš  r  rª  r”  r–  rL  rš  r�  rD  rF  r3  r£  r¤  r£  r¨  rª  r>  r®  r¦   r“   r‘   rŠ  rŠ  Œ  sr   „ ó2ó"ó óóó#ó$ó'óóó"ó-ó@ó,ó"óð %*ðØ!ðà	!óô0r“   rŠ  c                  óJ  — e Zd ZU dZded<   ded<   ded<   ded	<    ed «      	 d 	 	 	 d!d
„«       Zd"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-d„Zd.d„Zd/d„Zd0d„Zd1d„Zd2d„Zd3d„Zd4d„Z y)5ÚLoopsz:Base class for pointwise and reduction loop-body IR nodes.rj  r  r\  r  úCallable[..., Any]Úinner_fnra  Úrangesc                ó€   ‡—  t        «       j                  g ˆfd„| j                  D «       ¢| j                  ‰«      ‘­Ž S )Nc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrŒ   r(   ©rè   Úeri  s     €r‘   rê   z-Loops.get_free_symbol_uses.<locals>.<genexpr>ó  s   øè ø€ ÒF°QÔ˜q -×0ÑFùó   ƒ)r@   Úunionr¶  Úinner_fn_free_symbolsr=  s    `r‘   r>  zLoops.get_free_symbol_usesî  s@   ø€ ð "Œz‹|×!Ñ!ð 
ÛF¸$¿+¹+ÔFð
à×&Ñ& }Ó5ò
ð 	
r“   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=)rÔ  r  r·   rÈ   r  Úinner_fn_strrÂ   r~  )r‘  ÚnamesrÅ   s      r‘   Ú_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                ó$   — | j                  d«      S ©N©r¶  ©rÄ  r�  s    r‘   Ú__str__zLoops.__str__  ó   € Ø�|‰|˜KÓ(Ð(r“   c                ó   — | j                   S rŒ   ©r  r�  s    r‘   r  zLoops.get_device  ó   € Ø�{‰{Ðr“   c                ó   — | j                   S rŒ   r©  r�  s    r‘   rª  zLoops.get_origin_node
  r«  r“   c                ó   — | j                   S rŒ   rÇ  r�  s    r‘   r
  zLoops.get_size  rÍ  r“   c                ó   — | j                   S rŒ   rÇ  r�  s    r‘   Úget_pointwise_sizezLoops.get_pointwise_size  rÍ  r“   c                óè   — |j                  dd «      }|j                  dd «      } | |i |¤Ž}|j                  d|«       |j                  d|xs |j                  «       t        j	                  |«      S )Nr~  r|  )Úpopr–  r|  rˆ   r�  )ÚclsrÃ   rÄ   r~  ÚtbÚrs         r‘   r�  zLoops.create  sm   € à—j‘j °Ó5ˆØ�Z‰Z˜ TÓ*ˆÙ�Ð ˜Ñ ˆð 	
×Ñ˜]¨KÔ8Ø	×Ñ˜[¨"Ò*;°·±Ô<Ü×Ñ Ó"Ð"r“   c                óœ   — t        | «      D ��cg c]0  \  }}|dk(  rt        j                  j                  nt	        ||«      ‘Œ2 c}}S c c}}w ©NrI   )rò   r°   ÚSÚZerorq   )r¶  r‡   Únré   s       r‘   Ú_indexzLoops._index  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)
rX   rw   ÚMockHandlerÚset_ops_handlerr   rÇ   r  rµ  Úinner_fn_argsÚgetvalue)r‘  Ú	opcounters     r‘   Úinner_fn_opcountzLoops.inner_fn_opcount&  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Ü  r¶  r�  s    r‘   râ  zLoops.inner_fn_args0  s   € Ø—‘˜DŸK™KÓ(Ð*Ð*r“   c                ór   — t        j                  j                  | j                  g| j	                  «       ¢­Ž S rŒ   )rw   ÚKernelFormatterHandlerÚir_to_stringrµ  râ  r�  s    r‘   rÂ  zLoops.inner_fn_str3  s3   € ä×'Ñ'×4Ñ4Ø�M‰Mð
Ø ×.Ñ.Ó0ò
ð 	
r“   Nc                óþ   — |€d}t         j                  }|€-t        | «      rt         j                  }n#t         j                  }nt        |t        «      sJ ‚t        ||«      }| j                  «       j                  |kD  S rò  )
rJ   Úrealize_opcount_thresholdr,  Úrealize_cpu_opcount_thresholdÚ"_realize_opcount_threshold_defaultr�   rŽ   Úmaxrå  Únum_ops)r‘  r  rë  s      r‘   r  zLoops.has_large_inner_fn9  sv   € ØÐØˆIÜ$*×$DÑ$DÐ!Ø$Ð,Ü�dŒ|Ü,2×,PÑ,PÑ)ä,2×,UÑ,UÑ)äÐ7¼Ô=Ð=Ð=Ü˜	Ð#<Ó=ˆ	Ø×$Ñ$Ó&×.Ñ.°Ñ:Ð:r“   c                óh   — | j                  | j                  «      }t        | j                  ||¬«      S ©Nrh  )rÜ  r¶  rR   rµ  )r‘  ri  rÏ   s      r‘   r½  zLoops.inner_fn_free_symbolsG  s'   € Ø—‘˜DŸK™KÓ(ˆÜ# D§M¡M°5ÈÔVÐVr“   c                óò   — | j                  | j                  «      }t        |«      }t        j                  |«      5  | j                  |«       d d d «       |j                  S # 1 sw Y   |j                  S xY wrŒ   )rÜ  r¶  rU   rw   rá  rµ  Úusages)r‘  ÚsymbolrÏ   Úhandlers       r‘   Úcollect_inner_fn_symbol_usagez#Loops.collect_inner_fn_symbol_usageL  sb   € Ø—‘˜DŸK™KÓ(ˆÜ0°Ó8ˆä×Ñ˜gÓ&ñ	!ð �M‰M˜%Ô ÷	!ð �~‰~Ð÷		!ð �~‰~Ðús   ¼A"Á"A6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@  rT   r  r
  rB  r6  r�  s    r‘   r£  zLoops.get_readsU  s”   € Ü�\‰\œ.Ð*:¸DÓAñ 	Ø×&Ñ&Ô(Ü*Ø×$Ñ$Ó&Ø—M‘M“OØ×+Ñ+Ó-ó÷ ‘%÷	ñ 	ô +Ø×$Ñ$Ó&Ø—M‘M“Oó÷ ‘%÷	÷ 	ò 	ús   œAB2Á71B2Â2B;c                óH   — t        | j                  «       j                  «      S rŒ   )r@   rå  Úread_buffersr�  s    r‘   r¤  zLoops.get_read_namesc  s   € Ü˜$×/Ñ/Ó1×>Ñ>Ó?Ð?r“   c                óH   — t        | j                  «       j                  «      S rŒ   )rÍ   rå  rù  r�  s    r‘   r9  zLoops.num_readsf  s   € Ü�4×(Ñ(Ó*×7Ñ7Ó8Ð8r“   c                ó2   — t        dt        | «      › d�«      ‚)Nz+get_reduction_size() is not implemented by rÝ  rÞ  r�  s    r‘   rB  zLoops.get_reduction_sizei  ó   € Ü!Ø9¼$¸t»*¸ÀQÐGó
ð 	
r“   c                ó2   — t        dt        | «      › d�«      ‚)Nz+get_reduction_type() is not implemented by rÝ  rÞ  r�  s    r‘   r@  zLoops.get_reduction_typen  rü  r“   c                ó2   — t        dt        | «      › d�«      ‚)Nz+constant_to_device() is not implemented by rÝ  rÞ  rÿ  s     r‘   rH  zLoops.constant_to_devices  rü  r“   rr  r}  )rÃ  rZ  r¼   rÈ   ro  rg  rV  r`  )rÃ   r   rÄ   r   r¼   rˆ   )r¶  ra  r‡   rH   r¼   r  )r¼   rY   ©r¼   zSequence[Sequence[_IntLike]]rŒ   rp  ©ri  r�   r¼   úOrderedSet[Symbol])rô  r"   r¼   rU  rz  rT  r{  r~  rd  r€  )!r¢   r£   r¤   r‚  r¥   rb   r>  rÄ  rÉ  Ú__repr__r  rª  r
  rÑ  Úclassmethodr�  r…  rH   ÚINDEXrÜ  ra   rå  râ  rÂ  r  r½  rö  r£  r¤  r9  rB  r@  rH  r¦   r“   r‘   r³  r³  å  s÷   … áDàÓØÓØ Ó ØÓá˜GÓ$à$)ð
Ø!ð
à	!ò
ó %ð
ó	
ó)ð €Hóó óóð ò	#ó ð	#ð Ø:>¿*¹*ó 
ó ð
ð ò(ó ð(ó+ð ò
ó ð
ô
;ôWó
óó@ó9ó
ó

ô

r“   r³  c               ó„   — |j                   rt        j                  t        d«      |«      S t        j                  d|«      S )NÚnanr   )Úis_floating_pointru   ÚconstantÚfloat)ró   r  s     r‘   Únop_loader_fnr
  y  s1   € Ø×ÒÜ�|‰|œE %›L¨%Ó0Ð0ä�|‰|˜A˜uÓ%Ð%r“   c                  óP   — e Zd Zdd„Zd	d„Ze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  rµ  r�  s    r‘   r  zPointwise.make_loader‚  s)   € à× Ñ Ô"Üœ=°·
±
Ô;Ð;à�}‰}Ðr“   c                ó$   — | j                  d«      S rÆ  rÈ  r�  s    r‘   rÉ  zPointwise.__str__‰  rÊ  r“   c                ó   — g S rŒ   r¦   r�  s    r‘   rB  zPointwise.get_reduction_sizeŽ  s   € Øˆ	r“   c                 ó   — y rŒ   r¦   r�  s    r‘   r@  zPointwise.get_reduction_type‘  r®  r“   c                óp   — | j                  «       }t        j                  |xs d ||«       ||«      «      S ©NÚunnamed)r  ru   Ústore©r‘  Úoutput_nameÚindexerÚvarsÚloaders        r‘   Ústore_outputzPointwise.store_output”  s2   € ð ×!Ñ!Ó#ˆÜ�y‰y˜Ò1¨	±7¸4³=Á&ÈÃ,ÓOÐOr“   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  rµ  r¶  )r  r   rÇ   ÚConstantBufferr  r  r¶  ©r‘  r  r  s      r‘   rH  zPointwise.constant_to_device�  sK   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;ô	
ð 	
r“   Nrk  ro  r`  rd  )r  re  r  ú!Callable[[Sequence[Expr]], Never]r  r  r¼   r½   r€  )
r¢   r£   r¤   r  rÉ  r  rB  r@  r  rH  r¦   r“   r‘   r  r  €  sR   „ óó)ð €HóóðPàðPð 3ðPð ð	Pð
 
óPô	
r“   r  c                  óF   — e Zd ZU ded<   dZded<   dd„Z	 	 	 	 	 	 	 	 d	d„Zy)
ÚScatterrn  Úoutput_indexerNr[   Úscatter_modec                óÖ   — | j                  «       } t        j                  t        d|«      |«      }t	        || j
                  || j                  | j                  | j                  ¬«      S )r  r  )r  r  rµ  r¶  r&  r'  )	r  r   rÇ   r!  r%  r  r¶  r&  r'  r"  s      r‘   rH  zScatter.constant_to_device®  s]   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;Ø×.Ñ.Ø×*Ñ*ô
ð 	
r“   c                ó¦   — | j                  «       }|€d}t        j                  | || j                  |«      «       ||«      | j                  ¬«      S )Nr  )Úmode)r  ru   r  r&  r'  r  s        r‘   r  zScatter.store_output»  sT   € ð ×!Ñ!Ó#ˆØÐØ#ˆKÜ�y‰yØÙ�D×'Ñ'¨Ó-Ó.Ù�4‹LØ×"Ñ"ô	
ð 	
r“   r€  )r  re  r  r#  r  r  r¼   r   )r¢   r£   r¤   r¥   r'  rH  r  r¦   r“   r‘   r%  r%  ©  sB   … à4Ó4Ø"€L�)Ó"ó
ð
àð
ð 3ð
ð ð	
ð
 
ô
r“   r%  Ú
logical_orÚmaximumÚminimumÚmulr·  Úbitwise_xor)Úanyrî  ÚminÚprodÚsumÚdotÚ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ÚargminÚargmax_valueÚargmin_valueÚargmax_with_valueÚargmin_with_valuec                óÈ  •— | \  }}|\  }}‰dv 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 )N)r:  r<  r>  )	ru   ÚltÚgtÚeqr0   Ú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              €€€r‘   Úargmax_combine_fnz3get_reduction_combine_fn.<locals>.argmax_combine_fnæ  s  ø€ ð  !ÑˆG�WØ ÑˆG�WàÐ!PÑPÜ—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ðð r“   Úwelford_combinec           	     óP  — | \  }}}|\  }}}t        j                  t        j                  t        j                  |«      t        j                  ||«      «      t        j
                  dt        j                  «      ||z
  «      }||z   }	||	z  }
|||
z  z   ||z   ||z  |z  |
z  z   |	fS )Ng        )ru   rE  rD  ÚisinfrB  r  r  Úfloat32)rF  rG  Úa_meanÚa_m2Úa_weightÚb_meanÚb_m2Úb_weightÚdeltaÚ
new_weightÚ	w2_over_ws              r‘   Úwelford_combine_fnz4get_reduction_combine_fn.<locals>.welford_combine_fn  s±   € ð &'Ñ"ˆF�D˜(Ø%&Ñ"ˆF�D˜(ô
 —I‘IÜ—‘¤§	¡	¨&Ó 1´3·6±6¸&À&Ó3IÓJÜ—‘˜S¤%§-¡-Ó0Ø˜‘óˆEð
 " HÑ,ˆJØ  :Ñ-ˆIà˜ Ñ*Ñ*Ø�t‘˜e e™m¨hÑ6¸ÑBÑBØðð r“   zunknown reduction_type=)rF  útuple[object, object]rG  rb  r¼   útuple[OpsValue, OpsValue])rF  ú#tuple[OpsValue, OpsValue, OpsValue]rG  rd  r¼   rd  )r6  rÙ  )rR  r  rQ  rS  ra  s   ```  r‘   Úget_reduction_combine_fnre  ×  s‘   ú€ ð Ô-Ñ-Ü# NÑ3Ð3à	ð ñ 
ð	Ø$ð	Ø)>ð	à&÷	ð: !Ð à	Ð,Ò	,ð	Ø2ð	à2ð	ð 1ó	ð. "Ð!ô "Ð$;¸NÐ;KÐ"LÓMÐMr“   c                  ó
  ‡ — e Zd ZU ded<   ded<   ded<   ded<   dd	„ZeZ ed «      d d!ˆ fd
„«       Zd"d„Zd#d„Z		 	 	 	 	 	 	 	 	 	 d$d„Z
d%d„Zd&d„Zd 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/d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 d0d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d„«       Ze	 d(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d2d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3d„«       Zˆ xZS )4Ú	Reductionra  Úreduction_rangesrZ   rR  r\  Ú	src_dtyper^   Úreduction_hintc                ó$   — | j                  d«      S )N)r¶  rh  rR  rÈ  r�  s    r‘   rÉ  zReduction.__str__,  s   € Ø�|‰|ÐLÓMÐMr“   c                óz   •‡— t         ‰| �  ‰«       t        «       j                  ˆfd„| j                  D «       Ž z  S )Nc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrŒ   r(   r¹  s     €r‘   rê   z1Reduction.get_free_symbol_uses.<locals>.<genexpr>4  s   øè ø€ ÒP°QÔ˜q -×0ÑPùr»  )Úsuperr>  r@   r¼  rh  ©r‘  ri  Ú	__class__s    `€r‘   r>  zReduction.get_free_symbol_uses1  s:   ù€ ä‰wÑ+¨MÓ:Ð=O¼Z»\×=OÑ=OÛP¸$×:OÑ:OÔPð>
ñ 
ð 	
r“   c                ó   — | j                   S rŒ   )rh  r�  s    r‘   rB  zReduction.get_reduction_size7  s   € Ø×$Ñ$Ð$r“   c                ó   — | j                   S rŒ   )rR  r�  s    r‘   r@  zReduction.get_reduction_type:  ó   € Ø×"Ñ"Ð"r“   c           	     óÒ   — t        j                  | j                  | j                  | j                  | j                  ||«      «      }t        j                  |xs d ||«      |«       y r  )ru   Ú	reductionr  ri  rR  rµ  Ústore_reduction)r‘  r  r  r  Úreduction_varsr  s         r‘   rv  zReduction.store_reduction=  sT   € ô —‘Ø�J‰JØ�N‰NØ×ÑØ�M‰M˜$ Ó/ó	
ˆô 	×Ñ˜KÒ4¨9±g¸d³mÀUÕKr“   c                óX   — t        | j                  «      t        | j                  «      z   S rŒ   )rÍ   r¶  rh  r�  s    r‘   Úindex_lengthzReduction.index_lengthL  s!   € Ü�4—;‘;Ó¤# d×&;Ñ&;Ó"<Ñ<Ð<r“   c                ó”   — | j                  | j                  «      }| j                  | j                  t        j                  «      }||fS rŒ   )rÜ  r¶  rh  rH   ÚR0_INDEX)r‘  rÏ   Úrindexs      r‘   râ  zReduction.inner_fn_argsO  s8   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×2Ñ2´D·M±MÓBˆØ�vˆÐr“   c                ó¾   — | j                  | j                  «      }| j                  | j                  t        j                  «      }t        | j                  |||¬«      S rñ  )rÜ  r¶  rh  rH   r{  rR   rµ  )r‘  ri  rÏ   r|  s       r‘   r½  zReduction.inner_fn_free_symbolsT  sH   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×2Ñ2´D·M±MÓBˆÜ#Ø�M‰M˜5 &¸ô
ð 	
r“   c           
     ó
  — | j                  «       } t        j                  t        d|«      |«      }t	        || j
                  || j                  | j                  | j                  | j                  t        j                  ¬«      S )r  r  ©r  r  rµ  r¶  rh  rR  ri  rj  )r  r   rÇ   r!  rg  r  r¶  rh  rR  ri  r^   ÚDEFAULTr"  s      r‘   rH  zReduction.constant_to_device[  sm   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;Ø!×2Ñ2Ø×.Ñ.Ø—n‘nÜ(×0Ñ0ô	
ð 		
r“   Nc	           
     óž  — |t        |«      g}	t        j                  j                  j	                  |	«      st
        j                  dfS t        j                  j                  j                  |«      }
t        |«      }t        j                  j                  j                  |«      }t        j                  j                  | t        j                  «      xr/ t        | «       xs! t        j                  j                  | ||«      }d}|dk(  xs | xr ||vxr t        j                  }|dk(  r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/        |t0        «      rœt3        j4                  t6        dd«      5  t9        |«      \  }}d
d
d
«       �h�ft        j                  j                  j;                  t        ||z   «      «      }|
|k(  r,t<        j?                  d|||||«       t
        j,                  dfS t
        j,                  |fS |
|k  s||dz  dz  k\  rt
        j                  dfS tA        | |||||dk7  r|nd|t
        j                  ¬«      }dd„} ||«      \  }}|r ||«      \  }}tC        |«      dk(  rt
        j                  dfS tE        jF                  |jI                  «       |jK                  «       «      \  \  }}}d} d}!|D ]�  }"t        j                  j                  jM                  |"|«      }#t        j                  j                  jO                  |#|tQ        |jS                  «       «      «      }$tU        d„ |$D «       «      }%|%r| dz  } Œ‰|!dz  }!Œ� |!| kD  rt
        j,                   ||
|«      fS t
        jV                   ||
|«      fS # 1 sw Y   �ŒxY w)zd
        Choose the reduction hint and split count from shape and input stride information.
        rI   r8  Úscanr4  é    T)Úinner_reductionFc                 ó   — yrØ  r¦   )Úreduction_numel_hintÚ
numel_hints     r‘   Úinner_reduction_splitsz4Reduction.num_splits.<locals>.inner_reduction_splits¬  s   € ð r“   Nrß  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: %sr2  râ   r3  r  c           	     óÖ  ‡— | j                  «       }|€J ‚t        d t        || j                  «       | j	                  «       ¬«      | ¬«      }|j                  «       }|j                  €J ‚|j                  D �cg c].  }t        |t        «      rt        |t        j                  «      s|‘Œ0 }}t        j                  | j	                  «       | j                  «       «      \  \  }}}|D �cg c].  }t        |t        «      rt        |t        j                  «      s|‘Œ0 }}g }g }	d}
t        |j                  d„ ¬«      D �]  }|j                   j"                  Št%        ˆfd„|D «       «      }| xr t'        ˆfd„|D «       «      }|r|j)                  |j                   «       n|r|	j)                  |j                   «       |s|sŒ‡|j*                  t,        j.                  j0                  v sŒ®t,        j.                  j0                  |j*                     }t3        |j4                  dd «      }|j7                  «        t3        |j4                  dd «      |k7  s�Œd	}
�Œ |xs |	|
fS c c}w c c}w )
N©r  r  r  ©rÅ   rN  rM  Fc                ó   — | j                   S rŒ   r�  r�   s    r‘   ú<lambda>z@Reduction.num_splits.<locals>.get_read_indices.<locals>.<lambda>  s
   € ¸a¿f¹f€ r“   ©Úkeyc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wrŒ   r¦   ©rè   Úvarr5   s     €r‘   rê   zAReduction.num_splits.<locals>.get_read_indices.<locals>.<genexpr>	  s   øè ø€ Ò'RÀ¨¨|Ô(;Ñ'Rùó   ƒc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wrŒ   r¦   r‘  s     €r‘   rê   zAReduction.num_splits.<locals>.get_read_indices.<locals>.<genexpr>  s   øè ø€ ò NØ,/�C˜<Ô'ñNùr“  r  T)r  rˆ  r  r  r
  r3  Ú
range_varsr�   r    r°   r   rK   Úindex_vars_squeezerB  Úsortedr6  rÏ   r5   rì   r0  rÇ  rÅ   rw   r  Úname_to_bufferrÂ   rN  Údecide_layout)rÖ  r  ÚcbÚread_writesr’  r•  rù   rw  ÚindicesÚbroadcasted_reduction_indicesÚchangedÚmdÚis_full_size_readÚis_broadcasted_reduction_readÚbufÚoriginal_strider5   s                   @r‘   Úget_read_indicesz.Reduction.num_splits.<locals>.get_read_indicesæ  s:  ø€ Ø—\‘\“^ˆFØÐ%Ð%Ð%ÜØÜ%Ø!ØŸ+™+›-ØŸ™›ôð
 ôˆBð ×,Ñ,Ó.ˆKð ×)Ñ)Ð5Ð5Ð5ð '×1Ñ1öàÜ˜c¤4Ô(´¸CÄÇÁÔ1Nò ðˆJð ô
 &2×%DÑ%DØ—
‘
“˜a×2Ñ2Ó4ó&Ñ"ÑˆQ� ð
 *öàÜ˜c¤4Ô(´¸CÄÇÁÔ1Nò ðˆNð ð
 ˆGØ,.Ð)ØˆGÜ˜[×.Ñ.Ñ4DÔEó +�Ø!Ÿx™x×4Ñ4�Ü$'Ó'RÀzÔ'RÓ$RÐ!ð 5FÐ0Eò 1Ì#ó NØ3AôNó KÐ-ñ %Ø—N‘N 2§8¡8Õ,Ù2Ø1×8Ñ8¸¿¹ÔBÙ$Ò(EØ—w‘w¤!§'¡'×"8Ñ"8Ò8ÜŸg™g×4Ñ4°R·W±WÑ=˜Ü*1°#·*±*¸hÈÓ*M˜Ø×)Ñ)Ô+Ü" 3§:¡:¨x¸Ó>À/ÔQØ&*šGð'+ð( Ò;Ð;¸WÐDÐDùòIùòs   Á83I!Ã)3I&r   c              3  ó4   K  — | ]  }|d k(  xs |dkD  –— Œ y­w)r   rI   Nr¦   rç   s     r‘   rê   z'Reduction.num_splits.<locals>.<genexpr>1  s   è ø€ Ò9¨A˜˜Q™š ! a¡%›Ñ9ùr¡  )r†  rŽ   r‡  rŽ   r¼   rŽ   )rÖ  rg  r¼   ztuple[Sequence[Expr], bool]),rr   rw   r  r  Úall_unbacked_explicitly_hintedr^   r€  r	  Úhas_featurerL   ÚREDUCE_TO_SINGLE_ELEMENTr*  ÚchoicesÚ should_use_cooperative_reductionrJ   Úsplit_reductionsr]   r�  Úmulti_processor_countÚ	functoolsr   Úreduction_split_factorÚINNERr�   rˆ   r   rÇ   r  rS   Ú!replace_backed_symbols_with_hintsÚlogr¹  rg  rÍ   rK   r–  r
  rB  Úsimplify_with_rangesÚstride_hintsr©   Úkeysrì   ÚOUTER)&r  Ú	dst_dtyperi  rµ  r¶  rh  rR  Úreduction_numelÚ
input_nodeÚexprsr†  Únumelr‡  Úshould_reduce_to_single_elementÚarg_reduction_typesÚshould_splitÚpropsÚnum_smÚmin_elements_per_threadrˆ  Úouter_reduction_splitsrÈ  Ú
new_rangesÚnew_reduction_rangesÚextracted_numel_hintrÖ  r¤  rœ  rž  rù   rw  Úranges1Ú	num_outerÚ	num_innerrÐ   ÚjrU  Úouters&                                         r‘   Ú
num_splitszReduction.num_splitsj  sj  € ð" !¤-°Ó"7Ð8ˆÜ�w‰w×Ñ×>Ñ>¸uÔEÜ ×(Ñ(¨!Ð+Ð+Ü Ÿw™w×/Ñ/×AÑAÀ/ÓRÐÜ˜fÓ%ˆÜ—W‘W×%Ñ%×7Ñ7¸Ó>ˆ
ô
 +,¯'©'×*=Ñ*=Ø”N×;Ñ;ó+
ò +
ô ˜&Ó!Ð!ò Ü�y‰y×9Ñ9Ø˜˜óð	 	(ð
Ðð &¨Ñ/ò 
Ø/Ð/ò (ØÐ&9Ð9ò(ä×'Ñ'ð 	ð ˜UÒ"ä ×(Ñ(¨!Ð+Ð+ä ×'Ñ'¨Ó/ˆØ×,Ñ,ˆØ"$ÐÙÜ@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äŸ™×(Ñ(×JÑJÜ)¨*Ð7KÑ*KÓLóð )ð
 ,Ð/CÒCÜŸ	™	ðGð #Ø,Ø!Ø&Ø0ô	ô  -×2Ñ2°BÐ6Ð6Ü ×&Ñ&¨Ð-Ð-à Ð$;Ò;Ø˜V a™Z¨"™_Ò,ä ×(Ñ(¨!Ð+Ð+äØØØØØ-Ø-;¸vÒ-E™>È5ØÜ(×0Ñ0ô	
ˆó5	Eñn ,¨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ô
 Ñ9°Ô9Ó9ˆEÙØ˜Q‘‘	à˜Q‘‘	ð	ð �yÒ Ü ×&Ñ&Ñ(>Ø$ jó)ð ð ô !×&Ñ&Ñ(>Ø$ jó)ð ð ÷AHñ Hús   È$QÑQc                ó  ‡ ‡‡‡‡‡— t         j                  j                  j                  ‰«      Št	        ||«      Šdˆˆˆfd„Š|dv r@t        ‰t        j                  ‰«      «      Š	 	 	 	 	 	 d	ˆˆ fd„Š|dv r‰S |dv rˆfd„S ˆfd„S ‰ Š‰S )
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Œ   r¦   )rè   r|  rÏ   Úvalue_fns     €€r‘   rê   z=Reduction._unroll_reduction_fn.<locals>.fn.<locals>.<genexpr>N  s    øè ø€ ò àñ ˜U F×+ñùó   ƒ)r­  ÚreduceÚ	itertoolsÚproductrÎ   )rÏ   r�   Ú
combine_fnrh  rÎ  s   ` €€€r‘   rÆ   z*Reduction._unroll_reduction_fn.<locals>.fnK  sH   ù€ Ü×#Ñ#Øôä"+×"3Ñ"3Ø,<Ö= qœ% �(Ò=ð#ôóð ùò
 >s   «A
)r:  r9  r<  r;  r>  r=  c                óà   •— |D �cg c]  }t        j                  |«      ‘Œ }} ‰| |«      }t        |t        «      r|S |t	        j
                   ‰|«      t        j                  «      fS c c}w rŒ   )r°   Úexpandr�   rª   ru   Ú
index_exprr  Úint64)rÏ   r|  rÐ   r  Úflatten_indexrµ  s       €€r‘   rÎ  z0Reduction._unroll_reduction_fn.<locals>.value_fnd  sd   ø€ ð 4:Ö:¨aœ%Ÿ,™, q�/Ð:�Ð:Ù  ¨Ó/�Ü˜e¤UÔ+Ø �LàÜ—N‘N¡=°Ó#8¼%¿+¹+ÓFðð ùò	 ;s   †A+)r>  r=  )r<  r;  c                ó   •—  ‰| «      d   S rò  r¦   ©rÏ   rÆ   s    €r‘   r�  z0Reduction._unroll_reduction_fn.<locals>.<lambda>s  s   ø€ ¡R¨£Y¨q¡\€ r“   c                ó   •—  ‰| «      d   S rØ  r¦   rÚ  s    €r‘   r�  z0Reduction._unroll_reduction_fn.<locals>.<lambda>t  s   ø€ ¡ E£¨1¡€ r“   )rÏ   ra  r¼   r   )rÏ   ra  r|  ra  r¼   rc  )rw   r  r  Úguard_int_seqre  Ú_fixed_indexerr  r  )rµ  rh  rR  ri  rÓ  rØ  rÆ   rÎ  s   ``  @@@@r‘   Ú_unroll_reduction_fnzReduction._unroll_reduction_fn?  s«   ý€ ô Ÿ7™7×+Ñ+×9Ñ9Ð:JÓKÐä-¨n¸iÓHˆ
÷		ð ð 
ñ 
ô +Ø Ü×1Ñ1Ð2BÓCóˆMð

Ø)ð
Ø3Eð
à*ö
ð Ð!KÑKØ�	ØÐ!AÑAÛ1Ð1Û-Ð-àˆHØˆIr“   c
                óÄ  ‡‡‡‡‡‡— t         j                  j                  j                  t	        ‰«      «      Š‰dk(  r]dˆfd„}
 |
d«       |
d«       |
d«       |
d«      dœŠ‰‰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        «      rot        ‰«      t        j                  k  rSt	        |«      dk7  st        |j                  «      r0‰dk7  r+t
        j                  |‰| j                  ‰‰‰|«      |¬«      S | j!                  |‰|‰|‰‰‰|	«	      \  }}dˆfd„} ||«      }|t"        j$                  k(  r|}|dk(  rX|	€J ‚t'        j(                  t*        dd«      5  t-        |	«      \  }}ddd«       €J ‚€J ‚| j/                  |‰|‰|‰||‰|«
      S |dkD  rÂ| j1                  |‰|‰|‰‰|||	«
      }d}t        j2                  j4                  r t        |t6        «      r	 	 	 	 dd„} ||«      }|rht        |j8                  t:        «      sJ t        |j8                  «      › «       ‚|j8                  j<                  d   |_        ‰|_         ||_!        ‰|_"        |S t6        j                  t;        |‰‰|‰‰||¬«      «      }|S # 1 sw Y   �ŒxY w)zy
        Create a reduction node. May split the reduction to multiple layers to expose
        more parallelism.
        r   c                ó  •— ‰t         j                  k(  rt        | «      S ‰j                  r+t        | t        «      sJ t        | «      «       ‚t        | «      S t        | t        «      sJ t        | «      «       ‚t        | «      S rŒ   )	r  r�   r  r�   r   r·   r	  r   rŽ   )Úvalr¶  s    €r‘   Úpy_cnstz!Reduction.create.<locals>.py_cnst‘  sg   ø€ Ø¤§
¡
Ò*Ü ›9Ð$Ø×0Ò0Ü% c¬=Ô9ÐD¼4À»9ÓDÐ9Ü  ›:Ð%ä% c¬;Ô7ÐB¼¸c»ÓBÐ7Ü˜s›8�Or“   rI   )r3  r5  r2  r0  ú* not supported for zero-dimension tensors!c                ó6   •— t        j                  ‰‰   ‰«      S rŒ   ©ru   r  )rÏ   r¶  rR  Úrtypes_to_initss    €€€r‘   Úconst_fnz"Reduction.create.<locals>.const_fn§  s   ø€ Ü—|‘| O°NÑ$CÀYÓOÐOr“   r   )r:  r9  c                ó0   •— t        j                  d‰«      S rò  rå  )rÏ   r¶  s    €r‘   rÆ   zReduction.create.<locals>.fnµ  s   ø€ ÜŸ<™<¨¨9Ó5Ð5r“   c                ón   •— ‰D �cg c]  }t         j                  j                  ‘Œ }} ‰| |«      S c c}w rŒ   ©r°   rÙ  rÚ  )rÏ   rù   Úreduction_indexrµ  rh  s      €€r‘   rÆ   zReduction.create.<locals>.fnº  s1   ø€ Ø=MÖ&N¸¤u§w¡w§|£|Ð&N�OÐ&NÙ# E¨?Ó;Ð;ùò 'Oó   †!2r4  c                ó`   •— t        ‰«      r| S | dkD  rt        | t        j                  «      S | S rØ  )r’   rî  rJ   Úmin_num_split)rÈ  r·  s    €r‘   Ú_maybe_increase_splitz/Reduction.create.<locals>._maybe_increase_splitâ  s/   ø€ ä˜/Ô*Ø�Ø�qŠyÜ˜5¤&×"6Ñ"6Ó7Ð7à�r“   r2  Nrß  Tc                ó:  — | j                  «       }t        |«      dk7  ry t        t        |«      «      }|t        j
                  j                  vry t        j
                  j                  |   }t        |t        «      sy |j                  j                  «       €J ‚|S rØ  )r¤  rÍ   ÚnextÚiterrw   r  r˜  r�   rˆ  rM  r@  )Úcur_nodeÚ
read_namesÚbufnamer¢  s       r‘   Ú_find_split_reductionz/Reduction.create.<locals>._find_split_reduction  s„   € ð "*×!8Ñ!8Ó!:�JÜ˜:“¨!Ò+Ø#ä"¤4¨
Ó#3Ó4�GØ¤a§g¡g×&<Ñ&<Ñ<Ø#ÜŸ'™'×0Ñ0°Ñ9�CÜ% c¬>Ô:Ø#àŸ8™8×6Ñ6Ó8ÐDÐDÐDà�Jr“   r  )rá  rÇ   r¼   zbool | float | int)rÏ   rŽ   r¼   rv   )rÈ  rŽ   r¼   rŽ   )ró  rˆ   r¼   zComputedBuffer | None)#rw   r  r  Úsimplifyrr   r  r�  r©   r�   r!   rŽ   rJ   Úunroll_reductions_thresholdrn   r·   rÞ  rÊ  r^   r€  r   rÇ   r  rS   Ú!create_multilayer_existing_rangesÚcreate_multilayerr%  Úmix_order_reductionrˆ   rM  rg  rh  Ú_split_sizeÚ_original_inner_fnÚ_original_rangesÚ_original_reduction_ranges)rÔ  r  r¶  ri  rµ  r¶  rh  rR  rj  r¸  râ  rç  rÆ   ÚhintrÈ  rï  rÂ  rÃ  rú   Úsplit_reductionrö  r·  ræ  s     ` ` ``             @@r‘   r�  zReduction.createy  sk  ý€ ô$ Ÿ'™'×*Ñ*×3Ñ3´MÐBRÓ4SÓTˆà˜aÒõ$ñ ˜q“zÙ" 1›:Ù ›
Ù˜q“zñ	ˆOð " _Ñ4ð Ø!Ð"Ð"LÐMóÐ4÷Pô ×#Ñ#ØØØ!Ü˜F“|ð	 $ó ð ð ˜aÒàÐ!5Ñ5ö6ö
<ô ×#Ñ#Ø Y¸ÀFð $ó ð ô
 �¬Ô0Ü�OÓ$¤v×'IÑ'IÒIÜ˜vÓ&¨!Ò+¬v°f·k±kÔ/BØ %Ò'ô ×#Ñ#ØØØ×1Ñ1ØÐ.°À	óð ð $ó ð ð —n‘nØØØØØØØØØó

‰ˆˆeõ	ñ & eÓ,ˆð
 œ]×2Ñ2Ò2Ø!ˆNØ�BŠ;ØÐ)Ð)Ð)Ü—‘œnÐ.>ÀÓEñ Ü3VØó4Ñ0�
Ð0÷ð Ð)Ð)Ð)Ø'Ð3Ð3Ð3Ø×8Ñ8ØØØØØØ ØØ$ØØóð ð �QŠYà×'Ñ'ØØØØØØ ØØØØóˆCð #ˆOÜ�}‰}×0Ò0´ZÀÄYÔ5OðØ'ðà*óñ$ #8¸Ó"<�áô " /×"6Ñ"6¼	ÔBð Ü˜O×0Ñ0Ó1Ð2óÐBð />×.BÑ.B×.SÑ.SÐTUÑ.V�Ô+Ø5=�Ô2Ø39�Ô0Ø=M�Ô:ØˆJä×ÑÜØØØ!ØØ!1Ø-Ø#Ø-ô	ó
ˆð ˆ
÷kñ ús   Æ-KËK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)rî  r9  r;  r=  ú-infF)r1  r:  r<  r>  ÚinfTr   rI   )r3  r2  r4  r5  r0  Úwelford_reducerT  Úonline_softmax_reduce)r0   r	  r.   r  Úiinfor1  rî  )rR  r  ÚzeroÚones       r‘   Údefault_accumulatorzReduction.default_accumulatorK  sÙ   € ð ÐSÑSÜ˜eÔ$Ü˜V“}Ð$Ü! %Ô(Øä—{‘{ 5Ó)×-Ñ-Ð-ØÐSÑSÜ˜eÔ$Ü˜U“|Ð#Ü! %Ô(Øä—{‘{ 5Ó)×-Ñ-Ð-ä(¨Ô/‰u°QˆÜ& uÔ-‰d°1ˆàØØØØØ# T¨4Ð0Ø $ d¨DÐ1Ü&+¨F£m°TÐ%:ñ	
ð ñ	ð 		r“   c                ó:   — | dk(  ryt         j                  | |«      S )Nr  r   )rg  r
  ©rR  r  s     r‘   Údefault_valuezReduction.default_valuek  s#   € ð Ð-Ò-ØÜ×,Ñ,¨^¸UÓCÐCr“   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 )Nr2  é   i   é   )r^   rµ  Ú
OUTER_TINY)rÈ  r‡  rj  s      r‘   Ú_multilayer_second_step_hintz&Reduction._multilayer_second_step_hints  sg   € ð �BŠ;Ø!Ð!Ø�CŠ<˜J¨#Ò-°.ÄM×DWÑDWÒ2WÜ ×+Ñ+Ð+à�TŠMØ˜cÒ!Ø¤-×"5Ñ"5Ò5ä ×+Ñ+Ð+àÐr“   c                óz  — |€yt         j                  j                  j                  |j	                  «       |«      sy|j                  «        	 t        |«       |j                  «       }t        |dd «      D ]3  \  }}t         j                  j                  j                  |d«      sŒ1|c S  y# t        $ r Y yw xY w)zÒ
        If we are reducing over the full tensor, and it is non-dense in the last dimension,
        reindex so we reduce over the dense dimension. initially just handle complete
        reduction case
        Nr2  rI   )
rw   r  r  rI  rð  rø  rO  rÙ  r4  rò   )rÔ  r·  r¸  rU  rÐ   ré   s         r‘   Ú$check_for_split_dense_dim_reindexingz.Reduction.check_for_split_dense_dim_reindexing„  s·   € ð ÐØä�w‰w×Ñ×7Ñ7Ø× Ñ Ó" Oô
ð à×ÑÔð	ä! *Ô-ð ×'Ñ'Ó)ˆä˜g c r˜lÓ+ò 	‰DˆAˆqÜ�w‰w×Ñ×7Ñ7¸¸1Õ=Ø’ð	ð øô #ò 	Ùð	ús   ÁB. Â.	B:Â9B:c                ó  ‡‡‡‡‡
‡— | j                  ‰|«      }t        j                  |‰g|«      Št        j                  j
                  j                  t        j                  t        ‰|«      d«      «       Š
	 	 	 	 	 	 dˆˆˆˆ
ˆˆfd„}	|	S )Nr   c                ó  •‡‡— |\  }| �^ Š}‰|z  |z   Šdˆˆ
ˆˆfd„}‰r`t        ‰«      }t        j                  t        j                  ‰|«      t        j                  ‰|«      «      }t        j                  ||‰	«      S  |«       S )Nc                 ó$   •—  ‰‰ ‰‰ g«      «      S rŒ   r¦   )rœ  r  Ú	new_indexrÒ   s   €€€€r‘   ÚbodyzCReduction._multilayer_wrap_loader.<locals>.wrapper_fn.<locals>.bodyÀ  s   ø€ Ù˜i©°'°Ó);Ó<Ð<r“   ©r¼   rv   )rh   ru   r@  rÖ  Úmasked)rÏ   rë  Úreduction_blockr  Úindex_dtyperL  rœ  r  Ú
block_sizeÚdefaultr  Ú	need_maskr·  rÒ   s         @@€€€€€€r‘   Ú
wrapper_fnz5Reduction._multilayer_wrap_loader.<locals>.wrapper_fn¹  s…   ú€ ð "1Ñˆ_Ø*/Ñ'ˆY˜Ø  ?Ñ2°_ÑDˆG÷=ð =ñ Ü-¨oÓ>�Ü—v‘vÜ—N‘N 7¨KÓ8Ü—N‘N ?°KÓ@ó�ô —z‘z $¨¨gÓ6Ð6á“v�r“   )rÏ   úSequence[Symbol]rë  r"  r¼   rv   )
r  ÚViewÚdynamic_reshape_indexerrw   r  r  rô  r°   r0  rF   )rÔ  r  rh  r·  rÈ  r  r  r¸  Údense_indexr!  r   rÒ   s    ` ` ``   @@r‘   Ú_multilayer_wrap_loaderz!Reduction._multilayer_wrap_loader¤  s–   ý€ ð ×>Ñ>Ø˜Zó
ˆô ×.Ñ.Ø˜Ð/°ó
ˆô Ÿ™×(Ñ(×>Ñ>Ü�H‰H”S˜¨%Ó0°!Ó4ó
ð 
ˆ	ð	Ø#ð	Ø6Fð	à÷	ò 	ð( Ðr“   c                ó¶   ‡‡‡— t        d„ ‰D «       «      s
J d‰›�«       ‚t        j                  |t        |«      t        |«      z   «      Š	 	 	 	 	 	 dˆˆˆfd„}|S )Nc              3  ó&   K  — | ]	  }|d k(  –— Œ y­w)rI   Nr¦   ©rè   rÖ  s     r‘   rê   zDReduction._multilayer_wrap_loader_existing_ranges.<locals>.<genexpr>Ø  s   è ø€ Ò3˜a�1˜•6Ñ3ùó   ‚z8Only enabled for numel_hint == 1, found original_ranges=c           	     ó„   •— | d t        ‰«       }| t        ‰«      d  } ‰| ‰t        |«      t        |«      z   «      «      S rŒ   )rÍ   rª   )Úmerged_indexÚnew_reduction_indexÚoriginal_idxr  r  Úoriginal_rangesrÒ   s       €€€r‘   r!  zEReduction._multilayer_wrap_loader_existing_ranges.<locals>.wrapper_fnß  sQ   ø€ ð (Ð(>¬#¨oÓ*>Ð?ˆLØ$¤S¨Ó%9Ð%;Ð<ˆIÙØÙœ˜iÓ(¬5Ð1DÓ+EÑEÓFóð r“   )r,  r  r-  r  r¼   rv   )rì   r#  r$  rª   )rÔ  r  r/  Úoriginal_reduction_rangesrÂ  rÃ  r!  rÒ   s    ``    @r‘   Ú'_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ó
ˆð		Ø(ð		à!/ð		ð ÷		ð Ðr“   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Œ   r¦   )rÏ   rë  Úintermediate_loaders     €r‘   Úintermediate_fnz;Reduction.create_multilayer_helper.<locals>.intermediate_fn  s   ø€ ñ 'Ð'A¨Ð'A°Ð'AÓBÐBr“   Nr  )rÏ   ra  rë  ra  r¼   rv   )r  Úfloat16Úbfloat16r	  rg  r�  rø  r  rw   r  r  r	  rr   r  rÍ   rˆ   )rÔ  r  r¶  ri  r!  r/  r0  rÂ  rÃ  rR  rÈ  rj  Úintermediate_dtypeÚintermediater6  r‡  r5  s                   @r‘   Úcreate_multilayer_helperz"Reduction.create_multilayer_helperì  s(  ø€ ð0 ¤§¡´·±Ð ?Ñ?ñ ä—‘ð 	ô
 !×'Ñ'ØØØØØØ ØØó	
ˆð 	×ÑÔØ*×6Ñ6Ó8Ðð	CØ%ð	CØ8Jð	Càõ	Cô
 —W‘W×%Ñ%×7Ñ7¼ÀoÓ8VÓWˆ
Ø×9Ñ9Ø�:˜~ó
ˆð  *Ð-C¬s°?Ó/CÐ"DÒDÐDÐDÜ×ÑÜØØØ(Ø&Ø!+¬C°Ó,@Ð,BÐ!CØ-Ø#Ø-ô	ó
ð 	
r“   c                óÎ   — t        |«      }t        ||dz
  z   |«      }| j                  ||«      }| j                  |||||||
«      }| j	                  ||||||g |¢|‘|g|||	«      S )r3  rI   )rr   rC   r  r&  r;  )rÔ  r  r¶  ri  rµ  r¶  rh  rR  rÈ  rj  r¸  r·  r  r  r!  s                  r‘   rú  zReduction.create_multilayer,  s�   € ô& (Ð(8Ó9ˆÜ˜o°¸±Ñ;¸UÓCˆ
Ø×#Ñ# N°IÓ>ˆØ×0Ñ0ØØØØØØØó
ˆ
ð ×+Ñ+ØØØØØØØˆfÐ�eÐØˆLØØØó
ð 	
r“   c                ój   — | j                  |||||«      }| j                  ||||||g |¢|¢||	d|
«      S )r3  r2  )r1  r;  )rÔ  r  r¶  ri  rµ  r/  r0  rÂ  rÃ  rR  rj  r!  s               r‘   rù  z+Reduction.create_multilayer_existing_rangesZ  sc   € ð$ ×@Ñ@ØØØ%ØØ ó
ˆ
ð ×+Ñ+ØØØØØØ%Ø+ˆoÐ+ 
Ð+Ø ØØØó
ð 	
r“   ro  rr  r   r`  rd  )
r  re  r  r#  r  r  rw  r"  r¼   r½   r{  ©r¼   zSequence[Sequence[Expr]]r€  rŒ   )r  rj  r¶  r\  ri  r\  rµ  zCallable[_P, OpsValue]r¶  ra  rh  ra  rR  zReductionType | Literal['scan']r·  r    r¸  úIRNode | Noner¼   útuple[ReductionHint, _IntLike])
rµ  z<Callable[[Sequence[_IntLike], Sequence[_IntLike]], OpsValue]rh  ra  rR  rÈ   ri  r\  r¼   z(Callable[[Sequence[_IntLike]], OpsValue])r  rj  r¶  r\  ri  r\  rµ  r´  r¶  ra  rh  ra  rR  rZ   rj  r^   r¸  r?  r¼   rˆ   ©rR  rÈ   r  r\  r¼   ú_NumLike | Sequence[_NumLike])rÈ  rƒ   r‡  rŽ   rj  r^   r¼   r^   )r·  rƒ   r¸  r?  r¼   r€  )r  úCallable[..., OpsValue]rh  ra  r·  rƒ   rÈ  rƒ   r  rƒ   r  rB  r¸  r?  r¼   úCallable[..., object])r  ú4Callable[[Sequence[Expr], Sequence[Expr]], OpsValue]r/  r  r0  r  rÂ  úSequence[Integer]rÃ  rF  r¼   rE  )r  rj  r¶  r\  ri  r\  r!  r´  r/  r  r0  r  rÂ  ú
list[Expr]rÃ  úlist[Integer]rR  rZ   rÈ  rƒ   rj  r^   r¼   rˆ   )r  rj  r¶  r\  ri  r\  rµ  r´  r¶  ra  rh  ra  rR  rZ   rÈ  rƒ   rj  r^   r¸  r?  r¼   rˆ   )r  rj  r¶  r\  ri  r\  rµ  r´  r/  ra  r0  ra  rÂ  rH  rÃ  rH  rR  rZ   rj  r^   r¼   rˆ   ) r¢   r£   r¤   r¥   rÉ  r  rb   r>  rB  r@  rv  ry  râ  r½  rH  r…  rÊ  rÞ  r  r^   r€  r�  r
  r  r  r  r&  r1  r;  rú  rù  Ú__classcell__©rp  s   @r‘   rg  rg  $  sö  ø… à(Ó(Ø!Ó!àÓØ!Ó!óNð €Há˜KÓ(õ
ó )ð
ó
%ó#ðLàðLð 3ðLð ð	Lð
 )ðLð 
óLó=óô

ó
ð ð %)ðRØðRàðRð ðRð )ð	Rð
 #ðRð -ðRð 8ðRð ðRð "ðRð 
(òRó ðRðh ð7ØNð7à,ð7ð ð7ð ð	7ð
 
2ò7ó ð7ðr ð )6×(=Ñ(=Ø$(ðNàðNð ðNð ð	Nð
 %ðNð #ðNð -ðNð &ðNð &ðNð "ðNð 
òNó ðNð` ðØðØ$/ðà	&òó ðð> ðDØðDØ$/ðDà	&òDó ðDð ðØðØ%(ðØ:Gðà	òó ðð  ðØ&ðØ4Aðà	òó ðð> ð %)ð(à'ð(ð -ð(ð "ð	(ð
 ð(ð ð(ð /ð(ð "ð(ð 
ò(ó ð(ðT ðàDðð (ðð $2ð	ð
 &ðð 0ðð 
>òó ðð8 ð=
àð=
ð ð=
ð ð	=
ð
 'ð=
ð (ð=
ð $2ð=
ð ð=
ð ,ð=
ð &ð=
ð ð=
ð &ð=
ð 
ò=
ó ð=
ð~ ð %)ð+
àð+
ð ð+
ð ð	+
ð
 %ð+
ð #ð+
ð -ð+
ð &ð+
ð ð+
ð &ð+
ð "ð+
ð 
ò+
ó ð+
ðZ ð$
àð$
ð ð$
ð ð	$
ð
 %ð$
ð ,ð$
ð $6ð$
ð "ð$
ð ,ð$
ð &ð$
ð &ð$
ð 
ò$
ó ô$
r“   rg  c                ó   ‡ ‡‡— dˆˆ ˆfd„}|S )ú1A closure containing math to read a given elementc                ó¼   •— ‰�t        | «      t        ‰«      k(  sJ ‚t        | «      t        ‰«      k(  sJ ‚‰}t        | ‰‰«      D ]  \  }}}|dk7  sŒ|||z  z   }Œ |S rØ  )rÍ   rÖ   )rÏ   Úresultró   ÚstÚszrQ  r  r  s        €€€r‘   r  z_fixed_indexer.<locals>.indexer‰  ss   ø€ ØÐ!¤c¨%£j´C¸³KÒ&?Ð?Ð?Ü�5‹zœS ›YÒ&Ð&Ð&ØˆÜ˜u f¨dÓ3ò 	+‰KˆC��RØ�Q‹wØ #¨¡(Ñ*‘ð	+ð ˆr“   )rÏ   ra  r¼   r    r¦   )r  r  rQ  r  s   ``` r‘   rÝ  rÝ  ‚  s   ú€ ÷ð €Nr“   ÚINNER_FN_TYc                  ó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 )NrI   r   c                ó2   •‡ ‡— t        ˆ ˆfd„‰D «       «      S )Nc              3  ó0   •K  — | ]  } |‰‰«      –— Œ y ­wrŒ   r¦   )rè   rÆ   ró   Úreduction_idxs     €€r‘   rê   z@MultiOutputReduction.__init__.<locals>.loader.<locals>.<genexpr>²  s   øè ø€ ÒH¸™R  ]×3ÑHùrÏ  ©rª   )ró   rX  Ú	inner_fnss   ``€r‘   r  z-MultiOutputReduction.__init__.<locals>.loader¯  s   ú€ ô ÔH¸iÔHÓHÐHr“   r  )ró   r  rX  r  r¼   útuple[OpsValue, ...])ÚcallablerÍ   rn  Ú__init__rT  )r‘  r  r¶  rZ  r¶  rh  rR  ri  rj  rT  r  rp  s      `       €r‘   r]  zMultiOutputReduction.__init__›  s‚   ù€ ô �IÔØ"˜ˆIô ˆy‹>˜QÒØ˜q‘\‰FðIØ#ðIØ4BðIà%õIô
 	‰ÑØØØØØ-Ø)ØØ)ð 	ô 		
ð )ˆÕr“   c           	     ó:  — t        j                  | j                  | j                  | j                  | j                  ||«      «      }t        |t        t        f«      sJ t        |«      «       ‚|| j                     }t        j                  |xs d ||«      |«      S r  )ru   ru  r  ri  rR  rµ  r�   rª   r©   r·   rT  rv  )r‘  r  r  r  rw  r¬   r  s          r‘   rv  z$MultiOutputReduction.store_reductionÀ  s„   € ô —‘Ø�J‰JØ�N‰NØ×ÑØ�M‰M˜$ Ó/ó	
ˆô ˜&¤5¬$ -Ô0Ð>´$°v³,Ó>Ð0Ø�t×(Ñ(Ñ)ˆÜ×"Ñ" ;Ò#;°)¹WÀT»]ÈEÓRÐRr“   )r  rj  r¶  r\  rZ  z#INNER_FN_TY | Sequence[INNER_FN_TY]r¶  rF  rh  rF  rR  rZ   ri  r\  rj  r^   rT  rŽ   )
r  re  r  r#  r  r  rw  r"  r¼   r   )r¢   r£   r¤   r¥   r]  rv  rI  rJ  s   @r‘   rS  rS  ˜  s¢   ø… ØÓð#)àð#)ð ð#)ð 7ð	#)ð
 "ð#)ð ,ð#)ð &ð#)ð ð#)ð &ð#)ð õ#)ðJSàðSð 3ðSð ð	Sð
 )ðSð 
÷Sr“   rS  c                  ób   — e Zd ZdZeej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zy)ÚArgReductionzJMulti-output arg reduction that returns both the selected value and index.Nc
                óÄ  ‡ ‡‡‡‡‡‡‡‡‡— ‰dv sJ ‚t         j                  j                  j                  t	        ‰«      «      }
|
dk(  rt        ‰› d�«      ‚|
dk(  r]dˆˆfd„}dd„}t        j                  ‰||t        ‰«      ¬«      t        j                  ‰t        j                  |t        ‰«      ¬«      fS t        |
t        «      rŒt        |
«      t        j                  k  rpt	        ‰«      dk7  st!        ‰j"                  «      rMt$        j'                  ‰‰‰‰«      Šdˆfd„Št)        ˆˆˆfd	„t+        |t        j                  f«      D «       «      S t$        j-                  ‰|‰‰‰‰‰|
|	«	      \  }}|dk(  sJ d
«       ‚‰t.        j0                  k(  r|Št)        ˆ ˆˆˆˆˆˆˆfd„t+        |t        j                  f«      D «       «      }|D ]  }|j3                  «        Œ |S )N)r=  r>  r   rã  rI   c                óœ   •— ‰D �cg c]  }t         j                  j                  ‘Œ }} ‰| |«      }t        |t        «      r|d   S |S c c}w rò  )r°   rÙ  rÚ  r�   rª   )rÏ   rù   rë  r  rµ  rh  s       €€r‘   rÎ  z%ArgReduction.create.<locals>.value_fnë  sH   ø€ Ø9IÖ"J°A¤5§7¡7§<£<Ð"J�Ð"JÙ  ¨Ó8�Ü˜e¤UÔ+Ø  ™8�OØ�ùò	 #Ks   †!A	c                óJ   — t        j                  dt        j                  «      S rò  )ru   r  r  r×  )rÏ   s    r‘   Úindex_fnz%ArgReduction.create.<locals>.index_fnò  s   € Ü—|‘| A¤u§{¡{Ó3Ð3r“   r   c                óB   •—  ‰| «      }t        |t        «      sJ ‚||   S rŒ   )r�   rª   )rÏ   rT  rN  Úunrolled_fns      €r‘   Úprojectz$ArgReduction.create.<locals>.project	  s(   ø€ Ù$ UÓ+�Ü! &¬%Ô0Ð0Ð0Ø˜lÑ+Ð+r“   c           	   3  ó~   •K  — | ]4  \  }}t         j                  ‰|t        ‰|¬ «      t        ‰«      ¬«      –— Œ6 y­w))rT  r   N)r  r�  r   r©   )rè   rT  r  r  rg  r¶  s      €€€r‘   rê   z&ArgReduction.create.<locals>.<genexpr>	  sF   øè ø€ ò ñ (�L %ô × Ñ Ø!ØÜ$ W¸<ÔHÜ ›<ð	 !÷ ñùs   ƒ:=z.arg reductions do not support split reductionsc              3  ój   •K  — | ]*  \  }}t         j                   ‰‰|‰‰‰‰	‰
‰|«	      «      –— Œ, y ­wrŒ   rŽ  )rè   rT  r  rÔ  r  rµ  r¶  rj  rh  rR  ri  s      €€€€€€€€r‘   rê   z&ArgReduction.create.<locals>.<genexpr>+	  sM   øè ø€ ò 
ñ $�˜eô ×ÑÙØØØØØ$Ø"ØØ"Ø ó
÷ñ
ùó   ƒ03©rÏ   r  r¼   rv   )rÏ   r  rT  rŽ   r¼   rv   )rw   r  r  r÷  rr   ÚAssertionErrorr  r�  r©   r  r×  r�   r!   rŽ   rJ   rø  rn   r·   rg  rÞ  rª   rò   rÊ  r^   r€  rø  )rÔ  r  r¶  ri  rµ  r¶  rh  rR  rj  r¸  r·  rÎ  rd  r   rÈ  ÚresultsrN  rg  rf  s   `` ``````        @@r‘   r�  zArgReduction.createÕ  sè  ÿù€ ð Ð!KÑKÐKÐKÜŸ'™'×*Ñ*×3Ñ3´MÐBRÓ4SÓTˆØ˜aÒÜ Ø!Ð"Ð"LÐMóð ð ˜aÒöó4ô × Ñ Ø!Ø#Ø%Ü ›<ð	 !ó ô × Ñ Ø!ÜŸ+™+Ø%Ü ›<ð	 !ó ðð ô  �¬Ô0Ü�OÓ$¤v×'IÑ'IÒIÜ˜vÓ&¨!Ò+¬v°f·k±kÔ/Bä#×8Ñ8ØÐ*¨N¸IóˆKõ,ô
 õ ô ,5°iÄÇÁÐ5MÓ+Nôó ð ô  ×*Ñ*ØØØØØØØØØó

‰ˆˆeð ˜ŠzÐKÐKÓKˆzØœ]×2Ñ2Ò2Ø!ˆNä÷ 
ò 
ô (1°)¼U¿[¹[Ð1IÓ'Jô
ó 
ˆð  ò 	ˆFØ�N‰NÕð	àˆr“   )r  rj  r¶  r\  ri  r\  rµ  r´  r¶  r  rh  r  rR  rZ   rj  r^   r¸  r?  r¼   úSequence[TensorBox])r¢   r£   r¤   r‚  r  r^   r€  r�  r¦   r“   r‘   r`  r`  Ò  s“   „ ÙTàð )6×(=Ñ(=Ø$(ðgàðgð ðgð ð	gð
 %ðgð ðgð )ðgð &ðgð &ðgð "ðgð 
ògó ñgr“   r`  c                  óô   — e Zd ZdZeej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zeej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Ze	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Z	y)	ÚOnlineSoftmaxReductionzAMulti-output reduction that computes softmax max/sum in one pass.Nc
           	     óˆ   ‡‡‡‡‡‡‡— t        ˆˆˆˆˆˆˆfd„t        |«      D «       «      }
|
D ]  }|j                  «        Œ |
S )Nc              3  ój   •K  — | ]*  }t         j                  t        ‰‰‰‰‰d ‰‰|«	      «      –— Œ, y­w)r  N)rˆ   r�  rS  )	rè   Ú
output_idxr  r¶  rµ  r¶  rj  rh  ri  s	     €€€€€€€r‘   rê   z:OnlineSoftmaxReduction._create_no_split.<locals>.<genexpr>P	  sI   øè ø€ ò 
ð ô ×ÑÜ$ØØØØØ$Ø+ØØ"Øó
÷ñ
ùrj  )rª   rÎ   rø  )rÔ  r  r¶  ri  rµ  r¶  rh  Ú
num_outputrj  r¸  rm  r  s    `````` `   r‘   Ú_create_no_splitz'OnlineSoftmaxReduction._create_no_splitC	  sG   þ€ ô ÷ 
ñ 
ô $ JÓ/ô
ó 
ˆð  ò 	ˆAØ�I‰I�Kð	àˆr“   c
                óB  — t         j                  j                  j                  t	        |«      «      }
t
        j                  ||||||d|
|	¬«	      \  }}|t        j                  k(  r|}|dkD  r| j                  ||||||||||	«
      S | j                  |||||||||	«	      S )Nr  )rR  r·  r¸  rI   )rw   r  r  r÷  rr   rg  rÊ  r^   r€  rú  ru  )rÔ  r  r¶  ri  rµ  r¶  rh  rt  rj  r¸  r·  r   rÈ  s                r‘   r�  zOnlineSoftmaxReduction.created	  sÕ   € ô Ÿ'™'×*Ñ*×3Ñ3´MÐBRÓ4SÓTˆÜ×*Ñ*ØØØØØØØ2Ø+Ø!ð +ó 

‰ˆˆeð œ]×2Ñ2Ò2Ø!ˆNØ�1Š9Ø×(Ñ(ØØØØØØ ØØØØóð ð ×#Ñ#ØØØØØØØØØó

ð 
	
r“   c           
     ó  ‡‡‡‡‡‡‡— t        |«      Št        ‰|dz
  z   |«      Š| j                  ‰|
«      }t        j	                  |‰g|«      Št
        j                  j                  j                  t        j                  t        ‰|«      d«      «       Š	 	 	 	 	 	 dˆˆˆˆˆˆfd„}|t        j                  t        j                  fvr|nt        j                  }| j!                  ||‰|g |¢|‘‰g||	«      }|D ]  }|j#                  «        Œ t%        d„ |D «       «      Š	 	 	 	 	 	 dˆfd„}t
        j                  j                  j'                  t        |«      «      }| j)                  |||	«      }	| j!                  ||||||g||	«      S )NrI   r   c           	     ó¦  •‡‡— |\  }| �^ Š}‰	|z  |z   Šdˆˆ
ˆˆfd„}t        j                  d‰«      }‰r”t        ‰«      }t        j                  t        j                  ‰|«      t        j                  ‰|«      «      }t        j
                  ||t        d«      «      t        j                  ||t        j                  d‰«      «      fS  |«       |fS )Nc                 ó$   •—  ‰‰ ‰‰ g«      «      S rŒ   r¦   )rœ  rµ  r  rÒ   s   €€€€r‘   r  zJOnlineSoftmaxReduction.create_multilayer.<locals>.wrapper_fn.<locals>.body¹	  s   ø€ Ù 	©7°G°9Ó+=Ó>Ð>r“   rI   r  r   r  )ru   r  rh   r@  rÖ  r  r	  rE  )rÏ   rë  r  r  r	  r  rL  rœ  r  r  rµ  r   r·  rÒ   ri  s          @@€€€€€€r‘   r!  z<OnlineSoftmaxReduction.create_multilayer.<locals>.wrapper_fn²	  sÂ   ú€ ð "1Ñˆ_Ø*/Ñ'ˆY˜Ø  ?Ñ2°_ÑDˆG÷?ð ?ô —,‘,˜q )Ó,ˆCÙÜ-¨oÓ>�Ü—v‘vÜ—N‘N 7¨KÓ8Ü—N‘N ?°KÓ@ó�ô
 —J‘J˜t T¬5°«=Ó9Ü—I‘I˜d C¬¯©°a¸Ó)CÓDðð ñ
 “v˜s�{Ð"r“   c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wrŒ   )r  ©rè   rÐ   s     r‘   rê   z;OnlineSoftmaxReduction.create_multilayer.<locals>.<genexpr>Ü	  s   è ø€ Ò$L¸ Q§]¡]§_Ñ$Lùó   ‚c                ó2   •‡ ‡— t        ˆ ˆfd„‰D «       «      S )Nc              3  ó6   •K  — | ]  } |g ‰¢‰¢«      –— Œ y ­wrŒ   r¦   )rè   r  rÏ   rë  s     €€r‘   rê   zTOnlineSoftmaxReduction.create_multilayer.<locals>.intermediate_fn.<locals>.<genexpr>á	  s&   øè ø€ ò Ø7=‘Ð1˜Ð1 Ð1×2ñùr»  rY  )rÏ   rë  Úintermediate_loaderss   ``€r‘   r6  zAOnlineSoftmaxReduction.create_multilayer.<locals>.intermediate_fnÞ	  s   ú€ ô ô ØAUôó ð r“   )rÏ   r"  rë  r"  r¼   rc  )rÏ   ra  rë  ra  r¼   r[  )rr   rC   r  r#  r$  rw   r  r  rô  r°   r0  rF   r  r7  r8  r	  ru  rø  rª   r	  r  )rÔ  r  r¶  ri  rµ  r¶  rh  rt  rÈ  rj  r¸  r%  r!  r9  ÚintermediatesrÐ   r6  r‡  r  r  r   r·  rÒ   s      ``             @@@@@r‘   rú  z(OnlineSoftmaxReduction.create_multilayer˜	  s½  þ€ ô (Ð(8Ó9ˆÜ˜o°¸±Ñ;¸UÓCˆ
Ø×>Ñ>Ø˜Zó
ˆô ×.Ñ.Ø˜Ð/°ó
ˆô Ÿ™×(Ñ(×>Ñ>Ü�H‰H”S˜¨%Ó0°!Ó4ó
ð 
ˆ	ð	#Ø#ð	#Ø6Fð	#à&÷	#ò 	#ð4 ¤§¡´·±Ð ?Ñ?ñ ä—‘ð 	ð
 ×,Ñ,ØØØØØˆfÐ�eÐØˆLØØó	
ˆð ò 	ˆAØ�I‰I�Kð	ô  %Ñ$L¸mÔ$LÓLÐð	Ø%ð	Ø8Jð	à!õ	ô —W‘W×%Ñ%×7Ñ7¼ÀfÓ8MÓNˆ
Ø×9Ñ9Ø�:˜~ó
ˆð ×#Ñ#ØØØØØØˆGØØó	
ð 		
r“   )r  rj  r¶  r\  ri  r\  rµ  r´  r¶  r  rh  r  rt  rŽ   rj  r^   r¸  r?  r¼   rn  rŒ   )r  rj  r¶  r\  ri  r\  rµ  r´  r¶  r  rh  r  rt  rŽ   rÈ  rƒ   rj  r^   r¸  r?  r¼   rn  )
r¢   r£   r¤   r‚  r  r^   r€  ru  r�  rú  r¦   r“   r‘   rp  rp  @	  sŸ  „ ÙKàð )6×(=Ñ(=Ø$(ðàðð ðð ð	ð
 %ðð ðð )ðð ðð &ðð "ðð 
òó ðð@ ð )6×(=Ñ(=Ø$(ð1
àð1
ð ð1
ð ð	1
ð
 %ð1
ð ð1
ð )ð1
ð ð1
ð &ð1
ð "ð1
ð 
ò1
ó ð1
ðf ð %)ðZ
àðZ
ð ðZ
ð ð	Z
ð
 %ðZ
ð ðZ
ð )ðZ
ð ðZ
ð ðZ
ð &ðZ
ð "ðZ
ð 
òZ
ó ñZ
r“   rp  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                  rJ d«       ‚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  rT  zGwelford reduction usage is explicitly disabled, please check you configc                óX   •‡ — dˆˆ fd„}t         j                  ‰‰|t        ‰«      ¬«      S )Nc                ó0   •— t        j                  ‰‰«      S rŒ   rå  )ró   r  rá  s    €€r‘   rµ  z8WelfordReduction.create.<locals>.const.<locals>.inner_fn

  s   ø€ Ü—|‘|ØØóð r“   r   ©ró   r  r¼   rv   ©r  r�  r©   )rá  rµ  r  r  r¶  s   ` €€€r‘   Úconstz&WelfordReduction.create.<locals>.const	
  s2   ù€ öô ×#Ñ#ØØØ!Ü˜F“|ð	 $ó ð r“   r   rI   c                óX   •‡ — dˆ ˆfd„}t         j                  ‰‰|t        ‰«      ¬«      S )Nc                ón   •— ‰D �cg c]  }t         j                  j                  ‘Œ }} ‰| |«      S c c}w rŒ   rê  )ró   rù   rë  r  rh  s      €€r‘   rµ  z7WelfordReduction.create.<locals>.copy.<locals>.inner_fn"
  s1   ø€ Ø=MÖ&N¸¤u§w¡w§|£|Ð&N�OÐ&NÙ! # Ó7Ð7ùò 'Orì  r   r†  r‡  )r  rµ  r  r  r¶  rh  s   ` €€€€r‘   Úcopyz%WelfordReduction.create.<locals>.copy
  s2   ù€ ö8ô !×'Ñ'Ø!ØØ%Ü ›<ð	 (ó ð r“   r  c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrŒ   r¦   )rè   rÆ   r‹  s     €r‘   rê   z*WelfordReduction.create.<locals>.<genexpr>0
  s   øè ø€ Ò:¨"™T "ŸXÑ:ùó   ƒ)rR  r·  rá   )rá  rŽ   r¼   rˆ   )r  rE  r¼   rˆ   )rJ   ÚmtiaÚdisable_welford_reductionrw   r  r  r÷  rr   rª   rg  rÊ  r^   r€  rú  rÎ   rˆ   r�  r‚  rø  )rÔ  r  r  rZ  r¶  rh  rR  rj  r·  rˆ  ÚmeanÚm2Úweightr   rÈ  rs  rm  r  r‹  s    `` ``            @r‘   r�  zWelfordReduction.create÷	  sÛ  ü€ ð Ð!FÑFÐFÐFÜ—;‘;×8Ò8ð 	
ØUó	
Ð8ô Ÿ'™'×*Ñ*×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   Ä0-E8c                 ó   — y)N)r   r   r   r¦   r  s     r‘   r  zWelfordReduction.default_values
  s   € ð r“   c	                ó  ‡ ‡‡‡‡‡‡— t        ‰«      Št        j                  j                  j	                  t        j                  t        ‰‰«      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 )r3  r   rT  c                ó0   •— t        j                  |‰«      S rŒ   rå  )ró   rX  r  r  s      €r‘   r  z4WelfordReduction.create_multilayer.<locals>.constant’
  s   ø€ ô —|‘| E¨5Ó1Ð1r“   r  rI   )r  r  rZ  r¶  rh  rR  rÈ  rj  c           	   3  óL   •K  — | ]  }‰j                  |‰‰‰‰d ¬«      –— Œ y­w)r   ©r  N)r&  )rè   r  r  rÔ  r·  rh  rÈ  s     €€€€€r‘   rê   z5WelfordReduction.create_multilayer.<locals>.<genexpr>ª
  s=   øè ø€ ò 
ð ð ×+Ñ+ØØ$Ø#ØØØð ,÷ ñ
ùs   ƒ!$c                ó   —  |g | ¢|¢«      S rŒ   r¦   )rÏ   rë  r  s      r‘   Úintermediate_loader_fnzBWelfordReduction.create_multilayer.<locals>.intermediate_loader_fn½
  s   € ñ
 Ð4˜EÐ4 OÐ4Ó5Ð5r“   c              3  óT   •K  — | ]  }t        ‰|j                  «       ¬ «      –— Œ! y­w))r  N)r   r  )rè   rÐ   r™  s     €r‘   rê   z5WelfordReduction.create_multilayer.<locals>.<genexpr>Í
  s*   øè ø€ ò àô Ð.°q·}±}³×GÐGñùó   ƒ%()ró   r  rX  r  r  rŽ   r¼   rv   )rÏ   r  rë  r  r  rl  r¼   rv   )rr   rw   r  r  rô  r°   r0  rF   rú  r   rC   r‚  r�  rª   rø  r	  r  )rÔ  r  r  rZ  r¶  rh  rR  rÈ  rj  r   r  r€  rÐ   r‡  r  r™  r·  s   ` `  ` `      @@@r‘   rú  z"WelfordReduction.create_multilayery
  sà  þ€ ô  (Ð(8Ó9ˆÜŸ™×(Ñ(×>Ñ>Ü�H‰H”S˜¨%Ó0°!Ó4ó
ð 
ˆ	ñ ˜Ð+<Ò<ð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×%Ñ%×7Ñ7¼ÀfÓ8MÓNˆ
Ø×9Ñ9Ø�:˜~ó
ˆô  ×&Ñ&ØØÜó à&ôó ð ØˆGàØó
ð 	
r“   N)r  rj  r  r\  rZ  úSequence[Callable[..., Any]]r¶  rH  rh  rH  rR  rZ   rj  r^   r¼   rn  rA  )r  rj  r  r\  rZ  rœ  r¶  rH  rh  rH  rR  rZ   rÈ  rƒ   rj  r^   r¼   rn  )
r¢   r£   r¤   r  r^   r€  r�  r…  r  rú  r¦   r“   r‘   r‚  r‚  ö	  s  „ Øð )6×(=Ñ(=ðyàðyð ðyð 0ð	yð
 ðyð (ðyð &ðyð &ðyð 
òyó ðyðv ðØðØ$/ðà	&òó ðð
 ð\
àð\
ð ð\
ð 0ð	\
ð
 ð\
ð (ð\
ð &ð\
ð ð\
ð &ð\
ð 
ò\
ó ñ\
r“   r‚  c                  óx  ‡ — 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<    ed «      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d„Zeej"                  fddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'd„«       Zˆ xZS )(ÚScanrH  Úscan_rangesr  ú=Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]]rÓ  zFCallable[[Sequence[_IntLike], Sequence[_IntLike]], Sequence[_IntLike]]rÒ   r^   rj  rŽ   rT  útuple[torch.dtype, ...]Údtypesútuple[Callable[..., Any], ...]rZ  c                óÐ   •‡— t         ‰| �  ‰«       t        «       j                  ˆfd„| j                  D «       Ž z   t        «       j                  ˆfd„| j
                  D «       Ž z  S )Nc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrŒ   r(   r¹  s     €r‘   rê   z,Scan.get_free_symbol_uses.<locals>.<genexpr>ï
  ó   øè ø€ ÒO¸Ô" 1 m×4ÑOùr»  c              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrŒ   r(   r¹  s     €r‘   rê   z,Scan.get_free_symbol_uses.<locals>.<genexpr>ò
  ó   øè ø€ ÒH¸Ô" 1 m×4ÑHùr»  )rn  r>  r@   r¼  rŸ  r  ro  s    `€r‘   r>  zScan.get_free_symbol_usesç
  sa   ù€ ô ‰GÑ(¨Ó7Ø Œj‹l× Ñ ÛO¸d×>NÑ>NÔOðñð !Œj‹l× Ñ ÛH¸d¿i¹iÔHðñ	ð	
r“   c                ó¨   •— t        | j                  «      t        | j                  «      z   t        | j                  «      k(  sJ ‚t        ‰| �  «        y rŒ   )rÍ   r¶  rŸ  r  rn  rš  ©r‘  rp  s    €r‘   rš  zScan.__post_init__ö
  ó=   ø€ Ü�4—;‘;Ó¤# d×&6Ñ&6Ó"7Ñ7¼3¸t¿y¹y»>ÒIÐIÐIÜ‰ÑÕr“   c                ó  ‡— | j                  ||«      Št        ˆfd„| j                  D «       «      }t        j                  | j
                  | j                  |«      }t        j                  |xs d |‰«      || j                     «      S )Nc              3  ó.   •K  — | ]  } |‰«      –— Œ y ­wrŒ   r¦   ©rè   rµ  ró   s     €r‘   rê   z'Scan.store_reduction.<locals>.<genexpr>  ó   øè ø€ ÒD¨‘x —}ÑDùr�  r  )	rÒ   rª   rZ  ru   r‚  r¢  rÓ  r  rT  )r‘  r  r  r  Ú	scan_varsr¬   rN  ró   s          @r‘   rv  zScan.store_reductionú
  so   ø€ ð �l‰l˜4 Ó+ˆÜÓD°T·^±^ÔDÓDˆÜ—‘˜$Ÿ+™+ t§¡¸Ó?ˆÜ�y‰yØÒ$˜9¡g¨c£l°F¸4×;LÑ;LÑ4Mó
ð 	
r“   c                 ó   — y)NÚcustomr¦   r�  s    r‘   r@  zScan.get_reduction_type  s   € àr“   c                ó   — | j                   S rŒ   )rŸ  r�  s    r‘   rB  zScan.get_reduction_size  r«  r“   c                ó   — | j                   S rŒ   ©r  r�  s    r‘   r
  zScan.get_size  ó   € Ø�y‰yÐr“   c                ó   — | j                   S rŒ   rÇ  r�  s    r‘   rÑ  zScan.get_pointwise_size  rÍ  r“   c                óX   — t        | j                  «      t        | j                  «      z   S rŒ   )rÍ   r¶  rŸ  r�  s    r‘   ry  zScan.index_length  ó!   € Ü�4—;‘;Ó¤# d×&6Ñ&6Ó"7Ñ7Ð7r“   c                ó¶   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }|fS rŒ   )rÜ  r¶  rŸ  rH   r{  rÒ   ©r‘  rÏ   r|  ró   s       r‘   râ  zScan.inner_fn_args  óE   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×-Ñ-¬t¯}©}Ó=ˆØ�l‰l˜5 &Ó)ˆØˆvˆr“   c                óà   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }t        | j                  ||¬«      S rñ  )rÜ  r¶  rŸ  rH   r{  rÒ   rR   rµ  ©r‘  ri  rÏ   r|  ró   s        r‘   r½  zScan.inner_fn_free_symbols  óQ   € Ø—‘˜DŸK™KÓ(ˆØ—‘˜T×-Ñ-¬t¯}©}Ó=ˆØ�l‰l˜5 &Ó)ˆÜ# D§M¡M°3ÀmÔTÐTr“   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 )
NrI   r   r   )r  r  rµ  Ú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     €€€r‘   rÒ   zScan.create.<locals>.reindexh  óS   ø€ Ü�z“?¤c¨+Ó&6Ò6Ð6Ð6Ü�u“:¤Ð%5Ó!6Ò6Ð6Ð6Ø>�U˜5˜D�\Ð> JÐ>°°t°u°Ð>Ð>r“   )r  r  r¢  rµ  rZ  r  r¶  rŸ  rÓ  rÒ   rj  rT  )rÏ   r  rÇ  r  r¼   rG  r¦   )rw   r  r§  rL   ÚSCANrÍ   ÚTUPLE_REDUCTIONr  r÷  rr   rô  r°   r7  rÎ   r  r�  rÊ  rž  r  ÚversionÚhipÚ
has_tritonÚtriton_versionÚ	SplitScanrˆ   rø  )rÔ  r  r¢  rZ  r  rÂ  rÓ  rj  rÀ  rÄ   r  rÄ  rT  rÊ  Ú	scan_typeÚsupports_splitrÒ   rm  rN  rÃ  rŸ  s        `             @@r‘   r�  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Ò,Ð,Ð,ð ×)Ñ)¬%¯(©(°:¸qÓ*AÔBô %*¬#¨f«+Ó$6öð !ô × Ñ Ø!Ø  Ñ.Ø& |Ñ4Øð	 !õ òð ð &)§^¡^ØØ˜‘)Ø˜q‘\ØØ-Ø#Ø!Ø!ð &4ó 	&
Ñ"ˆ˜
ô ˆ	Ø˜Š>ô —‘×!Ñ! TÐ)ÒW¬jÒ.V¼^ÈwÑ=Vò%ô �v“; !Ñ#ð ñ "Ù'à ˜6¤C¨£KÑ/Ð/à!"‘Jä%�	÷	?ô. !&¤c¨&£kÓ 2ö%
ð$ ô# ×ÑÙð Ø!Ø  Ñ.Ø!Ø& |Ñ4Ø'ØØ+Ø +Ø)Ø#Ø#1Ø!-ñð ñõð
ˆð 
ð* ò 	ˆFØ�N‰NÕð	ð ˆùòAùòP
s   Ä)&IÇ85Ic	           
     óN   ‡‡— dˆˆfd„}	t         j                  ||||	||d|¬«      S )Nc                ó,   •—  ‰g | d ‰ ¢|¢| ‰d  ¢«      S rŒ   r¦   )ró   rX  rÂ  rµ  s     €€r‘   r!  z#Scan.num_splits.<locals>.wrapper_fn”  s*   ø€ ÙÐF˜c % 4˜jÐF¨=ÐF¸3¸t¸u¸:ÐFÓGÐGr“   r‚  )r  r¶  ri  rµ  r¶  rh  rR  r·  )ró   r  rX  r  r¼   rv   )rg  rÊ  )
rÔ  r  r  rµ  rÂ  rÃ  rŸ  rÓ  rÄ  r!  s
      ``     r‘   rÊ  zScan.num_splits‡  s;   ù€ ö	Hô ×#Ñ#ØØØØØ#Ø(Ø!Ø&ð $ó 	
ð 		
r“   rr  r   rS  )
r  re  r  z%Callable[[Sequence[_IntLike]], Never]r  r  r°  r"  r¼   r   rd  r~  r{  rÿ  )r  rj  r¢  r¡  rZ  z+tuple[Callable[[Sequence[Expr]], Any], ...]r  rH  rÂ  rŽ   rÓ  r   rj  r^   rÀ  r�   rÄ   r   r¼   úSequence[TensorBox | None])r  rj  r  r\  rµ  rl  rÂ  rŽ   rÃ  rH  rŸ  rH  rÓ  r   rÄ  r    r¼   r@  )r¢   r£   r¤   r¥   rb   r>  rš  rv  r@  rB  r
  rÑ  ry  râ  r½  r  r^   r€  r�  rÊ  rI  rJ  s   @r‘   rž  rž  Ù
  s±  ø… àÓØ
ÓØMÓMØSÓSØ!Ó!ØÓà#Ó#Ø-Ó-ñ ˜FÓ#õ
ó $ð
õ ð
àð
ð 7ð
ð ð	
ð
 $ð
ð 
ó
óó óóó8óôUð ð )6×(=Ñ(=ð`ð &*ñ`àð`ð (ð`ð ?ð	`ð
 ð`ð ð`ð Rð`ð &ð`ð #ð`ð ð`ð 
$ò`ó ð`ðD ð
àð
ð ð
ð 7ð	
ð
 ð
ð (ð
ð #ð
ð Rð
ð ð
ð 
(ò
ó ô
r“   rž  c                  ó   — e Zd Zy)rÏ  N)r¢   r£   r¤   r¦   r“   r‘   rÏ  rÏ  ¤  s   „ àr“   rÏ  c                  óF  ‡ — 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<    ed «      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d„Zeej"                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d%d„«       Zˆ xZS )&ÚSortrH  Úsort_rangesr  z:Callable[[Sequence[Expr], Sequence[Expr]], Sequence[Expr]]rÒ   r^   rj  rŽ   rT  r¡  r¢  r£  rZ  r�   ÚstableÚ
descendingc                óÐ   •‡— t         ‰| �  ‰«       t        «       j                  ˆfd„| j                  D «       Ž z   t        «       j                  ˆfd„| j
                  D «       Ž z  S )Nc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrŒ   r(   r¹  s     €r‘   rê   z,Sort.get_free_symbol_uses.<locals>.<genexpr>¿  r¦  r»  c              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrŒ   r(   r¹  s     €r‘   rê   z,Sort.get_free_symbol_uses.<locals>.<genexpr>Â  r¨  r»  )rn  r>  r@   r¼  rØ  r  ro  s    `€r‘   r>  zSort.get_free_symbol_usesº  sa   ù€ ô ‰GÑ(¨Ó7Ø Œj‹l× Ñ ÛO¸d×>NÑ>NÔOðñð !Œj‹l× Ñ ÛH¸d¿i¹iÔHðñ	ð	
r“   c                ó¨   •— t        | j                  «      t        | j                  «      z   t        | j                  «      k(  sJ ‚t        ‰| �  «        y rŒ   )rÍ   r¶  rØ  r  rn  rš  rª  s    €r‘   rš  zSort.__post_init__Æ  r«  r“   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Œ   r¦   r®  s     €r‘   rê   z'Sort.store_reduction.<locals>.<genexpr>Ò  r¯  r�  r  )
rÒ   rª   rZ  ru   Úsortr¢  rÙ  rÚ  r  rT  )r‘  r  r  r  rw  r¬   rN  ró   s          @r‘   rv  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ó
ð 	
r“   c                 ó   — y)Nrá  r¦   r�  s    r‘   r@  zSort.get_reduction_typeØ  s   € Ør“   c                ó   — | j                   S rŒ   )rØ  r�  s    r‘   rB  zSort.get_reduction_sizeÛ  r«  r“   c                ó   — | j                   S rŒ   rµ  r�  s    r‘   r
  zSort.get_sizeÞ  r¶  r“   c                ó   — | j                   S rŒ   rÇ  r�  s    r‘   rÑ  zSort.get_pointwise_sizeá  rÍ  r“   c                óX   — t        | j                  «      t        | j                  «      z   S rŒ   )rÍ   r¶  rØ  r�  s    r‘   ry  zSort.index_lengthä  r¹  r“   c                ó¶   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }|fS rŒ   )rÜ  r¶  rØ  rH   r{  rÒ   r»  s       r‘   râ  zSort.inner_fn_argsç  r¼  r“   c                óà   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }t        | j                  ||¬«      S rñ  )rÜ  r¶  rØ  rH   r{  rÒ   rR   rµ  r¾  s        r‘   r½  zSort.inner_fn_free_symbolsí  r¿  r“   c	                ó  ‡‡‡— g |d ‰ ¢|‰dz   d  ¢Š|‰   gŠt         j                  j                  |t        j                  «      sd gt        |«      z  S t         j                  j                  }
|
j                  t        ‰«      «      }t        j                  j                  rt        j                  j                  }nCd}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 )NrI   r  r   c                ó„   •— t        |«      t        ‰«      k(  sJ ‚t        | «      t        ‰«      k(  sJ ‚g | d ‰ ¢|¢| ‰d  ¢S rŒ   rÆ  )rÏ   Ú
sort_indexrÂ  rÃ  rØ  s     €€€r‘   rÒ   zSort.create.<locals>.reindex'  rÈ  r“   )r  r  r¢  rµ  rZ  r  r¶  rØ  rÒ   rj  rT  rÙ  rÚ  )rÏ   r  rë  r  r¼   rG  r¦   )rw   r  r§  rL   ÚSORTrÍ   r  r÷  rr   rJ   r%  Údecompose_sort_opsÚpersistent_reductionsrô  r°   r7  rÎ   r  r�  rˆ   r×  rø  )rÔ  r  r¢  rZ  r  rÂ  rÙ  rÚ  rj  rÄ   r  Ú
sort_numelÚis_persistent_kernelÚ
max_rblockrT  rÒ   rm  rN  rÃ  rØ  s        `            @@r‘   r�  zSort.createó  s  ú€ ð =˜T % 4˜[Ð<¨4°°q±°
Ð+;Ð<ÐØ˜D‘z�lˆä�w‰w×"Ñ" 6¬>×+>Ñ+>Ô?Ø�6œC ›KÑ'Ð'ä—7‘7×#Ñ#ˆØ×&Ñ&¤}°[Ó'AÓBˆ
ô �=‰=×+Ò+Ü#)§=¡=×#FÑ#FÑ àˆJä—‘×3Ñ3ò UØ×2Ñ2´5·8±8¸JÈ
Ó3SÓTð !ñ $à�6œC ›KÑ'Ð'ä�6‹{œc )›nÒ,Ð,Ð,ð ×)Ñ)¬%¯(©(°:¸qÓ*AÔBô %*¬#¨f«+Ó$6öð !ô × Ñ Ø!Ø  Ñ.Ø& |Ñ4Øð	 !õ òð ÷	?ô0 !&¤c¨&£kÓ 2ö'
ð& ô% ×ÑÜð Ø!Ø  Ñ.Ø!Ø& |Ñ4Ø'ØØ+Ø +Ø#Ø#1Ø!-Ø!Ø)ñð ñõð
ˆð 
ð, ò 	ˆFØ�N‰NÕð	ð ˆùòQùò
s   Å'&HÆ.9Hrr  r   rS  )
r  re  r  rn  r  r  rw  r  r¼   r   rd  )r¼   rF  r`  r{  r>  )r  rj  r¢  r¡  rZ  z'tuple[Callable[[list[Expr]], Any], ...]r  rH  rÂ  rŽ   rÙ  r�   rÚ  r�   rj  r^   rÄ   r   r¼   rÔ  )r¢   r£   r¤   r¥   rb   r>  rš  rv  r@  rB  r
  rÑ  ry  râ  r½  r  r^   r€  r�  rI  rJ  s   @r‘   r×  r×  ©  s>  ø… ð ÓØ
ÓØGÓGØ!Ó!ØÓà#Ó#Ø-Ó-àƒLØÓñ ˜FÓ#õ	
ó $ð	
õ ð
àð
ð 2ð
ð ð	
ð
 'ð
ð 
ó
óó óóó8óôUð ð )6×(=Ñ(=ðQàðQð (ðQð ;ð	Qð
 ðQð ðQð ðQð ðQð &ðQð ðQð 
$òQó ôQr“   r×  c                ó>   — 	 t        | d¬«       y# t        $ r Y yw xY w)NF©ÚfreezeT)rO  rÙ  r�   s    r‘   r  r  H  s&   € ðÜ˜a¨Õ.ØøÜò Ùðús   ‚ �	›c           
     ó¤  — 	 t        | d¬«      \  }}|j                  «       r‘t        |t        «      sJ t	        |«      «       ‚t        |j                  |j                  |j                  |j                  |j                  |j                  |j                  «      |j                  |j                  «      }|j                  «       S # t        $ r Y yw xY w©NFró  )rO  Úshould_pad_stridesr�   r  r·   rP  r  r  r  Ú_pad_stridesr  rQ  rR  Úis_contiguousrÙ  ©r�   Ú_bufferrN  s      r‘   Ú is_contiguous_storage_and_layoutrü  P  s®   € ðÜ/°¸%Ô@‰ˆ�ð ×$Ñ$Ô&Ü˜f¤nÔ5ÐC´t¸F³|ÓCÐ5Ü Ø—‘Ø—‘Ø—‘Ø×#Ñ# F§M¡M°6·;±;ÀÇÁÓMØ—‘Ø× Ñ óˆFð ×#Ñ#Ó%Ð%øÜò Ùðús   ‚C C Ã	CÃCc                ó  — 	 t        | d¬«      \  }}|j                  «       syt        j                  j                  j                  |j                  «       |j                  t        |j                  «      z   «      S # t        $ r Y yw xY wrö  )rO  rù  rw   r  r  rI  Ústorage_sizerQ  rr   r  rÙ  rú  s      r‘   Ú&is_dense_contiguous_storage_and_layoutrÿ  d  sw   € ðÜ/°¸%Ô@‰ˆ�Ø×#Ñ#Ô%ØÜ�w‰w×Ñ×7Ñ7Ø×ÑÓ! 6§=¡=´=ÀÇÁÓ3MÑ#Mó
ð 	
øô ò Ùðús   ‚ A; £AA; Á;	BÂB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%  r0  ©r%  ró  )r�   rˆ   rO  rM  rq  r  rr  r"  rù  r&  r1  r™  rS  rN  rÙ  )	r�   rô  r  r  r%  r0  rù   rN  Úbuffers	            r‘   rO  rO  p  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ÐÐÜ
Ðr“   c                ód   — 	 t        | d¬«      \  }}|j                  |«      S # t        $ r Y yw xY wrö  )rO  Úis_stride_orderedrÙ  )r�   r  rû  rN  s       r‘   Ú"is_stride_order_storage_and_layoutr  ¬  s:   € ðÜ/°¸%Ô@‰ˆ�Ø×'Ñ'¨Ó5Ð5øÜò Ùðús   ‚ # £	/®/c                óÖ  — t        | t        t        f«      rt        | j                  «      S t        | t
        «      rt| j                  }t        j                  j                  j                  |j                  t        |j                  «      z  t        «       }t        | j                  «      xs |S t        | t        «      r*| j!                  «       t        j                  j"                  v S yr  )r�   rˆ   rq  Úis_unalignedrM  rS  rN  rw   r  r  Ústatically_known_multiple_ofrQ  ri   r  rk   rr  rs  Úunaligned_buffers)r¹   rN  Úhas_unaligned_layouts      r‘   r
  r
  ¶  s«   € Ü�$œ¤JÐ/Ô0Ü˜DŸI™IÓ&Ð&ä�$œÔ(Ø—‘ˆÜ#$§7¡7×#3Ñ#3×#PÑ#PØ�M‰MœN¨6¯<©<Ó8Ñ8¼/ó$
ð  
Ðô ˜DŸI™IÓ&Ò>Ð*>Ð>ä�$œÔØ�}‰}‹¤!§'¡'×";Ñ";Ð;Ð;ð r“   c                  óè   — e Zd ZU ded<    ed «      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œ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)/ro  r‰   rM  c                ó8   — | j                   j                  |«      S rŒ   ©rM  r>  r=  s     r‘   r>  zBaseView.get_free_symbol_usesÌ  s   € à�y‰y×-Ñ-¨mÓ<Ð<r“   c                ó   — t        d| › �«      ‚)Nzmake_reindexer NYI on r�  r�  s    r‘   Úmake_reindexerzBaseView.make_reindexerÐ  s   € Ü!Ð$:¸4¸&Ð"AÓBÐBr“   c                ól   ‡‡— | j                   j                  «       Š| j                  «       Šdˆˆfd„}|S )Nc                ó    •—  ‰ ‰| «      «      S rŒ   r¦   ©ró   ÚinnerrÒ   s    €€r‘   r  z&BaseView.make_indexer.<locals>.indexer×  ó   ø€ Ù™ ›Ó&Ð&r“   )ró   r  r¼   r    )rM  r
  r  )r‘  r  r  rÒ   s     @@r‘   r
  zBaseView.make_indexerÓ  s/   ù€ Ø—	‘	×&Ñ&Ó(ˆØ×%Ñ%Ó'ˆö	'ð ˆr“   c                ól   ‡‡— | j                   j                  «       Š| j                  «       Šdˆˆfd„}|S )Nc                ó    •—  ‰ ‰| «      «      S rŒ   r¦   r  s    €€r‘   r  z$BaseView.make_loader.<locals>.loaderà  r  r“   r†  )rM  r  r  )r‘  r  r  rÒ   s     @@r‘   r  zBaseView.make_loaderÜ  s/   ù€ Ø—	‘	×%Ñ%Ó'ˆØ×%Ñ%Ó'ˆö	'ð ˆr“   c                ó6   — | j                   j                  «       S rŒ   )rM  r  r�  s    r‘   r  zBaseView.dtypeå  s   € à�y‰y×"Ñ"Ó$Ð$r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r  r�  s    r‘   r  zBaseView.get_layouté  ó   € Ø�y‰y×#Ñ#Ó%Ð%r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r  r�  s    r‘   r  zBaseView.get_deviceì  r  r“   c                 ó   — y rŒ   r¦   r�  s    r‘   rª  zBaseView.get_origin_nodeï  r®  r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  rs  r�  s    r‘   rs  zBaseView.get_nameò  ó   € Ø�y‰y×!Ñ!Ó#Ð#r“   c                ó"   — | j                  «       S rŒ   rî  r�  s    r‘   rÑ  zBaseView.get_pointwise_sizeõ  ó   € Ø�}‰}‹Ðr“   Tr  c               ó<   — | j                   j                  ||¬«      S ©Nr  ©rM  r  r  s      r‘   r  zBaseView.mark_reuseø  ó   € Ø�y‰y×#Ñ# E°{Ð#ÓCÐCr“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r  r�  s    r‘   r  zBaseView.has_exceeded_max_readsû  ó   € Ø�y‰y×/Ñ/Ó1Ð1r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  rø  r�  s    r‘   rø  zBaseView.realizeþ  ó   € Ø�y‰y× Ñ Ó"Ð"r“   c                ó8   — | j                   j                  «        y rŒ   ©rM  r  r�  s    r‘   r  zBaseView.realize_hint  s   € Ø�	‰	×ÑÕ r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r;  r�  s    r‘   r;  zBaseView.get_storage_numel  ó   € Ø�y‰y×*Ñ*Ó,Ð,r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  rD  r�  s    r‘   rD  zBaseView.is_extern  ó   € Ø�y‰y×"Ñ"Ó$Ð$r“   c                óž   — t        | j                  t        «      sJ t        | j                  «      «       ‚| j                  j	                  «       S rŒ   )r�   rM  ro  r·   Úis_module_bufferr�  s    r‘   r9  zBaseView.is_module_buffer
  s6   € Ü˜$Ÿ)™)¤XÔ.Ð?´°T·Y±Y³Ó?Ð.Ø�y‰y×)Ñ)Ó+Ð+r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r¤  r�  s    r‘   r¤  zBaseView.get_read_names  ó   € Ø�y‰y×'Ñ'Ó)Ð)r“   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  rT   r  r
  r6  r�  s    r‘   r£  zBaseView.get_reads  sL   € Ü�\‰\œ.Ð*:¸DÓAñ 	Ü&Ø× Ñ Ó"Ø—‘“ó÷ ‰e÷		÷ 	ò 	ús   œ2AÁA!c                ód   — | }t        |t        «      r|j                  }t        |t        «      rŒ|S rŒ   )r�   ro  rM  )r‘  r�   s     r‘   rp  zBaseView.unwrap_view  s+   € ØˆÜ˜œHÔ%Ø—‘ˆAô ˜œHÕ%àˆr“   c                óº   — | j                  «       } t        j                  t        d|«      |«      }t	        || j                  «       || j                  «       ¬«      S r  )r  r   rÇ   r!  r  r  r
  r"  s      r‘   rH  zBaseView.constant_to_device  sP   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—.‘.Ó"ØØ—=‘=“?ô	
ð 	
r“   Nrr  r   ©r¼   ú*Callable[[Sequence[Expr]], Sequence[Expr]]rm  rk  r[  r]  rg  rV  ro  r~  rq  r_  rd  rS  r|  rT  rz  rR  r€  )r¢   r£   r¤   r¥   rb   r>  r  r
  r  rˆ  r  r  r  rª  rs  rÑ  r  r  rø  r  r;  rD  r9  r¤  r£  rp  rH  r¦   r“   r‘   ro  ro  È  s™   … à
ƒLá˜JÓ'ó=ó (ð=óCóóð ò%ó ð%ó&ó&óó$óð =Aõ Dó2ó#ó!ó-ó%ó,ó*óóô	
r“   ro  c                  óP   — e Zd ZU ded<   edd„«       Zed	d„«       Zd
d„Z	 	 dd„Z	y)r­   r  r  c                ó´  — t         j                  j                  }|D �cg c]  }t        j                  |«      ‘Œ }}| j                  «       }dgt        |«      t        |«      z
  z  t        |«      z   }t        |«      t        |«      k(  sJ ‚t        t        |«      «      D ]¯  }||   dk(  r||   €J ‚||   ||<   Œ||   �,t         j                  j                  j                  ||   «      rŒMt        |«      rŒYt        |«      rŒe||   }||   }|€J ‚|€J ‚||z
  }|j                  |d¬«      dk(  rŒ“J d| j                  «       › d|› d|› �«       ‚ |S c c}w )zReplace `-1` with correct sizesNr2  r   )ÚfallbackzBroadcast failed in ExpandView(ú, z) on dimension )rw   r  r  r°   rÕ  r
  rÍ   r©   rÎ   Úis_size_one_or_falser8   r	  )	r�   Únew_sizer  ré   Úold_sizerÐ   Úv1Úv2Údiffs	            r‘   Ú_normalize_sizezExpandView._normalize_size.  s‚  € ô —7‘7×#Ñ#ˆØ-5Ö6¨”E—L‘L •OÐ6ˆÐ6Ø—:‘:“<ˆØ�6œS ›]¬S°«]Ñ:Ñ;¼dÀ8»nÑLˆÜ�8‹}¤ H£Ò-Ð-Ð-Ü”s˜8“}Ó%ò 	ˆAØ˜‰{˜bÒ Ø ‘{Ð.Ð.Ð.Ø& q™k�˜’Ø˜!‘Ð$¬¯©×(8Ñ(8×(MÑ(MØ˜‘ô)ð Ü.Øõä/°Õ9ð ˜a‘[�Ø˜a‘[�Ø�~Ð%�~Ø�~Ð%�~Ø˜B‘w�à×.Ñ.ØØ!"ð /ó ð ó	ðð 6°a·j±j³l°^À2ÀhÀZÈÐ_`Ð^aÐbóðð-	ð< ˆùòE 7s   ŸEc                ó”  — | j                  ||«      }t        |«      �rt        |«      \  }}t        |«      t        |j                  «      z
  }|dk\  sJ ‚t
        j                  j                  g|z  }t        |j                  |j                  «      D ]Y  \  }}|j                  t        j                  j                  j                  |«      s|nt
        j                  j                  «       Œ[ t        |j                   |j"                  t%        |«      ||j&                  |j(                  «      }	t+        ||	¬«      S t-        ||¬«      S )Nr   rL  )rM  r  )rL  r  rO  rÍ   r  r°   rÙ  rÚ  rÖ   r  rÇ  rw   r  r  rF  rP  r  r  r©   rQ  rR  rS  r­   )
rÔ  r�   rG  rV  rW  ÚskiprX  r  r  rY  s
             r‘   r�  zExpandView.createV  s  € à×&Ñ& q¨(Ó3ˆä  Õ#Ü"7¸Ó":ÑˆG�ZÜ�x“=¤3 z§¡Ó#7Ñ7ˆDØ˜1’9Ð�9ÜŸ'™'Ÿ,™,˜¨$Ñ.ˆJÜ # J×$5Ñ$5°z·±Ó Gò ‘�˜Ø×!Ñ!äŸ7™7×+Ñ+×@Ñ@ÀÔFñ äŸ™Ÿ™õðô %Ø×!Ñ!Ø× Ñ Ü�X“ØØ×!Ñ!Ø×$Ñ$óˆJô #¨¸
ÔCÐCä˜q xÔ0Ð0r“   c                ó   — | j                   S rŒ   rµ  r�  s    r‘   r
  zExpandView.get_sizeq  r¶  r“   c                ó¢   ‡‡— | j                  «       }| j                  j                  «       Št        |«      t        ‰«      z
  Š	 	 	 	 dˆˆfd„}|S )Nc                óÔ   •— t        | ‰d  «      } t        | «      t        ‰«      k(  sJ ‚t        t        ‰«      «      D ](  }‰|   dk(  sŒt        j                  j
                  | |<   Œ* | S rØ  )r©   rÍ   rÎ   r°   rÙ  rÚ  )rÏ   rÐ   ÚactualrN  s     €€r‘   rÒ   z*ExpandView.make_reindexer.<locals>.reindex{  sf   ø€ ô ˜˜t˜u˜Ó&ˆEÜ�u“:¤ V£Ò,Ð,Ð,Üœ3˜v›;Ó'ò ,�Ø˜!‘9 “>ä$Ÿw™wŸ|™|�E˜!’Hð,ð ˆLr“   ©rÏ   r  r¼   r  )r
  rM  rÍ   )r‘  ÚtargetrÒ   rR  rN  s      @@r‘   r  zExpandView.make_reindexert  sP   ù€ ð —‘“ˆØ—‘×#Ñ#Ó%ˆÜ�6‹{œS ›[Ñ(ˆð		Ø!ð		àö		ð ˆr“   N)r�   r‰   rG  ra  r¼   ra  )r�   r‰   rG  ra  r¼   ro  r~  r@  )
r¢   r£   r¤   r¥   r…  rL  r  r�  r
  r  r¦   r“   r‘   r­   r­   *  sA   … à
Óàò%ó ð%ðN ò1ó ð1ó4ðà	3ôr“   r­   c                  óX   — e Zd ZU ded<   ed	d„«       Zed
d„«       Zdd„Zdd„Z	 	 dd„Z	y)ÚPermuteViewrG  Ú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                  |j                  «      }t        ||¬«      S t        ||¬«      S c c}w c c}w )NrL  )rM  rW  )Ú_map_neg_dimsr@   rÎ   rÍ   r  rO  rP  r  r  r  r  rQ  rR  rS  rV  )rÔ  r�   rW  rV  rW  rÐ   rY  s          r‘   r�  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 rò  rÆ  )rÔ  rW  rB  s      r‘   rY  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@   rY  rW  rÎ   rÍ   rM  r
  )r‘  r  rÐ   s      r‘   r
  zPermuteView.get_size¤  so   € Ü˜$×,Ñ,¨T¯Y©YÓ7Ó8¼JÜ”#�d—i‘i“.Ó!ó=
ò 
ð 	
ð 
ð �y‰y×!Ñ!Ó#ˆØ!%§¡Ö+˜A��Q“Ò+Ð+ùÒ+ó   Á7B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@   rY  rW  rÎ   rÍ   rM  r4  )r‘  r  rÐ   s      r‘   r4  zPermuteView.get_stride«  so   € Ü˜$×,Ñ,¨T¯Y©YÓ7Ó8¼JÜ”#�d—i‘i“.Ó!ó=
ò 
ð 	
ð 
ð —‘×%Ñ%Ó'ˆØ#'§9¡9Ö-˜a��q“	Ò-Ð-ùÒ-r\  c                óL  ‡— t        | j                  «      D ��ci c]  \  }}||“Œ
 c}}Št        t        | j                  «      «      D �cg c]  }‰|   ‘Œ	 c}Št	        ‰«      t	        t        t        | j                  «      «      «      k(  sJ ‚	 	 	 	 dˆfd„}|S c c}}w c c}w )Nc                ó4   •— ‰D �cg c]  }| |   ‘Œ	 c}S c c}w rŒ   r¦   )rÏ   rÐ   Úinvs     €r‘   rÒ   z+PermuteView.make_reindexer.<locals>.reindex¹  s   ø€ ð '*Ö* �E˜!“HÒ*Ð*ùÒ*s   †rS  )rò   rW  rÎ   rÍ   r@   )r‘  rÐ   rÈ  rÒ   r`  s       @r‘   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!N)r�   r‰   rW  rt  r¼   ro  )rW  rt  r¼   ú	list[int]r~  r@  )
r¢   r£   r¤   r¥   r  r�  rY  r
  r4  r  r¦   r“   r‘   rV  rV  ‰  sG   … à
Óàò.ó ð.ð$ òFó ðFó,ó.ðà	3ôr“   rV  c                  óF   — e Zd Zeddœdd„«       Ze	 	 	 	 dd„«       Zdd„Zy)	ÚSqueezeViewN)rB  c          	     óD  — t        |«      �rOt        |«      \  }}g }g }|�?t        |t        «      sJ t	        |«      «       ‚d|k  r|t        |j                  «      k  sJ ‚t        t        |j                  |j                  «      «      D ]‹  \  }\  }}	|€Mt        j                  j                  j                  |«      rŒ5|j                  |«       |j                  |	«       ŒX||k7  r#|j                  |«       |j                  |	«       Œ€|dk(  rŒ†J d«       ‚ t        |j                   |j"                  |||j$                  |j&                  «      }
t)        ||
¬«      S |€[t*        j-                  ||j/                  «       D �cg c]-  }t        j                  j                  j                  |«      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 )Nr   rI   zexpected squeezed size to be 1rL  )r  rO  r�   rŽ   r·   rÍ   r  rò   rÖ   r  rw   r  r  rF  rÇ  rP  r  r  rQ  rR  rS  r#  r�  r
  )rÔ  r�   rB  rV  rW  rG  rX  rÐ   r  r  rY  ré   s               r‘   r�  zSqueezeView.createÃ  sä  € ä  Õ#Ü"7¸Ó":ÑˆG�ZØˆHØˆJØˆÜ! #¤sÔ+Ð6¬T°#«YÓ6Ð+Ø˜C’x C¬#¨j¯o©oÓ*>Ò$>Ð>Ð>ä%.¬s°:·?±?ÀJ×DUÑDUÓ/VÓ%Wò KÑ!�‘>�D˜&Ø�;äŸ7™7×+Ñ+×@Ñ@ÀÕFØ Ÿ™¨Ô-Ø"×)Ñ)¨&Õ1à˜C’xØ Ÿ™¨Ô-Ø"×)Ñ)¨&Õ1à# q›yÐJÐ*JÓJ˜yðKô %Ø×!Ñ!Ø× Ñ ØØØ×!Ñ!Ø×$Ñ$óˆJô #¨¸
ÔCÐCàˆ;Ü—;‘;Øð ŸZ™Z›\öàÜŸ7™7×+Ñ+×@Ñ@ÀÔCò òóð ð —:‘:“< Ñ$¨Ò)Ð)Ð)Ü—;‘;˜q´¸1¿:¹:»<Ó1H×"U©¨¨AÈAÐQTËH¢1Ó"UÓVÐVùòùó #Vs   Æ 2H
Ç=HÈH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 )NrI   c                óÎ   •— t        | «      t        ‰«      k(  sJ | › d‰› �«       ‚t        j                  j                  g‰z  }t	        ‰| «      D ]
  \  }}|||<   Œ t        |«      S )Nú )rÍ   r°   rÙ  rÚ  rÖ   rª   )rÏ   r  ró   ré   ÚlengthÚnot_ones       €€r‘   rÒ   z%SqueezeView.squeezer.<locals>.reindexù  sk   ø€ Ü�u“:¤ W£Ò-ÐC°%°¸¸'¸Ð/CÓCÐ-Ü%*§W¡W§\¡\ N°VÑ$;ˆIÜ˜g uÓ-ò #‘��QØ!"�	˜#’ð#ä˜Ó#Ð#r“   )rÏ   r  r¼   ztuple[Expr, ...])rò   rÍ   )r  ré   rG  rÐ   rÒ   rh  ri  s        @@r‘   Ú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())rl  )r‘  rM  s     r‘   r]  zSqueezeView.__init__  s   € ÜÐ7Ó8Ð8r“   )r�   r‰   rB  r€  r¼   r‰   )r  r  r¼   z>tuple[list[int], Callable[[Sequence[Expr]], tuple[Expr, ...]]])rM  r   r¼   r½   )r¢   r£   r¤   r  r�  r…  rj  r]  r¦   r“   r‘   rc  rc  Á  sC   „ àØ48ô +Wó ð+WðZ ð!Øð!à	Gò!ó ð!ô 9r“   rc  c                  ól   — e Zd ZU ded<   ded<   	 	 dd„Zdd„Zdd„ZeZe	 	 	 	 	 	 	 	 dd„«       Z	dd	„Z
y
)ÚGenericViewr  r  rA  rÒ   c                ó   — | j                   S rŒ   )rÒ   r�  s    r‘   r  zGenericView.make_reindexer  s   € ð �|‰|Ðr“   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 rE  r  )rÎ   rÍ   r  rq   rH   r  r©   rÒ   rÐ  rÎ  rÈ   )r‘  rÛ  Ú	index_oldÚ	index_news       r‘   Ú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=)rÔ  rM  r  rr  r�  s    r‘   rÉ  zGenericView.__str__  s=   € Ø�‰Ø�Y‰Y˜% §	¡	˜{Ð+¨x¸×8HÑ8HÓ8JÐ7KÐ-LÐMó
ð 	
r“   c                ó*   —  | |t        |«      |¬«      S )N©rM  r  rÒ   )r©   )rÔ  r�   rG  rÒ   s       r‘   r�  zGenericView.create  s   € ñ ˜¤ X£¸Ô@Ð@r“   c                ó   — | j                   S rŒ   rµ  r�  s    r‘   r
  zGenericView.get_size'  r¶  r“   Nr@  ro  )r�   r‰   rG  r  rÒ   rA  r¼   ro  r~  )r¢   r£   r¤   r¥   r  rr  rÉ  r  r  r�  r
  r¦   r“   r‘   rm  rm    sp   … à
ÓØ7Ó7ðà	3óó
Gó
ð
 €HàðAàðAð !ðAð <ð	Að
 
òAó ðAôr“   rm  c                  ó¤   — e Zd ZdZedd„«       Zeed	d„«       «       Ze	 	 	 	 	 	 d
d„«       Z	e	 d	 	 	 	 	 	 	 dd„«       Z
e	 d	 	 	 	 	 	 	 dd„«       Zy)r#  zš
    This class handles tensor reshaping by computing appropriate index transformations
    to map the new shape back to the original storage layout.
    c                óø   — t        j                  | «      } t        j                  |«      }t        j                  j                  j
                  j                  } |t        j                  | d«      «      r| |z   } | S rò  )r°   rÕ  rw   r  r  rî   Úevaluate_exprÚLt)ró   r  rz  s      r‘   Úhandle_negative_indexzView.handle_negative_index2  sZ   € ä�l‰l˜3ÓˆÜ�|‰|˜DÓ!ˆÜŸ™×(Ñ(×2Ñ2×@Ñ@ˆÙœŸ™ # qÓ)Ô*Ø˜‘*ˆCØˆ
r“   c                ó²  ‡ ‡‡‡— t        ‰t        «      sJ t        ‰«      «       ‚‰ j                  |j	                  «       ‰«      \  ŠŠt
        j                  j                  j                  ‰‰«      r|S t        t        ‰«      «      dkD  xs t        t        ‰«      «      dkD  }t        |«      }	 	 	 	 	 	 	 	 dd„Š	 	 	 	 dˆ ˆˆˆfd„}d‰v rdˆfd„} ‰ |t        ‰«      |¬«      S |r ‰|‰t        j                  ‰«      «      S t        |«      s ||«      S t!        |d¬«      \  }}|j"                  }	t
        j                  j                  j%                  ‰«      }
t
        j                  j                  j%                  |	«      }t
        j                  j                  j%                  ‰«      }ddlm}  ||
|||¬	«      }|�‰|D �cg c]9  }t+        |d
«      r|j,                  j.                  nt1        j2                  |«      ‘Œ; }}t5        |j6                  |j8                  ‰||j:                  |j<                  «      }t?        ||¬«      S  ||«      S c c}w )Nr   c                ó  — t         j                  | t        j                  | j	                  «       «      «      } t        | «      \  }}t        |j                  |j                  |||j                  |j                  «      }t        ||¬«      S ©NrL  )rµ  Úrequire_exact_stridesr  r  r
  rO  rP  r  r  rQ  rR  rS  )rl  rG  rX  rV  rW  rY  s         r‘   Úcreate_reinterpret_viewz,View.create.<locals>.create_reinterpret_viewK  s~   € ô ×4Ñ4Ø”^×6Ñ6°s·|±|³~ÓFóˆCô #8¸Ó"<ÑˆG�ZÜ$Ø×!Ñ!Ø× Ñ ØØØ×!Ñ!Ø×$Ñ$óˆJô #¨¸
ÔCÐCr“   c                óÔ   •— 	 ‰j                  ‰‰«      } ‰| t        ‰«      |¬«      S # t        $ r5 t        j	                  | «      }  ‰| ‰t
        j                  ‰«      «      cY S w xY w)a  
            Handle the case where view is not possible with current strides.
            Try dynamic_reshape_indexer first; if it fails with unbacked
            symbols (guard_or_false can't resolve comparisons), fall back
            to making the tensor contiguous.
            rv  )r$  r©   r7   rµ  Úrequire_contiguousr  r  )r�   rÒ   rÔ  r�  rG  rH  s     €€€€r‘   Ú"handle_unbacked_or_dynamic_reshapez7View.create.<locals>.handle_unbacked_or_dynamic_reshape\  sm   ø€ ð
Ø×5Ñ5°hÀÓI�Ù ¬¨X«ÀÔHÐHøÜ.ò ô !×3Ñ3°AÓ6�Ù.Ø�x¤×!BÑ!BÀ8Ó!Lóò ðús   ƒ%) ©;A'Á&A'c                ó4   •— t        dgt        ‰«      z  «      S rò  )rª   rÍ   )rÏ   rH  s    €r‘   Úfake_reindexz!View.create.<locals>.fake_reindext  s   ø€ Ü˜a˜S¤3 x£=Ñ0Ó1Ð1r“   rv  Fró  )Ú_compute_stride)Úsize_obliviousr¹   rL  )rl  r‰   rG  r  rX  r  r¼   rS  ©r�   r‰   r¼   r‰   )rÏ   r   r¼   ztuple[int, ...]) r�   r   r·   Úresolve_negative_sizer
  rw   r  r  Ústatically_known_list_equalsrÍ   r6   rÿ  r©   r  r  r  rO  r  Úto_symints_or_intsÚtorch._subclasses.fake_implsr‡  r¶  r¹   Úexprr°   r!   rP  r  r  rQ  rR  rS  )rÔ  r�   rG  Úunbacked_symbols_in_sizesrù  r„  r†  rV  rW  Ú
old_strideÚold_size_symintÚold_stride_symintÚnew_size_symintr‡  Únew_stride_symintré   rX  rY  r�  rH  s   ` `               @@r‘   r�  zView.create;  sb  û€ ô ˜(¤HÔ-Ð=¬t°H«~Ó=Ð-Ø ×6Ñ6°q·z±z³|ÀXÓNÑˆ�(ô �7‰7×Ñ×8Ñ8¸À8ÔLØˆHô Ô% hÓ/Ó0°1Ñ4ò 8ÜÔ(¨Ó2Ó3°aÑ7ð 	"ô ?¸qÓAˆð	DØð	DØ#1ð	DØ?Mð	Dàó	Dð"	Øð	à÷	ð 	ð, �‰=õ2ñ ˜A¤D¨£N¸LÔIÐIñ á*Ø�8œ^×>Ñ>¸xÓHóð ô
 % QÔ'á5°aÓ8Ð8ô 4°A¸eÔDÑˆ�à×&Ñ&ˆ
ô Ÿ'™'×*Ñ*×=Ñ=¸hÓGˆÜŸG™G×,Ñ,×?Ñ?À
ÓKÐÜŸ'™'×*Ñ*×=Ñ=¸hÓGˆå@ñ ,ØØØØ4ô	
Ðð Ð(ð +öàô  ' q¨&Ô1�—‘—’´u·}±}ÀQÓ7GÑGðˆJð ô
 %Ø×!Ñ!Ø× Ñ ØØØ×!Ñ!Ø×$Ñ$óˆJô #¨¸
ÔCÐCñ 2°!Ó4Ð4ùò!s   Ç>I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 )Nr2  )rw   r  r  r÷  r©   rÎ   rÍ   r°   rÙ  ÚOnerB   rr   Úcheck_equals)rH  rG  r�   rÐ   s       r‘   rŠ  zView.resolve_negative_size­  sê   € ð ;CÖ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Nc                óÜ   — 	 | j                  |||«      }|S # t        t        t        f$ r@ t	        |«      g}| j                  ||«      }| j                  ||«      }t        ||«      }Y |S w xY wrŒ   )Ú_dynamic_reshape_indexerrl  r7   Ú
IndexErrorrr   rà   )rÔ  rH  rG  Ú	dense_dimrÒ   ÚflatrÞ   rß   s           r‘   r$  zView.dynamic_reshape_indexer¾  s}   € ð	:Ø×2Ñ2°8¸XÀyÓQˆGð ˆøô Ô ;¼ZÐHò 	:ä! (Ó+Ð,ˆDØ×3Ñ3°H¸dÓCˆHØ×3Ñ3°D¸(ÓCˆHÜ% h°Ó9‰GØˆð	:ús   ‚ —AA+Á*A+c                óè  ‡‡‡— t         j                  j                  j                  Šdˆfd„}t	        t        |«      «      D �cg c]  }t        t        j                  |«      ‘Œ c}Št        t        ‰|«      «      }t        | «      }|duxr! |t        |«      dz
  k7  xr t        |«      dk(  }|r&|€J ‚|j                  |«      }|j                  |«       g Š|�rð|�rí|j                  «       }	|j                  «       \  }
}|	dk(  r>‰j                  t        j                  j                  «       |j                  |
|f«       �n�|dk(  r|j                  |	«       �ni |||	«      dk(  r‰j                  |
«       �nJ |||	«      dk  ru |||	«      dk  r-|j                  «       \  }}||z  |
z   }
||z  } |||	«      dk  rŒ-‰j                  |
«       t         j                  j                  j!                  ||	«       nÉ |||	«      dkD  r·t        j                  j"                  }|	}‰j                  t%        |
||«      «       ||z  } |||	«      dkD  rC|j                  «       }‰j                  t%        |
||«      «       ||z  }|	|z  }	 |||	«      dkD  rŒCt         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Œ@|�At        |«      dk(  r3‰j)                  «        ‰j                  «       }‰j+                  ||«       n‰j)                  «        t        ‰«      t        | «      k(  sJ ‚	 	 	 	 dˆˆfd„}|S c c}w )zG
        Perform a reshape entirely by modifying indexing math
        c                óœ  •—  ‰t        j                  | |«      «      ry ‰t        j                  | |«      «      ry ‰t        j                  | |«      «      ryt        j
                  j                  j                  || «      ryt        j
                  j                  j                  | |«      ryt        t        j                  | |«      «      ‚)zÚ
            Compare two symbolic sizes, returning -1 if a < b, 0 if a == b, 1 if a > b.

            For unbacked symbols, guard_or_false returns False, so we fall back
            to divisibility checks.
            r   r2  rI   )	r°   r0  r{  ÚGtrw   r  r  r  r7   )rF  rG  r8  s     €r‘   Úcompare_sizesz4View._dynamic_reshape_indexer.<locals>.compare_sizesÚ  s•   ø€ ñ œeŸh™h q¨!›nÔ-ØÙœeŸh™h q¨!›nÔ-ØÙœeŸh™h q¨!›nÔ-Øô �w‰w×Ñ×<Ñ<¸QÀÔBØÜ�w‰w×Ñ×<Ñ<¸QÀÔBØä-¬e¯h©h°q¸!«nÓ=Ð=r“   NrI   r   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     €r‘   rê   zAView._dynamic_reshape_indexer.<locals>.reindex.<locals>.<genexpr>H  s   øè ø€ ÒH¸œ A |×4ÑHùr»  )rÍ   r«   rÖ   rª   )rÏ   r£  r  Ú	view_exprs    @€€r‘   rÒ   z.View._dynamic_reshape_indexer.<locals>.reindexC  sO   ù€ ô �u“:¤ T£Ò*ÐC¬S°«Z¼¸T»Ð,CÓCÐ*Ü¤ D¨%Ó 0Ó1ˆLÜÓH¸iÔHÓHÐHr“   )rF  r    rG  r    r¼   rŽ   rS  )rw   r  r  r8  rÎ   rÍ   rq   rH   ÚVIEWr©   rÖ   rÓ  rÇ  r°   rÙ  rÚ  r—  r–  rG   rl  ÚreverseÚinsert)rH  rG  r›  r   rÐ   Ú	stack_newÚ	stack_oldÚreordering_dense_dimÚold_dimÚsize_oldr’  Úsize_newÚvar2Ú	size_new2ÚdivisorÚmodulusÚ
dense_exprrÒ   r8  r  r¤  s                     @@@r‘   r™  zView._dynamic_reshape_indexerÏ  sŒ  ú€ ô Ÿ™×)Ñ)×8Ñ8ˆõ 	>ôJ CHÌÈHËÓBVö
Ø=>Ô*¬4¯9©9°aÕ8ò
ˆô œ˜T 8Ó,Ó-ˆ	Ü˜“Nˆ	ð ˜TÐ!ò #ØœS ›^¨aÑ/Ñ/ò#ä�H“ Ñ"ð 	ñ
  ØÐ(Ð(Ð(Ø—m‘m IÓ.ˆGØ×Ñ˜WÔ%àˆ	ÚšIØ —}‘}“ˆHØ%ŸM™M›O‰MˆC�Ø˜1Š}Ø× Ñ ¤§¡§¡Ô.Ø× Ñ  # x Ö1Ø˜Q’Ø× Ñ  Ö*Ù˜x¨Ó2°aÒ7Ø× Ñ  Ö%Ù˜x¨Ó2°QÒ6Ù# H¨hÓ7¸!Ò;Ø&/§m¡m£o‘O�D˜)Ø ™/¨CÑ/�CØ'¨)Ñ3�Hñ $ H¨hÓ7¸!Ó;ð × Ñ  Ô%Ü—‘× Ñ ×-Ñ-¨h¸ÕAÙ˜x¨Ó2°QÒ6ÜŸ'™'Ÿ+™+�Ø"�Ø× Ñ ¤°°g¸wÓ!GÔHØ! GÑ+�Ù# H¨hÓ7¸!Ò;Ø'Ÿm™m›o�GØ×$Ñ$¤_°S¸'À7Ó%KÔLØ%¨Ñ/�GØ'¨'Ñ1�Hñ	 $ H¨hÓ7¸!Ó;ô
 —‘× Ñ ×-Ñ-¨h¸ÕAä$Ð$ñ; ›Iñ> Ø —}‘}“ˆHÜ�G‰G×Ñ×)Ñ)¨(°AÔ6Ø×ÑœUŸW™WŸ\™\Ô*ò ñ
 Ø%ŸM™M›O‰MˆC�Ü�G‰G×Ñ×)Ñ)¨(°AÔ6ò ð Ð ¤S¨£]°aÒ%7Ø×ÑÔà"Ÿ™›ˆJØ×Ñ˜Y¨
Õ3à×ÑÔä�9‹~¤ X£Ò.Ð.Ð.ð	IØ!ð	Iàö	Ið ˆùòY
s   Á!O/)ró   r    r  r    r¼   r    )r�   r‰   rG  r  r¼   r‰   )rH  r  rG  r  r¼   ztuple[list[Expr], list[Expr]]rŒ   )rH  ra  rG  ra  r›  r€  r¼   ú&Callable[[Sequence[_T]], Sequence[_V]])rH  r  rG  r  r›  r€  r¼   rA  )r¢   r£   r¤   r‚  r…  r|  r  r   r�  rŠ  r$  r™  r¦   r“   r‘   r#  r#  +  sè   „ ñð
 òó ðð Øòn5ó ó ðn5ð` ð"Ø ð"Ø,:ð"à	&ò"ó ð"ð  ð
 !%ð	à$ðð %ðð ð	ð
 
0òó ðð  ð !%ðzØ ðzà ðzð ðzð 
4ò	zó ñzr“   r#  c                  óÐ   ‡ — e Zd ZU dZded<   dˆ fd„Zdd„Ze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 ed «      	 d	 	 	 dd„«       Zddd„Zd d„Zˆ xZS )!rS  z*Pretend our storage has a different layoutrç  rN  c                ó¶   •— t         ‰| �  «        t        | j                  t        «      r0t
        j                  | d| j                  j                  «       «       y y )NrM  )rn  rš  r�   rM  ro  rÇ   r”  rp  rª  s    €r‘   rš  zReinterpretView.__post_init__S  s@   ø€ Ü‰ÑÔÜ�d—i‘i¤Ô*Ü×Ñ˜t V¨T¯Y©Y×-BÑ-BÓ-DÕEð +r“   c                óP   — | j                  | j                  | j                  g«      S rŒ   )rÔ  rM  rN  r�  s    r‘   rÉ  zReinterpretView.__str__X  s&   € Ø�‰à—	‘	Ø—‘ðó
ð 	
r“   c                ó6   — | j                   j                  «       S rŒ   r"  r�  s    r‘   rs  zReinterpretView.get_nameb  r#  r“   c                ó.   — | j                   j                  S rŒ   )rN  r  r�  s    r‘   r  zReinterpretView.get_devicee  s   € Ø�{‰{×!Ñ!Ð!r“   c                 ó   — y rŒ   r¦   r�  s    r‘   rª  zReinterpretView.get_origin_nodeh  r®  r“   c                ó.   — | j                   j                  S rŒ   )rN  r  r�  s    r‘   r  zReinterpretView.dtypek  s   € à�{‰{× Ñ Ð r“   c                ó@   — t        | j                  j                  «      S rŒ   )r©   rN  r  r�  s    r‘   r
  zReinterpretView.get_sizeo  s   € Ü�D—K‘K×$Ñ$Ó%Ð%r“   c                ó@   — t        | j                  j                  «      S rŒ   )r©   rN  r  r�  s    r‘   r4  zReinterpretView.get_strider  s   € Ü�D—K‘K×&Ñ&Ó'Ð'r“   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Œ   )rN  r
  ru   Úloadrs  r  rM  Úto_dtype_bitcast)rÏ   r  Ú
tmp_loaderr‘  s      €r‘   r  z+ReinterpretView.make_loader.<locals>.loaderv  sp   ø€ Ø—k‘k×.Ñ.Ó0ˆGÜŸ™ $§-¡-£/±7¸5³>ÓBˆJØ�{‰{× Ñ  D§I¡I§O¡OÒ3Ü×+Ñ+¨J¸¿
¹
ÀDÇIÁIÇOÁOÓTÐTà!Ð!r“   rk  r¦   ©r‘  r  s   ` r‘   r  zReinterpretView.make_loaderu  s   ø€ õ	"ð ˆr“   c                ó6   — | j                   j                  «       S rŒ   )rN  r
  r�  s    r‘   r
  zReinterpretView.make_indexer€  ó   € Ø�{‰{×'Ñ'Ó)Ð)r“   c                ó   — | j                   S rŒ   ©rN  r�  s    r‘   r  zReinterpretView.get_layoutƒ  rÍ  r“   c                 ó   — y rŒ   r¦   r�  s    r‘   r"  zReinterpretView.freeze_layout†  r  r“   c                óÆ   — t        | j                  j                  |«      t        | j                  j                  |«      z  t        | j                  j                  |«      z  S rŒ   )r)   rN  r  r  rQ  r=  s     r‘   r>  z$ReinterpretView.get_free_symbol_uses‰  sQ   € ô
 ˜TŸ[™[×-Ñ-¨}Ó=Ü˜tŸ{™{×1Ñ1°=ÓAñBä˜tŸ{™{×1Ñ1°=ÓAñBð	
r“   c                ót  — t         j                  j                  j                  | j                  | j
                  j                  | j
                  j                  | j
                  j                  |�|j                  n#t         j                  j                  j                  | j
                  j                  ¬«      S r  )rw   r  Úwrapper_codeÚcodegen_reinterpret_viewrM  rN  r  r  rQ  Ú	writeliner  rú  s     r‘   rü  z!ReinterpretView.codegen_reference“  s�   € ô �w‰w×#Ñ#×<Ñ<Ø�I‰IØ�K‰K×ÑØ�K‰K×ÑØ�K‰K×ÑØ &Ð 2ˆF×Ò¼¿¹×8LÑ8L×8VÑ8VØ—+‘+×#Ñ#ð =ó 
ð 	
r“   c                 ó   — yrØ  r¦   r�  s    r‘   r9  zReinterpretView.num_reads   ó   € Ør“   rS  ro  rg  rV  r[  r~  rk  rm  r]  rr  r}  rŒ   rf  r{  )r¢   r£   r¤   r‚  r¥   rš  rÉ  r  rs  r  rª  rˆ  r  r
  r4  r  r
  r  r"  rb   r>  rü  r9  rI  rJ  s   @r‘   rS  rS  M  s•   ø… á4àƒNõFó

ð €Hó$ó"óð ò!ó ð!ó&ó(ó	ó*óóñ Ð-Ó.à$)ð
Ø!ð
à	!ò
ó /ð
ô
÷r“   rS  c                  ó\   — e Zd ZU dZded<   ed
d„«       Zdd„ZeZe	dd„«       Z
dd„Zdd„Zy	)Ú	DtypeViewz(Pretend our storage has a different typer\  Útarget_dtypec                óì   — t        |«      r]t        |«      \  }}t        |j                  ||j                  |j
                  |j                  |j                  «      }t        ||¬«      S t        ||¬«      S )NrL  )rM  rÑ  )
r  rO  rP  r  r  r  rQ  rR  rS  rÐ  )rÔ  r�   Ú	new_dtyperV  rW  rY  s         r‘   r�  zDtypeView.createª  sm   € ä  Ô#Ü"7¸Ó":ÑˆG�ZÜ$Ø×!Ñ!ØØ—‘Ø×!Ñ!Ø×!Ñ!Ø×$Ñ$óˆJô #¨¸
ÔCÐCÜ˜a¨iÔ8Ð8r“   c                óP   — | j                  | j                  | j                  g«      S rŒ   )rÔ  rM  rÑ  r�  s    r‘   rÉ  zDtypeView.__str__¹  s    € Ø�‰ §	¡	¨4×+<Ñ+<Ð=Ó>Ð>r“   c                ó   — | j                   S rŒ   )rÑ  r�  s    r‘   r  zDtypeView.dtype¾  s   € à× Ñ Ð r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r
  r�  s    r‘   r
  zDtypeView.get_sizeÂ  r#  r“   c                óL   ‡ ‡— ‰ j                   j                  «       Šdˆˆ fd„}|S )Nc                óz   •— t        j                   ‰| «      ‰j                  ‰j                  j                  «      S rŒ   )ru   rÀ  rÑ  rM  r  )ró   r  r‘  s    €€r‘   r  z%DtypeView.make_loader.<locals>.loaderÈ  s*   ø€ Ü×'Ñ'©¨c«
°D×4EÑ4EÀtÇyÁyÇÁÓWÐWr“   r†  ©rM  r  )r‘  r  r  s   ` @r‘   r  zDtypeView.make_loaderÅ  s"   ù€ Ø—	‘	×%Ñ%Ó'ˆö	Xð ˆr“   N)r�   r‰   rÓ  r\  r¼   ro  ro  r[  r~  rk  )r¢   r£   r¤   r‚  r¥   r  r�  rÉ  r  rˆ  r  r
  r  r¦   r“   r‘   rÐ  rÐ  ¤  sE   … á2àÓàò9ó ð9ó?ð €Hàò!ó ð!ó$ôr“   rÐ  c                  óh   — e Zd ZdZe	 	 	 	 	 	 	 	 	 	 dd„«       Ze	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zy)Ú	SliceViewzqView that represents a slice along a single dimension.

    Corresponds to tensor[..., start:end:step, ...].
    c                óˆ  ‡ ‡‡‡‡	‡
— t         j                  j                  Š
|j                  «       |   Št	        d„ ||‰fD «       «      rt
        Š	t        Šn:t	        d„ ||‰fD «       «      rt
        Š	t        Šn‰
j                  Š	‰
j                  Šdˆˆ	ˆ
fd„Š	 	 	 	 	 	 	 	 	 	 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Œ   )r6   ©rè   r�   s     r‘   rê   z0SliceView.normalize_start_end.<locals>.<genexpr>ß  s   è ø€ ÒH¨AÔ$ Q×'ÑHùó   ‚c              3  ó¬   K  — | ]L  }t        |t        «      r:|j                  t        j                  t        j
                  t        t
        «      –— ŒN y ­wrŒ   )r�   r    Úhasr°   rE   rD   rß  s     r‘   rê   z0SliceView.normalize_start_end.<locals>.<genexpr>â  s;   è ø€ ò 
ð Ü˜!œTÔ"ð �E‰E”%—)‘)œUŸY™Y¬¬S×1ñ
ùs   ‚AAc                ó€   •— ‰j                  | |«      r| n ‰| |«      }‰j                  ||«      r|}|S  ‰||«      }|S rŒ   )Ústatically_known_geqr>  )r�   ÚlowerÚupperÚclamped_lowerÚclamped_fullÚmax_funcÚmin_funcr  s        €€€r‘   Úclampz,SliceView.normalize_start_end.<locals>.clampî  s`   ø€ à×2Ñ2°1°eÔ<‘Á(È1ÈeÓBTð ð
 ×0Ñ0°ÀÔFð ð ð
  Ðñ ˜m¨UÓ3ð ð
  Ðr“   c                óD   •— | €|S ‰j                  | ‰«      }  ‰| ||«      S rŒ   )r|  )rá  rå  ræ  r  rë  rÔ  Údim_sizes       €€€r‘   Ú
clamp_wrapz1SliceView.normalize_start_end.<locals>.clamp_wrapù  s0   ø€ ð ˆ{à�Ø×+Ñ+¨C°Ó:ˆCÙ˜˜e UÓ+Ð+r“   r   )r�   r    rå  rŽ   ræ  rŽ   r¼   r    )
rá  r€  rå  rŽ   ræ  rŽ   r  ú
Expr | intr¼   rï  )	rw   r  r  r
  r0  rE   rD   Úevaluate_minÚevaluate_max)rÔ  r�   rB  ÚstartÚendrî  rë  rí  ré  rê  r  s   `     @@@@@r‘   Únormalize_start_endzSliceView.normalize_start_endÔ  sá   ý€ ô —7‘7×#Ñ#ˆØ—:‘:“< Ñ$ˆäÑH°%¸¸hÐ1GÔHÔHÜˆHÜ‰HÜñ 
ð ˜S (Ð+ô
ô 
ô ˆHÜ‰Hà×,Ñ,ˆHØ×,Ñ,ˆH÷		 ð	,Øð	,Ø$'ð	,Ø03ð	,Ø>Hð	,à÷	,ñ ˜5 ! X¨qÓ1ˆÙ˜˜e X¨xÓ8ˆØ�cˆzÐr“   c           	     óœ  ‡‡‡‡— t        j                  ‰«      Št        ‰t        «      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   |j                   «      }
t#        ||
¬«      S 	 	 	 	 dˆˆˆˆfd„}t%        |‰|¬«      S # t        $ r Y �Œw xY w)Nr   l   ÿÿÿÿ rI   rL  c                ó‚   •— t        | «      t        ‰«      k(  sJ d| › d‰› �«       ‚t        | «      } | ‰   ‰z  ‰z   | ‰<   | S )Nzwrong ndim rg  )rÍ   r©   )rÏ   rB  rG  rò  Ústeps    €€€€r‘   rÒ   z!SliceView.create.<locals>.reindex1  sR   ø€ ô �u“:¤ X£Ò.ÐP°+¸e¸WÀAÀhÀZÐ0PÓPÐ.Ü˜“KˆEØ˜s™ dÑ*¨UÑ2ˆE�#‰JØˆLr“   rv  rS  )r°   rÕ  r�   r    Ú	TypeErrorr©   r
  rô  rC   r  rO  r  rP  r  r  rQ  rR  rS  rÜ  )rÔ  r�   rB  rò  ró  r÷  rë  rV  rW  rX  rY  rÒ   rG  s     `` `      @r‘   r�  zSliceView.create  sk  û€ ô �|‰|˜DÓ!ˆÜ˜$¤Ô%¨°ªÐ7°4Ó7Ð1ð	Ø˜Š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¸Ô@Ð@øôK ò 	Úð	ús   ·D> Ä>	EÅ
EN)
r�   r‰   rB  rŽ   rò  rŽ   ró  rŽ   r¼   ztuple[int, int])rI   T)r�   r‰   rB  rŽ   rò  rŽ   ró  rŽ   r÷  rŽ   rë  r�   r¼   r‰   )r¢   r£   r¤   r‚  r  rô  r�  r¦   r“   r‘   rÜ  rÜ  Î  s­   „ ñð
 ð/Øð/Ø ð/Ø),ð/Ø36ð/à	ò/ó ð/ðb ð Øð3Aàð3Að ð3Að ð	3Að
 ð3Að ð3Að ð3Að 
ò3Aó ñ3Ar“   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  rj  r  c                 ó   — y©Nr¦   r¦   r�  s    r‘   r
  zBaseConstant.get_sizeB  s   € Ør“   c                ó   — | j                   S rŒ   rÌ  r�  s    r‘   r  zBaseConstant.get_deviceE  rÍ  r“   c                 ó   — y rŒ   r¦   r�  s    r‘   rª  zBaseConstant.get_origin_nodeH  r®  r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   r£  zBaseConstant.get_readsK  r«  r“   Nr~  rg  rV  rz  )r¢   r£   r¤   r¥   r
  r  rª  r£  r¦   r“   r‘   rú  rú  =  s"   … àÓØÓóóóôr“   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  rj  r  c                ó   ‡ — dˆ fd„}|S )Nc                óX   •— t        j                  ‰j                  ‰j                  «      S rŒ   )ru   r  r  r  ©rÏ   r‘  s    €r‘   r  z$Constant.make_loader.<locals>.loaderV  s   ø€ Ü—<‘< §
¡
¨D¯J©JÓ7Ð7r“   rk  r¦   rÂ  s   ` r‘   r  zConstant.make_loaderU  s   ø€ õ	8ð ˆr“   c                 ó   — y rŒ   r¦   r�  s    r‘   rø  zConstant.realize[  r  r“   c                óF   — t        | j                  | j                  |¬«      S )N)r  r  r  )r  r  r  rÿ  s     r‘   rH  zConstant.constant_to_device^  s   € Ü˜dŸj™j°·
±
À6ÔJÐJr“   Nrk  rd  r€  )r¢   r£   r¤   r¥   r  rø  rH  r¦   r“   r‘   r  r  O  s#   … àƒJØÓØÓóóôKr“   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  rj  r  c                ó   ‡ — dˆ fd„}|S )Nc                óX   •— t        j                  ‰j                  ‰j                  «      S rŒ   )ru   rÖ  rÏ   r  r  s    €r‘   r  z,IndexingConstant.make_loader.<locals>.loaderi  s   ø€ Ü—>‘> $§*¡*¨d¯j©jÓ9Ð9r“   rk  r¦   rÂ  s   ` r‘   r  zIndexingConstant.make_loaderh  s   ø€ õ	:ð ˆr“   c                óF   — t        | j                  | j                  |¬«      S )N)rÏ   r  r  )r  rÏ   r  rÿ  s     r‘   rH  z#IndexingConstant.constant_to_devicen  s   € Ü d§j¡j¸¿
¹
È6ÔRÐRr“   Nrk  r€  )r¢   r£   r¤   r¥   r  rH  r¦   r“   r‘   r  r  b  s   … àƒJØÓØÓóôSr“   r  c                ó8  — d}d}t        t        t        || «      «      «      D ]u  \  }}|dk(  rŒt        j                  j
                  j                  ||«      s,t        j                  j
                  j                  ||«      s y|t        d|«      z  }||z  }Œw y©NrI   FT)Úreversedrª   rÖ   rw   r  r  rI  rD   )r  rA  Úexpected_strideÚexpected_stride_maxr�   Úys         r‘   Úis_contiguous_strides_for_shaper  r  s˜   € ð €OØÐÜœœs 5¨&Ó1Ó2Ó3ò 
‰ˆˆ1Ø�Š6Øä�w‰w×Ñ×7Ñ7Øˆô
ä—'‘'×"Ñ"×:Ñ:¸1Ð>QÔRÙàœs 1 a›yÑ(ÐØ˜1Ñ‰ð
ð r“   c                ó<   — t         j                  | j                  z  S rŒ   )rJ   Úpadding_alignment_bytesÚitemsizerÖ  s    r‘   Úget_align_for_dtyper  †  s   € Ü×)Ñ)¨U¯^©^Ñ;Ð;r“   c                  ó2   — e Zd ZdZdd„Zdd„Z	 d	 	 	 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  r�  s    r‘   r  zOutputSpec.get_deviceŽ  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r�  s    r‘   rþ  zOutputSpec.storage_size‘  r  r“   c                ó>   — t        t        | «      j                  «      ‚rŒ   r  r=  s     r‘   r>  zOutputSpec.get_free_symbol_uses”  r'  r“   Nrg  r{  rr  r}  )r¢   r£   r¤   r‚  r  rþ  r>  r¦   r“   r‘   r  r  Š  s,   „ ñCó7ó7ð %*ð7Ø!ð7à	!ô7r“   r  c                  óÔ  — e Zd ZdZd ed«      df	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Zej                  dd„«       Zed d„«       Z	e	j                  d!d	„«       Z	ed"d
„«       Z
e
j                  d#d„«       Z
d$d„ZeZd%d„Zd&d„Zd'd„Ze	 	 	 	 	 	 d(d„«       Zd'd„Ze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 ed «      	 d0	 	 	 d1d„«       Zy)2rç  zo
    Layout base class

    Carries tensor meta-information including offset and
    whether it is pinned.
    Nr   Fc                óP  — |€t         j                  |«      }|| _        || _        t	        |«      t	        |«      k(  sJ d|› d|› �«       ‚t        d„ |D «       «      sJ ‚|| _        || _        || _        || _	        | j                  r!| j                  j                  dk(  sJ d«       ‚y y )Nrt  ú	, stride=c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wrŒ   )r�   rƒ   rç   s     r‘   rê   z"Layout.__init__.<locals>.<genexpr>²  s   è ø€ Ò9¨q”:˜a¤×*Ñ9ùr|  r!  zOnly CPU tensors can be pinned)r  r  r  r  rÍ   rì   Ú_sizeÚ_strideÚ_offsetrR  r·   )r‘  r  r  r  r  rQ  rR  s          r‘   r]  zLayout.__init__£  s¬   € ð ˆ>Ü#×6Ñ6°tÓ<ˆFàˆŒØˆŒ
Ü�4‹yœC ›KÒ'ÐH¨5°°°iÀ¸xÐ)HÓHÐ'ÜÑ9°DÔ9Ô9Ð9Ð9ØˆŒ
ØˆŒØˆŒØ"ˆŒà—N’N¨¯©×(8Ñ(8¸EÒ(Að 	
Ø,ó	
ÐBÐ(A�Nr“   c                ó   — | j                   S rŒ   ©r  r�  s    r‘   r  zLayout.size¼  ó   € à�z‰zÐr“   c                ó   — || _         y rŒ   r#  ©r‘  r  s     r‘   r  zLayout.sizeÀ  s	   € àˆ�
r“   c                ó   — | j                   S rŒ   ©r   r�  s    r‘   r  zLayout.strideÄ  ó   € à�|‰|Ðr“   c                ó   — || _         y rŒ   r(  r&  s     r‘   r  zLayout.strideÈ  ó	   € àˆ�r“   c                ó   — | j                   S rŒ   ©r!  r�  s    r‘   rQ  zLayout.offsetÌ  r)  r“   c                ó   — || _         y rŒ   r-  r&  s     r‘   rQ  zLayout.offsetÐ  r+  r“   c                ó–  — d}| j                   dk7  rd| j                   › �}| j                  j                  €dnd| j                  j                  › �}d}| j                  rd| j                  › �}t	        | «      j
                  › d| j                  j                  › |› d| j                  › d| j                  › d	| j                  › |› |› d
�S )NrÂ  r   z	, offset=ú:z, is_pinned=z('z', z, size=r  r  )	rQ  r  rÏ   rR  r·   r¢   r  r  r  )r‘  rQ  Údevice_index_strÚis_pinned_strs       r‘   rÉ  zLayout.__str__Ô  sÈ   € ØˆØ�;‰;˜!ÒØ  §¡ Ð.ˆFà!%§¡×!2Ñ!2Ð!:™2À!ÀDÇKÁK×DUÑDUÐCVÐ@WÐØˆØ�>Š>Ø*¨4¯>©>Ð*:Ð;ˆMä�D‹z×"Ñ"Ð# 2 d§k¡k×&6Ñ&6Ð%7Ð8HÐ7IÈÈTÏZÉZÈLð YØ—I‘I�;˜i¨¯© }°V°H¸]¸OÈ1ðNð	
r“   c                ó   — | j                   S rŒ   rÌ  r�  s    r‘   r  zLayout.get_deviceä  rÍ  r“   c                ó
  — t         j                  5  t        j                  t	        | j
                  «      t	        | j                  «      | j                  | j                  | j                  ¬«      cd d d «       S # 1 sw Y   y xY w)N)r  r  Ú
pin_memory)
rw   Ú	fake_moder  r  re   r  r  r  r  rR  r�  s    r‘   Úget_examplezLayout.get_exampleç  sY   € Ü�[‰[ñ 	Ü×&Ñ&Ü'¨¯	©	Ó2Ü'¨¯©Ó4Ø—j‘jØ—{‘{ØŸ>™>ô÷	÷ 	ò 	ús   ‘AA9Á9Bc                óB   — t        | j                  | j                  «      S rŒ   )r  r  r  r�  s    r‘   rù  zLayout.is_contiguousñ  s   € Ü.¨t¯{©{¸D¿I¹IÓFÐFr“   c                óŒ   — t        | «      }|dvs| d   dk(  ryt        |t        | «      | «      D ]  \  }}}|dk7  sŒ||k7  sŒ y y)N)rã   é   rI   FT)rÍ   rÖ   r1   )rA  rU  ÚndimÚleftÚrightr  s         r‘   Úis_channels_last_contiguousz"Layout.is_channels_last_contiguousô  sb   € ô �5‹zˆØ�vÑ  q¡¨Q¢ØÜ!$àä*¨5Ó1Øó"
ò 	ÑˆD�%˜ð �q‹y˜T U›]Ùð	ð r“   c                óâ   — t        | j                  t        t        j	                  t        t        | j                  «      «      «      «      | j                  «      D ]  \  }}}|dk7  sŒ||k7  sŒ y yr  )rÖ   r  r  r  r  r©   r  )r‘  r<  r=  r  s       r‘   Ú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›]Ùð	ð r“   c                ól  — t         j                  j                  }|j                  t	        j
                  |d«      «      ry|j                  t	        j
                  | d«      «      ry|j                  t	        j                  | |«      «      xs( |j                  t	        j
                  | |z  d«      «      S )zŒ
        Returns true if left is symbolically greater than or equal to right,
        assuming both expressions are tensor strides.
        r   TF)rw   r  r  r8  r°   r0  ÚGe)r<  r=  r  s      r‘   Ú_stride_expr_ge_or_falsezLayout._stride_expr_ge_or_false  s�   € ô —7‘7×#Ñ#ˆØ×"Ñ"¤5§8¡8¨E°1Ó#5Ô6ØØ×"Ñ"¤5§8¡8¨D°!Ó#4Ô5ØØ×&Ñ&Ü�H‰H�T˜5Ó!ó
ò @à×$Ñ$¤U§X¡X¨d°U©l¸AÓ%>Ó?ð	@r“   c                ó  — t        | j                  «      t        |«      k(  sJ ‚t        | j                  «      D ��cg c]1  \  }}t        j
                  j                  j                  |d«      s|‘Œ3 }}}|D �cg c]  }| j                  |   ‘Œ }}|D �cg c]  }||   ‘Œ	 }}dd„} ||«      }dgt        |«      z  }t        t        |«      «      D ]  }||   |||   <   Œ t        t        |«      dz
  «      D ]u  }||   }||dz      }	t        j
                  j                  j                  t        j                  ||	«      «      rŒN| j                  ||	«      r y| j                  |	|«      rŒu y yc c}}w c c}w c c}w )NrI   c                ó`   — t        | «      }| D �cg c]  }|j                  |«      ‘Œ c}S c c}w rŒ   )r—  rÏ   )ÚarrÚ
sorted_arrÚelements      r‘   Úsorted_indicesz0Layout.is_stride_ordered.<locals>.sorted_indices,  s*   € Ü ›ˆJØ=@ÖA°'�J×$Ñ$ WÕ-ÒAÐAùÒAs   �+r2  FT)rF  rt  r¼   rt  )rÍ   r  rò   r  rw   r  r  rI  rÎ   r8  r°   r0  rC  )
r‘  r×   rÐ   rB  Únon_1_indicesr  rI  Ústride_orderedr<  r=  s
             r‘   r  zLayout.is_stride_ordered  sy  € Ü�4—;‘;Ó¤3 u£:Ò-Ð-Ð-ô
 $ D§I¡IÓ.÷
á��3Ü—7‘7×#Ñ#×;Ñ;¸CÀÔCò ð
ˆñ 
ð +8Ö8 Q�$—+‘+˜a“.Ð8ˆÐ8Ø2?Ö@¨Q  a£Ð@ˆÐ@ó	Bñ
 ˜uÓ%ˆð ˜¤ E£
Ñ*ˆÜ”s˜5“zÓ"ò 	1ˆAØ'-¨a¡yˆN˜5 ™8Ò$ð	1ô ”s˜5“z A‘~Ó&ò 	ˆAØ! !Ñ$ˆDØ" 1 q¡5Ñ)ˆEÜ�w‰w×Ñ×.Ñ.¬u¯x©x¸¸eÓ/DÔEØØ×,Ñ,¨T°5Ô9ÙØ×0Ñ0°¸Õ=Ùð	ð ùó=
ùò 9ùÚ@s   ¼6E2Á9E8ÂE=c                ó²   — dgt        t        t        dt        | j                  «      dz
  «      «      «      z   }t        |«      g|z   }| j                  |«      S ©Nr   rI   )r©   r  rÎ   rÍ   r  r  r)  s     r‘   Úis_channels_last_stride_orderedz&Layout.is_channels_last_stride_orderedC  sN   € à�”dœ8¤E¨!¬S°·±Ó-=ÀÑ-AÓ$BÓCÓDÑDˆÜ�U“�˜uÑ$ˆØ×%Ñ% eÓ,Ð,r“   c                óF  ‡‡— 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 «       «       }t        j                  s|r| S t        t        j                  d«      rt        j                  j                   ndŠdˆfd„Š‰rt#        ˆfd	„| D «       «      r| S t%        | ‰«      }t'        |«      }t)        t        | «      «      D �cg c]  }d‘Œ }	}d
|	|d   <   d}
t+        |d
d d
¬«      D ]—  \  }}||d
z
     }|	|   ||   z  }t-        |t.        t0        j2                  f«      xr |t        j4                  kD  xr ||z  dk7  xs" t-        |t6        «      xr t        j                  }||	|<   |sŒ„t9        ||«      |z  |	|<   d}
Œ™ |
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   rb  Údislike_paddingFc              3  ó\   K  — | ]$  }t        |t        t        j                  f«      –— Œ& y ­wrŒ   ræ   rç   s     r‘   rê   z&Layout._pad_strides.<locals>.<genexpr>b  s(   è ø€ ò 
àô �qœ3¤§¡Ð.×/ñ
ùrë   Ú
_shape_envNc                óh   •— ‰€yt        | t        «      syt        ˆfd„| j                  D «       «      S )NFc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrŒ   )Úis_unbacked_symint)rè   ré   rî   s     €r‘   rê   zILayout._pad_strides.<locals>.contains_unbacked_symints.<locals>.<genexpr>p  s   øè ø€ ÒR¸1�y×3Ñ3°A×6ÑRùs   ƒ)r�   r    r0  r5   )rŽ  rî   s    €r‘   Úcontains_unbacked_symintsz6Layout._pad_strides.<locals>.contains_unbacked_symintsk  s0   ø€ ØÐ ØÜ˜d¤DÔ)ØÜÓRÀ×@QÑ@QÔRÓRÐRr“   c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrŒ   r¦   )rè   ré   rV  s     €r‘   rê   z&Layout._pad_strides.<locals>.<genexpr>s  s   øè ø€ ÒN¸aÑ6°q×9ÑNùr�  rI   )rò  T)rŽ  rï  r¼   r�   )r  rÍ   rJ   Úpad_channels_lastrç  r>  rw   Úget_current_noder¶  rb  r»  rì   rÑ  ÚchainÚpad_dynamic_shapesr  rR  r0  rü   r÷   rÎ   rò   r�   rŽ   r°   r!   Úpadding_stride_thresholdr    rc   r'   Únum_comprehensive_padding)Ú
in_stridesr  r  ÚalignÚcurrent_fx_noderm   r  rö   rù   Únew_stridesÚpaddedÚrankró   Úprev_idxr  Úrequire_paddingrV  rî   s                   @@r‘   rø  zLayout._pad_stridesI  s,  ù€ ô $ EÓ*ˆÜˆz‹?˜aÒØÐä×'Ò'¬F×,NÑ,NØ�*ô-
ð Ðä×,Ñ,Ó.ˆÜ�? FÔ+°×0DÑ0D×0HÑ0HØ˜uô1
ð Ðô ñ 
ä—_‘_ Z°Ó6ô
ó 
ð 
ˆ
ô ×(Ò(©ZØÐä*1´!·'±'¸<Ô*H”A—G‘G×&Ò&Èdˆ	õ	Sñ œÓNÀ:ÔNÔNØÐä'¨
°IÓ>ˆÜ,¨\Ó:ˆ
ä"'¬¨J«Ó"8Ö9˜Q’qÐ9ˆÐ9ð &'ˆ�J˜q‘MÑ"àˆÜ" :¨a¨b >¸Ô;ò 	‰IˆD�#Ø! $¨¡(Ñ+ˆHØ  Ñ*¨T°(©^Ñ;ˆFô ˜6¤C¬¯©Ð#7Ó8ò (ØœV×<Ñ<Ñ<ò(à˜U‘N aÑ'òJô ˜V¤TÓ*ÒH¬v×/HÑ/Hð	 ð
  &ˆK˜ÑÚÜ#*¨6°5Ó#9¸EÑ#A�˜CÑ Ø‘ð	ñ ð Ðô 	×)Ò)¨QÑ.Õ)ØÐùò; :s   Å 	Hc                óÌ   — t        | t        «      sJ t        | «      «       ‚| j                  €J ‚| j	                  | j                  | j
                  | j                  «      | _        y rŒ   )r�   r  r·   r  rø  r  r  r�  s    r‘   Úpad_strideszLayout.pad_strides˜  sM   € Ü˜$¤Ô/Ð;´°d³Ó;Ð/Ø�{‰{Ð&Ð&Ð&Ø×'Ñ'¨¯©°T·Y±YÀÇ
Á
ÓKˆ�r“   c                óF   — t         j                  xr t        | t        «      S rŒ   )rJ   Úcomprehensive_paddingr�   r  r�  s    r‘   r÷  zLayout.should_pad_strides�  s   € Ü×+Ñ+ÒP´
¸4ÄÓ0PÐPr“   c                óþ   — t        | t        «      r| S | j                  «       r| j                  «        t        | j                  | j
                  | j                  | j                  | j                  | j                  «      S rŒ   )
r�   rP  r÷  rg  r  r  r  r  rQ  rR  r�  s    r‘   Úas_fixedzLayout.as_fixed   s`   € Ü�dœKÔ(ØˆKà×"Ñ"Ô$Ø×ÑÔÜØ�K‰KØ�J‰JØ�I‰IØ�K‰KØ�K‰KØ�N‰Nó
ð 	
r“   c                óš   — t         j                  sJ dt        | «      j                  › d�«       ‚| j	                  «       j                  «       S )Nzconvert z to FixedLayout first)r  rß  r·   r¢   rk  r
  r�  s    r‘   r
  zLayout.make_indexer¯  sG   € Ü×,Ò,ð 	
Ø”t˜D“z×*Ñ*Ð+Ð+@ÐAó	
Ð,ð �}‰}‹×+Ñ+Ó-Ð-r“   c                óf  — t        |t        «      xr  | j                  |j                  k(  xr… | 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  r  rQ  rR  )r‘  Úothers     r‘   Ú__eq__zLayout.__eq__µ  s—   € ä�uœfÓ%ò 2Ø—‘˜uŸ|™|Ñ+ò2à—
‘
˜eŸk™kÑ)ò2ð —	‘	˜UŸZ™ZÑ'ò2ð —‘˜uŸ|™|Ñ+ò	2ð
 —‘˜uŸ|™|Ñ+ò2ð —‘ %§/¡/Ñ1ð	
r“   c                óX   — t        | j                  | j                  | j                  «      S rŒ   )r-   r  r  rQ  r�  s    r‘   rþ  zLayout.storage_sizeÀ  s   € Ü.¨t¯y©y¸$¿+¹+ÀtÇ{Á{ÓSÐSr“   c                óŠ   — t        | j                  |«      t        | j                  |«      z  t        | j                  |«      z  S rŒ   )r)   r  r  rQ  r=  s     r‘   r>  zLayout.get_free_symbol_usesÃ  s=   € ô
 ˜TŸY™Y¨Ó6Ü˜tŸ{™{¨MÓ:ñ;ä˜tŸ{™{¨MÓ:ñ;ð	
r“   )r  rj  r  r\  r  ra  r  zSequence[Expr] | NonerQ  r    rR  r�   r¼   r½   r`  )r  ra  r¼   r½   r~  ©r  r  r¼   r½   rc  ©r  r    r¼   r½   ro  ri  )r¼   útorch.Tensorr_  )rA  ra  rU  ra  r¼   r�   )r<  rƒ   r=  rƒ   r¼   r�   )r×   rt  r¼   r�   )r^  rt  r  r  r  r\  r¼   rt  rS  ©r¼   rP  rm  )rn  rÇ   r¼   r�   rr  r}  )r¢   r£   r¤   r‚  r!   r]  rˆ  r  Úsetterr  rQ  rÉ  r  r  r7  rù  r…  r>  r@  rC  r  rN  rø  rg  r÷  rk  r
  ro  rþ  rb   r>  r¦   r“   r‘   rç  rç  š  sÙ  „ ñð )-Ù˜q“zØð
àð
ð ð
ð !ð	
ð
 &ð
ð ð
ð ð
ð 
ó
ð2 òó ðð 
‡[�[òó ðð òó ðð ‡]�]òó ðð òó ðð ‡]�]òó ðó
ð €HóóóGð ðØ!ðØ,>ðà	òó ðó"ð ò@ó ð@ó"óH-ð ðLØ!ðLØ)7ðLØ@KðLà	òLó ðLó\Ló
Qó
ó.ó	
óTñ ˜HÓ%à$)ð
Ø!ð
à	!ò
ó &ñ
r“   rç  c                  ó   — e Zd ZdZdd„Zy)rP  z A Tensor layout we cannot changec                óX   — t        | j                  | j                  | j                  «      S )rL  )rÝ  r  r  rQ  r�  s    r‘   r
  zFixedLayout.make_indexerÑ  s   € ä˜dŸi™i¨¯©°d·k±kÓBÐBr“   Nrm  )r¢   r£   r¤   r‚  r
  r¦   r“   r‘   rP  rP  Î  s   „ Ù*ôCr“   rP  c                  ó²  ‡ — e Zd ZdZdZ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j                  dd
„«       Zedd„«       Zej                  dd„«       Zedd„«       Zej                  dd„«       Z	 d 	 	 	 	 	 d!d„Z	 d 	 	 	 	 	 d"d„Zd#d„Zd$d„Zd%d„Zd&d„Z	 	 d'	 	 	 	 	 	 	 	 	 	 	 d(ˆ fd„Zˆ xZS ))r  z|
    A Tensor layout that we are allowed to change

    Assumption: layout change should NOT add or remove free symbols
    Fc                óH   — t        j                  | «      j                  «       S )zÞ
        Compute what the strides would be if this layout were frozen,
        without actually modifying the layout. This is used for speculative
        stride computation during Triton template code generation.
        )r‹  Údeepcopyrk  r�  s    r‘   Ú!get_fixed_layout_without_freezingz0FlexibleLayout.get_fixed_layout_without_freezingß  s   € ô �}‰}˜TÓ"×+Ñ+Ó-Ð-r“   c                óÔ   — t        | «      dk(  rg S t        j                  j                  g}t	        | dd  «      D ]  }|j                  ||d   z  «       Œ t        t	        |«      «      S )Nr   rI   r2  )rÍ   r°   rÙ  r–  r  rÇ  r©   )ÚsizesÚreversed_stridesr  s      r‘   r  z!FlexibleLayout.contiguous_stridesé  sh   € äˆu‹:˜Š?ØˆIÜ!ŸG™GŸK™K˜=ÐÜ˜U 1 2˜YÓ'ò 	AˆDØ×#Ñ# DÐ+;¸BÑ+?Ñ$?Õ@ð	Aä”HÐ-Ó.Ó/Ð/r“   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°   rÙ  r–  )r~  r×   Únext_striderU  rÐ   s        r‘   Ú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ð ˆr“   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  r‚  )r~  r×   rö   s      r‘   rK  zFlexibleLayout.stride_ordered  sB   € ô œ%¤ E£
Ó+Ó,´
¸5Ó0AÒAÐAÐAÜ,¨UÓ3ˆ
Ü×*Ñ*¨5°*Ó=Ð=r“   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  rK  ÚNHWC_STRIDE_ORDERÚchannels_last_3dÚNHWDC_STRIDE_ORDERÚcontiguous_formatr  r±  r¹  rÙ  )r~  Úmemory_formats     r‘   Ú 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Øôô &Ð%r“   c                ó  — t        | «      t        |«      k(  sJ ‚t        j                  j                  j	                  |«      }t        t        t        |«      «      |j                  ¬«      }t        j                  | |«      S )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Í   rw   r  r  Úguarding_hints_or_throwr—  rÎ   Ú__getitem__r  r‚  )r~  r  rö   s      r‘   Úsame_orderedzFlexibleLayout.same_ordered*  sb   € ô �5‹zœS ›[Ò(Ð(Ð(Ü—‘×!Ñ!×9Ñ9¸&ÓAˆÜœE¤# f£+Ó.°F×4FÑ4FÔGˆ
Ü×*Ñ*¨5°*Ó=Ð=r“   c                ó   — | j                   S rŒ   r#  r�  s    r‘   r  zFlexibleLayout.size9  r$  r“   c                ó6   — | j                  d|«       || _        y )Nr  )Ú!assert_free_symbol_uses_unchangedr  r&  s     r‘   r  zFlexibleLayout.size=  s   € à×.Ñ.¨v°uÔ=Øˆ�
r“   c                ó   — | j                   S rŒ   r(  r�  s    r‘   r  zFlexibleLayout.strideB  r)  r“   c                ó6   — | j                  d|«       || _        y )Nr  )r’  r   r&  s     r‘   r  zFlexibleLayout.strideF  ó   € à×.Ñ.¨x¸Ô?Øˆ�r“   c                ó   — | j                   S rŒ   r-  r�  s    r‘   rQ  zFlexibleLayout.offsetK  r)  r“   c                ó6   — | j                  d|«       || _        y )NrQ  )r’  r!  r&  s     r‘   rQ  zFlexibleLayout.offsetO  r•  r“   c                ó0  — | j                  | j                  |«      }| j                  «       r)|r'| j                  || j                  | j                  «      }t        | j                  | j                  | j                  || j                  | j                  «      S rŒ   )	rK  r  r÷  rø  r  rP  r  rQ  rR  )r‘  r×   r%  rX  s       r‘   Úas_stride_orderzFlexibleLayout.as_stride_orderT  sw   € ð ×(Ñ(¨¯©°EÓ:ˆ
Ø×"Ñ"Ô$©Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJäØ�K‰KØ�J‰JØ�I‰IØØ�K‰KØ�N‰Nó
ð 	
r“   c                óü   — |}| j                  «       r)|r'| j                  || j                  | j                  «      }t	        | j
                  | j                  | j                  || j                  | j                  «      S rŒ   )r÷  rø  r  r  rP  r  rQ  rR  )r‘  r0  r%  rX  s       r‘   Úas_exact_strideszFlexibleLayout.as_exact_stridesd  sf   € ð #ˆ
Ø×"Ñ"Ô$©Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJäØ�K‰KØ�J‰JØ�I‰IØØ�K‰KØ�N‰Nó
ð 	
r“   c                ó,  — | j                  | j                  |«      }| j                  «       r'| j                  || j                  | j                  «      }t        | j                  | j                  | j                  || j                  | j                  «      S rŒ   )	r‚  r  r÷  rø  r  rP  r  rQ  rR  )r‘  r×   rX  s      r‘   Úas_fill_orderzFlexibleLayout.as_fill_ordert  ss   € Ø$(×$5Ñ$5°d·i±iÀÓ$Gˆ
Ø×"Ñ"Ô$Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJÜØ�K‰KØ�J‰JØ�I‰IØØ�K‰KØ�N‰Nó
ð 	
r“   c                ó,  — | j                  | j                  |«      }| j                  «       r'| j                  || j                  | j                  «      }t        | j                  | j                  | j                  || j                  | j                  «      S rŒ   )	r�  r  r÷  rø  r  rP  r  rQ  rR  )r‘  r  rX  s      r‘   Úas_same_orderzFlexibleLayout.as_same_order�  ss   € Ø×&Ñ& t§y¡y°&Ó9ˆ
Ø×"Ñ"Ô$Ø×*Ñ*¨:°t·y±yÀ$Ç*Á*ÓMˆJÜØ�K‰KØ�J‰JØ�I‰IØØ�K‰KØ�N‰Nó
ð 	
r“   c           
     ór   — i }dD ]/  }dD ](  }||f}t        t        t        | |«      |«      «      ||<   Œ* Œ1 |S )N)r  r  rQ  ©TF)r@   r)   rÂ   )r‘  Úinitial_free_symbolsrÅ   ri  r�  s        r‘   Úget_initial_free_symbol_usesz+FlexibleLayout.get_initial_free_symbol_usesŽ  sY   € Ø!ÐØ0ò 	ˆDØ!.ò �Ø˜]Ð+�Ü,6Ü$¤W¨T°4Ó%8¸-ÓHó-Ð$ SÒ)ñð	ð $Ð#r“   c                ó‚   — dD ]:  }| j                   ||f   }t        t        ||«      «      }||k(  rŒ/J d|› d|› �«       ‚ y )Nr¡  z)Expected free symbols unchanged, but got z vs )r¢  r@   r)   )r‘  rÅ   r  ri  Úold_free_symbolsÚnew_free_symbolss         r‘   r’  z0FlexibleLayout.assert_free_symbol_uses_unchanged™  sd   € Ø*ò 	ˆMØ#×8Ñ8¸$ÀÐ9NÑOÐÜ)Ô*:¸5À-Ó*PÓQÐØ#Ð'7Ó7ð Ø;Ð<LÐ;MÈTÐRbÐQcÐdóÐ7ñ	r“   c                ó´   •— |rt         j                  ||«      }nt         j                  |«      }t        ‰| �  |||||¬«       | j                  «       | _        y )N©rR  )r  r‚  r  rn  r]  r£  r¢  )r‘  r  r  r  r  rR  rU  rp  s          €r‘   r]  zFlexibleLayout.__init__¡  sU   ø€ ñ Ü$×1Ñ1°$¸ÓE‰Gä$×7Ñ7¸Ó=ˆGÜ‰Ñ˜ ¨¨gÀÐÔKð %)×$EÑ$EÓ$GˆÕ!r“   ru  )r~  rt  r¼   rG  )r~  rt  r×   rt  r¼   rG  )r~  rt  r×   rt  r¼   r  )r~  rt  rŠ  ztorch.memory_formatr¼   r  )r~  rt  r  ra  r¼   r  r~  rr  rc  rs  rr  )r×   rt  r%  r�   r¼   rP  )r0  ra  r%  r�   r¼   rP  )r×   rt  r¼   rP  )r  ra  r¼   rP  )r¼   z$dict[tuple[str, bool], sympy.Symbol])rÅ   rÈ   r  r9   r¼   r½   r  )r  rj  r  r\  r  r  r  úSequence[int | Integer] | NonerR  r�   r¼   r½   )r¢   r£   r¤   r‚  rß  r|  r…  r  r‚  rK  r‹  r�  rˆ  r  rv  r  rQ  r™  r›  r�  rŸ  r£  r’  r]  rI  rJ  s   @r‘   r  r  Ö  sÛ  ø„ ñð €Nó.ð ò0ó ð0ð òó ðð  ò	>ó ð	>ð ð&Øð&Ø-@ð&à	ò&ó ð&ð4 ð>Øð>Ø&8ð>à	ò>ó ð>ð òó ðð 
‡[�[òó ðð òó ðð ‡]�]òó ðð òó ðð ‡]�]òó ðð
 ;@ð
Ø"ð
Ø37ð
à	ó
ð" HMð
Ø/ð
Ø@Dð
à	ó
ó 
ó
ó	$óð 8<ØðHàðHð ðHð ð	Hð
 5ðHð ðHð 
÷Hñ Hr“   r  c                  ó\   ‡ — e Zd ZdZdˆ fd„Zdd„Zdd„Z ed «      	 d		 	 	 d
d„«       Zˆ xZ	S )ÚNonOwningLayoutz,Is a view into the storage of another tensorc                ó¨   •— |j                  «       }t        ‰| �	  |j                  |j                  |j
                  |j                  «       || _        y rŒ   )r  rn  r]  r  r  r  r  Úview)r‘  r­  rN  rp  s      €r‘   r]  zNonOwningLayout.__init__·  sA   ø€ Ø—‘Ó"ˆÜ‰ÑØ�M‰MØ�L‰LØ�K‰KØ�M‰Mô		
ð ˆ�	r“   c                ó>   — | j                  «       j                  «       S rŒ   )rk  r
  r�  s    r‘   r
  zNonOwningLayout.make_indexerÁ  s   € Ø�}‰}‹×+Ñ+Ó-Ð-r“   c                ó¶   — | j                   j                  «       j                  }|dk(  ryddlm} t
        j                  j                  j                  ||«      S )Nr   TrI   )Ú	ALIGNMENT)	r­  r  rQ  Úutilsr°  rw   r  r  r  )r‘  rQ  r°  s      r‘   Úmaybe_guard_alignedz#NonOwningLayout.maybe_guard_alignedÄ  sD   € Ø—‘×%Ñ%Ó'×.Ñ.ˆØ�QŠ;ØÝ$ä�w‰w×Ñ×<Ñ<¸VÀYÓOÐOr“   c                ó4  — t        | j                  t        «      sJ ‚| j                  j                  }t        |t        «      sJ t        |«      «       ‚|j                  }t        |t        «      sJ t        |«      «       ‚|j                  j                  |«      S rŒ   )	r�   r­  rS  rM  rq  r·   rr  rN  r>  )r‘  ri  ÚboxÚinput_buffers       r‘   r>  z$NonOwningLayout.get_free_symbol_usesÌ  sw   € ô ˜$Ÿ)™)¤_Ô5Ð5Ð5Ø�i‰i�n‰nˆÜ˜#œzÔ*Ð5¬D°«IÓ5Ð*Ø—x‘xˆÜ˜,¬Ô/Ð:´°c³Ó:Ð/Ø×"Ñ"×7Ñ7¸ÓFÐFr“   )r­  zBaseView | TensorBoxr¼   r½   rm  r_  rr  r}  )
r¢   r£   r¤   r‚  r]  r
  r²  rb   r>  rI  rJ  s   @r‘   r«  r«  ´  sG   ø„ Ù6õó.óPñ Ð-Ó.à$)ðGØ!ðGà	!òGó /ôGr“   r«  c                  ó   — e Zd ZdZy)ÚCommBufferTypeÚsymm_memN)r¢   r£   r¤   ÚSYMM_MEMr¦   r“   r‘   r·  r·  Ø  s   „ Ø�Hr“   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        «      r|j                  «       n|}t        ‰| �  |j
                  |j                  |j                  |j                  |j                  |j                  ¬«       || _        || _        y )N©r  r  r  r  rQ  rR  )r�   r  rk  rn  r]  r  r  r  r  rQ  rR  r¼  r½  )r‘  rN  r¼  r½  Úfixedrp  s        €r‘   r]  zCommBufferLayout.__init__ë  si   ø€ ô &0°¼Ô%G�—‘Ô!ÈVˆÜ‰ÑØ—<‘<Ø—+‘+Ø—‘Ø—<‘<Ø—<‘<Ø—o‘oð 	ô 	
ð !1ˆÔØ$ˆ�r“   )rN  zFlexibleLayout | FixedLayoutr¼  r·  r½  rÈ   )r¢   r£   r¤   r‚  r¥   r]  rI  rJ  s   @r‘   r»  r»  Ü  s;   ø… ñ	ð %Ó$ØƒOð%à,ð%ð )ð%ð ÷	%ñ %r“   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d
„Z	dd„Z
y)Ú
NoneLayoutrh  r  c                 ó   — dgS rò  r¦   r¦   r“   r‘   r�  zNoneLayout.<lambda>	  s   € ÀÀ€ r“   ©Údefault_factoryra  r  c                 ó   — dgS rò  r¦   r¦   r“   r‘   r�  zNoneLayout.<lambda>
  s   € À1À#€ r“   r  c                 ó   — yrò  r¦   r�  s    r‘   rþ  zNoneLayout.storage_size  rÎ  r“   c                ó   — | S rŒ   r¦   r�  s    r‘   rk  zNoneLayout.as_fixed  ó   € Øˆr“   c                ó   — | j                   S rŒ   rÌ  r�  s    r‘   r  zNoneLayout.get_device  rÍ  r“   Nr{  r^  rg  )r¢   r£   r¤   r¥   rƒ  r„  r  r  rþ  rk  r  r¦   r“   r‘   rÂ  rÂ  þ  sG   … ð  ÓØ'�k×'Ñ'¹ÔD€Dˆ)ÓDØ)˜×)Ñ)¹+ÔF€FˆIÓFóóôr“   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d„Z	e
	 d	 	 	 	 	 	 	 dd„«       Zdd„Zdd	„Zˆ xZS )ÚMutationLayoutSHOULDREMOVEc                ó  •— t         ‰| �  |j                  «       |j                  «       |j	                  «       d «       || _        | j                  «       j                  «       }t        j                  j                  |«       y rŒ   )rn  r]  r   r  r
  rT  Ú
get_bufferrs  rw   r  Úmark_buffer_mutated)r‘  rT  rÅ   rp  s      €r‘   r]  z#MutationLayoutSHOULDREMOVE.__init__  se   ø€ Ü‰ÑØ×&Ñ&Ó(Ø×ÑÓØ�O‰OÓØô		
ð ˆŒØ�‰Ó ×)Ñ)Ó+ˆÜ	�‰×#Ñ# DÕ)r“   c                ó6   — | j                  «       j                  S rŒ   )Úreal_layoutr  r�  s    r‘   r  z!MutationLayoutSHOULDREMOVE.stride"  s   € à×ÑÓ!×(Ñ(Ð(r“   c                 ó   — y rŒ   r¦   r&  s     r‘   r  z!MutationLayoutSHOULDREMOVE.stride&  s   € àr“   c                ó>   — | j                  «       j                  «       S rŒ   )rÑ  rþ  r�  s    r‘   rþ  z'MutationLayoutSHOULDREMOVE.storage_size*  s   € Ø×ÑÓ!×.Ñ.Ó0Ð0r“   c                óx   ‡— dˆfd„Š ‰| j                   «      }t        |t        «      sJ t        |«      «       ‚|S )Nc                óÜ   •— t        | t        «      r ‰| j                  «      S t        | t        «      r ‰| j	                  «       «      S t        | t
        «      r ‰| j                  «      S | S rŒ   )r�   rÌ  rT  ro  rp  Ú
MutableBoxrM  )rT  Úunwrap_viewss    €r‘   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ØˆMr“   )rT  r   r¼   r   )rT  r�   rr  r·   )r‘  rN  r×  s     @r‘   rÎ  z%MutationLayoutSHOULDREMOVE.get_buffer-  s6   ø€ õ	ñ ˜dŸk™kÓ*ˆÜ˜&¤&Ô)Ð7¬4°«<Ó7Ð)Øˆr“   c                ó^   — | j                  «       j                  }t        |t        «      sJ ‚|S rŒ   )rÎ  rN  r�   rç  )r‘  rN  s     r‘   rÑ  z&MutationLayoutSHOULDREMOVE.real_layout;  s)   € Ø—‘Ó"×)Ñ)ˆÜ˜&¤&Ô)Ð)Ð)Øˆr“   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}}¬«      }t        |t$        t&        f«      sJ ‚|j                  }|j                  «        t)        |d«      sJ |«       ‚t        |j                  j*                  t,        «      s$J t/        |j                  j*                  «      «       ‚t1        |«      |j                  _        |j                  S c c}}w )Nr   rM  )rø  rw   r  rÏ  rs  r�   rˆ   rM  r  r  r�  r  r  r  rÖ   r
  r  Úcheck_equals_and_simplifyro  rÖ  r¶  rN  r  r·   rÌ  )rÔ  ÚsrcÚdstÚunsafe_aliasrF  rG  r¹   s          r‘   Úrealize_intoz'MutationLayoutSHOULDREMOVE.realize_into@  sI  € ð 	�‰Œô 	
�‰×#Ñ# C§L¡L£NÔ3ä�cœ9Ô%Ø—(‘(ˆCð 	×ÑÔáÜ×#Ñ#Ø—~‘~Ó'Ø—m‘m“oØŸ™Ó*ô !$ C§L¡L£N°C·L±L³NÓ C÷á˜˜1ô —G‘G×$Ñ$×>Ñ>¸qÀ!ÕDóð	 $ó ˆDô ˜d¤X¬zÐ$:Ô;Ð;Ð;Ø—)‘)ˆCà�‰ŒÜ�s˜FÔ#Ð( SÓ(Ð#Ü˜#Ÿ(™(Ÿ/™/¬>Ô:ÐQ¼DÀÇÁÇÁÓ<QÓQÐ:Ü4°SÓ9ˆ�‰ŒØ�x‰xˆùós   Ã4Gc                ó   — | S rŒ   r¦   r�  s    r‘   rk  z#MutationLayoutSHOULDREMOVE.as_fixedh  rÉ  r“   c                ó6   — | j                   j                  «       S rŒ   )rT  r
  r�  s    r‘   r
  z'MutationLayoutSHOULDREMOVE.make_indexerk  rÄ  r“   )rT  r‰   r¼   r½   r~  )r  r   r¼   r½   rc  )r¼   rr  r]  rr  )rÛ  r‰   rÜ  r‰   rÝ  r�   r¼   r‰   )r¼   r   rm  )r¢   r£   r¤   r]  rˆ  r  rv  rþ  rÎ  rÑ  r  rÞ  rk  r
  rI  rJ  s   @r‘   rÌ  rÌ    s…   ø„ õ	*ð ò)ó ð)ð ‡]�]òó ðó1óóð
 à<Að%Øð%Ø%ð%Ø59ð%à	ò%ó ð%óN÷*r“   rÌ  c                  óf  ‡ — 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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d0d„Zd#d„Z	 d1	 	 	 	 	 d2d„Zd3d„Zd4d„Z	 d1	 	 	 	 	 d5d„Zd0d„Zd6d„Zd7d8d„Zd#d„Zd9d„Zd9d„Zd:d„Z ed «      	 d1	 	 	 d;d„«       Z d<d „Z!d=d!„Z"d0d"„Z#ˆ xZ$S )>rr  re  rÅ   r  rN  c                óF   •— t         ‰| �  «        | j                  dd «       y r’  )rn  rš  r–  rª  s    €r‘   rš  zBuffer.__post_init__y  s   ø€ Ü‰ÑÔØ×Ñ ¨tÕ4r“   c                ó>   — | j                  «       j                  «       S rŒ   )r  r
  r�  s    r‘   r
  zBuffer.make_indexer}  s   € Ø�‰Ó ×-Ñ-Ó/Ð/r“   c                ó@   — | j                   sJ | «       ‚| j                   S rŒ   r�  r�  s    r‘   rs  zBuffer.get_name€  s   € Ø�yŠyÐ˜$ÓˆyØ�y‰yÐr“   c                óº   — t        | j                  t        «      r| j                  j                  «       S t	        t        | j                  «      j                  «      ‚rŒ   )r�   rN  rç  r7  rÙ  r·   r¢   r�  s    r‘   r7  zBuffer.get_example„  s=   € Ü�d—k‘k¤6Ô*Ø—;‘;×*Ñ*Ó,Ð,Ü!¤$ t§{¡{Ó"3×"<Ñ"<Ó=Ð=r“   c                ó>   — | j                  «       j                  «       S rŒ   )rã  r  r�  s    r‘   r  zBuffer.get_device‰  s   € Ø×#Ñ#Ó%×0Ñ0Ó2Ð2r“   c                 ó   — y rŒ   r¦   r�  s    r‘   r­  zBuffer.get_defining_opŒ  r®  r“   c                ó6   — | j                  «       j                  S rŒ   )r  r  r�  s    r‘   r  zBuffer.dtype�  s   € à�‰Ó ×&Ñ&Ð&r“   c                ó:   — g | j                  «       j                  ¢S rŒ   )r  r  r�  s    r‘   r
  zBuffer.get_size“  s   € Ø(�—‘Ó"×'Ñ'Ð(Ð(r“   c                ó:   — g | j                  «       j                  ¢S rŒ   )r  r  r�  s    r‘   r4  zBuffer.get_stride–  s   € Ø*�—‘Ó"×)Ñ)Ð*Ð*r“   c                ó6   — | j                  «       j                  S rŒ   )r  rQ  r�  s    r‘   Ú
get_offsetzBuffer.get_offset™  s   € Ø�‰Ó ×'Ñ'Ð'r“   c                óž   — t        | j                  t        «      r| j                  S t        t	        | j                  «      j
                  «      ‚rŒ   )r�   rN  rç  rÙ  r·   r¢   r�  s    r‘   r  zBuffer.get_layoutœ  s4   € Ü�d—k‘k¤6Ô*Ø—;‘;ÐÜ!¤$ t§{¡{Ó"3×"<Ñ"<Ó=Ð=r“   c                ó   — | j                   S rŒ   rÆ  r�  s    r‘   rã  zBuffer.get_output_spec¡  rÍ  r“   c                ó"   — | j                  «       S rŒ   )rð  r�  s    r‘   r;  zBuffer.get_storage_numel¤  s   € Ø�~‰~ÓÐr“   c                ó6   — | j                  «       j                  S rŒ   )r  rR  r�  s    r‘   Úget_is_pinnedzBuffer.get_is_pinned§  s   € Ø�‰Ó ×*Ñ*Ð*r“   c                ó®   — t        | j                  t        «      r;t        | j                  t        «      s | j                  j	                  «       | _        y y y rŒ   )r�   rN  rç  r«  rk  r�  s    r‘   r"  zBuffer.freeze_layoutª  s>   € Ü�d—k‘k¤6Ô*´:Ø�K‰Kœô4
ð Ÿ+™+×.Ñ.Ó0ˆD�Kð4
Ð*r“   c                ó°   — t        | j                  t        «      sJ t        | j                  «      «       ‚| j                  j	                  ||¬«      | _        y ©Nr  )r�   rN  r  r·   r™  r$  s      r‘   r&  z&Buffer.freeze_layout_with_stride_order°  sA   € ô ˜$Ÿ+™+¤~Ô6ÐI¼¸T¿[¹[Ó8IÓIÐ6Ø—k‘k×1Ñ1°%À}Ð1ÓUˆ�r“   c                ó¬   — t        | j                  t        «      sJ t        | j                  «      «       ‚| j                  j	                  |«      | _        y rŒ   )r�   rN  r  r·   r�  r)  s     r‘   r*  z$Buffer.freeze_layout_with_fill_order¶  s:   € Ü˜$Ÿ+™+¤~Ô6ÐI¼¸T¿[¹[Ó8IÓIÐ6Ø—k‘k×/Ñ/°Ó6ˆ�r“   c                ó¬   — t        | j                  t        «      sJ t        | j                  «      «       ‚| j                  j	                  |«      | _        y rŒ   )r�   rN  r  r·   rŸ  r,  s     r‘   r-  z$Buffer.freeze_layout_with_same_orderº  s:   € Ü˜$Ÿ+™+¤~Ô6ÐI¼¸T¿[¹[Ó8IÓIÐ6Ø—k‘k×/Ñ/°Ó7ˆ�r“   c                ó°   — t        | j                  t        «      sJ t        | j                  «      «       ‚| j                  j	                  ||¬«      | _        y rô  )r�   rN  r  r·   r›  r/  s      r‘   r1  z'Buffer.freeze_layout_with_exact_strides¾  sF   € ô ˜$Ÿ+™+¤~Ô6ÐI¼¸T¿[¹[Ó8IÓIÐ6Ø—k‘k×2Ñ2Ø¨ð 3ó 
ˆ�r“   c                ó˜   — t         j                  j                  j                  t	        j
                  | j                  «       d«      «      S rò  ró  r�  s    r‘   rõ  zBuffer.is_zero_elementsÆ  rö  r“   c                ór   ‡ — ‰ j                  «       rt        t        ‰ j                  «       ¬«      S dˆ fd„}|S )NrÖ  c                óx   •— ‰j                  «       }t        j                  ‰j                  xs d || «      «      S r  )r
  ru   r¿  rÅ   ©rÏ   r  r‘  s     €r‘   r  z"Buffer.make_loader.<locals>.loaderÎ  s/   ø€ Ø×'Ñ'Ó)ˆGÜ—8‘8˜DŸI™IÒ2¨±G¸E³NÓCÐCr“   rk  )rõ  r   r
  r  rÂ  s   ` r‘   r  zBuffer.make_loaderÉ  s0   ø€ à× Ñ Ô"Üœ=°·±Ó0@ÔAÐAõ	Dð ˆr“   c                ó"   — | j                  «       S rŒ   ©rs  rú  s     r‘   rü  zBuffer.codegen_referenceÔ  r%  r“   c                 ó   — y rŒ   r¦   r�  s    r‘   r™  zBuffer.decide_layout×  r  r“   c                ó‚   — t        | j                  t        «      r%| j                  j                  j	                  «       gS yrü  )r�   rN  r«  r­  rs  r�  s    r‘   rN  z#Buffer.get_inputs_that_alias_outputÚ  s/   € Ü�d—k‘k¤?Ô3Ø—K‘K×$Ñ$×-Ñ-Ó/Ð0Ð0Ør“   c                ó‚   — t        | j                  t        «      r%| j                  j                  j	                  «       gS yrü  )r�   rN  rÌ  rT  rs  r�  s    r‘   rJ  zBuffer.get_mutation_namesß  s0   € Ü�d—k‘kÔ#=Ô>Ø—K‘K×&Ñ&×/Ñ/Ó1Ð2Ð2Ør“   c                ó6   — t        | j                  «       g«      S rŒ   )r@   rs  r�  s    r‘   r¤  zBuffer.get_read_namesä  s   € Ü˜4Ÿ=™=›?Ð+Ó,Ð,r“   c                ó   — t        «       S rŒ   r?   r=  s     r‘   r>  zBuffer.get_free_symbol_usesç  ó   € ô ‹|Ðr“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  zBuffer.get_unbacked_symbol_defsí  r«  r“   c                 ó   — y rŒ   r¦   r�  s    r‘   rø  zBuffer.realizeð  r  r“   c                 ó   — yr  r¦   r�  s    r‘   Úshould_allocatezBuffer.should_allocateó  s   € àr“   rS  rm  ro  )r¼   ztorch.Tensor | torch.SymIntrg  rW  r[  r~  )r¼   rG  rc  r]  r^  r{  r_  rr  rs  ru  )r  rt  r¼   r½   )r0  rt  r%  r�   r¼   r½   rk  rŒ   rf  r�  rT  r}  r±  rd  )%r¢   r£   r¤   r¥   rš  r
  rs  r7  r  r­  rˆ  r  r
  r4  rì  r  rã  r;  rñ  r"  r&  r*  r-  r1  rõ  r  rü  r™  rN  rJ  r¤  rb   r>  rª  rø  r  rI  rJ  s   @r‘   rr  rr  o  s  ø… ð ÓØÓõ
5ó0óó>ó
3óð ò'ó ð'ó)ó+ó(ó>ó
ó ó+ó1ð ;@ðVØ"ðVØ37ðVà	óVó7ó8ð
 CHð
Ø*ð
Ø;?ð
à	ó
óUó	ôóóó
ó
-ñ ˜HÓ%à$)ðØ!ðà	!òó &ðó
ó÷r“   rr  c                  ó<   — e Zd Zdd„Zdd„Zej                  Zdd„Zy)ÚOperationBufferc                ó   — | gS rŒ   r¦   r�  s    r‘   r¨  zOperationBuffer.get_outputsû  s	   € Øˆvˆr“   c                ó   — | S rŒ   r¦   r�  s    r‘   r­  zOperationBuffer.get_defining_opþ  rÉ  r“   c                óX   — t         j                  | «       t        j                  | «       y rŒ   )rr  rš  rŠ  r�  s    r‘   rš  zOperationBuffer.__post_init__  s   € Ü×Ñ˜TÔ"Ü×Ñ Õ%r“   Nr¯  ©r¼   rŠ  rS  )r¢   r£   r¤   r¨  r­  rŠ  rL  rš  r¦   r“   r‘   r	  r	  ø  s   „ óóð #×5Ñ5Ðô&r“   r	  c                  ó   — e Zd Zdd„Zy)rŠ  c                 ó   — yrØ  r¦   r�  s    r‘   r9  zInputBuffer.num_reads
  rÎ  r“   Nr{  )r¢   r£   r¤   r9  r¦   r“   r‘   rŠ  rŠ  	  s   „ ôr“   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)r¢   r£   r¤   r‚  r¦   r“   r‘   r  r    s   „ òr“   r  c                  ó,   — e Zd ZU dZded<   dd„Zdd„Zy)r!  Nrh  r  c                ó   ‡ — dˆ fd„}|S )Nc                óä   •— ‰j                  «       j                  «       }t        j                  t        j
                  j                  ‰j                  «       ‰j                  «       || «      «      S rŒ   )	r  r
  ru   r¿  rw   r  Úconstant_namers  r  rû  s     €r‘   r  z*ConstantBuffer.make_loader.<locals>.loader  sP   ø€ Ø—o‘oÓ'×4Ñ4Ó6ˆGÜ—8‘8Ü—‘×%Ñ% d§m¡m£o°t×7KÑ7KÓLÙ˜“óð r“   rk  r¦   rÂ  s   ` r‘   r  zConstantBuffer.make_loader  s   ø€ õ	ð ˆr“   c                óˆ   — t        t        j                  j                  | j	                  «       |«      | j
                  ¬«      S ©N©rÅ   rN  )r!  rw   r  r  rs  rN  rÿ  s     r‘   rH  z!ConstantBuffer.constant_to_device%  s/   € ÜÜ—‘×&Ñ& t§}¡}£¸Ó?ÈÏÉô
ð 	
r“   rk  r€  )r¢   r£   r¤   r  r¥   r  rH  r¦   r“   r‘   r!  r!    s   … Ø+/€OÐ(Ó/óô
r“   r!  c                  óV   — e Zd Zdd„Z ed «      	 d	 	 	 d	d„«       Zd
dd„Zdd„Zdd„Zy)ÚNoneAsConstantBufferc                ó   — t        «       S rŒ   r?   r�  s    r‘   r£  zNoneAsConstantBuffer.get_reads-  r«  r“   c                ó   — t        «       S rŒ   r?   r=  s     r‘   r>  z)NoneAsConstantBuffer.get_free_symbol_uses0  r  r“   Nc                óJ   — t         j                  j                  j                  S rŒ   )rw   r  rÊ  Únone_strrú  s     r‘   rü  z&NoneAsConstantBuffer.codegen_reference6  s   € Ü�w‰w×#Ñ#×,Ñ,Ð,r“   c                ó   — t        d ¬«      S ©NrÌ  )rÂ  r�  s    r‘   rã  z$NoneAsConstantBuffer.get_output_spec9  s   € Ü Ô&Ð&r“   c                 ó   — yr  r¦   r�  s    r‘   rè  z&NoneAsConstantBuffer.has_tensor_output<  r  r“   rz  rr  r}  rŒ   rf  r^  r_  )	r¢   r£   r¤   r£  rb   r>  rü  rã  rè  r¦   r“   r‘   r  r  +  sC   „ óñ Ð2Ó3à$)ðØ!ðà	!òó 4ðô
-ó'ôr“   r  c                  óR   — e Zd ZU ded<    ed «      	 d	 	 	 dd„«       Zd	d
d„Zdd„Zy)rµ   r    rŽ  c                ó.   — t        | j                  |«      S rŒ   )r)   rŽ  r=  s     r‘   r>  z*ShapeAsConstantBuffer.get_free_symbol_usesD  s   € ô   §	¡	¨=Ó9Ð9r“   Nc                óh   — t         j                  j                  j                  | j                  «      S rŒ   )rw   r  rÊ  Úcodegen_sizevarrŽ  rú  s     r‘   rü  z'ShapeAsConstantBuffer.codegen_referenceJ  s!   € Ü�w‰w×#Ñ#×3Ñ3°D·I±IÓ>Ð>r“   c                 ó   — yr  r¦   r�  s    r‘   rè  z'ShapeAsConstantBuffer.has_tensor_outputM  r  r“   rr  r}  rŒ   rf  r_  )r¢   r£   r¤   r¥   rb   r>  rü  rè  r¦   r“   r‘   rµ   rµ   @  s<   … à
ƒJáÐ3Ó4à$)ð:Ø!ð:à	!ò:ó 5ð:ô
?ôr“   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Z	ded<   e
j                  d%d„«       Zee
j                  d%d„«       «       Zd&d„Zd'd„Zd(d„Zd)d„Zd*d„Z ed «      	 d+	 	 	 d,d„«       Zd-ˆ fd„Zd.d„Zd/d„Zd0d„Zd1d„Ze	 	 d2d„«       Z	 	 d3	 	 	 	 	 d4d„Ze	 d5	 	 	 	 	 	 	 	 	 	 	 d6d„«       Zd7d„Zd7d „Z d&d!„Z!d.d"„Z"d.d#„Z#d8d$„Z$ˆ xZ%S )9rˆ  zb
    Represents a buffer that is computed during kernel execution rather than being an input.
    r³  rM  FzClassVar[bool]Ú_force_realizeNr€  rü  úCallable[..., Any] | Nonerý  rb  rþ  rÿ  c           
   #  óÌ  K  — | j                   €J ‚| j                  €J ‚| j                  €J ‚| j                  €J ‚t	        | j
                  t        «      sJ t        | j
                  «      › «       ‚| j
                  }| j                  }	 t        |j                  |j                  | j                  | j                  | j                  |j                  |j                  |j                  ¬«      }|| _        t        |j                  |j                  | j                  «      | _        | j                  j!                  | «       d –— || _        || _        y # || _        || _        w xY w­w)Nr  )rü  rý  rþ  rÿ  r�   rM  rg  r·   rN  r  r  rR  ri  rj  rP  Úget_default_sizes_bodyÚclear_cache)r‘  Úold_datarW  Únew_datas       r‘   Úwith_original_inner_fnz%ComputedBuffer.with_original_inner_fn`  s=  è ø€ à×ÑÐ+Ð+Ð+Ø×&Ñ&Ð2Ð2Ð2Ø×$Ñ$Ð0Ð0Ð0Ø×.Ñ.Ð:Ð:Ð:ä˜$Ÿ)™)¤YÔ/ÐE´D¸¿¹³OÐ3DÓEÐ/Ø—9‘9ˆØ—[‘[ˆ
ð	%Ü Ø—‘Ø—n‘nØ×0Ñ0Ø×,Ñ,Ø!%×!@Ñ!@Ø'×6Ñ6Ø"×,Ñ,Ø'×6Ñ6ô	ˆHð !ˆDŒIô &Ø—‘Ø—‘Ø×%Ñ%óˆDŒKð
 ×'Ñ'×3Ñ3°DÔ9Ûà ˆDŒIØ$ˆD�Køð !ˆDŒIØ$ˆD�Küs   ‚BE$Â	B9E ÅE$ÅE!Å!E$c               #  ó‚   K  — t         j                  } 	 dt         _        d –— | t         _        y # | t         _        w xY w­w©NT)rˆ  r(  )Ú	old_values    r‘   Úforce_realizezComputedBuffer.force_realizeƒ  s3   è ø€ ô #×1Ñ1ˆ	ð	6Ø,0ŒNÔ)Ûà,5ŒNÕ)ø¨IŒNÕ)üs   ‚?”/ £?¯<¼?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¶  rM  r�  s    r‘   Úget_computed_buffer_namez'ComputedBuffer.get_computed_buffer_name�  s7   € ð
 �9‰9Ð Ø—9‘9ÐÜ�4—9‘9˜fÔ%Ø—9‘9—>‘>Ð!Ør“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r9  r�  s    r‘   r9  zComputedBuffer.num_reads˜  r7  r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r£  r�  s    r‘   r£  zComputedBuffer.get_reads›  r7  r“   c                ó6   — | j                   j                  «       S rŒ   r;  r�  s    r‘   r¤  zComputedBuffer.get_read_namesž  r<  r“   c                óX  — t        | j                  t        t        t        t
        f«      s0t        j                  t        «       t        «       t        «       ¬«      S 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)N©r6  ÚwritesÚindex_exprsrß  T)r�   rM  rg  rž  r×  r  rK   Ú
ReadWritesr@   r   rÇ   r  r@  rT   Úget_store_functionrÑ  rB  r
  r�  s    r‘   r3  zComputedBuffer.get_read_writes¡  s×   € Ü˜$Ÿ)™)¤i´´t¼YÐ%GÔHÜ×*Ñ*Ü “lÜ!“|Ü&›Lôð ô �\‰\œ.Ð*:¸DÓAñ 	Ø�y‰y×+Ñ+Ô-Ü*Ø×+Ñ+Ó-Ø—I‘I×0Ñ0Ó2Ø—I‘I×0Ñ0Ó2ó÷	ñ 	ô +Ø×+Ñ+Ó-Ø—I‘I×&Ñ&Ó(ó÷	÷ 	ò 	ús   Á6A%D Ã%1D Ä D)c                óØ   — | j                   j                  |«      | j                  j                  |«      z  }| j                  «       r"|| j	                  «       j                  |«      z  }|S rŒ   )rN  r>  rM  Úhas_store_functionr3  )r‘  ri  rN  s      r‘   r>  z#ComputedBuffer.get_free_symbol_uses¶  sc   € ð$ —‘×1Ñ1Øó
à�I‰I×*Ñ*¨=Ó9ñ:ˆð ×"Ñ"Ô$Ø�d×*Ñ*Ó,×AÑAÀ-ÓPÑPˆFØˆr“   c                óþ   •— | j                  «       s_| j                  t        j                  j                  vr9| j                  «       dk(  r&| j                  s| j                  j                  «       S t        ‰| �!  «       S rò  )
r@  rÅ   rw   r  Úmutated_buffersr9  r(  rM  r  rn  rª  s    €r‘   r  zComputedBuffer.make_loaderÐ  s`   ø€ à×'Ñ'Ô)Ø—	‘	¤§¡×!8Ñ!8Ñ8Ø—‘Ó  AÒ%Ø×'Ò'ð —9‘9×(Ñ(Ó*Ð*Ü‰wÑ"Ó$Ð$r“   c                óV   — t        | j                  t        t        t        t
        f«      S rŒ   )r�   rM  rg  rž  r×  r  r�  s    r‘   rB  z!ComputedBuffer.has_store_functionÛ  s   € Ü˜$Ÿ)™)¤i´´t¼YÐ%GÓHÐHr“   c                ó¸  — | j                  «       j                  «       j                  «       }t        | j                  t
        t        t        f«      r+t        | j                  j                  | j                  |«      S t        | j                  t        «      sJ t        | j                  «      «       ‚t        | j                  j                  | j                  |«      S rŒ   )r  rk  r
  r�   rM  rg  rž  r×  r   rv  rÅ   r  r·   r  )r‘  r  s     r‘   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ÐD´T¸$¿)¹)³_ÓDÐ3Ü˜4Ÿ9™9×1Ñ1°4·9±9¸gÓFÐFr“   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Œ   )r�   rK   ÚStarDepÚ	MemoryDepr)  s     r‘   rê   z0ComputedBuffer.get_fill_order.<locals>.<genexpr>õ  s0   è ø€ ò àô ˜1œ|×3Ñ3´\×5KÑ5KÐL×Mñùs   ‚46r   rI   ©Úpick_loop_orderN)r�   rN  r  rK   r–  rM  rÑ  rB  r3  r6  rì   rJ  rs   rÏ   r°   rÙ  rÚ  rž  r×  rÒ   rw   r  r  r³  Ú	schedulerrL  r
  )r‘  Ú
index_varsrw  rù   r6  rÖ  Úvrœ  rŽ  Ústride_lengthsrL  s              r‘   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Œ   )r�   rN  r  rð   r*  r"  r)  s     r‘   r™  zComputedBuffer.decide_layout  s@   € Ü�d—k‘k¤>Ô2Ø×'Ñ'Ó)ˆEÙØ×2Ñ2°5Õ9à×"Ñ"Õ$ð 3r“   c                óR  — t        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  rI   r   )rK   r–  rÑ  rB  r   rÇ   r!  r  rW   r@  r@  ÚitemsrÇ  )
r‘  rÃ   Ú
var_rangesr  rN  Úreduce_varsÚ
index_sizeÚreduce_sizerO  ré   s
             r‘   r+  z%ComputedBuffer.get_default_sizes_body  s@  € ô (×:Ñ:Ø×#Ñ#Ó% t×'>Ñ'>Ó'@Èô
Ñˆˆjô �\‰\œ.Ð*;¸T¿_¹_Ó=NÓOñ 	ÜØ×'Ñ'Ó)Ø×0Ñ0Ô2‘¸¸R¸a¸Øðð ò	ˆD÷	ð ˆ
Ø!#ˆØˆ
ØˆØ×$Ñ$Ó&ò 	&‰DˆAˆqØ�D˜‘G‰|Ù&Ð&�Ø×!Ñ! !Ô$Ø×!Ñ! !Õ$à˜D ™G‘|Ð#�|Ø×"Ñ" 1Ô%Ø×"Ñ" 1Õ%ð	&ð ˜KÐ(¨$°¸[Ð0IÐIÐI÷)	ð 	ús   Á!2DÄD&c                ó  ‡ ‡‡— ‰ j                  «       \  \  }}}\  }}|r |||f|||f«      \  \  }}}\  }}g |j                  j                  «       ¢Š|�¬t        |t        «      rt        |«      dk(  sJ ‚|\  }}	t        |t        «      sJ t        |«      «       ‚t        |	t        «      sJ t        |	«      «       ‚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%                  «       «       	 	 	 	 	 	 	 	 	 	 dˆˆˆ fd„}||z   }t'        t)        ‰ «      «       xs t*        j,                   } |||||«      \  }}} |||||«      \  }}}t/        j0                  ||d¬«      \  \  }}}t3        | ||«       ||«      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Œ   )r�   r    )rè   Úfs     r‘   rê   z6ComputedBuffer.simplify_and_reorder.<locals>.<genexpr>d  s   è ø€ ÒH¨q”z !¤T×*ÑHùr|  c           	     óÖ  •— ‰j                  | ||‰«      \  }}}‰j                  «       dk(  rat        |«      dk(  rSt        t	        t        |«      «      «      } ||«      d   dk7  r(|D �cg c]  }||   ‘Œ	 }}t        |«      }t        |«      } || «      } |rGt        j                  j                  j                  | |t        ‰| |«      «      \  }}	}
t        ||	«      }n|}|||fS c c}w )Nr4  rá   r   )Ú_apply_loop_reorderingr@  rÍ   r©   rÎ   rÛ   rØ   rw   r  r  Ú_simplify_loopsrO   rà   )Úx_varsÚsupport_varsr~  Úsimplify_loopsÚnewsizesÚreindex0rÞ   r×   rÐ   rß   Ú_prunerÒ   Úindex_formulasÚmemory_addrsr‘  s               €€€r‘   Úsimplify_and_reorderzAComputedBuffer.simplify_and_reorder.<locals>.simplify_and_reorderu  sú   ø€ ð ,0×+FÑ+FØ˜ e¨\ó,Ñ(ˆH�h ð* ×&Ñ&Ó(¨EÒ1´c¸%³jÀA²oÜœU¤3 u£:Ó.Ó/�ñ ˜E“? 1Ñ%¨Ò*Ø27Ö8¨Q  a£Ð8�HÐ8Ü+¨EÓ2�HÜ.¨uÓ5�Hñ ˜fÓ%ˆFáÜ-.¯W©W×-=Ñ-=×-MÑ-MØØÜ,¨^¸VÀXÓNó.Ñ*�˜( Fô
 *¨(°HÓ=‘à"�Ø˜W hÐ.Ð.ùò!  9s   Á*C&Úpr†   )
r_  úSequence[sympy.Symbol]r`  ri  r~  rt  ra  r�   r¼   údtuple[list[int], Callable[[Sequence[int]], Sequence[int]], Callable[[Sequence[int]], Sequence[int]]])r+  Úindexing_exprsr¬   r�   rª   rÍ   r«   r·   r©   rì   rU  Úget_write_exprsrw   r  r§  rL   ÚPREFER_STORE_LOOP_ORDERÚextendÚget_read_exprsrn   r  rJ   Úloop_ordering_after_fusionrK   Úindex_vars_no_squeezerW   )r‘  Úextra_indexing_constraintsÚrecompute_sizes_body_funcrW  rX  r  rN  rV  Úextra_indexing_rangesÚextra_indexing_exprÚexpected_var_rangesrº  rg  r`  Úshould_merge_loopsÚiter_rangesÚiter_reindexrù   Úreduce_rangesÚreduce_reindexÚ	iter_varsrU  re  rf  s   `                     @@r‘   rg  z#ComputedBuffer.simplify_and_reorder6  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Ô:ÐW¼DÐAVÓ<WÓWÐ:ÜÐ1´4Ô8ÐS¼$Ð?RÓ:SÓSÐ8ÜÑHÐ4GÔHÔHÐHÐHà"&§/¡/ÐØ&Ð*?Ò?ð Ø#Ø%ðBó Ð?ð /ö#Ø°!¸>Ò2I’ð#Ðð #ð Ð1Ñ1ˆNà0˜×-Ñ-Ó/Ð0ˆÜ�w‰w×"Ñ" 4¬×)OÑ)OÔPØ×Ñ × 3Ñ 3Ó 5Ô6ð4	/Ø*ð4	/à0ð4	/ð !ð4	/ð !ð	4	/ð

÷4	/ðl " KÑ/ˆä” tÓ,Ó-Ð-ÒV´V×5VÑ5VÐ1Vð 	ñ (<ØØØØó	(
Ñ$ˆ�\ 1ñ ,@Ø˜ {Ð4Fó,
Ñ(ˆ�~ qô
 0<×/QÑ/QØØØô0
Ñ,Ñ ˆ�K *ô
 ØÙ˜)Ó$¡n°[Ó&AÐBØØØó
ˆð ˜]Ð+¨TÐ1Ð1ùò#s   Ã-	G?Ã7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.
        rI   rK  r   z%Did not simplify complex index:
%s
%s)rM  rL  rw   r  r  r³  rÍ   r©   r  Ú	ExceptionrJ   r¹  r±  Úwarningr«   rÖ   rÎ   rÛ   rØ   )
rN  r`  r~  rf  Úpriority_idxrL  rŽ  rU  r×   rÐ   s
             r‘   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Œ   )rM  rÑ  r�  s    r‘   rÑ  z!ComputedBuffer.get_pointwise_sizeõ  ó   € Ø�y‰y×+Ñ+Ó-Ð-r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  rB  r�  s    r‘   rB  z!ComputedBuffer.get_reduction_sizeø  r‚  r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  r@  r�  s    r‘   r@  z!ComputedBuffer.get_reduction_typeû  r‚  r“   c                ó6   — | j                   j                  «       S rŒ   )rM  rõ  r�  s    r‘   rF  zComputedBuffer.is_no_opþ  s   € Ø�y‰y×)Ñ)Ó+Ð+r“   c                 ó   — yr1  r¦   r�  s    r‘   r  zComputedBuffer.should_allocate  r®  r“   c                ó8   — | j                   j                  |«      S )r  ©rM  rH  rÿ  s     r‘   rH  z!ComputedBuffer.constant_to_device  s   € à�y‰y×+Ñ+¨FÓ3Ð3r“   )r¼   úIterator[None]rd  r{  rz  rT  rx  rr  r}  rk  r_  )r¼   zCallable[..., None])r¼   úlist[int] | NonerS  )r¼   zMtuple[tuple[list[Expr], list[Expr]], LoopBody, tuple[list[Expr], list[Expr]]]©NN)rr  ú'tuple[dict[Any, Any], list[Any]] | Noners  r)  r¼   z5tuple[tuple[list[Expr], list[Expr]], LoopBody | None]rŒ   )rN  ri  r`  ri  r~  rt  rf  rG  r€  rŒ  r¼   rj  r~  r€  )&r¢   r£   r¤   r‚  r¥   r(  rü  rý  rþ  rÿ  r†  r‡  r/  r…  r3  r5  r9  r£  r¤  r3  rb   r>  r  rB  r@  rð   r™  ra   r+  rg  r]  rÑ  rB  r@  rF  r  rH  rI  rJ  s   @r‘   rˆ  rˆ  Q  s°  ø… ñð ƒKØ%*€N�NÓ*ð #€K�Ó"Ø48ÐÐ1Ó8Ø26ÐÐ/Ó6Ø<@ÐÐ 9Ó@à×Ñò %ó ð %ðD Ø×Ñò6ó ó ð6ó	ó%ó%ó*óñ* Ð,Ó-à$)ðØ!ðà	!òó .ðõ2	%óIóGó%óN%ð ðJð
òJó ðJðD OSØ?CðU2à$KðU2ð $=ðU2ð 
?ó	U2ðn ð *.ð%BØ*ð%Bà,ð%Bð ð%Bð !ð	%Bð
 'ð%Bð
ò%Bó ð%BóN.ó.ó.ó,ó÷4r“   rˆ  c                  ó:   — e Zd ZU dZded<   ded<   ded<   ded<   y)	ÚFinalizeCodegenResultzNStructured result from TemplateBuffer._finalize_codegen for external backends.rÈ   ÚsourcerŸ   ÚimportsÚcall_preambleÚ	call_argsN)r¢   r£   r¤   r‚  r¥   r¦   r“   r‘   r�  r�  	  s   … áXàƒKØÓØÓØÔr“   r�  c                  ó  ‡ — e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zedd„«       Zdd„Zdd„Zddd„Z	dd„Z
dd	„Zdd
„Z	 	 d	 	 	 	 	 dd„Zdd„Zdd„Zd d„Z	 	 	 	 d!d„Zed"d„«       Zeddddœ	 	 	 	 	 	 	 	 	 	 	 d#d„«       Zˆ xZS )$r‹  zÈ
    Base class for template operators that support epilogue and prologue fusion.
    Subclasses: TritonTemplateBuffer (built-in Triton templates),
    HelionTemplateBuffer (Helion kernels), etc.
    Nc                ó€  •— t         ‰
| �  d |¬«       t        j                  |«      | _        || _        t        j                  j                  | «      | _	        t        j                  j                  | «       i | _        i | _        i | _        |rt        |«      ni | _        || _        g | _        |�i| j                  d   }t%        |t&        «      sJ t)        |«      «       ‚|j+                  «       }|D �	cg c]  }	t-        t/        |¬«      |	| «      ‘Œ c}	| _        |xs
 t1        «       | _        d | _        d | _        y c c}	w )Nr  r   rÌ  )rn  r]  r‰  Úunwrap_storagerj  Úmake_kernel_renderrw   r  Úregister_bufferrÅ   Úregister_operationr   Úepilogue_fusable_outputsÚ_multi_output_childrenr«   Ú_named_inputsÚmutated_inputsÚmutation_outputsr�   r‰   r·   r  ÚMutationOutputrÂ  r@   Úallowed_prologue_inpsÚallow_epilogue_fusionÚallow_prologue_fusion)r‘  rN  rj  r˜  rž  r¡  Únamed_inputsÚfirst_inputr  r¢  rp  s             €r‘   r]  zTemplateBuffer.__init__  s/  ø€ ô 	‰Ñ˜d¨6ÐÔ2Ü"×1Ñ1°&Ó9ˆŒØ"4ˆÔÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Ô(à+-ˆÔð 9;ˆÔ%ð ?AˆÔ#ñ
 #/ŒD�Ô°Bð 	Ôð
 -ˆÔØ68ˆÔØÐ%ØŸ+™+ a™.ˆKÜ˜k¬6Ô2ÐE´D¸Ó4EÓEÐ2Ø ×+Ñ+Ó-ˆFð *ö%àô œz°Ô8¸#¸tÕDò%ˆDÔ!ð "Ò1¤Z£\ð 	Ô"ð
 37ˆÔ"Ø26ˆÕ"ùò%s   Ã3D;c                ó€   — t        | j                  t        «      rt        d«      ‚| j	                  «       j
                  S )Nz1Multi-output templates do not have a single dtype)r�   rN  ÚMultiOutputLayoutrÙ  r  r  r�  s    r‘   r  zTemplateBuffer.dtypeL  s6   € ä�d—k‘kÔ#4Ô5Ü%ØCóð ð �‰Ó ×&Ñ&Ð&r“   c                ó&   — | j                  d¬«      S )NT©Ú	normalize)rT   r�  s    r‘   r3  zTemplateBuffer.get_read_writesT  s   € Ø×'Ñ'°$Ð'Ó7Ð7r“   c                ó¢  ‡‡— t        «       }| j                  D ]³  }t        |t        t        f«      sJ t        |«      «       ‚|Št        ‰j                  t        «      sJ t        ‰j                  «      «       ‚‰j                  j                  «       Šdˆˆfd„}|t        j                  |‰j                  «       d|¬«      j                  z  }Œµ |S )z(Build read dependencies from all inputs.c                óx   •— t        |«      dk(  sJ ‚t        j                  ‰j                  «        ‰| «      «      S rò  )rÍ   ru   r¿  rs  )rÏ   r|  rl  Úinp_indexers     €€r‘   Údummyz4TemplateBuffer._read_deps_from_inputs.<locals>.dummy`  s1   ø€ Ü˜6“{ aÒ'Ð'Ð'Ü—x‘x §¡£±¸EÓ0BÓCÐCr“   r¦   r©  ©rÏ   úSequence[Any]r|  r°  r¼   r   )r@   rj  r�   rS  rr  r·   rN  rç  r
  rK   rT   r
  r6  )r‘  rª  r6  Úinp_rawr®  rl  r­  s        @@r‘   Ú_read_deps_from_inputsz%TemplateBuffer._read_deps_from_inputsW  s®   ù€ ä.8«lˆØ—{‘{ò 	ˆGÜ˜g¬¼Ð'@ÔAÐPÄ4ÈÃ=ÓPÐAØ,3ˆCÜ˜cŸj™j¬&Ô1ÐC´4¸¿
¹
Ó3CÓCÐ1ØŸ*™*×1Ñ1Ó3ˆKöDð ”\×5Ñ5Ø�s—|‘|“~ r°Yôç‰eñ‰Eð	ð ˆr“   c                ó(  ‡‡— t        | j                  t        «      rut        t	        j
                  | j                  «       t        j                  d«      dd¬«      g«      }t	        j                  | j                  |«      |t        «       dd¬«      S | j                  «       Š| j                  «       j                  «       Šdˆˆfd„}t	        j                  || j                  «       d|¬«      }|xj                  | j                  |«      z  c_        |S )	aµ  Extract read/write dependencies for this TemplateBuffer.

        When the layout is MultiOutputLayout (multi-output templates), the
        buffer itself has no data layout, so we cannot build an indexer.
        Instead, synthesize a trivial write dep and derive read deps from
        the named tensor inputs (``_named_inputs``).  For single-output
        templates with a concrete layout, fall through to the standard path.
        r   r¦   )Ú	var_namesr  N)r6  r=  r>  r•  rU  c                ó^   •— t        |«      dk(  sJ ‚t        j                  ‰ ‰| «      d«      S ©Nr   Úfake©rÍ   ru   r  ©rÏ   r|  r  rÅ   s     €€r‘   r®  z1TemplateBuffer.extract_read_writes.<locals>.dummy…  ó,   ø€ Ü�v“; !Ò#Ð#Ð#Ü—9‘9˜T¡7¨5£>°6Ó:Ð:r“   r©  r¯  )r�   rN  r§  r@   rK   rJ  rs  r°   r!   r?  r²  r  r
  rT   r
  r6  )r‘  rª  r=  r®  Údepsr  rÅ   s        @@r‘   rT   z"TemplateBuffer.extract_read_writesi  sâ   ù€ ô �d—k‘kÔ#4Ô5Ü3=ä ×*Ñ*ØŸ™›¬¯©°qÓ)9ÀRÈbôðó4ˆFô  ×*Ñ*Ø×1Ñ1°)Ó<ØÜ&›LØØôð ð �}‰}‹ˆØ—/‘/Ó#×0Ñ0Ó2ˆö	;ô ×/Ñ/Ø�4—=‘=“? B°)ô
ˆð 	�
Š
�d×1Ñ1°)Ó<Ñ<�
Øˆr“   c                ó6   — t         j                  j                  S rŒ   )r°   rÙ  r–  r�  s    r‘   rB  z!TemplateBuffer.get_reduction_size�  s   € Ü�w‰w�{‰{Ðr“   c                 ó   — y rŒ   r¦   r�  s    r‘   r@  z!TemplateBuffer.get_reduction_type’  r®  r“   c                 ó   — yr1  r¦   r�  s    r‘   r  zTemplateBuffer.should_allocate•  r®  r“   c                ó*   — | j                  «       g fd fS rŒ   rî  )r‘  rr  rs  s      r‘   rg  z#TemplateBuffer.simplify_and_reorder˜  s$   € ð —‘“Øðð ð
ð 	
r“   c                ó6   — t        | j                  t        «      S )zFWhether this template produces multiple outputs via MultiOutputLayout.)r�   rN  r§  r�  s    r‘   Úis_multi_outputs_templatez(TemplateBuffer.is_multi_outputs_template¥  s   € ä˜$Ÿ+™+Ô'8Ó9Ð9r“   c                ó   — | j                   S rŒ   )r¡  r�  s    r‘   Úget_allowed_prologue_inpsz(TemplateBuffer.get_allowed_prologue_inps©  s   € Ø×)Ñ)Ð)r“   c                ó"   — |j                  «       S )a3  Return whether this template's aliasing/mutation blocks prologue fusion.

        The default preserves the scheduler's conservative behavior. External
        template subclasses may override this when they can prove a prologue
        producer only feeds independent, non-mutated template inputs.
        )Úhas_aliasing_or_mutation)r‘  Úscheduler_nodes     r‘   Ú,has_aliasing_or_mutation_for_prologue_fusionz;TemplateBuffer.has_aliasing_or_mutation_for_prologue_fusion¬  s   € ð ×6Ñ6Ó8Ð8r“   c                 ó   — y)a˜  Called after epilogue/prologue subgraph codegen with rendered hook outputs.

        ``hook_outputs`` maps placeholder keys (e.g. ``<STORE_OUTPUT_0>``,
        ``<LOAD_INPUT_x>``) to the Triton code generated by Inductor for
        each fused subgraph.

        Return a ``FinalizeCodegenResult`` to provide custom source code and
        call metadata, or ``None`` to use the default codegen path.
        Nr¦   )r‘  Úhook_outputss     r‘   Ú_finalize_codegenz TemplateBuffer._finalize_codegenµ  s   € ð r“   c                ó(  — t        |t        «      r&t        |j                  t        «      r|j                  S t        j                  |«      }t        |t        «      r|j                  }t        |j                  t        «      r|j                  «        |S )zWRealize a TensorBox, preserving MultiOutput layout (unlike ExternKernel.realize_input).)
r�   rˆ   rM  ÚMultiOutputrµ  Úrealize_inputrq  rN  r  r"  )rÔ  rÕ  rN  s      r‘   Úrealize_template_inputz%TemplateBuffer.realize_template_inputÃ  sf   € ô �bœ)Ô$¬°B·G±G¼[Ô)IØ—7‘7ˆNÜ×+Ñ+¨BÓ/ˆÜ�fœjÔ)Ø—[‘[ˆFÜ�f—m‘m¤^Ô4Ø× Ñ Ô"Øˆr“   )Údirect_alias_at_leafÚon_tensor_leafÚon_non_tensor_leafc               óx   ‡‡‡‡‡‡‡— i Št        j                  «       Šdˆˆˆˆˆˆˆfd„Št         ‰|g «      «      S )zLWalk a structured output tree, creating MultiOutput nodes for tensor leaves.c           
     óL  •— t        | t        t        f«      r>g }t        | «      D ],  \  }}|j	                   ‰|g |¢t        | «      |f‘«      «       Œ. |S t        ‰
«      }t        | t        j                  «      rŸ‰	r|‰	v rt        j                  ‰	|   «      gS t        | «      }|‰v r‰|   gS t        t        j                  | «      ‰|«      }|‰j                  |j!                  «       <   ‰� ‰|j!                  «       |||«       t        |«      }|‰|<   |gS ‰� ‰|«       g S rŒ   )r�   r©   rª   rò   rn  r·   rñ  r  ÚTensorrˆ   r�  ÚidrÌ  ÚFallbackKernelÚtensor_to_layoutrœ  rs  )r\  rœ  rm  rÐ   ÚitemÚleaf_idxÚtidÚmorÕ  rÏ  Úleaf_counterrÑ  rÐ  Úseen_outputsÚtemplate_bufÚwalks            €€€€€€€r‘   rß  z0TemplateBuffer.build_multi_outputs.<locals>.walkÞ  s5  ø€ Ü˜&¤4¬ -Ô0Ø+-�Ü(¨Ó0ò N‘G�A�tØ—N‘N¡4¨Ð.K°Ð.K¼$¸v»,ÈÐ9JÐ.KÓ#LÕMðNà�Ü˜LÓ)ˆHÜ˜&¤%§,¡,Ô/Ù'¨HÐ8LÑ,LÜ%×,Ñ,Ð-AÀ(Ñ-KÓLÐMÐMÜ˜“j�Ø˜,Ñ&Ø(¨Ñ-Ð.Ð.Ü Ü"×3Ñ3°FÓ;¸\È7ó�ð FH�×3Ñ3°B·K±K³MÑBØ!Ð-Ù" 2§;¡;£=°"°g¸xÔHÜ˜r“]�Ø$&�˜SÑ!Ø�t�à!Ð-Ù" 8Ô,ØˆIr“   )r\  rÇ   rœ  zlist[tuple[type, int]]r¼   úlist[TensorBox])rÑ  Úcountrª   )	rÔ  rÞ  Ú
structuredrÏ  rÐ  rÑ  rÜ  rÝ  rß  s	    ` ```@@@r‘   Úbuild_multi_outputsz"TemplateBuffer.build_multi_outputsÏ  s4   þ€ ð .0ˆÜ —‘Ó(ˆ÷	ó 	ô6 ‘T˜* bÓ)Ó*Ð*r“   )NNN)rN  r  rj  úSequence[IRNode]r˜  r)  rž  úIterable[IRNode] | Noner¡  úOrderedSet[str] | Noner¤  zdict[str, IRNode] | Noner¼   r½   r[  rx  )rª  r�   r¼   zOrderedSet[dependencies.Dep]rr  )rª  r�   r¼   ry  r~  rd  r_  r�  )rr  rŽ  rs  r)  r¼   z9tuple[tuple[Sequence[Expr], list[Expr]], LoopBody | None]rT  )rÆ  r   r¼   r�   )rÉ  zdict[str, str]r¼   zFinalizeCodegenResult | None)rÕ  rˆ   r¼   r‰   )rÞ  r‹  râ  rÇ   rÏ  zdict[int, IRNode] | NonerÐ  zFCallable[[str, MultiOutput, list[tuple[type, int]], int], None] | NonerÑ  zCallable[[int], None] | Noner¼   ztuple[TensorBox, ...])r¢   r£   r¤   r‚  r]  rˆ  r  r3  r²  rT   rB  r@  r  rg  rÁ  rÃ  rÇ  rÊ  r  rÎ  rã  rI  rJ  s   @r‘   r‹  r‹    sM  ø„ ñð 37Ø8<Ø15ð07àð07ð !ð07ð 6ð	07ð
 0ð07ð  6ð07ð /ð07ð 
õ07ðd ò'ó ð'ó8óô$$óLóóð
 OSØ?Cð
à$Kð
ð $=ð
ð 
Có	
ó:ó*ó9ðØ*ðà	%óð ò	ó ð	ð ð :>àØ;?ñ)+à$ð)+ð ð)+ð
 7ð)+ðð)+ð 9ð)+ð 
ò)+ó ô)+r“   r‹  c                  óx   ‡ — e Zd Z	 	 d	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z ed «      	 d	 	 	 dˆ fd„«       Zd	d„Zd
d„Zˆ xZS )ÚTritonTemplateBufferc                ó    •— t         ‰| �  |||||¬«       | j                  €J ‚| j                  | j                  i| _        d| _        d| _        y)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. Currently 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.
        )rž  r¡  N)rn  r]  rÅ   r›  Úsubgraph_inpsÚsubgraph_outs)r‘  rN  rj  r˜  rž  r¡  rp  s         €r‘   r]  zTritonTemplateBuffer.__init__ý  s]   ø€ ô" 	‰ÑØØØØ)Ø"7ð 	ô 	
ð �y‰yÐ$Ð$Ð$Ø)-¯©°D·I±IÐ(>ˆÔ%à@DˆÔØ9=ˆÕr“   c                óÖ  •— t         ‰| �  |«      }| j                  r| j                  ng }| j                  r| j                  ng }|D ]c  }t	        |t
        «      r|j                  t        ||«      «       Œ/t	        |t        «      r!|j                  |j                  |«      «       Œ`|€ŒcJ ‚ |D ]7  }t	        |t        «      r!|j                  |j                  |«      «       Œ4|€Œ7J ‚ |S rŒ   )	rn  r>  rë  rê  r�   r    Úupdater)   r‰   )r‘  ri  Úresrë  rê  rl  rú   rp  s          €r‘   r>  z)TritonTemplateBuffer.get_free_symbol_uses  sÙ   ø€ ô ‰gÑ*¨=Ó9ˆØ.2×.@Ò.@˜×*Ò*ÀbˆØ.2×.@Ò.@˜×*Ò*Àbˆà ò 	#ˆCÜ˜#œtÔ$Ø—
‘
Ô+¨C°Ó?Õ@Ü˜C¤Ô(Ø—
‘
˜3×3Ñ3°MÓBÕCà‘{Ð"�{ð	#ð !ò 	#ˆCÜ˜#œvÔ&Ø—
‘
˜3×3Ñ3°MÓBÕCà‘{Ð"�{ð		#ð ˆ
r“   c                ó    — | g| j                   ¢S rŒ   ©rŸ  r�  s    r‘   r¨  z TritonTemplateBuffer.get_outputs3  ó   € ØÐ-�t×,Ñ,Ð-Ð-r“   c                ó&   — d| j                   › d�}|S )NzTritonTemplateBuffer(layout=r  rÆ  )r‘  rú   s     r‘   rÉ  zTritonTemplateBuffer.__str__6  s   € Ø,¨T¯[©[¨M¸Ð;ˆØˆ
r“   r�  )rN  rç  rj  rä  r˜  zCallable[_P, _T] | Nonerž  rå  r¡  ræ  r¼   r½   rr  r}  r¯  ro  )	r¢   r£   r¤   r]  rb   r>  r¨  rÉ  rI  rJ  s   @r‘   rè  rè  ü  s�   ø„ ð 37Ø8<ð>àð>ð !ð>ð 4ð	>ð
 0ð>ð  6ð>ð 
õ>ñ< Ð2Ó3à$)ðØ!ðà	!ôó 4ðó..÷r“   rè  c                  ó€   ‡ — e Zd Z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dd„Zˆ xZS )ÚChoiceCallera1  
    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, CUTLASSTemplateCaller.
    c                ó¼   •— t         ‰| �  «        || _        || _        || _        || _        d| _        d| _        i | _        d | _	        d | _
        i | _        i | _        y r  )rn  r]  rÅ   rN  r™   ÚdescriptionÚfailedÚ_benchmark_with_cudagraphsr   rd  ÚdecompositionÚdecomposition_kwargsÚconfig_patches)r‘  rÅ   r™   rN  rö  rp  s        €r‘   r]  zChoiceCaller.__init__G  sh   ø€ ô 	‰ÑÔØˆŒ	ØˆŒØ&ˆÔð 'ˆÔØ!ˆŒà05ˆÔ'ð ,.ˆÔà/3ˆŒØ8<ˆÔØ46ˆÔ!Ø.0ˆÕr“   c               óä   ‡‡— | j                  «       Š| j                  rt        j                  ˆˆfd„«      S t        j
                  rt        ˆˆfd„«      S t        j                  ‰‰d|id ¬«      S )Nc                 ó   •—  ‰ ‰Ž S rŒ   r¦   ©ÚalgorÃ   s   €€r‘   r�  z(ChoiceCaller.benchmark.<locals>.<lambda>e  s   ø€ ÁTÈ4À[€ r“   c                 ó   •—  ‰ ‰Ž S rŒ   r¦   rþ  s   €€r‘   r�  z(ChoiceCaller.benchmark.<locals>.<lambda>g  s   ø€ ±D¸$°K€ r“   rú   rÌ  )Úto_callablerø  r\   Úbenchmark_gpu_with_cuda_graphrJ   Ú/profile_bandwidth_with_do_bench_using_profilingrg   Ú	benchmark)r‘  rú   rÃ   rÿ  s     `@r‘   r  zChoiceCaller.benchmarkb  s\   ù€ Ø×ÑÓ!ˆØ×*Ò*Ü×<Ñ<Ô=PÓQÐQÜ×AÒAÜ+Ô,?Ó@Ð@Ü×$Ñ$ T¨4°%¸°ÀdÔKÐKr“   c                ó   — t         ‚rŒ   r�  r�  s    r‘   Ú	call_namezChoiceCaller.call_namej  r�  r“   c                ó   — t         ‚rŒ   r�  r�  s    r‘   r  zChoiceCaller.to_callablem  r�  r“   c                ó"   — | j                  «       S )z©
        Hash key for the underlying kernel. By default, we assume there are no
        runtime params, so kernel hash key defaults to choice caller's hash key.
        )Úhash_keyr�  s    r‘   Úkernel_hash_keyzChoiceCaller.kernel_hash_keyp  s   € ð
 �}‰}‹Ðr“   c                ó   — t         ‚rŒ   r�  r�  s    r‘   r	  zChoiceCaller.hash_keyw  r�  r“   c                ó   — t         ‚rŒ   r�  r�  s    r‘   re  zChoiceCaller.output_nodez  r�  r“   c                ó   — i S )zRInformation returned here is logged to the autotune log file when that is enabled.r¦   r�  s    r‘   Ú	info_dictzChoiceCaller.info_dict}  r±  r“   c                 ó   — y)NÚunsupported_choicer¦   r�  s    r‘   Úautoheuristic_idzChoiceCaller.autoheuristic_id�  s   € Ø#r“   c                ó   — d| _         y)z�
        Mark the choice as failed so that it can be
        removed later. Useful for when we decouple
        compilation and tuning.
        TN)r÷  r�  s    r‘   Úmark_failedzChoiceCaller.mark_failed„  s   € ð ˆ�r“   )
rÅ   rÈ   r™   r°  rN  rç  rö  rÈ   r¼   r½   )rÃ   r   rú   rt  r¼   r	  ro  )r¼   r´  )r¼   rˆ   )r¼   z6dict[str, PrimitiveInfoType | list[PrimitiveInfoType]]rS  )r¢   r£   r¤   r‚  r]  r  r  r  r
  r	  re  r  r  r  rI  rJ  s   @r‘   rô  rô  >  sk   ø„ ñð1àð1ð "ð1ð ð	1ð
 ð1ð 
õ1ó6Ló"ó"óó"ó"óó$÷r“   rô  c                  ó   — e Zd Zdd„Zy)ÚTritonTemplateCallerBasec                ó   — t         ‚rŒ   r�  r�  s    r‘   Úget_make_kernel_renderz/TritonTemplateCallerBase.get_make_kernel_renderŽ  r�  r“   N)r¼   r   )r¢   r£   r¤   r  r¦   r“   r‘   r  r  �  s   „ ô"r“   r  c                  óÂ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 d
ˆ fd„Zedd„«       Zedd„«       Z	 d	 	 	 dd„Ze	j                  dd„«       Zdd„Z	 d	 	 	 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 |¬«       || _        i | _        || _        || _        t        d„ |D «       «      | _        i | _        y )N)rN  rj  r˜  r¡  c              3  ó¸   K  — | ]R  }t        |t        «      xs< t        |t        j                  j                  j
                  «      xr |j                  –— ŒT y ­wrŒ   )r�   r  r  r¸  Úselect_algorithmÚExternKernelCallerÚhas_out_variant)rè   Úchoices     r‘   rê   z/MultiTemplateBuffer.__init__.<locals>.<genexpr>­  sT   è ø€ ò %
ð ô �vÔ7Ó8ò ä˜6¤5§?¡?×#CÑ#C×#VÑ#VÓWò +Ø×*Ñ*óñ%
ùs   ‚AA)	rn  r]  Ú_choice_timings_fnÚ_choice_timingsÚ_choicesÚoriginal_inputsrì   Ú_output_plannableÚ_make_kernel_renders)r‘  rN  rj  Úchoice_timings_fnÚunfiltered_choicesr¡  rp  s         €r‘   r]  zMultiTemplateBuffer.__init__›  sj   ø€ ô 	‰ÑØØØ#Ø"7ð	 	ô 	
ð #4ˆÔØLNˆÔØ,>ˆŒØ%ˆÔÜ!$ñ %
ð -ô%
ó "
ˆÔð <>ˆÕ!r“   c                ó   — | j                   S )z^
        Are all possible choices TritonTemplates or Extern Kernels with out variants
        )r$  r�  s    r‘   Úoutput_plannablez$MultiTemplateBuffer.output_plannable·  s   € ð
 ×%Ñ%Ð%r“   c                ó   — | j                   S rŒ   )r"  r�  s    r‘   r©  zMultiTemplateBuffer.choices¾  s   € à�}‰}Ðr“   c                óx   — || j                   vr| j                  |«      | j                   |<   | j                   |   S rŒ   )r!  r   )r‘  Úhint_overrides     r‘   Úchoice_timingsz"MultiTemplateBuffer.choice_timingsÂ  s>   € ð  × 4Ñ 4Ñ4Ø26×2IÑ2IÈ-Ó2XˆD× Ñ  Ñ/Ø×#Ñ# MÑ2Ð2r“   c              #  ó0  K  — t        |t        j                  j                  j                  «      sJ t        |«      «       ‚| j                  |j                  k(  sJ ‚| j                  }|j                  «       | _        	 d –— || _        y # || _        w xY w­wrŒ   )	r�   r  r¸  r  ÚTritonTemplateCallerr·   rN  r˜  r  )r‘  ÚcallerÚrenders      r‘   Úswap_as_triton_callerz)MultiTemplateBuffer.swap_as_triton_callerÉ  s…   è ø€ äØ”E—O‘O×4Ñ4×IÑIô
ð 	ä�‹<ó	ð 
ð �{‰{˜fŸm™mÒ+Ð+Ð+à×(Ñ(ˆØ"(×"?Ñ"?Ó"AˆÔð	-Ûà&,ˆDÕ#ø fˆDÕ#üs   ‚A;BÁ>B
 ÂBÂ
	BÂBc                óN  — t        |t        j                  j                  j                  «      sJ t        |«      «       ‚| j                  «       |j                  j                  k(  sJ ‚| j                  «       |j                  j                  k(  sJ ‚|j                  «       | _        y rŒ   )r�   r  r¸  r  r/  r·   r
  rN  r  r4  r  r  r˜  )r‘  r0  s     r‘   Úfinalize_as_triton_callerz-MultiTemplateBuffer.finalize_as_triton_caller×  s…   € ÜØ”E—O‘O×4Ñ4×IÑIô
ð 	ä�‹<ó	ð 
ð �}‰}‹ &§-¡-×"4Ñ"4Ò4Ð4Ð4Ø�‰Ó  F§M¡M×$8Ñ$8Ò8Ð8Ð8Ø"(×"?Ñ"?Ó"AˆÕr“   c                ób   — | j                  |¬«      }t        ||j                  ¬«      }|||   fS )N)r,  rŽ  )r-  r1  r»  )r‘  r,  ÚtimingsÚ
min_choices       r‘   Úget_min_choicez"MultiTemplateBuffer.get_min_choiceß  s7   € ð ×%Ñ%°MÐ%ÓBˆÜ˜ g§k¡kÔ2ˆ
Ø˜G JÑ/Ð0Ð0r“   c                ó–   — |j                  «       D ]"  \  }}|j                  «       | j                  |<   Œ$ | j                  d   | _        y)z;Finalize with multiple callers for different hint overridesN)rT  r  r%  r˜  )r‘  Úcallersr,  r0  s       r‘   Úfinalize_as_triton_callersz.MultiTemplateBuffer.finalize_as_triton_callersæ  sN   € ð &-§]¡]£_ò 	WÑ!ˆM˜6Ø7=×7TÑ7TÓ7VˆD×%Ñ% mÒ4ð	Wð #'×";Ñ";¸DÑ"AˆÕr“   )rN  rç  rj  rä  r&  z1Callable[[int | None], dict[ChoiceCaller, float]]r'  úlist[ChoiceCaller]r¡  rU  r¼   r½   r_  )r¼   r<  rŒ   )r,  r€  r¼   zdict[ChoiceCaller, float])r0  r  r¼   r‹  )r0  r  r¼   r½   )r,  r€  r¼   ztuple[ChoiceCaller, float])r:  z*dict[int | None, TritonTemplateCallerBase]r¼   r½   )r¢   r£   r¤   r‚  r]  rˆ  r)  r©  r-  r†  r‡  r2  r4  r8  r;  rI  rJ  s   @r‘   r  r  ’  sÜ   ø„ ñð>àð>ð !ð>ð Mð	>ð
 /ð>ð  /ð>ð 
õ>ð8 ò&ó ð&ð òó ðð +/ð3Ø'ð3à	"ó3ð ×Ñò-ó ð-óBð +/ð1Ø'ð1à	#ó1ðBØAðBà	÷Br“   r  c                  óL   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zdd„Zˆ xZS )ÚCUTLASSTemplateBufferc                óR   •— t         ‰| �  |||«       || _        || _        || _        y rŒ   )rn  r]  Úworkspace_sizeÚtemplateÚsupports_epilogue_fusion)r‘  rN  rj  r˜  r@  rA  rB  rp  s          €r‘   r]  zCUTLASSTemplateBuffer.__init__ò  s.   ø€ ô 	‰Ñ˜ Ð);Ô<à,ˆÔØ ˆŒØ(@ˆÕ%r“   c                ó6   — | j                   �| j                   S dS rò  ©r@  r�  s    r‘   r®  z(CUTLASSTemplateBuffer.get_workspace_size  s   € Ø&*×&9Ñ&9Ð&Eˆt×"Ñ"ÐLÈ1ÐLr“   c                óx   — | j                  «       D ]'  }t        j                  |j                  «       d d «       Œ) y rŒ   )r¨  ru   r  rs  )r‘  r\  s     r‘   Úemulate_store_fnz&CUTLASSTemplateBuffer.emulate_store_fn  s1   € Ø×&Ñ&Ó(ò 	5ˆFÜ�I‰I�f—o‘oÓ'¨¨tÕ4ñ	5r“   )rN  rç  rj  rä  r˜  úCallable[_P, _T]r@  rŽ   rA  r{   rB  r�   r¼   r½   r{  rS  )r¢   r£   r¤   r]  r®  rF  rI  rJ  s   @r‘   r>  r>  ñ  s_   ø„ ðAàðAð !ðAð -ð	Að
 ðAð "ðAð #'ðAð 
õAóM÷5r“   r>  c                  óD   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdˆ fd„Zˆ xZS )ÚCppTemplateBufferc                óR   •— t         ‰| �  |||«       || _        || _        d | _        y rŒ   )rn  r]  rA  r  Úoutputs)r‘  rN  rj  r˜  rA  r  rp  s         €r‘   r]  zCppTemplateBuffer.__init__
  s,   ø€ ô 	‰Ñ˜ Ð);Ô<Ø ˆŒØˆŒØ,0ˆ�r“   c                óv  •— t        | j                  t        «      r‘t        | j                  t        «      sJ t        | j                  «      «       ‚| j                  d   }t        |t        «      sJ t        |«      «       ‚|j                  }t        |t        «      sJ t        |«      «       ‚|S t        ‰| �%  «       S rò  )
r�   rN  r§  rK  r   r·   rr  rç  rn  r  )r‘  Úfirst_outputrN  rp  s      €r‘   r  zCppTemplateBuffer.get_layout  s’   ø€ Ü�d—k‘kÔ#4Ô5Ü˜dŸl™l¬HÔ5ÐI´t¸D¿L¹LÓ7IÓIÐ5àŸ<™<¨™?ˆLÜ˜l¬FÔ3ÐG´T¸,Ó5GÓGÐ3Ø!×(Ñ(ˆFÜ˜f¤fÔ-Ð;¬t°F«|Ó;Ð-ØˆMä‘7Ñ%Ó'Ð'r“   )rN  rç  rj  rä  r˜  rG  rA  r{   r  r   r¼   r½   r]  )r¢   r£   r¤   r]  r  rI  rJ  s   @r‘   rI  rI  	  sL   ø„ ð1àð1ð !ð1ð -ð	1ð
 "ð1ð ð1ð 
õ1÷
(ñ 
(r“   rI  c                  óF   ‡ — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )ÚCuteDSLTemplateBufferz‘
    Buffer for CuteDSL (CUTLASS Python DSL) template kernels.
    Similar to other template buffers but specialized for CuteDSL operations.
    c           
     ó‚  •— t         ‰| �  |||«       || _        || _        | g| _        |��t        | j                  d   t        «      sJ t        | j                  d   «      «       ‚| j                  d   j                  «       }| xj                  |D �cg c]  }t        t        |¬«      || «      ‘Œ c}z  c_        y y c c}w )Nr   rÌ  )rn  r]  rA  rž  rK  r�   rj  r‰   r·   r  r   rÂ  )	r‘  rN  rj  r˜  rA  rž  r  r¢  rp  s	           €r‘   r]  zCuteDSLTemplateBuffer.__init__*  s±   ø€ ô 	‰Ñ˜ Ð);Ô<Ø ˆŒØ,ˆÔØ&* VˆŒàÐ%Ü˜dŸk™k¨!™n¬fÔ5ÐK´t¸D¿K¹KÈ¹NÓ7KÓKÐ5Ø—[‘[ ‘^×.Ñ.Ó0ˆFØ�LŠLà)öàô œz°Ô8¸#¸tÕDòñ ŽLð &ùòs   ÂB<c                ó   — | j                   S rŒ   ©rK  r�  s    r‘   r¨  z!CuteDSLTemplateBuffer.get_outputs?  ó   € Ø�|‰|Ðr“   rŒ   )rN  rç  rj  rä  r˜  rG  rA  r   rž  rå  r¼   r½   r¯  )r¢   r£   r¤   r‚  r]  r¨  rI  rJ  s   @r‘   rO  rO  $  sQ   ø„ ñð 37ðàðð !ðð -ð	ð
 ðð 0ðð 
õ÷*r“   rO  c                  ó€   ‡ — e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zd	d„Z	 d
	 	 	 	 	 dd„Zˆ xZS )ÚNVUniversalGemmBufferzÀ
    Buffer for NVIDIA Universal GEMM kernels.

    Unlike CuteDSL templates which use Jinja templates, this generates
    simpler Python code that directly calls the cutlass_api library.
    c                ó0  •— t         ‰| �  ||d ¬«       || _        || _        | g| _        || _        || _        || _        || _        |	| _	        |
| _
        |j                  j                  |j                  j                  dœ| _        | j                  | _        y )N)r˜  )Úkernel_nameÚmin_cc)rn  r]  ÚkernelÚaccumulator_typerK  r@  ÚvariantÚscale_type_aÚscale_type_bÚswizzle_type_aÚswizzle_type_bÚmetadatarW  rX  Úkernel_metadataÚ_make_kernel_renderr˜  )r‘  rN  rj  rY  rZ  r[  r@  r\  r]  r^  r_  rp  s              €r‘   r]  zNVUniversalGemmBuffer.__init__K  s–   ø€ ô 	‰Ñ˜ ¸DÐÔAØˆŒØ 0ˆÔØ&* VˆŒØ,ˆÔØˆŒØ(ˆÔØ(ˆÔØ,ˆÔØ,ˆÔð "Ÿ?™?×6Ñ6Ø—o‘o×,Ñ,ñ 
ˆÔð #'×":Ñ":ˆÕr“   c                ó   — | j                   S )z#Return the workspace size in bytes.rD  r�  s    r‘   r®  z(NVUniversalGemmBuffer.get_workspace_sizel  s   € à×"Ñ"Ð"r“   c                ó   — | j                   S rŒ   rR  r�  s    r‘   r¨  z!NVUniversalGemmBuffer.get_outputsp  rS  r“   c                óÖ  ‡	— ddl m} ddlm} g }| j                  D ]K  }t        |t        «      r|j                  }t        |t        «      r|j                  }|j                  |«       ŒM t        |j                  «      } ||||| j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  ¬«      Š	ˆ	fd„}‰	|fS )zò
        Create a kernel renderer for code generation.

        Returns (kernel, render) tuple where:
        - kernel: NVUniversalGemmKernel object with call_kernel() method
        - render: function that returns source code string
        r   )ÚNVUniversalGemmKernel)ÚPlaceholder)rW  r™   re  ra  rZ  r@  r[  r\  r]  r^  r_  c                 ó$   •— ‰ j                  «       S rŒ   )r1  )Úrender_kernels   €r‘   r1  z9NVUniversalGemmBuffer._make_kernel_render.<locals>.renderš  s   ø€ Ø ×'Ñ'Ó)Ð)r“   )ÚBtorch._inductor.codegen.nv_universal_gemm.nv_universal_gemm_kernelrf  Útorch._inductor.utilsrg  rj  r�   rˆ   rM  rq  rÇ  rÈ   ÚKERNEL_NAMEra  rZ  r@  r[  r\  r]  r^  r_  )
r‘  Úout_noder,  rf  rg  r™   rl  rW  r1  ri  s
            @r‘   rb  z)NVUniversalGemmBuffer._make_kernel_renders  sÖ   ø€ õ	
õ 	6à!#ˆØ—;‘;ò 	$ˆCÜ˜#œyÔ)Ø—h‘h�Ü˜#œzÔ*Ø—h‘h�Ø×Ñ˜sÕ#ð	$ô ˜+×1Ñ1Ó2ˆá-Ø#Ø#Ø Ø ×0Ñ0Ø!×2Ñ2Ø×.Ñ.Ø—L‘LØ×*Ñ*Ø×*Ñ*Ø×.Ñ.Ø×.Ñ.ô
ˆô	*ð ˜fÐ$Ð$r“   )r   NNNN)rN  rç  rj  rä  rY  r   rZ  r   r[  r   r@  rŽ   r\  ú
Any | Noner]  rn  r^  rn  r_  rn  r¼   r½   r{  r¯  rŒ   )rm  r   r,  r€  r¼   ztuple[Any, Any])	r¢   r£   r¤   r‚  r]  r®  r¨  rb  rI  rJ  s   @r‘   rU  rU  C  s·   ø„ ñð  Ø#'Ø#'Ø%)Ø%)ð;àð;ð !ð;ð ð	;ð
 ð;ð ð;ð ð;ð !ð;ð !ð;ð #ð;ð #ð;ð 
õ;óB#óð :>ð*%Øð*%Ø,6ð*%à	÷*%r“   rU  c                ó&   — t        d„ | D «       «      S )Nc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wrŒ   ©r�   r‰   )rè   rÛ  s     r‘   rê   z#is_node_sequence.<locals>.<genexpr>£  s   è ø€ Ò4¨Œz˜!œV×$Ñ4ùr|  )rì   )r¸   s    r‘   Úis_node_sequencerr     s   € ô Ñ4¨eÔ4Ó4Ð4r“   c                  ó”   — e Zd ZU ded<   dd„Zdd„Zdd„Zedd„«       Ze		 	 	 	 dd„«       Z
dd„Zdd	„Z ed «      	 d	 	 	 dd
„«       Zy)r‰  ú#Sequence[IRNode | Sequence[IRNode]]rj  c                ód   — | j                   |   }t        |t        «      sJ ‚|j                  «       S rŒ   ©rj  r�   r‰   rs  )r‘  rÐ   Úinputs      r‘   Ú
input_namezInputsKernel.input_nameª  s,   € Ø—‘˜A‘ˆÜ˜%¤Ô(Ð(Ð(Ø�~‰~ÓÐr“   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�   rI  s     €r‘   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¢  rI  s     €r‘   rê   z/InputsKernel.get_read_writes.<locals>.<genexpr>»  s!   øè ø€ ò .
Ø(+‰G�C—L‘L“N×#ñ.
ùr{  r<  )r@   rK   rQ   rI  rj  r�   r   rí  rµ   r·  rs  r¨  r?  )r‘  r6  rw  r=  rI  s       @r‘   r3  zInputsKernel.get_read_writes¯  sÃ   ø€ Üœ<×+Ñ+Ñ,Ó.ˆÜ×&Ñ&ˆØ—[‘[ò 	5ˆEÜ˜%¤Ô*Ø—‘ÓB¸EÔBÕBÜ˜EÔ#8Ô9àà—	‘	™' %§.¡.Ó"2Ó3Õ4ð	5ô œL×,Ñ,Ñ-ó .
Ø/3×/?Ñ/?Ó/Aô.
ó 
ˆô ×&Ñ&ØØÜ"›ô
ð 	
r“   c                ó6   — | j                  «       j                  S rŒ   r5  r�  s    r‘   r£  zInputsKernel.get_readsÅ  r7  r“   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 t        |«      «       ‚|S rŒ   )r�   rˆ   rM  rq  ro  rS  rµ  rÍ  Úunwrap_storage_for_inputÚTorchBindObjectrr  r·   ©rÔ  r�   s     r‘   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Ð@¼¸a»Ó@Ð7Øˆr“   c                óÔ   — g }| D ][  }t        |t        «      r#|D �cg c]  }t        j                  |«      ‘Œ }}nt        j                  |«      }|j	                  |«       Œ] |S c c}w rŒ   )r�   r   r‰  r  rÇ  )rj  Ú
inputs_newr�   rÐ   s       r‘   r—  zInputsKernel.unwrap_storageÛ  sl   € ð 79ˆ
Øò 	!ˆAÜ˜!œXÔ&ØGHÖIÀ!”\×:Ñ:¸1Õ=ÐI�ÑIä ×9Ñ9¸!Ó<�Ø×Ñ˜aÕ ð	!ð Ðùò	 Js   œA%c                 ó   — yr1  r¦   r�  s    r‘   rD  zInputsKernel.is_externè  r®  r“   c                 ó   — yrØ  r¦   r�  s    r‘   r9  zInputsKernel.num_readsë  rÎ  r“   c                óÞ   — t        t        j                     «       }| j                  D ]B  }t	        |t
        «      r||j                  |«      z  }Œ(|D ]  }||j                  |«      z  }Œ ŒD |S rŒ   )r@   r°   r"   rj  r�   r‰   r>  )r‘  ri  rÖ  rl  Ú	inner_inps        r‘   r>  z!InputsKernel.get_free_symbol_usesî  sv   € ô ”u—|‘|Ñ$Ó&ˆØ—;‘;ò 	GˆCÜ˜#œvÔ&Ø�S×-Ñ-¨mÓ<Ñ<‘à!$ò G�IØ˜×7Ñ7¸ÓFÑF‘AñGð		Gð ˆr“   N)rÐ   rŽ   r¼   rÈ   rx  rz  r‰  )rj  rt  r¼   zlist[IRNode | Sequence[IRNode]]r_  r{  rr  r}  )r¢   r£   r¤   r¥   rx  r3  r£  r  r  r…  r—  rD  r9  rb   r>  r¦   r“   r‘   r‰  r‰  ¦  s…   … à/Ó/ó ó

ó,,ð òó ðð$ ð
Ø3ð
à	(ò
ó ð
óóñ ˜NÓ+à$)ð
Ø!ð
à	!ò
ó ,ñ
r“   r‰  c                  ó   — e Zd Zdd„Zdd„Zy)Ú	NopKernelc                 ó   — yr1  r¦   r�  s    r‘   rF  zNopKernel.is_no_opý  r®  r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   r£  zNopKernel.get_reads   r«  r“   Nr_  rz  )r¢   r£   r¤   rF  r£  r¦   r“   r‘   r‰  r‰  ü  s   „ óôr“   r‰  c                  ó„   — e Zd ZdZedd„«       Ze	 d		 	 	 	 	 d
d„«       Z ed «      	 d	 	 	 dd„«       Zed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                óZ
  — |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   }|du r-t)        |t        «      rt5        d„ |D «       «      rt3        |«      }t;        d„ |D «       «      }|€J ‚t=        dt+        |||||¬«      g ¬	«      }t?        |«      }g }tA        |«      D �]‡  \  }}t)        |tB        tD        f«      sJ tG        |«      «       ‚| jI                  |tJ        jM                  ||||   ||   d¬
«      «      }t)        |tN        «      sJ tG        |«      «       ‚t)        |jP                  t        «      sJ tG        |jP                  «      «       ‚|jP                  j                  |«       t)        |jR                  tB        «      r|jR                  jU                  «       }n|jR                  }t)        |t>        «      s�Œ|jW                  «       s�Œ1|j                  «       x}€�ŒEtY        |jF                  «      s�Œ\t[        |«      r�Œi|j                  |j]                  «       «       �ŒŠ t	        |«      dkD  rMt        j                  j_                  |t`        jb                  «      rt        j                  je                  |«       t        j                  jg                  |«      |_4        | jk                  |jP                  «      |_(        t        j                  jm                  |«       |S )z6
        Create the concat kernel from inputs
        r   rI   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrŒ   )r  rß  s     r‘   rê   z&ConcatKernel.create.<locals>.<genexpr>6  s   è ø€ Ò-WÈ1Ô.CÀA×.FÑ-Wùrà  Fc              3  óà   K  — | ]f  }d |j                   v xrR t        |j                   d    t        j                  ¬«      xs( t        |j                   d    t        j                  ¬«      –— Œh y­w)rá  ©rŠ  N)rb  r/   r  r…  r‡  ©rè   Úargs     r‘   rê   z&ConcatKernel.create.<locals>.<genexpr>=  sm   è ø€ ò ð ð ˜Ÿ™Ð!ò ä<àŸ™ ™Ü&+×&9Ñ&9ôò 	ô
 @àŸ™ ™Ü&+×&<Ñ&<ôóñùs   ‚A,A.c              3  ój   K  — | ]+  }t        |«      xr |j                  «       j                  –— Œ- y ­wrŒ   )r  r  rR  rß  s     r‘   rê   z&ConcatKernel.create.<locals>.<genexpr>Q  s/   è ø€ ò 
ØFGÔ! !Ó$ÒA¨¯©«×)AÑ)AÓAñ
ùs   ‚13N)r  r  r  r  rR  ©rÅ   rN  rj  ©rë  )7r  r  r©   r
  rÍ   rÎ   rÇ  rw   r  r  rÚ  r  r  rJ   ri  rç  rø  r  r  r  r�   rP  r>  r  r  r1   r0  Úcurrent_noderÃ   rì   r�  rq  rò   ro  rÖ  r·   rÞ  rÜ  r�  rr  rj  rM  rp  r  rn   rm   rL  r§  rL   ÚFOREACHÚregister_operation_listr™  rÅ   r—  rš  )rÔ  rj  rB  r  r  rG  Úoffsets_startÚoffsets_endrÐ   Ú
input_sizerÈ  Úoutput_strider�   rN  Úany_input_is_storage_and_layoutÚfx_node_argsrR  Úconcat_kernelrY  Úop_namesrl  rµ  Úinput_unwrappedÚdevs                           r‘   r�  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×"LÑ"LØ  ™ Z°¡]ó#�H˜Q’Kð	ð ×Ñ˜x¨™}Õ-ð	.ô (6×'HÑ'HÈÓ'RˆÜ×'Ò'ä"×/Ñ/Ø˜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ˆð ,¨uÑ4Ü˜<¬Ô.Üñ ð (ôô ô$ ;¸8ÓDˆMäñ 
ØKQô
ó 
ˆ	ð Ð!Ð!Ð!Ü$ØÜØØØØ$Ø#ôð ô

ˆô ˜MÓ*ˆØˆÜ Ó'ó 	C‰FˆAˆsÜ˜c¤H¬jÐ#9Ô:ÐE¼DÀ»IÓEÐ:Ø×+Ñ+ØÜ× Ñ Ø˜C ¨qÑ!1°;¸q±>Èð !ó óˆLô ˜l¬FÔ3ÐG´T¸,Ó5GÓGÐ3Ü˜m×2Ñ2´DÔ9ÐU¼4À×@TÑ@TÓ;UÓUÐ9Ø× Ñ ×'Ñ'¨Ô5ä˜#Ÿ(™(¤HÔ-Ø"%§(¡(×"6Ñ"6Ó"8‘à"%§(¡(�ô ˜?¬JÖ7Ø#×3Ñ3Ö5ØŸN™NÓ,Ð,�SÒ9Ü˜3Ÿ8™8Ö$Ü" <Ö0à—‘ × ?Ñ ?Ó AÖBð1	Cô4 ˆx‹=˜1Ò¤§¡×!4Ñ!4°V¼^×=SÑ=SÔ!TÜ�G‰G×+Ñ+¨HÔ5äŸW™W×4Ñ4°]ÓCˆÔØ"×1Ñ1°-×2FÑ2FÓGˆÔÜ	�‰×"Ñ" =Ô1àˆr“   Nc                óà  — t        |t        «      r| j                  |j                  |«      S t        |t        t
        f«      sJ t        |«      «       ‚t        |j                  t        «      rªt        |j                  j                  t        «      r|j                  j                  sy|€yt        |j                  «       «      t        |j                  «       «      k7  ryt        d„ t        |j                  «       |j                  «       «      D «       «      S t        |j                  d«      xrA t        |j                  j                  t         «      xr t        |j                  t"        «       S )NFTc              3  óv   K  — | ]1  \  }}t         j                  j                  j                  ||«      –— Œ3 y ­wrŒ   rH  rJ  s      r‘   rê   z=ConcatKernel.can_realize_into_without_copy.<locals>.<genexpr>Ÿ  s3   è ø€ ò á�B˜ô —‘× Ñ ×8Ñ8¸¸R×@ñùrK  rN  )r�   rˆ   Úcan_realize_into_without_copyrM  ro  rq  r·   r  rN  rP  r)  rÍ   r4  rì   rÖ   r¶  r  ÚExternKernelAlloc)rÔ  rÛ  rÜ  s      r‘   r¦  z*ConcatKernel.can_realize_into_without_copy†  s  € ô �cœ9Ô%à×4Ñ4°S·X±X¸sÓCÐCä˜#¤¬*Ð5Ô6ÐA¼¸S»	ÓAÐ6Ü�c—h‘hÔ 3Ô4ä˜sŸx™xŸ™´Ô<Ø—x‘x×0Ò0àð ˆ{Øô �3—>‘>Ó#Ó$¬¨C¯N©NÓ,<Ó(=Ò=Øäñ ä! #§.¡.Ó"2°C·N±NÓ4DÓEôó ð ô �C—H‘H˜hÓ'ò <Ü˜3Ÿ8™8Ÿ?™?¬NÓ;ò<ä˜sŸx™xÔ):Ó;Ð;ð	
r“   c                ó.   — t         j                  | |«      S rŒ   )r‰  r>  r=  s     r‘   r>  z!ConcatKernel.get_free_symbol_usesª  s   € ô ×-Ñ-¨d°MÓBÐBr“   c                ó^  — t        |t        «      s&t        |«      rt        |«      \  }}t        ||¬«      }t        |t        «      sJ t	        |«      «       ‚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.                  j1                  ||«      ‘Œ1 c}}¬«      }| j                  ||«      S c c}}w )NrL  rN  r   )r�   rS  r  rO  r·   rˆ   rÞ  rM  rq  rø  r¶  r¦  r«  rN  r  r�  r  r  r  rÖ   r
  rw   r  r  rÚ  )rÔ  rÛ  rÜ  rV  rN  rF  rG  Úpws           r‘   rÞ  zConcatKernel.realize_into°  sL  € ô
 ˜#œÔ/Ü$ SÔ)Ü"7¸Ó"<‘�˜Ü%¨7¸6ÔB�Ü˜#œÔ/Ð:´°c³Ó:Ð/Ü�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ô —‘× Ñ ×:Ñ:¸1¸aÕ@óð	 ó 
ˆð ×Ñ  CÓ(Ð(ùós   Å4F)c                 ó   — yr1  r¦   r�  s    r‘   r  zConcatKernel.should_allocateÒ  r®  r“   )rj  rä  rB  rŽ   r¼   rq  rŒ   )rÛ  r‰   rÜ  r?  r¼   r�   rr  r}  )rÛ  r‰   rÜ  r‰   r¼   r‰   r_  )r¢   r£   r¤   r‚  r  r�  r¦  rb   r>  rÞ  r  r¦   r“   r‘   r�  r�    s˜   „ ñð
 òyó ðyðv à/3ð!
Øð!
Ø,ð!
à	ò!
ó ð!
ñF ˜NÓ+à$)ðCØ!ðCà	!òCó ,ðCð
 ò)ó ð)ôBr“   r�  c              #  ó†   K  — | j                  d«      }	 d –— | j                  |«       y # | j                  |«       w xY w­wr  )Ú"_ignore_fresh_unbacked_symbols_set)rî   Úprevs     r‘   Ú_track_fresh_unbacked_symbolsr¯  Ö  s:   è ø€ à×7Ñ7¸Ó>€Dð;Ûà×4Ñ4°TÕ:øˆ	×4Ñ4°TÕ:üs   ‚A•+ ™A«>¾Ac                óP   — | �| j                  «       rt        | «      S t        «       S rŒ   )Ú"_ignore_fresh_unbacked_symbols_tlsr¯  r
   )rî   s    r‘   Ú(_fallback_kernel_symbol_tracking_contextr²  ß  s(   € ð Ð ×!MÑ!MÔ!OÜ,¨YÓ7Ð7Ü‹=Ðr“   c                  óè  ‡ — e Zd ZU dZ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<    ej                  e¬«      Zded<   dZded<    ej                  e¬«      Zded<    ej                  e¬«      Zded<   	 	 	 	 	 	 	 dB	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dCˆ fd„ZdDd„ZdEd„ZdFˆ fd„ZdGd „ZdGd!„Z	 dH	 	 	 	 	 dId"„ZdJd#„ZdHdKd$„ZdLd%„ZdMd&„ZdNd'„Z e!dOd(„«       Z"e#	 	 	 	 	 	 	 	 dPd)„«       Z$e#dQd*„«       Z%e#dRd+„«       Z&e#dRd,„«       Z'e#	 	 	 dS	 	 	 	 	 	 	 	 	 dTd-„«       Z(e#	 dU	 	 	 	 	 	 	 dVd.„«       Z)e#	 dU	 	 	 	 	 	 	 dWd/„«       Z*e#dRd0„«       Z+e#dRd1„«       Z,e#dRd2„«       Z-e#dRd3„«       Z.dGd4„Z/	 	 	 	 	 	 dXd5„Z0dHdYd6„Z1dZd7„Z2d[d8„Z3dUd\d9„Z4dNd:„Z5dJd;„Z6dJd<„Z7dJd=„Z8d]d>„Z9d^d?„Z: e;d «      	 dU	 	 	 d_d@„«       Z<dNdA„Z=e=Z>ˆ xZ?S )`rµ  z©
    A class that represents Kernels which are not directly lowered to Inductor
    Loop Level IR, such as custom operators, or aten operators which we fallback to.
    r¦   r°  Úconstant_argsrÄ  r  rÄ   NúReinterpretView | NoneÚoutput_viewre  Úpython_kernel_nameÚcpp_kernel_nameúIterable[str]Úordered_kwargs_for_cpp_kernelú_OpOverloads | NoneÚop_overloadzlist[dict[str, Any]] | NoneÚarg_propertieszdict[str, dict[str, Any]]Úallarg_propertiesz dict[str, dict[str, Any]] | NoneÚkwarg_propertiesz"dict[sympy.Symbol, pytree.KeyPath]Úunbacked_bindingszlist[MutationOutput]rŸ  c                óD  •— t         ‰| �  |||¬«       || _        |r|ni | _        || _        |
| _        | j                  |«       | j                  |«       |	| _        | j                  «        i | _
        g | _        t        j                  j                  | _        i | _        y ©Nr•  )rn  r]  r´  rÄ   r¶  r¼  Úset_cpp_kernel_nameÚset_python_kernel_namerº  Úcollect_arg_kwarg_propertiesrÀ  rŸ  rw   r  r—  Úfx_noder   )r‘  rÅ   rN  rj  r´  rÄ   r¶  r·  r¸  rº  r¼  rp  s              €r‘   r]  zExternKernel.__init__  sŸ   ø€ ô 	‰ÑØØØð 	ô 	
ð
 +ˆÔÙ &‘f¨BˆŒØ&ˆÔØ&ˆÔØ× Ñ  Ô1Ø×#Ñ#Ð$6Ô7Ø-JˆÔ*Ø×)Ñ)Ô+Ø!#ˆÔØ "ˆÔÜ—w‘w×+Ñ+ˆŒà+-ˆÕr“   c                ó    — | g| j                   ¢S rŒ   rð  r�  s    r‘   r¨  zExternKernel.get_outputs#  rñ  r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  z%ExternKernel.get_unbacked_symbol_defs&  r«  r“   c                ó�   •‡— t         ‰| �  «       Šdˆfd„}t        j                  || j                  | j
                  fd„ ¬«       ‰S )Nc                óª   •— t        | t        «      rB| j                  «       }|�/‰j                  j	                  t        j                  |«      «       y y y rŒ   )r�   r‰   r  r6  r·  rK   rI  )r  rÅ   r›  s     €r‘   Úadd_ir_readz1ExternKernel.get_read_writes.<locals>.add_ir_read,  sJ   ø€ Ü˜%¤Ô(Ø×+Ñ+Ó-�ØÐ#Ø×%Ñ%×)Ñ)¬,×*>Ñ*>¸tÓ*DÕEð $ð )r“   c                ó"   — t        | t        «      S rŒ   rq  r  s    r‘   r�  z.ExternKernel.get_read_writes.<locals>.<lambda>5  s   € ¤*¨U´FÓ";€ r“   )Úis_leaf)r  r   r¼   r½   )rn  r3  ÚpytreeÚ	tree_map_r´  rÄ   )r‘  rË  r›  rp  s     @€r‘   r3  zExternKernel.get_read_writes)  sF   ù€ Ü‘gÑ-Ó/ˆõ	Fô 	×ÑØØ×Ñ §¡Ð-Ù;õ	
ð
 Ðr“   c                óN  — 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 g | _        y c c}w c c}w c c}w c c}w c c}w )N)rÅ   r·   r  )r·   r  )r�   r¼  r  Ú_opsÚ
OpOverloadÚ_schemaÚ	argumentsÚ
kwarg_onlyrÅ   Ú	real_typer  rÎ   rÍ   rj  r½  r¾  rº  Úschema_kwargs)r‘  r�   rÐ   s      r‘   rÅ  z)ExternKernel.collect_arg_kwarg_properties9  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Õð "$ˆDÕùò?ùò 7ùòùò6ùò"s*   Á7HÂ+	HÄ+HÆHÆ/HÇ'H"Ç9H"c                óz   — t        | j                  t        «      r!| j                  «        | j	                  «        y y rŒ   )r�   rN  r  Úapply_constraintr"  r�  s    r‘   r™  zExternKernel.decide_layout^  s-   € Ü�d—k‘k¤>Ô2Ø×!Ñ!Ô#Ø×ÑÕ ð 3r“   c                ó¸   — t        | |«      \  }}|r|j                  |«       |s| j                  «       }|r$ddlm}  || |d¬«      }|j                  ||«       y y )NrI   )Ú'set_kernel_post_grad_provenance_tracingT)rD  )rj   Úmake_commentÚtry_get_kernel_namer¹  rÛ  Úwrite_provenance_debug_handle)r‘  ÚwrapperrW  Ú
origin_strÚ_detailed_origin_strrÛ  Údebug_handles          r‘   Úcodegen_commentzExternKernel.codegen_commentc  sf   € ô ,?¸tÀWÓ+MÑ(ˆ
Ð(ÙØ× Ñ  Ô,áØ×2Ñ2Ó4ˆKÙÝFáBØ�k¨TôˆLð ×1Ñ1°+¸|ÕLð r“   c                ó   — t         ‚rŒ   r�  ©r‘  rß  s     r‘   ÚcodegenzExternKernel.codegent  r�  r“   c                ó^  — || _         t        j                  j                  r.t	        | j
                  t        j                  j                  «      sy | j
                  }| j                   €Å|j                  dk(  rš|j                  dk(  r|j                  j                  d«      d   n|j                  j                  dd«      }ddlm} |j!                  d|j                  › �i «      }t#        d„ |D «       d	¬
«      }|d	kD  r|› d|› �}d|› d�| _         y |j$                  j&                  | _         y y )NÚatenr  ú.r   rù   ©Úinductor_fallback_opszaten.c              3  ó\   K  — | ]$  }|j                  d «      sŒt        |dd «      –— Œ& y­w)rO  rI   N)Ú
startswithrŽ   )rè   rO  s     r‘   rê   z3ExternKernel.set_cpp_kernel_name.<locals>.<genexpr>“  s%   è ø€ ÒK A¸¿¹ÀcÕ9J”S˜˜1˜2˜—ZÑKùs   ‚,™,rI   r—  Ú_vz
at::_ops::z::call)r¸  rw   r  Úcpp_wrapperr�   r¼  r  rÑ  rÒ  Ú	namespaceÚ_overloadnamer¢   rÈ  ÚreplaceÚtorchgen.aoti.fallback_opsrë  r»  rî  rÓ  rÅ   )r‘  r¸  rY  Úopnamerë  Úversion_infoÚlatest_versions          r‘   rÃ  z ExternKernel.set_cpp_kernel_namew  s  € Ø.ˆÔÜ�w‰w×"Ò"¬*Ø×ÑœeŸj™j×3Ñ3ô+
ð à×!Ñ!ˆØ×ÑÐ'à×Ñ 6Ò)ð ×+Ñ+¨yÒ8ð —O‘O×)Ñ)¨#Ó.¨qÒ1àŸ™×0Ñ0°°cÓ:ð õ Mà4×8Ñ8¸5ÀÇÁÐ@QÐ9RÐTVÓW�Ü!$ÙK¨ÔKØô"�ð " AÒ%Ø &˜x r¨.Ð)9Ð:�FØ)3°F°8¸6Ð'B�Õ$à'-§~¡~×':Ñ':�Õ$ð7 (r“   c                ó  — || _         |�y | j                  }|€y t        |t        j                  j
                  «      rd|j                  › �| _         y |j                  j                  dd«      › d|j                  › �| _         y )Nztorch.ops.higher_order.ú._ops.ú.ops.ré  )	r·  r¼  r�   r  rÑ  ÚHigherOrderOperatorr¢   r£   rò  )r‘  r·  rY  s      r‘   rÄ  z#ExternKernel.set_python_kernel_nameœ  s   € Ø"4ˆÔØÐ)Øà×!Ñ!ˆØˆ>ØÜ˜¤§
¡
× >Ñ >Ô?Ø(?ÀÇÁÐ?PÐ&QˆDÕ#ð ×$Ñ$×,Ñ,¨X°wÓ?Ð@ÀÀ&Ç/Á/ÐARÐSð Õ#r“   c                ó0  — ddl m} | j                  «       x}r|j                  nt        j
                  j                  }t        j
                  j                  r| j                  S t        j
                  j                  r�t        t        j
                  j                  |«      s(J t        t        j
                  j                  «      «       ‚| j                  €y t        j
                  j                  j                  | j                  |«      S | j                  S )NrI   )ÚCppWrapperCpu)Úcodegen.cpp_wrapper_cpurü  r  r·   rw   r  Údevice_typeÚ
fx_wrapperr·  rï  r�   rÊ  r¸  Úget_c_shim_func_name)r‘  rü  Údr  s       r‘   rÝ  z ExternKernel.try_get_kernel_name«  sÎ   € Ý:à!%§¡Ó!2Ð2˜AÐ2�—’¼¿¹×9LÑ9LˆÜ�7‰7×ÒØ×*Ñ*Ð*Ü�W‰W× Ò ÜœaŸg™g×2Ñ2°MÔBð ÄDÜ—‘×$Ñ$óEó ÐBð ×#Ñ#Ð+ØÜ—7‘7×'Ñ'×<Ñ<Ø×$Ñ$ fóð ð ×*Ñ*Ð*r“   c                ó.   — | j                  «       }|€J ‚|S rŒ   )rÝ  r¢  s     r‘   Úget_kernel_namezExternKernel.get_kernel_name½  s!   € Ø×'Ñ'Ó)ˆØÐÐÐØˆr“   c           	     ó  — t         j                  | j                  «       | j                  «       | j	                  «       | j                  «       | j                  «       | j                  «       ¬«      }|j                  «        |S )N)r  r  rµ  r¶  r~  r|  )	r  r�  r  r  r  r
  rª  r§  rø  )r�   rª  s     r‘   Ú
copy_inputzExternKernel.copy_inputÂ  sa   € ä×ÑØ—<‘<“>Ø—+‘+“-Ø—]‘]“_Ø—:‘:“<Ø×)Ñ)Ó+Ø—o‘oÓ'ð ó 
ˆð 	�
‰
ŒØˆ	r“   c                ó”  ‡‡— ||dœ}t        j                  |«      \  }Šg Šg }g }g }|D �]Ë  }	|	xt        d˜ x�l\    t        j                  j
                  j                  j                  |	d¬«      }
‰j                  d«       |j                  |
«       |j                  |
«       Œ{ xt        d˜ x�”\    ‰j                  d«       |j                  |	«       |	j                  j                  }|	j                  j                  dk(  r|€J ‚|j                  t        j                  j                  |   j!                  «       «       �Œ xt"        d˜ x�B\    ‰j                  d«       |j                  |	«       |j                  |	j$                  «       �Œg t&        d˜ x�&\   ‰j                  d«       |j                  |	«       �Œ— 	 ‰j                  d«       |j                  |	«       |j                  |	«       �ŒÎ 	 	 	 	 	 	 dˆˆfd„}|D �cg c]  }| j)                  |«      ‘Œ }}|D ]  }t+        |«      sŒt-        |d¬	«       Œ g }|D �]  }t/        |t0        «      se|j3                  «       t        j                  j4                  v r;|j                  t        j                  j4                  |j3                  «          «       Œyt/        |t0        «      se|j3                  «       t        j                  j6                  v r;|j                  t        j                  j6                  |j3                  «          «       Œît/        |t8        «      r!|j                  |j;                  «       «       �Œt/        |t<        «      r|j                  |j>                  «       �ŒLt/        |t        j@                  jB                  j                  «      ro|j                  j                  }|j                  j                  dk(  r|€J ‚|j                  t        j                  j                  |   j!                  «       «       �Œé|j                  tE        |«      «       �Œ  |||«      \  }}t        jF                  j                  }tI        «       5  tK        |«      5   ||i |¤Ž}ddd«       ddd«       d}|rÂt        jL                  jN                  jQ                  d
«      }tS        «       }t        jL                  jT                  t        jV                  jX                  jZ                  u r|d   }t]        t        jL                  «      }|5  t_        |t        jL                  «       ddd«       ta        ||«      }t/        tb        td        f«      s|gn|}|D ]�  }t/        |t        jf                  «      sŒ|jh                  sŒ+tj        jl                  rŒ<d}t        j                  jL                  jN                  jQ                  dd«      x}r|› d|› �}|t        j                  _7        Œ‘ |||||fS c c}w # 1 sw Y   �Œ“xY w# 1 sw Y   �Œ˜xY w# 1 sw Y   ŒëxY w)a…  Partition kernel args into tensor and non-tensor, realize tensor inputs,
        re-run fake tensor propagation with the realized strides, and return
        (example_output, tensor_args, non_tensor_args, unflatten_args, unbacked_bindings).

        unflatten_args(new_tensor_args, new_non_tensor_args) reconstructs the
        original (args, kwargs) tree from replacement lists.
        )rÃ   rÄ   r¦   N)r   Fr"  Tc                ó$  •— g }t        | «      }t        |«      }‰D ]9  }|r|j                  t        |«      «       Œ |j                  t        |«      «       Œ; t        j                  |‰«      }|j                  dg «      |j                  di «      fS )NrÃ   rÄ   )rò  rÇ  rñ  rÎ  Útree_unflattenr»  )	Únew_tensor_argsÚnew_non_tensor_argsrN  Ú
it_tensorsÚit_non_tensorsÚ	is_tensorrÖ  Úargs_flat_is_tensorÚ	args_specs	          €€r‘   Úunflatten_argsz3ExternKernel.process_kernel.<locals>.unflatten_args  sˆ   ø€ ð ˆFÜ˜oÓ.ˆJÜ!Ð"5Ó6ˆNØ0ò 8�	ÙØ—M‘M¤$ zÓ"2Õ3à—M‘M¤$ ~Ó"6Õ7ð	8ô
 ×%Ñ% f¨iÓ8ˆAØ—5‘5˜ Ó$ a§e¡e¨H°bÓ&9Ð9Ð9r“   ró  rá  rI   zEsparsity not handled. Please file issue for sparse inference weights.r³  z Found from : 
 )r		  rÕ   r
	  rÕ   r¼   ztuple[list[_T], dict[str, _T]])8rÎ  Útree_flattenr    rw   r  r  rî   Úcreate_symintnoderÇ  ÚGeneratorStater  rÏ   r·   r  r"  Údefault_generatorsÚclone_stateÚOpaqueObjectStater  r‰   rÍ  r  rO  r�   ro  rs  Ú	constantsÚtorchbind_constantsr€  Ú	get_valuer¶   Úopaque_example_valuer¸  Úirr   r6  r#   r²  r—  rb  r»  r
   rT  Ú_higher_order_opsÚeffectsÚwith_effectsr3   r:   r4   r©   rª   rÔ  Ú	is_sparserJ   Úgraph_partitionÚdisable_cudagraphs_reason)rÔ  rY  rÃ   rÄ   Úbinded_argsÚ	args_flatÚtensor_argsÚnon_tensor_argsÚreal_non_tensor_argsr“  r¹   Údevice_indexr	  r�   Úexample_argsÚnew_argsÚ
new_kwargsrî   Úexample_outputrÀ  Únode_meta_valÚctxÚexample_out_lir  Úmsgr³  r	  r	  s                             @@r‘   Úprocess_kernelzExternKernel.process_kernelÏ  sV  ù€ ð"  $¨vÑ6ˆä%×2Ñ2°;Ó?Ñˆ	�9à*,Ðà$&ˆØ(*ˆð ð 	ð ó 	5ˆCØØ”T–VÜŸ7™7×+Ñ+×5Ñ5×GÑGÈÐRVÐGÓW�DØ'×.Ñ.¨uÔ5Ø#×*Ñ*¨4Ô0Ø(×/Ñ/°Õ5ð	 ð &”^Ö%Ø'×.Ñ.¨uÔ5Ø#×*Ñ*¨3Ô/Ø#&§:¡:×#3Ñ#3�LØŸ:™:Ÿ?™?¨fÒ4¸Ð9QÐQÐQØ(×/Ñ/ÜŸ
™
×5Ñ5°lÑC×OÑOÓQöð &ð )Ô&Ö(Ø'×.Ñ.¨uÔ5Ø#×*Ñ*¨3Ô/Ø(×/Ñ/°·	±	Ö:ð )ô
 •XØ'×.Ñ.¨tÔ4Ø×&Ñ& sÖ+ð ð Ø'×.Ñ.¨uÔ5Ø#×*Ñ*¨3Ô/Ø(×/Ñ/°Ö4ð;	5ð>	:Ø)ð	:Ø@Lð	:à+ö	:ð 6AÖA°�s×(Ñ(¨Õ+ÐAˆÐAð ò 	6ˆAÜ$ QÕ'Ü% a°Ö5ð	6ð ð 	ð ó 	:ˆ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§K¡K£MÖ2Ü˜AÔ0Ô1Ø×#Ñ# A×$:Ñ$:Ö;Ü˜AœuŸ™×1Ñ1×@Ñ@ÔAØ Ÿx™xŸ~™~�Ø—x‘x—}‘}¨Ò.°<Ð3KÐKÐKØ×#Ñ#Ü—J‘J×1Ñ1°,Ñ?×KÑKÓMöð ×#Ñ#Ô$5°aÓ$8Ö9ð+	:ñ.  .¨lÐ<PÓQÑˆ�*Ü—K‘K×)Ñ)ˆ	ä$Ó&ñ	=ä4°YÓ?ñ	=ñ $ XÐ<°Ñ<ˆN÷		=÷ 	=ð HLÐÙÜŸN™N×/Ñ/×3Ñ3°EÓ:ˆMÜ0;³ˆCÜ�~‰~×$Ñ$¬×(?Ñ(?×(GÑ(G×(TÑ(TÑTà -¨aÑ 0�Ü<¼Q¿^¹^ÓL�àñ KÜ 	¬1¯>©>¸>ÔJ÷Kä 9Ø˜>¨=ó!Ðô ˜n¬t´U¨mÔ<ð Ñàð 	ð  ò 		8ˆAä˜1œeŸl™lÕ+Ø—K“KÜ×.Ó.à]�Ü"#§'¡'×"6Ñ"6×";Ñ";×"?Ñ"?ÀÈtÓ"TÐT�;ÐTØ ˜EÐ!2°;°-Ð@�CØ47”—‘Õ1ð		8ð ØØØØð
ð 	
ùòc B÷V	=ñ 	=ú÷ 	=ñ 	=ú÷Kð Kús6   È
XÑ>X1Ò
	X$ÒX1Ô8X>Ø$X.	Ø)X1Ø1X;Ø>Yc                ó*  — t        |t        «      sJ t        |«      «       ‚t        |t        «      r|S |j	                  «       }t
        j                  j                  |j                  «       «      }|€J ‚|j                  «       }|�¼d|j                  v r®t        |t        t        t        f«      r“t        |j                  t        «      ryt        |j                  d   t         j"                  ¬«      s(t        |j                  d   t         j$                  ¬«      r)|j'                  t)        |j+                  «       «      «       n|j-                  «        t/        j0                  |j+                  «       d¬«      \  }}|d   } |j3                  «       |«      }t
        j                  j4                  j7                  ||«      }t
        j                  j4                  j9                  ||«      }	t
        j                  j4                  j;                  ||«      }
t=        ||	«      |
z   }||k7  rt>        jA                  d|	|
|«       tB        ‚t        |jD                  tG        |jI                  «       |jK                  «       |j+                  «       |	|
d¬«      ¬	«      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.
        rá  r‘  rÖ  r†   r   z@convert_to_reinterpret_view failed: stride=%s offset=%s index=%sFr¿  rL  )&r�   ro  r·   rS  rp  rw   r  rÎ  rs  rª  rb  rr  rÖ  rN  r  r/   r  r…  r‡  r-  r1   r
  r"  rK   r–  r
  r  r²  Ústride_varsÚ
offset_varro   r±  r¹  rÙ  rM  rP  r   r  )rÔ  r�   Úx_unwrap_viewr¢  Úx_unwrap_view_fx_nodeÚ
index_argsrU  r•  rÏ   rU  rQ  Úexpecteds               r‘   Úconvert_to_reinterpret_viewz(ExternKernel.convert_to_reinterpret_viewu  s$  € ô ˜!œXÔ&Ð/¬¨Q«Ó/Ð&Ü�aœÔ)ØˆHð Ÿ™›ˆÜ�g‰g× Ñ  ×!7Ñ!7Ó!9Ó:ˆØˆÐˆØ #× 3Ñ 3Ó 5Ðð "Ð-ØÐ.×3Ñ3Ñ3Ü˜=¬?¼FÄJÐ*OÔPÜ˜=×/Ñ/´Ô@ä8Ø)×.Ñ.¨uÑ5Ü"'×"5Ñ"5õô <Ø)×.Ñ.¨uÑ5Ü"'×"8Ñ"8õð ×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“\ØØØôô

ð 
	
r“   c           	     ó  — |€
t        «       S t        |t        t        j                  j
                  j                  t        f«      rt        |¬«      S t        |t        «      rot        «       5  t        j                  j                  t        j                  |j                   |j#                  «       |j%                  «       ¬«      «      cd d d «       S t        |t&        «      r|S t        |t(        «      r| j+                  |j,                  «      S t        |t.        «      r4t/        | j+                  |j,                  «      |j1                  «       ¬«      S t        |t2        «      r;|j5                  «        t7        |j9                  «       «      r	 | j;                  |«      S t        |t>        «      r|j5                  «        |S t        |t@        t        tB        f«      r|S | jE                  |«      S # 1 sw Y   �Œ&xY w# t<        $ r Y Œhw xY w)N)rŽ  )r  r  rL  )#r  r�   r    r°   r±   r²   r³   rŽ   rµ   r  rA   rw   r  Úadd_tensor_constantr  rT  r  r  r  r!  rˆ   rÍ  rM  rS  r  ro  rø  r  rp  r8	  rÙ  rq  ÚNonTensorObjr¶   r	  r�  s     r‘   rÍ  zExternKernel.realize_input½  sˆ  € àˆ9Ü'Ó)Ð)Ü�aœ$¤§¡× 3Ñ 3× ;Ñ ;¼SÐAÔBÜ(¨aÔ0Ð0Ü�aœÔ"ô (Ó)ñ Ü—w‘w×2Ñ2Ü—L‘L §¡°·±³ÀaÇlÁlÃnÔUó÷ñ ô �aœÔ(ØˆHÜ�aœÔ#Ø×$Ñ$ Q§V¡VÓ,Ð,Ü�aœÔ)Ü"Ø×&Ñ& q§v¡vÓ.°q·|±|³~ôð ô �aœÔ"Ø�I‰IŒKÜ$ Q§]¡]£_Ô5ðØ×:Ñ:¸1Ó=Ð=ô �aœÔ$à�I‰IŒKØˆHÜ�aœ,Ô(=Ô?PÐQÔRØˆHØ�~‰~˜aÓ Ð ÷3ñ ûô" +ò Ùðús   Á,AG-ÆG: Ç-G7Ç:	HÈHc                ó²   — t        |«      r<t        |j                  «       «      dk(  r|S |j                  «       D ]  }|dk(  sŒ	|c S  | j                  |«      S rM  )r  rÍ   r4  r	  )rÔ  r�   r  s      r‘   Úrequire_stride1zExternKernel.require_stride1á  sT   € ä  Ô#Ü�1—<‘<“>Ó" aÒ'Ø�ØŸ,™,›.ò �Ø˜Q“;Ø’Hðð �~‰~˜aÓ Ð r“   c                ó(
  — |€|€J ‚|j                  «       dv r|s|S t        |«      �r-t        |j                  «       t        «      rG|r2t        ||«      }|r|j                  «        |S t        |dd||¬«       |S t        |ddd||¬«       |S d}|r>|r<t        t        j                  ||j                  «       |j                  «       «      «      }t        |j                  «       t        t        f«      rf|r|j                  «       j                  |«      s5|rCt!        ||j                  «       j"                  |j                  «       «      r|�t%        ||«      S |S |�ct        |j                  «       t        t        f«      r?t!        ||j                  «       j"                  |j                  «       «      rt%        ||«      S t        |j                  «       x}t&        «      rwt        |j)                  «       x}t        «      rt+        d«      ‚t        |t        «      r<|r|j                  |«      s'|r't!        ||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                  «       x}	«      rtt9        |	d«      rht        |	j0                  t:        «      sN	 | j=                  |j0                  «      |_        |r| j?                  |||¬	«      S |r| jA                  |||¬	«      S 	 d}
|j                  «       }|�´tD        jF                  jH                  }tK        tM        |j                  «       «      «      D �cg c]<  }|jO                  ||   d
«      r%|jQ                  |j                  «       |   d«      r|‘Œ> }
}|
D ].  }tR        jT                  jV                  jY                  ||d
d«      }Œ0 | j[                  |«      }t        |dd|||¬«       |rBt]        |j                  «       «      s)t]        |j_                  «       «      st        ||«      sJ ‚|S |
r<|�|€J ‚tR        jT                  jV                  ja                  ||«      }t%        ||«      S |S # tB        $ r Y �Œzw xY wc c}w )zUEnsure x has the requested stride order or exact strides, inserting a copy if needed.N)r   rI   TF)rô  r  r  r%  r  zHthe MutationLayoutSHOULDREMOVE's real layout shouldn't be FlexibleLayoutrM  r  r   râ   rI   )1rð  r  r�   r  r  r  r"  rO  r©   rç  rø  r
  r  rP  r«  r  rE  r  rZ  rÌ  rÑ  rl  rŠ  rˆ   rM  ro  rS  rp  r¶  r§  r8	  Úrequire_stride_orderr€  rÙ  rw   r  r  rÎ   rÍ   rI  rä  r  r¸  ÚloweringÚslice_r	  r6   r4  rÕ  )rÔ  r�   r×   r0  r%  Úuse_current_stride_orderÚpadded_exact_stridesÚmutation_layoutrÑ  rp  Úexpanded_dimsÚ	orig_sizer  rÐ   rB  s                  r‘   Úrequire_strideszExternKernel.require_stridesë  s²  € ð Ð  MÐ$=Ð=Ð=à�;‰;‹=˜FÑ"©=ØˆHô ! Õ#Ü˜!Ÿ,™,›.¬.Ô9Ùô 0RØ˜5ó0Ð,ñ 0ØŸ™Ô)ð �Hô .ØØ#'Ø,1Ø).Ø*7õð �Hô *ØØ#Ø(-Ø%)Ø&3Ø&3õð �Hð
 $(Ð Ù¡Ü'+Ü×'Ñ'¨°q·z±z³|ÀQÇ[Á[Ã]ÓSó(Ð$ô ˜!Ÿ,™,›.¬;¼Ð*HÔIÙ˜1Ÿ<™<›>×;Ñ;¸EÔBá!Ü1Ø% q§|¡|£~×'<Ñ'<¸a¿j¹j»lôð %Ð0ô 4°A°}ÓEðð ðð %Ð0Ü˜qŸ|™|›~´¼_Ð/MÔNÜ-Ø(¨!¯,©,«.×*?Ñ*?ÀÇÁÃôô 7°qÐ:NÓOÐOÜØ$%§L¡L£NÐ2�Ô5Oôô Ø$3×$?Ñ$?Ó$AÐA�[ÄNôô )Øbóð ô   ¬[Ô9Ù˜{×<Ñ<¸UÔCá%Ü5Ø)¨;×+=Ñ+=¸q¿z¹z»|ôð
 �Hô �aœÔ%Ù�q—|‘|“~×7Ñ7¸Ô>áÜ-Ø! 1§<¡<£>×#8Ñ#8¸!¿*¹*»,ôð
 ˆHä�qœ)Ô$Ü˜1Ÿ6™6¤8Ô,Ü˜qŸv™v¤Ô7Ü%°Q·]±]³_Ð&D kÔEÜ˜ VÔ,Ü˜{×/Ñ/Ô1BÔCðØ×8Ñ8¸¿¹Ó@�”ÙØ×3Ñ3Ø˜5°ð 4ó ð ñ #Ø×4Ñ4Ø˜=¸ð 5ó ð ð #ð +/ˆØ—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ÓˆäØØØ!ØØ'Ø'õ	
ñ Ü)¨!¯*©*«,Ô7Ü)¨!¯,©,«.Ô9ä5°a¸Ô?Ð?Ð?ð ˆñ ØÐ(¨]Ð-FÐFÐFÜ—‘×(Ñ(×/Ñ/°°9Ó=ˆAä2°1°mÓDÐDàˆøô_ 'ò Úðüòs   Í5S? Í:S? Ï#ATÓ?	TÔTc           
     ó°   — | j                  ||D �cg c]4  }t        |t        j                  «      r|j                  j
                  n|‘Œ6 c}|¬«      S c c}w )N)r0  r%  )rG	  r�   r  ÚSymIntr¹   rŽ  )rÔ  r�   r0  r%  ré   s        r‘   r€  z"ExternKernel.require_exact_strides¢  sV   € ð ×"Ñ"ØàKXöØFGœz¨!¬U¯\©\Ô:�—‘—’ÀÑAòð (ð #ó 
ð 	
ùòs   ‘9A
c                ó*   — | j                  |||¬«      S )N)r×   r%  )rG	  )rÔ  r�   r×   r%  s       r‘   r?	  z!ExternKernel.require_stride_order®  s   € ð ×"Ñ" 1¨EÀÐ"ÓOÐOr“   c                ó.   — | j                  |t        «      S rŒ   )r?	  r†  r�  s     r‘   Úrequire_channels_lastz"ExternKernel.require_channels_last´  s   € à×'Ñ'¨Ô+<Ó=Ð=r“   c                ó.   — | j                  |t        «      S rŒ   )r?	  rˆ  r�  s     r‘   Úrequire_channels_last_3dz%ExternKernel.require_channels_last_3d¸  s   € à×'Ñ'¨Ô+=Ó>Ð>r“   c                ó„   — dd„} ||«      r|S | j                  |t        j                  |j                  «       «      «      S )Nc                óØ   — 	 | j                  «       }|t        j                  j
                  v xr' t        j                  j
                  |   j                  S # t        t        f$ r Y yw xY wr  )rs  ÚAttributeErrorrÙ  rw   r  r	  Ú	is_mkldnn)r�   rÅ   s     r‘   Úis_mkldnn_tensorz9ExternKernel.require_contiguous.<locals>.is_mkldnn_tensor¾  s]   € ðØ—z‘z“|�ð œ1Ÿ7™7×,Ñ,Ð,ÒR´·±×1BÑ1BÀ4Ñ1H×1RÑ1RÐRøô #Ô$7Ð8ò Ùðús   ‚A ÁA)Á(A)©r�   r‰   r¼   r�   ©r€  r  r  r
  )rÔ  r�   rS	  s      r‘   rƒ  zExternKernel.require_contiguous¼  s@   € ó	Sñ ˜AÔØˆHà×,Ñ,Ø”>×4Ñ4°Q·Z±Z³\ÓBóð r“   c                óh   — | j                  |t        j                  |j                  «       «      «      S rŒ   rU	  r�  s     r‘   Úrequire_contiguous_stridesz'ExternKernel.require_contiguous_stridesÎ  s-   € ð ×(Ñ(ØŒ~×0Ñ0°·±³Ó>ó
ð 	
r“   c                 ó   — y rŒ   r¦   r�  s    r‘   rÙ  zExternKernel.apply_constraintÖ  r  r“   c                óÎ  — t        |t        «      sJ t        |«      «       ‚t        |t        «      s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Å   r  )r�   r   r·   r©   r½  rÍ   r±  r¹  r¼  rÎ   rÇ  )r‘  rÃ   rÄ   Ún_argsÚ
n_pos_argsrÐ   Úarg_names          r‘   Úfill_non_provided_argsz#ExternKernel.fill_non_provided_argsÙ  sð   € ô ˜$¤Ô)Ð5¬4°«:Ó5Ð)Ü˜$¤Ô%Ü˜“:ˆDØ×"Ò"ÐUÐ$UÓUÐ"ä�T“ˆÜ˜×,Ñ,Ó-ˆ
ð �JÒÜ�I‰Ið^à× Ñ Ø˜VÑ#ô	ô ˜6 :Ó.ò �Ø×.Ñ.¨qÑ1°&Ñ9�Ø—‘à 6Ñ)ð ˜8Ò$à×,Ñ,¨QÑ/°Ñ@õðð ˆr“   c                ó\  — t         j                  j                  �rGg }d }|r]| j                  rQt	        | j
                  «      t	        |«      k(  sJ d«       ‚| j                  D �ci c]  }|j                  d«      |“Œ }}t        | j
                  «      D ]Ê  \  }}|�.|€J ‚|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 | j
                  D �
cg c]+  }
t         j                  j                  j                  |
«      ‘Œ- c}
S c c}w c c}
w )NzDnames passed to codegen_const_args does not match self.constant_argsrÅ   r·   )rw   r  rï  r½  rÍ   r´  r»  rò   rj  rÇ  rÊ  Úval_to_arg_str)r‘  rÃ  rN  Úname_to_arg_propertiesr“  rÐ   r�   ÚpropÚtype_ró   rF  s              r‘   Úcodegen_const_argszExternKernel.codegen_const_argsý  sŽ  € Ü�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àDH×DVÑDVÖW¸q”A—G‘G×(Ñ(×7Ñ7¸Õ:ÒWÐWùò'*ùò& Xs   Á$F$Å10F)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·   )rw   r  rï  r¼  r]	  rj  r´  rÄ   rò   r½  rÍ   r»  rÇ  rÊ  r_	  rn  rc	  )r‘  rj  Úneed_codegen_constant_argsrÃ   rÐ   r�   rb	  s          r‘   Ú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Øˆr“   c                óö   — ||v r|j                  |«      S || j                  v r| j                  j                  |«      S | j                  j                  |«      x}�|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.r  z not in self.allarg_properties)r»  rÄ   r¾  rl  )r‘  r\	  rÄ   r“  s       r‘   Úget_kwargs_valuezExternKernel.get_kwargs_value8  sx   € ð
 �vÑØ—:‘:˜hÓ'Ð'Ø�t—{‘{Ñ"Ø—;‘;—?‘? 8Ó,Ð,Ø×)Ñ)×-Ñ-¨hÓ7Ð7ˆCÐDØ—7‘7˜?Ó+Ð+Ü ˜zÐ)GÐHÓIÐIr“   c           	     óÆ  — t         j                  j                  rè| j                  �t	        | j
                  «      dk(  rg S g }| j                  D ]¯  }|r|dk(  rŒ| j                  |«      }t        |t        «      r|j                  |«       Œ>| j                  €J ‚| j                  j                  |i «      j                  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À  )rw   r  rï  r¼  rÍ   r×  rº  rh	  r�   r    rÇ  r¾  r»  rÊ  r_	  rÄ   rT  )r‘  Úskip_outrÄ   r\	  rO  rb	  Úks          r‘   Úcodegen_kwargszExternKernel.codegen_kwargsE  s=  € Ü�7‰7×ÒØ×ÑÐ+´°D×4FÑ4FÓ0GÈ1Ò0Là�	àˆFØ ×>Ñ>ò Q�Ù ¨EÒ 1àà×)Ñ)¨(Ó3�Ü˜a¤Ô&Ø—M‘M !Õ$à×1Ñ1Ð=Ð=Ð=Ø ×2Ñ2×6Ñ6°xÀÓD×HÑHÈÓP�EØ—M‘M¤!§'¡'×"6Ñ"6×"EÑ"EÀaÈÓ"OÕPðQð" ˆð !ŸK™K×-Ñ-Ó/÷á�A�qð �#�Q”q—w‘w×+Ñ+×:Ñ:¸1Ó=Ð>Ò?ðˆFñ ð ˆùó	s   Ä 8Ec                óÈ   — | j                   �S| j                   j                  }t        |dd«      }|j                  dd«      }|j	                  dd«      d   }|› d|› �}|S d}|S )	Nr£   Úunknown_namespacerø  rù  ré  rI   r   Ú
unknown_op)rÆ  rT  rÂ   rò  Úrsplit)r‘  rT  Úop_namespaceÚop_names       r‘   Úget_op_namezExternKernel.get_op_name_  sv   € Ø�<‰<Ð#Ø—\‘\×(Ñ(ˆFÜ" 6¨<Ð9LÓMˆLØ'×/Ñ/°¸'ÓBˆLØ'×.Ñ.¨s°AÓ6°qÑ9ˆLØ%˜ a¨ xÐ0ˆGð ˆð #ˆGØˆr“   c                ó  — t         j                  sy t        | j                  «       «      dk(  ry t        j
                  j                  j                  | j                  «       «      }t        j
                  j                  j                  | j                  «       «      }| j                  «       }| j                  «       }t        j
                  j                  ršt        | j                  t        j                  j                   «      rlt        j"                  j$                  | j                  j&                  v r<t        | j(                  d   t*        «      sJ ‚| j(                  d   j                  «       }|j-                  ||||«       y rò  )rJ   Úsize_assertsrr   r
  rw   r  rÊ  Úcodegen_shape_tupler4  rs	  rs  rï  r�   r¼  r  rÑ  rÒ  ÚTagÚinplace_viewÚtagsrj  r‰   Úwrite_assert_size_stride)r‘  rß  r  r  rr	  rÅ   s         r‘   Úcodegen_size_assertsz!ExternKernel.codegen_size_assertsj  s  € Ü×"Ò"Øä˜Ÿ™›Ó)¨QÒ.ØÜ�w‰w×#Ñ#×7Ñ7¸¿¹»ÓHˆÜ—‘×%Ñ%×9Ñ9¸$¿/¹/Ó:KÓLˆØ×"Ñ"Ó$ˆØ�}‰}‹ˆÜ�7‰7×Òô ˜$×*Ñ*¬E¯J©J×,AÑ,AÔBÜ—9‘9×)Ñ)¨T×-=Ñ-=×-BÑ-BÑBÜ% d§k¡k°!¡n´fÔ=Ð=Ð=ØŸ;™; q™>×2Ñ2Ó4�DØ×(Ñ(¨¨t°V¸WÕEr“   c           	     óH  — t         j                  r’t        j                  j                  sw| j                  «       }|t        j                  j                  v}| j                  «       }|r |j                  d|› dt        › d|›d�«       y |j                  d|› d|› d�«       y y y )Nzassert_alignment(rE  r  z	# buffer z (op: z) is assumed to be not aligned)
rJ   Úalignment_assertsrw   r  rï  rs  r  rs	  rÌ  rk   )r‘  rß  rÅ   Úalignedrr	  s        r‘   Úcodegen_alignment_assertsz&ExternKernel.codegen_alignment_asserts}  sš   € Ü×#Ò#¬A¯G©G×,?Ò,?Ø—=‘=“?ˆDØ¤!§'¡'×";Ñ";Ð;ˆGØ×&Ñ&Ó(ˆGÙØ×!Ñ!Ø'¨ v¨R´Ð/@ÀÀ7À+ÈQÐOõð ×!Ñ!Ø ˜v V¨G¨9Ð4RÐSõð -@Ð#r“   c                óÞ   — t         j                  j                  rt        j                  j
                  ry|j                  «        | j                  «       }|j                  d|› d|› d�«       y)zc
        Track outputs of fallback operators if config.test_configs.track_memory_lifecycle
        Nztrack_tensor(z, 'z'))	rJ   Útest_configsÚtrack_memory_lifecyclerw   r  rï  Ú"write_memory_track_allocation_oncers  rÌ  )r‘  rß  rÅ   s      r‘   Úcodegen_memory_trackingz$ExternKernel.codegen_memory_tracking‹  sV   € ô ×"Ñ"×9Ò9¼Q¿W¹W×=PÒ=PØà×2Ñ2Ô4Ø�}‰}‹ˆØ×Ñ˜M¨$¨¨s°4°&¸Ð;Õ<r“   c                óN   — | j                  «       }| j                  «       }|g g|fS )zD
        get output sizes and strides, for template_codegen
        )r
  r4  )r‘  r  r   s      r‘   Úget_group_stridezExternKernel.get_group_stride–  s*   € ð —‘“ˆØ—/‘/Ó#ˆà�rˆ{˜GÐ#Ð#r“   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)rw   r  r  r
  r4  r	  rÎ   rÍ   rp   r—  rŽ  rò   r
  r^  rV   r«   rÖ   rs   r°   rÕ  rª   )r‘  r  r~  rU  r�   rÐ   rN  Úindex_orderró   rô   rõ   r×   r  rÏ   Ú	new_sizesrÒ   rd  rù   Úadd_varÚreplacements                       r‘   ÚcanonicalizezExternKernel.canonicalizeŸ  sŸ  € ô
 —7‘7×#Ñ#ˆØ—‘“ˆØ—/‘/Ó#ˆð ;BÖB°Q�8×-Ñ-¨aÕ0ÐBˆÐBä;@ÄÀ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Ó&Ð&Ð&ùò+ CùâMùó CùÚ7ùÚ3ùò 4Ss#   ¿F5Á/F:Â>F?Ã$GÃ6G
Å+Gc                óÚ   — |rt         nt        }t        j                  | |«      }| j                  D ]  }| ||«      z  }Œ | j
                  j                  «       D ]  }| ||«      z  }Œ |S rŒ   )Úmaybe_free_unbacked_symbolsÚmaybe_free_symbolsr‰  r>  r´  rÄ   r¬   )r‘  ri  Úmaybe_get_symbolsrÖ  r“  s        r‘   r>  z!ExternKernel.get_free_symbol_usesÀ  s|   € ñ ,9Õ'Ô>Pð 	ô ×-Ñ-¨d°MÓBˆØ×%Ñ%ò 	(ˆCØÑ" 3Ó'Ñ'‰Að	(à—;‘;×%Ñ%Ó'ò 	(ˆCØÑ" 3Ó'Ñ'‰Að	(àˆr“   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~  rÔ  )r‘  rW  rÑ  r„  s       r‘   rÉ  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©r¦   NNNNr¦   N)rÅ   re  rN  r  rj  rt  r´  r°  rÄ   údict[str, Any] | Noner¶  rµ  r·  re  r¸  re  rº  r¹  r¼  r»  r¼   r½   r¯  r±  rx  rS  rŒ   )rß  r|   rW  re  r¼   r½   ©rß  r|   r¼   r½   ©r¸  re  r¼   r½   )r·  re  r¼   r½   rd  ro  )r�   r‰   r¼   rˆ   )rY  r…   rÃ   r   rÄ   r   r¼   zftuple[Any, list[Any], list[Any], Callable[[Any, Any], Any], dict[sympy.Symbol, pytree.KeyPath] | None])r�   r‰   r¼   rS  r‰  )NNF)
r�   r‰   r×   zSequence[int] | Noner0  rb  r%  r�   r¼   r‰   rr  )r�   r‰   r0  ra  r%  r�   r¼   r‰   )r�   r‰   r×   rt  r%  r�   r¼   r‰   )rÃ   r°  rÄ   r  r¼   r°  )rÃ  r{  r¼   rŸ   ©r¼   rŸ   )r\	  rÈ   rÄ   r   r¼   r   )rj	  r�   r¼   rŸ   )r¼   z'tuple[list[Sequence[Expr]], list[Expr]])r¼   ztuple[Expr, Sequence[Expr]]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ª  r3  rÅ  r™  rã  ræ  rÃ  rÄ  rÝ  r	  r…  r	  r  r0	  r8	  rÍ  r=	  rG	  r€  r?	  rL	  rN	  rƒ  rW	  rÙ  r]	  rc	  rf	  rh	  rl	  rs	  r{	  r	  r„	  r†	  r�	  rb   r>  rÉ  r  rI  rJ  s   @r‘   rµ  rµ  ç  s  ø… ñð
 $&€M�=Ó%Ø.˜[×.Ñ.¸tÔD€FˆNÓDØ*.€KÐ'Ó.Ø%)Ð˜
Ó)Ø"&€O�ZÓ&ð 4E°;×3DÑ3DØô4Ð! =ó ð (,€KÐ$Ó+Ø26€NÐ/Ó6Ø3D°;×3DÑ3DØô4ÐÐ0ó ð :>ÐÐ6Ó=Ø<M¸K×<MÑ<MØô=ÐÐ9ó ð .?¨[×->Ñ->ÈtÔ-TÐÐ*ÓTð (*Ø(,Ø.2Ø)-Ø&*Ø79Ø+/ð.àð.ð ð.ð 4ð	.ð
 %ð.ð &ð.ð ,ð.ð 'ð.ð $ð.ð (5ð.ð )ð.ð 
õ.ó@.óõó #$óJ!ð HLðMØ+ðMØ:DðMà	óMó""ô#;óJó+ó$ð
 ò
ó ð
ð ðc
Ø!ðc
Ø*-ðc
Ø9<ðc
ð
òc
ó ðc
ðJ òE
ó ðE
ðN ò!!ó ð!!ðF ò!ó ð!ð ð '+Ø37Ø#ðtàðtð $ðtð 1ð	tð
 ðtð 
òtó ðtðl àQVð	
Øð	
Ø'9ð	
ØJNð	
à	ò	
ó ð	
ð àDIðPØðPØ,ðPØ=AðPà	òPó ðPð
 ò>ó ð>ð ò?ó ð?ð òó ðð" ò
ó ð
óð"Ø!ð"Ø+9ð"à	ó"ôHXóBó4Jôó4	óFó&ó	=ó$ó'ñB ˜NÓ+à$)ðØ!ðà	!òó ,ðó
&ð „Hr“   rµ  c                  óf   ‡ — e Zd Zdd„Z	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )ÚExternKernelOutc                ó&   — |j                  | «       y rŒ   )Úgenerate_extern_kernel_outrå  s     r‘   ræ  zExternKernelOut.codegená  ó   € Ø×*Ñ*¨4Õ0r“   c
                ó&  •— | j                  |«      }
t        |
t        «      sJ t        |
«      «       ‚t        ‰| �  d ||
||xs i d ||||	«
       t        j                  j                  | «      | _	        t        j                  j                  | «       y rŒ   )r—  r�   r   r·   rn  r]  rw   r  r™  rÅ   rš  )r‘  rN  rj  r´  rÄ   r¶  r·  r¸  rº  r¼  Úunwrapped_inputsrp  s              €r‘   r]  zExternKernelOut.__init__ä  s‹   ø€ ð  ×.Ñ.¨vÓ6ÐÜÐ*¬HÔ5ÐM´tÐ<LÓ7MÓMÐ5Ü‰ÑØØØØØŠL�bØØØØ)Øô	
ô —G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   c                 ó   — yr1  r¦   r�  s    r‘   r  zExternKernelOut.should_allocate  r®  r“   r–	  r”	  )rN  rç  rj  rä  r´  r°  rÄ   r•	  r¶  rµ  r·  re  r¸  re  rº  r°  r¼  r»  r¼   r½   r_  )r¢   r£   r¤   ræ  r]  r  rI  rJ  s   @r‘   rš	  rš	  ß  s‹   ø„ ó1ð (*Ø(,Ø.2Ø)-Ø&*Ø79Ø+/ð)àð)ð !ð)ð %ð	)ð
 &ð)ð ,ð)ð 'ð)ð $ð)ð (5ð)ð )ð)ð 
õ)÷:r“   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)rN  rj  r´  r·  r¸  r¼  )r  r  r×  rn  r]  rP  r1  rî  rè  ÚrandintÚlow_out)r‘  rá  r  Úlimitsrp  s       €r‘   r]  zRandomSeeds.__init__  sl   ø€ Ü—‘œUŸ[™[Ó)ˆÜ‰ÑÜØÜ—k‘kØ�Wôð
 Ø!Ÿ:™: v§z¡z°E°7Ð;Ø5ð >ÜŸ™×,Ñ,ð 	õ 	
r“   )rá  rŽ   r  rj  r¼   r½   ©r¢   r£   r¤   r]  rI  rJ  s   @r‘   r¢	  r¢	    s   ø„ ÷
ñ 
r“   r¢	  c                  óh   ‡ — e Zd Zdd„Z	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zd	d„Zˆ xZS )
r§  c                ó&   — |j                  | «       y rŒ   )Úgenerate_extern_kernel_allocrå  s     r‘   ræ  zExternKernelAlloc.codegen  s   € Ø×,Ñ,¨TÕ2r“   c	                óF  •— | j                  |«      }	t        d„ |	D «       «      sJ ‚t        ‰
| �  d |t	        t
        t           |	«      ||xs i d ||||«
       g | _        t        j                  j                  | «      | _        t        j                  j                  | «       y )Nc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wrŒ   rq  r{  s     r‘   rê   z-ExternKernelAlloc.__init__.<locals>.<genexpr>)  s   è ø€ ÒC¨Q”:˜a¤×(ÑCùr|  )r—  rì   rn  r]  r   r   r‰   rK  rw   r  r™  rÅ   rš  )r‘  rN  rj  r´  rÄ   r·  r¸  rº  r¼  rŸ	  rp  s             €r‘   r]  zExternKernelAlloc.__init__  s˜   ø€ ð  ×.Ñ.¨vÓ6ÐÜÑCÐ2BÔCÔCÐCÐCÜ‰ÑØØÜ”œ&Ñ!Ð#3Ó4ØØŠL�bØØØØ)Øô	
ð ')ˆŒÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   c                 ó   — yr  r¦   r�  s    r‘   r  z!ExternKernelAlloc.should_allocate=  r  r“   c                ó   — t         ‚rŒ   r�  r�  s    r‘   rÙ  z"ExternKernelAlloc.apply_constraint@  r�  r“   r–	  )r¦   NNNr¦   N)rN  r  rj  rä  r´  r°  rÄ   r•	  r·  re  r¸  re  rº  r°  r¼  r»  r¼   r½   r_  rS  )r¢   r£   r¤   ræ  r]  r  rÙ  rI  rJ  s   @r‘   r§  r§    s„   ø„ ó3ð (*Ø(,Ø)-Ø&*Ø79Ø+/ð)àð)ð !ð)ð %ð	)ð
 &ð)ð 'ð)ð $ð)ð (5ð)ð )ð)ð 
õ)ó@÷"r“   r§  c                  óT   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zd	d„Zd
d„Zdd„Zˆ xZ	S )r   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  )
rn  r]  rs  rw   r  rÏ  Úmutation_namesÚmutating_noder™  rÅ   )r‘  rN  Úmutated_noder²	  Úmutated_node_namerp  s        €r‘   r]  zMutationOutput.__init__I  sb   ø€ ô 	‰Ñ˜d¨6ÐÔ2Ø(×1Ñ1Ó3ÐÜ	�‰×#Ñ#Ð$5Ô6Ø0Ð1ˆÔØ(5ˆÔÜ—G‘G×+Ñ+¨DÓ1ˆ�	r“   c                ó   — | j                   S rŒ   )r²	  r�  s    r‘   r­  zMutationOutput.get_defining_opS  s   € Ø×!Ñ!Ð!r“   c                ó   — | j                   S rŒ   )r±	  r�  s    r‘   rJ  z!MutationOutput.get_mutation_namesV  rs  r“   c                 ó   — yr  r¦   r�  s    r‘   r  zMutationOutput.should_allocateY  r  r“   c                ó^   — | j                  «       }d„ |D «       D �cg c]  }|�|‘Œ c}S c c}w )Nc              3  óZ   K  — | ]#  }t         j                  j                  |«      –— Œ% y ­wrŒ   )rw   r  Útry_get_buffer)rè   rÅ   s     r‘   rê   z6MutationOutput.get_mutation_buffers.<locals>.<genexpr>`  s   è ø€ ÒP¸œŸ™×.Ñ.¨t×4ÑPùs   ‚)+)rJ  )r‘  r±	  r¢  s      r‘   Úget_mutation_buffersz#MutationOutput.get_mutation_buffers\  s=   € Ø×0Ñ0Ó2ˆñ QÀÔPö
àØˆò ò
ð 	
ùò 
s   œ*)rN  r  r³	  r‰   r²	  rŠ  r¼   r½   r  r�  r_  ©r¼   rä  )
r¢   r£   r¤   r‚  r]  r­  rJ  r  r»	  rI  rJ  s   @r‘   r   r   D  sA   ø„ ñð2Ø ð2Ø06ð2ØGPð2à	õ2ó"ó#ó÷
r“   r   c                  ó�   ‡ — e Zd ZU dZi Zded<   e	 	 	 	 	 	 d	d„«       Ze	 	 	 	 	 	 d	d„«       Z	 	 	 	 	 	 	 	 d
ˆ fd„Z	dd„Z
dd„Zˆ xZS )ÚTMADescriptorad  
    An IR node representing a generic host-side TMA descriptor in the Triton API
    Mostly useful for user-defined Triton kernels relying on host-side TMA;
    but can, in principle, be used for Inductor's Triton templates, too.

    See TMADescriptorExperimental and TMADescriptorStable for the two implementations
    (the old API and the new API)
    zdict[Any, TMADescriptor]Ú_CACHEc                ó‚   — t        |«      dk(  sJ ‚|d   dk(  rt        |g|d   ¢­Ž S |d   dk(  sJ ‚t        |g|d   ¢­Ž S )Nrâ   r   ÚexperimentalrI   rÙ  )rÍ   ÚTMADescriptorExperimentalÚTMADescriptorStable)rÔ  rT  Útma_metas      r‘   Ú_create_implzTMADescriptor._create_impls  s\   € ô �8‹} Ò!Ð!Ð!Ø�A‰;˜.Ò(Ü,¨VÐB°h¸q±kÒBÐBà˜A‘; (Ò*Ð*Ð*Ü& vÐ<°¸±Ò<Ð<r“   c                ó”   — t        |«      |f}|| j                  vr| j                  ||«      | j                  |<   | j                  |   S rŒ   )rÕ  r¿	  rÅ	  )rÔ  rT  rÄ	  r�  s       r‘   r�  zTMADescriptor.create~  sF   € ô �&‹z˜8Ð$ˆØ�c—j‘jÑ Ø!×.Ñ.¨v°xÓ@ˆC�J‰J�s‰OØ�z‰z˜#‰Ðr“   c           
     ó@  •— t         ‰| �  d t        t        ||j	                  «       ¬«      «      t        t        t           |«      t        |«      d «       || _	        t        j                  j                  | «      | _        t        j                  j                  | «       y r  )rn  r]  r«  rS  r  r   r   rr  rª   rT  rw   r  r™  rÅ   rš  )r‘  rT  rj  r´  rp  s       €r‘   r]  zTMADescriptor.__init__‡  sƒ   ø€ ô 	‰ÑØô ÜØØ!×,Ñ,Ó.ôóô ”œ&Ñ! 6Ó*Ü�-Ó Øô	
ð  ˆŒÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   c                ó&   — |j                  | «       y rŒ   )Úgenerate_tma_descriptorrå  s     r‘   ræ  zTMADescriptor.codegenž  ó   € Ø×'Ñ'¨Õ-r“   c                ó   — | j                   S rŒ   )rT  r�  s    r‘   Ú
get_tensorzTMADescriptor.get_tensor¡  rÍ  r“   )rT  r‰   rÄ	  ztuple[str, tuple[Any, ...]]r¼   r¾	  )rT  r‰   rj  r°  r´  r°  r¼   r½   r–	  rR  )r¢   r£   r¤   r‚  r¿	  r¥   r  rÅ	  r�  r]  ræ  rÌ	  rI  rJ  s   @r‘   r¾	  r¾	  e  sš   ø… ñð (*€FÐ$Ó)àð=Øð=Ø'Bð=à	ò=ó ð=ð ðØðØ'Bðà	òó ðð)Øð)Ø&3ð)ØDQð)à	õ)ó..÷r“   r¾	  c                  ó:   ‡ — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )rÂ	  z£
    the new host-side TMA Descriptor API:
    (the ones obtained via create_{1d,2d}_tma_descriptor calls).

    See also TMADescriptorStable for the new API.
    c                ób  •— t        |«      dv sJ ‚t        |«      t        |«      k(  sJ ‚|€|j                  «       j                  }|| _        || _        || _        t        | j                  «      | _        |g}g | j                  ¢| j                  ¢| j
                  ‘}t        ‰| �!  |||¬«       y )N)rI   râ   ©rT  rj  r´  )	rÍ   r  r  rW  Ú
block_dimsÚelement_sizerc  rn  r]  )r‘  rT  rW  rÐ	  rÑ	  rj  r´  rp  s          €r‘   r]  z"TMADescriptorExperimental.__init__­  s¿   ø€ ô �4‹y˜FÑ"Ð"Ð"Ü�4‹yœC 
›OÒ+Ð+Ð+àÐØ!×+Ñ+Ó-×6Ñ6ˆLàˆŒ	Ø$ˆŒØ(ˆÔÜ˜Ÿ	™	“NˆŒ	à�ˆð
Ø�Y‰Yð
à�_‰_ð
ð ×Ñð
ˆô 	‰ÑØØØ'ð 	õ 	
r“   rŒ   )
rT  r‰   rW  úlist[int | torch.SymInt]rÐ	  rÒ	  rÑ	  r€  r¼   r½   ©r¢   r£   r¤   r‚  r]  rI  rJ  s   @r‘   rÂ	  rÂ	  ¥  sG   ø„ ñð $(ð
àð
ð 'ð
ð -ð	
ð
 !ð
ð 
÷
ñ 
r“   rÂ	  c                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )rÃ	  z¡
    the new host-side TMA descriptor API
    (the ones obtained via TensorDescriptor.from_tensor).

    See also TMADescriptorExperimental for the old API.
    c                ó:   •— || _         t        ‰| �	  ||g|¬«       y )NrÏ	  )Úblock_shapern  r]  )r‘  rT  rÖ	  rp  s      €r‘   r]  zTMADescriptorStable.__init__Õ  s(   ø€ Ø&ˆÔä‰ÑØØ�8Ø%ð 	õ 	
r“   )rT  r‰   rÖ	  rÒ	  rÓ	  rJ  s   @r‘   rÃ	  rÃ	  Í  s   ø„ ñ÷
ñ 
r“   rÃ	  c                  óB   ‡ — e Zd Z	 d	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )ÚSubgraphBufferc                ó   •— t         ‰| �  d ||«       || _        || _        t        j
                  j                  | «      | _        t        j
                  j                  | «       t        j
                  j                  | j                  ||«      | _
        t        | j                  «      sJ ‚t        | j                  «      }|D ]T  }|| j                  j                  |j                  <   | j                  j                  j!                  |j                  «       ŒV |D �	cg c]  }	|	j                  ‘Œ c}	| _        dd lmc m}
 t	        j*                  | j                  «      5  ddddœ}i |¥|xs i ¥}|
j-                  |«      5   | j                  j.                  | j                  Ž  d d d «       |r:| j                  j0                  D ]!  }|j3                  |j5                  «       «       Œ# d d d «       y c c}	w # 1 sw Y   ŒSxY w# 1 sw Y   y xY w)Nr   FÚATEN)Úmax_autotuneÚmax_autotune_gemmÚmax_autotune_gemm_backends)rn  r]  rd  Úexample_inputsrw   r  r™  rÅ   rš  Úmake_subgraphÚsubgraphrr  rj  rm  r  Úgraph_input_namesrÇ  Ú
sym_inputsÚtorch._inductor.configr¸  rJ   Úset_graph_handlerr   ÚrunÚ
operationsr�  r‹  )r‘  rN  r™   rd  rÞ	  Úsubgraph_namerû  râ	  Úsym_inpÚsym_varÚinductor_configÚbase_patchesÚmerged_patchesr^  rp  s                 €r‘   r]  zSubgraphBuffer.__init__à  sÄ  ø€ ô 	‰Ñ˜˜v {Ô3ØˆŒØ,ˆÔÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Ô(äŸ™×-Ñ-¨d¯g©g°~À}ÓUˆŒä §¡Ô,Ð,Ð,Ü(¨¯©Ó5ˆ
à!ò 	AˆGØ7>ˆD�M‰M×&Ñ& w§|¡|Ñ4Ø�M‰M×+Ñ+×2Ñ2°7·<±<Õ@ð	Að 8BÖB¨G˜7Ÿ<›<ÒBˆŒç8Ð8ä× Ñ  §¡Ó/ñ 	Að !&Ø%*Ø.4ñˆLð .X°Ð-WÀÒAUÐSUÐ-WˆNØ ×&Ñ& ~Ó6ñ 8Ø!�—‘×!Ñ! 4×#6Ñ#6Ñ7÷8ñ
 ØŸ-™-×2Ñ2ò A�BØ×)Ñ)¨.×*=Ñ*=Ó*?Õ@ðA÷	Að 	Aùò	 C÷8ð 8ú÷	Að 	Aús+   ÄG3Å "HÆ$G8Æ&AHÇ8H	Ç=HÈHc                ó  —  G d„ d«      }t        | j                  «      sJ ‚| j                  D �cg c]  }|j                  «       ‘Œ }}|j                   || j                  «      g | j
                  ¢|¢| j                  g«       y c c}w )Nc                  ó   — e Zd Zdd„Zy)ú,SubgraphBuffer.codegen.<locals>.CodegenGraphc                ó4   — || _         |j                  | _        y rŒ   )r  rÅ   )r‘  r  s     r‘   r]  z5SubgraphBuffer.codegen.<locals>.CodegenGraph.__init__  s   € Ø"�”
Ø!ŸJ™J�•	r“   N)r  r}   )r¢   r£   r¤   r]  r¦   r“   r‘   ÚCodegenGraphrï	    s   „ ô'r“   rñ	  )rr  rj  rü  Ú'codegen_subgraph_with_flattened_outputsrà	  râ	  rÅ   )r‘  rß  rñ	  r  Úouter_inputss        r‘   ræ  zSubgraphBuffer.codegen  sz   € ÷	'ñ 	'ô
   §¡Ô,Ð,Ð,Ø7;·{±{ÖC°!˜×+Ñ+Õ-ÐCˆÐCà×7Ñ7Ù˜Ÿ™Ó'Ø-ˆd�o‰oÐ- Ð-Ø�Y‰YˆKõ	
ùò Ds   °BrŒ   )rN  rç  r™   r°  rd  útorch.fx.GraphModulerÞ	  ú	list[Any]rç	  rÈ   rû  r•	  r–	  ©r¢   r£   r¤   r]  ræ  rI  rJ  s   @r‘   rØ	  rØ	  ß  sT   ø„ ð 15ð,Aàð,Að "ð,Að !ð	,Að
 "ð,Að ð,Að .õ,A÷\
r“   rØ	  c                  óÆ   ‡ — e Zd ZdZdd„Zdd„Zedd„«       Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	 e
d «      	 d	 	 	 dˆ fd„«       Zdd„Z	 	 	 	 	 	 	 	 	 	 dˆ fd	„Zdd
„Zdd„Zˆ xZS )ÚUserDefinedTritonKernelz>
    A user-defined triton kernel (e.g. via @triton.jit).
    c                ó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Ð   rY  s     €r‘   rê   zBUserDefinedTritonKernel.get_kernel_and_metadata.<locals>.<genexpr>0  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_idxr�   r¶  rn  rü	  rÿ	  r 
  rÇ  rÆ   rþ	  r
  Úconfigs)r‘  rú	  rû	  r
  Úrestore_value_argsÚreset_to_zero_argsrÐ   rY  s          @r‘   Ú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ÐFr“   c                óÆ  — t         j                  sy| j                  j                  syt	        | j
                  j                  «      dk7  ryt	        | j                  «      dk(  sJ ‚t        | j                  d   t        «      syt        | j                  d   j                  t        «      syt        | j                  d   j                  j                  t        «      syt        | j                  d   j                  j                  j                  t        «      syt        d„ | j                  d   j                  j                  j                  j                  D «       «      syy)aE  
        For kernels like

        @triton.jit
        def add_kernel(in_ptr0, in_ptr1, out_ptr, n_elements, BLOCK_SIZE: tl.constexpr):
            pid = tl.program_id(0)
            offs = pid * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE)
            mask = offs < n_elements
            x = tl.load(in_ptr0 + offs, mask=mask)
            y = tl.load(in_ptr1 + offs, mask=mask)
            tl.store(out_ptr + offs, x + y, mask=mask)

        @torch.compile
        def fn(a, b):
            out = torch.empty_like(a)
            grid = (triton.cdiv(a.numel(), 1024),)
            add_kernel[grid](a, b, out, a.numel(), BLOCK_SIZE=1024)
            return out.relu()

        We can potentially fuse the relu epilogue into the add_kernel.
        We do this by pruning the `out` tensor allocation and directly writing the relu-output.
        FrI   r   c              3  ó&   K  — | ]	  }|d k(  –— Œ y­wr/  r¦   r)  s     r‘   rê   z<UserDefinedTritonKernel.can_fuse_epilogue.<locals>.<genexpr>v  s   è ø€ ÒN˜a�1˜•6ÑNùr*  T)rJ   Ú*epilogue_fusion_user_defined_triton_kernelÚarg_accessesÚcan_fuse_epiloguerÍ   Úkernel_storesÚstoresÚmutable_argsr�   rˆ   rM  rq  rˆ  r  rì   r¶  r�  s    r‘   r
  z)UserDefinedTritonKernel.can_fuse_epilogueC  s  € ô0 ×@Ò@Øà× Ñ ×2Ò2Øô ˆt×!Ñ!×(Ñ(Ó)¨QÒ.Øô �4×$Ñ$Ó%¨Ò*Ð*Ð*Ü˜$×+Ñ+¨AÑ.´	Ô:ØÜ˜$×+Ñ+¨AÑ.×3Ñ3´ZÔ@ØÜ˜$×+Ñ+¨AÑ.×3Ñ3×8Ñ8¼.ÔIØÜ˜$×+Ñ+¨AÑ.×3Ñ3×8Ñ8×=Ñ=¼yÔIØÜÑN 4×#4Ñ#4°QÑ#7×#<Ñ#<×#AÑ#A×#FÑ#F×#MÑ#MÔNÔNØàr“   c                ó(   — | j                  |d ¬«      S )N)Úepilogue_fusion©Ú_codegenrå  s     r‘   ræ  zUserDefinedTritonKernel.codegen{  s   € à�}‰}˜W°dˆ}Ó;Ð;r“   c                ó&   — | j                  ||«      S )zQ
        epilogue_fusion: (fused epilogue node, modified kerel src code)
        r
  )r‘  rß  r
  s      r‘   Úcodegen_with_epilogue_fusionz4UserDefinedTritonKernel.codegen_with_epilogue_fusion  s   € ð �}‰}˜W oÓ6Ð6r“   c                ó  ‡— ddl m} | j                  «       \  }}}}| j                  }i }	|r…t	        | j
                  j                  j                  «      dk(  sJ ‚t        t        | j
                  j                  j                  «      «      j                  }
|\  }}i | j                  ¥|
|i¥}|
|i}	|j                  |||||| j                  |«      \  }}}}| j                  D �ci c]  }|| j                  |«      “Œ }}|j                  |	«       |j                   D �cg c]  }|j                  ‘Œ c}Š|j                   D �cg c]  }|j"                  sŒ|j$                  ‘Œ }}t'        ˆfd„|D «       «      }g }g }g }g }t)        j*                  |j-                  «       t/        t)        j0                  d«      |«      «      D �]f  \  }}||v r |«       rŒ|j3                  |«       |j3                  |«       t5        |t6        «      r?|j3                  |j9                  «       «       |j3                  |j;                  «       «       Œ„t5        |t<        t>        t@        tB        f«      r,|j3                  |«       |j3                  tE        |«      «       ŒÐ||v r'|j3                  d«       |j3                  t<        «       Œû|€R	  |«       r(|j3                  d«       |j3                  t<        «       �Œ-|jG                  «        |jG                  «        �ŒOtI        dtE        |«      › d	|› �«      ‚ | jK                  ||«       |jM                  |||||||d
| jO                  «       | jP                  j                  ¬«
       yc c}w c c}w c c}w )úYOverrides the parent member.
        See https://github.com/pytorch/pytorch/issues/151692r   )Útriton_version_uses_attrs_dictrI   c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wrŒ   r¦   )rè   rÐ   rþ	  s     €r‘   rê   z3UserDefinedTritonKernel._codegen.<locals>.<genexpr>¸  s   øè ø€ Ò$F°a Y¨q¥\Ñ$Fùs   ƒrÂ  r2  NzUnsupported arg type: r  T)Ú	arg_typesÚraw_argsÚraw_keysÚtriton_metaÚinductor_metar%  r  Úoriginal_fxnode_name))rk  r
  r	
  rÄ   rÍ   r
  r›  r=  rñ  rò  rÅ   Ú!define_user_defined_triton_kernelÚgridrº  rh	  rí  ÚparamsÚis_constexprÚnumr@   rÑ  rZ  rT  rÖ   ÚrepeatrÇ  r�   r‰   rü  r  rŽ   r	  r�   r    r·   rÓ  rÙ  rã  Úgenerate_kernel_callr  rÆ  )r‘  rß  r
  r
  rY  r
  r
  r
  Úkernel_kwargsÚepilogue_out_overrideÚmutable_arg_nameÚepilogue_computed_bufferrù   Únew_namer
  r 
  Úextra_launch_argsrk	  Ú
named_argsrh  Ú
constexprsÚconstexpr_namesrÃ   r
  Úraw_keys_filteredÚraw_args_filteredrÅ   r“  rþ	  s                               @r‘   r
  z UserDefinedTritonKernel._codegen‡  sM  ø€ õ 	Ið ×(Ñ(Ó*ñ	
ØØØØð
 Ÿ™ˆØ02ÐÙÜ�t×(Ñ(×4Ñ4×;Ñ;Ó<ÀÒAÐAÐAÜ#¤D¨×):Ñ):×)FÑ)F×)MÑ)MÓ$NÓO×TÑTÐØ*9Ñ'Ð$ aØW˜tŸ{™{ÐWÐ,<Ð>VÑWˆMØ%5Ð7OÐ$PÐ!ð ×5Ñ5ØØØØØØ�I‰IØó
ñ	
ØØØØð 26×1SÑ1Sö
Ø,-ˆAˆt×$Ñ$ QÓ'Ñ'ð
ˆ
ð 
ð 	×ÑÐ/Ô0à%+§]¡]Ö3 �Q—V“VÒ3ˆ	Ø%+§]¡]ÖE °a·n³n�a—e“eÐEˆ
ÐEÜ$Ó$F¸:Ô$FÓFˆàˆØ!ˆ	Ø')ÐØ')ÐÜ"Ÿ™Ø×ÑÓ¤¤I×$4Ñ$4°RÓ$8Ð:KÓ Ló
ó $	W‰IˆD�#ð �Ñ&Ñ+IÔ+KàØ×$Ñ$ TÔ*Ø×$Ñ$ SÔ)Ü˜#œvÔ&Ø—‘˜C×1Ñ1Ó3Ô4Ø× Ñ  §¡£Õ1Ü˜C¤#¤u¬d´DÐ!9Ô:Ø—‘˜CÔ Ø× Ñ ¤ c£Õ+Ø˜Ñ(ð —‘˜B”Ø× Ñ ¤Õ%Ø�ðñ 2Ô3Ø—K‘K ”OØ×$Ñ$¤SÖ)à%×)Ñ)Ô+Ø%×)Ñ)Ö+ä)Ð,BÄ4ÈÃ9À+ÈRÐPSÈuÐ*UÓVÐVðI$	WðL 	×Ñ˜W hÔ/Ø×$Ñ$ØØØØ&Ø&Ø#Ø'ØØ—?‘?Ó$Ø!%§¡×!2Ñ!2ð 	%õ 	
ùòi
ùò
 4ùÚEs   Ã&M=Ä NÅNÅNc                óP   •— t         ‰| �  |«      t        | j                  |«      z  S rŒ   )rn  r>  r)   r#
  ro  s     €r‘   r>  z,UserDefinedTritonKernel.get_free_symbol_usesò  s-   ø€ ô ‰wÑ+¨MÓ:Ô=MØ�I‰I�}ó>
ñ 
ð 	
r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  z0UserDefinedTritonKernel.get_unbacked_symbol_defsü  r«  r“   c               óœ  •— g }i }g }|j                  «       D ]ƒ  \  }}	t        |	t        «      rXt        j	                  | j                  |	«      «      }
||v rt        j                  |
||   «      }
|j                  |
«       |
||<   Œn|j                  |	«       |	||<   Œ… t        |«      dk7  sJ ‚|d   j                  «       | _        t        |t        «      sJ t        |«      «       ‚t        ‰| �=  d t!        | j                  ¬«      |t#        |«      |«       || _        || _        | j)                  «       \  }}}}t+        |d«      sJ ‚|j,                  D �cg c]	  }||v sŒ|‘Œ c}| _        ddlm}m} t        |«      dkD  r|d   j6                  ni }dd l}|j:                  | _        |j?                  | j<                  «      | _          || j<                  «      | _!        || _"         ||i |¥|¥|«      | _#        | jF                  jH                  jJ                  D �cg c]:  }t        |jM                  |jN                  «      t        «      r||jN                     ‘Œ< c}| _(        | jP                  D �cg c]#  }tS        t!        | j                  ¬«      || «      ‘Œ% c}| _*        tV        jX                  j[                  | «       y c c}w c c}w c c}w )Nr   rÌ  rþ	  )Úidentify_accessed_tensorsÚidentify_triton_stores).rT  r�   rˆ   r‰  r  rÍ  r¾	  r�  rÇ  rÍ   r  r  r   r·   rn  r]  rÂ  rª   r
  r#
  r	
  r¶  rþ	  rº  r
  r7
  r8
  rÄ   ÚastrÛ  Ú
kernel_srcÚparseÚ
kernel_astr
  Úkernel_argsr
  r›  r=  r»  rÅ   r
  r   rŸ  rw   r  rš  )r‘  r
  r#
  Útma_descriptor_metadatar=
  rj  rÄ   r´  rk	  rO  r  rY  r
  rù   r“  r7
  r8
  Úautotuned_kwargsr9
  r�  r¢  rp  s                        €r‘   r]  z UserDefinedTritonKernel.__init__ÿ  s•  ø€ ð  "ˆØ$&ˆØ&(ˆà×%Ñ%Ó'ò 		‰DˆAˆqÜ˜!œYÔ'Ü ×9Ñ9¸$×:LÑ:LÈQÓ:OÓP�ØÐ/Ñ/Ü%×,Ñ,¨QÐ0GÈÑ0JÓK�AØ—‘˜aÔ Ø��q’	à×$Ñ$ QÔ'Ø��q’	ð		ô �6‹{˜aÒÐÐØ˜Q‘i×*Ñ*Ó,ˆŒä˜&¤(Ô+Ð9¬T°&«\Ó9Ð+Ü‰ÑØÜ˜dŸk™kÔ*ØÜ�-Ó Øô	
ð %ˆŒØˆŒ	à $× <Ñ <Ó >Ñˆ�˜˜Aô �v˜{Ô+Ð+Ð+à!×+Ñ+ö.
Ø¨s°kÒ/AŠCò.
ˆÔ*÷	
ô
 14°G³¸qÒ0@˜7 1™:×,Ò,ÀbÐãð !Ÿ*™*ˆŒØŸ)™) D§O¡OÓ4ˆŒÙ3°D·O±OÓDˆÔØ&ˆÔá5ØØ/ˆ{Ð/Ð.Ð/Ø#ó
ˆÔð ×(Ñ(×4Ñ4×;Ñ;ö
àÜ˜+Ÿ/™/¨#¯(©(Ó3´YÔ?ð ˜Ÿ™Ó!ò
ˆÔð ×(Ñ(ö!
àô œ:¨T¯[©[Ô9¸3ÀÕEò!
ˆÔô 	
�‰×"Ñ" 4Õ(ùòK.
ùò6
ùò!
s   Å	J?ÅJ?È?KÉ/(K	c                ó,   — t        | j                  «      S rŒ   )r©   rŸ  r�  s    r‘   r¨  z#UserDefinedTritonKernel.get_outputsO   s   € Ü�D×)Ñ)Ó*Ð*r“   c                ó   — | j                   S rŒ   rÌ  r�  s    r‘   r  z"UserDefinedTritonKernel.get_deviceR   rÍ  r“   )r¼   z(tuple[Kernel, Any, list[str], list[str]]r_  r–	  )rß  r|   r
  ztuple[ComputedBuffer, str]r¼   r½   )rß  r|   r
  z!tuple[ComputedBuffer, str] | Noner¼   r½   rr  r}  r±  )
r
  rŽ   r#
  r   r>
  r  r=
  r  r¼   r½   r¯  rg  )r¢   r£   r¤   r‚  r	
  r
  r   ræ  r
  r
  rb   r>  rª  r]  r¨  r  rI  rJ  s   @r‘   rø	  rø	    sæ   ø„ ñóGó@6ðp ò<ó ð<ð7Ø+ð7Ø>Xð7à	ó7ði
à%ði
ð ;ði
ð 
ó	i
ñV Ð5Ó6à$)ð
Ø!ð
à	!ô
ó 7ð
óðN)ð ðN)ð ð	N)ð
 "0ðN)ð $ðN)ð 
õN)ó`+÷r“   rø	  c                  óT   ‡ — e Zd ZdZdd„Zdd„Zd	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                ó  — t        d„ | j                  D «       «      sJ ‚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  — | ]  }t        |t        «      –— Œ y ­wrŒ   rq  ©rè   r  s     r‘   rê   z3InplaceBernoulliFallback.codegen.<locals>.<genexpr>\   s   è ø€ Ò>¨Q”:˜a¤×(Ñ>ùr|  c              3  óX   K  — | ]"  }t        t        |«      j                  «       –— Œ$ y ­wrŒ   )r   r‰   rü  rG
  s     r‘   rê   z3InplaceBernoulliFallback.codegen.<locals>.<genexpr>]   s   è ø€ ÒI¸””V˜Q“×1Ñ1×3ÑIùs   ‚(*rÍ  rE  z, NULL)r  )rì   rj  rw   r  rï  rÌ  r	  rÐ  rÎ  Úreprr´  Úending)r‘  rß  r�   s      r‘   ræ  z InplaceBernoulliFallback.codegen[   sß   € ÜÑ>°$·+±+Ô>Ô>Ð>Ð>ÙI¸T¿[¹[ÔI‰ˆä�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õr“   c                 ó   — yr  r¦   r�  s    r‘   r  z(InplaceBernoulliFallback.should_allocatej   r  r“   c                ó&   — | j                  d«      gS rò  ©rx  r�  s    r‘   rJ  z+InplaceBernoulliFallback.get_mutation_namesm   ó   € Ø—‘ Ó"Ð#Ð#r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  z1InplaceBernoulliFallback.get_unbacked_symbol_defsp   r«  r“   c                ó^  •— t         ‰| �  d t        |j                  «       ¬«      | j	                  |g«      ||¬«       t
        j                  j                  |j                  «       «       t
        j                  j                  | «      | _
        t
        j                  j                  | «       y )NrÌ  ©r¼  )rn  r]  rÂ  r  r—  rw   r  rÏ  rs  r™  rÅ   rš  )r‘  r¼  r�   r´  rp  s       €r‘   r]  z!InplaceBernoulliFallback.__init__s   s€   ø€ ô 	‰ÑØÜ˜aŸl™l›nÔ-Ø×Ñ  Ó$ØØ#ð 	ô 	
ô 	
�‰×#Ñ# A§J¡J£LÔ1Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   r–	  r_  r�  r±  )r¼  r…   r�   r‰   r´  r   r¼   r½   ©
r¢   r£   r¤   r‚  ræ  r  rJ  rª  r]  rI  rJ  s   @r‘   rC
  rC
  V   sF   ø„ ñóóó$óð)Ø'ð)Ø,2ð)ØDGð)à	÷)ñ )r“   rC
  c                  óx   ‡ — e Zd ZdZdd„Zd	d„Zd
d„Zdd„Z	 	 	 	 	 	 	 	 dˆ fd„Ze		 d	 	 	 	 	 	 	 dd„«       Z
ˆ xZS )ÚInplaceCopyFallbackrD
  c                óR   — | j                  «       \  }}}|j                  |||«       y rŒ   )rf	  Úcodegen_device_copy)r‘  rß  rÜ  rÛ  Únon_blockings        r‘   ræ  zInplaceCopyFallback.codegenˆ   s)   € Ø#'×#4Ñ#4Ó#6Ñ ˆˆc�<Ø×#Ñ# C¨¨lÕ;r“   c                 ó   — yr  r¦   r�  s    r‘   r  z#InplaceCopyFallback.should_allocateŒ   r  r“   c                ó&   — | j                  d«      gS rò  rM
  r�  s    r‘   rJ  z&InplaceCopyFallback.get_mutation_names�   rN
  r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  z,InplaceCopyFallback.get_unbacked_symbol_defs’   r«  r“   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   )	rn  r]  rw   r  rÏ  rs  r™  rÅ   rš  )r‘  rN  rj  r´  rp  s       €r‘   r]  zInplaceCopyFallback.__init__•   sr   ø€ ô 	‰ÑØØØØØ+Ø.ð 	ô 	
ô 	
�‰×#Ñ# F¨1¡I×$6Ñ$6Ó$8Ô9Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   c                ó    — ||fD �cg c]  }| j                  |«      ‘Œ }}|f}t        t        |j                  «       ¬«      ||«      }|S c c}w r   )rÍ  rT
  rÂ  r  )rÔ  rÜ  rÛ  rW
  r  rj  r´  rN  s           r‘   r�  zInplaceCopyFallback.create§   sX   € ð 25°c°
Ö;¨1�#×#Ñ# AÕ&Ð;ˆÐ;Ø%˜ˆÜ$Ü˜cŸn™nÓ.Ô/ØØó
ˆð
 ˆùò <s   ‡Ar–	  r_  r�  r±  )rN  r  rj  rä  r´  r°  r¼   r½   rr  )rÜ  r‰   rÛ  r‰   rW
  r�   r¼   rT
  )r¢   r£   r¤   r‚  ræ  r  rJ  rª  r]  r  r�  rI  rJ  s   @r‘   rT
  rT
  ƒ   s~   ø„ ñó<óó$óð)àð)ð !ð)ð %ð	)ð
 
õ)ð$ à<Að
Øð
Ø%ð
Ø59ð
à	ò
ó ô
r“   rT
  c                  ó8   — e Zd ZdZdd„Zd	d„Zd
d„Zdd„Zd	d„Zy)ÚMutatingFirstArgExternKernelrD
  c                ó  — t        | j                  «      sJ ‚g d„ | j                  D «       ¢t        t        | j                  «      ¢}|j                  | j                  «       › ddj                  |«      › d|j                  › �«       y )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wrŒ   )rü  rG
  s     r‘   rê   z7MutatingFirstArgExternKernel.codegen.<locals>.<genexpr>½   s   è ø€ Ò9¨ˆa×!Ñ!×#Ñ9ùr|  rÍ  rE  r  )	rr  rj  rÎ  rI
  r´  rÌ  r	  rÐ  rJ
  )r‘  rß  Úargrefss      r‘   ræ  z$MutatingFirstArgExternKernel.codegenº   s~   € Ü §¡Ô,Ð,Ð,ð
Ù9¨T¯[©[Ô9ð
ä”�t×)Ñ)Ó*ð
ˆð 	×ÑØ×#Ñ#Ó%Ð& a¨¯	©	°'Ó(:Ð';¸1¸W¿^¹^Ð<LÐMõ	
r“   c                 ó   — yr  r¦   r�  s    r‘   r  z,MutatingFirstArgExternKernel.should_allocateÄ   r  r“   c                ó&   — | j                  d«      gS rò  rM
  r�  s    r‘   rJ  z/MutatingFirstArgExternKernel.get_mutation_namesÇ   rN
  r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  z5MutatingFirstArgExternKernel.get_unbacked_symbol_defsÊ   r«  r“   c                 ó   — yr1  r¦   r�  s    r‘   Úhas_side_effectsz-MutatingFirstArgExternKernel.has_side_effectsÍ   r®  r“   Nr–	  r_  r�  r±  )	r¢   r£   r¤   r‚  ræ  r  rJ  rª  rg
  r¦   r“   r‘   r_
  r_
  µ   s    „ ñó
óó$óôr“   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        |t         t"        t$        f«      sJ t'        |«      «       ‚t        j                  j(                  j+                  |j,                  j                  «       «       y )NzTODO: dynamic shapesrÌ  )r´  z"inductor_ops.resize_storage_bytes_z&torch::inductor::resize_storage_bytes_)r�   rŽ   rn  r]  rÂ  r  r—  rw   r  rÏ  rs  r™  rÅ   rš  r·  r¸  ro  rq  rˆ   r·   Únever_reuse_buffersr·  rM  )r‘  ÚvariablerG  rp  s      €r‘   r]  zResizeStorageBytes.__init__Ò   sî   ø€ Ü˜(¤CÔ(Ð@Ð*@Ó@Ð(Ü‰ÑØÜ˜h×1Ñ1Ó3Ô4Ø×Ñ  
Ó+Ø#˜+ð	 	ô 	
ô 	
�‰×#Ñ# H×$5Ñ$5Ó$7Ô8Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Ô(Ø"FˆÔØGˆÔÜ˜(¤X¬z¼9Ð$EÔFÐVÌÈXËÓVÐFÜ	�‰×#Ñ#×'Ñ'¨¯©×(>Ñ(>Ó(@ÕAr“   )rl
  r‰   rG  rŽ   r¼   r½   r§	  rJ  s   @r‘   ri
  ri
  Ñ   s   ø„ ÷Bñ Br“   ri
  c                  ó(   ‡ — e Zd Zdˆ fd„Zdd„Zˆ xZS )ÚSetSourceTensorKernelc                ó   •— | j                  |«      }|j                  «        t        ‰| �  |j	                  «       ||gdt
        j                  j                  j                  j                  ¬«       t        |t        t        t        f«      sJ t        |«      «       ‚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¼  rÌ  )rÍ  r"  rn  r]  r  r  ru   rè  Úset_Úsource_Tensorr�   ro  rq  rˆ   r·   rw   r  rk
  r·  rM  rs  r  r   rÂ  rŸ  )r‘  Úself_tensorÚstorage_tensorr  rp  s       €r‘   r]  zSetSourceTensorKernel.__init__ä   s,  ø€ Ø×+Ñ+¨NÓ;ˆØ×$Ñ$Ô&Ü‰ÑØ×%Ñ%Ó'Ø˜.Ð)ØBÜŸ	™	Ÿ™×+Ñ+×9Ñ9ð	 	ô 	
ô ˜+¬´*¼iÐ'HÔIð 	
Ì4ØóL
ó 	
ÐIô 	
�‰×#Ñ#×'Ñ'¨×(8Ñ(8×(AÑ(AÓ(CÔDÜ	�‰×#Ñ#×'Ñ'¨×(?Ñ(?Ó(AÔBÜ	�‰×#Ñ#×'Ñ'¨¯©«Ô8Ø×*Ñ*Ó,ˆäœ:¨VÔ4°kÀ4ÓHÜœ:¨VÔ4°nÀdÓKð!
ˆÕr“   c                óF   — | j                  d«      | j                  d«      gS rM  rM
  r�  s    r‘   rN  z2SetSourceTensorKernel.get_inputs_that_alias_outputù   s   € Ø—‘ Ó" D§O¡O°AÓ$6Ð7Ð7r“   )rr
  r‰   rs
  r‰   r¼   r½   r�  )r¢   r£   r¤   r]  rN  rI  rJ  s   @r‘   rn
  rn
  ã   s   ø„ õ
÷*8r“   rn
  c                  ój   ‡ — e Zd ZdZd
d„Zdd„Zd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                  | «       y rŒ   )Úgenerate_scatter_fallbackrå  s     r‘   ræ  zScatterFallback.codegen!  s   € Ø×)Ñ)¨$Õ/r“   c                 ó   — yr  r¦   r�  s    r‘   r  zScatterFallback.should_allocate!  r  r“   c                óf   — | j                   d   }t        |t        «      sJ ‚|j                  «       gS rò  rv  ©r‘  rl  s     r‘   rJ  z"ScatterFallback.get_mutation_names
!  s.   € Ø�k‰k˜!‰nˆÜ˜#œvÔ&Ð&Ð&Ø—‘“ÐÐr“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  z(ScatterFallback.get_unbacked_symbol_defs!  r«  r“   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 )NrÌ  r}
  rÐ  r~
  )r·  rº  r¼  )r�   rˆ   Úsrc_is_tensorrÍ  rn  r]  rÂ  r  r—  rÈ   rw   r  rÏ  rs  r™  rÅ   rš  )r‘  r¼  r�   rB  rÏ   rÛ  rÐ  r~
  r  Útensorsr´  rp  s              €r‘   r]  zScatterFallback.__init__!  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‰   rB  rŽ   rÏ   r‰   rÛ  r‰   rÐ  re  r~
  r�   r¼   r½   rR
  rJ  s   @r‘   rv
  rv
  ý   s|   ø„ ñó0óó ó
ð "Ø!ñ!)à!ð!)ð ð!)ð ð	!)ð
 ð!)ð ð!)ð ð!)ð ð!)ð 
÷!)ñ !)r“   rv
  c                  ó\   ‡ — e Zd ZdZdd„Zdd„Zd	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                ó&   — |j                  | «       y rŒ   )Úgenerate_index_put_fallbackrå  s     r‘   ræ  zIndexPutFallback.codegen;!  s   € Ø×+Ñ+¨DÕ1r“   c                 ó   — yr  r¦   r�  s    r‘   r  z IndexPutFallback.should_allocate>!  r  r“   c                ó&   — | j                  d«      gS rò  rM
  r�  s    r‘   rJ  z#IndexPutFallback.get_mutation_namesA!  rN
  r“   c                ó   — t        «       S rŒ   r?   r�  s    r‘   rª  z)IndexPutFallback.get_unbacked_symbol_defsD!  r«  r“   c           	     óò  •— || _         |D �cg c]  }|€Œ|‘Œ	 }}||g|¢D �cg c]  }| j                  |«      ‘Œ }}d}	t        ‰
| �  d t	        j                  «       ¬«      | j                  |«      |fd|	|¬«       t        j                  j                  | j                  d«      «       t        j                  j                  | «      | _        t        j                  j                  | «       y c c}w c c}w )NÚaoti_torch_index_put_outrÌ  zaten.index_put_)r·  r¸  r¼  r   )rœ  rÍ  rn  r]  rÂ  r  r—  rw   r  rÏ  rx  r™  rÅ   rš  )r‘  r¼  r�   rœ  r¬   Ú
accumulaterÐ   Úvalid_indicesr�
  r¸  rp  s             €r‘   r]  zIndexPutFallback.__init__G!  sÜ   ø€ ð ˆŒØ$+Ö=˜q¨q©}šÐ=ˆÐ=à34°fÐ2M¸}Ð2MÖN¨Q�4×%Ñ% aÕ(ÐNˆÐNØ4ˆÜ‰ÑØÜ˜aŸl™l›nÔ-Ø×Ñ Ó(ØˆMØ0Ø+Ø#ð 	ô 	
ô 	
�‰×#Ñ# D§O¡O°AÓ$6Ô7Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(ùò >ùâNs   �C/•C/£C4r–	  r_  r�  r±  )r¼  útorch._ops.OpOverloadr�   r‰   rœ  rõ	  r¬   r°  r‹
  r   r¼   r½   rR
  rJ  s   @r‘   rƒ
  rƒ
  6!  s`   ø„ ñó2óó$óð)à*ð)ð ð)ð ð	)ð
 ð)ð ð)ð 
÷)ñ )r“   rƒ
  c                  ó&   — e Zd Zedd„«       Zdd„Zy)Ú
DeviceCopyc           	     óZ  — |j                  «       }|€J ‚|j                  «       sÈt        |«      t        j                  j
                  vr£t        d„ |j                  «       D «       «      rƒt        j                  j                  sit        j                  j                  r>t        j                  j                  |«       t        j                  j                  |«       |j                  |«      S t        j                  j                  |«       t        j                  j                  |«       t        d«       |f}t        j!                  |«      }d }|j#                  «       r|j%                  «       }t'        |j(                  «      xr |j(                  dk(  xr |}|j(                  dk(  xr t'        |j(                  «      xr |}|r t+        |«      rd|j-                  «       _        t1        t3        ||j5                  «       |j#                  «       ||¬«      | j7                  |«      g|«      S )Nc              3  óT   K  — | ]   }|t         j                  j                  v –— Œ" y ­wrŒ   )rw   r  r	  r)  s     r‘   rê   z$DeviceCopy.create.<locals>.<genexpr>k!  s   è ø€ ÒG¨q�AœŸ™×*Ñ*Ô*ÑGùs   ‚&(zDeviceCopy in input programr!  Tr¨  )r  rD  rt  rw   r  rD  rì   r¤  rJ   Úaot_inductorÚuse_runtime_constant_foldingrï  Úadd_device_inforH  rf   rµ  rƒ  r
  r4  rn   r·   r  r  rR  r�
  rP  r  rÍ  )	rÔ  r�   r  rW
  Úx_devicer´  r  Úis_destination_pinnedÚis_source_pinneds	            r‘   r�  zDeviceCopy.createc!  sª  € à—<‘<“>ˆØÐ#Ð#Ð#à—‘”ä˜Q“¤q§w¡w×'>Ñ'>Ñ>ÜÑG°A×4DÑ4DÓ4FÔGÔGÜ×'Ñ'×DÒDä�w‰w×"Ò"ô —‘×'Ñ'¨Ô/Ü—‘×'Ñ'¨Ô1Ø×'Ñ'¨Ó/Ð/ä	�‰×Ñ Ô'Ü	�‰×Ñ Ô)ÜÐ7Ô8Ø%˜ˆä×+Ñ+¨AÓ.ˆØˆØ�:‰:Œ<à—\‘\“^ˆFä�8—=‘=Ó!ÒK f§k¡k°UÑ&:ÒK¸|ð 	ð �M‰M˜UÑ"ÒK¤v¨f¯k©kÓ':ÒK¸|ð 	ñ Ô 5°aÔ 8Ø'+ˆA�L‰L‹NÔ$ÜÜØØ—‘“Ø—
‘
“ØØ/ôð ×Ñ˜qÓ!Ð"Øó

ð 
	
r“   c                ó°  — | j                  «       }t        |«      dk(  sJ ‚| j                  r2|j                  |d   | j                  j	                  «       |d   «       n'|j                  |d   | j	                  «       |d   «       t        | j                  t        «      r7| j                  j                  r |j                  | j                  «       «       y y y )Nrâ   r   rI   )rf	  rÍ   r¶  rV
  rü  r�   rN  rç  rR  Úsync_d2h_copyrs  )r‘  rß  rÃ   s      r‘   ræ  zDeviceCopy.codegen“!  s²   € Ø× Ñ Ó"ˆÜ�4‹y˜AŠ~Ðˆ~Ø×ÒØ×'Ñ'Ø�Q‘˜×)Ñ)×;Ñ;Ó=¸tÀA¹wõð ×'Ñ'¨¨Q©°×1GÑ1GÓ1IÈ4ÐPQÉ7ÔSÜ�d—k‘k¤6Ô*¨t¯{©{×/DÒ/DØ×!Ñ! $§-¡-£/Õ2ð 0EÐ*r“   N)r�   r‰   r  rj  rW
  r�   r¼   r‰   r–	  )r¢   r£   r¤   r  r�  ræ  r¦   r“   r‘   r�
  r�
  b!  s   „ Øò-
ó ð-
ô^
3r“   r�
  c                  óˆ   ‡ — e Zd ZdZdd„Zd	d„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
ˆ fd„Zdd„Z ed «      	 d	 	 	 dd„«       Z	dd„Z
ˆ xZS )ÚDynamicSelectStorageOffseta×  
    The result of computing a dynamic selection index is determined as follows: when the index in the
    select operation is unbacked, the actual index calculation is ambiguous for negative indices
    (index + size) versus non-negative indices (just index). To resolve this, we allocate an unbacked
    SymInt to represent the storage offset and decompose the select operation into a call to as_strided,
    computing the storage offset at runtime with this node.
    c                ó   — t        «       S rŒ   r?   r�  s    r‘   r£  z$DynamicSelectStorageOffset.get_reads©!  r«  r“   c                 ó   — yr  r¦   r�  s    r‘   r  z*DynamicSelectStorageOffset.should_allocate¬!  r  r“   c                ó¶   •— t         ‰| �  d t        t        j                  d«      ¬«      g «       || _        || _        || _        || _        || _	        || _
        y ©Nr!  rÌ  )rn  r]  rÂ  r  r  Úunbacked_offset_symbolrÏ   Úbase_offsetÚbase_dim_strider  rë  )r‘  r 
  rÏ   r¡
  r¢
  r  rë  rp  s          €r‘   r]  z#DynamicSelectStorageOffset.__init__¯!  sS   ø€ ô 	‰Ñ˜œz´·±¸eÓ1DÔEÀrÔJð '=ˆÔ#ØˆŒ
Ø&ˆÔØ.ˆÔØˆŒ	Øˆ�
r“   c                ó.   — t        | j                  g«      S rŒ   )r@   r 
  r�  s    r‘   rª  z3DynamicSelectStorageOffset.get_unbacked_symbol_defsÂ!  s   € Ü˜4×6Ñ6Ð7Ó8Ð8r“   c                ó   — t        | j                  |«      j                  t        | j                  |«      «      j                  t        | j                  |«      «      j                  t        | j
                  |«      «      S rŒ   )r)   rÏ   r¼  r  r¡
  r¢
  r=  s     r‘   r>  z/DynamicSelectStorageOffset.get_free_symbol_usesÅ!  s]   € ô
 ˜TŸZ™Z¨Ó7ß‰UÔ# D§I¡I¨}Ó=Ó>ß‰UÔ# D×$4Ñ$4°mÓDÓEß‰UÔ# D×$8Ñ$8¸-ÓHÓIð		
r“   c                ó>   — |j                  | | j                  ¬«       y )Nr–  )Úcodegen_dynamic_select_indexrë  rå  s     r‘   ræ  z"DynamicSelectStorageOffset.codegenÐ!  s   € Ø×,Ñ,¨T¸¿¹Ð,ÕDr“   rz  r_  )r 
  úsympy.SymbolrÏ   r§
  r¡
  úsympy.Symbol | intr¢
  r¨
  r  r¨
  rë  r�   r¼   r½   r±  rr  r}  r–	  ©r¢   r£   r¤   r‚  r£  r  r]  rª  rb   r>  ræ  rI  rJ  s   @r‘   r›
  r›
   !  s“   ø„ ñóóðà ,ðð ðð (ð	ð
 ,ðð !ðð ðð 
õó&9ñ Ð8Ó9à$)ð
Ø!ð
à	!ò
ó :ð
÷Er“   r›
  c                  ó€   ‡ — e Zd ZdZdd„Zd	d„Z	 	 	 	 	 	 	 	 	 	 d
ˆ fd„Zdd„Z ed «      	 d	 	 	 dd„«       Z	dd„Z
ˆ xZS )ÚDynamicSliceSizeac  
    Computes the output size of a slice call, handling the correct semantics in codegen.
    We do this for flexible handling for unbacked indices (to not data-dependent error).

    Slicing has 4 semantics for indices, i.e. x[start:] could be:
    1) start < -x.size(0)            -> x[0:]                    # negative out-of-bounds
    2) start in [-x.size(0), 0)      -> x[x.size(0) + start:]    # negative slicing
    3) start in [0, x.size(0))       -> x[start:]                # standard slicing
    4) start >= x.size(0)            -> empty slice              # positive out-of-bounds

    If the appropriate semantics are known beforehand, the output size is computed based on
    the start & end indices. If not (with unbacked indices), a new unbacked symbol is created
    to represent the output size, and codegen handles computing the correct case.
    c                ó   — t        «       S rŒ   r?   r�  s    r‘   r£  zDynamicSliceSize.get_readsä!  r«  r“   c                 ó   — yr  r¦   r�  s    r‘   r  z DynamicSliceSize.should_allocateç!  r  r“   c                ó¨   •— t         ‰| �  d t        t        j                  d«      ¬«      g «       || _        || _        || _        || _        || _	        y rŸ
  )
rn  r]  rÂ  r  r  Úunbacked_size_symbolrò  ró  r÷  r  )r‘  r¯
  rò  ró  r÷  r  rp  s         €r‘   r]  zDynamicSliceSize.__init__ê!  sH   ø€ ô 	‰Ñ˜œz´·±¸eÓ1DÔEÀrÔJà$8ˆÔ!ØˆŒ
ØˆŒØˆŒ	Øˆ�	r“   c                ó.   — t        | j                  g«      S rŒ   )r@   r¯
  r�  s    r‘   rª  z)DynamicSliceSize.get_unbacked_symbol_defsú!  s   € Ü˜4×4Ñ4Ð5Ó6Ð6r“   c                ó   — t        | j                  |«      j                  t        | j                  |«      «      j                  t        | j                  |«      «      j                  t        | j
                  |«      «      S rŒ   )r)   rò  r¼  ró  r  r÷  r=  s     r‘   r>  z%DynamicSliceSize.get_free_symbol_usesý!  sY   € ô
 ˜TŸZ™Z¨Ó7ß‰UÔ# D§H¡H¨mÓ<Ó=ß‰UÔ# D§I¡I¨}Ó=Ó>ß‰UÔ# D§I¡I¨}Ó=Ó>ð		
r“   c                ó&   — |j                  | «       y rŒ   )Úcodegen_dynamic_slice_sizerå  s     r‘   ræ  zDynamicSliceSize.codegen"  r�	  r“   rz  r_  )
r¯
  r§
  rò  r¨
  ró  r¨
  r÷  r¨
  r  r¨
  r±  rr  r}  r–	  r©
  rJ  s   @r‘   r«
  r«
  Ô!  s~   ø„ ñóóðà*ðð "ðð  ð	ð
 !ðð !õó 7ñ Ð.Ó/à$)ð
Ø!ð
à	!ò
ó 0ð
÷1r“   r«
  c                  óT   ‡ — 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?   r�  s    r‘   r£  zDynamicScalar.get_reads"  r«  r“   c                 ó   — yr  r¦   r�  s    r‘   r  zDynamicScalar.should_allocate"  r  r“   c                ó¾   •— |j                  «        t        ‰| �	  d t        t	        j
                  d«      ¬«      | j                  |g«      «       || _        || _        y rŸ
  )	rø  rn  r]  rÂ  r  r  r—  ÚsymÚkeypath)r‘  r¸
  r¹
  rM  rp  s       €r‘   r]  zDynamicScalar.__init__"  sM   ø€ ð 	�‰ŒÜ‰ÑØ”*¤E§L¡L°Ó$7Ô8¸$×:MÑ:MÈtÈfÓ:Uô	
ð ˆŒØˆ�r“   c                ó.   — t        | j                  g«      S rŒ   )r@   r¸
  r�  s    r‘   rª  z&DynamicScalar.get_unbacked_symbol_defs!"  s   € Ü˜4Ÿ8™8˜*Ó%Ð%r“   c                ó&   — |j                  | «       y rŒ   )Úcodegen_dynamic_scalarrå  s     r‘   ræ  zDynamicScalar.codegen$"  s   € Ø×&Ñ& tÕ,r“   rz  r_  )r¸
  r§
  r¹
  zpytree.KeyPathrM  r‰   r¼   r½   r±  r–	  )
r¢   r£   r¤   r‚  r£  r  r]  rª  ræ  rI  rJ  s   @r‘   r®   r®   "  sA   ø„ ñóóðØðØ*8ðØ@Fðà	õó&÷-r“   r®   c                  ól   ‡ — e Zd ZdZdd„Zd	d„Zd
ˆ fd„Zd	d„Z ed «      	 d	 	 	 dd„«       Z	dd„Z
ˆ xZS )r¯   z5
    The result of a call to aten._assert_scalar
    c                ó   — t        «       S rŒ   r?   r�  s    r‘   r£  zAssertScalar.get_reads-"  r«  r“   c                 ó   — yr  r¦   r�  s    r‘   r  zAssertScalar.should_allocate0"  r  r“   c                ó~   •— t         ‰| �  d t        t        j                  d«      ¬«      g «       || _        || _        y rŸ
  )rn  r]  rÂ  r  r  Úscalarr/	  )r‘  rÁ
  r/	  rp  s      €r‘   r]  zAssertScalar.__init__3"  s7   ø€ Ü‰ÑàÜœeŸl™l¨5Ó1Ô2àô	
ð ˆŒØˆ�r“   c                 ó   — yr1  r¦   r�  s    r‘   rg
  zAssertScalar.has_side_effects>"  r®  r“   c                ó.   — t        | j                  |«      S rŒ   )r)   rÁ
  r=  s     r‘   r>  z!AssertScalar.get_free_symbol_usesA"  s   € ô   §¡¨]Ó;Ð;r“   c           	     óÂ  — t         j                  sy t        t        | j	                  d¬«      «      «      }t
        j                  j                  ry 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 )NFrh  zstd::to_string(r  )r÷  zif (!(z()) { throw std::runtime_error("Expected z but received " + z); }zif not (z):z    raise RuntimeError(z = None)rJ   Úscalar_assertsrñ  rò  r>  rw   r  rÿ  rï  rÊ  Úcodegen_cpp_sizevarrÁ
  rÌ  r/	  Úcodegen_python_sizevarrI
  rs  )r‘  rß  rô  Ú
symbol_strÚsizevars        r‘   ræ  zAssertScalar.codegenG"  s4  € Ü×$Ò$Øô ”d˜4×4Ñ4À5Ð4ÓIÓJÓKˆÜ�7‰7×ÒàÜ�W‰W× Ò Ø*¨6¨(°!Ð4ˆJÜ—g‘g×*Ñ*×>Ñ>Ø—‘ eð ?ó ˆGð ×ÑØ˜˜	Ð!JÈ4Ï8É8È*ÐTfÐgqÐfrÐrwÐxõô —g‘g×*Ñ*×AÑAØ—‘ eð Bó ˆGð ×Ñ ¨¨	°Ð4Ô5Ø×ÑÐ 7¼¸T¿X¹X»Ð7GÀqÐIÔJð ×Ñ §¡£Ð 1°Ð9Õ:r“   rz  r_  )rÁ
  rx   r/	  rÈ   r¼   r½   rr  r}  r–	  )r¢   r£   r¤   r‚  r£  r  r]  rg
  rb   r>  ræ  rI  rJ  s   @r‘   r¯   r¯   ("  sM   ø„ ñóóõ	óñ ˜NÓ+à$)ð<Ø!ð<à	!ò<ó ,ð<÷
;r“   r¯   c                  ó"   — e Zd ZU ded<   ded<   y)ÚExternKernelNoderÈ   rÅ   zexport_schema.Noder¹   Nr¡   r¦   r“   r‘   rË
  rË
  g"  s   … à
ƒIØ
Ôr“   rË
  c                  ó  ‡ — e Zd ZdZ	 dddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdˆ f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„ Zedd„«       Ze	dd„«       Ze	 	 	 	 	 	 	 	 dd„«       Zedd„«       Zˆ xZS )rÖ  zð
    A class that represents a fallback kernel for handling operators that are not
    directly support by inductor. It currently supports functional ops, view ops,
    inplace aten ops, and mutating ops that are auto-functionalizable.
    N©rÀ  c               óÔ  •‡ — t         ‰‰ �  |t        |«      t        |«      |¬«       d‰ _        |xs i ‰ _        t        |t        j                  j                  t        j                  j                  f«      sJ d|› dt        |«      › d�«       ‚|‰ _        |‰ _        |€i n|‰ _        ‰ j                  €J ‚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 dd„}	|j6                  r?t9        ‰ j                  «      s* |	‰ j                  «      st;        d	‰ j                  › �«      ‚‰ j                  ‰ j<                  ‰ j>                  «      \  }
}dˆ fd
„}t        j,                  j.                  jA                  ||
|«      D ]  \  }} |||«       Œ y )NrQ
  Fú#Fails to create FallbackKernel for r  ú not supportedÚ_c10d_functionalr   c                ó"  — t         j                  j                  | j                  «       t         j                  j                  j
                  «      xs> t        | d«      xr0 t         j                  j                  j
                  | j                  v S )NÚ
py_kernels)r  Ú_CÚ%_dispatch_has_kernel_for_dispatch_keyrÅ   ÚDispatchKeyÚFunctionalizer¶  rÓ
  r]  s    r‘   Úhas_functionalize_implz7FallbackKernel.__init__.<locals>.has_functionalize_impl¶"  sg   € Ü—8‘8×AÑAØ—‘“	œ5Ÿ8™8×/Ñ/×=Ñ=óò ô ˜˜LÓ)ò HÜ—H‘H×(Ñ(×6Ñ6¸"¿-¹-ÐGð	r“   z'NYI: Can't generate FallbackKernel for c                óü  •‡ ‡— t        ‰ j                  t        j                  «      r&t        |t        t
        f«      sJ t        |«      «       ‚t        j                  ‰ j                  «      rt        |t
        t        f«      rJ ‚|€y ‰ j                  €y dˆ ˆfd„Šdˆfd„}t        j                  ‰ j                  «      r|�|D ]
  } ||«       Œ y y t        j                  ‰ j                  «      sJ ‚ ||«       y )Nc                ó  •— ‰j                   j                  | j                  «       «       ‰j                  €J ‚‰j                  j                  r?‰j
                  j                  t        t        | j                  «       ¬«      | ‰«      «       y y r   )	Úalias_namesrÇ  rs  Ú
alias_infoÚis_writerŸ  r   rÂ  r  )r  Úinfor‘  s    €€r‘   Ú	add_aliaszPFallbackKernel.__init__.<locals>.handle_aliasing_and_mutation.<locals>.add_alias×"  sj   ø€ Ø× Ñ ×'Ñ'¨¯
©
«Ô5Ø—‘Ð2Ð2Ð2Ø—?‘?×+Ò+Ø×)Ñ)×0Ñ0Ü&¤z¸¿¹»Ô'HÈ!ÈTÓRõð ,r“   c                ó˜   •— | €y t        | t        t        gt        ¢­«      ry t        | t        «      sJ t        | «      «       ‚ ‰| «       y rŒ   )r�   r   r    r=   r‰   r·   )r  rß
  s    €r‘   Úadd_alias_if_graph_bufferz`FallbackKernel.__init__.<locals>.handle_aliasing_and_mutation.<locals>.add_alias_if_graph_bufferß"  sD   ø€ Ø�9ØÜ˜a¤&¬$Ð!:´Ñ!:Ô;ð Ü! !¤VÔ,Ð5¬d°1«gÓ5Ð,Ù˜!•r“   )r  r‰   r¼   r½   )r  r   r¼   r½   )
r�   r·   r  ÚListTyper©   rª   Úlibrary_utilsÚis_tensor_like_typerÜ
  Úis_tensorlist_like_type)rÞ
  r“  rá
  Úoptional_tensor_argrß
  r‘  s   `   @€r‘   Úhandle_aliasing_and_mutationz=FallbackKernel.__init__.<locals>.handle_aliasing_and_mutationÉ"  sÔ   ú€ ä˜$Ÿ)™)¤U§^¡^Ô4Ü! #¬¬e }Ô5Ð@´t¸C³yÓ@Ð5Ü×0Ñ0°·±Ô;ô & c¬E´4¨=Ô9Ð9Ð9àˆ{ØØ�‰Ð&Øöõ	ô ×4Ñ4°T·Y±YÔ?Ø�?Ø/2ò GÐ+Ù1Ð2EÕFñGð #ô %×8Ñ8¸¿¹ÔCÐCÐCá)¨#Õ.r“   )r^  r�
  r¼   r�   )rÞ
  ztorch._C.Argumentr“  r   r¼   r½   )!rn  r]  rª   Úuse_runtime_dispatchrÀ  r�   r  rÑ  rÒ  rú  r·   r¼  r	  rÄ   r·  rw   r  Úwarn_fallbackrÛ
  r±	  rÅ   rÓ  Ú_libraryr±  Úmutates_and_returns_first_argrÇ  rs  Ú
is_mutabler&   rÙ  rj  r´  Ú
zip_schema)r‘  rN  rY  r$	  Únontensor_argsr	  rÄ   rÀ  ÚschemarØ
  rÃ   rç
  rÞ
  r“  rp  s   `             €r‘   r]  zFallbackKernel.__init__t"  s&  ù€ ô 	‰ÑØÜ�+ÓÜ�.Ó!Øð	 	ô 	
ð %*ˆÔ!Ø!2Ò!8°bˆÔäØ”U—Z‘Z×*Ñ*¬E¯J©J×,JÑ,JÐKô
ð 	Xà0°°¸¼4À»<¸.ÈÐWó	Xð 
ð "ˆÔØ,ˆÔØ"˜N‘b°ˆŒØ×&Ñ&Ð2Ð2Ð2Ü	�‰×Ñ˜d×5Ñ5Ô6ð ')ˆÔà)+ˆÔä�d×&Ñ&¬¯
©
×(FÑ(FÔGð à ×!1Ñ!1×!6Ñ!6Ó!8Ñ8ð
 à×!Ñ!×)Ñ)ˆô �>‰>×Ñ×=Ñ=¸d×>NÑ>NÔOØ×Ñ×&Ñ& {°1¡~×'>Ñ'>Ó'@ÔAØó	ð ×ÒÜ*¨4×+;Ñ+;Ô<Ù*¨4×+;Ñ+;Ô<ä%Ø9¸$×:JÑ:JÐ9KÐLóð ð ×*Ñ*¨4¯;©;¸×8JÑ8JÓK‰ˆˆfõ(	/ôT Ÿ™×-Ñ-×8Ñ8¸ÀÀvÓNò 	4‰IˆD�#Ù(¨¨sÕ3ñ	4r“   c                ó,  •— t         ‰| �  «       }| j                  t        j                  j
                  j                  u rT| j                  D ]E  }t        |t        «      sŒ|j                  t        j                  |j                  «       «      «      }ŒG |S rŒ   )rn  r3  r¼  r  Ú_primsÚ	rng_primsÚgraphsafe_run_with_rng_stater´  r�   r	  Ú	with_readrK   rI  rs  )r‘  r›  r“  rp  s      €r‘   r3  zFallbackKernel.get_read_writesö"  sy   ø€ Ü‘gÑ-Ó/ˆà×ÑœuŸ|™|×5Ñ5×RÑRÑRØ×)Ñ)ò �Ü˜c¤>Õ2Ø"-×"7Ñ"7Ü$×,Ñ,¨S¯\©\«^Ó<ó#‘Kðð Ðr“   c           	     ón   — |j                  | j                  «       | j                  t        | dd «      «      S ©NrÀ  )Ú(codegen_unbacked_symbol_defs_for_outputsrs  rK  rÂ   rå  s     r‘   Úcodegen_unbacked_symbol_defsz+FallbackKernel.codegen_unbacked_symbol_defs#  s0   € Ø×?Ñ?Ø�M‰M‹O˜TŸ\™\¬7°4Ð9LÈdÓ+Só
ð 	
r“   c                óÊ   — t        | dd «      x}rKt        t        j                  j                  j
                  |«      }|€J ‚t        |j                  «       «      S t        «       S rö
  ©rÂ   r;   rw   r  r  rî   r@   r´  ©r‘  rÀ  Úresolveds      r‘   rª  z'FallbackKernel.get_unbacked_symbol_defs#  ó_   € Ü '¨Ð.AÀ4Ó HÐHÐÐHÜ0Ü—‘× Ñ ×*Ñ*Ð,=óˆHð Ð'Ð'Ð'Ü˜hŸm™m›oÓ.Ð.ä“<Ðr“   c                óZ  — t         j                   G d„ d«      «       }t        | j                  «      sJ ‚| 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  r�  s    r‘   r  z2FallbackKernel.codegen_args.<locals>.Shim.__repr__#  s   € Ø—x‘x�r“   Nro  )r¢   r£   r¤   r¥   r  r¦   r“   r‘   ÚShimr   #  s   … à‹Hô r“   r  )rƒ  Ú	dataclassrr  rj  rü  r	  r´  rw   r  rï  r�   r¼  r  rÑ  rÒ  r]	  rÖ   rÓ  rÔ  rÊ  r_	  rÖ  rÄ   rí  )r‘  r  r�   r$	  rÃ   rÄ   Úparams          r‘   rf	  zFallbackKernel.codegen_args#  sY  € Ü	×	Ñ	÷	 ð 	 ó 
ð	 ô   §¡Ô,Ð,Ð,Ø<@¿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Ä>F"Å0F(c                óà  — | r!| D �cg c]  }t        |t        «      rŒ|‘Œ c}nd }|r7| sJ ‚| D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|d   S t        |t        j                  «      r|j
                  S t        |t        j                  j                  t        f«      st        |«      rt        j
                  d«      S t        |t        t        f«      r{t        d„ |D «       «      }|D �cg c]  }|sŒ|‘Œ	 }}t        |«      dk(  r|d   S |sy |D ]7  }t        |t        j
                  «      sJ ‚t        |j                  «      sŒ5|c S  |d   S y c c}w c c}w c c}w )Nr   r!  c              3  óH   K  — | ]  }t         j                  d |«      –— Œ y ­wrŒ   )rÖ  Úfind_devicerß  s     r‘   rê   z-FallbackKernel.find_device.<locals>.<genexpr>=#  s'   è ø€ ò $ð ô ×*Ñ*¨4°×3ñ$ùs   ‚ "rI   )r�   r€  r  r  rÔ  r  rÔ
  ÚScriptObjectr*   r,   r©   rª   r@   rÍ   rn   r·   )r$	  r+	  r  Únon_torch_bind_tensor_argsr“  ÚdevicesÚ
device_setr  s           r‘   r  zFallbackKernel.find_device)#  s_  € ñ ð $ÖJ�1¬:°a¼Õ+IŠQÓJàð 	#ñ
 &ÙÐ�;Ø3>ÖS¨CÀ#Ç.Á.ÕBR�s—~‘~Õ'ÐSˆGÐSØ˜1‘:ÐÜ�n¤e§l¡lÔ3Ø!×(Ñ(Ð(ÜØœUŸX™X×2Ñ2Ô4DÐEô
ä˜^Ô,Ü—<‘< Ó&Ð&Ü�n¤t¬U mÔ4Ü#ñ $ð (ô$ó ˆJð -7ÖA &º&’vÐAˆGÐAÜ�7‹|˜qÒ Ø˜q‘zÐ!ÙØØ!ò "�Ü! &¬%¯,©,Ô7Ð7Ð7Ü˜&Ÿ+™+Õ&Ø!’Mð"ð ˜1‘:ÐØùò? Kùò Tùò Bs!   ‡E!�E!°E&ÁE&Ã;E+ÄE+c                ó2   — ddl m}  || j                  «      S )Nr   )Ú	is_impure)Útorch._library.utilsr  r¼  )r‘  r  s     r‘   rg
  zFallbackKernel.has_side_effectsO#  s   € Ý2ñ ˜×)Ñ)Ó*Ð*r“   c                ó  — t        | j                  t        j                  j                  t        j                  j
                  f«      s+J d| j                  › dt        | j                  «      › d�«       ‚t        | j                  t        j                  j
                  «      sSd| j                  j                  «       vr7| j                  j                  j                  rt        | j                  «      rg S | j                  S )NrÏ
  r  rÐ
  rÑ
  )r�   r¼  r  rÑ  rÒ  rú  r·   rÅ   rÓ  rì
  r&   rÛ
  r�  s    r‘   rN  z+FallbackKernel.get_inputs_that_alias_outputV#  sÎ   € ÜØ×ÑœuŸz™z×4Ñ4´e·j±j×6TÑ6TÐUô
ð 	
ð 2°$×2BÑ2BÐ1CÀ2Ü�D×$Ñ$Ó%Ð& nð6ó	
ð 
ô ˜4×+Ñ+¬U¯Z©Z×-KÑ-KÔLØ"¨$×*:Ñ*:×*?Ñ*?Ó*AÑAØ× Ñ ×(Ñ(×3Ò3Ü& t×'7Ñ'7Ô8àˆIà×#Ñ#Ð#r“   c                óN   — t        | j                  «      dk  sJ ‚| j                  S rØ  )rÍ   r±	  r�  s    r‘   rJ  z!FallbackKernel.get_mutation_namesk#  s'   € Ü�4×&Ñ&Ó'¨1Ò,Ð,Ð,Ø×"Ñ"Ð"r“   c           	     ó¤  — t         j                  d| j                  «       | j                  «       t	        | t
        «      sJ t        | «      «       ‚| j                  | j                  | j                  «      \  }}| j                  ||«      }| j                  D �cg c]  } | j                  |fi |¤Ž‘Œ }}| j                  }t        j                  j                  sg |¢|¢S t!        dg «      }|j#                  |||«      }	 	 	 	 	 	 d
d„}t	        |t$        j&                  j(                  j*                  «      r#|j-                  |d   |d   «      j.                  }	n|j0                  j.                  }	t3        |	«      dk(  r>| j4                  r| j4                  n| j6                  }
|	d   j8                  } |||
«      g}n9t;        |	| j4                  «      D ��cg c]  \  }} ||j8                  |«      ‘Œ }}}| j                  €J ‚i }t	        | j                  t$        j<                  j>                  «      r$tA        jB                  | j                  «      �d|d<   tE        | j                  «       tG        jH                  | j                  jK                  «       |||¬«      ¬	«      }t        jL                  jO                  |«       g |¢|¢S c c}w c c}}w )aÈ  
        ProxyExecutor Design Note
        We export the ExternFallbackNodes (for custom ops) into a serialized file
        and run it with a host side proxy executor to address the ABI problem
        This is currently only implemented for fbcode. Eventually, we will also make this work for OSS.
        Detailed design doc can be found at
        https://docs.google.com/document/d/1wC4DOZFaYym2t1Esz0X5yxlLI3RDnSiyRbUus3bkJ64/edit?usp=sharing
        z4Extern kernel node added for node %s with target %s.Nc           	     óÌ  — t        | t        j                  t        j                  f«      r¿|}t        |t        t
        f«      rt        |«      dk(  sJ ‚|d   }t        | t        j                  «      rTt        |t        «      sJ ‚t        j                  j                  t        j                  |j                  «       ¬«      ¬«      S |�J ‚t        j                  j                  d¬«      S t        | t        j                  «      r˜t        | j                  «       t        j                  «      rpt        |t        «      sJ t!        |«      «       ‚t        j                  j                  |D �cg c]&  }t        j                  |j                  «       ¬«      ‘Œ( c}¬«      S t        | t        j"                  «      rÚt        | j                  «       t        j                  «      r²|€>t        j                  j                  t        j$                  j                  d¬«      ¬«      S t        |t        «      sJ ‚t        j                  j                  t        j$                  j                  t        j                  |j                  «       ¬«      ¬«      ¬«      S t        | t        j&                  «      r t        j                  j                  |¬	«      S t)        d
t!        | «      › �«      ‚c c}w )NrI   r   r�  )Ú	as_tensorT)Úas_none)Ú
as_tensors)Úas_optional_tensor)Úas_intzUnsupported return type )r�   r  Ú
TensorTypeÚNoneTyper©   rª   rÍ   r‰   Úexport_schemary   r�  ÚTensorArgumentrs  râ
  ÚgetElementTyper   r·   ÚOptionalTypeÚOptionalTensorArgumentÚIntTypeÚRuntimeError)Úreturn_typer\  rú   s      r‘   Úhandle_single_outputzFFallbackKernel.export_extern_kernel_node.<locals>.handle_single_output�#  sh  € ô ˜+¬×(8Ñ(8¼%¿.¹.Ð'IÔJà�Ü˜f¤t¬U mÔ4Ü˜v›;¨!Ò+Ð+Ð+Ø  ™)�CÜ˜k¬5×+;Ñ+;Ô<Ü% c¬6Ô2Ð2Ð2Ü(×1Ñ1×8Ñ8Ü"/×">Ñ">ÀCÇLÁLÃNÔ"Sð 9ó ð ð ˜;Ð&˜;Ü(×1Ñ1×8Ñ8ÀÐ8ÓFÐFÜ˜K¬¯©Ô8¼ZØ×*Ñ*Ó,¬e×.>Ñ.>ô>ô " &¬(Ô3ÐA´T¸&³\ÓAÐ3ä$×-Ñ-×4Ñ4ð $*ö àô &×4Ñ4¸#¿,¹,».ÖIò ð 5ó ð ô ˜K¬×);Ñ);Ô<ÄØ×*Ñ*Ó,¬e×.>Ñ.>ôBð �>Ü(×1Ñ1×8Ñ8Ü+8×+OÑ+O×+VÑ+VØ$(ð ,Wó ,ð 9ó ð ô & f¬fÔ5Ð5Ð5Ü(×1Ñ1×8Ñ8Ü+8×+OÑ+O×+VÑ+VÜ&3×&BÑ&BØ%+§_¡_Ó%6ô'ð ,Wó ,ð 9ó ð ô ˜K¬¯©Ô7Ü$×-Ñ-×4Ñ4¸FÐ4ÓCÐCä"Ð%=¼dÀ;Ó>OÐ=PÐ#QÓRÐRùò7 s   Å)+K!r   rI   Ú1Útorch_library_custom_op)rT  rj  rK  r`  )rÅ   r¹   )r"  z1torch.TensorType | torch.ListType | torch.JitTyper\  úIRNode | Sequence[IRNode]r¼   zexport_schema.Argument)(r±  r¹  rs  r¼  r�   rÖ  r·   r	  rj  r´  r]	  rº  rh	  rw   r  Úaot_moder%   Úserialize_inputsr  r	  Ú	torchbindÚCallTorchBindrï
  ÚreturnsrÓ  rÍ   rK  rŸ  rÖ  rÖ   rÑ  rÒ  Ú
custom_opsÚ_maybe_get_opdefrË
  r  r>   rÅ   Úextern_kernel_nodesrÇ  )r‘  rÃ   rÄ   r�  Úordered_kwargsrT  Ú
serializerÚnamed_argumentsr#  r+  rK  r"  Úoutput_argumentsÚreturn_schemar\  r`  r¹   s                    r‘   Úexport_extern_kernel_nodez(FallbackKernel.export_extern_kernel_nodeo#  s«  € ô 	�	‰	ØBØ�M‰M‹OØ×Ñô	
ô ˜$¤Ô/Ð;´°d³Ó;Ð/Ø×*Ñ*¨4¯;©;¸×8JÑ8JÓK‰ˆˆfØ×*Ñ*¨4°Ó8ˆð ×9Ñ9ö
àð "ˆD×!Ñ! #Ñ0¨Ó0ð
ˆð 
ð ×!Ñ!ˆä�w‰w×Òà+�TÐ+˜NÐ+Ð+ä*¨4°Ó4ˆ
Ø$×5Ñ5°f¸dÀFÓKˆð3	SØJð3	Sà-ð3	Sð $ó3	Sôj �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ñ	 %Ø!×+Ñ+Øõð Ðñ  ð ×ÑÐ+Ð+Ð+Øˆä�t×'Ñ'¬¯©×)>Ñ)>Ô?Ü×+Ñ+¨D×,<Ñ,<Ó=ÐIà25ˆHÐ.Ñ/äØ—‘“Ü×#Ñ#Ø×'Ñ'×,Ñ,Ó.Ø&Ø(Ø!ô	ô
ˆô 	
×Ñ×$Ñ$ TÔ*à'�Ð'˜Ð'Ð'ùòY
ùó` s   ÂKÇKc                ó"  ‡ ‡‡— ‰ j                   }|€J ‚|j                  dk(  rt        |t        j                  j
                  «      sJ t        |«      «       ‚t        j                  j                  r¯ddl
m} t        |«      |vrœt        j                  d|«       d‰ _        n~|j                  dk(  r4t        |t        j                  j
                  «      sKJ t        |«      «       ‚t        j                  j                  r!|t         j"                  j$                  v‰ _        t        j                  j                  rÀt        |t        j                  j
                  «      rœ‰ j                  s�dˆfd„Š‰ j'                  ‰ j(                  ‰ j*                  «      \  }Št-        j.                  |ˆˆ fd	„‰ j0                  D «       «      }t3        ˆfd
„t5        ||j6                  j8                  «      D «       «      ‰ _        ‰ j;                  |«       ‰ j                  rŠ‰ j=                  «       }‰ j>                  €J ‚‰ j                   €J ‚|jA                  ‰ jC                  «       ‰ j>                  ˆ fd„‰ j                   |‰ jD                  r‰ jD                  n‰ jF                  «       n^|jI                  ‰ «       t        ‰ jJ                  tL        «      r3‰ jO                  |«       ‰ jQ                  |«       ‰ jS                  |«       ‰ jU                  |«       y)r
  Nrè  r   rê  zG%s is missing a c-shim implementation, using proxy executor as fallbackTÚ
_quantizedc                ó˜   •— t        | t        j                  «      r ‰| j                  «       «      S t        | t        j                  «      S rŒ   )r�   r  r  r  Ú
NumberType)r  Ú	is_numbers    €r‘   r9  z)FallbackKernel.codegen.<locals>.is_number$  s:   ø€ Ü˜a¤×!3Ñ!3Ô4Ù$ Q×%5Ñ%5Ó%7Ó8Ð8Ü! !¤U×%5Ñ%5Ó6Ð6r“   c              3  óD   •K  — | ]  } ‰j                   |fi ‰¤Ž–— Œ y ­wrŒ   )rh	  )rè   rk	  rÄ   r‘  s     €€r‘   rê   z)FallbackKernel.codegen.<locals>.<genexpr>#$  s+   øè ø€ ò àð *�D×)Ñ)¨!Ñ6¨vÕ6ñùs   ƒ c              3  ól   •K  — | ]+  \  }}t        |t        «      xr  ‰|j                  «      –— Œ- y ­wrŒ   )r�   ÚcomplexrÖ  )rè   rO  rF  r9  s      €r‘   rê   z)FallbackKernel.codegen.<locals>.<genexpr>($  s5   øè ø€ ò ,á�A�qô ˜1œgÓ&ÒA©9°Q·[±[Ó+AÓAñ,ùs   ƒ14c                 óH   •— g ‰ j                  «       ¢‰ j                  «       ¢S rŒ   )rf	  rl	  r�  s   €r‘   r�  z(FallbackKernel.codegen.<locals>.<lambda>6$  s$   ø€ ÐF˜$×+Ñ+Ó-ÐF°×0CÑ0CÓ0EÐF€ r“   )r  ztorch.JitTyper¼   r�   )+r¼  rð  r�   r  rÑ  rÒ  r·   rw   r  rï  ró  rë  rÈ   r±  r  rè
  rJ   r’
  Úcustom_ops_to_c_shimsr	  rj  r´  rÑ  rZ  rº  r0  rÖ   rÓ  rÔ  rã  r4  r·  Ú,generate_fallback_kernel_with_runtime_lookuprs  rK  rŸ  Úgenerate_fallback_kernelrN  rç  r{	  r	  r„	  rø
  )	r‘  rß  rY  rë  rÃ   Ú	args_iterÚexported_argsr9  rÄ   s	   `      @@r‘   ræ  zFallbackKernel.codegenï#  so  ú€ ð ×!Ñ!ˆØÐ!Ð!Ð!Ø×Ñ˜vÒ%ä˜f¤e§j¡j×&;Ñ&;Ô<ÐJ¼dÀ6»lÓJÐ<Ü�w‰w×"Ò"ÝLä�v“;Ð&;Ñ;ô —K‘KØaØôð 15�DÕ-Ø×Ñ Ò-ä˜f¤e§j¡j×&;Ñ&;Ô<ÐJ¼dÀ6»lÓJÐ<Ü�W‰W× Ò ð œf×1Ñ1×GÑGÐGð Ô%ô �G‰G×ÒÜ˜6¤5§:¡:×#8Ñ#8Ô9Ø×-Ò-õ7ð  ×.Ñ.¨t¯{©{¸D×<NÑ<NÓO‰LˆD�&ô "Ÿ™Øôà!×?Ñ?ôóˆIô ),ó ,ä 	¨6¯>©>×+CÑ+CÓDô,ó )ˆDÔ%ð
 	×Ñ˜WÔ%Ø×$Ò$Ø ×:Ñ:Ó<ˆMØ×*Ñ*Ð6Ð6Ð6Ø×#Ñ#Ð/Ð/Ð/à×@Ñ@Ø—‘“Ø×'Ñ'ÛFØ× Ñ Øà $§¢�—’°$×2GÑ2Gõð ×,Ñ,¨TÔ2Ü˜$Ÿ+™+¤vÔ.Ø×)Ñ)¨'Ô2Ø×.Ñ.¨wÔ7Ø×,Ñ,¨WÔ5à×)Ñ)¨'Õ2r“   c           	     óê   — d}	 | j                  «       }t        | j                  | j                  t        | j                  «       «      t        | j                  «       «      |¬«      S # t        $ r Y Œ]w xY w)NFr¨  )rR  r!  rP  r  r  rd   r  r  )r\  rR  s     r‘   r×  zFallbackKernel.tensor_to_layoutE$  sj   € àˆ	ð	Ø×(Ñ(Ó*ˆIô Ø�M‰MØ�L‰LÜ% f§k¡k£mÓ4Ü% f§m¡m£oÓ6Øô
ð 	
øô ò 	áð	ús   „A& Á&	A2Á1A2c                ót  — ddl m} |j                  }|j                  |«      }|�|j                  j                  «       syddlm}m} |j                  j                  «       }	|	€yddl	m
}
  |
|||d¬«      }|€t        j                  d	|«       y|\  }}|j                  d
«      }|€y|	D ]Š  }|j                  |«      }t        j                  |«      \  }}|D ]Z  }t        |t         «      sŒ ||t"        j$                  «      r ||t"        j$                  |«       ŒDt        j                  d||«       Œ\ ŒŒ y)zARealize symm_mem args as comm buffers based on registry metadata.r   )Ú	singletonNrI   )Úcan_realize_as_comm_bufferÚrealize_as_comm_buffer)Únormalize_functionT)Únormalize_to_only_use_kwargsz:Failed to normalize arguments for symm_mem realization: %sr½  z8Failed to realize %s as a symmetric memory buffer for %s)Útorch._library.simple_registryrE  r¤   r»  Úsymm_mem_argsÚis_registeredÚcomm_loweringrF  rG  Útorch.fx.operator_schemasrH  r±  r  rÎ  r	  r�   rˆ   r·  r¹  )rÔ  rY  rÃ   rÄ   rE  ÚqualnameÚentryrF  rG  rK  rH  Ú
normalizedrù   Úall_argsr½  r\	  Ú	arg_valuer�
  r  s                      r‘   Ú_maybe_realize_symm_mem_argsz+FallbackKernel._maybe_realize_symm_mem_argsU$  s2  € õ
 	=à×&Ñ&ˆØ—‘˜hÓ'ˆØˆ= × 3Ñ 3× AÑ AÔ CØçUà×+Ñ+×/Ñ/Ó1ˆØÐ Øå@á'Ø�D˜&¸tô
ˆ
ð ÐÜ�K‰KØLØôð à ‰ˆˆ8à—\‘\ ,Ó/ˆ
ØÐØà%ò 	ˆHØ Ÿ™ XÓ.ˆIÜ×,Ñ,¨YÓ7‰JˆG�QØò 
�Ü! !¤YÔ/ØÙ-¨a´×1HÑ1HÔIÙ*¨1¬n×.EÑ.EÀzÕRä—K‘KØRØ Ø õñ
ñ	r“   c                ó  ‡ ‡‡‡‡— t         j                  f}||vr,t        t        d   t        j
                  j                  «      }n
t        «       }|5   ‰ j                  |g|¢­i |¤Ž\  }}}}	}
ddd«       t        |t        j                  j                  «      r ‰ j                  |g|¢­i |¤Ž t        |t        j                  j                  «      röt        j                  j                  j!                  |«      sÍt        t        j"                  «      r³ddlm}m}m}m} d} ||j.                  «      r ||«      }|€ ||«      }|�t1         ||«      «      dk(  rkt3        |j4                  |j6                  g |j8                  ¢g |j;                  «       ¢¬«      }t=        |t?        «      t?        «      |tA        |«      |¬«      S tC        d„ D «       «      Š‰ jE                  |«      Š‰sit        |t        jF                  jH                  jJ                  «      s&|t        jL                  jN                  jP                  u rt        j4                  d«      Št        |t        j                  j                  «      rgt        j                  j                  j!                  |«      s>t        j
                  jR                  s$‰r"tT        jW                  ||‰|	|
‰¬	«	      }|�|S |€ ‰ tY        ‰¬
«      ||	|
¬«      Šn"‰sJ d«       ‚ ‰ t[        ‰¬
«      ||	|
¬«      Šdˆ ˆˆˆˆfd„Š ‰|g «      }t        |t>        t\        f«      r	|‰_/        |S t        |t`        «      rt]        |«      ‰_/        |S |g‰_/        |S # 1 sw Y   �ŒxY w)z9Create an instance of FallbackKernel from an _OpOverloadsNr   )Ú_is_functionalÚget_out_arg_namesÚlookup_manual_out_variantÚto_out_variantrI   ©r  r  r  r  )rN  rj  r´  rÄ   r·  r¼  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrŒ   )r
  r’  s     r‘   rê   z(FallbackKernel.create.<locals>.<genexpr>Ä$  s   è ø€ Ò!K¸¤,¨s×"3Ñ!Kùrà  r!  ©rÀ  Úhas_unaligned_inputrÌ  ©rÄ   rÀ  z"Not sure where to find device infoc                óŒ  •‡ ‡— 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                  «      rnt        ‰j                  ‰ «      ‰	‰«      }t        j                  s‰st        ‰ «      s3t        j                   j"                  j%                  |j&                  «       |S t        ‰ t(        «      r‰ S t        ‰ t        j*                  «      r‰ j,                  j.                  S t        ‰ t        j0                  j2                  t4        f«      st7        ‰ «      rt9        t;        ‰¬«      ‰	‰‰ «      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     €€€r‘   rê   zAFallbackKernel.create.<locals>.generate_output.<locals>.<genexpr>ý$  s5   øè ø€ ò $àñ $ F¨1¡I¨w¼4À»<ÈÐ:KÐ9LÑ/L×Mñ$ùr›  rÌ  zFallbackKernel output type z is not supported)r�   r©   rª   r·   rÎ   rÍ   r«   rT  r  rÔ  rÌ  r×  rJ   Ú assume_unaligned_fallback_outputrt   rw   r  r  r·  rÅ   rŽ   rI	  r¹   rŽ  rÔ
  r	  r*   r,   r¶   rÂ  )
r\  rœ  r�  rá  r¢  rÔ  r  ra  r]  Úpackeds
   ``   €€€€€r‘   ra  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ØØó�ô ×;Ò;Ù*Ü,¨VÔ4ä—G‘G×-Ñ-×1Ñ1°#·(±(Ô;Ø�
Ü˜F¤CÔ(Ø�Ü˜F¤E§L¡LÔ1Ø—{‘{×'Ñ'Ð'ÜØœŸ™×.Ñ.Ô0@ÐAôä  Ô(Ü(Ü fÔ-ØØØó	ð ð �~ð Ø1´$°v³,°Ð?PÐQó�~ð ùóEs   Á+#G )r\  r   rœ  zlist[tuple[Any, int]]r¼   r   )1rè  Ú*_fused_moving_avg_obs_fq_helper_functionalr   r	   rw   r  r6  r
   r0	  r�   r  rÑ  rÒ  rT  rê
  r±  Ú
is_builtinrÔ  Útorch._library._out_variantrV  rW  rX  rY  rÓ  rÍ   rP  r  r  rA  r  rš	  r©   Ú_make_out_variant_kernel_namer0  r  r	  r)  r*  ru   Úhigher_orderÚprintrï  ÚExternKernelMultiOutÚ
try_createrÂ  r§  rª   rK  r«   )rÔ  rY  rÃ   rÄ   Úfake_incorrect_kernelsÚcontextr+	  r$	  r%	  r	  rÀ  rV  rW  rX  rY  Úout_oprN  Ú
out_resultrK  r  ra  r]  rc  s   `                  @@@@r‘   r�  zFallbackKernel.createˆ$  sU  ü€ ô #'×"QÑ"QÐ!SÐØÐ/Ñ/ÜÔ1°$Ñ7¼¿¹×9JÑ9JÓK‰Gä!“mˆGàñ 	<ð #�×"Ñ" 6Ð;¨DÒ;°FÑ;ñØØØØØ!÷	<ô �fœeŸj™j×3Ñ3Ô4Ø,ˆC×,Ñ,¨VÐE°dÒE¸fÒEô �vœuŸz™z×4Ñ4Ô5Ü—N‘N×(Ñ(×3Ñ3°FÔ;Ü˜>¬5¯<©<Ô8÷ó ð ˆFÙ˜fŸn™nÔ-Ù'¨Ó/�Øˆ~Ù2°6Ó:�àÐ!¤cÑ*;¸FÓ*CÓ&DÈÒ&IÜ$Ø)×0Ñ0Ø(×.Ñ.Ø0˜>×/Ñ/Ð0Ø5˜^×2Ñ2Ó4Ð5ô	�ô 'Ø!Ü Ó,Ü"& Ó"7Ø!Ü'DÀVÓ'LØ &ôð ô "Ñ!K¸{Ô!KÓKÐà—‘ ¨nÓ=ˆñ Ü�vœu×6Ñ6×@Ñ@×NÑNÔOØœŸ™×/Ñ/×5Ñ5Ñ5ä—\‘\ %Ó(ˆFô �vœuŸz™z×4Ñ4Ô5Ü—N‘N×(Ñ(×3Ñ3°FÔ;Ü—G‘G×'Ò'Ùä-×8Ñ8ØØØØØØØØ"3Ø$7ð 9ó 
ˆJð Ð%Ø!Ð!àÐ!ÙÜ &Ô)ØØØØØØ"3ô‰Fñ Ð?Ð?Ó?�6ÙÜ!¨Ô0ØØØØØØ"3ôˆF÷)	ñ )	ñV " .°"Ó5ˆÜ�g¤¤e˜}Ô-Ø$ˆFŒNð ˆô ˜¤Ô&Ü" 7›^ˆFŒNð ˆð &˜YˆFŒNàˆ÷{	<ñ 	<ús   ÁNÎNrŒ   ©rN  r  rY  r…   r$	  rä  rî
  r°  r	  r´  rÄ   r•	  rÀ  ú)dict[sympy.Symbol, pytree.KeyPath] | Noner¼   r½   rx  r–	  r±  r˜	  )r$	  zSequence[torch.Tensor] | Noner+	  r°  r¼   r   r_  r�  )r\  rt  r¼   rP  )rY  r�
  rÃ   r   rÄ   r   r¼   r½   )rY  r…   rÃ   r   rÄ   r   r¼   rÖ  )r¢   r£   r¤   r‚  r]  r3  rø
  rª  rf	  r…  r  rg
  rN  rJ  r4  r   ræ  r×  r  rT  r�  rI  rJ  s   @r‘   rÖ  rÖ  m"  sE  ø„ ñð )-ð@4ð HLñ@4àð@4ð ð@4ð &ð	@4ð
 &ð@4ð +ð@4ð &ð@4ð Eð@4ð 
õ@4õD
ó
ó
 óð0 ð#Ø2ð#ØDQð#à	ò#ó ð#óJ+ó$ó*#ò~(ð@ òS3ó ðS3ðj ò
ó ð
ð ð0Ø*ð0Ø36ð0ØBEð0à	ò0ó ð0ðd òeó ôer“   rÖ  c                  óZ   ‡ — e Zd ZdZdd„Zdd„Zdddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	ˆ fd„Zˆ xZS )
ÚComplexViewz9View a complex number as two dtyped numbers or vice versac                 ó   — yr  r¦   r�  s    r‘   r  zComplexView.should_allocate5%  r  r“   c                ó&   — | j                  d«      gS rò  rM
  r�  s    r‘   rN  z(ComplexView.get_inputs_that_alias_output8%  s   € à—‘ Ó"Ð#Ð#r“   Nr^  c          	     ó2   •— t         ‰| �  |||||||¬«       y )Nr^  )rn  r]  ©	r‘  rN  rY  r$	  rî
  r	  rÄ   rÀ  rp  s	           €r‘   r]  zComplexView.__init__<%  s,   ø€ ô 	‰ÑØØØØØØØ/ð 	õ 	
r“   r_  r�  rp  )r¢   r£   r¤   r‚  r  rN  r]  rI  rJ  s   @r‘   rs  rs  1%  sq   ø„ áCóó$ð )-ØGKñ
àð
ð ð
ð &ð	
ð
 &ð
ð +ð
ð &ð
ð Eð
ð 
÷
ñ 
r“   rs  c                  ó   — e Zd ZdZdd„Zy)ÚMemoryCheckKernelz®
    Custom kernel for memory checking that generates direct function calls

    TODO - the custom op was erroring with str inputs. should be able to custom op directly.
    c                óä   — |j                  «        | j                  \  }}}t        |«      }t        |«      }|r|j                  d«       d|› d|› d|› d�}n	d|› d|› d�}|j                  |«       y)z.Override codegen to write direct function callzV# note: dont currently distinguish between buffers returned and dealloc'd in last stepzcheck_memory_step(allocated=z, freed=z, is_final_step=r  N)rƒ	  r´  rI
  rÌ  )r‘  rß  Ú
alive_listÚ	dead_listÚis_final_stepÚ
alive_reprÚ	dead_reprÚcalls           r‘   ræ  zMemoryCheckKernel.codegenY%  sŒ   € ð 	×2Ñ2Ô4Ø/3×/AÑ/AÑ,ˆ
�I˜}ä˜*Ó%ˆ
Ü˜“Oˆ	ÙØ×ÑØhôð 2°*°¸XÀiÀ[ÐP`ÐanÐ`oÐopÐq‰Dà1°*°¸XÀiÀ[ÐPQÐRˆDØ×Ñ˜$Õr“   Nr–	  )r¢   r£   r¤   r‚  ræ  r¦   r“   r‘   ry  ry  R%  s   „ ñô r“   ry  c                  ó    — e Zd ZU ded<   dd„Zy)r§  rj  r  c                ó   — | j                   S rŒ   rÌ  r�  s    r‘   r  zMultiOutputLayout.get_deviceo%  rÍ  r“   Nrg  )r¢   r£   r¤   r¥   r  r¦   r“   r‘   r§  r§  k%  s   … àÓôr“   r§  c                  ó~   ‡ — e Zd Zdd„Z	 d	 	 	 	 	 	 	 	 	 d	ˆ fd„Z ed «      	 d	 	 	 d
d„«       Zdd„Zdd„Zdd„Z	ˆ xZ
S )rÌ  c                ó„   — |j                  | «       | j                  s#| j                  |«       | j                  |«       y y rŒ   )Úcodegen_multi_outputÚ!skip_size_stride_alignment_checksr{	  r	  rå  s     r‘   ræ  zMultiOutput.codegent%  s:   € Ø×$Ñ$ TÔ*Ø×5Ò5Ø×%Ñ% gÔ.Ø×*Ñ*¨7Õ3ð 6r“   c                óÎ   •— t         ‰| �  d ||gd«       t        j                  j	                  | «      | _        t        j                  j                  | «       || _        || _        y rü  )	rn  r]  rw   r  r™  rÅ   rš  rœ  r†  )r‘  rN  rw  rœ  r†  rp  s        €r‘   r]  zMultiOutput.__init__z%  sQ   ø€ ô 	‰Ñ˜˜v¨ w°Ô3Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Ô(ØˆŒØ1RˆÕ.r“   c                óp   — | j                   d   }t        |t        «      sJ |«       ‚|j                  |«      S rò  )rj  r�   r‰   r>  )r‘  ri  r¸  s      r‘   r>  z MultiOutput.get_free_symbol_uses‡%  s7   € ð —[‘[ ‘^ˆ
Ü˜*¤fÔ-Ð9¨zÓ9Ð-Ø×.Ñ.¨}Ó=Ð=r“   c                óp   — t        | j                  «      dk(  xr t        | j                  d   t        «      S )NrI   r   )rÍ   rj  r�   rI  r�  s    r‘   r  zMultiOutput.should_allocate�%  s0   € Ü�4—;‘;Ó 1Ñ$ò 
Ü�t—{‘{ 1‘~Ô'8Ó9ð	
r“   c                ó´   — | j                   D �cg c]>  }t        |t        «      r,t        |j	                  «       «      dkD  r|j                  «       ‘Œ@ c}S c c}w rò  )rj  r�   rÖ  rÍ   rN  rs  r{
  s     r‘   rN  z(MultiOutput.get_inputs_that_alias_output”%  sN   € ð —{‘{ö
àÜ˜#œ~Ô.Ü�C×4Ñ4Ó6Ó7¸!Ò;ð �L‰L�Nò
ð 	
ùò 
s   �AAc                óL  ‡‡— t        «       }| j                  D ]E  }t        |t        «      sŒ|j	                  t        j                  |j                  «       «      «       ŒG | j                  «       Š| j                  «       j                  «       Šdˆˆfd„}| j                  «       }t        j                   xs |d u xs t        |j                  «       }t        j                  || j!                  «       d|¬«      }t        j"                  ||j$                  t        «       ¬«      S )Nc                ó^   •— t        |«      dk(  sJ ‚t        j                  ‰ ‰| «      d«      S r¶  r¸  r¹  s     €€r‘   r®  z*MultiOutput.get_read_writes.<locals>.dummy«%  rº  r“   r¦   r©  r<  r¯  )r@   rj  r�   r‰   r·  rK   rI  rs  r  r
  r  rJ   rp  rn   r·   rT   r
  r?  r=  )	r‘  r6  rl  r®  r  Úshould_normalizeÚwrite_rwr  rÅ   s	          @@r‘   r3  zMultiOutput.get_read_writesœ%  sô   ù€ ô /9«lˆØ—;‘;ò 	@ˆCÜ˜#œvÕ&Ø—	‘	œ,×.Ñ.¨s¯|©|«~Ó>Õ?ð	@ð �}‰}‹ˆØ—/‘/Ó#×0Ñ0Ó2ˆö	;ð —‘Ó"ˆä×1Ñ1Ð1ò 'Ø˜ˆ~ò'ä˜&Ÿ+™+Ó&Ð&ð 	ô
  ×3Ñ3Ø�4—=‘=“? BÐ2Bô
ˆô ×&Ñ&ØØ—?‘?Ü"›ô
ð 	
r“   r–	  rr  )
rN  r  rw  r‰   rœ  úlist[tuple[Any, ...]]r†  r�   r¼   r½   r}  r_  r�  rx  )r¢   r£   r¤   ræ  r]  rb   r>  r  rN  r3  rI  rJ  s   @r‘   rÌ  rÌ  s%  sƒ   ø„ ó4ð 38ðSàðSð ðSð 'ð	Sð
 ,0ðSð 
õSñ ˜MÓ*à$)ð>Ø!ð>à	!ò>ó +ð>ó
ó

÷ 
r“   rÌ  c                  óZ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dˆ fd„Zedd„«       Zdd„Zd	d„Zˆ xZ	S )
r¶   zMultiOutput for opaque objects.c                ó:   •— t         ‰| �  |||d¬«       || _        y )NT©r†  )rn  r]  r	  )r‘  rN  rw  rœ  Úopaque_valuerp  s        €r‘   r]  zOpaqueMultiOutput.__init__Â%  s$   ø€ ô 	‰Ñ˜ ¨ÐSWÐÔXØ$0ˆÕ!r“   c                ó   — t        d«      ‚)NzOpaqueMultiOutput has no dtype)rQ	  r�  s    r‘   r  zOpaqueMultiOutput.dtypeÌ%  s   € äÐ=Ó>Ð>r“   c                ó   — | S rŒ   r¦   r�  s    r‘   r’  z#OpaqueMultiOutput.wrap_for_loweringÐ%  rÉ  r“   c                óX  — t        «       }| j                  D ]E  }t        |t        «      sŒ|j	                  t        j                  |j                  «       «      «       ŒG t        t        j                  | j                  «       «      g«      }t        j                  ||t        «       ¬«      S )Nr<  )	r@   rj  r�   r‰   r·  rK   rI  rs  r?  )r‘  r6  rl  r=  s       r‘   r3  z!OpaqueMultiOutput.get_read_writesÓ%  sˆ   € Ü.8«lˆØ—;‘;ò 	@ˆCÜ˜#œvÕ&Ø—	‘	œ,×.Ñ.¨s¯|©|«~Ó>Õ?ð	@ô 0:Ü×!Ñ! $§-¡-£/Ó2Ð3ó0
ˆô ×&Ñ&ØØÜ"›ô
ð 	
r“   )
rN  r  rw  r‰   rœ  r�  r“  r   r¼   r½   )r¼   r   )r¼   r¶   rx  )
r¢   r£   r¤   r‚  r]  rˆ  r  r’  r3  rI  rJ  s   @r‘   r¶   r¶   ¿%  sY   ø„ Ù)ð1àð1ð ð1ð 'ð	1ð
 ð1ð 
õ1ð ò?ó ð?ó÷
r“   r¶   c                  ó    — e Zd ZdZdd„Zdd„Zy)ÚAllocatingMultiOutputzñMultiOutput with Inductor-controlled allocation for .out() variant ops.

    Overrides should_allocate()=True so Inductor allocates the output buffer,
    and skips tuple-indexing codegen since .out() writes directly into these buffers.
    c                 ó   — yr1  r¦   r�  s    r‘   r  z%AllocatingMultiOutput.should_allocateé%  r®  r“   c                ób   — | j                   s#| j                  |«       | j                  |«       y y rŒ   )r†  r{	  r	  rå  s     r‘   ræ  zAllocatingMultiOutput.codegenì%  s,   € Ø×5Ò5Ø×%Ñ% gÔ.Ø×*Ñ*¨7Õ3ð 6r“   Nr_  r–	  )r¢   r£   r¤   r‚  r  ræ  r¦   r“   r‘   r˜  r˜  â%  s   „ ñóô4r“   r˜  c                ó˜   — | j                   }| j                  j                  j                  d«      d   }| j                  }d|› d|› d|› �S )z8Build fully-qualified kernel name for an out-variant op.z::rI   z
torch.ops.ré  )rð  rÓ  rÅ   rÈ  rñ  )rn  Únsrr	  r   s       r‘   rg  rg  ò%  sP   € à	×	Ñ	€BØ�n‰n×!Ñ!×'Ñ'¨Ó-¨aÑ0€GØ×#Ñ#€HØ˜�t˜1˜W˜I Q x jÐ1Ð1r“   c                  ó–   ‡ — e Zd ZU dZded<   ded<   	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zedd	d
œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zˆ xZ	S )rj  zÁMulti-output .out() variant lowering.

    Subclass of FallbackKernel that emits .out() calls with pre-allocated
    output buffers. Uses AllocatingMultiOutput child nodes for each output.
    rŸ   Úout_arg_nameszlist[AllocatingMultiOutput]Úout_variant_output_nodesc               ón   •— t        ‰| �  |i |¤Ž || _        g | _        t	        |«      | _        || _        y rŒ   )rn  r]  rž  rŸ  rg  r·  r¼  )r‘  rn  rž  rÃ   rÄ   rp  s        €r‘   r]  zExternKernelMultiOut.__init__&  s<   ø€ ô 	‰Ñ˜$Ð) &Ò)Ø*ˆÔØ(*ˆÔ%Ü"?ÀÓ"GˆÔØ!ˆÕr“   c                óH   — | j                  |«       |j                  | «       y rŒ   )rã  Ú generate_extern_kernel_multi_outrå  s     r‘   ræ  zExternKernelMultiOut.codegen&  s   € Ø×Ñ˜WÔ%Ø×0Ñ0°Õ6r“   NFr\  c               ó"  — ddl m}
m}m}  |
|j                  «      syt        |t        t        f«      sy ||«      }|€y ||«      }t        d„ |D «       «      syt        |«      t        |«      k7  ry | t        |¬«      ||||||||¬«	      }g }t        |«      D ]¿  \  }}t        |j                  |j                  g |j                  ¢g |j!                  «       ¢¬«      }t#        ||t%        |«      |fg¬«      }t&        j(                  s|	st+        |«      s3t,        j.                  j0                  j3                  |j4                  «       |j7                  |«       ŒÁ ||_        ||_        t        |t        «      rt        |«      S t        |«      S )	zGCreate an ExternKernelMultiOut if the op has a matching .out() variant.r   )rV  rW  rY  Nc              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrŒ   )r�   r  rÔ  rG
  s     r‘   rê   z2ExternKernelMultiOut.try_create.<locals>.<genexpr>5&  s   è ø€ ÒG°1”:˜a¤§¡×.ÑGùs   ‚$&rÌ  )rÄ   rÀ  rn  rž  rZ  )rN  rw  rœ  )rf  rV  rW  rY  rÓ  r�   rª   r©   rì   rÍ   r§  rò   rP  r  r  rA  r  r˜  r·   rJ   rb  rt   rw   r  r  r·  rÅ   rÇ  rŸ  rK  )rÔ  rY  r+	  r  r$	  r%	  r	  rÄ   rÀ  r]  rV  rW  rY  rn  rž  rc  rK  rÐ   Ú
tensor_outrN  Ú	multi_outs                        r‘   rk  zExternKernelMultiOut.try_create&  sƒ  € ÷	
ñ 	
ñ ˜fŸn™nÔ-Øä˜.¬5´$¨-Ô8Øá Ó'ˆØˆ>Øá)¨&Ó1ˆÜÑG¸ÔGÔGØÜˆ~Ó¤# mÓ"4Ò4ØáÜ VÔ,ØØØØØØ/ØØ'ô

ˆð 02ˆÜ& ~Ó6ò 	&‰MˆAˆzÜ Ø!×(Ñ(Ø ×&Ñ&Ø(�z×'Ñ'Ð(Ø-˜×*Ñ*Ó,Ð-ô	ˆFô .ØØÜ˜~Ó.°Ð2Ð3ôˆIô ×7Ò7Ù&Ü(¨Ô4ä—‘×)Ñ)×-Ñ-¨i¯n©nÔ=Ø�N‰N˜9Õ%ð%	&ð( +2ˆÔ'Ø ˆŒä�n¤eÔ,Ü˜“>Ð!Ü�G‹}Ðr“   )
rÃ   r   rn  r�
  rž  rŸ   rÄ   r   r¼   r½   r–	  )rY  r�
  r+	  r   r  rj  r$	  rä  r%	  r°  r	  r´  rÄ   r•	  rÀ  rq  r]  r�   r¼   z&Sequence[AllocatingMultiOutput] | None)
r¢   r£   r¤   r‚  r¥   r]  ræ  r  rk  rI  rJ  s   @r‘   rj  rj  ú%  sÝ   ø… ñð ÓØ9Ó9ð"àð"ð &ð"ð !ð	"ð
 ð"ð 
õ"ó7ð ð HLØ$)ñJà%ðJð ðJð ð	Jð
 &ðJð 'ðJð +ðJð &ðJð EðJð "ðJð 
0òJó ôJr“   rj  c                  ó²  — e Zd ZU dZded<   d.d„Zd/d„Zd0d„Zd1d„Zd2d„Z	d3d	„Z
d4d5d„Zddœd6d„Zd7d„Zd8d„Zd.d„Zd7d„Z	 d9	 	 	 	 	 d:d„Zd;d„Zd<d„Z	 d9	 	 	 	 	 d=d„Zd>d„Zd?d„Zd@d„ZdAd„ZdBd„ZdCd„Zd.d„Zd.d„ZdDd„ZdEd „Zd3d!„ZdEd"„Z dBd#„Z! e"d «      	 d9	 	 	 dFd$„«       Z#dGd%„Z$dHd&„Z%d4dId'„Z&e'dJd(„«       Z(dKd)„Z)dJd*„Z*dCd+„Z+e'dLd,„«       Z,d3d-„Z-e-Z.y
)MrÖ  zC
    TensorBox / StorageBox allow in-place mutation of Tensors
    r‰   rM  c                ó6   — | j                   j                  «       S rŒ   r+  r�  s    r‘   r  z!MutableBox.has_exceeded_max_readsm&  r,  r“   c                ó6   — | j                   j                  «       S rŒ   r  r�  s    r‘   r  zMutableBox.get_devicep&  r  r“   c                ó6   — | j                   j                  «       S rŒ   rÚ  r�  s    r‘   r  zMutableBox.make_loaders&  ó   € Ø�y‰y×$Ñ$Ó&Ð&r“   c                ó6   — | j                   j                  «       S rŒ   )rM  r
  r�  s    r‘   r
  zMutableBox.make_indexerv&  ó   € Ø�y‰y×%Ñ%Ó'Ð'r“   c                ó6   — | j                   j                  «       S rŒ   )rM  r4  r�  s    r‘   r4  zMutableBox.get_stridey&  r  r“   c                ó6   — | j                   j                  «       S rŒ   r"  r�  s    r‘   rs  zMutableBox.get_name|&  r#  r“   Nc                ó8   — | j                   j                  |«      S rŒ   )rM  r  r  s     r‘   r  zMutableBox.has_large_inner_fn&  s   € Ø�y‰y×+Ñ+¨IÓ6Ð6r“   Tr  c               ó<   — | j                   j                  ||¬«      S r'  r(  r  s      r‘   r  zMutableBox.mark_reuse‚&  r)  r“   c                ó6   — | j                   j                  «       S rŒ   r1  r�  s    r‘   r  zMutableBox.realize_hint…&  r­  r“   c                ó6   — | j                   j                  «       S rŒ   )rM  rp  r�  s    r‘   rp  zMutableBox.unwrap_viewˆ&  r«  r“   c                ó6   — | j                   j                  «       S rŒ   )rM  r  r�  s    r‘   r  zMutableBox.is_input_buffer‹&  ó   € Ø�y‰y×(Ñ(Ó*Ð*r“   c                ó6   — | j                   j                  «       S rŒ   )rM  r"  r�  s    r‘   r"  zMutableBox.freeze_layoutŽ&  s   € Ø�y‰y×&Ñ&Ó(Ð(r“   c                ó:   — | j                   j                  ||«      S rŒ   )rM  r&  r$  s      r‘   r&  z*MutableBox.freeze_layout_with_stride_order‘&  s   € ð �y‰y×8Ñ8¸ÀÓNÐNr“   c                ó8   — | j                   j                  |«      S rŒ   )rM  r*  r)  s     r‘   r*  z(MutableBox.freeze_layout_with_fill_order–&  s   € Ø�y‰y×6Ñ6°uÓ=Ð=r“   c                ó8   — | j                   j                  |«      S rŒ   )rM  r-  r,  s     r‘   r-  z(MutableBox.freeze_layout_with_same_order™&  s   € Ø�y‰y×6Ñ6°vÓ>Ð>r“   c                ó:   — | j                   j                  ||«      S rŒ   )rM  r1  r/  s      r‘   r1  z+MutableBox.freeze_layout_with_exact_stridesœ&  s   € ð �y‰y×9Ñ9¸-ÈÓWÐWr“   c                ó6   — | j                   j                  «       S rŒ   )rM  r3  r�  s    r‘   r3  zMutableBox.get_read_writes¡&  rµ  r“   c                ó6   — | j                   j                  «       S rŒ   r9  r�  s    r‘   r£  zMutableBox.get_reads¤&  r7  r“   c                ó6   — | j                   j                  «       S rŒ   r7  r�  s    r‘   r9  zMutableBox.num_reads§&  r7  r“   c                ó6   — | j                   j                  «       S rŒ   r3  r�  s    r‘   r;  zMutableBox.get_storage_numelª&  r4  r“   c                ó6   — | j                   j                  «       S rŒ   r†  r�  s    r‘   r@  zMutableBox.get_reduction_type­&  r‚  r“   c                ó6   — | j                   j                  «       S rŒ   r„  r�  s    r‘   rB  zMutableBox.get_reduction_size°&  r‚  r“   c                ó6   — | j                   j                  «       S rŒ   r6  r�  s    r‘   rD  zMutableBox.is_extern³&  r7  r“   c                ó6   — | j                   j                  «       S rŒ   )rM  rF  r�  s    r‘   rF  zMutableBox.is_no_op¶&  r#  r“   c                ó8   — | j                   j                  |«      S rŒ   rŠ  rÿ  s     r‘   rH  zMutableBox.constant_to_device¹&  s   € Ø�y‰y×+Ñ+¨FÓ3Ð3r“   c                ó6   — | j                   j                  «       S rŒ   )rM  rJ  r�  s    r‘   rJ  zMutableBox.get_mutation_names¼&  r‚  r“   c                ó6   — | j                   j                  «       S rŒ   )rM  rL  r�  s    r‘   rL  zMutableBox.get_operation_name¿&  r‚  r“   c                ó6   — | j                   j                  «       S rŒ   )rM  rN  r�  s    r‘   rN  z'MutableBox.get_inputs_that_alias_outputÂ&  s   € Ø�y‰y×5Ñ5Ó7Ð7r“   c                ó6   — | j                   j                  «       S rŒ   r.  r�  s    r‘   rø  zMutableBox.realizeÅ&  r/  r“   c                ó8   — | j                   j                  |«      S rŒ   r  r=  s     r‘   r>  zMutableBox.get_free_symbol_usesÈ&  s   € ð �y‰y×-Ñ-¨mÓ<Ð<r“   c                ó6   — | j                   j                  «       S rŒ   r;  r�  s    r‘   r¤  zMutableBox.get_read_namesÎ&  r<  r“   c                ó6   — | j                   j                  «       S rŒ   )rM  r­  r�  s    r‘   r­  zMutableBox.get_defining_opÑ&  rµ  r“   c                ó8   — | j                   j                  |«      S rŒ   )rM  rü  rú  s     r‘   rü  zMutableBox.codegen_referenceÔ&  s   € Ø�y‰y×*Ñ*¨6Ó2Ð2r“   c                ó6   — | j                   j                  «       S rŒ   ©rM  rã  r�  s    r‘   rN  zMutableBox.layout×&  s   € ð �y‰y×(Ñ(Ó*Ð*r“   c                ó6   — | j                   j                  «       S rŒ   r  r�  s    r‘   r  zMutableBox.get_layoutÜ&  r  r“   c                ó6   — | j                   j                  «       S rŒ   rÍ  r�  s    r‘   rã  zMutableBox.get_output_specß&  rµ  r“   c                ó6   — | j                   j                  «       S rŒ   r×  r�  s    r‘   r
  zMutableBox.get_sizeâ&  r#  r“   c                ó.   — | j                   j                  S rŒ   )rM  r  r�  s    r‘   r  zMutableBox.dtypeå&  s   € à�y‰y�‰Ðr“   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 )NrÍ  z))r  rÅ  )r�   rM  rÖ  r·   r¢   rÏ  rÈ   rÐ  )r‘  Úline0Úendlr  rÑ  s        r‘   rÉ  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˜ÓÐr“   r_  rg  rk  rm  r`  ro  rŒ   rp  rq  rS  rR  rr  rs  ru  rv  rw  rx  rz  r{  r|  rd  r~  r€  r�  r}  rT  rW  rf  r^  r]  r[  )/r¢   r£   r¤   r‚  r¥   r  r  r  r
  r4  rs  r  r  r  rp  r  r"  r&  r*  r-  r1  r3  r£  r9  r;  r@  rB  rD  rF  rH  rJ  rL  rN  rø  rb   r>  r¤  r­  rü  rˆ  rN  r  rã  r
  r  rÉ  r  r¦   r“   r‘   rÖ  rÖ  e&  si  … ñð ƒLó2ó&ó'ó(ó&ó$ô7ð =Aõ Dó(ó'ó+ó)ð ;@ðOØ"ðOØ37ðOà	óOó
>ó?ð HMðXØ/ðXØ@DðXà	óXó
+ó%ó%ó-ó.ó.ó%ó$ó4ó.ó.ó8ó#ñ ˜LÓ)à$)ð=Ø!ð=à	!ò=ó *ð=ó
*ó+ô3ð ò+ó ð+ó&ó+ó$ð òó ðó ð" �Hr“   rÖ  c                  óV   — e Zd Zeedd„«       «       Zeedd„«       «       Zedd„«       Zy)rˆ   c                 ó   — y rŒ   r¦   ©rM  s    r‘   r�  zTensorBox.createþ&  s   € àFIr“   c                 ó   — y rŒ   r¦   r×  s    r‘   r�  zTensorBox.create'  s   € à+.r“   c                óN   — t        | t        «      r| S t        t        | «      «      S rŒ   )r�   rµ   rˆ   rq  r×  s    r‘   r�  zTensorBox.create'  s"   € ä�dÔ1Ô2ØˆKÜœ DÓ)Ó*Ð*r“   N)rM  rµ   r¼   rµ   )rM  r‰   r¼   rˆ   )rM  r‰   )r¢   r£   r¤   r   r…  r�  r¦   r“   r‘   rˆ   rˆ   ý&  s@   „ ØØÚIó ó àIØØÚ.ó ó à.àò+ó ñ+r“   c                  ód   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd	œdd
„Z
dd	œdd„Zdd„Zy)rq  z7
    StorageBox allow in-place mutation of Tensors
    c                ó¬   — t        | j                  t        t        f«      r4| j                  j	                  «       t
        j                  j                  v S yr  )r�   rM  rŠ  rS  rs  rw   r  r  r�  s    r‘   r  zStorageBox.is_input_buffer'  s:   € Ü�d—i‘i¤+¬Ð!?Ô@Ø—9‘9×%Ñ%Ó'¬1¯7©7×+?Ñ+?Ð?Ð?Ør“   c                ó¢   — t        | j                  t        «      xr4 | j                  j                  «       t        j
                  j                  v S rŒ   )r�   rM  r!  rs  rw   r  r	  r�  s    r‘   r9  zStorageBox.is_module_buffer'  s9   € ä�t—y‘y¤>Ó3ò :Ø—	‘	×"Ñ"Ó$¬¯©×(9Ñ(9Ð9ð	
r“   c           	     ó  — t         j                  | j                  «      r| j                  j                  «       S t	        | j                  t
        t        t        t        f«      sJ t        | j                  «      «       ‚| j                  j                  «       }| j                  j                  «       }| j                  j                  «       }|€J ‚t        d t        || j                  j                  «       | j                  j!                  «       d¬«      | j                  ¬«      | _        t"        j$                  j'                  | j                  «      | j                  _        t"        j$                  j+                  | j                  «       | j,                  | j                  _        || j                  _        || j                  _        | j                  j                  j2                  | j                  _        | j                  j(                  S )NF)r  r  r  rR  r‹  )r‰   rŒ  rM  rs  r�   r  rg  rž  r×  r·   rª  r§  r  rˆ  r  r  r
  rw   r  r™  rÅ   rš  rz  r~  r|  r�  )r‘  r~  r|  r  s       r‘   rø  zStorageBox.realize'  sj  € Ü×"Ñ" 4§9¡9Ô-Ø—9‘9×%Ñ%Ó'Ð'ä˜$Ÿ)™)¤i´¼DÄ$Ð%GÔHð 	
Ì$Ø�I‰IóK
ó 	
ÐHð —i‘i×/Ñ/Ó1ˆØ—I‘I×+Ñ+Ó-ˆ	Ø—‘×%Ñ%Ó'ˆØÐ!Ð!Ð!ä"ØÜ!ØØ—i‘i×)Ñ)Ó+Ø—Y‘Y×'Ñ'Ó)Øô	ð —‘ô	
ˆŒ	ô Ÿ™×0Ñ0°·±Ó;ˆ�	‰	ŒÜ	�‰×"Ñ" 4§9¡9Ô-Ø ŸL™Lˆ�	‰	ÔØ +ˆ�	‰	ÔØ'ˆ�	‰	ÔØ#Ÿy™yŸ~™~×8Ñ8ˆ�	‰	ÔØ�y‰y�~‰~Ðr“   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.
        rI   N)r�   rM  r  rg  rå  Únontrivial_read_countrø  r�  s    r‘   r  zStorageBox.realize_hint:'  sF   € ô
 �t—y‘y¤9¬iÐ"8Ô9Ø—	‘	×*Ñ*Ó,×BÑBÀQÒFà�L‰L�Nð Gð :r“   c                ó  — ddl m} | j                  «       D �cg c])  } ||«      st        j                  j                  |«      ‘Œ+ }}|syt        |«      }t        |«      }t        |«      }||k\  xr ||z  dk\  xr ||k(  S c c}w )Nr   )Úis_nonfreeable_buffersFrâ   )	rk  rá  r£  rw   r  Úget_dep_size_hintr3  rî  r1  )r‘  r  rá  rŸ  Úsize_of_readsÚ
total_sizeÚmax_sizeÚmin_sizes           r‘   Ú$has_accumulated_enough_reads_by_sizez/StorageBox.has_accumulated_enough_reads_by_sizeD'  s™   € Ý@ð —~‘~Ó'ö
àÙ)¨#Ô.ô �G‰G×%Ñ% cÕ*ð
ˆð 
ñ
 ØÜ˜Ó'ˆ
Ü�}Ó%ˆÜ�}Ó%ˆà˜)Ñ#ò %Ø˜XÑ%¨Ñ*ò%à˜HÑ$ð	
ùò
s   ™.Bc                ó¤  — t         j                  }|€7t        | j                  «      rt         j                  }n#t         j
                  }nt        |t        «      sJ ‚t        | j                  t        «      xrZ | j                  «       |kD  xsE | j                  «       xs3 t         j                  d uxr | j                  t         j                  «      S rŒ   )rJ   Úrealize_acc_reads_thresholdr,  rM  Úrealize_cpu_acc_reads_thresholdÚ$_realize_acc_reads_threshold_defaultr�   rŽ   r  r9  r  Ú realize_acc_reads_size_thresholdrç  )r‘  ré  s     r‘   r  z!StorageBox.has_exceeded_max_readsW'  s¹   € Ü&,×&HÑ&HÐ#Ø&Ð.Ü�d—i‘iÔ Ü.4×.TÑ.TÑ+ô ×?Ñ?ñ ,ô Ð9¼3Ô?Ð?Ð?Ü˜$Ÿ)™)¤YÓ/ò 	
Ø�N‰NÓÐ:Ñ:ò Ø×&Ñ&Ó(òô ×7Ñ7¸tÐCò Ø×=Ñ=Ü×;Ñ;óð		
r“   Tr  c               óL  ‡— |dkD  ržt        | j                  t        t        f«      r~t	        | j                  «      r3| j                  j                  «       Šg d¢}t        ˆfd„|D «       «      ry| j                  «       ry|xr! | j                  «       t        j                  kD  S y)zj
        A heuristic to decide if we should realize a tensor
        that is used multiple times.
        rI   )Úexpr±  Úlog10Úlog1pÚlog2ÚsigmoidÚtanhc              3  ó:   •K  — | ]  }|‰j                   v –— Œ y ­wrŒ   )Úused_ops)rè   r�   Úopcounts     €r‘   rê   z5StorageBox.should_realize_on_reuse.<locals>.<genexpr>'  s   øè ø€ Ò@°�q˜G×,Ñ,Ô,Ñ@ùs   ƒTF)r�   rM  r  rg  r,  rå  r0  r  r9  rJ   Úrealize_reads_threshold)r‘  r  r  Ú	heavy_opsrö  s       @r‘   Úshould_realize_on_reusez"StorageBox.should_realize_on_reusem'  s…   ø€ ð
 �1Š9œ D§I¡I´	¼9Ð/EÔFÜ�d—i‘iÔ àŸ)™)×4Ñ4Ó6�ò�	ô Ó@°iÔ@Ô@ØØ×&Ñ&Ô(ØØÒT 4§>¡>Ó#3´f×6TÑ6TÑ#TÐTØr“   c               óL   — | j                  ||¬«      r| j                  «        y y r'  )rù  rø  r  s      r‘   r  zStorageBox.mark_reuse†'  s$   € Ø×'Ñ'¨¸;Ð'ÔGØ�L‰L�Nð Hr“   c                ó6   — | j                   j                  «       S rŒ   r7  r�  s    r‘   r9  zStorageBox.num_readsŠ'  r7  r“   Nr_  rd  rS  )r  rŽ   r¼   r�   )r  rŽ   r  r�   r¼   r�   rq  r{  )r¢   r£   r¤   r‚  r  r9  rø  r  rç  r  rù  r  r9  r¦   r“   r‘   rq  rq  '  sA   „ ñóó

óó<ó
ó&
ð, JNõ ð2 =Aõ ô%r“   rq  c                  ó0   — e Zd ZU ded<   ded<   dZded<   y)ÚSubgraphrÈ   rÅ   rô	  Úgraph_moduleNzGraphLowering | Noner  )r¢   r£   r¤   r¥   r  r¦   r“   r‘   rý  rý  Ž'  s   … à
ƒIØ&Ó&Ø"&€EÐÔ&r“   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è   r  s     r‘   rê   z'_has_aliased_buffers.<locals>.<genexpr>›'  s   è ø€ Ò;¨œ"˜VŸ*Ñ;ùrà  )r�   rS  rp  rÍ   r@   )Úbuffersr  s     r‘   Ú_has_aliased_buffersr  •'  s^   € ð öàô !+¨6´?Ô Cˆ×ÑÔÈÑOð€Gð ô
 ŒzÑ;°7Ô;Ó;Ó<¼sÀ7»|ÑKÐKùòs   …)Ac                  óŽ   ‡ — e Zd ZU dZdZded<   dZded<   dZded<   	 	 	 	 	 	 	 	 dˆ fd„Zdd	„Z	e
	 	 	 	 	 	 dd
„«       Zdd„Zˆ xZS )ÚInvokeSubgraphz.
    Ir node for the invoke_subgraph HOP.
    NúSubgraph | Nonerà	  úSequence[IRNode] | NoneÚoperandsrK  c                ó¾   •— t         ‰| �  d ||¬«       || _        t        j                  j                  | «      | _        t        j                  j                  | «       y rÂ  )rn  r]  rà	  rw   r  r™  rÅ   rš  )r‘  rà	  r  rN  rp  s       €r‘   r]  zInvokeSubgraph.__init__¨'  sQ   ø€ ô 	‰ÑØØØð 	ô 	
ð
 !ˆŒÜ—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   c                ó8   — | j                   r| j                   gS g S rŒ   )rà	  r�  s    r‘   r°  zInvokeSubgraph.get_subgraphs´'  s   € Ø"&§-¢-�—‘ˆÐ7°RÐ7r“   c                óü  ‡— ddl m} t        j                  j                  }d}|j
                  j                  d«      x}rrd}|j                  t        j                  j                  j                  u r7|j                  d   t        j                  j                  j                  u sJ ‚d}|d   |d }n”d}|j                  t        j                  j                  j                  u r7|j                  d   t        j                  j                  j                  u sJ ‚d}|j                  |d }|D �	cg c]  }	|	j
                  d	   ‘Œ }}	|D �	cg c]  }	| j                  |	«      ‘Œ }}	g }
t        |«      D ]M  \  }}t!        |t"        t$        t&        f«      r|
j)                  |«       Œ3|
j)                   ||||   «      «       ŒO |
}|j                  €|t        j                  j+                  |j,                  ||j.                  ¬
«      |_        t        j0                  |j                  «      5   |j                  j2                  |Ž  ddd«       |j                  j4                  }d}|D ]$  }t!        |t"        «      rŒ|j7                  «       } n |€J ‚t9        ||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 )z„For each operand, get a realized input, force it to have the same
        strides as the subgraph inputs, then use an InvokeSubgraphrI   )Úconstrain_to_fake_tensorNÚeager_input_valsrâ   rá   r   rã   rá  ©rd  rÞ	  rç	  rÌ  )rà	  r  rN  c                óZ  •— t        | t        t        f«      r| S | j                  «       }|€J ‚t	        t        || j                  «       | j                  «       | j                  «       | j                  «       j                  | j                  «       j                  ¬«      ‰t        |fgd¬«      S )Nr¿  Tr’  )r�   rµ   r  r  rÌ  rP  r  r
  r4  r  rQ  rR  r©   )r\  Úindr  Úinvoke_subgraphs      €r‘   Úcreate_outputz,InvokeSubgraph.create.<locals>.create_output(  s¤   ø€ ô ˜&Ô#8Ô:NÐ"OÔPØ�à×*Ñ*Ó,�ØÐ)Ð)Ð)ä"ÜØ%Ø$×.Ñ.Ó0Ø#Ÿ_™_Ó.Ø%×0Ñ0Ó2Ø%×0Ñ0Ó2×9Ñ9Ø"(×"3Ñ"3Ó"5×"?Ñ"?ôð $Ü˜C�[�MØ6:ôð r“   )r\  r‰   r  rŽ   r¼   z:ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput)r@	  r  rw   r  r—  rb  r»  rT  r  ru   rh  r	  rÃ   r  rÍ  rò   r�   rµ   r	  r	  rÇ  rß	  rþ  rÅ   rä	  rå	  Úgraph_outputsr  r  r§  rK  )rÔ  rà	  r  r  r—  Úfake_operandsr  rQ  Úfx_operandsr�   Únew_operandsró   ÚoperandrK  r  r  rÐ   r\  Úoutsr  s                      @r‘   r�  zInvokeSubgraph.create·'  sè  ø€ õ 	7ô —w‘w×+Ñ+ˆàˆØ+×0Ñ0×4Ñ4Ð5GÓHÐHÐÐHàˆFØ×"Ñ"¤e§i¡i×&<Ñ&<×&IÑ&IÑIà#×(Ñ(¨Ñ+¬u¯y©y×/EÑ/E×/UÑ/UÑUÐUÐUØ�Ø,¨QÑ/°°Ð8‰MàˆFØ×"Ñ"¤e§i¡i×&<Ñ&<×&IÑ&IÑIà#×(Ñ(¨Ñ+¬u¯y©y×/EÑ/E×/UÑ/UÑUÐUÐUØ�ð '×+Ñ+¨F¨GÐ4ˆKØ4?Ö@¨q˜QŸV™V E›]Ð@ˆMÐ@ð AIÖ!I¸1 #×"3Ñ"3°AÕ"6Ð!IˆÐ!IØ%'ˆä% hÓ/ò 	‰LˆC�ÜØÔ/´ÔARÐSôð ×#Ñ# GÕ,à×#Ñ#Ù,¨W°mÀCÑ6HÓIõð	ð  ˆà�>‰>Ð!äŸW™W×2Ñ2Ø×(Ñ(Ø,Ø&Ÿm™mð 3ó ˆHŒNô
 ×$Ñ$ X§^¡^Ó4ñ 3Ø"�—‘×"Ñ" MÑ2÷3ð —.‘.×.Ñ.ˆð ˆØò 	ˆGÜ˜gÔ'<Õ=Ø ×+Ñ+Ó-�Ùð	ð Ð!Ð!Ð!Ü(ØØÜ$¨FÔ3ô
ˆð	Øð	Ø!$ð	àGõ	ô. ;DÀGÓ:L×M©Y¨Q°‘˜f aÕ(ÐMˆÑMØ"&ˆÔØˆùòS Aùò "J÷.3ð 3üóT Ns   Ä/K"ÅK'È*K,ËK8Ë,K5c                ó&   — |j                  | «       y rŒ   )Úcodegen_invoke_subgraphrå  s     r‘   ræ  zInvokeSubgraph.codegen (  rÊ	  r“   )rà	  rý  r  rä  rN  r§  r¼   r½   rX  )rà	  rý  r  r‰   r¼   z@list[ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput]r–	  )r¢   r£   r¤   r‚  rà	  r¥   r  rK  r]  r°  r  r�  ræ  rI  rJ  s   @r‘   r  r  ž'  s‹   ø… ñð !%€HˆoÓ$Ø(,€HÐ%Ó,Ø'+€GÐ$Ó+ð
)Ø ð
)Ø,<ð
)ØFWð
)à	õ
)ó8ð ðfØðfØ,2ðfà	Iòfó ðf÷P.r“   r  c                  óØ   ‡ — e Zd ZU dZ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
dd„Zedd„«       Ze	 	 	 	 	 	 	 	 	 	 dd„«       Zdd„Zdd„Zˆ xZS )ÚConditionala¢  
    IR node representing torch.cond

    Attributes:
        predicate: A boolean scalar tensor determining which branch to execute.
        operands: Input tensors passed to both true and false subgraphs.
        true_subgraph: Subgraph executed when predicate is True.
        false_subgraph: Subgraph executed when predicate is False.
        outputs: MultiOutput nodes representing the conditional's outputs.
    Nr?  Ú	predicater  r  r  Útrue_subgraphÚfalse_subgraphúSequence[MultiOutput] | NonerK  c                ó  •— || _         || _        || _        || _        t	        |g|¢«      \  }}t
        ‰	| �  d |||¬«       |�|| _        t        j                  j                  | «      | _        t        j                  j                  | «       y ©N)rÅ   rN  rj  r´  )r  r  r  r  Ú_split_by_sym_typern  r]  rÀ  rw   r  r™  rÅ   rš  )
r‘  r  r  r  r  rN  rÀ  Úsym_argsr$	  rp  s
            €r‘   r]  zConditional.__init__7(  s�   ø€ ð #ˆŒØ ˆŒØ*ˆÔØ,ˆÔä 2°IÐ3IÀÐ3IÓ JÑˆ�+ä‰ÑØØØØ"ð	 	ô 	
ð Ð(Ø%6ˆDÔ"ä—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   c                ó¦   — g }| j                   r|j                  | j                   «       | j                  r|j                  | j                  «       |S rŒ   )r  rÇ  r  ©r‘  Ú	subgraphss     r‘   r°  zConditional.get_subgraphsS(  sG   € Øˆ	Ø×ÒØ×Ñ˜T×/Ñ/Ô0Ø×ÒØ×Ñ˜T×0Ñ0Ô1ØÐr“   c                óR   — t        | t        «      r| S | j                  j                  S rŒ   )r�   rŽ   r¹   rŽ  )ré   s    r‘   Ú_maybe_exprzConditional._maybe_expr[(  s   € ä�aœÔØˆHØ�v‰v�{‰{Ðr“   c                óô
  — | j                  |«      }|D �cg c]  }| j                  |«      ‘Œ }}t        j                  j                  j                  d   }t        |t        «      sJ t        |«      «       ‚g }|D ]B  }t        |t        «      r|j                  |j                  d   «       Œ2|j                  |«       ŒD t        j                  j                  j                  d   }		 	 	 	 	 	 dd„}
||fD ]·  }|j                  �Œt        j                  j                  |j                  ||j                  ¬«      |_        t        j                  |j                  «      5   |j                  j                  |Ž   |
|j                  j                   |	«      |j                  _        ddd«       Œ¹ |j                  €J ‚|j                  €J ‚|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«       ‚|j1                  «       j2                  |j1                  «       j2                  k(  rŒ•J |||f«       ‚ t5        d
„ ||gz   D «       «      }t7        t        j                  j8                  j:                  t        j                  j                  j                  j=                  dd«      «      }|€J d«       ‚t?        ||||tA        |¬«      |¬«      }t)        t+        |t        j                  j                  j                  d   «      «      D ����cg c]ç  \  }\  }}tC        tE        |j-                  «       �|j-                  «       n||j/                  «       |jG                  «       D �cg c]  }t>        jI                  |«      ‘Œ c}|jK                  «       D �cg c]  }t>        jI                  |«      ‘Œ c}|j1                  «       j2                  |j1                  «       jL                  ¬«      |tN        |fg«      ‘Œé }}}}}||_(        ddl)m*}  ||j                  «      \  }}}}} ||j                  «      \  }}}}}tW        |«      tW        |«      z  }tY        |«      D �cg c]  }t[        ||   j\                  ||   |«      ‘Œ! c}|_/        |S c c}w # 1 sw Y   �ŒkxY wc c}w c c}w c c}}}}w c c}w )zNCreate a Sequence of IRNodes from a conditional statement (see .lowering.cond)r2  rá  c                óò   — g }t        | |«      D ]e  \  }}t        |t        «      r|j                  |«       Œ(|j                  t        j                  t        |«      |j                  «       d¬«      «       Œg |S ©NFr  )rÖ   r�   rµ   rÇ  rµ  r€  rˆ   r  )r  Úfake_tensorsÚretr\  r·  s        r‘   Ú_require_exact_stridesz2Conditional.create.<locals>._require_exact_strides}(  sr   € ð ˆCÜ # M°<Ó @ò 	‘�˜Ü˜fÔ&;Ô<Ø—J‘J˜vÕ&à—J‘Jä$×:Ñ:Ü% fÓ-¨t¯{©{«}ÈEð ;ó õð		ð ˆJr“   Nr  Ú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Œ   )r�   rµ   r  )rè   Úos     r‘   rê   z%Conditional.create.<locals>.<genexpr>·(  s)   è ø€ ò 
àÜ˜aÔ!6Ô7ð �L‰L�Nñ
ùrë   rÀ  zcannot determine devicerÌ  )r  r  r  r  rN  rÀ  r¿  r   )Ú-check_input_alias_and_mutation_return_outputs)r  rä  r,  zSequence[torch.Tensor]r¼   rš   )0rÍ  rw   r  r—  rÃ   r�   r   r·   r>   rÇ  rb  rß	  rþ  rÅ   rä	  rå	  r  r  rl  rÍ   rò   rÖ   r  r  r  rQ  rñ  r;   r  rî   r»  r  r§  rÌ  rP  r  r(  r  rR  r©   rK  Útorch._higher_order_ops.utilsr3  r@   r—  r   rN  rŸ  )rÔ  r  r/  r0  r  r�   r  r  Úfx_opÚfake_outputsr.  rà	  Útrue_outputsÚfalse_outputsrÅ   rK  rÐ   Út_oÚf_or  rÀ  Úconditionalr\  Úmerged_outputrP  r3  rù   Útrue_mutated_inputsÚfalse_mutated_inputsÚmutated_operand_indicesró   s                                  r‘   r�  zConditional.createa(  s`  € ð ×%Ñ% iÓ0ˆ	à2:Ö;¨Q�C×%Ñ% aÕ(Ð;ˆÐ;Ü !§¡× 4Ñ 4× 9Ñ 9¸"Ñ =ˆä˜+¤xÔ0ÐC´$°{Ó2CÓCÐ0ð $&ˆØ ò 	,ˆEÜ˜%¤Ô&Ø×$Ñ$ U§Z¡Z°Ñ%6Õ7ð ×$Ñ$ UÕ+ð	,ô —w‘w×+Ñ+×0Ñ0°Ñ7ˆð	Ø+ð	à0ð	ð ó	ð$ ! (Ð+ò 	ˆHØ�~‰~Ñ%ä!"§¡×!6Ñ!6Ø×,Ñ,Ø#0Ø"*§-¡-ð "7ó "�”ô
 ×(Ñ(¨¯©Ó8ñ Ø&�H—N‘N×&Ñ&¨Ñ6ñ 4JØ Ÿ™×4Ñ4°ló4�H—N‘NÔ0÷ð ð	ð" �}‰}Ð(Ð(Ð(Ø�~‰~Ð)Ð)Ð)Ø—}‘}×2Ñ2ˆØ Ÿ™×4Ñ4ˆà(¨,Ð7¸*ÀmÐ9TÐUò 	‰MˆD�'Ü# LÕ1Ü$ð*Ø*.¨Ð/TÐU\ÐT]ð_óð ð	ô �<Ó ¤C¨Ó$6Ò6ÐU¸À}Ð8UÓUÐ6Ü&¤s¨<¸Ó'GÓHò 	U‰MˆA‰z��SØ—>‘>Ó# s§~¡~Ó'7Ò7ÐF¸!¸SÀ#¸ÓFÐ7Ø—=‘=“? c§m¡m£oÒ5ÐD¸¸3À°}ÓDÐ5Ø—>‘>Ó#×*Ñ*¨c¯n©nÓ.>×.EÑ.EÓEÐTÈÈ3ÐPSÀ}ÓTÐEð	Uô ñ 
à  Ñ+ô
ó 
ˆô
 6Ü�G‰G×Ñ×&Ñ&Ü�G‰G× Ñ ×%Ñ%×)Ñ)Ð*=¸tÓDó
Ðð Ð!Ð<Ð#<Ó<Ð!Ü!ØØØ!Ø#Ü$¨FÔ3Ø/ô
ˆô: /8Ü�L¤!§'¡'×"6Ñ"6×";Ñ";¸EÑ"BÓCó/÷)
ñ 
ñ( +�Ñ*�F˜Mô' Üð ×(Ñ(Ó*Ð6ð "×,Ñ,Ô.àØ ×*Ñ*Ó,Ø@M×@RÑ@RÓ@TÖU¸"œ+×1Ñ1°"Õ5ÒUà>K×>RÑ>RÓ>TöØ8:œ×/Ñ/°Õ3òð "×,Ñ,Ó.×5Ñ5Ø$×/Ñ/Ó1×;Ñ;ôð Ü˜��õð
ˆó 
ð2 &ˆÔõ	
ñ
 :¸'×:NÑ:NÓOñ 	*ˆˆAˆqÐ% qñ :¸(×:OÑ:OÓPñ 	+ˆˆAˆqÐ&¨ô #-Ð-@Ó"AÄJØ óE
ñ #
Ðô Ð5Ó6ö(
àô ˜8 C™=×/Ñ/°¸#±ÀÕLò(
ˆÔ$ð
 ˆùò[ <÷Tñ üòv Vùòùõ
ùòV(
s>   –UÅAUÏAU-
Ð(U#ÑU-
ÑU(Ñ4A	U-
Ô#$U5ÕU 	Õ#
U-
c           	     ó’   — |j                  | «       |j                  | j                  «       | j                  t	        | di «      «       y rö
  )Úcodegen_conditionalr÷
  rs  rK  rÂ   rå  s     r‘   ræ  zConditional.codegenü(  s9   € Ø×#Ñ# DÔ)Ø×8Ñ8Ø�M‰M‹O˜TŸ\™\¬7°4Ð9LÈbÓ+Qõ	
r“   c                óÊ   — t        | dd «      x}rKt        t        j                  j                  j
                  |«      }|€J ‚t        |j                  «       «      S t        «       S rö
  rú
  rû
  s      r‘   rª  z$Conditional.get_unbacked_symbol_defs)  rý
  r“   )r  r‰   r  rä  r  rý  r  rý  rN  r§  rÀ  rq  r¼   r½   rX  )ré   zint | torch.SymIntr¼   z
int | Expr)
r  rˆ   r/  rý  r0  rý  r  rà  r¼   zlist[MultiOutput]r–	  r±  )r¢   r£   r¤   r‚  r  r¥   r  r  r  rK  r]  r°  r…  r(  r  r�  ræ  rª  rI  rJ  s   @r‘   r  r  $(  s÷   ø… ñ	ð  $€Iˆ}Ó#Ø(,€HÐ%Ó,Ø%)€M�?Ó)Ø&*€N�OÓ*Ø,0€GÐ)Ó0ð)àð)ð #ð)ð  ð	)ð
 !ð)ð "ð)ð Eð)ð 
õ)ó8ð òó ðð
 ðXàðXð ðXð ð	Xð
 "ðXð 
òXó ðXót
÷ r“   r  c                óš   — g }g }| D ]?  }t        |t        «      r|j                  |j                  «       Œ/|j                  |«       ŒA ||fS rŒ   )r�   rµ   rÇ  rŽ  )rÃ   Únon_sym_argsr#  r“  s       r‘   r"  r"  )  sS   € ð €LØ€HØò %ˆÜ�cÔ0Ô1Ø�O‰O˜CŸH™HÕ%à×Ñ Õ$ð	%ð �\Ð!Ð!r“   c                  óò   ‡ — e Zd ZU dZ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
dd„Zedd„«       Zedd„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zdd„Zdd„Zˆ xZS )Ú	WhileLoopzSThe IR node for while_loop and while_loop_stack_output. It supports input mutation.Nr  Úcarried_inputsÚadditional_inputsr  Úcond_subgraphÚbody_subgraphr  rK  c                ó.  •— || _         || _        || _        || _        t	        g |¢|¢«      \  }}	t
        ‰
| �  d ||	|¬«       |�|| _        || _        t        j                  j                  | «      | _        t        j                  j                  | «       y r!  )rG  rH  rI  rJ  r"  rn  r]  rÀ  Ústack_outputrw   r  r™  rÅ   rš  )r‘  rG  rH  rI  rJ  rN  rÀ  rL  r#  r$	  rp  s             €r‘   r]  zWhileLoop.__init__%)  s¢   ø€ ð -ˆÔØ!2ˆÔØ*ˆÔØ*ˆÔä 2Ø1ˆnÐ1Ð0Ð1ó!
Ñˆ�+ô 	‰ÑØØØØ"ð	 	ô 	
ð Ð(Ø%6ˆDÔ"Ø(ˆÔä—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r“   c                ó¦   — g }| j                   r|j                  | j                   «       | j                  r|j                  | j                  «       |S rŒ   )rI  rÇ  rJ  r%  s     r‘   r°  zWhileLoop.get_subgraphsD)  sG   € Øˆ	Ø×ÒØ×Ñ˜T×/Ñ/Ô0Ø×ÒØ×Ñ˜T×/Ñ/Ô0ØÐr“   c                ó‚  — t        | «      s| S | D �cg c]$  }t        |t        «      r|j                  «       n|‘Œ& }}t	        «       }g }t        | |«      D ]b  \  }}t        |«      |v r%|j                  t        j                  |«      «       Œ8|j                  t        |«      «       |j                  |«       Œd |S c c}w rŒ   )r  r�   rS  rp  r@   rÖ   rÕ  rÇ  rµ  r	  r·  )rG  r  Úunwrapped_buffersÚseen_buffersrN  Úoriginal_inputÚunwrapped_buffers          r‘   Ú_clone_aliased_inputszWhileLoop._clone_aliased_inputsO)  sÃ   € ä# NÔ3Ø!Ð!ð )ö
àô %/¨v´Ô$GˆF×ÑÔ ÈVÑSð
Ðð 
ô )3«ˆØ+-ˆä03°NÐDUÓ0Vò 	.Ñ,ˆNÐ,ÜÐ"Ó# |Ñ3Ø—‘œl×5Ñ5°nÓEÕFà× Ñ ¤Ð$4Ó!5Ô6Ø—‘˜nÕ-ð	.ð ˆùò!
s   ’)B<c                óà   — t        | t        «      r| S t        | t        t        f«      rt        | «      S t        | t        «      rt        j                  | «      S t        dt        | «      › �«      ‚)NzNYI unsupported output type: )r�   rˆ   rq  rS  rÌ  r�  r!  r·   )rú   s    r‘   Ú_maybe_wrap_as_tensor_boxz#WhileLoop._maybe_wrap_as_tensor_boxi)  s\   € ä�cœ9Ô%ØˆJÜ˜œj¬/Ð:Ô;Ü˜S“>Ð!Ü˜œ[Ô)Ü×#Ñ# CÓ(Ð(äÐ!>¼tÀC»y¸kÐJÓKÐKr“   c                ó"  — ddl m} 	 	 	 	 	 	 dd„}t        j                  j                  j
                  d   }t        j                  j                  j
                  d   }	||	z   }
|
D �cg c]  }|j                  d   ‘Œ }}|D �cg c]  }|j                  d   ‘Œ }}|	D �cg c]  }|j                  d   ‘Œ }}|D �cg c]  }| j                  |«      ‘Œ }}t        j                  |«      } |||«      }|D �cg c]  }| j                  |«      ‘Œ }} |||«      }||z   }||fD �]	  }|j                  �Œt        |
t        «      sJ t        |
«      «       ‚t        j                  j                  |j                  |
|j                  ¬«      |_        t        j                   |j                  «      5   |j                  j"                  |Ž  ||u rYt%        |j                  j&                  «      t%        |«      k(  sJ ‚ ||j                  j&                  |«      |j                  _        ddd«       �Œ |j                  r|j                  sJ ‚|j                  j&                  }|j                  j&                  }t)        |«      rt+        d	|› �«      ‚t%        |«      d
k(  sJ |«       ‚|d   }t        |t,        «      sK|j/                  «       t0        j2                  k(  sJ |«       ‚t%        |j5                  «       «      dk(  sJ |«       ‚t%        |«      dkD  sJ d«       ‚|d   j7                  «       }|€J ‚t%        |«      t%        |«      k(  s	J ||f«       ‚t9        t;        ||«      «      D ]³  \  }\  }}	 	 	 	 	 	 dd„} ||j5                  «       |j5                  «       «        ||j=                  «       |j=                  «       «       |j7                  «       |j7                  «       k(  sJ ||||f«       ‚|j/                  «       |j/                  «       k(  rŒ«J |||f«       ‚ |€J ‚t?        t        j                  j@                  jB                  t        j                  j                  j                  jE                  dd«      «      }t        ||||tG        |¬«      ||¬«      }|j                  �8t        |j                  jH                  t0        jJ                  jL                  «      sJ ‚ ||j                  jH                  |«      d   }tO        |«      }|D �cg c]  }||   ‘Œ	 } }tQ        | «      }!g }"g |_)        g |_*        |�rt%        |«      dk(  sJ d«       ‚t9        t        j                  j                  j                  d   «      D ]Ä  \  }}#tW        tY        |#jZ                  |#j\                  |#j_                  «       D �$cg c]  }$t`        jc                  |$«      ‘Œ c}$|#je                  «       D �%cg c]  }%t`        jc                  |%«      ‘Œ c}%¬«      |tf        |fg«      }&|jR                  ji                  |&«       |"ji                  |&«       ŒÆ �nt9        |«      D �]
  \  }}#||v rb|t%        |«      k  sJ d«       ‚tk        |!«      }'|jT                  ji                  tm        |'jn                  |'|«      «       |"ji                  |'«       ŒmtW        tY        |#j7                  «       |#j/                  «       |#j5                  «       |#j=                  «       |#jq                  «       jr                  ¬«      |tf        |fg«      }&|jR                  ji                  |&«       |"ji                  |&«       �Œ t;        ||"«      D ]g  \  }(})|(ju                  «       t        j                  jv                  v sŒ1t        j                  jx                  j{                  |)ju                  «       «       Œi |"S c c}w c c}w c c}w c c}w c c}w # 1 sw Y   �ŒÛxY wc c}w c c}$w c c}%w )z�create the while_loop IR node. stack_output controls whether it stack
        each iterations' output, which is necessary for training.
        r   )Úcheck_input_alias_and_mutationc                óP  — t        | «      t        |«      k(  sJ ‚g }t        | |«      D ]{  \  }}t        |t        j                  «      rKt
        j                  |«      }|j                  t        j                  ||j                  «       d¬«      «       Œk|j                  |«       Œ} |S r+  )rÍ   rÖ   r�   r  rÔ  rF  rU  rÇ  rµ  r€  r  )Útensor_boxesr,  r-  rÕ  ÚfkÚnew_tbs         r‘   r.  z0WhileLoop.create.<locals>._require_exact_strides‚)  s›   € ô �|Ó$¬¨LÓ(9Ò9Ð9Ð9ØˆCÜ˜l¨LÓ9ò #‘��BÜ˜b¤%§,¡,Ô/ô '×@Ñ@ÀÓD�FØ—J‘JÜ$×:Ñ:Ø" B§I¡I£K¸uð ;ó õð —J‘J˜r•Nð)#ð* ˆJr“   éþÿÿÿr2  rá  Nr  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: rI   z9torch.while_loop is assumed to have at least one operand.c                ó²   — t        | «      t        |«      k(  sJ ‚t        | |«      D ]/  \  }}t        j                  j                  j                  ||«       Œ1 y rŒ   )rÍ   rÖ   rw   r  r  r—  )Ú	lhs_exprsÚ	rhs_exprsÚlhsÚrhss       r‘   Ú_guard_list_equalsz,WhileLoop.create.<locals>._guard_list_equalsè)  sN   € ô ˜9“~¬¨Y«Ò7Ð7Ð7Ü # I¨yÓ 9ò <‘H�C˜Ü—G‘G×$Ñ$×1Ñ1°#°sÕ;ñ<r“   rÀ  rÌ  )rG  rH  rI  rJ  rN  rÀ  rL  rá   z-NYI: while_loop_stack_output input mutations.rZ  zonly carries can be mutated.)r  r  r  r  rQ  )rY  rä  r,  z'list[int | torch.SymInt | torch.Tensor]r¼   rš   )r^  úSequence[int | Expr]r_  rc  r¼   r½   )>r4  rW  rw   r  r—  rÃ   rb  rÍ  rF  rS  r�   r   r·   rß	  rþ  rÅ   rä	  rå	  rÍ   r  r  rl  rµ   r  r  r�   r
  r  rò   rÖ   r4  r;   r  rî   r»  r§  ÚmoduleÚfxÚGraphModuler@   rò  rK  rŸ  rÌ  rP  r  r  r  r  r(  r  r©   rÇ  rñ  r   rN  r  rQ  rs  r  rk
  r·  )*rÔ  Úcond_fnÚbody_fnrG  rH  rL  rW  r.  Úfx_carried_inputsÚfx_additional_inputsÚfx_all_inputsr�   Úfake_all_inputsÚfake_carried_inputsÚfake_additional_inputsÚcarried_inputs_Úadditional_inputs_Ú
all_inputsrà	  Úcond_outputsÚbody_outputsrh  r  rÐ   r^  Úborb  rÀ  Ú
while_loopÚmutated_idxsÚmutated_idx_setró   rž  Úmutated_inputs_iterÚall_outputsr\  rP  rO  r¦  Úmutated_inputrl  rú   s*                                             r‘   r�  zWhileLoop.createt)  s–  € õ 	Qð	Ø*ð	àAð	ð ó	ô: ŸG™G×0Ñ0×5Ñ5°bÑ9ÐÜ Ÿw™w×3Ñ3×8Ñ8¸Ñ<ÐØ)Ð,@Ñ@ˆØ2?Ö@¨Q˜1Ÿ6™6 %›=Ð@ˆÐ@Ø6GÖH°˜qŸv™v e›}ÐHÐÐHØ9MÖ!N°A !§&¡&¨£-Ð!NÐÐ!Nà9GÖH°A˜3×,Ñ,¨QÕ/ÐHˆÐHÜ#×9Ñ9¸/ÓJˆÙ0°ÐBUÓVˆØ<MÖN°q˜c×/Ñ/°Õ2ÐNÐÐNÙ3ØÐ 6ó
Ðð %Ð'9Ñ9ˆ
à  'Ð*ó 	ˆHØ�~‰~Ñ%ä! -´Ô:ÐO¼DÀÓ<OÓOÐ:Ü!"§¡×!6Ñ!6Ø×,Ñ,Ø#0Ø"*§-¡-ð "7ó "�”ô
 ×(Ñ(¨¯©Ó8ñ Ø&�H—N‘N×&Ñ&¨Ñ8ð   7Ñ*Ü" 8§>¡>×#?Ñ#?Ó@ÄCØ/óEò  ð ð  ñ 8NØ$ŸN™N×8Ñ8Ø/ó8˜Ÿ™Ô4÷ñ ð	ð4 �}Š} §¢Ð.Ð.Ø—}‘}×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‘×)Ñ)Ó+ˆàÐ!Ð!Ð!ä�?Ó#¤s¨<Ó'8Ò8ð 	
ØØð;
ó 	
Ð8ô %¤S¨¸,Ó%GÓHò 	A‰KˆA‰x��Bð<Ø/ð<à/ð<ð ó<ñ ˜rŸ{™{›}¨b¯k©k«mÔ<Ù˜rŸ}™}›°·±³Ô@ð —=‘=“? b§m¡m£oÒ5ÐJ¸¸2¸rÀ6Ð7JÓJÐ5Ø—<‘<“> R§\¡\£^Ó3Ð@°a¸¸R°[Ó@Ð3ð	Að" Ð!Ð!Ð!ä5Ü�G‰G×Ñ×&Ñ&Ü�G‰G× Ñ ×%Ñ%×)Ñ)Ð*=¸tÓDó
Ðô
 Ø*Ø0Ø!Ø!ä$¨FÔ3Ø/Ø%ô	
ˆ
ð �}‰}Ð(¬ZØ�M‰M× Ñ ¤%§(¡(×"6Ñ"6ô.
ð 	
ð 
ñ
 6Ø�M‰M× Ñ  /ó
à
ñˆô % \Ó2ˆØ5DÖE¨c˜* S›/ÐEˆÐEô # >Ó2ÐØ$&ˆØˆ
ÔØ&(ˆ
Ô#ÚÜ�Ó'¨1Ò,ð Ø?óÐ,ô  )¬¯©×)=Ñ)=×)BÑ)BÀ5Ñ)IÓJò .‘��Vä'ÜØ%Ÿ}™}Ø$Ÿl™lØDJÇKÁKÃMÖR¸bœk×5Ñ5°bÕ9ÒRØFLÇmÁmÃoÖVÀ¤× 7Ñ 7¸Õ ;ÒVô	ð Ü˜C�[�Mó	�	ð ×"Ñ"×)Ñ)¨)Ô4Ø×"Ñ" 9Õ-ò.ô  )¨Ó6ó 2‘��VØ˜/Ñ)Ø¤ ^Ó!4Ò4ÐTÐ6TÓTÐ4ä$(Ð)<Ó$=�MØ×/Ñ/×6Ñ6Ü& }×';Ñ';¸]ÈJÓWôð  ×&Ñ& }Õ5ä +Ü#Ø#)×#4Ñ#4Ó#6Ø"(×"2Ñ"2Ó"4Ø!'§¡Ó!2Ø#)×#4Ñ#4Ó#6Ø#)×#4Ñ#4Ó#6×#=Ñ#=ôð #Ü ˜˜ó
!�Ið ×&Ñ&×-Ñ-¨iÔ8Ø×&Ñ& yÖ1ð-2ô0 ˜N¨KÓ8ò 	@‰HˆC�Ø�|‰|‹~¤§¡×!5Ñ!5Ò5ô —‘×+Ñ+×/Ñ/°·±³Õ?ð	@ð ÐùòU AùÚHùÚ!NùâHùò O÷ñ üòt Fùò" SùÚVs=   Á(_Â_!Â _&Â<_+Ã8_0Æ/A7_5Ô`Ö:`×*`ß5_?	c           	     ó¨   — |j                  | | j                  «       |j                  | j                  «       | j                  t        | di «      «       y rö
  )Úcodegen_while_looprL  r÷
  rs  rK  rÂ   rå  s     r‘   ræ  zWhileLoop.codegenN*  sA   € Ø×"Ñ" 4¨×):Ñ):Ô;Ø×8Ñ8Ø�M‰M‹O˜TŸ\™\¬7°4Ð9LÈbÓ+Qõ	
r“   c                óÊ   — t        | dd «      x}rKt        t        j                  j                  j
                  |«      }|€J ‚t        |j                  «       «      S t        «       S rö
  rú
  rû
  s      r‘   rª  z"WhileLoop.get_unbacked_symbol_defsT*  rý
  r“   )rG  rä  rH  rä  rI  rý  rJ  rý  rN  r§  rÀ  rq  rL  r�   r¼   r½   rX  )rG  rä  r¼   rä  )rú   r‰   r¼   r‰   )rg  rý  rh  rý  rG  rä  rH  rä  rL  r�   r¼   r&  r–	  r±  )r¢   r£   r¤   r‚  rG  r¥   rH  rI  rJ  rK  r]  r°  r…  rS  rU  r  r�  ræ  rª  rI  rJ  s   @r‘   rF  rF  )  s   ø… á]à.2€NÐ+Ó2Ø15ÐÐ.Ó5Ø%)€M�?Ó)Ø%)€M�?Ó)Ø,0€GÐ)Ó0ð)à(ð)ð ,ð)ð  ð	)ð
  ð)ð "ð)ð Eð)ð ð)ð 
õ)ó>ð òó ðð2 òLó ðLð ðWàðWð ðWð )ð	Wð
 ,ðWð ðWð 
#òWó ðWór
÷ r“   rF  c                  ó\   ‡ — e Zd Z	 dddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdˆ fd„Zd	d„Zˆ xZS )
r´   NrÍ
  c          	     óü   •— t         ‰
| �  |||||d |¬«       ddlm}  ||«      }	|	€J ‚|	| _        t
        j                  j                  j                  |	d «      | _	        | t
        j                  j                  |	<   y )Nr^  r   )Ú_get_effect)
rn  r]  Útorch._higher_order_ops.effectsr€  Úeffect_typerw   r  Úeffectful_opsr»  Úprev_effect_buffer)r‘  rN  rY  r$	  rî
  r	  rÄ   rÀ  r€  r‚  rp  s             €r‘   r]  zEffectfulKernel.__init__`*  sƒ   ø€ ô 	‰ÑØØØØØØØ/ð 	ô 	
õ 	@á! &Ó)ˆØÐ&Ð&Ð&Ø&ˆÔÜ"#§'¡'×"7Ñ"7×";Ñ";¸KÈÓ"NˆÔØ-1Œ�‰×Ñ˜kÒ*r“   c                óÈ   •— t         ‰| �  «       }| j                  �F|j                  j	                  t        j                  | j                  j                  «       «      «       |S rŒ   )rn  r3  r„  r6  r·  rK   rI  rs  )r‘  r›  rp  s     €r‘   r3  zEffectfulKernel.get_read_writes}*  sU   ø€ Ü‘gÑ-Ó/ˆà×"Ñ"Ð.Ø×Ñ×!Ñ!Ü×$Ñ$ T×%<Ñ%<×%EÑ%EÓ%GÓHôð Ðr“   c                 ó   — yr1  r¦   r�  s    r‘   rg
  z EffectfulKernel.has_side_effects‡*  r®  r“   rŒ   rp  rx  r_  )r¢   r£   r¤   r]  r3  rg
  rI  rJ  s   @r‘   r´   r´   _*  sr   ø„ ð )-ð2ð HLñ2àð2ð ð2ð &ð	2ð
 &ð2ð +ð2ð &ð2ð Eð2ð 
õ2õ:÷r“   r´   c                  ó<   — e Zd Z ed «      	 d	 	 	 dd„«       Zdd„Zy)r;	  c                ó   — t        «       S rŒ   r?   r=  s     r‘   r>  z!NonTensorObj.get_free_symbol_usesŒ*  r  r“   c                 ó   — y rŒ   r¦   r�  s    r‘   rø  zNonTensorObj.realize’*  r®  r“   Nrr  r}  rd  )r¢   r£   r¤   rb   r>  rø  r¦   r“   r‘   r;	  r;	  ‹*  s1   „ Ù˜NÓ+à$)ðØ!ðà	!òó ,ðô
r“   r;	  c                  óL   — e Zd ZU ded<   ded<   dd„Zddd„Zdd„Zdd	„Zdd
„Zy)r€  rÈ   rÅ   ú%FakeScriptObject | torch.ScriptObjectr  c                ó   — | j                   S rŒ   r�  r�  s    r‘   rs  zTorchBindObject.get_name›*  r¶  r“   Nc                ó   — | j                   S rŒ   r�  rú  s     r‘   rü  z!TorchBindObject.codegen_referencež*  r¶  r“   c                ó   — | j                   S rŒ   r  r�  s    r‘   r	  zTorchBindObject.get_value¡*  r×  r“   c                óŽ   — t        | j                  t        j                  «      r| j                  S | j                  j                  S rŒ   )r�   r  r  r	  Úreal_objr�  s    r‘   Úget_real_objzTorchBindObject.get_real_obj¤*  s0   € Ü�d—j‘j¤%×"4Ñ"4Ô5Ø—:‘:Ðà—:‘:×&Ñ&Ð&r“   c                óœ  — | j                  «       }t        |«      ryt        |d«      sJ ‚t        |j	                  «       «      }t        j                  |«      d   }|D �cg c]=  }t        |t        j                  «      r!|j                  «       |j                  «       z  ‘Œ? }}t        j                  t        j                  |d«      S c c}w )Nr   Ú__obj_flatten__)r‘  r,   r¶  r«   r“  rÎ  r	  r�   r  rÔ  rÑ	  rº  r­  rÐ  Úoperatorr·  )r‘  Úreal_script_objÚ	flat_dictÚ
flat_elemsr�   Ú
flat_sizess         r‘   Úget_buf_byteszTorchBindObject.get_buf_bytesª*  s³   € à×+Ñ+Ó-ˆä˜?Ô+Øä�Ð(9Ô:Ð:Ð:Ü˜×8Ñ8Ó:Ó;ˆ	Ü×(Ñ(¨Ó3°AÑ6ˆ
ð  ö
àÜ˜!œUŸ\™\Ô*ð �N‰NÓ˜qŸw™w›yÓ(ð
ˆ
ð 
ô
 ×Ñ¤§¡¨j¸!Ó<Ð<ùò
s   Á AC	ro  rŒ   rf  )r¼   r‹  )r¼   ztorch.ScriptObjectr{  )	r¢   r£   r¤   r¥   rs  rü  r	  r‘  r™  r¦   r“   r‘   r€  r€  –*  s&   … à
ƒIØ0Ó0óôóó'ô=r“   r€  c                  ó.   — e Zd ZU dZded<   dd„Zdd	d„Zy)
ÚOpaqueValueTypeConstanta  IR node for opaque value type constants that appear directly in graph outputs.

    Unlike TorchBindObject (which references named constants loaded at runtime),
    this inlines the value's repr into the generated code since value types are
    reconstructed from their repr.
    r   r  c                ó,   — t        | j                  «      S rŒ   )rI
  r  r�  s    r‘   rs  z OpaqueValueTypeConstant.get_nameÇ*  s   € Ü�D—J‘JÓÐr“   Nc                ó    — t        | j                  «      \  }}|j                  «       D ]"  \  }}|t        j                  j
                  |<   Œ$ |S rŒ   )r+   r  rT  rw   r  Úopaque_value_type_classes)r‘  rû  Úobj_reprÚopaque_typesrÛ  r  s         r‘   rü  z)OpaqueValueTypeConstant.codegen_referenceÊ*  sJ   € Ü!4°T·Z±ZÓ!@Ñˆ�,Ø ×&Ñ&Ó(ò 	5‰DˆAˆqØ34ŒA�G‰G×-Ñ-¨aÒ0ð	5àˆr“   ro  rŒ   rf  ©r¢   r£   r¤   r‚  r¥   rs  rü  r¦   r“   r‘   r›  r›  ¼*  s   … ñð ƒJó õr“   r›  c                  ó4   — e Zd ZU ded<   ded<   dd„Zd	d
d„Zy)r	  rÈ   rÅ   rj  r  c                ó   — | j                   S rŒ   r�  r�  s    r‘   rs  zGeneratorState.get_nameÖ*  r¶  r“   Nc                ó   — | j                   S rŒ   r�  rú  s     r‘   rü  z GeneratorState.codegen_referenceÙ*  r¶  r“   ro  rŒ   rf  )r¢   r£   r¤   r¥   rs  rü  r¦   r“   r‘   r	  r	  Ñ*  s   … à
ƒIØÓóõr“   r	  c                  ó8   — e Zd ZU dZded<   ded<   d	d„Zd
dd„Zy)r	  zÜ
    Represents an opaque object (e.g., ProcessGroup) that is passed through
    as a graph input. Similar to GeneratorState, this wraps the object with
    its placeholder name so codegen can reference it properly.
    rÈ   rÅ   r   r  c                ó   — | j                   S rŒ   r�  r�  s    r‘   rs  zOpaqueObjectState.get_nameè*  r¶  r“   Nc                ó   — | j                   S rŒ   r�  rú  s     r‘   rü  z#OpaqueObjectState.codegen_referenceë*  r¶  r“   ro  rŒ   rf  r¡  r¦   r“   r‘   r	  r	  Ý*  s   … ñð ƒIØƒJóõr“   r	  c                  ór   — 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  r¦   r�  s    r‘   r  z!_CollectiveKernel.should_allocateð*  r  r“   c                 ó   — yr1  r¦   r�  s    r‘   rg
  z"_CollectiveKernel.has_side_effectsó*  r®  r“   Nc                ó\  — t        | j                  «      t        j                  j                  u sJ d«       ‚| j                  }|�|| _        n|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º  )r‘  r¸  rY  r�   s       r‘   rÃ  z%_CollectiveKernel.set_cpp_kernel_nameø*  s�   € Ü�D×$Ñ$Ó%¬¯©×)>Ñ)>Ñ>ð 	
Ø:ó	
Ð>ð ×!Ñ!ˆØÐ&Ø#2ˆDÕ à#)§>¡>×#6Ñ#6ˆDÔ ð #ŸN™N×4Ñ4ö.
Ø¸¿»ˆA�F‹Fò.
ˆÕ*ùò .
s   Â B)ÂB)c           
     óÄ  — t         j                  j                  5   | j                  ||g|¢­i |¤Ž\  }}}}}	d d d «       	rJ |› d|	› �«       ‚d }
D ]c  }t	        |t
        «      rŒ|j                  «        t         j                  j                  |j                  «       «       |
�ŒT|j                  «       }
Œe |
€J d|› d�«       ‚ | 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   �Œ”xY wc c}w c c}w )Nrg  zIn-place collective zE requires at least one tensor argument; got only non-tensor IR nodes.rÌ  rú   )rw   r  r6  r0	  r�   r;	  rø  rÏ  rs  r  rÂ  rÎ  Útree_leavesrŸ  rn  r   rÛ
  rÇ  )rÔ  rY  rj  rÃ   rÄ   Ú_example_outputr$	  r%	  r	  rÀ  r  Ú
tensor_argrc  Úinpsr¢  rl  s                   r‘   Úcreate_inplacez _CollectiveKernel.create_inplace+  sç  € ô �W‰W×Ññ 	Dð #�×"Ñ" 6¨6ÐC°DÒC¸FÑCñØØØØØ!÷	Dñ %ÐE¨¨°Ð2CÐ1DÐ&EÓEÐ$ØˆØ%ò 	1ˆJÜ˜*¤lÔ3ØØ×ÑÔ Ü�G‰G×'Ñ'¨
×(;Ñ(;Ó(=Ô>Ø‰~Ø#×.Ñ.Ó0‘ð	1ð Ð!ð 	
Ø" 6 (ð +6ð 7ó	
Ð!ñ Ü˜fÔ%ØØØØó
ˆô ×!Ñ! &Ó)ˆØ×Ñ×&Ñ&ØOSÖTÈŒ^œJ¨fÔ5°s¸FÕCÒTô	
ð
 	×Ñ×!Ñ!¸TÖ"B°c 3§<¡<¥>Ò"BÔCØ�F‰?Ø×#Ñ#×*Ñ*Üœz°Ô8¸&À¹-ÈÓPôð ×Ñ×%Ñ% f¨U¡m×&<Ñ&<Ó&>Õ?ð ÷I	Dñ 	Düò> Uùò #Cs   ›GÄ
GÅGÇGc           
     óì  — t         j                  j                  5   | j                  ||g|¢­i |¤Ž\  }}}}}	d d d «       	rJ |› d|	› �«       ‚D ]#  }
t	        |
t
        «      rŒ|
j                  «        Œ% t	        t        «      ré| j                  ||«      }|€J ‚ | t        |¬«      ||«      }t        |«      D ��cg c](  \  }}t        | j                  |«      |t        |fg«      ‘Œ* c}}|_        t        |j                  |«      D ]T  \  }}t        j                   st#        |«      rŒ"t         j                  j$                  j'                  |j(                  «       ŒV |j                  S  | | j                  |«      ||«      }t        j                   st#        |«      s3t         j                  j$                  j'                  |j(                  «       |g|_        |S # 1 sw Y   �Œ¬xY wc c}}w )NrE  rÌ  )rw   r  r6  r0	  r�   r€  rø  r©   r  r§  rò   rÌ  r×  rK  rÖ   rJ   rb  rt   r  r·  rÅ   )rÔ  rY  rj  rÃ   rÄ   r+	  r$	  r%	  r	  rÀ  r°  r  rc  rÐ   rT  r¢  s                   r‘   Úcreate_out_of_placez%_CollectiveKernel.create_out_of_placeU+  sô  € ô �W‰W×Ññ 	Dð #�×"Ñ" 6¨6ÐC°DÒC¸FÑCñØØØØØ!÷	Dñ %ÐF¨¨°Ð3DÐ2EÐ&FÓFÐ$Ø%ò 	%ˆJÜ˜j¬/Õ:Ø×"Ñ"Õ$ð	%ô �n¤dÔ+Ø—_‘_ [°.ÓAˆFØÐ%Ð%Ð%ÙÜ!¨Ô0ØØØØóˆFô "+¨>Ó!:÷ñ �A�vô Ø×(Ñ(¨Ó0ØÜ˜A�Y�KõóˆFŒNô  # 6§>¡>°>ÓBò <‘��VÜ×:Ò:ÔBSØõCô —G‘G×-Ñ-×1Ñ1°#·(±(Õ;ð	<ð
 —>‘>Ð!áØ×$Ñ$ ^Ó4ØØØØóˆFô ×6Ò6Ô>OØô?ô —‘×)Ñ)×-Ñ-¨f¯k©kÔ:Ø$˜XˆFŒNØˆM÷e	Dñ 	Düó.s   ›G#Ã-G0Ç#G-r_  rŒ   r—	  )
rY  r…   rj  zIRNode | list[IRNode]rÃ   r   rÄ   r   r¼   r½   )
rY  r…   rj  zTensorBox | list[TensorBox]rÃ   r   rÄ   r   r¼   z%list[MultiOutput] | _CollectiveKernel)	r¢   r£   r¤   r  rg
  rÃ  r  r²  r´  r¦   r“   r‘   r©  r©  ï*  s¡   „ óóô

ð( ð0@àð0@ð &ð0@ð ð	0@ð
 ð0@ð 
ò0@ó ð0@ðP ð9àð9ð ,ð9ð ð	9ð
 ð9ð 
/ò9ó ñ9r“   r©  c                  óP   ‡ — e Zd Z	 dddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )Ú_AllReduce_KernelNrÍ
  c          	     óT   •— t         ‰| �  |||||d |¬«       | j                  d«       y )Nr^  Ú+aoti_torch_cpu__c10d_functional_all_reduce_©rn  r]  rÃ  rw  s	           €r‘   r]  z_AllReduce_Kernel.__init__“+  ó=   ø€ ô 	‰ÑØØØØØØØ/ð 	ô 	
ð 	× Ñ Ð!NÕOr“   c                ó    — |j                  d«       |j                  | «       t        | j                  t        «      r| j                  |«       y y ©Nz+torch/csrc/inductor/aoti_torch/c/shim_cpu.h©Úinclude_extra_headerrª	  r�   rN  rç  r{	  rå  s     r‘   ræ  z_AllReduce_Kernel.codegen©+  ó@   € Ø×$Ñ$Ð%RÔSØ×,Ñ,¨TÔ2ä�d—k‘k¤6Ô*Ø×%Ñ% gÕ.ð +r“   rŒ   rp  r–	  rö	  rJ  s   @r‘   r¶  r¶  ’+  sw   ø„ ð )-ðPð HLñPàðPð ðPð &ð	Pð
 &ðPð +ðPð &ðPð EðPð 
õP÷,/r“   r¶  c                  óP   ‡ — e Zd Z	 dddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )Ú_AllReduceKernelNrÍ
  c          	     óT   •— t         ‰| �  |||||d |¬«       | j                  d«       y )Nr^  Ú*aoti_torch_cpu__c10d_functional_all_reducer¹  rw  s	           €r‘   r]  z_AllReduceKernel.__init__²+  s=   ø€ ô 	‰ÑØØØØØØØ/ð 	ô 	
ð 	× Ñ Ð!MÕNr“   c                ó    — |j                  d«       |j                  | «       t        | j                  t        «      r| j                  |«       y y r¼  r½  rå  s     r‘   ræ  z_AllReduceKernel.codegenÈ+  r¿  r“   rŒ   rp  r–	  rö	  rJ  s   @r‘   rÁ  rÁ  ±+  sw   ø„ ð )-ðOð HLñOàðOð ðOð &ð	Oð
 &ðOð +ðOð &ðOð EðOð 
õO÷,/r“   rÁ  c                  óv   ‡ — e Zd Z	 dddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	ˆ fd„Zd
d„Zdd„Zedd„«       Zdˆ fd„Zˆ xZ	S )Ú_WaitKernelNrÍ
  c          	     óT   •— t         ‰| �  |||||d |¬«       | j                  d«       y )Nr^  Ú+aoti_torch_cpu__c10d_functional_wait_tensorr¹  rw  s	           €r‘   r]  z_WaitKernel.__init__Ñ+  rº  r“   c                ó    — |j                  d«       |j                  | «       t        | j                  t        «      r| j                  |«       y y r¼  r½  rå  s     r‘   ræ  z_WaitKernel.codegenç+  r¿  r“   c                ór  — | j                   d   }t        |t        «      sJ ‚t        |t        «      r2|j                   d   }t        |t        «      sJ t	        |«      «       ‚|gS t        |t
        «      rC|j                   d   }t        |t        «      r"|j                  d   \  }}|j                   |   gS g S g S rò  )rj  r�   r‰   r©  r·   rÌ  rœ  )r‘  rl  rÐ   Úcollrù   ró   s         r‘   Úget_volatile_readsz_WaitKernel.get_volatile_readsî+  sª   € Ø�k‰k˜!‰nˆÜ˜#œvÔ&Ð&Ð&Ü�cÔ,Ô-à—
‘
˜1‘ˆAÜ˜a¤Ô(Ð1¬$¨q«'Ó1Ð(Ø�3ˆJÜ˜œ[Ô)ð —:‘:˜a‘=ˆDä˜$Ô 1Ô2ØŸ™ Q™‘��3àŸ™ CÑ(Ð)Ð)àˆIð ˆIr“   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)Nrg  rÌ  )	rw   r  r6  r0	  rÂ  r  rŸ  rÇ  r   )	rÔ  rY  rl  r¯  r$	  r%	  r	  rÀ  rc  s	            r‘   Ú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Œ   )rn  r3  rÌ  r6  r·  rK   rI  rs  )r‘  r›  Úvolatile_readsÚvrrp  s       €r‘   r3  z_WaitKernel.get_read_writes,  sZ   ø€ Ü‘gÑ-Ó/ˆà×0Ñ0Ó2ˆØ ò 	GˆBØ×Ñ×!Ñ!¤,×"6Ñ"6°r·{±{³}Ó"EÕFð	GàÐr“   rŒ   rp  r–	  r¼	  )rY  r…   rl  rˆ   r¼   r½   rx  )
r¢   r£   r¤   r]  ræ  rÌ  r  rÎ  r3  rI  rJ  s   @r‘   rÆ  rÆ  Ð+  sš   ø„ ð )-ðPð HLñPàðPð ðPð &ð	Pð
 &ðPð +ðPð &ðPð EðPð 
õPó,/óð2 ò
ó ð
÷*ñ r“   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Œ   )r�   r=   r    r6   rª   r©   r@   r°   r"   r�	  r  rÔ  ©ré   rÖ  r  s      r‘   r�	  r�	  ),  s€   € Ü�!”h¤Ð%Ô&ä$ QÓ'Ð'Ü	�Aœœt�}Ô	%Ü”u—|‘|Ñ$Ó&ˆØò 	0ˆAØÔ,¨QÓ/Ñ/‰Að	0àˆÜ	�A”u—|‘|Ô	$ä$ QÓ'Ð'ä‹|Ð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Œ   )r�   r=   r    r5   rª   r©   r@   r°   r"   r�	  r  rÔ  rÓ  s      r‘   r�	  r�	  9,  s~   € Ü�!”h¤Ð%Ô&ä˜A‹ÐÜ	�Aœœt�}Ô	%Ü”u—|‘|Ñ$Ó&ˆØò 	'ˆAØÔ# AÓ&Ñ&‰Að	'àˆÜ	�A”u—|‘|Ô	$ä˜A‹Ðä‹|Ðr“   c                óê  — t        | t        «      �rât        | j                  t        «      �rÆt        | j                  j                  t        «      r'| j                  j                  j                  d|«       y t        | j                  j                  t        «      �rU| j                  j                  j                  d|«       t        | j                  j                  t        «      r_t        | j                  j                  j                  t        «      r1| j                  j                  j                  j                  d|«       y t        | j                  j                  t        «      r‡| j                  j                  j                  sft        | j                  j                  j                  d   t        «      r4| j                  j                  j                  d   j                  d|«       y y y y y y y )Nr~  r   )r�   rˆ   rM  rq  r³  r–  rr  rˆ  rÌ  rœ  rj  )rN  rÛ  s     r‘   Úassign_origin_noderÖ  I,  sV  € ô �&œ)Õ$¬°F·K±KÄÕ)LÜ�f—k‘k×&Ñ&¬Ô.Ø�K‰K×Ñ×/Ñ/°¸qÕAÜ˜Ÿ™×(Ñ(¬&Õ1Ø�K‰K×Ñ×/Ñ/°¸qÔAÜ˜&Ÿ+™+×*Ñ*¬NÔ;Ä
Ø—‘× Ñ ×%Ñ%¤uôAð —‘× Ñ ×%Ñ%×8Ñ8¸ÈÕJô ˜6Ÿ;™;×+Ñ+¬[Ô9ØŸ™×(Ñ(×0Ò0ä˜fŸk™k×.Ñ.×5Ñ5°aÑ8¼&ÔAØ—K‘K×$Ñ$×+Ñ+¨AÑ.×AÑAÀ-ÐQRÕSð Bð 1ð :ð 2ð *MÐ$r“   )r�   rÇ   r¼   zTypeIs[int | Integer])r¾   r»   r¼   r½   )rÅ   rÈ   r¼   rC  )r×   rt  r¼   z&Callable[[Sequence[_T]], Sequence[_T]])rÞ   z&Callable[[Sequence[_U]], Sequence[_V]]rß   z&Callable[[Sequence[_T]], Sequence[_U]]r¼   r³  rŒ   )rí   z#Sequence[int | torch.SymInt | Expr]rî   úShapeEnv | Noner¼   rt  )r×   úSequence[int | Integer]r¼   rt  rr  )r�   r½   rÿ   r�   r¼   r½   )r�   r‰   rÿ   r�   r¼   rt  )r�   r?  rÿ   r�   r¼   ztorch.Tensor | None)r  zSequence[_T] | Noner¼   zSequence[_T | None] | None)r�   z/IRNode | OutputSpec | torch.device | None | strr¼   re  )r�   z"IRNode | torch.device | None | strr¼   r�   )r�   zBuffer | TensorBoxr1  rŽ   r¼   r�   )r?  ra  r@  ra  rA  ra  r¼   r�   )rT  r‰   rU  zSequence[int | torch.SymInt]r¼   r‰   )rd  rô	  r¼   r½   )rj  rä  r¼   rG  )ró   zExpr | Sequence[Expr]r  r\  r¼   rv   rY  )rR  rÈ   r  r\  rQ  r�   r¼   rD  )r  ra  r  rb  rQ  r    r¼   z$Callable[[Sequence[_IntLike]], Expr]rT	  )TFNFN)r�   r‰   rô  r�   r  r�   r  r©  r%  r�   r0  r©  r¼   ztuple[StorageBox, Layout])r�   r‰   r  rØ  r¼   r�   rQ  )r  ra  rA  ra  r¼   r�   )r  r\  r¼   rŽ   )r¸   rt  r¼   zTypeIs[Sequence[IRNode]])rî   r<   r¼   r‹  )rî   r×  r¼   zAbstractContextManager[None])rn  r�
  r¼   rÈ   )r  rä  r¼   r�   )rÃ   rõ	  r¼   z-tuple[list[ShapeAsConstantBuffer], list[Any]])ré   rÇ   r¼   r  )rN  r   rÛ  ztorch.fx.Noder¼   r½   (i  Ú
__future__r   r†  r‹  rƒ  r­  rÑ  Úloggingr”  Útextwrapr|  Úcollections.abcr   r   r   r   r   r	   r
   Úenumr   r   Únumbersr   Útypingr   r   r   r   r   r   r   r   r   r   r   Útyping_extensionsr   r   r   r   r   r   Úunittest.mockr   r°   r    r!   r"   Útorch._export.serde.schemaÚ_exportÚserderï
  r  Útorch._library.custom_opsrê
  r,  r  r±  rã
  Útorch._loggingr  Útorch.fxÚtorch.utils._pytreeÚ_pytreerÎ  Útorch._dispatch.pythonr#   Útorch._dynamo.utilsr$   Útorch._export.serde.serializer%   Ú*torch._higher_order_ops.auto_functionalizer&   Útorch._inductorr'   rk  r)   Ú"torch._library.fake_class_registryr*   Útorch._library.opaque_objectr+   r,   Útorch._prims_commonr-   r.   r/   r0   r1   r2   Ú%torch.fx.experimental.symbolic_shapesr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   Útorch.fx.noder>   Útorch.utils._ordered_setr@   Útorch.utils._python_dispatchrA   Útorch.utils._sympy.functionsrB   rC   rD   rE   rF   rG   Útorch.utils._sympy.symbolrH   rÂ  rJ   rK   Úcodegen.commonrL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   Ú	loop_bodyrW   Úops_handlerrX   rY   rZ   r[   Úruntime.benchmarkingr\   Úruntime.hintsr]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   Úvirtualizedru   rv   rw   rx   ry   Útorch.typesrz   Úcodegen.cutlass.templater{   Úcodegen.wrapperr|   r  r}   r~   rÇ   r¥   r%  Ú__version__rÎ  rÍ  ÚImportErrorr   r€   r�   r‚   rŽ   rƒ   r	  r„   rÑ  rÒ  rú  r…   Ú	getLoggerr¢   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<  rE  rZ  rf  rm  rt  r‰   rŠ  r³  r
  r  r%  r6  re  rg  rÝ  rQ  rS  r`  rp  r‚  rž  rÏ  r×  r  rü  rÿ  rO  r  r
  ro  r­   rV  rc  rm  r#  rS  rÐ  rÜ  rú  r  r  r  r  r  rç  rP  r  r«  r·  r»  rÂ  rÌ  rr  r	  rŠ  r  r!  r  rµ   rˆ  r�  r‹  rè  r�   r©   ÚPrimitiveInfoTyperô  r  r  r>  rI  rO  rU  rr  r‰  r‰  r�  r‡  r¯  r²  rµ  rš	  r¢	  r§  r   r¾	  rÂ	  rÃ	  rØ	  rø	  rC
  rT
  r_
  ri
  rn
  rv
  rƒ
  r�
  r›
  r«
  r®   r¯   rË
  rÖ  rs  ry  r§  rÌ  r¶   r˜  rg  rj  rÖ  rˆ   rq  rý  r  r  r  r"  rF  r´   r;	  r€  r›  r	  r	  r©  r¶  rÁ  rÆ  r�	  r�	  rÖ  r¦   r“   r‘   ú<module>r     sª  ðÞ "ã Û Û Û Û Û Û Û Û ß MÕ Mß :Ý Ý Ý ÷÷ ÷ ñ ÷ U× TÝ ã ß 'Ñ 'ç 2Ó 2ß .Ð .ß ,Ð ,Û Û ß $Ð $Ý ;Ý (Ý ?Ý MÝ #Ý 2Ý ?ß M÷÷ ÷÷ ÷ ñ õ Ý /Ý ?÷÷ õ +ç "÷õ ÷÷ õ  ß NÓ NÝ -ß :÷÷ ÷ ÷ ÷ ÷ ÷0 *Ñ )ñ ÝBÝ&Ý'å9Ý5Ý$Þ%ð "(€O�YÓ'ðÛà×'Ò'€NØ€Jñ ˆtƒ_€ÙˆTƒ]€ÙˆTƒ]€ÙˆTƒ]€à˜D‘j€ˆ)Ó  Ø˜E‘k DÑ(€ˆ)Ó (àŸ*š*×/Ò/°%·*²*×2PÒ2PÑP€ˆiÓ Pà€g×Ò˜Ó!€Ø	ˆ×	Ñ	˜8Ÿ?š?°4Ô	8€Ø‡y‚y‡~‚~€ð'ðT  ØØØˆˆkÐ	ÑØØØØˆc�4˜˜[Ð(Ñ)¨;¸À(ÐJÑKÈdÑRñðñ	€ˆió 	ô)ð €×Ò˜dÔ#÷ð ó $ðô$ $ôFôôðØ4ðà4ðð ,ôò !Ð Ú$Ð ð LPñØ	,ðØ9Hðàôô	ð LPñ
Ø	,ð
Ø9Hð
àô
ð 
Ý Uó 
Ø Uð 
à27ñØðØ+/ðàóó 
ðð :?ñØðØ26ðàôðDØðàôð
>Ø6ð
>àô
>ô;ô('ô7ð*Ø ðà ðð ðð 
ô	ð$$GØð$Gà)ð$Gð ô$GôN'ôò;÷Z,ñ Z,ñz
 �UÔ÷Uð Uó ðUðp ôP
ˆFó P
ó ðP
ôf&ð ô%
�ó %
ó ð%
ðP ô
ˆió 
ó ð
ñF �|Ó$Ù�yÓ!Ù�yÓ!Ù˜ÓÙ�uÓÙ�uÓÙ˜=Ó)ñ<Ð Ð8ó ð JNñJNØðJNØ +ðJNØBFðJNàôJNðZ ôZ
�ó Z
ó ðZ
ð~ )-Ù˜1“:ðØ
ðà%ðð ðð *ô	ð& " 8¨D¡>°8¸D±>Ð"BÀHÐ"LÑM€ˆYÓ Mô7S˜9ô 7SôtkÐ'ô kô\s
Ð1ô s
ôl`
Ð+ô `
ðF ôF
ˆ5ó F
ó ðF
ðT ô	�ó 	ó ð	ð ô[ˆ5ó [ó ð[ô|ôô(	ð Ø!Ø37ØØ48ñ9Øð9àð9ð ð9ð 1ð	9ð
 ð9ð 2ð9ð ô9ðxØðØ4ðà	ôôð$ ô^
ˆvó ^
ó ñ^
ðB ô[‘ó [ó ñ[ð| ô4‘(ó 4ó ñ4ðn ôA9‘(ó A9ó ñA9ðH ô!‘(ó !ó ñ!ðH ô^‰;ó ^ó ñ^ðB	 ôS‘hó Só ñSðl ô&‘ó &ó ñ&ôRlA‘õ lAð^ ô�6ó ó ñð" ôK‰|ó Kó ñKð$ ôS‘|ó Só ñSðØðØ'9ðà	õõ(<÷7ò 7ð  ôp
‰Zó p
ó ñp
ôf	C‘&õ Cô[H‘Võ [Hô|!G‘fõ !GôH�Tõ ô%‘{õ %ðD ô‘ó ó ñô.V*¡õ V*ñr �UÔôEˆV�]ó Eó ñEñP �UÔô&‘f˜ió &ó ñ&ô ‘&õ ô
‘Kõ ô
‘[õ 
ð& ô˜6ó ó ñð( ô˜Fó ó ññ  �UÔôt4‘_ó t4ó ñt4ðn €×Ò˜dÔ#÷ð ó $ñôf+‘_õ f+ôR<™>õ <ð~ ˜%‘K¡$Ñ&¨Ñ,©t°C¸#±IÀÑ4EÉÑ4LÑ/MÑMÑ ÷Lò Lô^"™|õ "ô
\BÑ.õ \Bô~5™Nõ 5ô0(™õ (ô6™Nõ ô>Z%™Nõ Z%ðz5Ø.ð5àõ5ñ �UÔôR‘?ó Ró ñRôj‘õ ôO‘9õ Oðd ×Òó;ó ñ;ðØðà!õñ �UÔôt‘<ó tó ñtñn �UÔô"‘ló "ó ñ"ôJ
‘/õ 
ô(("™õ ("ôV
‘Võ 
ôB=‘Lõ =ô@%
¡õ %
ôP
™-õ 
ô$<
‘\õ <
ô~u™lõ uôp	))™|õ ))ôZ/™,õ /ôd¡<õ ô8BÑ5õ Bô$8Ñ-õ 8ô46)‘lõ 6)ôr))‘|õ ))õX;3‘õ ;3ö|1E¡õ 1Eöh51‘|õ 51öp-‘Lõ -ö8<;‘<õ <;ñ~ �UÔ÷ò ó ñö
AÑ&õ AñH �UÔö
‘.ó 
ó ñ
ö@ ™õ  ð2 ö™
ó ó ñöI
‘,õ I
öX 
™õ  
öF4™Kõ 4ö 2öf™>õ fðV ×ÒöT�ó Tó ñTõn+‘
õ +ö%‘õ %ñD �UÔö'ˆvó 'ó ñ'öLñ �UÔöB.‘\ó B.ó ñB.ñJ �UÔöe ‘,ó e ó ñe ðP"Ø
ð"à2ö"ñ �UÔö@ ‘ó @ ó ñ@ öF
)‘nõ )öX�6õ ð ö"=‘ló "=ó ñ"=ðJ ö™ló ó ñð( ö‘\ó ó ñð ö™ó ó ñö"`™õ `öF/Ñ)õ /ö>/Ñ(õ /ö>SÑ#õ Sörö ÷ Tøðg] ò Ø€NØƒJðús   Ç:n î	n$î#n$