Ë
    L²j…ý ã                  ó†  — 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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-m.Z. d dl/m0c m1c m2Z3 d dl4m5c m6Z7 d dl8Z9d dl:Z9d dl;m6c m<Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZKmLZL d dlMmNZNmOZOmPZPmQZQmRZRmSZS d dlTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_ d dl`maZa d dlbmcZc d dldmeZe d dlfmgZgmhZhmiZimjZj d dlkmlZl ddlmmnZnmoZo ddlpmqZqmrZrmsZsmtZtmuZu ddlomvZvmwZwmxZxmyZymzZzm{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!l6mˆ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#lTm¢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« dd)l6m¬Z¬ ne­Z§d*e®d+<   	 d dl¯Z¯e¯�j`                  Z±d,Z² e&d.«      Z´ e d/«      Zµ e d0«      Z¶ e d1«      Z·e¸e,z  Z¹d*e®d2<   e¸eºz  e,z  Z»d*e®d3<   e9�jx                  �jz                  e9�jx                  �j|                  z  Z¿d*e®d4<    e�j€                  eÁ«      ZÂ ej*                  e	�j†                  d5¬6«      ZÃe9�j>                  �jˆ                  ZÄ	 e!e¸d7eÅeÆd7f   d8d9ee!e¸eÅeÆd7f   d7d8d9f   dz     f   ZÇd*e®d:<   �d;d;„ZÈ e�j’                  d,¬<«       G d=„ d>«      «       ZÊ�d<d?„ZË�d=d@„ZÌ�d>dA„ZÍ�d>dB„ZÎ	 	 	 	 	 	 �d?dC„ZÏg dD¢ZÐg dE¢ZÑ	 �d@	 	 	 	 	 �dAdF„ZÒ�dBdG„ZÓ	 �d@	 	 	 	 	 �dAdH„ZÔe�dC�dDdI„«       ZÕe	 �dC	 	 	 	 	 �dEdJ„«       ZÕ	 �dC	 	 	 	 	 �dFdK„ZÕ	 	 	 	 �dGdL„ZÖ	 	 	 	 �dHdM„Z×�dIdN„ZØ�dIdO„ZÙ�dJdP„ZÚ	 	 	 	 	 	 	 	 �dKdQ„ZÛ	 	 	 	 	 	 �dLdR„ZÜ�dMdS„ZÝ�dNdT„ZÞdU„ Zß G dV„ d9«      Zà e•d-¬<«       G dW„ dX«      «       Záe• G dY„ dZeà«      «       Zâ�dOd[„Zãe• G d\„ d]eâ«      «       Zäe• G d^„ d_eä«      «       Zå eÌd`«       eÌda«       eÌdb«       eÌdc«       eÌdd«       eÌdd«       eÌde«      dfœZædge®dh<   	 �dP	 	 	 	 	 	 	 �dQdi„Zçe• G dj„ dkeâ«      «       Zèd e-d «      f	 	 	 	 	 	 	 �dRdl„Zéeee,   ee,   ge f   Zêd*e®dm<    G dn„ doeè«      Zë G dp„ dqeë«      Zì G dr„ dseë«      Zíe• G dt„ dueâ«      «       Zîe• G dv„ dweî«      «       Zïe• G dx„ dyeâ«      «       Zð�dSdz„Zñ�dSd{„Zò	 	 	 	 	 �dT	 	 	 	 	 	 	 	 	 	 	 	 	 �dUd|„Zó	 	 	 	 	 	 �dVd}„Zô�dWd~„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	 	 	 	 	 	 �dXd—„�Z�dYd˜„�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àer«      «       �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!	 	 	 	 �dZdÏ„�Z" e•d-¬<«       G dÐ„ dÑ�e«      «       �Z# G dÒ„ dÓ�e#«      �Z$ G dÔ„ dÕ�e$«      �Z% e•d-¬<«       G dÖ„ d×�e#«      «       �Z& e•d-¬<«       G dØ„ dÙ�e&«      «       �Z' G dÚ„ dÛ�e'«      �Z( G dÜ„ dÝ�e&«      �Z) G dÞ„ dß�e«      �Z* G dà„ dá�e&«      �Z+ G dâ„ dã�e+«      �Z, G dä„ då�e+«      �Z- G dæ„ dç�e&«      �Z. G dè„ dé�e&«      �Z/ G dê„ dë�e&«      �Z0 G dì„ dí�e&«      �Z1 G dî„ dï�e&«      �Z2 G dð„ dñ�e2«      �Z3 G dò„ dó�e)«      �Z4 G dô„ dõ�e&«      �Z5 G dö„ d÷�e&«      �Z6 G dø„ dù�e'«      �Z7 G dú„ dû�e&«      �Z8 G dü„ dý�e&«      �Z9 G dþ„ dÿ�e&«      �Z: G �d „ �d�e&«      �Z; e•d-¬<«       G �d„ �d«      «       �Z< G �d„ �d�e)«      �Z= e•d-¬<«       G �d„ �d�e=«      «       �Z> G �d„ �d	�e=«      �Z?e• G �d
„ �d�e«      «       �Z@ G �d„ �d�e&«      �ZA G �d„ �d�eA«      �ZB G �d„ �d�eA«      �ZC�d[�d„�ZD G �d„ �d�e=«      �ZEe�j’                   G �d„ �deà«      «       �ZF G �d„ d7�eF«      �ZG G �d„ �d�eF«      �ZH e•d-¬<«       G �d„ �deà«      «       �ZI�d\�d„�ZJ e•d-¬<«       G �d„ �d�e&«      «       �ZK e•d-¬<«       G �d„ �d �e&«      «       �ZL	 	 	 	 �d]�d!„�ZM e•d-¬<«       G �d"„ �d#�e&«      «       �ZN G �d$„ �d%�e=«      �ZO G �d&„ �d'eà«      �ZPe• G �d(„ �d)�eP«      «       �ZQe• G �d*„ �d+�eP«      «       �ZRe• G �d,„ �d-�eP«      «       �ZSe• G �d.„ �d/�eP«      «       �ZT G �d0„ �d1�e=«      �ZU G �d2„ �d3�eU«      �ZV G �d4„ �d5�eU«      �ZW G �d6„ �d7�eU«      �ZX�d^�d8„�ZY�d^�d9„�ZZ�d_�d:„�Z[y# e³$ r dZ±d-Z²Y �	ŒKw xY w(`  é    )ÚannotationsN)ÚCallableÚ	GeneratorÚIterableÚIteratorÚSequence)ÚAbstractContextManagerÚnullcontext)ÚEnum)Úpartial)ÚAnyÚcastÚClassVarÚLiteralÚoverloadÚSupportsFloatÚSupportsIntÚTYPE_CHECKINGÚ	TypeAliasÚTypeVarÚUnion)Úassert_neverÚNeverÚoverrideÚ	ParamSpecÚSelfÚTypeIs)Úpatch)ÚExprÚIntegerÚSymbol)Ú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Ú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   rw   TFÚ_PÚ_TÚ_UÚ_VÚ_IntLikeÚ_NumLikeÚ_OpOverloadsz  ©ÚprefixÚ	TensorBoxr!   ÚIRNodeÚ_NodeOrNodesc                ó.   — t        | t        t        f«      S ©N)Ú
isinstanceÚintr    ©Úxs    úQ/var/www/html/ia-enhanced/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_inputsz0dict[str, IRNode | sympy.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/   … ð ,Ó+ð BÓAØÓð (Ó'ØÓð Ô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ˆ   )Úgetattrrq   )ÚargsÚkwargsÚnames     €r�   Úfnzops_wrapper.<locals>.fn  s   ø€ Ø!Œw”s˜DÓ! 4Ð2¨6Ñ2Ð2r�   )r¿   ÚobjectrÀ   rÃ   r¸   rr   )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>.reindex.  s   ø€ Ù™ ›Ó(Ð(r�   )rË   rÑ   r¸   zSequence[_V]r¢   )rÚ   rÛ   rÎ   s   `` r�   Úfuse_reindexingrÜ   *  s   ù€ ö)ð €Nr�   )é   r   é   rE   )é   r   rÝ   rÞ   rE   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>>  s    è ø€ ÒQÈ¤
¨1¬s´E·M±MÐ.B× CÑQùó   ‚*,)Úallr[   r\   )ÚseqÚ	shape_envÚ
sorted_idxs      r�   Úget_fill_orderrì   8  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ó   F  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ø   R  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ü   _  s   € ØRUr�   c                 ó   — y rˆ   r¢   rú   s     r�   rü   rü   c  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)rs   ÚgraphÚsizevarsÚoptimization_hintr"   Úget_sizeÚis_storage_and_layoutÚ
get_layoutr   ÚFlexibleLayoutÚcontiguous_stridesÚ	get_dtypeÚ
get_devicera   rê   Úsuppress_guardsÚtorchÚempty_stridedÚzero_)	rŒ   rû   Úshape_fnrå   rÿ   r   r  r  Úts	            r�   rü   rü   i  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ÚtritonTFrE   )ÚTritonScheduling)	r  r¾   rF   rJ   Ú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¬   ÚEqrB   )rä   rå   Ú	alignments     €r�   ræ   z-is_aligned_realized_tensor.<locals>.<genexpr>Ä  s#   øè ø€ Ò	F¨QŒ%�(‰(”3�q˜)Ó$ a×
(Ñ	Fùs   ƒ*-éÿÿÿÿrE   )r‰   r…   Úmaybe_get_strider4   Ú
get_strider  r¬   ÚAndÚOrr,  ÚLers   r  r  Úguard_or_false)rŒ   r-  Úaligned_stridesÚaligned_last_dimÚ
is_aligneds    `   r�   Úis_aligned_realized_tensorr8  º  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 .
    rE   FT)	rÉ   rÒ   rs   r  r  Ústatically_known_leqr4  r¬   r,  )Ústrides1Ústrides2ÚshapeÚdimÚs1Ús2s         r�   Úsignificant_strides_equalrA  Ï  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ˆ   ©rs   r  r  Ústatically_known_equals©rä   r?  r@  s      r�   ræ   z2try_match_insignificant_strides.<locals>.<genexpr>î  s3   è ø€ ò áˆB�ô 	
�‰×Ñ×0Ñ0°°R×8ñùó   ‚79rE   ©ÚdataÚlayout)r  rè   rÒ   r0  rA  r  Úas_storage_and_layoutr   rî   rs   r  r  r:  ÚFixedLayoutr  r  rÿ   ÚoffsetÚ	is_pinnedr„   ÚReinterpretView)ÚtensorÚstridesÚstorageÚ
old_layoutÚ
new_striderÌ   rå   Ú
new_layouts           r�   Útry_match_insignificant_stridesrV  á  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_stridesrb    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  r0  r¥   )ÚinputsÚsym_varsÚinps      r�   Úget_symbolic_inputsri    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„   rI  ÚBaseViewÚunwrap_viewÚ
StorageBoxÚBufferÚget_namer‹   s    r�   Útry_get_namerp    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"                  dPd„«       «       Zeej"                  	 	 	 	 dQd„«       «       ZedRd„«       ZdSd„ZdTd„ZdUd„ZdVd„ZdWd„ZdXd„ZdYd„ZdZd„ZdVd„Zd[d\d„Z	 d]	 	 	 	 	 	 	 d^d „Zd_d!„Z d`d"„Z!dad#„Z"dbd$„Z#dcd%„Z$ddd&„Z%ded'„Z&dfd(„Z'dgd)„Z(e)dhd*„«       Z*did+„Z+ded,„Z,djd-„Z-dkdld.„Z.dmd/„Z/dnd0„Z0ded1„Z1dod2„Z2dpd3„Z3dqd4„Z4dgd5„Z5drd6„Z6djd7„Z7ded8„Z8dkdsd9„Z9dtd:„Z:dUd;„Z;dSd<„Z<dUd=„Z=	 du	 	 	 	 	 dvd>„Z>dwd?„Z?dxd@„Z@	 du	 	 	 	 	 dydA„ZAdzdB„ZBd{dC„ZCd|dD„ZDd}dE„ZE	 du	 	 	 d~dF„ZFdjdG„ZGdfdH„ZHdedI„ZIdedJ„ZJddK„ZKd€dL„ZLdrdM„ZMd€dN„ZNeOr
e)d_dO„«       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…   rr  )rv  Úolds     r�   Úcurrent_originszIRNode.current_origins:  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…   rs  )r}  r  s     r�   Úcurrent_stream_idxzIRNode.current_stream_idxD  s3   è ø€ ô
 ×(Ñ(ˆØ%/ŒÔ"ð	-Ûà),ŒFÕ&ø¨ŒFÕ&üs   ‚?Ÿ/ £?¯<¼?c                óL   — t        | t        t        t        t        t
        f«      S rˆ   )r‰   ÚComputedBufferÚInputsKernelÚInputBufferrO  ÚTemplateBuffer)rµ   s    r�   Úis_realized_nodezIRNode.is_realized_nodeP  s&   € äØäÜÜÜÜðó	
ð 		
r�   c                ó,   — t         j                  | «      S rˆ   )r„   Úcreate©Úselfs    r�   Úwrap_for_loweringzIRNode.wrap_for_lowering]  s   € Ü×Ñ Ó%Ð%r�   c                ó2   — t         j                  | ||«       y rˆ   )rÃ   Ú__setattr__)rŒ  Úattrr  s      r�   Ú_post_init_setattrzIRNode._post_init_setattr`  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 )Nrv  rx  rz  r   r}  )r>   rr  r‘  rF   Údebug_ir_tracebackrx  Úformat_stackrs  )rŒ  rv  s     r�   Ú__post_init__zIRNode.__post_init__f  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>r  ó   è ø€ Ò? s˜#Ÿ(�(Ñ?ùó   ‚©r>   Ú	get_readsr‹  s    r�   Úget_read_nameszIRNode.get_read_namesq  ó   € ÜÑ?¨d¯n©nÓ.>Ô?Ó?Ð?r�   c                ó   — | j                   S rˆ   )rx  r‹  s    r�   Úget_tracebackzIRNode.get_tracebackt  s   € Ø�~‰~Ðr�   c                ó   — | j                   S rˆ   ©rz  r‹  s    r�   Úget_origin_nodezIRNode.get_origin_nodew  ó   € Ø×ÑÐr�   c                 ó   — y rˆ   r¢   r‹  s    r�   Úget_defining_opzIRNode.get_defining_opz  ó   € Ø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>   rv  r‰   ÚExternKernelr¥  rz  Úhasattrr®  Úaddr  Ú	_inductorÚdebugÚ _inductor_post_to_pre_grad_nodesÚgetrÁ   r¥   Ú#_inductor_pre_grad_node_stack_trace)rŒ  Ústack_tracesrv  rz  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�   c                ó  — 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=rv  Ú é@   é=   z...zstack_traces = {ú
ú})r¾   rÉ   r»  ÚappendÚsplit)rŒ  Úshortenrv  Ú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�   r=  zIRNode.shapeå  s   € à�}‰}‹Ðr�   c                ó4   — t        | j                  «       «      S rˆ   )rn   r  r‹  s    r�   Ú	get_numelzIRNode.get_numelé  s   € Ü˜TŸ]™]›_Ó-Ð-r�   c                ó˜   — t         j                  j                  j                  t	        j
                  | j                  «       d«      «      S ©Nr   ©rs   r  r  Ústatically_known_truer¬   r,  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�   r0  zIRNode.get_stride  r  r�   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrˆ   )r0  rÔ  r‹  s    r�   r/  zIRNode.maybe_get_stride  rÜ  rÖ  c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   ro  zIRNode.get_name  r  r�   c                óB   — 	 | j                  «       S # t        $ r Y y w xY wrˆ   )ro  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ý  )ro  rs   r  Úgraph_inputsrÔ  r‹  s    r�   Úis_input_bufferzIRNode.is_input_buffer'  s4   € ð	Ø—=‘=“?¤a§g¡g×&:Ñ&:Ð:Ð:øÜ"ò 	Ùð	ús   ‚), ¬	8·8c                 ó   — yrý  r¢   ©rŒ  Ú	thresholds     r�   Úhas_large_inner_fnzIRNode.has_large_inner_fn-  rÿ  r�   c                 ó   — y rˆ   r¢   ©rŒ  Úuserss     r�   Ú
mark_reusezIRNode.mark_reuse0  ó   € Ør�   c                 ó   — y rˆ   r¢   r‹  s    r�   Úrealize_hintzIRNode.realize_hint3  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   rl  zIRNode.unwrap_view6  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úfreeze_layoutzIRNode.freeze_layout9  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  ©rŒ  rÓ   Úallow_paddings      r�   Úfreeze_layout_with_stride_orderz&IRNode.freeze_layout_with_stride_order<  ó   € ô "¤$ 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_orderA  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  ©rŒ  r   s     r�   Úfreeze_layout_with_same_orderz$IRNode.freeze_layout_with_same_orderD  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  ©rŒ  Úexact_stridesr  s      r�   Ú freeze_layout_with_exact_stridesz'IRNode.freeze_layout_with_exact_stridesG  r   r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úget_read_writeszIRNode.get_read_writesL  r  r�   c                ó6   — | j                  «       j                  S rˆ   ©r,  Úreadsr‹  s    r�   rž  zIRNode.get_readsO  ó   € Ø×#Ñ#Ó%×+Ñ+Ð+r�   c                ó4   — t        | j                  «       «      S rˆ   )rÉ   rž  r‹  s    r�   Ú	num_readszIRNode.num_readsR  s   € Ü�4—>‘>Ó#Ó$Ð$r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úget_storage_numelzIRNode.get_storage_numelU  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  ©rŒ  re  s     r�   Úget_free_symbol_useszIRNode.get_free_symbol_usesX  r   r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úget_reduction_typezIRNode.get_reduction_type]  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úget_reduction_sizezIRNode.get_reduction_size`  r  r�   c                 ó   — yrý  r¢   r‹  s    r�   Ú	is_externzIRNode.is_externc  rÿ  r�   c                 ó   — yrý  r¢   r‹  s    r�   Úis_no_opzIRNode.is_no_opf  rÿ  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  rú  s     r�   Úconstant_to_devicezIRNode.constant_to_devicei  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úget_mutation_nameszIRNode.get_mutation_namesl  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úget_operation_namezIRNode.get_operation_nameo  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r‹  s    r�   Úget_inputs_that_alias_outputz#IRNode.get_inputs_that_alias_outputr  r  r�   c                 ó   — y rˆ   r¢   r‹  s    r�   r  zIRNode.dtypew  s   € Ø(+r�   )rv  zOrderedSet[Node]r¸   úGenerator[None, None, None])r}  r|  r¸   rI  ©rµ   r…   r¸   r™   ©r¸   r…   )r�  rÄ   r  r   r¸   r¹   ©r¸   r¹   ©r¸   úOrderedSet[str])r¸   rw  ©r¸   ry  ©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[Expr])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¸   úSequence[_IntLike]©r¸   rÄ   ©r  r|  r¸   r™   ©r  rŠ   r¸   r¹   ©F©rÓ   úSequence[int]r  r™   r¸   r¹   ©rÓ   ro  r¸   r¹   ©r   ri  r¸   r¹   ©r)  ri  r  r™   r¸   r¹   ©r¸   údependencies.ReadWrites©r¸   zOrderedSet[Dep]©r¸   rŠ   ©r¸   r   ©re  r™   r¸   r“   ©r  rc  r¸   r…   ©r¸   rS  )Qrž   rŸ   r    Ú__doc__r>   rr  r¡   rs  ÚdataclassesÚfieldrv  rx  rz  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æ  Úpropertyr=  rë  rð  ró  r÷  r  rû  rþ  r  r  r0  r/  ro  r
  r  r  r  r  rl  r  r  r#  r&  r*  r,  rž  r2  r4  r7  r9  r;  r=  r?  rA  rC  rE  rG  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óóôóóó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 ©Nrz  )r±  rz  r‹  s    r�   r¥  zOperation.get_origin_node„  s   € Ü�t˜]Ô+Ð+Ð+Ø×ÑÐr�   c                ó6   — t        | d«      sJ ‚| j                  S )Nrv  )r±  rv  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�   rE  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�   r=  zOperation.is_externœ  rÿ  r�   c                 ó   — yrý  r¢   r‹  s    r�   r?  zOperation.is_no_opŸ  rÿ  r�   c                ó   — t         ‚rˆ   rˆ  r‹  s    r�   r,  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ˆ   r.  r‹  s    r�   rž  zOperation.get_reads«  r0  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=   r6  s     r�   r7  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�   NrL  r`  rO  )r¸   ru  )r¸   r|  rj  )r¸   r{  )r•  r{  r¸   r¹   rX  rs  )rÁ   rÄ   r¸   r™   rM  ru  ©r¸   úlist[Buffer]©r¸   r“   rm  rx  rv  )rž   rŸ   r    r•  r  r¥  r�  r�  rE  r“  r–  r=  r?  r,  rœ  rŸ  rž  r¡  r£  r7  r§  r¢   r�   r�   rƒ  rƒ  {  sr   „ ó2ó"ó óóó#ó$ó'óóó"ó-ó@ó,ó"óð %*ðØ!ðà	!óô0r�   rƒ  c                  óF  — e Zd ZU 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d/d„Zd0d„Zd%d„Zd1d„Zd2d„Zy)3ÚLoopsrc  r  rU  r  úCallable[..., Any]Úinner_fnri  Úrangesc                ó€   ‡—  t        «       j                  g ˆfd„| j                  D «       ¢| j                  ‰«      ‘­Ž S )Nc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrˆ   r&   ©rä   Úere  s     €r�   ræ   z-Loops.get_free_symbol_uses.<locals>.<genexpr>à  s   øè ø€ ÒF°QÔ˜q -×0ÑFùó   ƒ)r>   Úunionr¯  Úinner_fn_free_symbolsr6  s    `r�   r7  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¾   rz  )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 )Nrz  rx  )Úpopr‘  rx  r„   rŠ  )Úclsr¿   rÀ   rz  Ú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 ©NrE   )rî   r¬   ÚSÚZerorm   )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)
rT   rs   Ú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_args  s   € Ø—‘˜DŸK™KÓ(Ð*Ð*r�   c                ór   — t        j                  j                  | j                  g| j	                  «       ¢­Ž S rˆ   )rs   ÚKernelFormatterHandlerÚir_to_stringr®  rÛ  r‹  s    r�   r»  zLoops.inner_fn_str   s3   € ä×'Ñ'×4Ñ4Ø�M‰Mð
Ø ×.Ñ.Ó0ò
ð 	
r�   Nc                óx   — |€d}t        |t        j                  «      }| j                  «       j                  |kD  S rí  )ÚmaxrF   Úrealize_opcount_thresholdrÞ  Únum_opsr  s     r�   r  zLoops.has_large_inner_fn&  s9   € ØÐØˆIÜ˜	¤6×#CÑ#CÓDˆ	Ø×$Ñ$Ó&×.Ñ.°Ñ:Ð:r�   c                óh   — | j                  | j                  «      }t        | j                  ||¬«      S ©Nrd  )rÕ  r¯  rN   r®  )rŒ  re  rË   s      r�   r¶  zLoops.inner_fn_free_symbols,  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¯  rQ   rs   rÚ  r®  Úusages)rŒ  ÚsymbolrË   Úhandlers       r�   Úcollect_inner_fn_symbol_usagez#Loops.collect_inner_fn_symbol_usage1  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	  r9  rP   r  r  r;  r/  r‹  s    r�   rž  zLoops.get_reads:  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_namesH  s   € Ü˜$×/Ñ/Ó1×>Ñ>Ó?Ð?r�   c                óH   — t        | j                  «       j                  «      S rˆ   )rÉ   rÞ  rð  r‹  s    r�   r2  zLoops.num_readsK  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�   r;  zLoops.get_reduction_sizeN  ó   € Ü!Ø9¼$¸t»*¸ÀQÐGó
ð 	
r�   c                ó2   — t        dt        | «      › d�«      ‚)Nz+get_reduction_type() is not implemented by rØ  rÙ  r‹  s    r�   r9  zLoops.get_reduction_typeS  ró  r�   c                ó2   — t        dt        | «      › d�«      ‚)Nz+constant_to_device() is not implemented by rØ  rÙ  rú  s     r�   rA  zLoops.constant_to_deviceX  ró  r�   rm  rx  )r¼  rS  r¸   rÄ   rj  r`  rO  rY  )r¿   r   rÀ   r   r¸   r„   )r¯  ri  rƒ   rD   r¸   rZ  )r¸   rU   ©r¸   zSequence[Sequence[_IntLike]]rˆ   rk  ©re  r™   r¸   úOrderedSet[Symbol])rë  r!   r¸   rN  ru  rM  rv  r]  ry  ) rž   rŸ   r    r¡   r^   r7  r½  rÂ  Ú__repr__r  r¥  r  rÊ  ÚclassmethodrŠ  r~  rD   ÚINDEXrÕ  r]   rÞ  rÛ  r»  r  r¶  rí  rž  rŸ  r2  r;  r9  rA  r¢   r�   r�   r¬  r¬  Ô  sô   … àÓØÓØ Ó ØÓá˜GÓ$à$)ð
Ø!ð
à	!ò
ó %ð
ó	
ó)ð €Hóó óóð ò	#ó ð	#ð Ø:>¿*¹*ó 
ó ð
ð ò(ó ð(ó+ð ò
ó ð
ô
;ôWó
óó@ó9ó
ó

ô

r�   r¬  c               ó„   — |j                   rt        j                  t        d«      |«      S t        j                  d|«      S )NÚnanr   )Úis_floating_pointrq   ÚconstantÚfloat)rï   r  s     r�   Únop_loader_fnr  ^  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_loaderg  s)   € à× Ñ Ô"Üœ=°·
±
Ô;Ð;à�}‰}Ðr�   c                ó$   — | j                  d«      S r¿  rÁ  r‹  s    r�   rÂ  zPointwise.__str__n  rÃ  r�   c                ó   — g S rˆ   r¢   r‹  s    r�   r;  zPointwise.get_reduction_sizes  s   € Øˆ	r�   c                 ó   — y rˆ   r¢   r‹  s    r�   r9  zPointwise.get_reduction_typev  r©  r�   c                óp   — | j                  «       }t        j                  |xs d ||«       ||«      «      S ©NÚunnamed)r  rq   Ústore©rŒ  Úoutput_nameÚindexerÚvarsÚloaders        r�   Ústore_outputzPointwise.store_outputy  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�   rA  zPointwise.constant_to_device‚  sK   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;ô	
ð 	
r�   Nrd  rj  )r¸   zSequence[sympy.Expr]r]  )r  r^  r  ú!Callable[[Sequence[Expr]], Never]r  rZ  r¸   r¹   ry  )
rž   rŸ   r    r  rÂ  rù  r;  r9  r  rA  r¢   r�   r�   r  r  e  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)
ÚScatterrg  Úoutput_indexerNrW   Ú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�   rA  zScatter.constant_to_device“  s]   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;Ø×.Ñ.Ø×*Ñ*ô
ð 	
r�   c                ó¦   — | j                  «       }|€d}t        j                  | || j                  |«      «       ||«      | j                  ¬«      S )Nr  )Úmode)r  rq   r  r  r  r  s        r�   r  zScatter.store_output   sT   € ð ×!Ñ!Ó#ˆØÐØ#ˆKÜ�y‰yØÙ�D×'Ñ'¨Ó-Ó.Ù�4‹LØ×"Ñ"ô	
ð 	
r�   ry  )r  r^  r  r  r  rZ  r¸   r   )rž   rŸ   r    r¡   r  rA  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Úargminc                óÊ  •— | \  }}|\  }}‰dk(  rt        j                  ||«      }nt        j                  ||«      }t        j                  ||«      }t	        ‰«      r€t        j
                  ||«      }t        j
                  ||«      }	t        j                  |t        j                  ||	«      «      }t        j                  |t        j                  ||	«      «      }‰rt        j                  ||«      nt        j                  ||«      }
t        j                  |t        j                  ||
«      «      }t        j                  |||«      t        j                  |||«      fS )Nr1  )	rq   ÚltÚgtÚeqr.   Úner"  Úlogical_andÚwhere)ÚaÚbÚa_valueÚa_indexÚb_valueÚb_indexÚmaskÚequalÚa_isnanÚb_isnanÚtieÚarg_break_ties_leftr  Úreduction_types              €€€r�   Úargmax_combine_fnz3get_reduction_combine_fn.<locals>.argmax_combine_fnÄ  s  ø€ ð  !ÑˆG�WØ ÑˆG�Wà Ò)Ü—v‘v˜g wÓ/‘ä—v‘v˜g wÓ/�ä—F‘F˜7 GÓ,ˆEÜ˜eÔ$ÜŸ&™& ¨'Ó2�ÜŸ&™& ¨'Ó2�Ü—~‘~ d¬C¯F©F°7¸GÓ,DÓE�ÜŸ™ u¬c¯o©o¸gÀwÓ.OÓP�ñ 'ô —‘�w Ô(ä—V‘V˜G WÓ-ð ô
 —>‘> $¬¯©¸¸sÓ(CÓDˆDä—	‘	˜$ ¨Ó1Ü—	‘	˜$ ¨Ó1ðð r�   Úwelford_combinec                ól   — | \  }}}|\  }}}||z
  }||z   }	||	z  }
|||
z  z   ||z   ||z  |z  |
z  z   |	fS rˆ   r¢   )r9  r:  Ú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å  sm   € ð &'Ñ"ˆF�D˜(Ø%&Ñ"ˆF�D˜(à˜V‘OˆEØ! HÑ,ˆJØ  :Ñ-ˆIà˜ Ñ*Ñ*Ø�t‘˜e e™m¨hÑ6¸ÑBÑBØðð r�   zunknown reduction_type=)r9  útuple[object, object]r:  rS  r¸   útuple[OpsValue, OpsValue])r9  ú#tuple[OpsValue, OpsValue, OpsValue]r:  rU  r¸   rU  )r-  rÔ  )rE  r  rD  rF  rR  s   ```  r�   Úget_reduction_combine_fnrV  ¼  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Ú	Reductionri  Úreduction_rangesrV   rE  rU  Ú	src_dtyperZ   Úreduction_hintc                ó$   — | j                  d«      S )N)r¯  rY  rE  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>  s   øè ø€ ÒP°QÔ˜q -×0ÑPùr´  )Úsuperr7  r>   rµ  rY  ©rŒ  re  Ú	__class__s    `€r�   r7  zReduction.get_free_symbol_uses  s:   ù€ ä‰wÑ+¨MÓ:Ð=O¼Z»\×=OÑ=OÛP¸$×:OÑ:OÔPð>
ñ 
ð 	
r�   c                ó   — | j                   S rˆ   )rY  r‹  s    r�   r;  zReduction.get_reduction_size  s   € Ø×$Ñ$Ð$r�   c                ó   — | j                   S rˆ   )rE  r‹  s    r�   r9  zReduction.get_reduction_type  ó   € Ø×"Ñ"Ð"r�   c           	     óÒ   — t        j                  | j                  | j                  | j                  | j                  ||«      «      }t        j                  |xs d ||«      |«       y r
  )rq   Ú	reductionr  rZ  rE  r®  Ústore_reduction)rŒ  r  r  r  Úreduction_varsr  s         r�   rg  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¯  rY  r‹  s    r�   Úindex_lengthzReduction.index_length#  s!   € Ü�4—;‘;Ó¤# d×&;Ñ&;Ó"<Ñ<Ð<r�   c                ó”   — | j                  | j                  «      }| j                  | j                  t        j                  «      }||fS rˆ   )rÕ  r¯  rY  rD   ÚR0_INDEX)rŒ  rË   Úrindexs      r�   rÛ  zReduction.inner_fn_args&  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¯  rY  rD   rl  rN   r®  )rŒ  re  rË   rm  s       r�   r¶  zReduction.inner_fn_free_symbols+  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¯  rY  rE  rZ  r[  )r  r   rÃ   r  rX  r  r¯  rY  rE  rZ  rZ   ÚDEFAULTr  s      r�   rA  zReduction.constant_to_device2  sm   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—*‘*ØØ—;‘;Ø!×2Ñ2Ø×.Ñ.Ø—n‘nÜ(×0Ñ0ô	
ð 		
r�   Nc	           
     ó0  — |t        |«      g}	t        j                  j                  j	                  |	«      st
        j                  dfS t        j                  j                  j                  |«      }
t        j                  j                  j                  t        |«      «      }|dk(  xsG t        j                  j                  | t        j                  «       xr |dvxr t        j                  }|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+        |t,        «      rœt/        j0                  t2        d
d«      5  t5        |«      \  }}d d d «       �h�ft        j                  j                  j7                  t        ||z   «      «      }|
|k(  r,t8        j;                  d|||||«       t
        j(                  dfS t
        j(                  |fS |
|k  s||dz  dz  k\  rt
        j                  dfS t=        | |||||dk7  r|nd|t
        j                  ¬«      }dd„} ||«      \  }}|r ||«      \  }}t?        |«      dk(  rt
        j                  dfS tA        jB                  |jE                  «       |jG                  «       «      \  \  }}}d}d}|D ]�  }t        j                  j                  jI                  ||«      } t        j                  j                  jK                  | |tM        |jO                  «       «      «      }!tQ        d„ |!D «       «      }"|"r|dz  }Œ‰|dz  }Œ� ||kD  rt
        j(                   ||
|«      fS t
        jR                   ||
|«      fS # 1 sw Y   �ŒxY w)NrE   Úscanr/  r+  é    T)Úinner_reductionFc                 ó   — yrÑ  r¢   )Úreduction_numel_hintÚ
numel_hints     r�   Úinner_reduction_splitsz4Reduction.num_splits.<locals>.inner_reduction_splitso  s   € ð r�   rØ  z°Use previous IRNode's range and reduction_ranges instead of split. current ranges: %s, current reduction ranges: %s, current split: %d, new ranges: %s, new reduction ranges: %sr.  rÞ   r*  rp  c           	     ó2  ‡	— | j                  «       }|€J ‚t        d t        || j                  «       | j	                  «       ¬«      | ¬«      }|j                  «       }|j                  €J ‚|j                  D � cg c].  } t        | t        «      rt        | t        j                  «      s| ‘Œ0 }} g }d}t        |j                  d„ ¬«      D ]Ä  Š	t        ˆ	fd„|D «       «      sŒ|j                  ‰	j                  «       ‰	j                   t"        j$                  j&                  v sŒZt"        j$                  j&                  ‰	j                      }t)        |j*                  dd «      }|j-                  «        t)        |j*                  dd «      |k7  sŒÃd}ŒÆ ||fS c c} w )	N©r  r  rÿ   ©rÁ   rJ  rI  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  óN   •K  — | ]  }|‰j                   j                  v –— Œ y ­wrˆ   )rË   r3   )rä   rÏ  Úmds     €r�   ræ   zAReduction.num_splits.<locals>.get_read_indices.<locals>.<genexpr>Â  s    øè ø€ ÒF°a�q˜BŸH™H×1Ñ1Ô1ÑFùs   ƒ"%r   T)r  r„  r	  r  r  r,  Ú
range_varsr‰   r   r¬   ÚNumberÚsortedr/  rè   rÂ  rË   rÁ   rs   r  Úname_to_bufferr¾   rJ  Údecide_layout)
rÏ  r  ÚcbÚread_writesrƒ  ÚindicesÚchangedÚbufÚoriginal_strider‚  s
            @r�   Úget_read_indicesz.Reduction.num_splits.<locals>.get_read_indices©  sh  ø€ Ø—\‘\“^ˆFØÐ%Ð%Ð%ÜØÜ%Ø!ØŸ+™+›-ØŸ™›ôð
 ôˆBð ×,Ñ,Ó.ˆKð ×)Ñ)Ð5Ð5Ð5ð %×/Ñ/öàÜ˜a¤Ô&¬z¸!¼U¿\¹\Ô/Jò ðˆJð ð
 ˆGØˆGÜ˜[×.Ñ.Ñ4DÔEò +�ÜÓF¸:ÔFÕFØ—N‘N 2§8¡8Ô,Ø—w‘w¤!§'¡'×"8Ñ"8Ò8ÜŸg™g×4Ñ4°R·W±WÑ=˜Ü*1°#·*±*¸hÈÓ*M˜Ø×)Ñ)Ô+Ü" 3§:¡:¨x¸Ó>À/ÓQØ&*™Gð+ð ˜GÐ#Ð#ùò!s   Á83Fr   c              3  ó4   K  — | ]  }|d k(  xs |dkD  –— Œ y­w)r   rE   Nr¢   rã   s     r�   ræ   z'Reduction.num_splits.<locals>.<genexpr>à  s   è ø€ Ò9¨A˜˜Q™š ! a¡%›Ñ9ùrœ  )rw  rŠ   rx  rŠ   r¸   rŠ   )rÏ  rX  r¸   ztuple[Sequence[Expr], bool])*rn   rs   r  r  Úall_unbacked_explicitly_hintedrZ   rq  r  Úhas_featurerH   ÚREDUCE_TO_SINGLE_ELEMENTrF   Úsplit_reductionsrY   rŠ  Úmulti_processor_countÚ	functoolsr   ÚchoicesÚreduction_split_factorÚINNERr‰   r„   r   rÃ   r	  rO   Ú!replace_backed_symbols_with_hintsÚlogr´  rX  rÉ   rG   Úindex_vars_squeezer  r;  Úsimplify_with_rangesÚstride_hintsr¥   Úkeysrè   ÚOUTER)#r  Ú	dst_dtyperZ  r®  r¯  rY  rE  Úreduction_numelÚ
input_nodeÚexprsrw  rx  Úshould_splitÚpropsÚnum_smÚmin_elements_per_threadry  Úouter_reduction_splitsrÃ  Ú
new_rangesÚnew_reduction_rangesÚextracted_numel_hintrÏ  rŽ  rŠ  r‹  rõ   rh  Úranges1Ú	num_outerÚ	num_innerrÌ   ÚjrQ  Úouters#                                      r�   Ú
num_splitszReduction.num_splitsA  s#  € ð !¤-°Ó"7Ð8ˆÜ�w‰w×Ñ×>Ñ>¸uÔEÜ ×(Ñ(¨!Ð+Ð+Ü Ÿw™w×/Ñ/×AÑAÀ/ÓRÐÜ—W‘W×%Ñ%×7Ñ7¼ÀfÓ8MÓNˆ
à%¨Ñ/ò 
Ü—‘×#Ñ# F¬N×,SÑ,SÓTÐTò (Øððò(ô ×'Ñ'ð 	ð ˜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ô	
ˆó!	$ñF ,¨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ó)ð ð ÷YHñ Hús   Ç-PÐPc                óú   ‡ ‡‡‡‡‡— t         j                  j                  j                  ‰«      Št	        ||«      Šdˆˆˆfd„Š|dv r1t        ‰t        j                  ‰«      «      Š	 	 	 	 	 	 dˆˆ fd„Šˆ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ä   rm  rË   Úvalue_fns     €€r�   ræ   z=Reduction._unroll_reduction_fn.<locals>.fn.<locals>.<genexpr>ý  s    øè ø€ ò àñ ˜U F×+ñùó   ƒ)r•  ÚreduceÚ	itertoolsÚproductrÊ   )rË   rŒ   Ú
combine_fnrY  rµ  s   ` €€€r�   rÂ   z*Reduction._unroll_reduction_fn.<locals>.fnú  sH   ù€ Ü×#Ñ#Øôä"+×"3Ñ"3Ø,<Ö= qœ% �(Ò=ð#ôóð ùò
 >s   «A
©r1  r0  c                ó¸   •— |D �cg c]  }t        j                  |«      ‘Œ }} ‰| |«      t        j                   ‰|«      t        j
                  «      fS c c}w rˆ   )r¬   Úexpandrq   Ú
index_exprr  Úint64)rË   rm  rÌ   Úflatten_indexr®  s      €€r�   rµ  z0Reduction._unroll_reduction_fn.<locals>.value_fn  sP   ø€ ð 4:Ö:¨aœ%Ÿ,™, q�/Ð:�Ð:á˜U FÓ+Ü—N‘N¡=°Ó#8¼%¿+¹+ÓFðð ùò ;s   †Ac                ó   •—  ‰| «      d   S rÑ  r¢   )rË   rÂ   s    €r�   r~  z0Reduction._unroll_reduction_fn.<locals>.<lambda>  s   ø€ ¡ E£¨1¡€ r�   )rË   ri  r¸   r   )rË   ri  rm  ri  r¸   rT  )rs   r  r  Úguard_int_seqrV  Ú_fixed_indexerr	  r
  )r®  rY  rE  rZ  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Ü*Ø Ü×1Ñ1Ð2BÓCóˆMð
Ø)ðØ3Eðà*öó .Ð-àˆ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_cnst2  sg   ø€ Ø¤§
¡
Ò*Ü ›9Ð$Ø×0Ò0Ü% c¬=Ô9ÐD¼4À»9ÓDÐ9Ü  ›:Ð%ä% c¬;Ô7ÐB¼¸c»ÓBÐ7Ü˜s›8�Or�   rE   )r*  r,  r)  r'  z* not supported for zero-dimension tensors!c                ó6   •— t        j                  ‰‰   ‰«      S rˆ   ©rq   rÿ  )rË   r   rE  Úrtypes_to_initss    €€€r�   Úconst_fnz"Reduction.create.<locals>.const_fnH  s   ø€ Ü—|‘| O°NÑ$CÀYÓOÐOr�   r  r»  c                ó0   •— t        j                  d‰«      S rí  rÊ  )rË   r   s    €r�   rÂ   zReduction.create.<locals>.fnV  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®  rY  s      €€r�   rÂ   zReduction.create.<locals>.fn[  s1   ø€ Ø=MÖ&N¸¤u§w¡w§|£|Ð&N�OÐ&NÙ# E¨?Ó;Ð;ùò 'Oó   †!2r+  c                ó`   •— t        ‰«      r| S | dkD  rt        | t        j                  «      S | S rÑ  )rŽ   rä  rF   Ú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�   r.  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Úiterrs   r  r†  r‰   r„  rI  r9  )Ú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�   rp  )rÇ  rÃ   r¸   zbool | float | int)rË   rŠ   r¸   rr   )rÃ  rŠ   r¸   rŠ   )rØ  r„   r¸   zComputedBuffer | None)#rs   r  r  Úsimplifyrn   r  rŠ  r¥   r‰   r    rŠ   rF   Úunroll_reductions_thresholdrj   r³   rÄ  r±  rZ   rq  r   rÃ   r	  rO   Ú!create_multilayer_existing_rangesÚcreate_multilayerr!  Úmix_order_reductionr„   rI  rX  rY  Ú_split_sizeÚ_original_inner_fnÚ_original_rangesÚ_original_reduction_ranges)rÍ  r  r   rZ  r®  r¯  rY  rE  r[  r¢  rÈ  rÌ  rÂ   ÚhintrÃ  rÔ  r©  rª  rö   Úsplit_reductionrÛ  r¡  rË  s     ` ` ``             @@r�   rŠ  zReduction.create  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ä  r0  z-infF)r(  r1  ÚinfTr   rE   )r*  r)  r+  r,  r'  Úwelford_reducerG  Úonline_softmax_reduce)r.   r   r,   r  Úiinfor(  rä  )rE  r  ÚzeroÚones       r�   Údefault_accumulatorzReduction.default_accumulatorì  sÙ   € ð Ð.Ñ.Ü˜eÔ$Ü˜V“}Ð$Ü! %Ô(Øä—{‘{ 5Ó)×-Ñ-Ð-ØÐ.Ñ.Ü˜eÔ$Ü˜U“|Ð#Ü! %Ô(Øä—{‘{ 5Ó)×-Ñ-Ð-ä(¨Ô/‰u°QˆÜ& uÔ-‰d°1ˆàØØØØØ# T¨4Ð0Ø $ d¨DÐ1Ü&+¨F£m°TÐ%:ñ	
ð ñ	ð 		r�   c                ó:   — | dk(  ryt         j                  | |«      S )Nré  r   )rX  rî  ©rE  r  s     r�   Údefault_valuezReduction.default_value  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 )Nr.  é   i   é   )rZ   rŸ  Ú
OUTER_TINY)rÃ  rx  r[  s      r�   Ú_multilayer_second_step_hintz&Reduction._multilayer_second_step_hint  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
        Nr.  rE   )
rs   r  r  rE  rë  ró  rK  rÔ  r0  rî   )rÍ  r¡  r¢  rQ  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>.bodya  s   ø€ Ù˜i©°'°Ó);Ó<Ð<r�   )r¸   rr   )rd   rq   r3  r¾  Úmasked)rË   rÐ  Úreduction_blockrý  Úindex_dtyper?  rŠ  rü  Ú
block_sizeÚdefaultr  Ú	need_maskr¡  rÎ   s         @@€€€€€€r�   Ú
wrapper_fnz5Reduction._multilayer_wrap_loader.<locals>.wrapper_fnZ  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¸   rr   )
rø  ÚViewÚdynamic_reshape_indexerrs   r  r  rï  r¬   r,  rB   )rÍ  r  rY  r¡  rÃ  r  r  r¢  Údense_indexr  r  rÎ   s    ` ` ``   @@r�   Ú_multilayer_wrap_loaderz!Reduction._multilayer_wrap_loaderE  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)rE   Nr¢   ©rä   rÏ  s     r�   ræ   zDReduction._multilayer_wrap_loader_existing_ranges.<locals>.<genexpr>y  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  rZ  r  rZ  r¸   rr   )rè   r  r  r¦   )rÍ  r  r  Úoriginal_reduction_rangesr©  rª  r  rÎ   s    ``    @r�   Ú'_multilayer_wrap_loader_existing_rangesz1Reduction._multilayer_wrap_loader_existing_rangesp  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�   Nrp  )rË   ri  rÐ  ri  r¸   rr   )r  Úfloat16Úbfloat16r   rX  rŠ  ró  r  rs   r  r  r  rn   rö  rÉ   r„   )rÍ  r  r   rZ  r  r  r  r©  rª  rE  rÃ  r[  Úintermediate_dtypeÚintermediater  rx  r  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 )r  rE   )rn   rA   rñ  r	  r  )rÍ  r  r   rZ  r®  r¯  rY  rE  rÃ  r[  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 )r  r.  )r  r  )rÍ  r  r   rZ  r®  r  r  r©  rª  rE  r[  r  s               r�   rÞ  z+Reduction.create_multilayer_existing_rangesû  sc   € ð$ ×@Ñ@ØØØ%ØØ ó
ˆ
ð ×+Ñ+ØØØØØØ%Ø+ˆoÐ+ 
Ð+Ø ØØØó
ð 	
r�   rj  rm  r÷  rY  r]  )
r  r^  r  r  r  rZ  rh  r  r¸   r¹   rv  ©r¸   zSequence[Sequence[Expr]]ry  rˆ   )r  rc  r   rU  rZ  rU  r®  zCallable[_P, OpsValue]r¯  ri  rY  ri  rE  zReductionType | Literal['scan']r¡  r   r¢  úIRNode | Noner¸   útuple[ReductionHint, _IntLike])
r®  z<Callable[[Sequence[_IntLike], Sequence[_IntLike]], OpsValue]rY  ri  rE  rÄ   rZ  rU  r¸   z(Callable[[Sequence[_IntLike]], OpsValue])r  rc  r   rU  rZ  rU  r®  r­  r¯  rZ  rY  rZ  rE  rV   r[  rZ   r¢  r"  r¸   r„   ©rE  rÄ   r  rU  r¸   ú_NumLike | Sequence[_NumLike])rÃ  r   rx  rŠ   r[  rZ   r¸   rZ   )r¡  r   r¢  r"  r¸   r|  )r  úCallable[..., OpsValue]rY  ri  r¡  r   rÃ  r   r  r   r  r%  r¢  r"  r¸   úCallable[..., object])r  ú4Callable[[Sequence[Expr], Sequence[Expr]], OpsValue]r  rZ  r  rZ  r©  úSequence[Integer]rª  r)  r¸   z@Callable[[Sequence[sympy.Expr], Sequence[sympy.Expr]], OpsValue])r  rc  r   rU  rZ  rU  r  r­  r  rZ  r  rZ  r©  ú
list[Expr]rª  úlist[Integer]rE  rV   rÃ  r   r[  rZ   r¸   r„   )r  rc  r   rU  rZ  rU  r®  r­  r¯  rZ  rY  rZ  rE  rV   rÃ  r   r[  rZ   r¢  r"  r¸   r„   )r  rc  r   rU  rZ  rU  r®  r­  r  rZ  r  rZ  r©  r+  rª  r+  rE  rV   r[  rZ   r¸   r„   ) rž   rŸ   r    r¡   rÂ  rù  r^   r7  r;  r9  rg  rj  rÛ  r¶  rA  r~  r±  rÄ  rú  rZ   rq  rŠ  rî  rñ  rö  rø  r	  r  r  rß  rÞ  Ú__classcell__©ra  s   @r�   rX  rX  û  s÷  ø… à(Ó(Ø!Ó!àÓØ!Ó!óNð €Há˜KÓ(õ
ó )ð
ó
%ó#ðLàðLð 3ðLð ð	Lð
 )ðLð 
óLó=óô

ó
ð ð %)ðjØðjàðjð ðjð )ð	jð
 #ðjð -ðjð 8ðjð ðjð "ðjð 
(òjó ðjðX ð)ØNð)à,ð)ð ð)ð ð	)ð
 
2ò)ó ð)ðV ð )6×(=Ñ(=Ø$(ðNàðNð ðNð ð	Nð
 %ðNð ðNð )ðNð &ðNð &ðNð "ðNð 
òNó ðNð` ðØðØ$/ðà	&òó ðð> ðDØðDØ$/ðDà	&òDó ðDð ðØðØ%(ðØ:Gðà	òó ðð  ðØ&ðØ4Aðà	òó ðð> ð %)ð(à'ð(ð -ð(ð "ð	(ð
 ð(ð ð(ð /ð(ð "ð(ð 
ò(ó ð(ðT ðàDðð (ðð $2ð	ð
 &ðð 0ðð 
Jòó ðð8 ð=
àð=
ð ð=
ð ð	=
ð
 'ð=
ð (ð=
ð $2ð=
ð ð=
ð ,ð=
ð &ð=
ð ð=
ð &ð=
ð 
ò=
ó ð=
ð~ ð %)ð+
àð+
ð ð+
ð ð	+
ð
 %ð+
ð ð+
ð )ð+
ð &ð+
ð ð+
ð &ð+
ð "ð+
ð 
ò+
ó ð+
ðZ ð$
àð$
ð ð$
ð ð	$
ð
 %ð$
ð (ð$
ð $2ð$
ð "ð$
ð ,ð$
ð &ð$
ð &ð$
ð 
ò$
ó ô$
r�   rX  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ÚszrM  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Ë   ro  r¸   rŠ   r¢   )rÿ   r   rM  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 )NrE   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  s   øè ø€ ÒH¸™R  ]×3ÑHùr¶  )r¦   )rï   r;  Ú	inner_fnss   ``€r�   r  z-MultiOutputReduction.__init__.<locals>.loaderP  s   ú€ ô ÔH¸iÔHÓHÐHr�   rp  )rï   rZ  r;  rZ  r¸   ztuple[OpsValue, ...])ÚcallablerÉ   r_  Ú__init__r7  )rŒ  r  r   r<  r¯  rY  rE  rZ  r[  r7  r  ra  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
  )rq   rf  r  rZ  rE  r®  r‰   r¦   r¥   r³   r7  rg  )rŒ  r  r  r  rh  r¨   r  s          r�   rg  z$MultiOutputReduction.store_reductiona  s„   € ô —‘Ø�J‰JØ�N‰NØ×ÑØ�M‰M˜$ Ó/ó	
ˆô ˜&¤5¬$ -Ô0Ð>´$°v³,Ó>Ð0Ø�t×(Ñ(Ñ)ˆÜ×"Ñ" ;Ò#;°)¹WÀT»]ÈEÓRÐRr�   )r  rc  r   rU  r<  z#INNER_FN_TY | Sequence[INNER_FN_TY]r¯  r)  rY  r)  rE  rV   rZ  rU  r[  rZ   r7  rŠ   )
r  r^  r  r  r  rZ  rh  r  r¸   r   )rž   rŸ   r    r¡   r>  rg  r,  r-  s   @r�   r6  r6  9  s¢   ø… ØÓð#)àð#)ð ð#)ð 7ð	#)ð
 "ð#)ð ,ð#)ð &ð#)ð ð#)ð &ð#)ð õ#)ðJSàðSð 3ðSð ð	Sð
 )ðSð 
÷Sr�   r6  c                  ó^   — e Zd Zeej
                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zy)ÚOnlineSoftmaxReductionNc
           	     óˆ   ‡‡‡‡‡‡‡— t        ˆˆˆˆˆˆˆfd„t        |«      D «       «      }
|
D ]  }|j                  «        Œ |
S )z>
        Create the reduction disregarding splitting.
        c              3  ój   •K  — | ]*  }t         j                  t        ‰‰‰‰‰d ‰‰|«	      «      –— Œ, y­w)rê  N)r„   rŠ  r6  )	rä   Ú
output_idxr  r   r®  r¯  r[  rY  rZ  s	     €€€€€€€r�   ræ   z0OnlineSoftmaxReduction.create.<locals>.<genexpr>„  sI   øè ø€ ò 
ð ô ×ÑÜ$ØØØØØ$Ø+ØØ"Øó
÷ñ
ùs   ƒ03)r¦   rÊ   ró  )rÍ  r  r   rZ  r®  r¯  rY  Ú
num_outputr[  r¢  Úresultsr  s    `````` `   r�   rŠ  zOnlineSoftmaxReduction.createt  sG   þ€ ô  ÷ 
ñ 
ô $ JÓ/ô
ó 
ˆð  ò 	ˆAØ�I‰I�Kð	àˆr�   )r  rc  r   rU  rZ  rU  r®  r­  r¯  rZ  rY  rZ  rE  rŠ   r[  rZ   r¢  r"  r¸   úSequence[TensorBox])rž   rŸ   r    rú  rZ   rq  rŠ  r¢   r�   r�   rA  rA  s  s„   „ Øð )6×(=Ñ(=Ø$(ð!àð!ð ð!ð ð	!ð
 %ð!ð ð!ð )ð!ð ð!ð &ð!ð "ð!ð 
ò!ó ñ!r�   rA  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é  rG  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ï   rZ  r¸   rr   ©r  rŠ  r¥   )rÇ  r®  r  r  r¯  s   ` €€€r�   Úconstz&WelfordReduction.create.<locals>.const¬  s2   ù€ öô ×#Ñ#ØØØ!Ü˜F“|ð	 $ó ð r�   r   rE   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  rY  s      €€r�   r®  z7WelfordReduction.create.<locals>.copy.<locals>.inner_fnÅ  s1   ø€ Ø=MÖ&N¸¤u§w¡w§|£|Ð&N�OÐ&NÙ! # Ó7Ð7ùò 'OrÑ  r  rM  rN  )r  r®  r  r  r¯  rY  s   ` €€€€r�   Úcopyz%WelfordReduction.create.<locals>.copyÂ  s2   ù€ ö8ô !×'Ñ'Ø!ØØ%Ü ›<ð	 (ó ð r�   ré  c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrˆ   r¢   )rä   rÂ   rR  s     €r�   ræ   z*WelfordReduction.create.<locals>.<genexpr>Ó  s   øè ø€ Ò:¨"™T "ŸXÑ:ùó   ƒ)rE  r¡  rÝ   )rÇ  rŠ   r¸   r„   )r  r(  r¸   r„   )rF   ÚmtiaÚdisable_welford_reductionrs   r  r  rÜ  rn   r¦   rX  r±  rZ   rq  rß  rÊ   r„   rŠ  rI  ró  )rÍ  r  r  r<  r¯  rY  rE  r[  r¡  rO  ÚmeanÚm2Úweightrå  rÃ  rD  rF  r  rR  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_value	  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 )r  r   rG  c                ó0   •— t        j                  |‰«      S rˆ   rÊ  )rï   r;  r  r  s      €r�   rÿ  z4WelfordReduction.create_multilayer.<locals>.constant5	  s   ø€ ô —|‘| E¨5Ó1Ð1r�   r  rE   )r  r  r<  r¯  rY  rE  rÃ  r[  c           	   3  óL   •K  — | ]  }‰j                  |‰‰‰‰d ¬«      –— Œ y­w)r   ©r  N)r	  )rä   r  r  rÍ  r¡  rY  rÃ  s     €€€€€r�   ræ   z5WelfordReduction.create_multilayer.<locals>.<genexpr>M	  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>p	  s*   øè ø€ ò àô Ð.°q·}±}³×GÐGñùó   ƒ%()rï   rZ  r;  rZ  r  rŠ   r¸   rr   )rË   rZ  rÐ  rZ  r  re  r¸   rr   )rn   rs   r  r  rï  r¬   r,  rB   rß  r   rA   rI  rŠ  r¦   ró  r  rö  )rÍ  r  r  r<  r¯  rY  rE  rÃ  r[  r  rÿ  ÚintermediatesrÌ   rx  r  r`  r¡  s   ` `  ` `      @@@r�   rß  z"WelfordReduction.create_multilayer	  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  rc  r  rU  r<  úSequence[Callable[..., Any]]r¯  r+  rY  r+  rE  rV   r[  rZ   r¸   rG  r$  )r  rc  r  rU  r<  rd  r¯  r+  rY  r+  rE  rV   rÃ  r   r[  rZ   r¸   rG  )
rž   rŸ   r    rú  rZ   rq  rŠ  r~  rñ  rß  r¢   r�   r�   rI  rI  ™  s  „ Øð )6×(=Ñ(=ðyàðyð ðyð 0ð	yð
 ðyð (ðyð &ðyð &ðyð 
òyó ðyðv ðØðØ$/ðà	&òó ðð
 ð\
àð\
ð ð\
ð 0ð	\
ð
 ð\
ð (ð\
ð &ð\
ð ð\
ð &ð\
ð 
ò\
ó ñ\
r�   rI  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 )(ÚScanr+  Úscan_rangesrÿ   ú=Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]]rº  zFCallable[[Sequence[_IntLike], Sequence[_IntLike]], Sequence[_IntLike]]rÎ   rZ   r[  rŠ   r7  útuple[torch.dtype, ...]Údtypesútuple[Callable[..., Any], ...]r<  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´  )r_  r7  r>   rµ  rg  rÿ   r`  s    `€r�   r7  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¯  rg  rÿ   r_  r•  ©rŒ  ra  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ùrT  r  )	rÎ   r¦   r<  rq   rs  rj  rº  r  r7  )rŒ  r  r  r  Ú	scan_varsr¨   r1  rï   s          @r�   rg  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�   r9  zScan.get_reduction_type«	  s   € àr�   c                ó   — | j                   S rˆ   )rg  r‹  s    r�   r;  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¯  rg  r‹  s    r�   rj  zScan.index_length¸	  ó!   € Ü�4—;‘;Ó¤# d×&6Ñ&6Ó"7Ñ7Ð7r�   c                ó¶   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }|fS rˆ   )rÕ  r¯  rg  rD   rl  rÎ   ©rŒ  rË   rm  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¯  rg  rD   rl  rÎ   rN   r®  ©rŒ  re  rË   rm  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 )
NrE   r  r   )r  r  r®  ÚaxisÚpointwise_rangesrg  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‹  rg  s     €€€r�   rÎ   zScan.create.<locals>.reindex
  óS   ø€ Ü�z“?¤c¨+Ó&6Ò6Ð6Ð6Ü�u“:¤Ð%5Ó!6Ò6Ð6Ð6Ø>�U˜5˜D�\Ð> JÐ>°°t°u°Ð>Ð>r�   )r  r  rj  r®  r<  rÿ   r¯  rg  rº  rÎ   r[  r7  )rË   rZ  r�  rZ  r¸   r*  r¢   )rs   r  r‘  rH   ÚSCANrÉ   ÚTUPLE_REDUCTIONr  rÜ  rn   rï  r¬   r3  rÊ   r  rŠ  r±  rf  r  ÚversionÚhipÚ
has_tritonÚtriton_versionÚ	SplitScanr„   ró  )rÍ  r  rj  r<  rÿ   rŠ  rº  r[  rˆ  rÀ   r  rŒ  r7  r±  Ú	scan_typeÚsupports_splitrÎ   rF  r1  r‹  rg  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ï   r;  rŠ  r®  s     €€r�   r  z#Scan.num_splits.<locals>.wrapper_fn7
  s*   ø€ ÙÐF˜c % 4˜jÐF¨=ÐF¸3¸t¸u¸:ÐFÓGÐGr�   rs  )r  r   rZ  r®  r¯  rY  rE  r¡  )rï   rZ  r;  rZ  r¸   rr   )rX  r±  )
rÍ  r  r  r®  rŠ  r‹  rg  rº  rŒ  r  s
      ``     r�   r±  zScan.num_splits*
  s;   ù€ ö	Hô ×#Ñ#ØØØØØ#Ø(Ø!Ø&ð $ó 	
ð 		
r�   rm  r÷  rL  )
r  r^  r  z%Callable[[Sequence[_IntLike]], Never]r  rZ  rx  r  r¸   r   r]  rY  rv  rö  )r  rc  rj  ri  r<  z+tuple[Callable[[Sequence[Expr]], Any], ...]rÿ   r+  rŠ  rŠ   rº  rh  r[  rZ   rˆ  r™   rÀ   r   r¸   úSequence[TensorBox | None])r  rc  r  rU  r®  re  rŠ  rŠ   r‹  r+  rg  r+  rº  rh  rŒ  r   r¸   r#  )rž   rŸ   r    r¡   r^   r7  r•  rg  r9  r;  r  rÊ  rj  rÛ  r¶  rú  rZ   rq  rŠ  r±  r,  r-  s   @r�   rf  rf  |	  s±  ø… àÓØ
ÓØMÓMØSÓSØ!Ó!ØÓà#Ó#Ø-Ó-ñ ˜FÓ#õ
ó $ð
õ ð
àð
ð 7ð
ð ð	
ð
 $ð
ð 
ó
óó óóó8óôUð ð )6×(=Ñ(=ð`ð &*ñ`àð`ð (ð`ð ?ð	`ð
 ð`ð ð`ð Rð`ð &ð`ð #ð`ð ð`ð 
$ò`ó ð`ðD ð
àð
ð ð
ð 7ð	
ð
 ð
ð (ð
ð #ð
ð Rð
ð ð
ð 
(ò
ó ô
r�   rf  c                  ó   — e Zd Zy)r—  N)rž   rŸ   r    r¢   r�   r�   r—  r—  G
  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 )%ÚSortr+  Úsort_rangesrÿ   z:Callable[[Sequence[Expr], Sequence[Expr]], Sequence[Expr]]rÎ   rZ   r[  rŠ   r7  ri  rj  rk  r<  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>b
  rn  r´  c              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrˆ   r&   r²  s     €r�   ræ   z,Sort.get_free_symbol_uses.<locals>.<genexpr>e
  rp  r´  )r_  r7  r>   rµ  r   rÿ   r`  s    `€r�   r7  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ÿ   r_  r•  rr  s    €r�   r•  zSort.__post_init__i
  rs  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¢   rv  s     €r�   ræ   z'Sort.store_reduction.<locals>.<genexpr>u
  rw  rT  r  )
rÎ   r¦   r<  rq   Úsortrj  r¡  r¢  r  r7  )rŒ  r  r  r  rh  r¨   r1  rï   s          @r�   rg  zSort.store_reductionm
  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�   r9  zSort.get_reduction_type{
  s   € Ør�   c                ó   — | j                   S rˆ   )r   r‹  s    r�   r;  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�   rj  zSort.index_length‡
  r�  r�   c                ó¶   — | j                  | j                  «      }| j                  | j                  t        j                  «      }| j                  ||«      }|fS rˆ   )rÕ  r¯  r   rD   rl  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   rD   rl  rÎ   rN   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 )NrE   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  rj  r®  r<  rÿ   r¯  r   rÎ   r[  r7  r¡  r¢  )rË   rZ  r³  rZ  r¸   r*  r¢   )rs   r  r‘  rH   ÚSORTrÉ   r  rÜ  rn   rF   r!  Údecompose_sort_opsÚpersistent_reductionsrï  r¬   r3  rÊ   r  rŠ  r„   rŸ  ró  )rÍ  r  rj  r<  rÿ   rŠ  r¡  r¢  r[  rÀ   r  Ú
sort_numelÚis_persistent_kernelÚ
max_rblockr7  rÎ   rF  r1  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rm  r÷  rL  )
r  r^  r  rg  r  rZ  rh  rZ  r¸   r   r]  rY  rv  r!  )r  rc  rj  ri  r<  z'tuple[Callable[[list[Expr]], Any], ...]rÿ   r+  rŠ  rŠ   r¡  r™   r¢  r™   r[  rZ   rÀ   r   r¸   rœ  )rž   rŸ   r    r¡   r^   r7  r•  rg  r9  r;  r  rÊ  rj  rÛ  r¶  rú  rZ   rq  rŠ  r,  r-  s   @r�   rŸ  rŸ  L
  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)rK  rÔ  r‹   s    r�   r  r  ë
  s&   € ðÜ˜a¨Õ.ØøÜò Ùðús   ‚ �	›c                ó¢   — 	 t        | d¬«      \  }}|j                  «       r|j                  «        |j                  «       S # t        $ r Y yw xY w©NFr»  )rK  Úshould_pad_stridesÚpad_stridesÚis_contiguousrÔ  )rŒ   Ú_bufferrJ  s      r�   Ú is_contiguous_storage_and_layoutrÃ  ó
  sR   € ðÜ/°¸%Ô@‰ˆ�ð ×$Ñ$Ô&Ø×ÑÔ Ø×#Ñ#Ó%Ð%øÜò Ùðús   ‚?A Á	AÁAc                óž  — t        | t        «      rt        | j                  |||||¬«      S t        | t        «      r:t        | j                  |||||¬«      \  }}| | j                  j                  «       fS t        | t        «      r‹|rn|r0| j                  «        | j                  «       j                  «       s>J ‚|�| j                  ||¬«       n&|�| j                  ||¬«       n| j                  «        t	        | «      | j                  «       fS t        | t        «      r(t        | j                  |¬«      \  }}|| j                  fS t        ‚)zØ
    Try to simplify x into a StorageBox and a Layout.

    allow_padding only affect how we apply stride_order. When allow_padding
    is True, we have the freedom to add padding when applying the stride_order.
    ©r¼  Úwant_contiguousÚstride_orderr  r)  ©r  r»  )r‰   r„   rK  rI  rm  r  rn  r  rÁ  r  r*  r‡  rO  rJ  rÔ  )	rŒ   r¼  rÆ  rÇ  r  r)  rõ   rJ  Úbuffers	            r�   rK  rK  ÿ
  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¾  )rK  Úis_stride_orderedrÔ  )rŒ   rÇ  rÂ  rJ  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„   rm  Úis_unalignedrI  rO  rJ  rs   r  r  Ústatically_known_multiple_ofrM  re   r  rg   rn  ro  Úunaligned_buffers)rµ   rJ  Úhas_unaligned_layouts      r�   rÎ  rÎ  E  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„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)-rk  r…   rI  c                ó8   — | j                   j                  |«      S rˆ   ©rI  r7  r6  s     r�   r7  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>.indexerf  ó   ø€ Ù™ ›Ó&Ð&r�   )rï   rZ  r¸   r   )rI  r  rÖ  )rŒ  r  rÚ  rÎ   s     @@r�   r  zBaseView.make_indexerb  s/   ù€ Ø—	‘	×&Ñ&Ó(ˆØ×%Ñ%Ó'ˆö	'ð ˆr�   c                ól   ‡‡— | j                   j                  «       Š| j                  «       Šdˆˆfd„}|S )Nc                ó    •—  ‰ ‰| «      «      S rˆ   r¢   rÙ  s    €€r�   r  z$BaseView.make_loader.<locals>.loadero  rÛ  r�   rM  )rI  r  rÖ  )rŒ  r  rÚ  rÎ   s     @@r�   r  zBaseView.make_loaderk  s/   ù€ Ø—	‘	×%Ñ%Ó'ˆØ×%Ñ%Ó'ˆö	'ð ˆr�   c                ó6   — | j                   j                  «       S rˆ   )rI  r  r‹  s    r�   r  zBaseView.dtypet  s   € à�y‰y×"Ñ"Ó$Ð$r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  r  r‹  s    r�   r  zBaseView.get_layoutx  ó   € Ø�y‰y×#Ñ#Ó%Ð%r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  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ˆ   ©rI  ro  r‹  s    r�   ro  zBaseView.get_name�  ó   € Ø�y‰y×!Ñ!Ó#Ð#r�   c                ó"   — | j                  «       S rˆ   ré  r‹  s    r�   rÊ  zBaseView.get_pointwise_size„  ó   € Ø�}‰}‹Ðr�   c                ó8   — | j                   j                  |«      S rˆ   ©rI  r  r  s     r�   r  zBaseView.mark_reuse‡  ó   € Ø�y‰y×#Ñ# EÓ*Ð*r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  rþ  r‹  s    r�   rþ  zBaseView.has_exceeded_max_readsŠ  ó   € Ø�y‰y×/Ñ/Ó1Ð1r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  ró  r‹  s    r�   ró  zBaseView.realize�  ó   € Ø�y‰y× Ñ Ó"Ð"r�   c                ó8   — | j                   j                  «        y rˆ   ©rI  r  r‹  s    r�   r  zBaseView.realize_hint�  s   € Ø�	‰	×ÑÕ r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  r4  r‹  s    r�   r4  zBaseView.get_storage_numel“  ó   € Ø�y‰y×*Ñ*Ó,Ð,r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  r=  r‹  s    r�   r=  zBaseView.is_extern–  ó   € Ø�y‰y×"Ñ"Ó$Ð$r�   c                óž   — t        | j                  t        «      sJ t        | j                  «      «       ‚| j                  j	                  «       S rˆ   )r‰   rI  rk  r³   Úis_module_bufferr‹  s    r�   rü  zBaseView.is_module_buffer™  s6   € Ü˜$Ÿ)™)¤XÔ.Ð?´°T·Y±Y³Ó?Ð.Ø�y‰y×)Ñ)Ó+Ð+r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  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	  rP   r  r  r/  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‰   rk  rI  )rŒ  rŒ   s     r�   rl  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�   rA  zBaseView.constant_to_device­  sP   € à×!Ñ!Ó#ˆØH”—‘œnÐ.?ÀÓHÈÓPˆÜØØ—.‘.Ó"ØØ—=‘=“?ô	
ð 	
r�   Nrm  r÷  ©r¸   ú*Callable[[Sequence[Expr]], Sequence[Expr]]rf  rd  rT  rV  r`  rO  rj  rY  rl  rX  r]  rL  rw  rM  ru  rK  ry  )rž   rŸ   r    r¡   r^   r7  rÖ  r  r  r�  r  r  r  r¥  ro  rÊ  r  rþ  ró  r  r4  r=  rü  rŸ  rž  rl  rA  r¢   r�   r�   rk  rk  W  s’   … à
ƒLá˜JÓ'ó=ó (ð=óCóóð ò%ó ð%ó&ó&óó$óó+ó2ó#ó!ó-ó%ó,ó*óóô	
r�   rk  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©   rZ  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 sizesNr.  r   ©ÚfallbackzBroadcast failed in ExpandView(ú, z) on dimension )rs   r  r  r¬   r½  r  rÉ   r¥   rÊ   Úis_size_one_or_falser6   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   rH  )rI  rÿ   )r  r  rK  rÉ   rÿ   r¬   rÒ  rÓ  rÒ   r   rÂ  rs   r  r  r
  rL  r  r  r¥   rM  rN  rO  r©   )
rÍ  rŒ   r  rR  rS  ÚskiprT  r   rÿ   rU  s
             r�   rŠ  zExpandView.createå  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_size   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Ì   Úactualr  s     €€r�   rÎ   z*ExpandView.make_reindexer.<locals>.reindex
  sf   ø€ ô ˜˜t˜u˜Ó&ˆEÜ�u“:¤ V£Ò,Ð,Ð,Üœ3˜v›;Ó'ò ,�Ø˜!‘9 “>ä$Ÿw™wŸ|™|�E˜!’Hð,ð ˆLr�   ©rË   rZ  r¸   rZ  )r  rI  rÉ   )rŒ  ÚtargetrÎ   r  r  s      @@r�   rÖ  zExpandView.make_reindexer  sP   ù€ ð —‘“ˆØ—‘×#Ñ#Ó%ˆÜ�6‹{œS ›[Ñ(ˆð		Ø!ð		àö		ð ˆr�   N)rŒ   r…   r  ri  r¸   ri  )rŒ   r…   r  ri  r¸   rk  rY  r  )
rž   rŸ   r    r¡   r~  r  rú  rŠ  r  rÖ  r¢   r�   r�   r©   r©   ¹  sA   … à
Óàò%ó ð%ðN ò1ó ð1ó4ðà	3ôr�   r©   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)ÚPermuteViewr*  Údimsc           
     óÐ  — | j                  |«      }t        |«      t        t        t        |«      «      «      k(  sJ ‚t	        |«      r‰t        |«      \  }}t        |j                  |j                  |D �cg c]  }|j                  |   ‘Œ c}|D �cg c]  }|j                  |   ‘Œ c}|j                  |j                  «      }t        ||¬«      S t        ||¬«      S c c}w c c}w )NrH  )rI  r  )Ú_map_neg_dimsr>   rÊ   rÉ   r  rK  rL  r  r  rÿ   r   rM  rN  rO  r  )rÍ  rŒ   r  rR  rS  rÌ   rU  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Í  r  r>  s      r�   r  zPermuteView._map_neg_dims/  s)   € à@DÖE¸�s˜a’x‘¤S¨£Y°¡_Ñ4ÒEÐEùÒEs   …$c                ó  — t        | j                  | j                  «      «      t        t        t	        | j                  «      «      «      k(  sJ ‚| j
                  j                  «       }| j                  D �cg c]  }||   ‘Œ	 c}S c c}w rˆ   )r>   r  r  rÊ   rÉ   rI  r  )rŒ  rÿ   rÌ   s      r�   r  zPermuteView.get_size3  so   € Ü˜$×,Ñ,¨T¯Y©YÓ7Ó8¼JÜ”#�d—i‘i“.Ó!ó=
ò 
ð 	
ð 
ð �y‰y×!Ñ!Ó#ˆØ!%§¡Ö+˜A��Q“Ò+Ð+ùÒ+s   Á7B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>.reindexA  s   ø€ ð '*Ö* �E˜!“HÒ*Ð*ùÒ*s   †r  )rî   r  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…   r  ro  r¸   rk  )r  ro  r¸   ú	list[int]rY  r  )	rž   rŸ   r    r¡   rú  rŠ  r  r  rÖ  r¢   r�   r�   r  r    sB   … à
Óàò.ó ð.ð$ òFó ðFó,ðà	3ôr�   r  c                  óF   — e Zd Zeddœdd„«       Ze	 	 	 	 dd„«       Zdd„Zy)	ÚSqueezeViewN)r>  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   rE   zexpected squeezed size to be 1rH  )r  rK  r‰   rŠ   r³   rÉ   rÿ   rî   rÒ   r   rs   r  r  r
  rÂ  rL  r  r  rM  rN  rO  r  rŠ  r  )rÍ  rŒ   r>  rR  rS  r  rT  rÌ   rÿ   r   rU  rå   s               r�   rŠ  zSqueezeView.createK  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 )NrE   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Ë   rZ  r¸   ztuple[Expr, ...])rî   rÉ   )rÿ   rå   r  rÌ   rÎ   r*  r+  s        @@r�   ÚsqueezerzSqueezeView.squeezery  s_   ù€ ð  $Ö.˜! q¨A£v’AÐ.ˆÐ.Ü!*¨4£×;™˜˜A°A¸³F’1Ó;ˆÜ�T“ˆö	$ð ˜Ð Ð ùò /ùÛ;s   ‡
A’A¦A´Ac                ó   — t        d«      ‚)Nzuse SqueezeView.create())ÚAssertionError)rŒ  rI  s     r�   r>  zSqueezeView.__init__Š  s   € ÜÐ7Ó8Ð8r�   )rŒ   r…   r>  r|  r¸   r…   )rÿ   rZ  r¸   z>tuple[list[int], Callable[[Sequence[Expr]], tuple[Expr, ...]]])rI  r   r¸   r¹   )rž   rŸ   r    rú  rŠ  r~  r,  r>  r¢   r�   r�   r%  r%  I  sC   „ àØ48ô +Wó ð+WðZ ð!Øð!à	Gò!ó ð!ô 9r�   r%  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
)ÚGenericViewrZ  rÿ   r  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 r	  r  )rÊ   rÉ   rÿ   rm   rD   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Ï  rI  rÿ   r5  r‹  s    r�   rÂ  zGenericView.__str__Ÿ  s=   € Ø�‰Ø�Y‰Y˜% §	¡	˜{Ð+¨x¸×8HÑ8HÓ8JÐ7KÐ-LÐMó
ð 	
r�   c                ó*   —  | |t        |«      |¬«      S )N©rI  rÿ   rÎ   )r¥   )rÍ  rŒ   r  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  rj  )rŒ   r…   r  rZ  rÎ   r  r¸   rk  rY  )rž   rŸ   r    r¡   rÖ  r5  rÂ  rù  rú  rŠ  r  r¢   r�   r�   r0  r0  Ž  sp   … à
ÓØ7Ó7ðà	3óó
Gó
ð
 €HàðAàðAð !ðAð <ð	Að
 
òAó ðAôr�   r0  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½  rs   r  r  rê   Úevaluate_exprÚLt)rï   rÿ   r=  s      r�   Úhandle_negative_indexzView.handle_negative_indexº  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        | d¬«      \  }}t        |j                  |j                  |||j                  |j
                  «      }t        ||¬«      S )NT)rÆ  rH  )rK  rL  r  r  rM  rN  rO  )rh  r  rT  rR  rS  rU  s         r�   Úcreate_reinterpret_viewz,View.create.<locals>.create_reinterpret_viewÓ  sX   € ô #8¸ÈTÔ"RÑˆ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.
            r9  )r  r¥   r5   r°  Úrequire_contiguousr	  r
  )rŒ   rÎ   rÍ  rB  r  r  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Ë   r  s    €r�   Úfake_reindexz!View.create.<locals>.fake_reindexù  s   ø€ Ü˜a˜S¤3 x£=Ñ0Ó1Ð1r�   r9  Fr»  )Ú_compute_stride©Úsize_obliviousrµ   rH  )rh  r…   r  rZ  rT  rZ  r¸   rO  ©rŒ   r…   r¸   r…   )rË   r   r¸   ztuple[int, ...]) r‰   r   r³   Úresolve_negative_sizer  rs   r  r  Ústatically_known_list_equalsrÉ   r4   rÃ  r¥   r	  r
  r  rK  r   Úto_symints_or_intsÚtorch._subclasses.fake_implsrH  r±  rµ   Úexprr¬   r    rL  r  r  rM  rN  rO  )rÍ  rŒ   r  Úunbacked_symbols_in_sizesrÁ  rE  rG  rR  rS  Ú
old_strideÚold_size_symintÚold_stride_symintÚnew_size_symintrH  Únew_stride_symintrå   rT  rU  rB  r  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ð 	"ô 9¸Ó;ˆð	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 )Nr.  )rs   r  r  rÜ  r¥   rÊ   rÉ   r¬   rÒ  ÚOner@   rn   Úcheck_equals)r  r  rŒ   rÌ   s       r�   rL  zView.resolve_negative_size2  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_indexerr.  r5   Ú
IndexErrorrn   rÜ   )rÍ  r  r  Ú	dense_dimrÎ   ÚflatrÚ   rÛ   s           r�   r  zView.dynamic_reshape_indexerC  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   r.  rE   )	r¬   r,  r>  ÚGtrs   r  r  rÏ  r5   )r9  r:  r4  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�   NrE   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ˆ   )ro   )rä   rŒ   Úreplacementss     €r�   ræ   zAView._dynamic_reshape_indexer.<locals>.reindex.<locals>.<genexpr>Í  s   øè ø€ ÒH¸œ A |×4ÑHùr´  )rÉ   r§   rÒ   r¦   )rË   re  r  Ú	view_exprs    @€€r�   rÎ   z.View._dynamic_reshape_indexer.<locals>.reindexÈ  sO   ù€ ô �u“:¤ T£Ò*ÐC¬S°«Z¼¸T»Ð,CÓCÐ*Ü¤ D¨%Ó 0Ó1ˆLÜÓH¸iÔHÓHÐHr�   )r9  r   r:  r   r¸   rŠ   r  )rs   r  r  r4  rÊ   rÉ   rm   rD   ÚVIEWr¥   rÒ   rÌ  rÂ  r¬   rÒ  rÓ  rY  rX  rC   r.  ÚreverseÚinsert)r  r  r]  rb  rÌ   Ú	stack_newÚ	stack_oldÚreordering_dense_dimÚold_dimÚsize_oldÚvarÚsize_newÚvar2Ú	size_new2ÚdivisorÚmodulusÚ
dense_exprrÎ   r4  r  rf  s                     @@@r�   r[  zView._dynamic_reshape_indexerT  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…   r  rZ  r¸   r…   )r  rZ  r  rZ  r¸   ztuple[list[Expr], list[Expr]]rˆ   )r  ri  r  ri  r]  r|  r¸   ú&Callable[[Sequence[_T]], Sequence[_V]])r  rZ  r  rZ  r]  r|  r¸   r  )rž   rŸ   r    r{  r~  r?  rú  r   rŠ  rL  r  r[  r¢   r�   r�   r  r  ³  sè   „ ñð
 òó ðð Øòk5ó ó ðk5ðZ ð"Ø ð"Ø,:ð"à	&ò"ó ð"ð  ð
 !%ð	à$ðð %ðð ð	ð
 
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 )!rO  z*Pretend our storage has a different layoutrâ  rJ  c                ó¶   •— t         ‰| �  «        t        | j                  t        «      r0t
        j                  | d| j                  j                  «       «       y y )NrI  )r_  r•  r‰   rI  rk  rÃ   r�  rl  rr  s    €r�   r•  zReinterpretView.__post_init__Ø  s@   ø€ Ü‰ÑÔÜ�d—i‘i¤Ô*Ü×Ñ˜t V¨T¯Y©Y×-BÑ-BÓ-DÕEð +r�   c                óP   — | j                  | j                  | j                  g«      S rˆ   )rÏ  rI  rJ  r‹  s    r�   rÂ  zReinterpretView.__str__Ý  s&   € Ø�‰à—	‘	Ø—‘ðó
ð 	
r�   c                ó6   — | j                   j                  «       S rˆ   ræ  r‹  s    r�   ro  zReinterpretView.get_nameç  rç  r�   c                ó.   — | j                   j                  S rˆ   )rJ  r  r‹  s    r�   r  zReinterpretView.get_deviceê  s   € Ø�{‰{×!Ñ!Ð!r�   c                 ó   — y rˆ   r¢   r‹  s    r�   r¥  zReinterpretView.get_origin_nodeí  r©  r�   c                ó.   — | j                   j                  S rˆ   )rJ  r  r‹  s    r�   r  zReinterpretView.dtypeð  s   € à�{‰{× Ñ Ð r�   c                ó@   — t        | j                  j                  «      S rˆ   )r¥   rJ  rÿ   r‹  s    r�   r  zReinterpretView.get_sizeô  s   € Ü�D—K‘K×$Ñ$Ó%Ð%r�   c                ó@   — t        | j                  j                  «      S rˆ   )r¥   rJ  r   r‹  s    r�   r0  zReinterpretView.get_stride÷  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ˆ   )rJ  r  rq   Úloadro  r  rI  Úto_dtype_bitcast)rË   r  Ú
tmp_loaderrŒ  s      €r�   r  z+ReinterpretView.make_loader.<locals>.loaderû  sp   ø€ Ø—k‘k×.Ñ.Ó0ˆGÜŸ™ $§-¡-£/±7¸5³>ÓBˆJØ�{‰{× Ñ  D§I¡I§O¡OÒ3Ü×+Ñ+¨J¸¿
¹
ÀDÇIÁIÇOÁOÓTÐTà!Ð!r�   ©rË   rZ  r¸   rr   r¢   ©rŒ  r  s   ` r�   r  zReinterpretView.make_loaderú  s   ø€ õ	"ð ˆr�   c                ó6   — | j                   j                  «       S rˆ   )rJ  r  r‹  s    r�   r  zReinterpretView.make_indexer  ó   € Ø�{‰{×'Ñ'Ó)Ð)r�   c                ó   — | j                   S rˆ   ©rJ  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'   rJ  rÿ   r   rM  r6  s     r�   r7  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  )rs   r  Úwrapper_codeÚcodegen_reinterpret_viewrI  rJ  rÿ   r   rM  Ú	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�   r2  zReinterpretView.num_reads%  ó   € Ør�   rL  rj  r`  rO  rT  rY  rd  rf  rV  rm  rx  rˆ   r_  rv  )rž   rŸ   r    r{  r¡   r•  rÂ  rù  ro  r  r¥  r�  r  r  r0  r  r  r  r  r^   r7  r÷  r2  r,  r-  s   @r�   rO  rO  Ò  s•   ø… á4àƒNõFó

ð €Hó$ó"óð ò!ó ð!ó&ó(ó	ó*óóñ Ð-Ó.à$)ð
Ø!ð
à	!ò
ó /ð
ô
÷r�   rO  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 typerU  Útarget_dtypec                óì   — t        |«      r]t        |«      \  }}t        |j                  ||j                  |j
                  |j                  |j                  «      }t        ||¬«      S t        ||¬«      S )NrH  )rI  r•  )
r  rK  rL  r  rÿ   r   rM  rN  rO  r”  )rÍ  rŒ   Ú	new_dtyperR  rS  rU  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Ï  rI  r•  r‹  s    r�   rÂ  zDtypeView.__str__>  s    € Ø�‰ §	¡	¨4×+<Ñ+<Ð=Ó>Ð>r�   c                ó   — | j                   S rˆ   )r•  r‹  s    r�   r  zDtypeView.dtypeC  s   € à× Ñ Ð r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  r  r‹  s    r�   r  zDtypeView.get_sizeG  rç  r�   c                óL   ‡ ‡— ‰ j                   j                  «       Šdˆˆ fd„}|S )Nc                óz   •— t        j                   ‰| «      ‰j                  ‰j                  j                  «      S rˆ   )rq   rƒ  r•  rI  r  )rï   rÚ  rŒ  s    €€r�   r  z%DtypeView.make_loader.<locals>.loaderM  s*   ø€ Ü×'Ñ'©¨c«
°D×4EÑ4EÀtÇyÁyÇÁÓWÐWr�   rM  ©rI  r  )rŒ  r  rÚ  s   ` @r�   r  zDtypeView.make_loaderJ  s"   ù€ Ø—	‘	×%Ñ%Ó'ˆö	Xð ˆr�   N)rŒ   r…   r—  rU  r¸   rk  rj  rT  rY  rd  )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
        j                  Š	t
        j                  ŠnNt	        d„ ||‰fD «       «      r!t
        j                  Š	t
        j                  Š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ˆ   )r4   ©rä   rŒ   s     r�   ræ   z0SliceView.normalize_start_end.<locals>.<genexpr>d  s   è ø€ ÒH¨AÔ$ Q×'ÑHùó   ‚c              3  ó˜   K  — | ]B  }t        |t        «      r0|j                  t        j                  t        j
                  «      –— ŒD y ­wrˆ   )r‰   r   Úhasr¬   ÚMinÚMaxr£  s     r�   ræ   z0SliceView.normalize_start_end.<locals>.<genexpr>g  s7   è ø€ ò 
ð Ü˜!œTÔ"ð �E‰E”%—)‘)œUŸY™Y×'ñ
ù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>.clamps  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µ  )
rs   r  r  r  r'  r¬   r§  r¨  Úevaluate_minÚevaluate_max)rÍ  rŒ   r>  ÚstartÚendr´  r±  r³  r¯  r°  r  s   `     @@@@@r�   Únormalize_start_endzSliceView.normalize_start_endY  sñ   ý€ ô —7‘7×#Ñ#ˆØ—:‘:“< Ñ$ˆäÑH°%¸¸hÐ1GÔHÔHÜ—y‘yˆHÜ—y‘y‰HÜñ 
ð ˜S (Ð+ô
ô 
ô —y‘yˆHÜ—y‘y‰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   ÿÿÿÿ rE   rH  c                ó‚   •— t        | «      t        ‰«      k(  sJ d| › d‰› �«       ‚t        | «      } | ‰   ‰z  ‰z   | ‰<   | S )Nzwrong ndim r)  )rÉ   r¥   )rË   r>  r  r¸  Ústeps    €€€€r�   rÎ   z!SliceView.create.<locals>.reindex¶  sR   ø€ ô �u“:¤ X£Ò.ÐP°+¸e¸WÀAÀhÀZÐ0PÓPÐ.Ü˜“KˆEØ˜s™ dÑ*¨UÑ2ˆE�#‰JØˆLr�   r9  r  )r¬   r½  r‰   r   Ú	TypeErrorr¥   r  rº  rA   r  rK  r   rL  r  r  rM  rN  rO  r   )rÍ  rŒ   r>  r¸  r¹  r½  r±  rR  rS  rT  rU  rÎ   r  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…   r>  rŠ   r¸  rŠ   r¹  rŠ   r¸   ztuple[int, int])rE   T)rŒ   r…   r>  rŠ   r¸  rŠ   r¹  rŠ   r½  rŠ   r±  r™   r¸   r…   )rž   rŸ   r    r{  rú  rº  rŠ  r¢   r�   r�   r   r   S  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	)ÚBaseConstantrU  r  rc  r  c                 ó   — y©Nr¢   r¢   r‹  s    r�   r  zBaseConstant.get_sizeÇ  s   € Ør�   c                ó   — | j                   S rˆ   rÅ  r‹  s    r�   r  zBaseConstant.get_deviceÊ  rÆ  r�   c                 ó   — y rˆ   r¢   r‹  s    r�   r¥  zBaseConstant.get_origin_nodeÍ  r©  r�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   rž  zBaseConstant.get_readsÐ  r¤  r�   NrY  r`  rO  ru  )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  rU  r  rc  r  c                ó   ‡ — dˆ fd„}|S )Nc                óX   •— t        j                  ‰j                  ‰j                  «      S rˆ   )rq   rÿ  r  r  ©rË   rŒ  s    €r�   r  z$Constant.make_loader.<locals>.loaderÛ  s   ø€ Ü—<‘< §
¡
¨D¯J©JÓ7Ð7r�   r…  r¢   r†  s   ` r�   r  zConstant.make_loaderÚ  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�   rA  zConstant.constant_to_deviceã  s   € Ü˜dŸj™j°·
±
À6ÔJÐJr�   Nrd  r]  ry  )rž   rŸ   r    r¡   r  ró  rA  r¢   r�   r�   rÇ  rÇ  Ô  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Ë   rU  r  rc  r  c                ó   ‡ — dˆ fd„}|S )Nc                óX   •— t        j                  ‰j                  ‰j                  «      S rˆ   )rq   r¾  rË   r  rÊ  s    €r�   r  z,IndexingConstant.make_loader.<locals>.loaderî  s   ø€ Ü—>‘> $§*¡*¨d¯j©jÓ9Ð9r�   r…  r¢   r†  s   ` r�   r  zIndexingConstant.make_loaderí  s   ø€ õ	:ð ˆr�   c                óF   — t        | j                  | j                  |¬«      S )N)rË   r  r  )rÎ  rË   r  rú  s     r�   rA  z#IndexingConstant.constant_to_deviceó  s   € Ü d§j¡j¸¿
¹
È6ÔRÐRr�   Nrd  ry  )rž   rŸ   r    r¡   r  rA  r¢   r�   r�   rÎ  rÎ  ç  s   … àƒJØÓØÓóôSr�   rÎ  c                óL  — d}d}t        t        t        || «      «      «      D ]  \  }}|dk(  rŒt        j                  j
                  j                  ||«      s,t        j                  j
                  j                  ||«      s y|t        j                  d|«      z  }||z  }Œ� y©NrE   FT)	Úreversedr¦   rÒ   rs   r  r  rE  r¬   r¨  )r   r=  Úexpected_strideÚexpected_stride_maxrŒ   Úys         r�   Úis_contiguous_strides_for_shaperØ  ÷  sœ   € ð €OØÐÜœœs 5¨&Ó1Ó2Ó3ò 
‰ˆˆ1Ø�Š6Øä�w‰w×Ñ×7Ñ7Øˆô
ä—'‘'×"Ñ"×:Ñ:¸1Ð>QÔRÙàœuŸy™y¨¨A›Ñ.ÐØ˜1Ñ‰ð
ð r�   c                ó<   — t         j                  | j                  z  S rˆ   )rF   Ú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�   Ústorage_sizezOutputSpec.storage_size  r  r�   c                ó>   — t        t        | «      j                  «      ‚rˆ   r  r6  s     r�   r7  zOutputSpec.get_free_symbol_uses  r   r�   Nr`  rv  rm  rx  )rž   rŸ   r    r{  r  rà  r7  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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y).râ  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 )Nr7  ú	, stride=c              3  óH   K  — | ]  }t        |t        t        f«      –— Œ y ­wrˆ   )r‰   r   rŠ   rã   s     r�   ræ   z"Layout.__init__.<locals>.<genexpr>7  s   è ø€ Ò<°!”:˜a¤$¬ ×-Ñ<ùó   ‚ "r  zOnly CPU tensors can be pinned)r	  r
  r  r  rÉ   rè   Ú_sizeÚ_strideÚ_offsetrN  r³   )rŒ  r  r  rÿ   r   rM  rN  s          r�   r>  zLayout.__init__(  s¬   € ð ˆ>Ü#×6Ñ6°tÓ<ˆFàˆŒØˆŒ
Ü�4‹yœC ›KÒ'ÐH¨5°°°iÀ¸xÐ)HÓHÐ'ÜÑ<°tÔ<Ô<Ð<Ð<ØˆŒ
ØˆŒØˆŒØ"ˆŒà—N’N¨¯©×(8Ñ(8¸EÒ(Að 	
Ø,ó	
ÐBÐ(A�Nr�   c                ó   — | j                   S rˆ   ©rç  r‹  s    r�   rÿ   zLayout.sizeA  ó   € à�z‰zÐr�   c                ó   — || _         y rˆ   rë  ©rŒ  r  s     r�   rÿ   zLayout.sizeE  s	   € àˆ�
r�   c                ó   — | j                   S rˆ   ©rè  r‹  s    r�   r   zLayout.strideI  ó   € à�|‰|Ðr�   c                ó   — || _         y rˆ   rð  rî  s     r�   r   zLayout.strideM  ó	   € àˆ�r�   c                ó   — | j                   S rˆ   ©ré  r‹  s    r�   rM  zLayout.offsetQ  rñ  r�   c                ó   — || _         y rˆ   rõ  rî  s     r�   rM  zLayout.offsetU  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  )	rM  r  rË   rN  r³   rž   r  rÿ   r   )rŒ  rM  Údevice_index_strÚis_pinned_strs       r�   rÂ  zLayout.__str__Y  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_devicei  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)
rs   Ú	fake_moder  r  ra   rÿ   r   r  r  rN  r‹  s    r�   Úget_examplezLayout.get_examplel  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_contiguousv  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ß   é   rE   FT)rÉ   rÒ   r/   )r=  rQ  ÚndimÚleftÚrightrÿ   s         r�   Úis_channels_last_contiguousz"Layout.is_channels_last_contiguousy  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                óØ  — t        | j                  «      t        |«      k(  sJ ‚t        | j                  «      D ��cg c]5  \  }}t        j
                  j                  j                  |d¬«      dk7  r|‘Œ7 }}}|D �cg c]  }| j                  |   ‘Œ }}|D �cg c]  }||   ‘Œ	 }}d	d„} ||«      }dgt        |«      z  }t        t        |«      «      D ]  }||   |||   <   Œ t        t        |«      dz
  «      D ][  }||   ||dz      kD  }t        |t        «      s7t        j
                  j                  j                  ||   ||dz      kD  d¬«      }|sŒ[ y yc c}}w c c}w c c}w )
NrÞ   r  rE   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   �+r.  TrI  F)r  ro  r¸   ro  )rÉ   r   rî   rÿ   rs   r  r  r  rÊ   r‰   r™   Ú
_shape_envr=  )	rŒ  rÓ   rÌ   r>  Únon_1_indicesr   r  Ústride_orderedrP  s	            r�   rË  zLayout.is_stride_ordered•  s~  € Ü�4—;‘;Ó¤3 u£:Ò-Ð-Ð-ô
 $ D§I¡IÓ.÷
á��3Ü�w‰w×Ñ×1Ñ1°#ÀÐ1ÓBÀaÒGò ð
ˆñ 
ð +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Ø! !Ñ$ ~°a¸!±eÑ'<Ñ<ˆDÜ˜d¤DÔ)Ü—w‘w×)Ñ)×7Ñ7Ø" 1Ñ%¨°q¸1±uÑ(=Ñ=Èdð 8ó �ò Ùð	ð ùó;
ùò 9ùÚ@s   ¼:EÁ=E"ÂE'c                ó²   — dgt        t        t        dt        | j                  «      dz
  «      «      «      z   }t        |«      g|z   }| j                  |«      S ©Nr   rE   )r¥   rÔ  rÊ   rÉ   r   rË  r"  s     r�   Úis_channels_last_stride_orderedz&Layout.is_channels_last_stride_ordered¸  sN   € à�”dœ8¤E¨!¬S°·±Ó-=ÀÑ-AÓ$BÓCÓDÑDˆÜ�U“�˜uÑ$ˆØ×%Ñ% eÓ,Ð,r�   c                óZ  ‡‡— 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-        |t0        j6                  «      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   r^  Údislike_paddingFc              3  ó\   K  — | ]$  }t        |t        t        j                  f«      –— Œ& y ­wrˆ   râ   rã   s     r�   ræ   z&Layout._pad_strides.<locals>.<genexpr>×  s(   è ø€ ò 
àô �qœ3¤§¡Ð.×/ñ
ùrç   r  Nc                ó|   •— ‰€yt        | t        j                  «      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>å  s   øè ø€ ÒR¸1�y×3Ñ3°A×6ÑRùs   ƒ)r‰   r¬   r   r'  r3   )rP  rê   s    €r�   Úcontains_unbacked_symintsz6Layout._pad_strides.<locals>.contains_unbacked_symintsà  s4   ø€ ØÐ ØÜ˜d¤E§J¡JÔ/ØÜÓRÀ×@QÑ@QÔRÓRÐRr�   c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrˆ   r¢   )rä   rå   r  s     €r�   ræ   z&Layout._pad_strides.<locals>.<genexpr>è  s   øè ø€ ÒN¸aÑ6°q×9ÑNùrT  rE   )r¸  T)rP  zsympy.Expr | intr¸   r™   )rÜ  rÉ   rF   Úpad_channels_lastrâ  r  rs   Úget_current_noder±  r^  r¶  rè   r¸  ÚchainÚpad_dynamic_shapesr  r  r'  rø   ró   rÊ   rî   r‰   rŠ   r¬   r    Úpadding_stride_thresholdr   r_   r%   Únum_comprehensive_padding)Ú
in_stridesrÿ   r  ÚalignÚcurrent_fx_noderi   rÇ  rò   rõ   Únew_stridesÚpaddedÚrankrï   Úprev_idxr   Úrequire_paddingr  rê   s                   @@r�   Ú_pad_strideszLayout._pad_strides¾  s0  ù€ ô $ 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Ñ'òPô ˜V¤U§Z¡ZÓ0ÒN´V×5NÑ5Nð	 ð
  &ˆ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�   rÀ  zLayout.pad_strides  sM   € Ü˜$¤Ô/Ð;´°d³Ó;Ð/Ø�{‰{Ð&Ð&Ð&Ø×'Ñ'¨¯©°T·Y±YÀÇ
Á
ÓKˆ�r�   c                óF   — t         j                  xr t        | t        «      S rˆ   )rF   Ú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‰   rL  r¿  rÀ  r  r  rÿ   r   rM  rN  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ž   r0  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   rM  rN  )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   rM  r‹  s    r�   rà  zLayout.storage_size5  s   € Ü.¨t¯y©y¸$¿+¹+ÀtÇ{Á{ÓSÐSr�   c                óŠ   — t        | j                  |«      t        | j                  |«      z  t        | j                  |«      z  S rˆ   )r'   rÿ   r   rM  r6  s     r�   r7  zLayout.get_free_symbol_uses8  s=   € ô
 ˜TŸY™Y¨Ó6Ü˜tŸ{™{¨MÓ:ñ;ä˜tŸ{™{¨MÓ:ñ;ð	
r�   )r  rc  r  rU  rÿ   rZ  r   zSequence[Expr] | NonerM  r   rN  r™   r¸   r¹   rY  ©r  rZ  r¸   r¹   r\  ©r  r   r¸   r¹   rj  rb  )r¸   útorch.TensorrX  )r=  ri  rQ  ri  r¸   r™   )rÓ   ro  r¸   r™   )r#  ro  rÿ   rZ  r  rU  r¸   ro  rL  ©r¸   rL  rf  )r3  rÃ   r¸   r™   rm  rx  )rž   rŸ   r    r{  r    r>  r�  rÿ   Úsetterr   rM  rÂ  rù  r  rÿ  rÁ  r~  r  r  rË  r  r+  rÀ  r¿  r0  r  r4  rà  r^   r7  r¢   r�   r�   râ  râ    sÃ  „ ñð )-Ù˜q“zØð
àð
ð ð
ð ð	
ð
 &ð
ð ð
ð ð
ð 
ó
ð2 òó ðð 
‡[�[òó ðð òó ðð ‡]�]òó ðð òó ðð ‡]�]òó ðó
ð €HóóóGð ðØ!ðØ,>ðà	òó ðó"ó!óF-ð ð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)rL  z A Tensor layout we cannot changec                óX   — t        | j                  | j                  | j                  «      S )r/  )rÃ  rÿ   r   rM  r‹  s    r�   r  zFixedLayout.make_indexerF  s   € ä˜dŸi™i¨¯©°d·k±kÓBÐBr�   Nrf  )rž   rŸ   r    r{  r  r¢   r�   r�   rL  rL  C  s   „ Ù*ôCr�   rL  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.
        )rR  Údeepcopyr0  r‹  s    r�   Ú!get_fixed_layout_without_freezingz0FlexibleLayout.get_fixed_layout_without_freezingT  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   rE   r.  )rÉ   r¬   rÒ  rX  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Ò  rX  )rC  rÓ   Únext_striderQ  rÌ   s        r�   Úfill_orderedzFlexibleLayout.fill_orderedg  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	  rG  )rC  rÓ   rò   s      r�   r  zFlexibleLayout.stride_orderedx  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	  r  ÚNHWC_STRIDE_ORDERÚchannels_last_3dÚNHWDC_STRIDE_ORDERÚcontiguous_formatr
  rš  r´  rÔ  )rC  Ú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É   rs   r  r  Úguarding_hints_or_throwr…  rÊ   Ú__getitem__r	  rG  )rC  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.size®  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.stride·  rñ  r�   c                ó6   — | j                  d|«       || _        y )Nr   )rW  rè  rî  s     r�   r   zFlexibleLayout.stride»  ó   € à×.Ñ.¨x¸Ô?Øˆ�r�   c                ó   — | j                   S rˆ   rõ  r‹  s    r�   rM  zFlexibleLayout.offsetÀ  rñ  r�   c                ó6   — | j                  d|«       || _        y )NrM  )rW  ré  rî  s     r�   rM  zFlexibleLayout.offsetÄ  rZ  r�   c                ó0  — | j                  | j                  |«      }| j                  «       r)|r'| j                  || j                  | j                  «      }t        | j                  | j                  | j                  || j                  | j                  «      S rˆ   )	r  rÿ   r¿  r+  r  rL  r  rM  rN  )rŒ  rÓ   r  rT  s       r�   Úas_stride_orderzFlexibleLayout.as_stride_orderÉ  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  rL  r  rM  rN  )rŒ  r)  r  rT  s       r�   Úas_exact_strideszFlexibleLayout.as_exact_stridesÙ  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ˆ   )	rG  rÿ   r¿  r+  r  rL  r  rM  rN  )rŒ  rÓ   rT  s      r�   Úas_fill_orderzFlexibleLayout.as_fill_orderé  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ˆ   )	rT  rÿ   r¿  r+  r  rL  r  rM  rN  )rŒ  r   rT  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   rM  ©TF)r>   r'   r¾   )rŒ  Úinitial_free_symbolsrÁ   re  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 )Nrf  z)Expected free symbols unchanged, but got z vs )rg  r>   r'   )rŒ  rÁ   r  re  Úold_free_symbolsÚnew_free_symbolss         r�   rW  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©rN  )r	  rG  r
  r_  r>  rh  rg  )rŒ  r  r  rÿ   rÇ  rN  rQ  ra  s          €r�   r>  zFlexibleLayout.__init__  sU   ø€ ñ Ü$×1Ñ1°$¸ÓE‰Gä$×7Ñ7¸Ó=ˆGÜ‰Ñ˜ ¨¨gÀÐÔKð %)×$EÑ$EÓ$GˆÕ!r�   r:  )rC  ro  r¸   r*  )rC  ro  rÓ   ro  r¸   r*  )rC  ro  rÓ   ro  r¸   rZ  )rC  ro  rO  ztorch.memory_formatr¸   rZ  )rC  ro  r   ri  r¸   rZ  rY  r7  r\  r8  rm  )rÓ   ro  r  r™   r¸   rL  )r)  ri  r  r™   r¸   rL  )rÓ   ro  r¸   rL  )r   ri  r¸   rL  )r¸   z$dict[tuple[str, bool], sympy.Symbol])rÁ   rÄ   r  r7   r¸   r¹   rý  )r  rc  r  rU  rÿ   rZ  rÇ  úSequence[int | Integer] | NonerN  r™   r¸   r¹   )rž   rŸ   r    r{  rØ  rA  r~  r
  rG  r  rP  rT  r�  rÿ   r;  r   rM  r^  r`  rb  rd  rh  rW  r>  r,  r-  s   @r�   r	  r	  K  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  r_  r>  r  r  rÿ   r   Úview)rŒ  rr  rJ  ra  s      €r�   r>  zNonOwningLayout.__init__,  sA   ø€ Ø—‘Ó"ˆÜ‰ÑØ�M‰MØ�L‰LØ�K‰KØ�M‰Mô		
ð ˆ�	r�   c                ó>   — | j                  «       j                  «       S rˆ   )r0  r  r‹  s    r�   r  zNonOwningLayout.make_indexer6  s   € Ø�}‰}‹×+Ñ+Ó-Ð-r�   c                ó¶   — | j                   j                  «       j                  }|dk(  ryddlm} t
        j                  j                  j                  ||«      S )Nr   TrE   )Ú	ALIGNMENT)	rr  r  rM  Úutilsru  rs   r  r  rÏ  )rŒ  rM  ru  s      r�   Úmaybe_guard_alignedz#NonOwningLayout.maybe_guard_aligned9  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‰   rr  rO  rI  rm  r³   rn  rJ  r7  )rŒ  re  ÚboxÚinput_buffers       r�   r7  z$NonOwningLayout.get_free_symbol_usesA  sw   € ô ˜$Ÿ)™)¤_Ô5Ð5Ð5Ø�i‰i�n‰nˆÜ˜#œzÔ*Ð5¬D°«IÓ5Ð*Ø—x‘xˆÜ˜,¬Ô/Ð:´°c³Ó:Ð/Ø×"Ñ"×7Ñ7¸ÓFÐFr�   )rr  zBaseView | TensorBoxr¸   r¹   rf  rX  rm  rx  )
rž   rŸ   r    r{  r>  r  rw  r^   r7  r,  r-  s   @r�   rp  rp  )  sG   ø„ Ù6õó.óPñ Ð-Ó.à$)ðGØ!ðGà	!òGó /ôGr�   rp  c                  ó   — e Zd ZdZy)ÚCommBufferTypeÚsymm_memN)rž   rŸ   r    ÚSYMM_MEMr¢   r�   r�   r|  r|  M  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   rM  rN  )r‰   r	  r0  r_  r>  r  r  rÿ   r   rM  rN  r�  r‚  )rŒ  rJ  r�  r‚  Úfixedra  s        €r�   r>  zCommBufferLayout.__init__`  si   ø€ ô &0°¼Ô%G�—‘Ô!ÈVˆÜ‰ÑØ—<‘<Ø—+‘+Ø—‘Ø—<‘<Ø—<‘<Ø—o‘oð 	ô 	
ð !1ˆÔØ$ˆ�r�   )rJ  zFlexibleLayout | FixedLayoutr�  r|  r‚  rÄ   )rž   rŸ   r    r{  r¡   r>  r,  r-  s   @r�   r€  r€  Q  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)Ú
NoneLayoutra  r  c                 ó   — dgS rí  r¢   r¢   r�   r�   r~  zNoneLayout.<lambda>~  s   € ÀÀ€ r�   ©Údefault_factoryr#  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�   r0  zNoneLayout.as_fixed„  ó   € Øˆr�   c                ó   — | j                   S rˆ   rÅ  r‹  s    r�   r  zNoneLayout.get_device‡  rÆ  r�   Nrv  rW  r`  )rž   rŸ   r    r¡   r|  r}  rÿ   r   rà  r0  r  r¢   r�   r�   r‡  r‡  s  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ˆ   )r_  r>  rû  r  r  r  Ú
get_bufferro  rs   r  Úmark_buffer_mutated)rŒ  r  rÁ   ra  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‘  r  rk  rl  Ú
MutableBoxrI  )r  Ú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�   )r  r   r¸   r   )r  r‰   rn  r³   )rŒ  r1  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“  rJ  r‰   râ  )rŒ  rJ  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  rI  )ró  rs   r  r”  ro  r‰   r„   rI  r  r  rŠ  r  r  r  rÒ   r  r  Úcheck_equals_and_simplifyrk  r›  r±  rJ  r	  r³   r‘  )rÍ  ÚsrcÚdstÚunsafe_aliasr9  r:  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�   r0  z#MutationLayoutSHOULDREMOVE.as_fixedÝ  rŽ  r�   c                ó6   — | j                   j                  «       S rˆ   )r  r  r‹  s    r�   r  z'MutationLayoutSHOULDREMOVE.make_indexerà  rˆ  r�   )r  r…   r¸   r¹   rY  )r  r   r¸   r¹   r\  )r¸   rn  rV  rm  )r   r…   r¡  r…   r¢  r™   r¸   r…   )r¸   r   rf  )rž   rŸ   r    r>  r�  r   r;  rà  r“  r–  rú  r£  r0  r  r,  r-  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 )>rn  r^  rÁ   r  rJ  c                óF   •— t         ‰| �  «        | j                  dd «       y r‹  )r_  r•  r‘  rr  s    €r�   r•  zBuffer.__post_init__î  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�   ro  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‰   rJ  râ  rÿ  rÔ  r³   rž   r‹  s    r�   rÿ  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�   r0  zBuffer.get_stride  s   € Ø*�—‘Ó"×)Ñ)Ð*Ð*r�   c                ó6   — | j                  «       j                  S rˆ   )r  rM  r‹  s    r�   Ú
get_offsetzBuffer.get_offset  s   € Ø�‰Ó ×'Ñ'Ð'r�   c                óž   — t        | j                  t        «      r| j                  S t        t	        | j                  «      j
                  «      ‚rˆ   )r‰   rJ  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�   r4  zBuffer.get_storage_numel  s   € Ø�~‰~ÓÐr�   c                ó6   — | j                  «       j                  S rˆ   )r  rN  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‰   rJ  râ  rp  r0  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‰   rJ  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‰   rJ  r	  r³   rb  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‰   rJ  r	  r³   rd  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‰   rJ  r	  r³   r`  r(  s      r�   r*  z'Buffer.freeze_layout_with_exact_strides3  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  rq   r‚  rÁ   ©rË   r  rŒ  s     €r�   r  z"Buffer.make_loader.<locals>.loaderC  s/   ø€ Ø×'Ñ'Ó)ˆGÜ—8‘8˜DŸI™IÒ2¨±G¸E³NÓCÐCr�   r…  )rð  r   r  r  r†  s   ` r�   r  zBuffer.make_loader>  s0   ø€ à× Ñ Ô"Üœ=°·±Ó0@ÔAÐAõ	Dð ˆr�   c                ó"   — | j                  «       S rˆ   ©ro  rõ  s     r�   r÷  zBuffer.codegen_referenceI  ré  r�   c                 ó   — y rˆ   r¢   r‹  s    r�   r‡  zBuffer.decide_layoutL  r  r�   c                ó‚   — t        | j                  t        «      r%| j                  j                  j	                  «       gS yrÂ  )r‰   rJ  rp  rr  ro  r‹  s    r�   rG  z#Buffer.get_inputs_that_alias_outputO  s/   € Ü�d—k‘k¤?Ô3Ø—K‘K×$Ñ$×-Ñ-Ó/Ð0Ð0Ør�   c                ó‚   — t        | j                  t        «      r%| j                  j                  j	                  «       gS yrÂ  )r‰   rJ  r‘  r  ro  r‹  s    r�   rC  zBuffer.get_mutation_namesT  s0   € Ü�d—k‘kÔ#=Ô>Ø—K‘K×&Ñ&×/Ñ/Ó1Ð2Ð2Ør�   c                ó6   — t        | j                  «       g«      S rˆ   )r>   ro  r‹  s    r�   rŸ  zBuffer.get_read_namesY  s   € Ü˜4Ÿ=™=›?Ð+Ó,Ð,r�   c                ó   — t        «       S rˆ   r=   r6  s     r�   r7  zBuffer.get_free_symbol_uses\  ó   € ô ‹|Ðr�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   r£  zBuffer.get_unbacked_symbol_defsb  r¤  r�   c                 ó   — y rˆ   r¢   r‹  s    r�   ró  zBuffer.realizee  r  r�   c                 ó   — yrý  r¢   r‹  s    r�   Úshould_allocatezBuffer.should_allocateh  s   € àr�   rL  rf  rj  )r¸   ztorch.Tensor | torch.SymIntr`  rP  rT  rY  )r¸   r*  r\  rV  rW  rv  rX  rm  rn  rp  )r   ro  r¸   r¹   )r)  ro  r  r™   r¸   r¹   rd  rˆ   r_  rz  rM  rx  rª  r]  )%rž   rŸ   r    r¡   r•  r  ro  rÿ  r  r¨  r�  r  r  r0  r±  r  rÞ  r4  r¶  r  r  r#  r&  r*  rð  r  r÷  r‡  rG  rC  rŸ  r^   r7  r£  ró  rÌ  r,  r-  s   @r�   rn  rn  ä  s  ø… ð ÓØÓõ
5ó0óó>ó
3óð ò'ó ð'ó)ó+ó(ó>ó
ó ó+ó1ð ;@ðVØ"ðVØ37ðVà	óVó7ó8ð
 CHð
Ø*ð
Ø;?ð
à	ó
óUó	ôóóó
ó
-ñ ˜HÓ%à$)ðØ!ðà	!òó &ðó
ó÷r�   rn  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_outputsp  s	   € Øˆvˆr�   c                ó   — | S rˆ   r¢   r‹  s    r�   r¨  zOperationBuffer.get_defining_ops  rŽ  r�   c                óX   — t         j                  | «       t        j                  | «       y rˆ   )rn  r•  rƒ  r‹  s    r�   r•  zOperationBuffer.__post_init__y  s   € Ü×Ñ˜TÔ"Ü×Ñ Õ%r�   Nr¨  ©r¸   rƒ  rL  )rž   rŸ   r    r¡  r¨  rƒ  rE  r•  r¢   r�   r�   rÎ  rÎ  m  s   „ óóð #×5Ñ5Ðô&r�   rÎ  c                  ó   — e Zd Zdd„Zy)r†  c                 ó   — yrÑ  r¢   r‹  s    r�   r2  zInputBuffer.num_reads  r’  r�   Nrv  )rž   rŸ   r    r2  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  Nra  r  c                ó   ‡ — dˆ fd„}|S )Nc                óä   •— ‰j                  «       j                  «       }t        j                  t        j
                  j                  ‰j                  «       ‰j                  «       || «      «      S rˆ   )	r  r  rq   r‚  rs   r  Úconstant_namero  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�   r…  r¢   r†  s   ` r�   r  zConstantBuffer.make_loader�  s   ø€ õ	ð ˆr�   c                óˆ   — t        t        j                  j                  | j	                  «       |«      | j
                  ¬«      S ©N©rÁ   rJ  )r  rs   r  rÚ  ro  rJ  rú  s     r�   rA  z!ConstantBuffer.constant_to_deviceš  s/   € ÜÜ—‘×&Ñ& t§}¡}£¸Ó?ÈÏÉô
ð 	
r�   rd  ry  )rž   rŸ   r    r  r¡   r  rA  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=   r6  s     r�   r7  z)NoneAsConstantBuffer.get_free_symbol_uses¥  rÈ  r�   Nc                óJ   — t         j                  j                  j                  S rˆ   )rs   r  rŽ  Únone_strrõ  s     r�   r÷  z&NoneAsConstantBuffer.codegen_reference«  s   € Ü�w‰w×#Ñ#×,Ñ,Ð,r�   c                ó   — t        d ¬«      S ©NrÅ  )r‡  r‹  s    r�   rÞ  z$NoneAsConstantBuffer.get_output_spec®  s   € Ü Ô&Ð&r�   c                 ó   — yrý  r¢   r‹  s    r�   rã  z&NoneAsConstantBuffer.has_tensor_output±  rÿ  r�   ru  rm  rx  rˆ   r_  rW  rX  )	rž   rŸ   r    rž  r^   r7  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   rP  c                ó.   — t        | j                  |«      S rˆ   )r'   rP  r6  s     r�   r7  z*ShapeAsConstantBuffer.get_free_symbol_uses¹  s   € ô   §	¡	¨=Ó9Ð9r�   Nc                óh   — t         j                  j                  j                  | j                  «      S rˆ   )rs   r  rŽ  Úcodegen_sizevarrP  rõ  s     r�   r÷  z'ShapeAsConstantBuffer.codegen_reference¿  s!   € Ü�w‰w×#Ñ#×3Ñ3°D·I±IÓ>Ð>r�   c                 ó   — yrý  r¢   r‹  s    r�   rã  z'ShapeAsConstantBuffer.has_tensor_outputÂ  rÿ  r�   rm  rx  rˆ   r_  rX  )rž   rŸ   r    r¡   r^   r7  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¬  rI  FzClassVar[bool]Ú_force_realizeNr|  rá  úCallable[..., Any] | Nonerâ  r[  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)Nrp  )rá  râ  rã  rä  r‰   rI  rX  r³   rJ  r  r  rE  rZ  r[  rL  Úget_default_sizes_bodyÚclear_cache)rŒ  Úold_datarS  Ú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±  rI  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ˆ   ©rI  r2  r‹  s    r�   r2  zComputedBuffer.num_reads  rú  r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  rž  r‹  s    r�   rž  zComputedBuffer.get_reads  rú  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©r/  ÚwritesÚindex_exprsrØ  T)r‰   rI  rX  rf  rŸ  r  rG   Ú
ReadWritesr>   r   rÃ   r	  r9  rP   Úget_store_functionrÊ  r;  r  r‹  s    r�   r,  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ˆ   )rJ  r7  rI  Úhas_store_functionr,  )rŒ  re  r1  s      r�   r7  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í  )
r9  rÁ   rs   r  Úmutated_buffersr2  rí  rI  r  r_  rr  s    €r�   r  zComputedBuffer.make_loaderE  s`   ø€ à×'Ñ'Ô)Ø—	‘	¤§¡×!8Ñ!8Ñ8Ø—‘Ó  AÒ%Ø×'Ò'ð —9‘9×(Ñ(Ó*Ð*Ü‰wÑ"Ó$Ð$r�   c                óV   — t        | j                  t        t        t        t
        f«      S rˆ   )r‰   rI  rX  rf  rŸ  r  r‹  s    r�   r  z!ComputedBuffer.has_store_functionP  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  r0  r  r‰   rI  rX  rf  rŸ  r   rg  rÁ   r  r³   r  )rŒ  r  s     r�   r  z!ComputedBuffer.get_store_functionS  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‰   rG   ÚStarDepÚ	MemoryDepr  s     r�   ræ   z0ComputedBuffer.get_fill_order.<locals>.<genexpr>j  s0   è ø€ ò àô ˜1œ|×3Ñ3´\×5KÑ5KÐL×Mñùs   ‚46r   rE   ©Úpick_loop_orderN)r‰   rJ  r	  rG   r›  rI  rÊ  r;  r,  r/  rè   r  ro   rË   r¬   rÒ  rÓ  rf  rŸ  rÎ   rs   r  r  r�  Ú	schedulerr  r  )rŒ  Ú
index_varsrh  rõ   r/  rÏ  ÚvrŠ  rP  Ústride_lengthsr  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‰   rJ  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  rE   r   )rG   r›  rÊ  r;  r   rÃ   r  r  rS   r  r9  ÚitemsrÂ  )
rŒ  r¿   Ú
var_rangesrý  r  Úreduce_varsÚ
index_sizeÚreduce_sizer  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>Ù  s   è ø€ ÒH¨q”z !¤T×*ÑHùó   ‚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 )Nr+  rÝ   r   )Ú_apply_loop_reorderingr9  rÉ   r¥   rÊ   r×   rÔ   rs   r  r  Ú_simplify_loopsrK   rÜ   )Úx_varsÚsupport_varsrC  Úsimplify_loopsÚnewsizesÚreindex0rÚ   rÓ   rÌ   rÛ   Ú_prunerÎ   Úindex_formulasÚmemory_addrsrŒ  s               €€€r�   Úsimplify_and_reorderzAComputedBuffer.simplify_and_reorder.<locals>.simplify_and_reorderê  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&  r/  rC  ro  r'  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è   r  Úget_write_exprsrs   r  r‘  rH   ÚPREFER_STORE_LOOP_ORDERÚextendÚget_read_exprsrj   r  rF   Úloop_ordering_after_fusionrG   Úindex_vars_no_squeezerS   )rŒ  Úextra_indexing_constraintsÚrecompute_sizes_body_funcr  r  rý  r  r  Úextra_indexing_rangesÚextra_indexing_exprÚexpected_var_rangesr³  r-  r&  Úshould_merge_loopsÚiter_rangesÚiter_reindexrõ   Úreduce_rangesÚreduce_reindexÚ	iter_varsr  r+  r,  s   `                     @@r�   r-  z#ComputedBuffer.simplify_and_reorder«  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.
        rE   r  r   z%Did not simplify complex index:
%s
%s)r  r  rs   r  r  r�  rÉ   r¥   rÔ  Ú	ExceptionrF   r´  rš  Úwarningr§   rÒ   rÊ   r×   rÔ   )
r  r&  rC  r,  Úpriority_idxr  rP  rQ  rÓ   rÌ   s
             r�   r#  z%ComputedBuffer._apply_loop_reorderingB  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ˆ   )rI  rÊ  r‹  s    r�   rÊ  z!ComputedBuffer.get_pointwise_sizej  ó   € Ø�y‰y×+Ñ+Ó-Ð-r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  r;  r‹  s    r�   r;  z!ComputedBuffer.get_reduction_sizem  rH  r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  r9  r‹  s    r�   r9  z!ComputedBuffer.get_reduction_typep  rH  r�   c                ó6   — | j                   j                  «       S rˆ   )rI  rð  r‹  s    r�   r?  zComputedBuffer.is_no_ops  s   € Ø�y‰y×)Ñ)Ó+Ð+r�   c                 ó   — yrö  r¢   r‹  s    r�   rÌ  zComputedBuffer.should_allocatev  r©  r�   c                ó8   — | j                   j                  |«      S )r  ©rI  rA  rú  s     r�   rA  z!ComputedBuffer.constant_to_devicey  s   € à�y‰y×+Ñ+¨FÓ3Ð3r�   )r¸   úIterator[None]r]  rv  ru  rM  rs  rm  rx  rd  rX  )r¸   zCallable[..., None])r¸   úlist[int] | NonerL  )r¸   zMtuple[tuple[list[Expr], list[Expr]], LoopBody, tuple[list[Expr], list[Expr]]]©NN)r8  ú'tuple[dict[Any, Any], list[Any]] | Noner9  rî  r¸   z5tuple[tuple[list[Expr], list[Expr]], LoopBody | None]rˆ   )r  r/  r&  r/  rC  ro  r,  zlist[sympy.Expr]rF  rR  r¸   r0  rY  ry  )&rž   rŸ   r    r{  r¡   rí  rá  râ  rã  rä  r  r€  rô  r~  rø  rú  r2  rž  rŸ  r,  r^   r7  r  r  r  rì   r‡  r]   rð  r-  r#  rÊ  r;  r9  r?  rÌ  rA  r,  r-  s   @r�   r„  r„  Æ  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�   rV  rV  ~  s   … áXàƒKØÓØÓØÔr�   rV  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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Å  )r_  r>  r…  Úunwrap_storagerf  Úmake_kernel_renderrs   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Œ  rJ  rf  r^  rd  rg  Únamed_inputsÚfirst_inputr  rŒ  ra  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‰   rJ  ÚMultiOutputLayoutrÔ  r  r  r‹  s    r�   r  zTemplateBuffer.dtypeÁ  s6   € ä�d—k‘kÔ#4Ô5Ü%ØCóð ð �‰Ó ×&Ñ&Ð&r�   c                ó&   — | j                  d¬«      S )NT©Ú	normalize)rP   r‹  s    r�   r,  zTemplateBuffer.get_read_writesÉ  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É   rq   r‚  ro  )rË   rm  rh  Úinp_indexers     €€r�   Údummyz4TemplateBuffer._read_deps_from_inputs.<locals>.dummyÕ  s1   ø€ Ü˜6“{ aÒ'Ð'Ð'Ü—x‘x §¡£±¸EÓ0BÓCÐCr�   r¢   ro  ©rË   úSequence[Any]rm  rv  r¸   r   )r>   rf  r‰   rO  rn  r³   rJ  râ  r  rG   rP   r  r/  )rŒ  rp  r/  Úinp_rawrt  rh  rs  s        @@r�   Ú_read_deps_from_inputsz%TemplateBuffer._read_deps_from_inputsÌ  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)r/  r  r  rƒ  r  c                ó^   •— t        |«      dk(  sJ ‚t        j                  ‰ ‰| «      d«      S ©Nr   Úfake©rÉ   rq   r  ©rË   rm  r  rÁ   s     €€r�   rt  z1TemplateBuffer.extract_read_writes.<locals>.dummyú  ó,   ø€ Ü�v“; !Ò#Ð#Ð#Ü—9‘9˜T¡7¨5£>°6Ó:Ð:r�   ro  ru  )r‰   rJ  rm  r>   rG   r  ro  r¬   r    r  rx  r  r  rP   r  r/  )rŒ  rp  r  rt  Údepsr  rÁ   s        @@r�   rP   z"TemplateBuffer.extract_read_writesÞ  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Ò  rX  r‹  s    r�   r;  z!TemplateBuffer.get_reduction_size  s   € Ü�w‰w�{‰{Ðr�   c                 ó   — y rˆ   r¢   r‹  s    r�   r9  z!TemplateBuffer.get_reduction_type  r©  r�   c                 ó   — yrö  r¢   r‹  s    r�   rÌ  zTemplateBuffer.should_allocate
  r©  r�   c                ó*   — | j                  «       g fd fS rˆ   ré  )rŒ  r8  r9  s      r�   r-  z#TemplateBuffer.simplify_and_reorder  s$   € ð —‘“Øðð ð
ð 	
r�   c                ó6   — t        | j                  t        «      S )zFWhether this template produces multiple outputs via MultiOutputLayout.)r‰   rJ  rm  r‹  s    r�   Úis_multi_outputs_templatez(TemplateBuffer.is_multi_outputs_template  s   € ä˜$Ÿ+™+Ô'8Ó9Ð9r�   c                ó   — | j                   S rˆ   )rg  r‹  s    r�   Úget_allowed_prologue_inpsz(TemplateBuffer.get_allowed_prologue_inps  s   € Ø×)Ñ)Ð)r�   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„   rI  ÚMultiOutputr°  Úrealize_inputrm  rJ  r	  r  )rÍ  rÎ  r1  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î   r4  r³   rÖ  r  ÚTensorr„   rŠ  ÚidrŽ  ÚFallbackKernelÚtensor_to_layoutrb  ro  )rX  rŠ  rF  rÌ   ÚitemÚleaf_idxÚtidÚmorÎ  r‘  Úleaf_counterr“  r’  Úseen_outputsÚtemplate_bufÚwalks            €€€€€€€r�   r¡  z0TemplateBuffer.build_multi_outputs.<locals>.walkJ  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�   )rX  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)rJ  r  rf  úSequence[IRNode]r^  rî  rd  úIterable[IRNode] | Nonerg  úOrderedSet[str] | Nonerj  zdict[str, IRNode] | Noner¸   r¹   rT  rs  )rp  r™   r¸   zOrderedSet[dependencies.Dep]rm  )rp  r™   r¸   rt  rY  r]  rX  rS  )r8  rT  r9  rî  r¸   z9tuple[tuple[Sequence[Expr], list[Expr]], LoopBody | None]rM  )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  r,  rx  rP   r;  r9  rÌ  r-  r‡  r‰  rŒ  rú  r�  r¥  r,  r-  s   @r�   r‡  r‡  ˆ  sH  ø„ ñð 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ó	
ó:ó*ðØ*ðà	%óð ò	ó ð	ð ð :>àØ;?ñ)+à$ð)+ð ð)+ð
 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.
        )rd  rg  N)r_  r>  rÁ   ra  Úsubgraph_inpsÚsubgraph_outs)rŒ  rJ  rf  r^  rd  rg  ra  s         €r�   r>  zTritonTemplateBuffer.__init__i  s]   ø€ ô" 	‰ÑØØØØ)Ø"7ð 	ô 	
ð �y‰yÐ$Ð$Ð$Ø)-¯©°D·I±IÐ(>ˆÔ%àFJˆÔØ9=ˆÕr�   c                óê  •— t         ‰| �  |«      }| j                  r| j                  ng }| j                  r| j                  ng }|D ]m  }t	        |t
        j                  «      r|j                  t        ||«      «       Œ9t	        |t        «      r!|j                  |j                  |«      «       Œj|€ŒmJ ‚ |D ]7  }t	        |t        «      r!|j                  |j                  |«      «       Œ4|€Œ7J ‚ |S rˆ   )
r_  r7  r­  r¬  r‰   r¬   r   Úupdater'   r…   )rŒ  re  Úresr­  r¬  rh  rö   ra  s          €r�   r7  z)TritonTemplateBuffer.get_free_symbol_uses‡  sÝ   ø€ ô ‰gÑ*¨=Ó9ˆØ.2×.@Ò.@˜×*Ò*ÀbˆØ.2×.@Ò.@˜×*Ò*Àbˆà ò 	#ˆCÜ˜#œuŸz™zÔ*Ø—
‘
Ô+¨C°Ó?Õ@Ü˜C¤Ô(Ø—
‘
˜3×3Ñ3°MÓBÕCà‘{Ð"�{ð	#ð !ò 	#ˆCÜ˜#œvÔ&Ø—
‘
˜3×3Ñ3°MÓBÕCà‘{Ð"�{ð		#ð ˆ
r�   c                ó    — | g| j                   ¢S rˆ   ©re  r‹  s    r�   r¡  z TritonTemplateBuffer.get_outputsŸ  ó   € ØÐ-�t×,Ñ,Ð-Ð-r�   c                ó&   — d| j                   › d�}|S )NzTritonTemplateBuffer(layout=r  rŠ  )rŒ  rö   s     r�   rÂ  zTritonTemplateBuffer.__str__¢  s   € Ø,¨T¯[©[¨M¸Ð;ˆØˆ
r�   rS  )rJ  râ  rf  r¦  r^  zCallable[_P, _T] | Nonerd  r§  rg  r¨  r¸   r¹   rm  rx  r¨  rj  )	rž   rŸ   r    r>  r^   r7  r¡  rÂ  r,  r-  s   @r�   rª  rª  h  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ý  )r_  r>  rÁ   rJ  r•   ÚdescriptionÚfailedÚ_benchmark_with_cudagraphsr   r`  ÚdecompositionÚdecomposition_kwargsÚconfig_patches)rŒ  rÁ   r•   rJ  r¸  ra  s        €r�   r>  zChoiceCaller.__init__³  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>Ñ  s   ø€ ÁTÈ4À[€ r�   c                 ó   •—  ‰ ‰Ž S rˆ   r¢   rÀ  s   €€r�   r~  z(ChoiceCaller.benchmark.<locals>.<lambda>Ó  s   ø€ ±D¸$°K€ r�   rö   rÅ  )Úto_callablerº  rX   Úbenchmark_gpu_with_cuda_graphrF   Ú/profile_bandwidth_with_do_bench_using_profilingrc   Ú	benchmark)rŒ  rö   r¿   rÁ  s     `@r�   rÆ  zChoiceCaller.benchmarkÎ  s\   ù€ Ø×ÑÓ!ˆØ×*Ò*Ü×<Ñ<Ô=PÓQÐQÜ×AÒAÜ+Ô,?Ó@Ð@Ü×$Ñ$ T¨4°%¸°ÀdÔKÐKr�   c                ó   — t         ‚rˆ   rˆ  r‹  s    r�   Ú	call_namezChoiceCaller.call_nameÖ  r‰  r�   c                ó   — t         ‚rˆ   rˆ  r‹  s    r�   rÃ  zChoiceCaller.to_callableÙ  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_keyÜ  s   € ð
 �}‰}‹Ðr�   c                ó   — t         ‚rˆ   rˆ  r‹  s    r�   rË  zChoiceCaller.hash_keyã  r‰  r�   c                ó   — t         ‚rˆ   rˆ  r‹  s    r�   ra  zChoiceCaller.output_nodeæ  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©  rJ  râ  r¸  rÄ   r¸   r¹   )r¿   r   rö   r9  r¸   r   rj  )r¸   r­  )r¸   r„   )r¸   z6dict[str, PrimitiveInfoType | list[PrimitiveInfoType]]rL  )rž   rŸ   r    r{  r>  rÆ  rÈ  rÃ  rÌ  rË  ra  rÐ  rÓ  rÕ  r,  r-  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)rJ  rf  r^  rg  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)	r_  r>  Ú_choice_timings_fnÚ_choice_timingsÚ_choicesÚoriginal_inputsrè   Ú_output_plannableÚ_make_kernel_renders)rŒ  rJ  rf  Úchoice_timings_fnÚunfiltered_choicesrg  ra  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³   rJ  r^  rÙ  )rŒ  ÚcallerÚrenders      r�   Úswap_as_triton_callerz)MultiTemplateBuffer.swap_as_triton_caller5  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  rJ  rÿ   r0  r   rÙ  r^  )rŒ  rò  s     r�   Úfinalize_as_triton_callerz-MultiTemplateBuffer.finalize_as_triton_callerC  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ï  r(  r¶  )rŒ  rî  ÚtimingsÚ
min_choices       r�   Úget_min_choicez"MultiTemplateBuffer.get_min_choiceK  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)r  rÙ  rç  r^  )rŒ  Úcallersrî  rò  s       r�   Úfinalize_as_triton_callersz.MultiTemplateBuffer.finalize_as_triton_callersR  sN   € ð &-§]¡]£_ò 	WÑ!ˆM˜6Ø7=×7TÑ7TÓ7VˆD×%Ñ% mÒ4ð	Wð #'×";Ñ";¸DÑ"AˆÕr�   )rJ  râ  rf  r¦  rè  z1Callable[[int | None], dict[ChoiceCaller, float]]ré  úlist[ChoiceCaller]rg  rN  r¸   r¹   rX  )r¸   rþ  rˆ   )rî  r|  r¸   zdict[ChoiceCaller, float])rò  r×  r¸   rQ  )rò  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€  rô  rö  rú  rý  r,  r-  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ˆ   )r_  r>  Úworkspace_sizeÚtemplateÚsupports_epilogue_fusion)rŒ  rJ  rf  r^  r  r  r  ra  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_sizem  s   € Ø&*×&9Ñ&9Ð&Eˆt×"Ñ"ÐLÈ1ÐLr�   c                óx   — | j                  «       D ]'  }t        j                  |j                  «       d d «       Œ) y rˆ   )r¡  rq   r  ro  )rŒ  rX  s     r�   Úemulate_store_fnz&CUTLASSTemplateBuffer.emulate_store_fnp  s1   € Ø×&Ñ&Ó(ò 	5ˆFÜ�I‰I�f—o‘oÓ'¨¨tÕ4ñ	5r�   )rJ  râ  rf  r¦  r^  úCallable[_P, _T]r  rŠ   r  rw   r  r™   r¸   r¹   rv  rL  )rž   rŸ   r    r>  r§  r  r,  r-  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ˆ   )r_  r>  r  rá  Úoutputs)rŒ  rJ  rf  r^  r  rá  ra  s         €r�   r>  zCppTemplateBuffer.__init__v  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‰   rJ  rm  r  r   r³   rn  râ  r_  r  )rŒ  Úfirst_outputrJ  ra  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�   )rJ  râ  rf  r¦  r^  r	  r  rw   rá  r   r¸   r¹   rV  )rž   rŸ   r    r>  r  r,  r-  s   @r�   r  r  u  sL   ø„ ð1àð1ð !ð1ð -ð	1ð
 "ð1ð ð1ð 
õ1÷
(ñ 
(r�   r  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Å  )r_  r>  r  rd  r  r‰   rf  r…   r³   r  rf  r‡  )	rŒ  rJ  rf  r^  r  rd  r  rŒ  ra  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ˆ   ©r  r‹  s    r�   r¡  z!CuteDSLTemplateBuffer.get_outputs«  ó   € Ø�|‰|Ðr�   rˆ   )rJ  râ  rf  r¦  r^  r	  r  r   rd  r§  r¸   r¹   r¨  )rž   rŸ   r    r{  r>  r¡  r,  r-  s   @r�   r  r  �  sQ   ø„ ñð 37ðàðð !ðð -ð	ð
 ðð 0ðð 
õ÷*r�   r  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)r_  r>  ÚkernelÚaccumulator_typer  r  ÚvariantÚscale_type_aÚscale_type_bÚswizzle_type_aÚswizzle_type_bÚmetadatar  r  Úkernel_metadataÚ_make_kernel_renderr^  )rŒ  rJ  rf  r  r  r  r  r  r  r   r!  ra  s              €r�   r>  zNVUniversalGemmBuffer.__init__·  s–   ø€ ô 	‰Ñ˜ ¸DÐÔAØˆŒØ 0ˆÔØ&* VˆŒØ,ˆÔØˆŒØ(ˆÔØ(ˆÔØ,ˆÔØ,ˆÔð "Ÿ?™?×6Ñ6Ø—o‘o×,Ñ,ñ 
ˆÔð #'×":Ñ":ˆÕr�   c                ó   — | j                   S )z#Return the workspace size in bytes.r  r‹  s    r�   r§  z(NVUniversalGemmBuffer.get_workspace_sizeØ  s   € à×"Ñ"Ð"r�   c                ó   — | j                   S rˆ   r  r‹  s    r�   r¡  z!NVUniversalGemmBuffer.get_outputsÜ  r  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)r  r•   ra  r#  r  r  r  r  r  r   r!  c                 ó$   •— ‰ j                  «       S rˆ   )ró  )Úrender_kernels   €r�   ró  z9NVUniversalGemmBuffer._make_kernel_render.<locals>.render  s   ø€ Ø ×'Ñ'Ó)Ð)r�   )ÚBtorch._inductor.codegen.nv_universal_gemm.nv_universal_gemm_kernelr(  Útorch._inductor.utilsr)  rf  r‰   r„   rI  rm  rÂ  rÄ   ÚKERNEL_NAMEr#  r  r  r  r  r  r   r!  )
rŒ  Úout_noderî  r(  r)  r•   rh  r  ró  r+  s
            @r�   r$  z)NVUniversalGemmBuffer._make_kernel_renderß  sÖ   ø€ õ	
õ 	6à!#ˆØ—;‘;ò 	$ˆCÜ˜#œyÔ)Ø—h‘h�Ü˜#œzÔ*Ø—h‘h�Ø×Ñ˜sÕ#ð	$ô ˜+×1Ñ1Ó2ˆá-Ø#Ø#Ø Ø ×0Ñ0Ø!×2Ñ2Ø×.Ñ.Ø—L‘LØ×*Ñ*Ø×*Ñ*Ø×.Ñ.Ø×.Ñ.ô
ˆô	*ð ˜fÐ$Ð$r�   )r   NNNN)rJ  râ  rf  r¦  r  r   r  r   r  r   r  rŠ   r  ú
Any | Noner  r0  r   r0  r!  r0  r¸   r¹   rv  r¨  rˆ   )r/  r   rî  r|  r¸   ztuple[Any, Any])	rž   rŸ   r    r{  r>  r§  r¡  r$  r,  r-  s   @r�   r  r  ¯  s·   ø„ ñð  Ø#'Ø#'Ø%)Ø%)ð;àð;ð !ð;ð ð	;ð
 ð;ð ð;ð ð;ð !ð;ð !ð;ð #ð;ð #ð;ð 
õ;óB#óð :>ð*%Øð*%Ø,6ð*%à	÷*%r�   r  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_sequencer4    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]]rf  c                ód   — | j                   |   }t        |t        «      sJ ‚|j                  «       S rˆ   ©rf  r‰   r…   ro  )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Œ   r  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Œ  r  s     €r�   ræ   z/InputsKernel.get_read_writes.<locals>.<genexpr>'  s!   øè ø€ ò .
Ø(+‰G�C—L‘L“N×#ñ.
ùr=  r  )r>   rG   rM   r  rf  r‰   r   r¯  r±   r²  ro  r¡  r  )rŒ  r/  r9  r  r  s       @r�   r,  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ˆ   r.  r‹  s    r�   rž  zInputsKernel.get_reads1  r0  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„   rI  rm  rk  rO  r°  r�  Úunwrap_storage_for_inputÚTorchBindObjectrn  r³   ©rÍ  rŒ   s     r�   rA  z%InputsKernel.unwrap_storage_for_input4  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…  rA  rÂ  )rf  Ú
inputs_newrŒ   rÌ   s       r�   r]  zInputsKernel.unwrap_storageG  sl   € ð 79ˆ
Øò 	!ˆAÜ˜!œXÔ&ØGHÖIÀ!”\×:Ñ:¸1Õ=ÐI�ÑIä ×9Ñ9¸!Ó<�Ø×Ñ˜aÕ ð	!ð Ðùò	 Js   œA%c                 ó   — yrö  r¢   r‹  s    r�   r=  zInputsKernel.is_externT  r©  r�   c                 ó   — yrÑ  r¢   r‹  s    r�   r2  zInputsKernel.num_readsW  r’  r�   c                óÞ   — t        t        j                     «       }| j                  D ]B  }t	        |t
        «      r||j                  |«      z  }Œ(|D ]  }||j                  |«      z  }Œ ŒD |S rˆ   )r>   r¬   r!   rf  r‰   r…   r7  )rŒ  re  rÏ  rh  Ú	inner_inps        r�   r7  z!InputsKernel.get_free_symbol_usesZ  sv   € ô ”u—|‘|Ñ$Ó&ˆØ—;‘;ò 	GˆCÜ˜#œvÔ&Ø�S×-Ñ-¨mÓ<Ñ<‘à!$ò G�IØ˜×7Ñ7¸ÓFÑF‘AñGð		Gð ˆr�   N)rÌ   rŠ   r¸   rÄ   rs  ru  rK  )rf  r6  r¸   zlist[IRNode | Sequence[IRNode]]rX  rv  rm  rx  )rž   rŸ   r    r¡   r:  r,  rž  rú  rA  r~  r]  r=  r2  r^   r7  r¢   r�   r�   r…  r…    s…   … à/Ó/ó ó

ó,,ð òó ðð$ ð
Ø3ð
à	(ò
ó ð
óóñ ˜NÓ+à$)ð
Ø!ð
à	!ò
ó ,ñ
r�   r…  c                  ó   — e Zd Zdd„Zdd„Zy)Ú	NopKernelc                 ó   — yrö  r¢   r‹  s    r�   r?  zNopKernel.is_no_opi  r©  r�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   rž  zNopKernel.get_readsl  r¤  r�   NrX  ru  )rž   rŸ   r    r?  rž  r¢   r�   r�   rK  rK  h  s   „ óôr�   rK  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   rE   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrˆ   )r  r£  s     r�   ræ   z&ConcatKernel.create.<locals>.<genexpr>¢  s   è ø€ Ò-WÈ1Ô.CÀA×.FÑ-Wùr¤  Fc              3  óô   K  — | ]p  }d |j                   v xr\ |j                   d    j                  t        j                  ¬«      xs- |j                   d    j                  t        j                  ¬«      –— Œr y­w)rÇ  ©rO  N)r^  rÁ  r  rJ  rL  ©rä   Úargs     r�   ræ   z&ConcatKernel.create.<locals>.<genexpr>©  sw   è ø€ ò ð ð ˜Ÿ™Ð!ò ð —H‘H˜U‘O×1Ñ1Ä×@SÑ@SÐ1ÓTò à—x‘x ‘×4Ñ4Ü&+×&<Ñ&<ð 5ó óñùs   ‚A6A8c              3  ój   K  — | ]+  }t        |«      xr |j                  «       j                  –— Œ- y ­wrˆ   )r  r  rN  r£  s     r�   ræ   z&ConcatKernel.create.<locals>.<genexpr>¹  s/   è ø€ ò 
ØFGÔ! !Ó$ÒA¨¯©«×)AÑ)AÓAñ
ùs   ‚13N)r  r  rÿ   r   rN  ©rÁ   rJ  rf  ©r±  )7r  r  r¥   r  rÉ   rÊ   rÂ  rs   r  r  rŸ  r	  r
  rF   r.  râ  r+  r  r  r  r‰   rL  r  rÿ   r   r/   r'  Úcurrent_noder¿   rè   rO  rm  rî   rk  r›  r³   r£  r   rŠ  rn  rf  rI  rl  r  rj   ri   rE  r‘  rH   ÚFOREACHÚregister_operation_listr_  rÁ   r]  r`  )rÍ  rf  r>  r  r  r  Úoffsets_startÚoffsets_endrÌ   Ú
input_sizer¯  Úoutput_striderŒ   rJ  Úany_input_is_storage_and_layoutÚfx_node_argsrN  Úconcat_kernelr  Úop_namesrh  rz  Úinput_unwrappedÚdevs                           r�   rŠ  zConcatKernel.createv  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ˆ   rD  rF  s      r�   ræ   z=ConcatKernel.can_realize_into_without_copy.<locals>.<genexpr>  s3   è ø€ ò á�B˜ô —‘× Ñ ×8Ñ8¸¸R×@ñùrG  rJ  )r‰   r„   Úcan_realize_into_without_copyrI  rk  rm  r³   rÛ  rJ  rL  rë  rÉ   r0  rè   rÒ   r±  r	  ÚExternKernelAlloc)rÍ  r   r¡  s      r�   rh  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ˆ   )rK  r7  r6  s     r�   r7  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 )NrH  rJ  r  )r‰   rO  r  rK  r³   r„   r£  rI  rm  ró  r±  rh  rp  rJ  r  rŠ  r  r  r  rÒ   r  rs   r  r  rŸ  )rÍ  r   r¡  rR  rJ  r9  r:  Ú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rö  r¢   r‹  s    r�   rÌ  zConcatKernel.should_allocate:  r©  r�   )rf  r¦  r>  rŠ   r¸   rm  rˆ   )r   r…   r¡  r"  r¸   r™   rm  rx  )r   r…   r¡  r…   r¸   r…   rX  )rž   rŸ   r    r{  rú  rŠ  rh  r^   r7  r£  rÌ  r¢   r�   r�   rO  rO  p  s˜   „ ñð
 òuó ðuðn à/3ð!
Øð!
Ø,ð!
à	ò!
ó ð!
ñF ˜NÓ+à$)ðCØ!ðCà	!òCó ,ðCð
 ò)ó ð)ôBr�   rO  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<   	 	 	 	 	 	 	 dA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dBˆ fd„ZdCd„ZdDd„ZdEd„ZdEd „Z	 dF	 	 	 	 	 dGd!„ZdHd"„ZdFdId#„ZdJd$„ZdKd%„ZdLd&„Ze dMd'„«       Z!e"	 	 	 	 	 	 	 	 dNd(„«       Z#e"dOd)„«       Z$e"dPd*„«       Z%e"dPd+„«       Z&e"	 	 	 dQ	 	 	 	 	 	 	 	 	 dRd,„«       Z'e"	 dS	 	 	 	 	 	 	 dTd-„«       Z(e"	 dS	 	 	 	 	 	 	 dUd.„«       Z)e"dPd/„«       Z*e"dPd0„«       Z+e"dPd1„«       Z,e"dPd2„«       Z-dEd3„Z.	 	 	 	 	 	 dVd4„Z/dFdWd5„Z0dXd6„Z1dYd7„Z2dSdZd8„Z3dLd9„Z4dHd:„Z5dHd;„Z6dHd<„Z7d[d=„Z8d\d>„Z9 e:d «      	 dS	 	 	 d]d?„«       Z;dLd@„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¢   rv  Úconstant_argsr‰  r{  rÀ   NúReinterpretView | NoneÚoutput_viewr^  Ú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]re  c                óD  •— t         ‰| �  |||¬«       || _        |r|ni | _        || _        |
| _        | j                  |«       | j                  |«       |	| _        | j                  «        i | _
        g | _        t        j                  j                  | _        i | _        y ©NrW  )r_  r>  ro  rÀ   rq  rw  Úset_cpp_kernel_nameÚset_python_kernel_nameru  Úcollect_arg_kwarg_propertiesr{  re  rs   r  rY  Úfx_noder   )rŒ  rÁ   rJ  rf  ro  rÀ   rq  rr  rs  ru  rw  ra  s              €r�   r>  zExternKernel.__init__Z  sŸ   ø€ ô 	‰ÑØØØð 	ô 	
ð
 +ˆÔÙ &‘f¨BˆŒØ&ˆÔØ&ˆÔØ× Ñ  Ô1Ø×#Ñ#Ð$6Ô7Ø-JˆÔ*Ø×)Ñ)Ô+Ø!#ˆÔØ "ˆÔÜ—w‘w×+Ñ+ˆŒà+-ˆÕr�   c                ó    — | g| j                   ¢S rˆ   r²  r‹  s    r�   r¡  zExternKernel.get_outputsz  r³  r�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   r£  z%ExternKernel.get_unbacked_symbol_defs}  r¤  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‰   rw  r  Ú_opsÚ
OpOverloadÚ_schemaÚ	argumentsÚ
kwarg_onlyrÁ   Ú	real_typerñ  rÊ   rÉ   rf  rx  ry  ru  Úschema_kwargs)rŒ  rŒ   rÌ   s      r�   r€  z)ExternKernel.collect_arg_kwarg_properties€  s¥  € ô ˜$×*Ñ*¬E¯J©J×,AÑ,AÔBð ×)Ñ)×1Ñ1×;Ñ;öð Ø—|’|ð ŸF™FØŸK™KØ%&§_¡_óóô $¤C¨¯©Ó$4Ó5Ö6˜’"Ò6ð 	Ôô$ ˜$×*Ñ*¬E¯J©J×,AÑ,AÔBð ×)Ñ)×1Ñ1×;Ñ;öàð —‘ §¡¸q¿¹ÑOÑOóð
 ð 	Ôô �d×&Ñ&¬¯
©
×(=Ñ(=Ô>Ø×5Ò5à$(×$4Ñ$4×$<Ñ$<×$FÑ$Fö6Ø È!Ï,Ë,�A—F“Fò6�Ô2ð  ×+Ñ+×3Ñ3×=Ñ=ö"ØÀÇÃ’ò"ˆDÕð "$ˆDÕùò?ùò 7ùòùò6ùò"s*   Á7HÂ+	HÄ+HÆHÆ/HÇ'H"Ç9H"c                óz   — t        | j                  t        «      r!| j                  «        | j	                  «        y y rˆ   )r‰   rJ  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 )NrE   )Ú'set_kernel_post_grad_provenance_tracingT)r=  )rf   Úmake_commentÚtry_get_kernel_namer´  r�  Úwrite_provenance_debug_handle)rŒ  Úwrapperr  Ú
origin_strÚ_detailed_origin_strr�  Údebug_handles          r�   Úcodegen_commentzExternKernel.codegen_commentª  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.codegen»  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)r  rE   N)Ú
startswithrŠ   )rä   r  s     r�   ræ   z3ExternKernel.set_cpp_kernel_name.<locals>.<genexpr>Ú  s%   è ø€ ÒK A¸¿¹ÀcÕ9J”S˜˜1˜2˜—ZÑKùs   ‚,™,rE   r^  Ú_vz
at::_ops::z::call)rs  rs   r  Úcpp_wrapperr‰   rw  r  r…  r†  Ú	namespaceÚ_overloadnamerž   rÃ  ÚreplaceÚtorchgen.aoti.fallback_opsrŸ  r¶  rä  r‡  rÁ   )rŒ  rs  r  ÚopnamerŸ  Úversion_infoÚlatest_versions          r�   r~  z ExternKernel.set_cpp_kernel_name¾  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�  )	rr  rw  r‰   r  r…  ÚHigherOrderOperatorrž   rŸ   r¦  )rŒ  rr  r  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 )NrE   )ÚCppWrapperCpu)Úcodegen.cpp_wrapper_cpur°  r  r³   rs   r  Údevice_typeÚ
fx_wrapperrr  r£  r‰   rŽ  rs  Ú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¯  rz  rx  )	r  rŠ  r  r  r  r  r¥  r¢  ró  )rŒ   rl  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        |«      «       �Œ  |||«      \  }} ||i |¤Ž}d}t        jF                  j                  x}rÂt        jH                  jJ                  jM                  d
«      }tO        «       }t        jH                  jP                  t        jR                  jT                  jV                  u r|d   }tY        t        jH                  «      }|5  t[        |t        jH                  |«       ddd«       t]        |||«      }t/        |t^        t`        f«      s|gn|}|D ]�  }t/        |t        jb                  «      sŒ|jd                  sŒ+tf        jh                  rŒ<d}t        j                  jH                  jJ                  jM                  dd«      x}r|› d|› �}|t        j                  _5        Œ‘ |||||fS c c}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Ö  ÚpytreeÚtree_unflattenr¶  )	Únew_tensor_argsÚnew_non_tensor_argsr1  Ú
it_tensorsÚit_non_tensorsÚ	is_tensorrÏ  Úargs_flat_is_tensorÚ	args_specs	          €€r�   Úunflatten_argsz3ExternKernel.process_kernel.<locals>.unflatten_argsU  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Ç  rE   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]])6r¼  Útree_flattenr   rs   r  r  rê   Úcreate_symintnoderÂ  ÚGeneratorStater  rË   r³   r  r  Údefault_generatorsÚclone_stateÚOpaqueObjectStater  r…   r�  r  rK  r‰   rk  ro  Ú	constantsÚtorchbind_constantsrB  Ú	get_valuer²   Úopaque_example_valuer³  Úirrü   rþ  rY  r^  r¶  r
   r  Ú_higher_order_opsÚeffectsÚwith_effectsr1   r8   r2   r¥   r¦   r–  Ú	is_sparserF   Úgraph_partitionÚdisable_cudagraphs_reason)rÍ  r  r¿   rÀ   Úbinded_argsÚ	args_flatÚtensor_argsÚnon_tensor_argsÚreal_non_tensor_argsrU  rµ   Údevice_indexrÅ  rŒ   Úexample_argsÚnew_argsÚ
new_kwargsÚexample_outputr{  rê   Únode_meta_valÚctxÚexample_out_lir  Úmsgr®  rÃ  rÄ  s                             @@r�   Úprocess_kernelzExternKernel.process_kernel  s  ù€ ð"  $¨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Ñˆ�*Ù Ð8¨ZÑ8ˆàGKÐÜŸ™×-Ñ-Ð-ˆ9Ð-ÜŸ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ð ØØØØð
ð 	
ùòY B÷jKð Kús   È
W8ÔW=×=X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Ç  rS  rÏ  r‚   r   z@convert_to_reinterpret_view failed: stride=%s offset=%s index=%sFr„  rH  )&r‰   rk  r³   rO  rl  rs   r  r“  ro  r¥  r^  rn  r›  rJ  r	  r-   r  rJ  rL  r&  r/   r  r  rG   r›  r  r  rœ  Ústride_varsÚ
offset_varrk   rš  r´  rÔ  rI  rL  rû  r  )rÍ  rŒ   Úx_unwrap_viewrŒ  Úx_unwrap_view_fx_nodeÚ
index_argsr  rƒ  rË   rQ  rM  Úexpecteds               r�   Úconvert_to_reinterpret_viewz(ExternKernel.convert_to_reinterpret_view·  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)rP  )r  r  rH  )#rß  r‰   r   r¬   r­   r®   r¯   rŠ   r±   rÇ  r?   rs   r  Úadd_tensor_constantr  rP  r  r  r  r  r„   r�  rI  rO  r  rk  ró  r  rl  rí  rÔ  rm  ÚNonTensorObjr²   r¹  rC  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 r  )r  rÉ   r0  r¹  )rÍ  rŒ   r   s      r�   Úrequire_stride1zExternKernel.require_stride1#  sT   € ä  Ô#Ü�1—<‘<“>Ó" aÒ'Ø�ØŸ,™,›.ò �Ø˜Q“;Ø’Hðð �~‰~˜aÓ Ð r�   c                ó2	  — |€|€J ‚|j                  «       dv r|s|S t        |«      �rät        |j                  «       t        «      r¥|r�t        ||«      xr$ t        |j                  «       j                  «       }t        |dd|rJt        t        j                  j                  j                  |j                  «       j                  «      «      n||¬«       |S t        |ddd ||¬«       |S t        |j                  «       t        t        f«      rf|r|j                  «       j!                  |«      s5|rCt#        ||j                  «       j                  |j%                  «       «      r|�t'        ||«      S |S t        |j                  «       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        |t0        «      rÃt        |j2                  t4        «      r©t        |j2                  t6        «      s�t        |j9                  «       x}«      rtt;        |d«      rht        |j2                  t<        «      sN	 | j?                  |j2                  «      |_        |r| jA                  |||¬«      S |r| jC                  |||¬«      S 	 d }	|j%                  «       }
|�´t        j                  j                  }tG        tI        |j%                  «       «      «      D �cg c]<  }|jK                  ||   d	«      r%|jM                  |j%                  «       |   d
«      r|‘Œ> }	}|	D ].  }tN        jP                  jR                  jU                  ||d	d«      }Œ0 | jW                  |«      }t        |dd|||¬«       |rt        ||«      sJ ‚|S |	r<|
�|€J ‚tN        jP                  jR                  jY                  ||
«      }t'        ||«      S |S # tD        $ r Y �ŒHw xY wc c}w )N)r   rE   TF)r¼  rÆ  rÇ  r  rÅ  zHthe MutationLayoutSHOULDREMOVE's real layout shouldn't be FlexibleLayoutrI  rÈ  r   rÞ   rE   )-rë  r  r‰   r  r	  rÌ  r4   r   rK  rø   rs   r  r  rR  rL  rp  rË  rA  r  rV  r‘  r–  r.  r†  r„   rI  rk  rO  rl  r±  ri  rí  Úrequire_stride_orderÚrequire_exact_stridesrÔ  rÊ   rÉ   rE  rª  r  r³  ÚloweringÚslice_r¹  r½  )rÍ  rŒ   rÓ   r)  r  Úuse_current_stride_orderÚmutation_layoutr–  rl  Úexpanded_dimsÚ	orig_sizer  rÌ   r>  s                 r�   Úrequire_strideszExternKernel.require_strides-  sS  € ð Ð  MÐ$=Ð=Ð=à�;‰;‹=˜FÑ"©=ØˆHô ! Õ#Ü˜!Ÿ,™,›.¬.Ô9Ùô 0RØ˜5ó0ò 0Kä3°A·L±L³N×4IÑ4IÓJÐJð -ô *ØØ#Ø(-ñ  8ô -Ü !§¡× 0Ñ 0× HÑ HØ$%§L¡L£N×$9Ñ$9ó!"ôð "'à&3õð �Hô *ØØ#Ø(-Ø%)Ø&3Ø&3õð �HÜ˜AŸL™L›N¬[¼/Ð,JÔKÙ˜1Ÿ<™<›>×;Ñ;¸EÔBá!Ü1Ø% q§|¡|£~×'<Ñ'<¸a¿j¹j»lôð %Ð0ô 4°A°}ÓEðð ðô
 Ø$%§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ÓˆäØØØ!ØØ'Ø'õ	
ñ Ü5°a¸Ô?Ð?Ð?ð ˆñ ØÐ(¨]Ð-FÐFÐFÜ—‘×(Ñ(×/Ñ/°°9Ó=ˆAä2°1°mÓDÐDàˆøôW 'ò Úðüòs   Ë;5R Ì1R ÎARÒ	RÒRc           
     ó°   — | j                  ||D �cg c]4  }t        |t        j                  «      r|j                  j
                  n|‘Œ6 c}|¬«      S c c}w )N)r)  r  )rü  r‰   r  ÚSymIntrµ   rP  )rÍ  rŒ   r)  r  rå   s        r�   rõ  z"ExternKernel.require_exact_stridesÑ  sV   € ð ×"Ñ"ØàKXöØFGœz¨!¬U¯\©\Ô:�—‘—’ÀÑAòð (ð #ó 
ð 	
ùòs   ‘9A
c                ó*   — | j                  |||¬«      S )N)rÓ   r  )rü  )rÍ  rŒ   rÓ   r  s       r�   rô  z!ExternKernel.require_stride_orderÝ  s   € ð ×"Ñ" 1¨EÀÐ"ÓOÐOr�   c                ó.   — | j                  |t        «      S rˆ   )rô  rK  rC  s     r�   Úrequire_channels_lastz"ExternKernel.require_channels_lastã  s   € à×'Ñ'¨Ô+<Ó=Ð=r�   c                ó.   — | j                  |t        «      S rˆ   )rô  rM  rC  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ý  )ro  ÚAttributeErrorrÔ  rs   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Œ   r	  s      r�   rD  zExternKernel.require_contiguousë  s@   € ó	Sñ ˜AÔØˆHà×,Ñ,Ø”>×4Ñ4°Q·Z±Z³\ÓBóð r�   c                óh   — | j                  |t        j                  |j                  «       «      «      S rˆ   r
	  rC  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¥   rx  rÉ   rš  r´  rw  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³   )rs   r  r£  rx  rÉ   ro  r¶  rî   rf  rÂ  rŽ  Úval_to_arg_str)rŒ  r¼  r1  Úname_to_arg_propertiesrU  rÌ   rŒ   ÚpropÚtype_rï   r9  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³   )rs   r  r£  rw  r	  rf  ro  rÀ   rî   rx  rÉ   r¶  rÂ  rŽ  r	  r4  r	  )rŒ  rf  Úneed_codegen_constant_argsr¿   rÌ   rŒ   r	  s          r�   Úcodegen_argszExternKernel.codegen_argsM  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À   ry  r.  )rŒ  r	  rÀ   rU  s       r�   Úget_kwargs_valuezExternKernel.get_kwargs_valueg  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¹  )rs   r  r£  rw  rÉ   r‹  ru  r	  r‰   r   rÂ  ry  r¶  rŽ  r	  rÀ   r  )rŒ  Úskip_outrÀ   r	  r  r	  Úks          r�   Úcodegen_kwargszExternKernel.codegen_kwargst  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�  rE   r   Ú
unknown_op)r�  r  r¾   r¦  Úrsplit)rŒ  r  Ú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                  rãt        j                  j                  sÈt        | j                  «       «      dk(  ry t        j                  j                  j                  | j                  «       «      }t        j                  j                  j                  | j                  «       «      }| j                  «       }|j                  d| j                  «       › d|› d|› d|›d�	«       y y y )Nr   zassert_size_stride(r	  r  )rF   Úsize_assertsrs   r  r£  rn   r  rŽ  Úcodegen_shape_tupler0  r(	  r�  ro  )rŒ  r“  rÿ   r   r'	  s        r�   Úcodegen_size_assertsz!ExternKernel.codegen_size_asserts™  s¸   € Ü×Ò¤q§w¡w×':Ò':ä˜TŸ]™]›_Ó-°Ò2ØÜ—7‘7×'Ñ'×;Ñ;¸D¿M¹M»OÓLˆDÜ—W‘W×)Ñ)×=Ñ=¸d¿o¹oÓ>OÓPˆFØ×&Ñ&Ó(ˆGØ×ÑØ% d§m¡m£oÐ%6°b¸¸¸bÀÀÈÈ7È+ÐUVÐWõð (;Ðr�   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(r	  r  z	# buffer z (op: z) is assumed to be not aligned)
rF   Úalignment_assertsrs   r  r£  ro  rÐ  r(	  r�  rg   )rŒ  r“  rÁ   Úalignedr'	  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'))	rF   Útest_configsÚtrack_memory_lifecyclers   r  r£  Ú"write_memory_track_allocation_oncero  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  r0  )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€  rh  Úc)rs   r  r  r  r0  r  rÊ   rÉ   rl   r…  rS  rî   r  r$  rR   r§   rÒ   ro   r¬   r½  r¦   )rŒ  r  rC  rQ  rŒ   rÌ   r  Úindex_orderrï   rð   rñ   rÓ   r  rË   Ú	new_sizesrÎ   r*  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…  r7  ro  rÀ   r¨   )rŒ  re  Úmaybe_get_symbolsrÏ  rU  s        r�   r7  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 )Nrr  zpython_kernel_name=r¹  rº  )r¾   r|  ÚfieldsrÁ   rÂ  rz  rÏ  )rŒ  r  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Á   r^  rJ  r  rf  r6  ro  rv  rÀ   údict[str, Any] | Nonerq  rp  rr  r^  rs  r^  ru  rt  rw  rv  r¸   r¹   r¨  rª  rL  rˆ   )r“  rx   r  r^  r¸   r¹   ©r“  rx   r¸   r¹   ©rs  r^  r¸   r¹   )rr  r^  r¸   r¹   r]  rj  )rŒ   r…   r¸   r„   )r  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¸   rO  rK  )NNF)
rŒ   r…   rÓ   úSequence[int] | Noner)  r[  r  r™   r¸   r…   rm  )rŒ   r…   r)  ri  r  r™   r¸   r…   )rŒ   r…   rÓ   ro  r  r™   r¸   r…   )r¿   rv  rÀ   r{  r¸   rv  )r¼  rw  r¸   r›   ©r¸   r›   )r	  rÄ   rÀ   r   r¸   r   )r	  r™   r¸   r›   )r¸   z'tuple[list[Sequence[Expr]], list[Expr]])r¸   ztuple[Expr, Sequence[Expr]]rx  )?rž   rŸ   r    r{  ro  r¡   r|  r}  r§   rÀ   rq  rr  rs  r¥   ru  rw  rx  ry  rz  r{  re  r>  r¡  r£  r€  r‡  r—  rš  r~  r  r‘  r·  r~  r¹  rú  rå  rí  r�  rò  rü  rõ  rô  r	  r	  rD  r	  r�  r	  r	  r	  r	  r!	  r(	  r,	  r0	  r5	  r7	  r>	  r^   r7  rÂ  rù  r,  r-  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ó+ó$ð
 ò
ó ð
ð ð^
Ø!ð^
Ø*-ð^
Ø9<ð^
ð
ò^
ó ð^
ð@ òE
ó ðE
ðN ò!!ó ð!!ðF ò!ó ð!ð ð '+Ø37Ø#ðaàðað $ðað 1ð	að
 ðað 
òaó ðaðF àQVð	
Øð	
Ø'9ð	
ØJNð	
à	ò	
ó ð	
ð àDIðPØðPØ,ðPØ=AðPà	òPó ðPð
 ò>ó ð>ð ò?ó ð?ð òó ðð" ò
ó ð
óð"Ø!ð"Ø+9ð"à	ó"ôHXóBó4Jôó4	ó
óó	=ó$ó'ñ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³   r_  r>  rs   r  r_  rÁ   r`  )rŒ  rJ  rf  ro  rÀ   rq  rr  rs  ru  rw  Úunwrapped_inputsra  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rö  r¢   r‹  s    r�   rÌ  zExternKernelOut.should_allocate)  r©  r�   rG	  rE	  )rJ  râ  rf  r¦  ro  rv  rÀ   rF	  rq  rp  rr  r^  rs  r^  ru  rv  rw  rv  r¸   r¹   rX  )rž   rŸ   r    rš  r>  rÌ  r,  r-  s   @r�   rL	  rL	    s‹   ø„ ó1ð (*Ø(,Ø.2Ø)-Ø&*Ø79Ø+/ð)àð)ð !ð)ð %ð	)ð
 &ð)ð ,ð)ð 'ð)ð $ð)ð (5ð)ð )ð)ð 
õ)÷:r�   rL	  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)rJ  rf  ro  rr  rs  rw  )r  rë  r¿  r_  r>  rL  r(  rä  rœ  ÚrandintÚlow_out)rŒ  r£  r  Úlimitsra  s       €r�   r>  zRandomSeeds.__init__.  sl   ø€ Ü—‘œUŸ[™[Ó)ˆÜ‰ÑÜØÜ—k‘kØ�Wôð
 Ø!Ÿ:™: v§z¡z°E°7Ð;Ø5ð >ÜŸ™×,Ñ,ð 	õ 	
r�   )r£  rŠ   r  rc  r¸   r¹   ©rž   rŸ   r    r>  r,  r-  s   @r�   rT	  rT	  -  s   ø„ ÷
ñ 
r�   rT	  c                  óh   ‡ — e Zd Zdd„Z	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zd	d„Zˆ xZS )
ri  c                ó&   — |j                  | «       y rˆ   )Úgenerate_extern_kernel_allocr™  s     r�   rš  zExternKernelAlloc.codegenB  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ˆ   r3  )rä   rÌ   s     r�   ræ   z-ExternKernelAlloc.__init__.<locals>.<genexpr>Q  s   è ø€ ÒC¨Q”:˜a¤×(ÑCùr!  )r]  rè   r_  r>  r   r   r…   r  rs   r  r_  rÁ   r`  )rŒ  rJ  rf  ro  rÀ   rr  rs  ru  rw  rQ	  ra  s             €r�   r>  zExternKernelAlloc.__init__E  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_allocatee  rÿ  r�   c                ó   — t         ‚rˆ   rˆ  r‹  s    r�   r�  z"ExternKernelAlloc.apply_constrainth  r‰  r�   rG	  )r¢   NNNr¢   N)rJ  r  rf  r¦  ro  rv  rÀ   rF	  rr  r^  rs  r^  ru  rv  rw  rv  r¸   r¹   rX  rL  )rž   rŸ   r    rš  r>  rÌ  r�  r,  r-  s   @r�   ri  ri  A  s„   ø„ ó3ð (*Ø(,Ø)-Ø&*Ø79Ø+/ð)àð)ð !ð)ð %ð	)ð
 &ð)ð 'ð)ð $ð)ð (5ð)ð )ð)ð 
õ)ó@÷"r�   ri  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 )rf  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Ü  )
r_  r>  ro  rs   r  r”  Úmutation_namesÚmutating_noder_  rÁ   )rŒ  rJ  Úmutated_noderd	  Úmutated_node_namera  s        €r�   r>  zMutationOutput.__init__q  sb   ø€ ô 	‰Ñ˜d¨6ÐÔ2Ø(×1Ñ1Ó3ÐÜ	�‰×#Ñ#Ð$5Ô6Ø0Ð1ˆÔØ(5ˆÔÜ—G‘G×+Ñ+¨DÓ1ˆ�	r�   c                ó   — | j                   S rˆ   )rd	  r‹  s    r�   r¨  zMutationOutput.get_defining_op{  s   € Ø×!Ñ!Ð!r�   c                ó   — | j                   S rˆ   )rc	  r‹  s    r�   rC  z!MutationOutput.get_mutation_names~  rd  r�   c                 ó   — yrý  r¢   r‹  s    r�   rÌ  zMutationOutput.should_allocate�  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ˆ   )rs   r  Útry_get_buffer)rä   rÁ   s     r�   ræ   z6MutationOutput.get_mutation_buffers.<locals>.<genexpr>ˆ  s   è ø€ ÒP¸œŸ™×.Ñ.¨t×4ÑPùs   ‚)+)rC  )rŒ  rc	  rŒ  s      r�   Úget_mutation_buffersz#MutationOutput.get_mutation_buffers„  s=   € Ø×0Ñ0Ó2ˆñ QÀÔPö
àØˆò ò
ð 	
ùò 
s   œ*)rJ  r  re	  r…   rd	  rƒ  r¸   r¹   rÒ  rz  rX  ©r¸   r¦  )
rž   rŸ   r    r{  r>  r¨  rC  rÌ  rm	  r,  r-  s   @r�   rf  rf  l  sA   ø„ ñð2Ø ð2Ø06ð2ØGPð2à	õ2ó"ó#ó÷
r�   rf  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   ÚexperimentalrE   r¡  )rÉ   ÚTMADescriptorExperimentalÚTMADescriptorStable)rÍ  rP  Útma_metas      r�   Ú_create_implzTMADescriptor._create_impl›  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—  rq	  rw	  )rÍ  rP  rv	  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 )NrH  )r_  r>  rp  rO  r  r   r   rn  r¦   rP  rs   r  r_  rÁ   r`  )rŒ  rP  rf  ro  ra  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ˆ   )rP  r‹  s    r�   Ú
get_tensorzTMADescriptor.get_tensorÉ  rÆ  r�   )rP  r…   rv	  ztuple[str, tuple[Any, ...]]r¸   rp	  )rP  r…   rf  rv  ro  rv  r¸   r¹   rG	  rK  )rž   rŸ   r    r{  rq	  r¡   rú  rw	  rŠ  r>  rš  r~	  r,  r-  s   @r�   rp	  rp	  �  sš   ø… ñð (*€FÐ$Ó)àð=Øð=Ø'Bð=à	ò=ó ð=ð ðØðØ'Bðà	òó ðð)Øð)Ø&3ð)ØDQð)à	õ)ó..÷r�   rp	  c                  ó:   ‡ — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )rt	  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)rE   rÞ   ©rP  rf  ro  )	rÉ   r  rÛ  r  Ú
block_dimsÚelement_sizer(  r_  r>  )rŒ  rP  r  r‚	  rƒ	  rf  ro  ra  s          €r�   r>  z"TMADescriptorExperimental.__init__Õ  s¿   ø€ ô �4‹y˜FÑ"Ð"Ð"Ü�4‹yœC 
›OÒ+Ð+Ð+àÐØ!×+Ñ+Ó-×6Ñ6ˆLàˆŒ	Ø$ˆŒØ(ˆÔÜ˜Ÿ	™	“NˆŒ	à�ˆð
Ø�Y‰Yð
à�_‰_ð
ð ×Ñð
ˆô 	‰ÑØØØ'ð 	õ 	
r�   rˆ   )
rP  r…   r  úlist[int | torch.SymInt]r‚	  r„	  rƒ	  r|  r¸   r¹   ©rž   rŸ   r    r{  r>  r,  r-  s   @r�   rt	  rt	  Í  sG   ø„ ñð $(ð
àð
ð 'ð
ð -ð	
ð
 !ð
ð 
÷
ñ 
r�   rt	  c                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )ru	  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_shaper_  r>  )rŒ  rP  rˆ	  ra  s      €r�   r>  zTMADescriptorStable.__init__ý  s(   ø€ Ø&ˆÔä‰ÑØØ�8Ø%ð 	õ 	
r�   )rP  r…   rˆ	  r„	  r…	  r-  s   @r�   ru	  ru	  õ  s   ø„ ñ÷
ñ 
r�   ru	  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)r_  r>  r`  Úexample_inputsrs   r  r_  rÁ   r`  Úmake_subgraphÚsubgraphr4  rf  ri  r  Úgraph_input_namesrÂ  Ú
sym_inputsÚtorch._inductor.configr³  rF   Úset_graph_handlerr   ÚrunÚ
operationsr–  rR  )rŒ  rJ  r•   r`  r�	  Úsubgraph_namer½  r”	  Úsym_inpÚsym_varÚinductor_configÚbase_patchesÚmerged_patchesrZ  ra  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__8  s   € Ø"�”
Ø!ŸJ™J�•	r�   N)r  ry   )rž   rŸ   r    r>  r¢   r�   r�   ÚCodegenGraphr¡	  7  s   „ ô'r�   r£	  )r4  rf  r÷  Ú'codegen_subgraph_with_flattened_outputsr’	  r”	  rÁ   )rŒ  r“  r£	  r  Úouter_inputss        r�   rš  zSubgraphBuffer.codegen6  sz   € ÷	'ñ 	'ô
   §¡Ô,Ð,Ð,Ø7;·{±{ÖC°!˜×+Ñ+Õ-ÐCˆÐCà×7Ñ7Ù˜Ÿ™Ó'Ø-ˆd�o‰oÐ- Ð-Ø�Y‰YˆKõ	
ùò Ds   °Brˆ   )rJ  râ  r•   r©  r`  útorch.fx.GraphModuler�	  ú	list[Any]r™	  rÄ   r½  rF	  rG	  ©rž   rŸ   r    r>  rš  r,  r-  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e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Ì   r  s     €r�   ræ   zBUserDefinedTritonKernel.get_kernel_and_metadata.<locals>.<genexpr>X  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±  r4  r®	  r±	  r²	  rÂ  rÂ   r°	  r³	  Úconfigs)rŒ  r¬	  r­	  r¸	  Úrestore_value_argsÚreset_to_zero_argsrÌ   r  s          @r�   Úget_kernel_and_metadataz/UserDefinedTritonKernel.get_kernel_and_metadataK  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.
        FrE   r   c              3  ó&   K  — | ]	  }|d k(  –— Œ y­wr+  r¢   r  s     r�   ræ   z<UserDefinedTritonKernel.can_fuse_epilogue.<locals>.<genexpr>ž  s   è ø€ ÒN˜a�1˜•6ÑNùr  T)rF   Ú*epilogue_fusion_user_defined_triton_kernelÚarg_accessesÚcan_fuse_epiloguerÉ   Úkernel_storesÚstoresÚmutable_argsr‰   r„   rI  rm  r„  r  rè   r¯  r‹  s    r�   rÀ	  z)UserDefinedTritonKernel.can_fuse_epiloguek  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                  ||| j                  ||| j
                  |«      \  }}	}
}| j                  D �ci c]  }|| j                  |«      “Œ }}|rzt        | j                  j                  j                  «      dk(  sJ ‚t        t        | j                  j                  j                  «      «      j                  }||v s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'        j.                  d«      |«      «      D �]q  \  }}||v r |«       rŒ|j1                  |«       |j1                  |«       t3        |t4        «      r?|j1                  |j7                  «       «       |j1                  |j9                  «       «       Œ„t3        |t:        t<        t>        t@        jB                  f«      r,|j1                  |«       |j1                  tE        |«      «       ŒÚ||v r(|j1                  d«       |j1                  t:        «       �Œ|€R	  |«       r(|j1                  d«       |j1                  t:        «       �Œ8|jG                  «        |jG                  «        �ŒZtI        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_dictrE   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½  r.  NzUnsupported arg type: r  T)Ú	arg_typesÚraw_argsÚraw_keysÚtriton_metaÚinductor_metar!  r  Úoriginal_fxnode_name))r-  rÌ	  r»	  Ú!define_user_defined_triton_kernelrÀ   Úgridru  r	  rÉ   r¿	  r‰  r  rÖ  r×  rÁ   ÚparamsÚis_constexprÚnumr>   r¸  r  r  rÒ   ÚrepeatrÂ  r‰   r…   r÷  r  rŠ   r   r™   r¬   r   r³   rÌ  rÔ  r—  Úgenerate_kernel_callr  r�  )rŒ  r“  rÅ	  rÌ	  r  r¸	  r¹	  rº	  Únew_namerÑ	  rÒ	  Úextra_launch_argsr 	  Ú
named_argsÚmutable_arg_nameÚepilogue_computed_bufferrõ   r.  Ú
constexprsÚconstexpr_namesr¿   rÎ	  Úraw_keys_filteredÚraw_args_filteredrÁ   rU  r°	  s                             @r�   rÇ	  z UserDefinedTritonKernel._codegen¯  s+  ø€ õ 	Ið ×(Ñ(Ó*ñ	
ØØØØð ×5Ñ5ØØØ�K‰KØØØ�I‰IØó
ñ	
ØØØØð 26×1SÑ1Sö
Ø,-ˆAˆt×$Ñ$ QÓ'Ñ'ð
ˆ
ð 
ñ Ü�t×(Ñ(×4Ñ4×;Ñ;Ó<ÀÒAÐAÐAÜ#¤D¨×):Ñ):×)FÑ)F×)MÑ)MÓ$NÓO×TÑTÐØ# zÑ1Ð1Ð1Ø*9Ñ'Ð$ aØ+CˆJÐ'Ñ(à%+§]¡]Ö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´E·J±JÐ!?Ô@Ø—‘˜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ð 	%õ 	
ùòu
ùò 4ùÚEs   ÁM(Ä M-Ä$M2Ä6M2c                óP   •— t         ‰| �  |«      t        | j                  |«      z  S rˆ   )r_  r7  r'   rÕ	  r`  s     €r�   r7  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).r  r‰   r„   r…  rA  r�  rp	  rŠ  rÂ  rÉ   r  r  r   r³   r_  r>  r‡  r¦   r·	  rÕ	  r»	  r±  r°	  ru  rµ	  rç	  rè	  rÀ   Úastr   Ú
kernel_srcÚparseÚ
kernel_astrÁ	  Úkernel_argsr¿	  r‰  r  r¶  rÁ   rÃ	  rf  re  rs   r  r`  )rŒ  r·	  rÕ	  Útma_descriptor_metadatarí	  rf  rÀ   ro  r 	  r  r  r  r¸	  rõ   rU  rç	  rè	  Úautotuned_kwargsré	  r€  rŒ  ra  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                óL  •— t         j                  st        ‰| �  «       S | j                  j
                  j                  D �ci c]4  }|j                  | j                  |j                     j                  «       “Œ6 }}t        | j                  j
                  j                  «      }t        || j                  «      D ��ci c]   \  }}|j                  |j                  «       “Œ" }}}t        j                  t!        | j                  j
                  j                  D �cg c]  }|j#                  |«      ‘Œ c}«      t!        | j                  j
                  j                  D �cg c]  }|j#                  |«      ‘Œ c}«      t!        «       ¬«      }|S c c}w c c}}w c c}w c c}w ©Nr  )rF   r¾	  r_  r,  r¿	  r‰  r/  rÁ   rí	  ro  r¥   r  rÒ   re  rG   r  r>   Úrename)	rŒ  Úformal_arg_depÚread_renamesÚformal_arg_writesÚ
mut_outputÚwrite_renamesrš  r‰  ra  s	           €r�   r,  z'UserDefinedTritonKernel.get_read_writess  s…  ø€ ô ×@Ò@Ü‘7Ñ*Ó,Ð,ð
 #'×"3Ñ"3×"?Ñ"?×"EÑ"Eö
àð ×Ñ ×!1Ñ!1°.×2EÑ2EÑ!F×!OÑ!OÓ!QÑQð
ˆð 
ô
 ! ×!2Ñ!2×!>Ñ!>×!EÑ!EÓFÐô /2Ø! 4×#8Ñ#8ó/÷
á*� 
ð ×Ñ ×!4Ñ!4Ó!6Ñ6ð
ˆñ 
ô #×-Ñ-Üð  $×0Ñ0×<Ñ<×BÑBöàð —J‘J˜|Õ,òóô ð  $×0Ñ0×<Ñ<×CÑCöàð —J‘J˜}Õ-òóô #›ô
ˆð Ðùò9
ùó
ùòùòs   Á9FÂ?%FÄFÅ"F!c                ó,   — t        | j                  «      S rˆ   )r¥   re  r‹  s    r�   r¡  z#UserDefinedTritonKernel.get_outputs™  s   € Ü�D×)Ñ)Ó*Ð*r�   c                ó   — | j                   S rˆ   rÅ  r‹  s    r�   r  z"UserDefinedTritonKernel.get_deviceœ  rÆ  r�   )r¸   z(tuple[Kernel, Any, list[str], list[str]]rX  rG	  )r“  rx   rÅ	  ztuple[ComputedBuffer, str]r¸   r¹   )r“  rx   rÅ	  z!tuple[ComputedBuffer, str] | Noner¸   r¹   rm  rx  rª  )
r·	  rŠ   rÕ	  r   rî	  r{  rí	  r{  r¸   r¹   rs  r¨  r`  )rž   rŸ   r    r{  r»	  rÀ	  r   rš  rÉ	  rÇ	  r^   r7  r£  r>  r,  r¡  r  r,  r-  s   @r�   rª	  rª	  F  sû   ø„ ñóGó@6ðp ò<ó ð<ð7Ø+ð7Ø>Xð7à	ó7ðe
à%ðe
ð ;ðe
ð 
ó	e
ñN Ð5Ó6à$)ð
Ø!ð
à	!ô
ó 7ð
óðN)ð ðN)ð ð	N)ð
 "0ðN)ð $ðN)ð 
õN)ð` ô#ó ð#óJ+÷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ˆ   r3  ©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÷  rÿ	  s     r�   ræ   z3InplaceBernoulliFallback.codegen.<locals>.<genexpr>§  s   è ø€ ÒI¸””V˜Q“×1Ñ1×3ÑIùs   ‚(*rÈ  r	  z, NULL)r  )rè   rf  rs   r  r£  r�  r·  rË  rÉ  Úreprro  Ú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_allocate´  rÿ  r�   c                ó&   — | j                  d«      gS rí  ©r:  r‹  s    r�   rC  z+InplaceBernoulliFallback.get_mutation_names·  ó   € Ø—‘ Ó"Ð#Ð#r�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   r£  z1InplaceBernoulliFallback.get_unbacked_symbol_defsº  r¤  r�   c                ó^  •— t         ‰| �  d t        |j                  «       ¬«      | j	                  |g«      ||¬«       t
        j                  j                  |j                  «       «       t
        j                  j                  | «      | _
        t
        j                  j                  | «       y )NrÅ  ©rw  )r_  r>  r‡  r  r]  rs   r  r”  ro  r_  rÁ   r`  )rŒ  rw  rŒ   ro  ra  s       €r�   r>  z!InplaceBernoulliFallback.__init__½  s€   ø€ ô 	‰ÑØÜ˜aŸl™l›nÔ-Ø×Ñ  Ó$ØØ#ð 	ô 	
ô 	
�‰×#Ñ# A§J¡J£LÔ1Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(r�   rG	  rX  rz  rª  )rw  r�   rŒ   r…   ro  r   r¸   r¹   ©
rž   rŸ   r    r{  rš  rÌ  rC  r£  r>  r,  r-  s   @r�   rû	  rû	     sF   ø„ ñóóó$óð)Ø'ð)Ø,2ð)ØDGð)à	÷)ñ )r�   rû	  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 )ÚInplaceCopyFallbackrü	  c                óR   — | j                  «       \  }}}|j                  |||«       y rˆ   )r	  Ú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í  r
  r‹  s    r�   rC  z&InplaceCopyFallback.get_mutation_namesÙ  r
  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_)rr  rs  r   )	r_  r>  rs   r  r”  ro  r_  rÁ   r`  )rŒ  rJ  rf  ro  ra  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�  r
  r‡  r  )rÍ  r¡  r   r
  r  rf  ro  r1  s           r�   rŠ  zInplaceCopyFallback.createñ  sX   € ð 25°c°
Ö;¨1�#×#Ñ# AÕ&Ð;ˆÐ;Ø%˜ˆÜ$Ü˜cŸn™nÓ.Ô/ØØó
ˆð
 ˆùò <s   ‡ArG	  rX  rz  rª  )rJ  r  rf  r¦  ro  rv  r¸   r¹   rm  )r¡  r…   r   r…   r
  r™   r¸   r
  )rž   rŸ   r    r{  rš  rÌ  rC  r£  r>  rú  rŠ  r,  r-  s   @r�   r
  r
  Í  s~   ø„ ñó<óó$óð)àð)ð !ð)ð %ð	)ð
 
õ)ð$ à<Að
Øð
Ø%ð
Ø59ð
à	ò
ó ô
r�   r
  c                  ó8   — e Zd ZdZdd„Zd	d„Zd
d„Zdd„Zd	d„Zy)ÚMutatingFirstArgExternKernelrü	  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÷  rÿ	  s     r�   ræ   z7MutatingFirstArgExternKernel.codegen.<locals>.<genexpr>  s   è ø€ Ò9¨ˆa×!Ñ!×#Ñ9ùr!  rÈ  r	  r  )	r4  rf  rÉ  r
  ro  r�  r·  rË  r
  )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í  r
  r‹  s    r�   rC  z/MutatingFirstArgExternKernel.get_mutation_names  r
  r�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   r£  z5MutatingFirstArgExternKernel.get_unbacked_symbol_defs  r¤  r�   c                 ó   — yrö  r¢   r‹  s    r�   Úhas_side_effectsz-MutatingFirstArgExternKernel.has_side_effects  r©  r�   NrG	  rX  rz  rª  )	rž   rŸ   r    r{  rš  rÌ  rC  r£  r
  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Å  )ro  z"inductor_ops.resize_storage_bytes_z&torch::inductor::resize_storage_bytes_)r‰   rŠ   r_  r>  r‡  r  r]  rs   r  r”  ro  r_  rÁ   r`  rr  rs  rk  rm  r„   r³   Únever_reuse_buffersr²  rI  )rŒ  Úvariabler  ra  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�   )r$
  r…   r  rŠ   r¸   r¹   rY	  r-  s   @r�   r!
  r!
    s   ø„ ÷Bñ Br�   r!
  c                  ó(   ‡ — e Zd Zdˆ fd„Zdd„Zˆ xZS )ÚSetSourceTensorKernelc                óþ  •— |j                  «        t        ‰| �	  |j                  «       ||gdt        j
                  j                  j                  j                  ¬«       t        |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)rr  rw  rÅ  )r  r_  r>  r  r  rq   rœ  Úset_Úsource_Tensorr‰   rk  rm  r„   r³   rs   r  r#
  r²  rI  ro  r  rf  r‡  re  )rŒ  Úself_tensorÚstorage_tensorr  ra  s       €r�   r>  zSetSourceTensorKernel.__init__.  s  ø€ Ø×$Ñ$Ô&Ü‰ÑØ×%Ñ%Ó'Ø˜.Ð)Ø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 r  r
  r‹  s    r�   rG  z2SetSourceTensorKernel.get_inputs_that_alias_outputB  s   € Ø—‘ Ó" D§O¡O°AÓ$6Ð7Ð7r�   )r*
  r…   r+
  r…   r¸   r¹   rz  )rž   rŸ   r    r>  rG  r,  r-  s   @r�   r&
  r&
  -  s   ø„ õ
÷(8r�   r&
  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.codegenM  s   € Ø×)Ñ)¨$Õ/r�   c                 ó   — yrý  r¢   r‹  s    r�   rÌ  zScatterFallback.should_allocateP  rÿ  r�   c                óf   — | j                   d   }t        |t        «      sJ ‚|j                  «       gS rí  r8  ©rŒ  rh  s     r�   rC  z"ScatterFallback.get_mutation_namesS  s.   € Ø�k‰k˜!‰nˆÜ˜#œvÔ&Ð&Ð&Ø—‘“ÐÐr�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   r£  z(ScatterFallback.get_unbacked_symbol_defsX  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Å  r5
  r·  r6
  )rr  ru  rw  )r‰   r„   Úsrc_is_tensorr�  r_  r>  r‡  r  r]  rÄ   rs   r  r”  ro  r_  rÁ   r`  )rŒ  rw  rŒ   r>  rË   r   r·  r6
  r  Útensorsro  ra  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.rG	  rX  rJ	  rª  )rw  r�   rŒ   r…   r>  rŠ   rË   r…   r   r…   r·  r^  r6
  r™   r¸   r¹   r

  r-  s   @r�   r.
  r.
  F  s|   ø„ ñó0óó ó
ð "Ø!ñ!)à!ð!)ð ð!)ð ð	!)ð
 ð!)ð ð!)ð ð!)ð ð!)ð 
÷!)ñ !)r�   r.
  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í  r
  r‹  s    r�   rC  z#IndexPutFallback.get_mutation_namesŠ  r
  r�   c                ó   — t        «       S rˆ   r=   r‹  s    r�   r£  z)IndexPutFallback.get_unbacked_symbol_defs�  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_)rr  rs  rw  r   )rŠ  r�  r_  r>  r‡  r  r]  rs   r  r”  r:  r_  rÁ   r`  )rŒ  rw  rŒ   rŠ  r¨   Ú
accumulaterÌ   Úvalid_indicesr9
  rs  ra  s             €r�   r>  zIndexPutFallback.__init__�  sÜ   ø€ ð ˆŒØ$+Ö=˜q¨q©}šÐ=ˆÐ=à34°fÐ2M¸}Ð2MÖN¨Q�4×%Ñ% aÕ(ÐNˆÐNØ4ˆÜ‰ÑØÜ˜aŸl™l›nÔ-Ø×Ñ Ó(ØˆMØ0Ø+Ø#ð 	ô 	
ô 	
�‰×#Ñ# D§O¡O°AÓ$6Ô7Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Õ(ùò >ùâNs   �C/•C/£C4rG	  rX  rz  rª  )rw  útorch._ops.OpOverloadrŒ   r…   rŠ  r§	  r¨   rv  rC
  r   r¸   r¹   r

  r-  s   @r�   r;
  r;
    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ˆ   )rs   r  rÌ  r  s     r�   ræ   z$DeviceCopy.create.<locals>.<genexpr>´  s   è ø€ ÒG¨q�AœŸ™×*Ñ*Ô*ÑGùs   ‚&(zDeviceCopy in input programr  Trm  )r  r=  rp  rs   r  r	  rè   rŸ  rF   Úaot_inductorÚuse_runtime_constant_foldingr£  Úadd_device_inforA  rb   r°  rD  r  r0  rj   r³   r  r  rN  rG
  rL  r  r�  )	rÍ  rŒ   r  r
  Úx_devicero  r   Úis_destination_pinnedÚis_source_pinneds	            r�   rŠ  zDeviceCopy.create¬  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   «       y |j                  |d   | j	                  «       |d   «       y )NrÞ   r   rE   )r	  rÉ   rq  r
  r÷  )rŒ  r“  r¿   s      r�   rš  zDeviceCopy.codegenÜ  s{   € Ø× Ñ Ó"ˆÜ�4‹y˜AŠ~Ðˆ~Ø×ÒØ×'Ñ'Ø�Q‘˜×)Ñ)×;Ñ;Ó=¸tÀA¹wõð ×'Ñ'¨¨Q©°×1GÑ1GÓ1IÈ4ÐPQÉ7ÕSr�   N)rŒ   r…   r  rc  r
  r™   r¸   r…   rG	  )rž   rŸ   r    rú  rŠ  rš  r¢   r�   r�   rG
  rG
  «  s   „ Øò-
ó ð-
ô^Tr�   rG
  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Å  )r_  r>  r‡  r  r  Úunbacked_offset_symbolrË   Úbase_offsetÚbase_dim_striderÿ   r±  )rŒ  rW
  rË   rX
  rY
  rÿ   r±  ra  s          €r�   r>  z#DynamicSelectStorageOffset.__init__ö  sS   ø€ ô 	‰Ñ˜œz´·±¸eÓ1DÔEÀrÔJð '=ˆÔ#ØˆŒ
Ø&ˆÔØ.ˆÔØˆŒ	Øˆ�
r�   c                ó.   — t        | j                  g«      S rˆ   )r>   rW
  r‹  s    r�   r£  z3DynamicSelectStorageOffset.get_unbacked_symbol_defs	   s   € Ü˜4×6Ñ6Ð7Ó8Ð8r�   c                ó.   — t        | j                  |«      S rˆ   )r'   rË   r6  s     r�   r7  z/DynamicSelectStorageOffset.get_free_symbol_uses   s   € ô   §
¡
¨MÓ:Ð:r�   c                ó>   — |j                  | | j                  ¬«       y )NrX  )Úcodegen_dynamic_select_indexr±  r™  s     r�   rš  z"DynamicSelectStorageOffset.codegen   s   € Ø×,Ñ,¨T¸¿¹Ð,ÕDr�   ru  rX  )rW
  úsympy.SymbolrË   r^
  rX
  úsympy.Symbol | intrY
  r_
  rÿ   r_
  r±  r™   r¸   r¹   rª  rm  rx  rG	  ©rž   rŸ   r    r{  rž  rÌ  r>  r£  r^   r7  rš  r,  r-  s   @r�   rR
  rR
  ç  s“   ø„ ñóóðà ,ðð ðð (ð	ð
 ,ðð !ðð ðð 
õó&9ñ Ð8Ó9à$)ð;Ø!ð;à	!ò;ó :ð;÷
Er�   rR
  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 rV
  )
r_  r>  r‡  r  r  Úunbacked_size_symbolr¸  r¹  r½  rÿ   )rŒ  rf
  r¸  r¹  r½  rÿ   ra  s         €r�   r>  zDynamicSliceSize.__init__,   sH   ø€ ô 	‰Ñ˜œz´·±¸eÓ1DÔEÀrÔJà$8ˆÔ!ØˆŒ
ØˆŒØˆŒ	Øˆ�	r�   c                ó.   — t        | j                  g«      S rˆ   )r>   rf
  r‹  s    r�   r£  z)DynamicSliceSize.get_unbacked_symbol_defs<   s   € Ü˜4×4Ñ4Ð5Ó6Ð6r�   c                ót   — t        | j                  |«      j                  t        | j                  |«      «      S rˆ   )r'   r¸  rµ  r¹  r6  s     r�   r7  z%DynamicSliceSize.get_free_symbol_uses?   s0   € ô   §
¡
¨MÓ:×@Ñ@Ü˜TŸX™X }Ó5ó
ð 	
r�   c                ó&   — |j                  | «       y rˆ   )Úcodegen_dynamic_slice_sizer™  s     r�   rš  zDynamicSliceSize.codegenG   rO	  r�   ru  rX  )
rf
  r^
  r¸  r_
  r¹  r_
  r½  r_
  rÿ   r_
  rª  rm  rx  rG	  r`
  r-  s   @r�   rb
  rb
     s~   ø„ ñóóðà*ðð "ðð  ð	ð
 !ðð !õó 7ñ Ð.Ó/à$)ð
Ø!ð
à	!ò
ó 0ð
÷1r�   rb
  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_readsP   r¤  r�   c                 ó   — yrý  r¢   r‹  s    r�   rÌ  zDynamicScalar.should_allocateS   rÿ  r�   c                ó¾   •— |j                  «        t        ‰| �	  d t        t	        j
                  d«      ¬«      | j                  |g«      «       || _        || _        y rV
  )	ró  r_  r>  r‡  r  r  r]  ÚsymÚkeypath)rŒ  ro
  rp
  rI  ra  s       €r�   r>  zDynamicScalar.__init__V   sM   ø€ ð 	�‰ŒÜ‰ÑØ”*¤E§L¡L°Ó$7Ô8¸$×:MÑ:MÈtÈfÓ:Uô	
ð ˆŒØˆ�r�   c                ó.   — t        | j                  g«      S rˆ   )r>   ro
  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.codegenc   s   € Ø×&Ñ& tÕ,r�   ru  rX  )ro
  r^
  rp
  zpytree.KeyPathrI  r…   r¸   r¹   rª  rG	  )
rž   rŸ   r    r{  rž  rÌ  r>  r£  rš  r,  r-  s   @r�   rª   rª   K   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_readsl   r¤  r�   c                 ó   — yrý  r¢   r‹  s    r�   rÌ  zAssertScalar.should_allocateo   rÿ  r�   c                ó~   •— t         ‰| �  d t        t        j                  d«      ¬«      g «       || _        || _        y rV
  )r_  r>  r‡  r  r  Úscalarrä  )rŒ  rx
  rä  ra  s      €r�   r>  zAssertScalar.__init__r   s7   ø€ Ü‰ÑàÜœeŸl™l¨5Ó1Ô2àô	
ð ˆŒØˆ�r�   c                 ó   — yrö  r¢   r‹  s    r�   r
  zAssertScalar.has_side_effects}   r©  r�   c                ó.   — t        | j                  |«      S rˆ   )r'   rx
  r6  s     r�   r7  z!AssertScalar.get_free_symbol_uses€   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 )NFrd  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)rF   Úscalar_assertsrÖ  r×  r7  rs   r  r³  r£  rŽ  Úcodegen_cpp_sizevarrx
  r�  rä  Úcodegen_python_sizevarr
  ro  )rŒ  r“  rë  Ú
symbol_strÚsizevars        r�   rš  zAssertScalar.codegen†   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�   ru  rX  )rx
  rt   rä  rÄ   r¸   r¹   rm  rx  rG	  )rž   rŸ   r    r{  rž  rÌ  r>  r
  r^   r7  rš  r,  r-  s   @r�   r«   r«   g   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‚
  ¦   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ˆ 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 )Nr	
  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Š
  rY  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„}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Â  ro  Ú
alias_infoÚis_writere  rf  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�   )r  r…   r¸   r¹   )
r‰   r³   r  ÚListTyper¥   r¦   Úlibrary_utilsÚis_tensor_like_typer“
  Úis_tensorlist_like_type)r•
  rU  r–
  Úoptional_tensor_argrŒ  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ò 7Ð+Ù!Ð"5Õ6ñ7ð #ô %×8Ñ8¸¿¹ÔCÐCÐCá˜#•r�   )rZ  rE
  r¸   r™   )r•
  ztorch._C.ArgumentrU  r   r¸   r¹   )!r_  r>  r¦   Úuse_runtime_dispatchr{  r‰   r  r…  r†  r®  r³   rw  rÅ  rÀ   rr  rs   r  Úwarn_fallbackr’
  rc	  rÁ   r‡  Ú_libraryrv  Úmutates_and_returns_first_argrÂ  ro  Ú
is_mutabler$   rÔ  rf  ro  Ú
zip_schema)rŒ  rJ  r  rÙ  Únontensor_argsrÅ  rÀ   r{  Úschemar�
  r¿   rœ
  r•
  rU  ra  s   `             €r�   r>  zFallbackKernel.__init__³   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õ	ô> Ÿ™×-Ñ-×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ˆ   )r_  r,  rw  r  Ú_primsÚ	rng_primsÚgraphsafe_run_with_rng_statero  r‰   rÈ  Ú	with_readrG   r  ro  )rŒ  r‰  rU  ra  s      €r�   r,  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_outputsro  r  r¾   r™  s     r�   Úcodegen_unbacked_symbol_defsz+FallbackKernel.codegen_unbacked_symbol_defs6!  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¾   r9   rs   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__J!  s   € Ø—x‘x�r�   Nrj  )rž   rŸ   r    r¡   rù  r¢   r�   r�   ÚShimrµ
  F!  s   … à‹Hô r�   r¸
  )r|  Ú	dataclassr4  rf  r÷  rÅ  ro  rs   r  r£  r‰   rw  r  r…  r†  r	  rÒ   r‡  rˆ  rŽ  r	  rŠ  rÀ   r¯  )rŒ  r¸
  rŒ   rÙ  r¿   rÀ   Úparams          r�   r	  zFallbackKernel.codegen_argsE!  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>q!  s'   è ø€ ò $ð ô ×*Ñ*¨4°×3ñ$ùræ  rE   )r‰   rB  r  r  r–  r  r‹
  ÚScriptObjectr(   r*   r¥   r¦   r>   rÉ   rj   r³   )rÙ  rà  r  Únon_torch_bind_tensor_argsrU  Ú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Ã
  rw  )rŒ  rÃ
  s     r�   r
  zFallbackKernel.has_side_effectsƒ!  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‰   rw  r  r…  r†  r®  r³   rÁ   r‡  r¡
  r$   r’
  r‹  s    r�   rG  z+FallbackKernel.get_inputs_that_alias_outputŠ!  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É   rc	  r‹  s    r�   rC  z!FallbackKernel.get_mutation_namesŸ!  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 ‚t=        | j                  «       t?        j@                  | j                  jC                  «       ||i ¬«      ¬«      }t        jD                  jG                  |«       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 )NrE   r   r˜  )Ú	as_tensorT)Úas_none)Ú
as_tensors)Úas_optional_tensor)Úas_intzUnsupported return type )r‰   r  Ú
TensorTypeÚNoneTyper¥   r¦   rÉ   r…   Úexport_schemaru   rŠ  ÚTensorArgumentro  r—
  ÚgetElementTyper   r³   ÚOptionalTypeÚOptionalTensorArgumentÚIntTypeÚRuntimeError)Úreturn_typerX  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   rE   )r  rf  r  r"  )rÁ   rµ   )r×
  z1torch.TensorType | torch.ListType | torch.JitTyperX  úIRNode | Sequence[IRNode]r¸   zexport_schema.Argument)$rš  r´  ro  rw  r‰   r˜  r³   rÅ  rf  ro  r	  ru  r	  rs   r  Úaot_moder#   Úserialize_inputsr  rÑ  Ú	torchbindÚCallTorchBindr¤
  Úreturnsr‡  rÉ   r  re  rŠ  rÒ   r‚
  rÐ
  r<   rÁ   Úextern_kernel_nodesrÂ  )rŒ  r¿   rÀ   r€  Úordered_kwargsr  Ú
serializerÚnamed_argumentsrØ
  rÞ
  r  r×
  Úoutput_argumentsÚreturn_schemarX  rµ   s                   r�   Úexport_extern_kernel_nodez(FallbackKernel.export_extern_kernel_node£!  sj  € ô 	�	‰	Ø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Ô*à'�Ð'˜Ð'Ð'ùòK
ùó` s   ÂI3ÇI8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�   rê
  z)FallbackKernel.codegen.<locals>.is_numberC"  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ˆ   )r	  )rä   r 	  rÀ   rŒ  s     €€r�   ræ   z)FallbackKernel.codegen.<locals>.<genexpr>P"  s+   øè ø€ ò àð *�D×)Ñ)¨!Ñ6¨vÕ6ñùs   ƒ c              3  ól   •K  — | ]+  \  }}t        |t        «      xr  ‰|j                  «      –— Œ- y ­wrˆ   )r‰   ÚcomplexrŠ  )rä   r  r9  rê
  s      €r�   ræ   z)FallbackKernel.codegen.<locals>.<genexpr>U"  s5   øè ø€ ò ,á�A�qô ˜1œgÓ&ÒA©9°Q·[±[Ó+AÓAñ,ùs   ƒ14c                 óH   •— g ‰ j                  «       ¢‰ j                  «       ¢S rˆ   )r	  r!	  r‹  s   €r�   r~  z(FallbackKernel.codegen.<locals>.<lambda>c"  s$   ø€ ÐF˜$×+Ñ+Ó-ÐF°×0CÑ0CÓ0EÐF€ r�   )r  ztorch.JitTyper¸   r™   )+rw  r¤  r‰   r  r…  r†  r³   rs   r  r£  r§  rŸ  rÄ   rš  rE  r�
  rF   rJ
  Úcustom_ops_to_c_shimsrÅ  rf  ro  r¸  r  ru  r'  rÒ   r‡  rˆ  r—  rå
  rr  Ú,generate_fallback_kernel_with_runtime_lookupro  r  re  Úgenerate_fallback_kernelrJ  râ  r,	  r0	  r5	  r­
  )	rŒ  r“  r  rŸ  r¿   Ú	args_iterÚexported_argsrê
  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)NFrm  )rN  rÖ
  rL  r  r  r`   rÿ   r   )rX  rN  s     r�   r™  zFallbackKernel.tensor_to_layoutr"  sj   € àˆ	ð	Ø×(Ñ(Ó*ˆIô Ø�M‰MØ�L‰LÜ% f§k¡k£mÓ4Ü% f§m¡m£oÓ6Øô
ð 	
øô ò 	áð	ús   „A& Á&	A2Á1A2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Ít        t        j                  «      r³ddlm}m}m}m} d} ||j&                  «      r ||«      }|€ ||«      }|�t)         ||«      «      dk(  rkt+        |j,                  |j.                  g |j0                  ¢g |j3                  «       ¢¬«      }t5        |t7        «      t7        «      |t9        |«      |¬«      S t;        d„ D «       «      Š‰ j=                  |«      Š‰sit        |t        j>                  j@                  jB                  «      s&|t        jD                  jF                  jH                  u rt        j,                  d«      Št        |t        j                  j                  «      r>t        j
                  jJ                  s$‰r"tL        jO                  ||‰|	|
‰¬	«	      }|�|S |€ ‰ tQ        ‰¬
«      ||	|
¬«      Šn"‰sJ d«       ‚ ‰ tS        ‰¬
«      ||	|
¬«      Šdˆ ˆˆˆˆfd„Š ‰|g «      }t        |t6        tT        f«      r	|‰_+        |S t        |tX        «      rtU        |«      ‰_+        |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_variantrE   ©r  r  rÿ   r   )rJ  rf  ro  rÀ   rr  rw  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrˆ   )rÎ  rT  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Š  rX  s     €€€r�   ræ   zAFallbackKernel.create.<locals>.generate_output.<locals>.<genexpr>ï"  s5   øè ø€ ò $àñ $ F¨1¡I¨w¼4À»<ÈÐ:KÐ9LÑ/L×Mñ$ùrb  rÅ  zFallbackKernel output type z is not supported)r‰   r¥   r¦   r³   rÊ   rÉ   r§   r  r  r–  rŽ  r™  rF   Ú assume_unaligned_fallback_outputrp   rs   r  rÐ  r²  rÁ   rŠ   rþ  rµ   rP  r‹
  r¾
  r(   r*   r²   r‡  )
rX  rŠ  r€  rÇ  rŒ  rÍ  r  r  rý
  Úpackeds
   ``   €€€€€r�   r  z.FallbackKernel.create.<locals>.generate_outputí"  sŽ  ú€ Ü˜&¤4¬ -Ô0Ø#”t˜F“|õ $ä"¤3 v£;Ó/ô$ó ð ô ˜F¤DÔ)ð %+§L¡L£N÷á ˜˜Sð ™¨¨g¼$¸v»,ÈÐ9LÐ8MÑ.MÓNÑNóð ô ˜F¤E§L¡LÔ1Ü!Ø×(Ñ(¨Ó0ØØó�ô ×;Ò;Ù*Ü,¨VÔ4ä—G‘G×-Ñ-×1Ñ1°#·(±(Ô;Ø�
Ü˜F¤CÔ(Ø�Ü˜F¤E§L¡LÔ1Ø—{‘{×'Ñ'Ð'ÜØœŸ™×.Ñ.Ô0@ÐAôä  Ô(Ü(Ü fÔ-ØØØó	ð ð �~ð Ø1´$°v³,°Ð?PÐQó�~ð ùóEs   Á+#G )rX  r   rŠ  zlist[tuple[Any, int]]r¸   r   )-rœ  Ú*_fused_moving_avg_obs_fq_helper_functionalr   r	   rs   r  rþ  r
   rå  r‰   r  r…  r†  r–  Útorch._library._out_variantrö
  r÷
  rø
  rù
  r‡  rÉ   rL  r  r  r=  r   rL	  r¥   Ú_make_out_variant_kernel_namer'  r½
  rÑ  rÜ
  rÝ
  rq   Úhigher_orderÚprintr£  ÚExternKernelMultiOutÚ
try_creater‡  rm  r¦   r  r§   )rÍ  r  r¿   rÀ   Úfake_incorrect_kernelsÚcontextrà  rÙ  rÚ  rÅ  r{  rö
  r÷
  rø
  rù
  Úout_oprJ  Ú
out_resultr  r  r  rý
  r  s   `                  @@@@r�   rŠ  zFallbackKernel.create‚"  s÷  ü€ ô #'×"QÑ"QÐ!SÐØÐ/Ñ/ÜÔ1°$Ñ7¼¿¹×9JÑ9JÓK‰Gä!“mˆGàñ 	<ð #�×"Ñ" 6Ð;¨DÒ;°FÑ;ñØØØØØ!÷	<ô �fœeŸj™j×3Ñ3Ô4¼ØœEŸL™Lô:
÷ó ð ˆ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Ü—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àˆ÷k	<ñ 	<ús   ÁK6Ë6L rˆ   ©rJ  r  r  r�   rÙ  r¦  r£
  rv  rÅ  r­  rÀ   rF	  r{  ú)dict[sympy.Symbol, pytree.KeyPath] | Noner¸   r¹   rs  rG	  rª  rJ	  )rÙ  zSequence[torch.Tensor] | Nonerà  rv  r¸   r   rX  rz  )rX  r9  r¸   rL  )r  r�   r¿   r   rÀ   r   r¸   r˜  )rž   rŸ   r    r{  r>  r,  r­
  r£  r	  r~  r½
  r
  rG  rC  rå
  r   rš  r™  rú  rŠ  r,  r-  s   @r�   r˜  r˜  ¬   s  ø„ ñð )-ðu4ð HLñu4àðu4ð ðu4ð &ð	u4ð
 &ðu4ð +ðu4ð &ðu4ð Eðu4ð 
õu4õn
ó
ó
 óð0 ð#Ø2ð#ØDQð#à	ò#ó ð#óJ+ó$ó*#òw(ðr òS3ó ðS3ðj ò
ó ð
ð ò]ó ô]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_allocate'#  rÿ  r�   c                ó&   — | j                  d«      gS rí  r
  r‹  s    r�   rG  z(ComplexView.get_inputs_that_alias_output*#  s   € à—‘ Ó"Ð#Ð#r�   Nrþ
  c          	     ó2   •— t         ‰| �  |||||||¬«       y )Nrþ
  )r_  r>  ©	rŒ  rJ  r  rÙ  r£
  rÅ  rÀ   r{  ra  s	           €r�   r>  zComplexView.__init__.#  s,   ø€ ô 	‰ÑØØØØØØØ/ð 	õ 	
r�   rX  rz  r  )rž   rŸ   r    r{  rÌ  rG  r>  r,  r-  s   @r�   r  r  ##  sq   ø„ áCóó$ð )-ØGKñ
àð
ð ð
ð &ð	
ð
 &ð
ð +ð
ð &ð
ð Eð
ð 
÷
ñ 
r�   r  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)r4	  ro  r
  r�  )rŒ  r“  Ú
alive_listÚ	dead_listÚis_final_stepÚ
alive_reprÚ	dead_reprÚcalls           r�   rš  zMemoryCheckKernel.codegenK#  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�   NrG	  )rž   rŸ   r    r{  rš  r¢   r�   r�   r  r  D#  s   „ ñô r�   r  c                  ó    — e Zd ZU ded<   dd„Zy)rm  rc  r  c                ó   — | j                   S rˆ   rÅ  r‹  s    r�   r  zMultiOutputLayout.get_devicea#  rÆ  r�   Nr`  )rž   rŸ   r    r¡   r  r¢   r�   r�   rm  rm  ]#  s   … àÓôr�   rm  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,	  r0	  r™  s     r�   rš  zMultiOutput.codegenf#  s:   € Ø×$Ñ$ TÔ*Ø×5Ò5Ø×%Ñ% gÔ.Ø×*Ñ*¨7Õ3ð 6r�   c                óÎ   •— t         ‰| �  d ||gd«       t        j                  j	                  | «      | _        t        j                  j                  | «       || _        || _        y rÂ  )	r_  r>  rs   r  r_  rÁ   r`  rŠ  r%  )rŒ  rJ  r9  rŠ  r%  ra  s        €r�   r>  zMultiOutput.__init__l#  sQ   ø€ ô 	‰Ñ˜˜v¨ w°Ô3Ü—G‘G×+Ñ+¨DÓ1ˆŒ	Ü	�‰×"Ñ" 4Ô(ØˆŒØ1RˆÕ.r�   c                óp   — | j                   d   }t        |t        «      sJ |«       ‚|j                  |«      S rí  )rf  r‰   r…   r7  )rŒ  re  r¢  s      r�   r7  z MultiOutput.get_free_symbol_usesy#  s7   € ð —[‘[ ‘^ˆ
Ü˜*¤fÔ-Ð9¨zÓ9Ð-Ø×.Ñ.¨}Ó=Ð=r�   c                óp   — t        | j                  «      dk(  xr t        | j                  d   t        «      S )NrE   r   )rÉ   rf  r‰   r  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í  )rf  r‰   r˜  rÉ   rG  ro  r3
  s     r�   rG  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�   rt  z*MultiOutput.get_read_writes.<locals>.dummy�#  r€  r�   r¢   ro  r  ru  )r>   rf  r‰   r…   r²  rG   r  ro  r  r  r  rF   r6  rj   r³   rP   r  r  r  )	rŒ  r/  rh  rt  r  Úshould_normalizeÚwrite_rwr  rÁ   s	          @@r�   r,  zMultiOutput.get_read_writesŽ#  sô   ù€ ô /9«lˆØ—;‘;ò 	@ˆCÜ˜#œvÕ&Ø—	‘	œ,×.Ñ.¨s¯|©|«~Ó>Õ?ð	@ð �}‰}‹ˆØ—/‘/Ó#×0Ñ0Ó2ˆö	;ð —‘Ó"ˆä×1Ñ1Ð1ò 'Ø˜ˆ~ò'ä˜&Ÿ+™+Ó&Ð&ð 	ô
  ×3Ñ3Ø�4—=‘=“? BÐ2Bô
ˆô ×&Ñ&ØØ—?‘?Ü"›ô
ð 	
r�   rG	  rm  )
rJ  r  r9  r…   rŠ  úlist[tuple[Any, ...]]r%  r™   r¸   r¹   rx  rX  rz  rs  )rž   rŸ   r    rš  r>  r^   r7  rÌ  rG  r,  r,  r-  s   @r�   rŽ  rŽ  e#  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%  )r_  r>  rÏ  )rŒ  rJ  r9  rŠ  Úopaque_valuera  s        €r�   r>  zOpaqueMultiOutput.__init__´#  s$   ø€ ô 	‰Ñ˜ ¨ÐSWÐÔXØ$0ˆÕ!r�   c                ó   — t        d«      ‚)NzOpaqueMultiOutput has no dtype)r	  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 rñ	  )	r>   rf  r‰   r…   r²  rG   r  ro  r  )rŒ  r/  rh  r  s       r�   r,  z!OpaqueMultiOutput.get_read_writesÅ#  sˆ   € Ü.8«lˆØ—;‘;ò 	@ˆCÜ˜#œvÕ&Ø—	‘	œ,×.Ñ.¨s¯|©|«~Ó>Õ?ð	@ô 0:Ü×!Ñ! $§-¡-£/Ó2Ð3ó0
ˆô ×&Ñ&ØØÜ"›ô
ð 	
r�   )
rJ  r  r9  r…   rŠ  r.  r2  r   r¸   r¹   )r¸   r   )r¸   r²   rs  )
rž   rŸ   r    r{  r>  r�  r  r�  r,  r,  r-  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rö  r¢   r‹  s    r�   rÌ  z%AllocatingMultiOutput.should_allocateÛ#  r©  r�   c                ób   — | j                   s#| j                  |«       | j                  |«       y y rˆ   )r%  r,	  r0	  r™  s     r�   rš  zAllocatingMultiOutput.codegenÞ#  s,   € Ø×5Ò5Ø×%Ñ% gÔ.Ø×*Ñ*¨7Õ3ð 6r�   NrX  rG	  )rž   rŸ   r    r{  rÌ  rš  r¢   r�   r�   r7  r7  Ô#  s   „ ñóô4r�   r7  c                ó˜   — | j                   }| j                  j                  j                  d«      d   }| j                  }d|› d|› d|› �S )z8Build fully-qualified kernel name for an out-variant op.z::rE   z
torch.ops.r�  )r¤  r‡  rÁ   rÃ  r¥  )r  Únsr'	  r   s       r�   r  r  ä#  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 )r	  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ˆ   )r_  r>  r=  r>  r  rr  rw  )rŒ  r  r=  r¿   rÀ   ra  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   )rö
  r÷
  rù
  Nc              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrˆ   )r‰   r  r–  rÿ	  s     r�   ræ   z2ExternKernelMultiOut.try_create.<locals>.<genexpr>'$  s   è ø€ ÒG°1”:˜a¤§¡×.ÑGùs   ‚$&rÅ  )rÀ   r{  r  r=  rú
  )rJ  r9  rŠ  )r  rö
  r÷
  rù
  r‡  r‰   r¦   r¥   rè   rÉ   rm  rî   rL  r  r  r=  r   r7  r³   rF   r  rp   rs   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Ì   Ú
tensor_outrJ  Ú	multi_outs                        r�   r
  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   r  rE
  r=  r›   rÀ   r   r¸   r¹   rG	  )r  rE
  rà  r   r  rc  rÙ  r¦  rÚ  rv  rÅ  r­  rÀ   rF	  r{  r  rý
  r™   r¸   z&Sequence[AllocatingMultiOutput] | None)
rž   rŸ   r    r{  r¡   r>  rš  rú  r
  r,  r-  s   @r�   r	  r	  ì#  sÝ   ø… ñð ÓØ9Ó9ð"àð"ð &ð"ð !ð	"ð
 ð"ð 
õ"ó7ð ð HLØ$)ñJà%ðJð ðJð ð	Jð
 &ðJð 'ðJð +ðJð &ðJð EðJð "ðJð 
0òJó ôJr�   r	  c                  ó¬  — e Zd ZU dZded<   d,d„Zd-d„Zd.d„Zd/d„Zd0d„Z	d1d	„Z
d2d3d„Zd4d„Zd5d„Zd6d„Zd,d„Zd5d„Z	 d7	 	 	 	 	 d8d„Zd9d„Zd:d„Z	 d7	 	 	 	 	 d;d„Zd<d„Zd=d„Zd>d„Zd?d„Zd@d„ZdAd„Zd,d„Zd,d„ZdBd„ZdCd„Zd1d„ZdCd „Z d@d!„Z! e"d «      	 d7	 	 	 dDd"„«       Z#dEd#„Z$dFd$„Z%d2dGd%„Z&e'dHd&„«       Z(dId'„Z)dHd(„Z*dAd)„Z+e'dJd*„«       Z,d1d+„Z-e-Z.y
)Kr›  zC
    TensorBox / StorageBox allow in-place mutation of Tensors
    r…   rI  c                ó6   — | j                   j                  «       S rˆ   rî  r‹  s    r�   rþ  z!MutableBox.has_exceeded_max_reads_$  rï  r�   c                ó6   — | j                   j                  «       S rˆ   rã  r‹  s    r�   r  zMutableBox.get_deviceb$  rá  r�   c                ó6   — | j                   j                  «       S rˆ   rž  r‹  s    r�   r  zMutableBox.make_loadere$  ó   € Ø�y‰y×$Ñ$Ó&Ð&r�   c                ó6   — | j                   j                  «       S rˆ   )rI  r  r‹  s    r�   r  zMutableBox.make_indexerh$  ó   € Ø�y‰y×%Ñ%Ó'Ð'r�   c                ó6   — | j                   j                  «       S rˆ   )rI  r0  r‹  s    r�   r0  zMutableBox.get_stridek$  rá  r�   c                ó6   — | j                   j                  «       S rˆ   ræ  r‹  s    r�   ro  zMutableBox.get_namen$  rç  r�   Nc                ó8   — | j                   j                  |«      S rˆ   )rI  r  r  s     r�   r  zMutableBox.has_large_inner_fnq$  s   € Ø�y‰y×+Ñ+¨IÓ6Ð6r�   c                ó8   — | j                   j                  |«      S rˆ   rë  r  s     r�   r  zMutableBox.mark_reuset$  rì  r�   c                ó6   — | j                   j                  «       S rˆ   rô  r‹  s    r�   r  zMutableBox.realize_hintw$  rL  r�   c                ó6   — | j                   j                  «       S rˆ   )rI  rl  r‹  s    r�   rl  zMutableBox.unwrap_viewz$  rJ  r�   c                ó6   — | j                   j                  «       S rˆ   )rI  r  r‹  s    r�   r  zMutableBox.is_input_buffer}$  ó   € Ø�y‰y×(Ñ(Ó*Ð*r�   c                ó6   — | j                   j                  «       S rˆ   )rI  r  r‹  s    r�   r  zMutableBox.freeze_layout€$  s   € Ø�y‰y×&Ñ&Ó(Ð(r�   c                ó:   — | j                   j                  ||«      S rˆ   )rI  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ˆ   )rI  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ˆ   )rI  r&  r%  s     r�   r&  z(MutableBox.freeze_layout_with_same_order‹$  s   € Ø�y‰y×6Ñ6°vÓ>Ð>r�   c                ó:   — | j                   j                  ||«      S rˆ   )rI  r*  r(  s      r�   r*  z+MutableBox.freeze_layout_with_exact_stridesŽ$  s   € ð �y‰y×9Ñ9¸-ÈÓWÐWr�   c                ó6   — | j                   j                  «       S rˆ   )rI  r,  r‹  s    r�   r,  zMutableBox.get_read_writes“$  rT  r�   c                ó6   — | j                   j                  «       S rˆ   rþ  r‹  s    r�   rž  zMutableBox.get_reads–$  rú  r�   c                ó6   — | j                   j                  «       S rˆ   rü  r‹  s    r�   r2  zMutableBox.num_reads™$  rú  r�   c                ó6   — | j                   j                  «       S rˆ   rö  r‹  s    r�   r4  zMutableBox.get_storage_numelœ$  r÷  r�   c                ó6   — | j                   j                  «       S rˆ   rL  r‹  s    r�   r9  zMutableBox.get_reduction_typeŸ$  rH  r�   c                ó6   — | j                   j                  «       S rˆ   rJ  r‹  s    r�   r;  zMutableBox.get_reduction_size¢$  rH  r�   c                ó6   — | j                   j                  «       S rˆ   rù  r‹  s    r�   r=  zMutableBox.is_extern¥$  rú  r�   c                ó6   — | j                   j                  «       S rˆ   )rI  r?  r‹  s    r�   r?  zMutableBox.is_no_op¨$  rç  r�   c                ó8   — | j                   j                  |«      S rˆ   rP  rú  s     r�   rA  zMutableBox.constant_to_device«$  s   € Ø�y‰y×+Ñ+¨FÓ3Ð3r�   c                ó6   — | j                   j                  «       S rˆ   )rI  rC  r‹  s    r�   rC  zMutableBox.get_mutation_names®$  rH  r�   c                ó6   — | j                   j                  «       S rˆ   )rI  rE  r‹  s    r�   rE  zMutableBox.get_operation_name±$  rH  r�   c                ó6   — | j                   j                  «       S rˆ   )rI  rG  r‹  s    r�   rG  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Ô  r6  s     r�   r7  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ˆ   )rI  r¨  r‹  s    r�   r¨  zMutableBox.get_defining_opÃ$  rT  r�   c                ó8   — | j                   j                  |«      S rˆ   )rI  r÷  rõ  s     r�   r÷  zMutableBox.codegen_referenceÆ$  s   € Ø�y‰y×*Ñ*¨6Ó2Ð2r�   c                ó6   — | j                   j                  «       S rˆ   ©rI  rÞ  r‹  s    r�   rJ  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ˆ   rl  r‹  s    r�   rÞ  zMutableBox.get_output_specÑ$  rT  r�   c                ó6   — | j                   j                  «       S rˆ   r›  r‹  s    r�   r  zMutableBox.get_sizeÔ$  rç  r�   c                ó.   — | j                   j                  S rˆ   )rI  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‰   rI  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�   rX  r`  rd  rf  rh  rj  rˆ   rk  rl  rL  rK  rm  rn  rp  rq  rr  rs  ru  rv  rw  r]  rY  ry  rz  rx  rM  rP  r_  rW  rV  rT  )/rž   rŸ   r    r{  r¡   rþ  r  r  r  r0  ro  r  r  r  rl  r  r  r  r#  r&  r*  r,  rž  r2  r4  r9  r;  r=  r?  rA  rC  rE  rG  ró  r^   r7  rŸ  r¨  r÷  r�  rJ  r  rÞ  r  r  rÂ  rù  r¢   r�   r�   r›  r›  W$  sb  … ñð ƒLó2ó&ó'ó(ó&ó$ô7ó+ó(ó'ó+ó)ð ;@ð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¢   ©rI  s    r�   rŠ  zTensorBox.createð$  s   € àFIr�   c                 ó   — y rˆ   r¢   rv  s    r�   rŠ  zTensorBox.createó$  s   € à+.r�   c                óN   — t        | t        «      r| S t        t        | «      «      S rˆ   )r‰   r±   r„   rm  rv  s    r�   rŠ  zTensorBox.create÷$  s"   € ä�dÔ1Ô2ØˆKÜœ DÓ)Ó*Ð*r�   N)rI  r±   r¸   r±   )rI  r…   r¸   r„   )rI  r…   )rž   rŸ   r    r   r~  rŠ  r¢   r�   r�   r„   r„   ï$  s@   „ ØØÚIó ó àIØØÚ.ó ó à.àò+ó ñ+r�   c                  óX   — 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„Z
dd	„Zdd
„Zy)rm  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‰   rI  r†  rO  ro  rs   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‰   rI  r  ro  rs   r  rÌ  r‹  s    r�   rü  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ÿ   rN  r|  )r…   rˆ  rI  ro  r‰   r  rX  rf  rŸ  r³   r¥  r¢  r  r„  r	  r  r  rs   r  r_  rÁ   r`  rv  rz  rx  r}  )rŒ  rz  rx  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.
        rE   N)r‰   rI  r  rX  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Þ   )	r-  r€  rž  rs   r  Úget_dep_size_hintr*  rä  r(  )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_size6%  s™   € Ý@ð —~‘~Ó'ö
àÙ)¨#Ô.ô �G‰G×%Ñ% cÕ*ð
ˆð 
ñ
 ØÜ˜Ó'ˆ
Ü�}Ó%ˆÜ�}Ó%ˆà˜)Ñ#ò %Ø˜XÑ%¨Ñ*ò%à˜HÑ$ð	
ùò
s   ™.Bc                ó
  — t        | j                  t        «      xrh | j                  «       t        j
                  kD  xsE | j                  «       xs3 t        j                  d uxr | j                  t        j                  «      S rˆ   )	r‰   rI  r  r2  rF   Úrealize_acc_reads_thresholdr  Ú realize_acc_reads_size_thresholdr†  r‹  s    r�   rþ  z!StorageBox.has_exceeded_max_readsI%  sq   € Ü˜$Ÿ)™)¤YÓ/ò 	
Ø�N‰NÓœv×AÑAÑAò Ø×&Ñ&Ó(òô ×7Ñ7¸tÐCò Ø×=Ñ=Ü×;Ñ;óð		
r�   c                óF  ‡— |dkD  r›t        | j                  t        t        f«      r{t	        | j                  «      r3| j                  j                  «       Šddg}t        ˆfd„|D «       «      ry| j                  «       t        j                  kD  xs | j                  «       S y)zj
        A heuristic to decide if we should realize a tensor
        that is used multiple times.
        rE   ÚexpÚsigmoidc              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‰   rI  r  rX  r(  rÞ  r'  r2  rF   Úrealize_reads_thresholdr  )rŒ  r  Ú	heavy_opsr�  s      @r�   Úshould_realize_on_reusez"StorageBox.should_realize_on_reuseU%  s‡   ø€ ð
 �1Š9œ D§I¡I´	¼9Ð/EÔFÜ�d—i‘iÔ àŸ)™)×4Ñ4Ó6�Ø" IÐ.�	ÜÓ@°iÔ@Ô@Øà—‘Ó ¤6×#AÑ#AÑAò -Ø×*Ñ*Ó,ðð r�   c                óH   — | j                  |«      r| j                  «        y y rˆ   )r’  ró  r  s     r�   r  zStorageBox.mark_reuseg%  s   € Ø×'Ñ'¨Ô.Ø�L‰L�Nð /r�   c                ó6   — | j                   j                  «       S rˆ   rü  r‹  s    r�   r2  zStorageBox.num_readsk%  rú  r�   NrX  r]  rL  )r  rŠ   r¸   r™   )r  rŠ   r¸   r™   rl  rv  )rž   rŸ   r    r{  r  rü  ró  r  r†  rþ  r’  r  r2  r¢   r�   r�   rm  rm  þ$  s4   „ ñóó

óó<ó
ó&

óó$ô%r�   rm  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–  o%  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‰   rO  rl  rÉ   r>   )ÚbuffersrÉ  s     r�   Ú_has_aliased_buffersr›  v%  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Úoperandsr  c                ó¾   •— t         ‰| �  d ||¬«       || _        t        j                  j                  | «      | _        t        j                  j                  | «       y r}  )r_  r>  r’	  rs   r  r_  rÁ   r`  )rŒ  r’	  r   rJ  ra  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 InvokeSubgraphrE   )Úconstrain_to_fake_tensorNÚeager_input_valsrÞ   rÝ   r   rß   rÇ  ©r`  r�	  r™	  rÅ  )r’	  r   rJ  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„  Tr1  )r‰   r±   rß  r  rŽ  rL  r  r  r0  r  rM  rN  r¥   )rX  Ú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�   )rX  r…   r¨  rŠ   r¸   z:ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput)rö  r¤  rs   r  rY  r^  r¶  r  r  rq   r  rÓ  r¿   r©  r�  rî   r‰   r±   rÈ  rË  rÂ  r‘	  r—  rÁ   r–	  r—	  Úgraph_outputsr  r�  rm  r  )rÍ  r’	  r   r¤  rY  Úfake_operandsr¥  rM  Úfx_operandsrŒ   Únew_operandsrï   Úoperandr  r  rª  rÌ   rX  Ú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¦  rJ  rm  r¸   r¹   rQ  )r’	  r–  r   r…   r¸   z@list[ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput]rG	  )rž   rŸ   r    r{  r’	  r¡   r   r  r>  r«  rú  rŠ  rš  r,  r-  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] | Noner  c                ó  •— || _         || _        || _        || _        t	        |g|¢«      \  }}t
        ‰	| �  d |||¬«       |�|| _        t        j                  j                  | «      | _        t        j                  j                  | «       y ©N)rÁ   rJ  rf  ro  )rµ  r   r¶  r·  Ú_split_by_sym_typer_  r>  r{  rs   r  r_  rÁ   r`  )
rŒ  rµ  r   r¶  r·  rJ  r{  Úsym_argsrÙ  ra  s
            €r�   r>  zConditional.__init__&  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_subgraphs4&  sG   € Øˆ	Ø×ÒØ×Ñ˜T×/Ñ/Ô0Ø×ÒØ×Ñ˜T×0Ñ0Ô1ØÐr�   c                óR   — t        | t        «      r| S | j                  j                  S rˆ   )r‰   rŠ   rµ   rP  )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)r.  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ÚretrX  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·  rJ  r{  r„  r   )Ú-check_input_alias_and_mutation_return_outputs)r«  r¦  rÅ  zSequence[torch.Tensor]r¸   r–   )0r�  rs   r  rY  r¿   r‰   r   r³   r<   rÂ  r^  r‘	  r—  rÁ   r–	  r—	  r«  r›  r.  rÉ   rî   rÒ   r  r  r  rM  rÖ  r9   r  rê   r¶  r´  rm  rŽ  rL  rÿ   rÁ  r   rN  r¥   r  Útorch._higher_order_ops.utilsrÌ  r>   r…  rf  rJ  re  )rÍ  rµ  rÈ  rÉ  r   rŒ   r­  r¬  Úfx_opÚfake_outputsrÇ  r’	  Útrue_outputsÚfalse_outputsrÁ   r  rÌ   Út_oÚf_or  r{  ÚconditionalrX  Úmerged_outputr3  rÌ  rõ   Útrue_mutated_inputsÚfalse_mutated_inputsÚmutated_operand_indicesrï   s                                  r�   rŠ  zConditional.createB&  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¬
  ro  r  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–  rJ  rm  r{  r  r¸   r¹   rQ  )rå   zint | torch.SymIntr¸   zint | sympy.Expr)
rµ  r„   rÈ  r–  rÉ  r–  r   r¢  r¸   zlist[MultiOutput]rG	  rª  )rž   rŸ   r    r{  rµ  r¡   r   r¶  r·  r  r>  r«  r~  rÁ  rú  rŠ  rš  r£  r,  r-  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Â  rP  )r¿   Únon_sym_argsr¼  rU  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¸  r  c                ó.  •— || _         || _        || _        || _        t	        g |¢|¢«      \  }}	t
        ‰
| �  d ||	|¬«       |�|| _        || _        t        j                  j                  | «      | _        t        j                  j                  | «       y rº  )rà  rá  râ  rã  r»  r_  r>  r{  Ústack_outputrs   r  r_  rÁ   r`  )rŒ  rà  rá  râ  rã  rJ  r{  rå  r¼  rÙ  ra  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ˆ   )râ  rÂ  rã  r¾  s     r�   r«  zWhileLoop.get_subgraphs%'  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‰   rO  rl  r>   rÒ   r—  rÂ  r°  r¹  r²  )rà  rÉ  Úunwrapped_buffersÚseen_buffersr1  Úoriginal_inputÚunwrapped_buffers          r�   Ú_clone_aliased_inputszWhileLoop._clone_aliased_inputs0'  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„   rm  rO  rŽ  rŠ  rÖ
  r³   )rö   s    r�   Ú_maybe_wrap_as_tensor_boxz#WhileLoop._maybe_wrap_as_tensor_boxJ'  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–  rß  rî  rÂ  r°  rõ  r   )Útensor_boxesrÅ  rÆ  rÎ  ÚfkÚnew_tbs         r�   rÇ  z0WhileLoop.create.<locals>._require_exact_stridesc'  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�   éþÿÿÿr.  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: rE   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Ò   rs   r  r  rY  )Ú	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Å  )rà  rá  râ  rã  rJ  r{  rå  rÝ   z-NYI: while_loop_stack_output input mutations.rú
  zonly carries can be mutated.)r  r  rÿ   r   rM  )rò  r¦  rÅ  z'list[int | torch.SymInt | torch.Tensor]r¸   r–   )r÷  úSequence[int | sympy.Expr]rø  rü  r¸   r¹   )>rÍ  rð  rs   r  rY  r¿   r^  r�  rß  rì  r‰   r   r³   r‘	  r—  rÁ   r–	  r—	  rÉ   r«  r›  r.  r±   r  r  r™   r  r  rî   rÒ   r0  r9   r  rê   r¶  rm  ÚmoduleÚfxÚGraphModuler>   r×  r  re  rŽ  rL  r  r  rÿ   r´  rÁ  r   r¥   rÂ  rÖ  rf  rJ  r  rM  ro  r  r#
  r²  )*rÍ  Úcond_fnÚbody_fnrà  rá  rå  rð  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_outputsr.  r  rÌ   rZ  Úborû  r{  Ú
while_loopÚmutated_idxsÚmutated_idx_setrï   rd  Úmutated_inputs_iterÚall_outputsrX  r3  r2  rE  Úmutated_inputrh  rö   s*                                             r�   rŠ  zWhileLoop.createU'  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ð<Ø5ð<à5ð<ð ó<ñ ˜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_looprå  r¬
  ro  r  r¾   r™  s     r�   rš  zWhileLoop.codegen/(  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_defs5(  r²
  r�   )rà  r¦  rá  r¦  râ  r–  rã  r–  rJ  rm  r{  r  rå  r™   r¸   r¹   rQ  )rà  r¦  r¸   r¦  )rö   r…   r¸   r…   )r   r–  r  r–  rà  r¦  rá  r¦  rå  r™   r¸   rÙ
  rG	  rª  )rž   rŸ   r    r{  rà  r¡   rá  râ  rã  r  r>  r«  r~  rì  rî  rú  rŠ  rš  r£  r,  r-  s   @r�   rß  rß  ü&  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�   rß  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)
r_  r>  Útorch._higher_order_ops.effectsr  Úeffect_typers   r  Úeffectful_opsr¶  Úprev_effect_buffer)rŒ  rJ  r  rÙ  r£
  rÅ  rÀ   r{  r  r  ra  s             €r�   r>  zEffectfulKernel.__init__A(  sƒ   ø€ ô 	‰ÑØØØØØØØ/ð 	ô 	
õ 	@á! &Ó)ˆØÐ&Ð&Ð&Ø&ˆÔÜ"#§'¡'×"7Ñ"7×";Ñ";¸KÈÓ"NˆÔØ-1Œ�‰×Ñ˜kÒ*r�   c                óÈ   •— t         ‰| �  «       }| j                  �F|j                  j	                  t        j                  | j                  j                  «       «      «       |S rˆ   )r_  r,  r  r/  r²  rG   r  ro  )rŒ  r‰  ra  s     €r�   r,  zEffectfulKernel.get_read_writes^(  sU   ø€ Ü‘gÑ-Ó/ˆà×"Ñ"Ð.Ø×Ñ×!Ñ!Ü×$Ñ$ T×%<Ñ%<×%EÑ%EÓ%GÓHôð Ðr�   c                 ó   — yrö  r¢   r‹  s    r�   r
  z EffectfulKernel.has_side_effectsh(  r©  r�   rˆ   r  rs  rX  )rž   rŸ   r    r>  r,  r
  r,  r-  s   @r�   r°   r°   @(  sr   ø„ ð )-ð2ð HLñ2àð2ð ð2ð &ð	2ð
 &ð2ð +ð2ð &ð2ð Eð2ð 
õ2õ:÷r�   r°   c                  ó4   — e Zd Z ed «      	 d	 	 	 dd„«       Zy)rð  c                ó   — t        «       S rˆ   r=   r6  s     r�   r7  z!NonTensorObj.get_free_symbol_usesm(  rÈ  r�   Nrm  rx  )rž   rŸ   r    r^   r7  r¢   r�   r�   rð  rð  l(  s,   „ Ù˜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)rB  rÄ   rÁ   ú%FakeScriptObject | torch.ScriptObjectr  c                ó   — | j                   S rˆ   r˜  r‹  s    r�   ro  zTorchBindObject.get_namey(  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ƒ	  Únumelr•  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	rj  rˆ   r_  )r¸   r#  )r¸   ztorch.ScriptObjectrv  )	rž   rŸ   r    r¡   ro  r÷  rÎ  r)  r2  r¢   r�   r�   rB  rB  t(  s&   … à
ƒIØ0Ó0óôóó'ô=r�   rB  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ˆ   )r
  r  r‹  s    r�   ro  z OpaqueValueTypeConstant.get_name¥(  s   € Ü�D—J‘JÓÐr�   Nc                ó    — t        | j                  «      \  }}|j                  «       D ]"  \  }}|t        j                  j
                  |<   Œ$ |S rˆ   )r)   r  r  rs   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�   rj  rˆ   r_  ©rž   rŸ   r    r{  r¡   ro  r÷  r¢   r�   r�   r4  r4  š(  s   … ñð ƒJó õr�   r4  c                  ó4   — e Zd ZU ded<   ded<   dd„Zd	d
d„Zy)rÈ  rÄ   rÁ   rc  r  c                ó   — | j                   S rˆ   r˜  r‹  s    r�   ro  zGeneratorState.get_name´(  r~  r�   Nc                ó   — | j                   S rˆ   r˜  rõ  s     r�   r÷  z GeneratorState.codegen_reference·(  r~  r�   rj  rˆ   r_  )rž   rŸ   r    r¡   ro  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�   ro  zOpaqueObjectState.get_nameÆ(  r~  r�   Nc                ó   — | j                   S rˆ   r˜  rõ  s     r�   r÷  z#OpaqueObjectState.codegen_referenceÉ(  r~  r�   rj  rˆ   r_  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rö  r¢   r‹  s    r�   r
  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³   rw  r  r…  r†  rs  r‡  rÁ   rˆ  r‰  ru  )rŒ  rs  r  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 ]?  }
|
j	                  «        t         j                  j                  |
j                  «       «       ŒA |d   j                  «       } | t        |¬«      ||«      }t        j                  |«      }|j                  j                  |D �cg c]  }t        t        |¬«      ||«      ‘Œ c}«       |j                  j                  |D �cg c]  }|j                  «       ‘Œ c}«       d|v r`|j                  j                  t        t        |¬«      |d   |«      «       |j                  j                  |d   j                  «       «       y y # 1 sw Y   �ŒtxY wc c}w c c}w )Nr)  r   rÅ  rö   )rs   r  rþ  rå  ró  r”  ro  r  r‡  r¼  Útree_leavesre  r4  rf  r’
  rÂ  )rÍ  r  rf  r¿   rÀ   Ú_example_outputrÙ  rÚ  rÅ  r{  Ú
tensor_argr  r  ÚinpsrŒ  rh  s                   r�   Úcreate_inplacez _CollectiveKernel.create_inplaceê(  s­  € ô �W‰W×Ññ 	Dð #�×"Ñ" 6¨6ÐC°DÒC¸FÑCñØØØØØ!÷	Dñ %ÐE¨¨°Ð2CÐ1DÐ&EÓEÐ$Ø%ò 	?ˆJØ×ÑÔ Ü�G‰G×'Ñ'¨
×(;Ñ(;Ó(=Õ>ð	?ð ˜Q‘×*Ñ*Ó,ˆÙÜ˜fÔ%ØØØØó
ˆô ×!Ñ! &Ó)ˆØ×Ñ×&Ñ&ØOSÖTÈŒ^œJ¨fÔ5°s¸FÕCÒTô	
ð
 	×Ñ×!Ñ!¸TÖ"B°c 3§<¡<¥>Ò"BÔCØ�F‰?Ø×#Ñ#×*Ñ*Üœz°Ô8¸&À¹-ÈÓPôð ×Ñ×%Ñ% f¨U¡m×&<Ñ&<Ó&>Õ?ð ÷;	Dñ 	Düò0 Uùò #Cs   ›F+Ã*F8Ä(F=Æ+F5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 )Nr	  rÅ  )rs   r  rþ  rå  r‰   rB  ró  r¥   r½
  rm  rî   rŽ  r™  r  rÒ   rF   r  rp   rÐ  r²  rÁ   )rÍ  r  rf  r¿   rÀ   rà  rÙ  rÚ  rÅ  r{  rI  r  r  rÌ   rP  rŒ  s                   r�   Úcreate_out_of_placez%_CollectiveKernel.create_out_of_place,)  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-rX  rˆ   rH	  )
r  r�   rf  zIRNode | list[IRNode]r¿   r   rÀ   r   r¸   r¹   )
r  r�   rf  zTensorBox | list[TensorBox]r¿   r   rÀ   r   r¸   z%list[MultiOutput] | _CollectiveKernel)	rž   rŸ   r    rÌ  r
  r~  rú  rK  rM  r¢   r�   r�   rB  rB  Í(  s¡   „ óóô

ð( ð)@àð)@ð &ð)@ð ð	)@ð
 ð)@ð 
ò)@ó ð)@ðB ð9àð9ð ,ð9ð ð	9ð
 ð9ð 
/ò9ó ñ9r�   rB  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_©r_  r>  r~  r  s	           €r�   r>  z_AllReduce_Kernel.__init__j)  ó=   ø€ ô 	‰ÑØØØØØØØ/ð 	ô 	
ð 	× Ñ Ð!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‰   rJ  râ  r,	  r™  s     r�   rš  z_AllReduce_Kernel.codegen€)  ó@   € Ø×$Ñ$Ð%RÔSØ×,Ñ,¨TÔ2ä�d—k‘k¤6Ô*Ø×%Ñ% gÕ.ð +r�   rˆ   r  rG	  r¨	  r-  s   @r�   rO  rO  i)  sw   ø„ ð )-ðPð HLñPàðPð ðPð &ð	Pð
 &ðPð +ðPð &ðPð EðPð 
õP÷,/r�   rO  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_reducerR  r  s	           €r�   r>  z_AllReduceKernel.__init__‰)  s=   ø€ ô 	‰ÑØØØØØØØ/ð 	ô 	
ð 	× Ñ Ð!MÕNr�   c                ó    — |j                  d«       |j                  | «       t        | j                  t        «      r| j                  |«       y y rU  rV  r™  s     r�   rš  z_AllReduceKernel.codegenŸ)  rX  r�   rˆ   r  rG	  r¨	  r-  s   @r�   rZ  rZ  ˆ)  sw   ø„ ð )-ðOð HLñOàðOð ðOð &ð	Oð
 &ðOð +ðOð &ðOð EðOð 
õO÷,/r�   rZ  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_tensorrR  r  s	           €r�   r>  z_WaitKernel.__init__¨)  rS  r�   c                ó    — |j                  d«       |j                  | «       t        | j                  t        «      r| j                  |«       y y rU  rV  r™  s     r�   rš  z_WaitKernel.codegen¾)  rX  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í  )rf  r‰   r…   rB  r³   rŽ  rŠ  )rŒ  rh  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)Nr)  rÅ  )	rs   r  rþ  rå  r‡  r  re  rÂ  rf  )	rÍ  r  rh  rH  rÙ  rÚ  rÅ  r{  r  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ˆ   )r_  r,  re  r/  r²  rG   r  ro  )rŒ  r‰  Úvolatile_readsÚvrra  s       €r�   r,  z_WaitKernel.get_read_writesô)  sZ   ø€ Ü‘gÑ-Ó/ˆà×0Ñ0Ó2ˆØ ò 	GˆBØ×Ñ×!Ñ!¤,×"6Ñ"6°r·{±{³}Ó"EÕFð	GàÐr�   rˆ   r  rG	  rn	  )r  r�   rh  r„   r¸   r¹   rs  )
rž   rŸ   r    r>  rš  re  rú  rg  r,  r,  r-  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   r4   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   r3   r¦   r¥   r>   r¬   r!   rA	  r  r–  rl  s      r�   rA	  rA	  *  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 )Nrz  r   )r‰   r„   rI  rm  r¬  r‘  rn  r„  rŽ  rŠ  rf  )r1  rÔ  s     r�   Úassign_origin_nodero   *  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¸   r&  )rÓ   ro  r¸   z&Callable[[Sequence[_T]], Sequence[_T]])rÚ   z&Callable[[Sequence[_U]], Sequence[_V]]rÛ   z&Callable[[Sequence[_T]], Sequence[_U]]r¸   rv  rˆ   )ré   z#Sequence[int | torch.SymInt | Expr]rê   zShapeEnv | Noner¸   ro  )rÓ   úSequence[int | Integer]r¸   ro  rm  )rŒ   r¹   rû   r™   r¸   r¹   )rŒ   r…   rû   r™   r¸   r9  )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¸   r^  )rŒ   z"IRNode | torch.device | None | strr¸   r™   )rŒ   zBuffer | TensorBoxr-  rŠ   r¸   r™   )r;  ri  r<  ri  r=  ri  r¸   r™   )rP  r…   rQ  zSequence[int | torch.SymInt]r¸   r…   )r`  r¦	  r¸   r¹   )rf  r¦  r¸   r*  )rï   zExpr | Sequence[Expr]r  rU  r¸   rr   rR  )rE  rÄ   r  rU  rD  r™   r¸   r'  )rÿ   ro  r   rI	  rM  r   r¸   rg  r		  )TFNFN)rŒ   r…   r¼  r™   rÆ  r™   rÇ  rn  r  r™   r)  rn  r¸   ztuple[StorageBox, Layout])rŒ   r…   rÇ  rp  r¸   r™   rJ  )r   ri  r=  ri  r¸   r™   )r  rU  r¸   rŠ   )r´   r6  r¸   zTypeIs[Sequence[IRNode]])r  rE
  r¸   rÄ   )rš  r¦  r¸   r™   )r¿   r§	  r¸   z-tuple[list[ShapeAsConstantBuffer], list[Any]])rå   rÃ   r¸   rø  )r1  r   rÔ  ztorch.fx.Noder¸   r¹   (\  Ú
__future__r   r  rR  r|  r•  r¸  Úloggingr-  Útextwraprx  Úcollections.abcr   r   r   r   r   r	   r
   Úenumr   r   Ú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Ð
  rÄ
  rŸ
  rv  r˜
  Útorch._loggingr  Útorch.fxÚtorch.utils._pytreeÚ_pytreer¼  Útorch._dynamo.utilsr"   Útorch._export.serde.serializer#   Ú*torch._higher_order_ops.auto_functionalizer$   Útorch._inductorr%   r-  r'   Ú"torch._library.fake_class_registryr(   Útorch._library.opaque_objectr)   r*   Útorch._prims_commonr+   r,   r-   r.   r/   r0   Ú%torch.fx.experimental.symbolic_shapesr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   Útorch.fx.noder<   Útorch.utils._ordered_setr>   Útorch.utils._python_dispatchr?   Útorch.utils._sympy.functionsr@   rA   rB   rC   Útorch.utils._sympy.symbolrD   r½  rF   rG   Úcodegen.commonrH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   Ú	loop_bodyrS   Úops_handlerrT   rU   rV   rW   Úruntime.benchmarkingrX   Úruntime.hintsrY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   Úvirtualizedrq   rr   rs   rt   ru   Útorch.typesrv   Úcodegen.cutlass.templaterw   Úcodegen.wrapperrx   r  ry   rz   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Ü   rK  rM  rì   ró   rø   rü   r  r  r&  r(  r8  rA  rV  rb  ri  rp  r…   rƒ  r¬  r  r  r  r-  rV  rX  rÃ  r4  r6  rA  rI  rf  r—  rŸ  r  rÃ  rK  rÌ  rÎ  rk  r©   r  r%  r0  r  rO  r”  r   rÀ  rÇ  rÎ  rØ  rÜ  r  râ  rL  r	  rp  r|  r€  r‡  r‘  rn  rÎ  r†  rÖ  r  rß  r±   r„  rV  r‡  rª  r™   r¥   ÚPrimitiveInfoTyper¶  r×  rÛ  r   r  r  r  r4  r…  rK  rO  r°  rL	  rT	  ri  rf  rp	  rt	  ru	  rŠ	  rª	  rû	  r
  r
  r!
  r&
  r.
  r;
  rG
  rR
  rb
  rª   r«   r‚
  r˜  r  r  rm  rŽ  r²   r7  r  r	  r›  r„   rm  r–  r›  r�  r´  r»  rß  r°   rð  rB  r4  rÈ  rË  rB  rO  rZ  r_  r@	  rA	  ro  r¢   r�   r�   ú<module>rš     sO  ðÞ "ã Û Û Û Û Û Û Û Û ß MÕ Mß :Ý Ý ÷÷ ÷ ñ ÷ U× TÝ ã ß 'Ñ 'ç 2Ó 2ß ,Ð ,Û Û ß $Ð $Ý (Ý ?Ý MÝ #Ý 2Ý ?ß M÷÷ ÷÷ ÷ ñ õ Ý /Ý ?ß QÓ QÝ *ç "÷õ ÷÷ õ  ß 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'ôò;÷S,ñ S,ñl
 �UÔ÷Uð Uó ðUðp ôF
ˆFó F
ó ðF
ôR&ð ô%
�ó %
ó ð%
ðP ô
ˆió 
ó ð
ñF �|Ó$Ù�yÓ!Ù�yÓ!Ù˜ÓÙ�uÓÙ�uÓÙ˜=Ó)ñ<Ð Ð8ó ð JNñ<NØð<NØ +ð<NØBFð<Nàô<Nð~ ôd
�ó d
ó ðd
ðR $(Ù˜1“:ðØ
ðà ðð ðð &ô	ð& " 8¨D¡>°8¸D±>Ð"BÀHÐ"LÑM€ˆYÓ Mô7S˜9ô 7Sôt#Ð1ô #ôL`
Ð+ô `
ðF ôF
ˆ5ó F
ó ðF
ðT ô	�ó 	ó ð	ð ô[ˆ5ó [ó ð[ô|ô	ð Ø!Ø37ØØ48ñ9Øð9àð9ð ð9ð 1ð	9ð
 ð9ð 2ð9ð ô9ðxØðØ4ðà	ôôð$ ô^
ˆvó ^
ó ð^
ðB ô[�ó [ó ð[ð| ô-�(ó -ó ð-ð` ôA9�(ó A9ó ðA9ðH ô!�(ó !ó ð!ðH ô[ˆ;ó [ó ð[ð| ôS�hó Só ðSðl ô&�ó &ó ð&ôRlA�ô lAð^ ô�6ó ó ðð" ôKˆ|ó Kó ñKð$ ôS�|ó Só ñSðØðØ'9ðà	õõ(<÷7ò 7ð  ô`
‰Zó `
ó ñ`
ô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Ô#÷ð ó $ñô]+‘_õ ]+ô@<™>õ <ð~ ˜%‘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‘õ ôK‘9õ Kñ\ �UÔôE‘<ó Eó ñEñP �UÔô"‘ló "ó ñ"ôJ
‘/õ 
ô(("™õ ("ôV
‘Võ 
ôB=‘Lõ =ô@%
¡õ %
ôP
™-õ 
ô$<
‘\õ <
ô~W™lõ Wôt
))™|õ ))ôZ/™,õ /ôd¡<õ ô8BÑ5õ Bô$8Ñ-õ 8ô26)‘lõ 6)ôr))‘|õ ))ôX9T‘õ 9Tôx,E¡õ ,Eô^21‘|õ 21ôj-‘Lõ -ö8<;‘<õ <;ñ~ �UÔ÷ò ó ñö
t	Ñ&õ t	ñn �UÔö
‘.ó 
ó ñ
ö@ ™õ  ð2 ö™
ó ó ñöI
‘,õ I
öX 
™õ  
öF4™Kõ 4ö 2öf™>õ fðV ×ÒöT�ó Tó ñTõn+‘
õ +ön%‘õ n%ñb �UÔö'ˆvó 'ó ñ'öLñ �UÔöB.‘\ó B.ó ñB.ñJ �UÔöe ‘,ó e ó ñe ðP"Ø
ð"à2ö"ñ �UÔö@ ‘ó @ ó ñ@ öF
)‘nõ )öX�6õ ð ö"=‘ló "=ó ñ"=ðJ ö™ló ó ñð( ö‘\ó ó ñð ö™ó ó ñö"Y™õ Yöx/Ñ)õ /ö>/Ñ(õ /ö>SÑ#õ Sörö ÷ TøðiL ò Ø€NØƒJðús   Ç!l3 ì3	m ì?m 