§
    ŠŠtj,† ã                  ó  — 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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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mZm Z  d dl!m!Z! d dlm"Z" d dl	m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3 d d	lm4Z4 d dl5Z5d dl6Z6d dl7m8c m9Z: d d
l;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dl7mEZEmFZF d dlGmHZH ddgZId dlJmKZK d dlLmMZMmNZNmOZOmPZPmQZQ e,rhd dlmRZRmSZSmTZT d dlUmVZV d dl6mWZWmXZXmYZY d dlZm[Z[ d dl\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!ljmkZkmlZlmmZmmnZnmoZompZp dd"lqmrZr dd#lsmtZtmuZu g d$¢Zv e/d%¦  «        Zwejx        �džd(„¦   «         Zyd d)lzm{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/l†m‡Z‡mˆZˆm‰Z‰mŠZŠm‹Z‹mŒZŒ d d0l�mŽZŽm�Z� d d1l�m‘Z‘m’Z’ dd2l“m”Z” dd3l•m–Z— ej        d4k    Z˜ ej™        eš¦  «        Z›d5Zœ e/d6¦  «        Z�eže5jŸ        e5jŸ        f         Z e6j¡        e¢z  e6jY        z  dz  Z£e˜rd7n ej¤        d8d9¦  «        Z¥d:d;d<e¥› �d=œZ¦d>Z§d>Z¨d>Z©d?Zª eDe6j«        e6j¬        e6j­        e6j®        e6j¯        e6j°        e6j±        e6j²        e6j³        e6j´        e6jµ        e6j¶        e6j·        e6j¸        e6j¹        g¦  «        Zºd@e»dA<   dBZ¼e¼e¼dz
  z  d k    re¼dCk    s
J dD¦   «         ‚�dŸdG„Z½�d dK„Z¾ G dL„ dMe5j¿        ¦  «        ZÀ ejÁ        dN¬O¦  «         G dP„ dQ¦  «        ¦   «         ZÂ�d¡�d¢dY„ZÃ	 	 	 �d£�d¤d\„ZÄ�d¥dc„ZÅ	 	 	 �d£�d¤dd„ZÆejx        �d¦de„¦   «         ZÇ�d§di„ZÈ�d¨dl„ZÉ�d©dp„ZÊ�dªds„ZË�d«dv„ZÌ�d¬dy„ZÍ�d­d}„Z–�d®d€„ZÎ�d¯dƒ„ZÏ�d°d†„ZÐ�d±dˆ„ZÑ�d²d‹„ZÒ�d³dŽ„ZÓd�„ f�d´d”„ZÔ�dµdœ„ZÕ�d¶�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¼„ZÝ e2d½¦  «        ZÞ e/d¾dN¬¿¦  «        Zßee'e%eÞf         eßf         Zà G dÀ„ dÁe+e(eÞeßf         ¦  «        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é�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ó eôg dó¢e6jõ        jö        �dôgng z   ¦  «        Z÷�dÒdø„Zø�dÓdù„Zù�dÔdû„Zúd dlûZû�dÕdü„Züg Zýd˜e»dý<   �dÖdþ„Zþ�dÕdÿ„Zÿe�j         �d×�d„¦   «         �Ze�j         	 	 	 �dØ�dÙ�d„¦   «         �Zeþ�Zeÿ�Z�e�ZdZ�d	œ�dÚ�d„�ZdZ�d	œ�dÛ�d„�Z ej"        dC¦  «        �dÜ�d„¦   «         �Z G �d„ �de*¦  «        �Z	ejÁ         G �d„ �d¦  «        ¦   «         �Z
 G �d„ �d¦  «        �Z G �d„ �d�e¦  «        �Z G �d„ �d�e¦  «        �Z�dÝ�d„�Z G �d „ �d!�e¦  «        �Ze�j         �dÞ�d"„¦   «         �Z G �d#„ �d$¦  «        �Z G �d%„ �d&�e¦  «        �Zejx        �dß�dà�d)„¦   «         �Zej"        �dá�d*„¦   «         �Zej"        �d¦�d+„¦   «         �Z�d¦�d,„�Z�dá�d-„�Z	 �dÆ�dâ�d2„�Z�dã�dä�d4„�Z�då�d9„�Z�dæ�d;„�Z�dæ�d<„�Z�dæ�d=„�Z�dæ�d>„�ZdZdZdN�d?œ�dç�dC„�ZddZ�dDœ�dè�dJ„�Z 	 �dé�dê�dK„�Z!dZ�dLœ�dë�dM„�Z"dZ�dLœ�dë�dN„�Z#�dì�dT„�Z$ ej"        d�¬U¦  «        �d¦�dV„¦   «         �Z% ej"        d�¬U¦  «        �d¦�dW„¦   «         �Z&�dX„ �Z' ej"        d�¬U¦  «        �d¦�dY„¦   «         �Z(�dí�db„�Z)�dî�df„�Z*	 	 �dï�dð�dk„�Z+�dñ�dm„�Z,e¢e5jŸ        z  �Z-�dne»�dg<   ejx        	 �dò�dó�dp„¦   «         �Z.ejx        �dô�dq„¦   «         �Z/ejx        �dõ�dr„¦   «         �Z0ejx        �dö�ds„¦   «         �Z1ejx        �d÷�du„¦   «         �Z2�dø�dv„�Z3�dî�dw„�Z4�dî�dx„�Z5�dø�dy„�Z6�dø�dz„�Z7�dù�d~„�Z8	 	 	 	 �dú�dû�dƒ„�Z9�d¦�d„„�Z: G �d…„ �d†¦  «        �Z;�dü�d‹„�Z<�dü�dŒ„�Z=�dý�dŽ„�Z>�dþ�d�„�Z?�dÿ�d�„�Z@�dÿ�d‘„�ZA�d �d“„�ZBe�j         �d�d–„¦   «         �ZC	 �dÆ�d�dš„�ZD�d�dœ„�ZE�d�d�„�ZF�d�dŸ„�ZG�d�d „�ZH�d�d£„�ZI�d�d¤„�ZJe�j         �d�d§„¦   «         �ZK�dá�d¨„�ZLejx        �dá�d©„¦   «         �ZMejx        �d	�dª„¦   «         �ZNejx        �dá�d«„¦   «         �ZO�dá�d¬„�ZP�dá�d­„�ZQ�d
�d¯„�ZR�d�d°„�ZS�d¦�d±„�ZT�d¦�d²„�ZU�d�d´„�ZV�dÑ�dµ„�ZW G �d¶„ �d·e�jX        ¦  «        �ZY�d�d»„�ZZ�d�d¾„�Z[�d�d¿„�Z\	 �dÆ�d�dÃ„�Z]�d�dÅ„�Z^	 �dÆ�d�dÊ„�Z_�d�dË„�Z`�d�dÎ„�Za�d�dÒ„�Zb�dÓ„ f�d�dÚ„�Zc�dÛ„ f�d�dÜ„�Zd�d�dß„�Ze�d�dá„�Zf�d�dâ„�ZgejÁ         G �dã„ �dä¦  «        ¦   «         �Zhe�j         �d�dæ„¦   «         �Zi�d�dç„�Zj�d�dè„�Zk�d¦�dé„�Zl ej"        d¦  «        �d�dï„¦   «         �Zm	 �dÆddd�dðœ�d�dõ„�Zn�d�dö„�Zo�d�d÷„�Zp�d �dý„�Zq�d!�dþ„�Zr�d"�d„�Zs�d#�d„�Zt�d$�d„�Zu�d%�d„�Zv�d&�d
„�Zw�d'�d„�Zx�d(�d„�Zy	 �dÆ�d)�d„�Zz�d*�d„�Z{�d+�d„�Z|�d,�d„�Z}�d¦�d„�Z~�d�d „�Z�d!�d"�d#�d$�d%�d&�d&�d'œ�Z€�d(„ �e€� �                    ¦   «         D ¦   «         �Z‚ e�jƒ        �d)¦  «        �Z„�d-�d*„�Z…�d.�d+„�Z†�d/�d-„�Z‡�d/�d.„�Zˆejx        �d0�d0„¦   «         �Z‰ejÁ         G �d1„ �d2¦  «        ¦   «         �ZŠi �Z‹�d3e»�d4<   �d1�d8„�ZŒ eD¦   «         �Z��d9e»�d:<   �d2�d;„�ZŽ�dÆ�d3�d=„�Z��d4�d?„�Z��d5�d@„�Z‘ e/�dA¦  «        �Z’ e/�dB¦  «        �Z“ G �dC„ �dDe�e’�e“f         ¦  «        �Z” e1dN�¬E¦  «        �dÆdNdOœ�d6�dI„¦   «         �Z•�d7�dK„�Z– G �dL„ �dMe�jX        ¦  «        �Z—ejx        �d8�dN„¦   «         �Z˜�d¦�dO„�Z™�d9�dQ„�Zš�d:�dT„�Z›�d:�dU„�Zœ�d;�dW„�Z��dž�dX„�Zž�d<�dY„�ZŸ�d¦�dZ„�Z �d=�d[„�Z¡�d\�Z¢�d>�d]„�Z£�d>�d^„�Z¤�d?�dc„�Z¥	 	 �dï�d@�dk„�Z¦�dA�dm„�Z§�dB�dp„�Z¨�d¦�dq„�Z©�dC�du„�Zª�dD�dw„�Z« ejÁ        dN¬O¦  «         G �dx„ �dy¦  «        ¦   «         �Z¬e�dze%f         �Z­e�e­�e¬g�e­f         �Z® G �d{„ �d|¦  «        �Z¯ �e¯¦   «         �Z°�dE�d~„�Z±�dF�d€„�Z²�dG�dƒ„�Z³�dH�d†„�Z´�dI�d‡„�Zµ eDg �dˆ¢¦  «        �Z¶�dñ�d‰„�Z·e"�dJ�dŠ„¦   «         �Z¸�dK�dŒ„�Z¹�dL�d—„�Zº�dM�dš„�Z»	 �dé�dN�d�„�Z¼dS (O  é    )ÚannotationsN)ÚCallableÚ
CollectionÚ	GeneratorÚIteratorÚMappingÚMutableMappingÚ
MutableSet)Údatetime)Ú	lru_cache)ÚStringIO)ÚAnyÚcastÚConcatenateÚGenericÚLiteralÚ
NamedTupleÚProtocolÚTYPE_CHECKINGÚ	TypeAliasÚ	TypeGuardÚTypeVar)Údataclass_transformÚ	ParamSpecÚSelf)Úmock)Údatasheet_tops)ÚDeviceProperties)Ú_needs_inductor_compile)Údtype_abbrs)Ú
OrderedSet)Útree_flattenÚtree_map_only)Úhas_triton_packageÚ!activation_quantization_aten_passÚinductor_autotune_lookup_table©Ú_sympy_subs)Úfree_symbolsÚfree_unbacked_symbolsÚGuardOnDataDependentSymNodeÚIterateExprsÚShapeEnv)ÚIterableÚSequenceÚ
ValuesView)ÚPath)ÚSymBoolÚSymFloatÚSymInt)ÚELEMENTWISE_TYPE_PROMOTION_KIND)ÚGraphModule)ÚNode)ÚScalingTypeé   )ÚWorkspaceArg©ÚPythonWrapperCodegen)ÚDep©ÚGraphLowering)ÚBufferÚExternKernelÚIRNodeÚLayoutÚ	OperationÚReinterpretView©ÚCompiledFxGraph)ÚBaseSchedulerNodeÚSchedulerBuffer)ÚcudaÚmpsÚxpuÚmtiaÚTÚreturnÚstrc                 ó¤   — d„ t           D ¦   «         } t          | ¦  «        dk    sJ ‚t          | ¦  «        dk    rdn|                      ¦   «         }|S )Nc                ó`   — g | ]+}t          t          |¦  «                             ¦   «         ¯)|‘Œ,S © )ÚgetattrÚtorchÚis_available©Ú.0Úxs     úS/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_inductor/utils.pyú
<listcomp>z get_gpu_type.<locals>.<listcomp>m   s3   € ÐKÐKÐK˜­'µ%¸Ñ*;Ô*;×*HÒ*HÑ*JÔ*JÐK�!ÐKÐKÐKó    r9   r   rJ   )Ú	GPU_TYPESÚlenÚpop)Ú
avail_gpusÚgpu_types     rZ   Úget_gpu_typerb   k   sT   € àKÐK�YÐKÑKÔK€JÝˆz‰?Œ?˜aÒÐÐÐÝ˜Z™œ¨AÒ-Ð-ˆvˆv°:·>²>Ñ3CÔ3C€HØ€Or\   )Úget_interface_for_device)Údetect_fake_mode)Ú
DeviceType)Ú	EventList)ÚGraphTransformObserver)Ú	ShapeProp)ÚCeilDivÚCleanDivÚFloorDivÚIdentityÚMaxÚModularIndexing)Úmake_symbolÚSymT)Úbound_sympyÚValueRanges©Úconfig)ÚceildivÚwin32Ú!inductor_do_bench_using_profilingÚ_TÚspvÚTORCHINDUCTOR_XPU_KERNEL_FORMATÚzebinz.cubinz.hsacoú.)rJ   ÚhiprL   é   é€   zOrderedSet[torch.dtype]Ú_TMA_SUPPORTED_DTYPESé@   é   zmust be power of 2ÚnbytesÚintc                ó.   — | t           z   dz
  t            z  S )z/Round up to the nearest multiple of ALIGN_BYTESr9   )ÚALIGN_BYTES)rƒ   s    rZ   Ú_alignr‡   ¿   s   € à•[Ñ  1Ñ$­¨Ñ4Ð4r\   Úvú
sympy.ExprÚboolc                ó  — t          | t          j        t          j        t          f¦  «        r't	          t          t          | j        ¦  «        ¦  «        S t          | t          ¦  «        p"t          j	        | t          ¦  «        t          k    S )z:v can be statically proven to be a multiple of ALIGN_BYTES)Ú
isinstanceÚsympyÚAddrm   ÚallÚmapÚ_is_alignedÚargsÚalignÚgcdr†   )rˆ   s    rZ   r‘   r‘   Ä   s_   € å�!•e”i¥¤­CÐ0Ñ1Ô1ð -Ý•3•{ A¤FÑ+Ô+Ñ,Ô,Ð,Ý�a�ÑÔÐK¥5¤9¨QµÑ#<Ô#<ÅÒ#KÐKr\   c                  ó2   — e Zd ZdZdZdZed
d„¦   «         Zd	S )r“   z<Symbolically round up to the nearest multiple of ALIGN_BYTES©r9   TÚvaluer‰   rO   úsympy.Expr | Nonec                ó¢   — t          |t          t          j        f¦  «        rt	          t          |¦  «        ¦  «        S t          |¦  «        r|S d S ©N)rŒ   r„   r�   ÚIntegerr‡   r‘   )Úclsr—   s     rZ   Úevalz
align.evalÑ   sN   € å�e�c¥5¤=Ð1Ñ2Ô2ð 	&Ý�#˜e™*œ*Ñ%Ô%Ð%Ý�uÑÔð 	ØˆLð	ð 	r\   N)r—   r‰   rO   r˜   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnargsÚ
is_integerÚclassmethodr�   rS   r\   rZ   r“   r“   Ë   sB   € € € € € ØFÐFà€EØ€Jàðð ð ñ „[ðð ð r\   r“   T)Úfrozenc                  ó<   — e Zd ZU dZded<   ded<   ded<   ded<   d	S )
ÚGraphPartitionMapzP
    Mapping from the partition info (e.g., input/output) to the graph info
    r„   Úidzlist[int | None]Úinput_index_mappingÚoutput_index_mappingú	list[str]Úconstant_namesN©rž   rŸ   r    r¡   Ú__annotations__rS   r\   rZ   r§   r§   Ù   sO   € € € € € € ðð ð
 €G€G�Gð *Ð)Ð)Ñ)Ø*Ð*Ð*Ñ*ð ÐÐÑÐÐr\   r§   é   éd   ÚfnúCallable[[], Any]ÚwarmupÚrepÚfloatc                óî  —  | ¦   «          t           j                             ¦   «          t          j        t	          d¦  «        t           j        d¬¦  «        }t           j                             d¬¦  «        }t           j                             d¬¦  «        }|                     ¦   «          t          d¦  «        D ] }| 	                    ¦   «           | ¦   «          Œ!|                     ¦   «          t           j                             ¦   «          | 
                    |¦  «        dz  }t          dt	          ||z  ¦  «        ¦  «        }t          dt	          ||z  ¦  «        ¦  «        }	t          |¦  «        D ]} | ¦   «          Œd„ t          |	¦  «        D ¦   «         }d	„ t          |	¦  «        D ¦   «         }t           j                             t           j        j        j        g¬
¦  «        5 }
t           j                             ¦   «          t          |	¦  «        D ]�}| 	                    ¦   «          ||                              ¦   «          t           j        j                             d¦  «        5   | ¦   «          ddd¦  «         n# 1 swxY w Y   ||                              ¦   «          Œ‘t           j                             ¦   «          t          j        d„ t%          ||¦  «        D ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   t          j        |¦  «                             ¦   «         }t*                               d¦  «         t*                               |
                     ¦   «                              dd¬¦  «        ¦  «         t3          d„ |
                     ¦   «         D ¦   «         ¦  «        }|r$|t7          j        d„ |D ¦   «         ¦  «        dz  z  }t*                               d|¦  «         |S )aR  
    Returns benchmark results by examining torch profiler events.
    This could be more accurate as it doesn't count CPU side overhead.
    However, this also requires manually excluding irrelevant event, e.g.
    vectorized_elementwise_kernel which is used to fill L2 cache,
    various CUDA events, etc, so could also be fragile.
    ç    €„ŽArJ   ©ÚdtypeÚdeviceT©Úenable_timingé   r9   c                óN   — g | ]"}t           j                             d ¬¦  «        ‘Œ#S ©Tr»   ©rU   rJ   ÚEvent©rX   Ú_s     rZ   r[   zfp8_bench.<locals>.<listcomp>  s+   € ÐQÐQÐQ¸A•5”:×#Ò#°$Ð#Ñ7Ô7ÐQÐQÐQr\   c                óN   — g | ]"}t           j                             d ¬¦  «        ‘Œ#S r¿   rÀ   rÂ   s     rZ   r[   zfp8_bench.<locals>.<listcomp>  s+   € ÐOÐOÐO¸!•”×!Ò!°Ð!Ñ5Ô5ÐOÐOÐOr\   ©Ú
activitiesÚRunCudaModuleNc                ó>   — g | ]\  }}|                      |¦  «        ‘ŒS rS   )Úelapsed_time)rX   ÚsÚes      rZ   r[   zfp8_bench.<locals>.<listcomp>  s(   € ÐGÐGÐG¡4 1 aˆQ�^Š^˜AÑÔÐGÐGÐGr\   ú
raw eventsÚself_device_time_totaléÿÿÿÿ©Úsort_byÚ	row_limitc                óp   — g | ]3}|j         t          j        k    rt          j        d |j        ¦  «        ®1|‘Œ4S )zfused_abs_max_\d)Údevice_typere   ÚCUDAÚreÚmatchÚname©rX   Úevents     rZ   r[   zfp8_bench.<locals>.<listcomp>"  sJ   € ð 	
ð 	
ð 	
ààÔ!¥Z¤_Ò4Ð4Ý”HÐ0°%´*Ñ=Ô=ÐIð	 ð JÐIÐIr\   c              3  ó$   K  — | ]}|j         V — Œd S rš   )Údevice_time_totalrØ   s     rZ   ú	<genexpr>zfp8_bench.<locals>.<genexpr>-  s%   è è € ÐQÐQ¸˜EÔ3ÐQÐQÐQÐQÐQÐQr\   ç     @�@úprofiling results: %s ms)rU   rJ   ÚsynchronizeÚemptyr„   Úfloat16rÁ   ÚrecordÚrangeÚzero_rÉ   ÚmaxÚprofilerÚprofileÚProfilerActivityrÔ   ÚnvtxÚtensorÚzipÚmeanÚitemÚlogÚdebugÚkey_averagesÚtablerf   ÚeventsÚ
statistics)r±   r³   r´   ÚcacheÚstart_eventÚ	end_eventrÃ   Úestimate_msÚn_warmupÚn_repeatÚpÚiÚtimesÚresÚfiltered_eventss                  rZ   Ú	fp8_benchrÿ   ë   s  € ð €B�D„D€DÝ	„J×ÒÑÔÐÝŒK�˜J™œ­u¬}ÀVÐLÑLÔL€Eõ ”*×"Ò"°Ð"Ñ6Ô6€KÝ”
× Ò ¨tÐ Ñ4Ô4€IØ×ÒÑÔÐÝ�1‰XŒXð ð ˆØ�Š‰ŒˆØ
ˆ‰ŒˆˆØ×ÒÑÔÐÝ	„J×ÒÑÔÐØ×*Ò*¨9Ñ5Ô5¸Ñ9€Kõ �1•c˜& ;Ñ.Ñ/Ô/Ñ0Ô0€HÝ�1•c˜# Ñ+Ñ,Ô,Ñ-Ô-€Hõ �8‰_Œ_ð ð ˆØ
ˆ‰ŒˆˆàQÐQÅÀxÁÄÐQÑQÔQ€KØOÐO½uÀX¹¼ÐOÑOÔO€IÝ	Œ×	Ò	åŒNÔ+Ô0ð
ð 
 ñ 
ô 
ð 
ð 
ÝŒ
×ÒÑ Ô Ð Ý�x‘”ð 	"ð 	"ˆAØ�KŠK‰MŒMˆMØ˜ŒN×!Ò!Ñ#Ô#Ð#Ý””×&Ò& Ñ7Ô7ð ð Ø�‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à�aŒL×ÒÑ!Ô!Ð!Ð!ÝŒ
×ÒÑ Ô Ð Ý”ØGÐG­3¨{¸IÑ+FÔ+FÐGÑGÔGñ
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ" Œ*�UÑ
Ô
×
 Ò
 Ñ
"Ô
"€CÝ‡I‚IˆlÑÔÐÝ‡I‚Iˆa�nŠnÑÔ×$Ò$Ð-EÐQSÐ$ÑTÔTÑUÔUÐUÝð	
ð 	
àŸš™œð	
ñ 	
ô 	
ñ	ô 	€Oð ð 
ØÝŒOÐQÐQÀÐQÑQÔQÑQÔQØññ	
ˆõ
 ‡I‚IÐ(¨#Ñ.Ô.Ð.Ø€Js8   Ç(BK=É*JÉ5K=ÊJÊK=ÊJÊ	A(K=Ë=LÌLFÚis_vetted_benchmarkingc                ó`   — ddl m}m}  |t          ¦  «        }  ||¦  «        | |||¦  «        S )Nr   )Úgpu_benchmark_lockÚmay_distort_benchmarking_result)Ú$torch._inductor.runtime.benchmarkingr  r  Ú_do_bench_using_profiling)r±   r³   r´   r   r  r  Úlocked_benchs          rZ   Údo_bench_using_profilingr  5  sg   € ð"ð ð ð ð ð ð ð ð
 &Ð%Õ&?Ñ@Ô@€LØ8Ð*Ð*¨<Ñ8Ô8Ø
ˆF�CÐ/ñô ð r\   Úkineto_eventsúIterable[Any]Úprofiler_eventsrù   Úexpected_device_typere   c           
     óœ  ‡
‡— t          ¦   «         Š
dˆ
ˆfd„Šd„ |D ¦   «         }t          |¦  «        |k    r+t          d|› dt          › d	t          |¦  «        › d
�¦  «        ‚|D ]} ‰|¦  «         Œd}| D ]±}|                     ¦   «         }|                     ¦   «         }|                     ¦   «         }	|                     ¦   «         |k    r[|	dk    rU|‰
v s
|dk    rK|‰
v rG|                     ¦   «         dk    r/|| 	                    ¦   «         | 
                    ¦   «         z
  dz  z  }Œ²|dk    rt          dt          › d�¦  «        ‚|dz  |z  S )NrÙ   r   rO   ÚNonec                ó”   •— | j         t          j        k    rd S ‰                     | j        ¦  «         | j        D ]} ‰|¦  «         Œd S rš   )rÓ   re   ÚCPUÚaddr¨   Úcpu_children)rÙ   ÚchildÚbenchmark_event_idsÚcollect_cpu_event_idss     €€rZ   r  z;_get_do_bench_profile_result.<locals>.collect_cpu_event_idsY  s^   ø€ ØÔ¥
¤Ò.Ð.ØˆFà×Ò ¤Ñ)Ô)Ð)ØÔ'ð 	)ð 	)ˆEØ!Ð! %Ñ(Ô(Ð(Ð(ð	)ð 	)r\   c                ó\   — g | ])}|j         t          k    r|j        t          j        k    ¯'|‘Œ*S rS   )r×   Ú_DO_BENCH_PROFILE_EVENT_NAMErÓ   re   r  rØ   s     rZ   r[   z0_get_do_bench_profile_result.<locals>.<listcomp>a  sB   € ð ð ð àØŒ:Õ5Ò5Ð5ØÔ¥¤Ò/Ð/ð 	ð 0Ð/Ð/r\   z	Expected ú z profiling events. Found z events.ç        Úgpu_user_annotationr   zContext SyncrÝ   z$Failed to capture device events for r|   )rÙ   r   rO   r  )r!   r^   ÚRuntimeErrorr  Úlinked_correlation_idÚcorrelation_idÚactivity_typerÓ   r×   Úend_nsÚstart_ns)r  r
  rù   r  Úbenchmark_eventsrÙ   Údevice_time_usr  r  r  r  r  s             @@rZ   Ú_get_do_bench_profile_resultr"  Q  sâ  øø€ õ ,6©<¬<Ðð)ð )ð )ð )ð )ð )ð )ðð à$ðñ ô Ðõ ÐÑÔ Ò(Ð(Ýð5˜ð 5ð 5Õ#?ð 5ð 5ÝÐ)Ñ*Ô*ð5ð 5ð 5ñ
ô 
ð 	
ð
 "ð %ð %ˆØÐ˜eÑ$Ô$Ð$Ð$à€NØð Kð KˆØ %× ;Ò ;Ñ =Ô =ÐØ×-Ò-Ñ/Ô/ˆØ×+Ò+Ñ-Ô-ˆà×ÒÑÔÐ#7Ò7Ð7ØÐ!6Ò6Ð6à%Ð)<Ð<Ð<à)¨QÒ.Ð.°>ÐEXÐ3XÐ3Xð —
’
‘” Ò.Ð.à˜uŸ|š|™~œ~°·²Ñ0@Ô0@Ñ@ÀFÑJÑJˆNøà˜ÒÐÝØRÕ3OÐRÐRÐRñ
ô 
ð 	
ð ˜FÑ" XÑ-Ð-r\   c           	     óL  — |sddl m}  |¦   «          t          ¦   «         }|                     ¦   «         }t	          |¦  «        } | ¦   «          |                     ¦   «          t          j        t          d¦  «        t          j        |¬¦  «        }| 	                    d¬¦  «        }	| 	                    d¬¦  «        }
|	 
                    ¦   «          t          d¦  «        D ] }|                     ¦   «           | ¦   «          Œ!|
 
                    ¦   «          |                     ¦   «          |	                     |
¦  «        dz  }t          dt          ||z  ¦  «        ¦  «        }t          dt          ||z  ¦  «        ¦  «        }t          |¦  «        D ]} | ¦   «          Œ|                     ¦   «          t          t          j        j        |¦  «        }t          j                             t          j        j        j        |g¬	¦  «        5 }t          |¦  «        D ]\}|                     ¦   «          t          j                             t*          ¦  «        5   | ¦   «          d
d
d
¦  «         n# 1 swxY w Y   Œ]|                     ¦   «          d
d
d
¦  «         n# 1 swxY w Y   t,                               d¦  «         t,                               t2          j        ¦  «        rAt,                               |                     ¦   «                              dd¬¦  «        ¦  «         t;          |j        j                             ¦   «         |                     ¦   «         |t          t@          |¦  «        ¦  «        }t,                               d¦  «         t,                               d|¦  «         |S )aB  
    Returns benchmark results by examining torch profiler events.
    This could be more accurate as it doesn't count CPU side overhead.
    The benchmarked function is wrapped in a profiler record_function so
    cache-clearing kernels can be excluded without relying on raw CUDA event
    grouping or kernel names.
    r   )Úmay_ban_benchmarkingr·   r¸   Tr»   r½   r9   rÅ   NrÌ   rÍ   rÎ   rÏ   zprofiling time breakdownrÞ   )!r  r$  rb   Úupperrc   rß   rU   rà   r„   rÁ   râ   rã   rä   rÉ   rå   rT   ræ   rè   rç   r  Úrecord_functionr  rî   rï   ÚisEnabledForÚloggingÚDEBUGrð   rñ   r"  Úkineto_resultsrò   re   )r±   r³   r´   r   r$  rÓ   Údevice_type_upperÚdevice_interfacerô   rõ   rö   rÃ   r÷   rø   rù   Úprofile_activityrú   Úresults                     rZ   r  r  Š  sÈ  € ð "ð ØMÐMÐMÐMÐMÐMàÐÑÔÐå‘.”.€KØ#×)Ò)Ñ+Ô+ÐÝ/°Ñ<Ô<ÐØ€B�D„D€DØ× Ò Ñ"Ô"Ð"ÝŒK�˜J™œ­u¬yÀÐMÑMÔM€Eð #×(Ò(°tÐ(Ñ<Ô<€KØ ×&Ò&°TÐ&Ñ:Ô:€IØ×ÒÑÔÐÝ�1‰XŒXð ð ˆØ�Š‰ŒˆØ
ˆ‰ŒˆˆØ×ÒÑÔÐØ× Ò Ñ"Ô"Ð"Ø×*Ò*¨9Ñ5Ô5¸Ñ9€Kõ �1•c˜& ;Ñ.Ñ/Ô/Ñ0Ô0€HÝ�1•c˜# Ñ+Ñ,Ô,Ñ-Ô-€Hõ �8‰_Œ_ð ð ˆØ
ˆ‰Œˆˆà× Ò Ñ"Ô"Ð"Ý�uœ~Ô>Ð@QÑRÔRÐÝ	Œ×	Ò	åŒNÔ+Ô/Øð
ð 
 ñ 
ô 
ð 'ð
 
å�x‘”ð 	ð 	ˆAà�KŠK‰MŒMˆMå”×/Ò/Õ0LÑMÔMð ð Ø�‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øð 	×$Ò$Ñ&Ô&Ð&ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'õ  ‡I‚IˆlÑÔÐÝ
×Ò�œÑ&Ô&ð 
Ý�	Š	Ø�NŠNÑÔ×"Ò"Ð+CÈrÐ"ÑRÔRñ	
ô 	
ð 	
õ *Ø	Œ
Ô!×(Ò(Ñ*Ô*Ø	�Š‰
Œ
ØÝ•
Ð-Ñ.Ô.ñ	ô €Fõ ‡I‚IÐ(Ñ)Ô)Ð)Ý‡I‚IÐ(¨&Ñ1Ô1Ð1Ø€Ms7   ÈA
JÉI&ÉJÉ&I*É*JÉ-I*É.JÊJÊJc                 ó  — 	 ddl m}  t          j                             dd¦  «         | d uo(t          t          t          j        dd ¦  «        d¦  «        S # t          $ r Y dS t          $ r}dt          |¦  «        v sJ ‚Y d }~dS d }~ww xY w)	Nr   )Ú	roi_alignztorchvision::nmsÚMetaÚtorchvisionr0  Fztorchvision::nms does not exist)Útorchvision.opsr0  rU   Ú_CÚ%_dispatch_has_kernel_for_dispatch_keyÚhasattrrT   ÚopsÚImportErrorr  rP   )r0  rË   s     rZ   Úhas_torchvision_roi_alignr9  Û  sÁ   € ðØ-Ð-Ð-Ð-Ð-Ð-åŒ×6Ò6Ð7IÈ6ÑRÔRÐRØ Ð$ð 
­Ý•E”I˜}¨dÑ3Ô3°[ñ*
ô *
ð 	
øõ ð ð ð ØˆuˆuÝð ð ð Ø0µC¸±F´FÐ:Ð:Ð:Ð:Øˆuˆuˆuˆuˆuøøøøðøøøs   ‚AA Á
B	Á"	B	Á+BÂB	rº   útorch.device | None | strútorch.devicec                ó:  — | €t          j        d¦  «        j        S t          | t          ¦  «        rt          j        | ¦  «        } | j        dvrM| j        €Ft          | j        ¦  «        }t          j        | j        |j         	                    ¦   «         ¬¦  «        S | S )Nr  )ÚcpuÚmeta)Úindex)
rU   rê   rº   rŒ   rP   Útyper?  rc   ÚWorkerÚcurrent_device©rº   r,  s     rZ   Údecode_devicerD  ë  s‹   € Ø€~ÝŒ|˜CÑ Ô Ô'Ð'Ý�&�#ÑÔð &Ý”˜fÑ%Ô%ˆØ„{˜/Ð)Ð)¨f¬lÐ.BÝ3°F´KÑ@Ô@ÐÝŒ|˜FœKÐ/?Ô/F×/UÒ/UÑ/WÔ/WÐXÑXÔXÐXØ€Mr\   ÚitúIterable[sympy.Expr]c                ó`   — t          j        t          j        | t          j        j        ¦  «        S rš   )Ú	functoolsÚreduceÚoperatorÚmulr�   ÚSÚOne©rE  s    rZ   Úsympy_productrO  ö  s   € ÝÔ�HœL¨"­e¬g¬kÑ:Ô:Ð:r\   Úseq1úSequence[sympy.Expr]Úseq2c           	     ó¸   — t          | ¦  «        t          |¦  «        k    sJ ‚t          j        t          d„ t	          | |¦  «        D ¦   «         ¦  «        ¦  «        S )Nc              3  ó&   K  — | ]\  }}||z  V — Œd S rš   rS   )rX   ÚaÚbs      rZ   rÜ   zsympy_dot.<locals>.<genexpr>ü  s*   è è € Ð>Ð>¡d a¨˜A ™EÐ>Ð>Ð>Ð>Ð>Ð>r\   )r^   r�   ÚexpandÚsumrë   )rP  rR  s     rZ   Ú	sympy_dotrY  ú  sN   € Ýˆt‰9Œ9�˜D™	œ	Ò!Ð!Ð!Ð!ÝŒ<�Ð>Ð>­c°$¸©o¬oÐ>Ñ>Ô>Ñ>Ô>Ñ?Ô?Ð?r\   ÚindicesÚsizesc                ó¨   — t          | ¦  «        t          |¦  «        k    sJ ‚t          j        j        }t	          | |¦  «        D ]\  }}||z  |z   }Œ|S )z7Row-major flatten: per-dimension indices -> flat index.)r^   r�   rL  ÚZerorë   )rZ  r[  Úflatr?  Úsizes        rZ   Úflatten_indexr`  ÿ  s\   € õ
 ˆw‰<Œ<�3˜u™:œ:Ò%Ð%Ð%Ð%ÝŒ7Œ<€DÝ˜7 EÑ*Ô*ð #ð #‰ˆˆtØ�d‰{˜UÑ"ˆˆØ€Kr\   r?  úlist[sympy.Expr]c                ó>   ‡ ‡— ˆ ˆfd„t          ‰¦  «        D ¦   «         S )z=Row-major decomposition: flat index -> per-dimension indices.c           
     óh   •— g | ].\  }}t          ‰t          ‰|d z   d…         ¦  «        |¦  «        ‘Œ/S ©r9   N)rn   rO  )rX   rû   r_  r?  r[  s      €€rZ   r[   z#decompose_index.<locals>.<listcomp>  sM   ø€ ð ð ð áˆAˆtõ 	˜�}¨U°1°q±5°7°7¬^Ñ<Ô<¸dÑCÔCðð ð r\   )Ú	enumerate)r?  r[  s   ``rZ   Údecompose_indexrf    s<   øø€ ð
ð ð ð ð å  Ñ'Ô'ðñ ô ð r\   úIterable[_T]úValuesView[_T]c                ó>   — d„ | D ¦   «                               ¦   «         S )Nc                ó.   — i | ]}t          |¦  «        |“ŒS rS   )r¨   rW   s     rZ   ú
<dictcomp>zunique.<locals>.<dictcomp>  s    € Ð!Ð!Ð!˜�Bˆq‰EŒE�1Ð!Ð!Ð!r\   )ÚvaluesrN  s    rZ   Úuniquerm    s"   € Ø!Ð!˜bÐ!Ñ!Ô!×(Ò(Ñ*Ô*Ð*r\   Únumberúint | sympy.ExprÚdenomc           
     ó¤  — t          | t          j        ¦  «        st          |t          j        ¦  «        r4t          t          j        | ¦  «        t          j        |¦  «        ¦  «        S t          | t
          ¦  «        rt          |t
          ¦  «        s/J | › dt          | ¦  «        › d|› dt          |¦  «        › �¦   «         ‚t          | |¦  «        S )Nz: ú, )rŒ   r�   ÚExprri   Úsympifyr„   r@  Úruntime_ceildiv)rn  rp  s     rZ   ru   ru     sÅ   € Ý�&�%œ*Ñ%Ô%ð D­°E½5¼:Ñ)FÔ)Fð DÝ•u”} VÑ,Ô,­e¬m¸EÑ.BÔ.BÑCÔCÐCõ �f�cÑ"Ô"ð ¥z°%½Ñ'=Ô'=ð ð ØÐ;Ð;•T˜&‘\”\Ð;Ð; UÐ;Ð;­d°5©k¬kÐ;Ð;ñô Ð=õ ˜6 5Ñ)Ô)Ð)r\   Úkeyútorch.dtype | Nonec                ó–  — | €dS t          | ¦  «                             d¦  «        d         }i dd“dd“dd	“d
d“dd“dd“dd	“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“d#d$dd%d&d'd(œ¥}|                     d)„ t          |                     ¦   «         ¦  «        D ¦   «         ¦  «         t          | t           ¦  «        r| n
d*||         › �S )+Nz*i8r|   rÎ   rŠ   Úi1Ú
float8e4nvÚfp8e4nvÚfloat8e5Úfp8e5Úfloat8e4b15Úfp8e4b15Úfloat8e4b15x4Ú
fp8e4b15x4Úfloat8_e4m3fnÚfloat8_e5m2Úfloat8_e4m3fnuzÚfp8e4b8Úfloat8_e5m2fnuzÚfp8e5b16Úfloat8_e8m0fnuÚu8Úfloat4_e2m1fn_x2rá   Úfp16Úbfloat16Úbf16Úfloat32Úfp32Úfloat64Úfp64Úint8Úi8Úint16Úi16Úi32Úi64Úu16Úu32Úu64)Úint32Úint64Úuint8Úuint16Úuint32Úuint64c                ó   — i | ]}||“ŒS rS   rS   )rX   rˆ   s     rZ   rk  z_type_of.<locals>.<dictcomp>J  s   € Ð1Ð1Ð1˜��1Ð1Ð1Ð1r\   Ú*)rP   ÚsplitÚupdateÚlistrl  rŒ   )rv  Ú	dtype_strÚtyss      rZ   Ú_type_ofr¨  &  su  € ð
 €{ØˆuÝ�C‘”—’˜sÑ#Ô# BÔ'€IðØ�ðà�iðð 	�Gðð 	�zð	ð
 	˜ðð 	˜ðð 	�wðð 	˜9ðð 	˜:ðð 	˜$ðð 	˜Dðð 	�6ðð 	�Fðð  	�6ð!ð" 	�6ð#ð$ 	�ð%ð& 	�ð'ð( ØØØØØð3ð ð €Cð8 ‡J‚JÐ1Ð1�d 3§:¢:¡<¤<Ñ0Ô0Ð1Ñ1Ô1Ñ2Ô2Ð2Ý˜S¥#Ñ&Ô&Ð@ˆ3ˆ3Ð,@°°I´Ð,@Ð,@Ð@r\   ÚlstúIterable[int | torch.SymInt]c                ó   — d„ | D ¦   «         S )z­
    Gets the shape and stride of a tensor. For non-symbolic tensors, this is
    trivial. But for symbolic tensors, we need to map from SymIntNode into
    sympy.Expr.
    c                ó6   — g | ]}t          j        |¦  «        ‘ŒS rS   )r�   rt  ©rX   rû   s     rZ   r[   z-convert_shape_to_inductor.<locals>.<listcomp>V  s"   € Ð*Ð*Ð* �EŒM˜!ÑÔÐ*Ð*Ð*r\   rS   ©r©  s    rZ   Úconvert_shape_to_inductorr¯  N  s   € ð +Ð* cÐ*Ñ*Ô*Ð*r\   Úvalúint | torch.SymIntc                óR   — t          | t          j        ¦  «        r| j        j        S | S )zÂ
    Convert SymInt to sympy.Expr, leave int as is.

    Unlike sympy.sympify() which converts int to sympy.Integer,
    this function preserves int as int and only converts SymInt to Expr.
    ©rŒ   rU   r4   ÚnodeÚexpr©r°  s    rZ   Úconvert_symint_to_exprr·  Y  s'   € õ �#•u”|Ñ$Ô$ð ØŒxŒ}ÐØ€Jr\   rû   c                óÚ   — ddl m} t          | t          ¦  «        r| nNt          | t          j        ¦  «        rt          | ¦  «        n%|j        j        j         	                    | d¬¦  «        S )zL
    Like convert_shape_to_symint, but operates on a single expression.
    r9   ©ÚVN)Úhint)
Úvirtualizedrº  rŒ   r„   r�   r›   ÚgraphÚsizevarsÚ	shape_envÚcreate_symintnode)rû   rº  s     rZ   Úconvert_to_symintrÁ  e  sr   € ð ÐÐÐÐÐõ �a�ÑÔð	
ˆˆõ ˜!�Uœ]Ñ+Ô+ðL�C�‰FŒFˆFà”Ô!Ô+×=Ò=¸aÀdÐ=ÑKÔKðr\   úIterable[int | sympy.Expr]úlist[int | torch.SymInt]c                ó   — d„ | D ¦   «         S )zz
    Takes a list of shapes from Inductor and converts them into symints (or just
    ints if all shapes are static).
    c                ó,   — g | ]}t          |¦  «        ‘ŒS rS   )rÁ  r­  s     rZ   r[   z+convert_shape_to_symint.<locals>.<listcomp>}  s!   € Ð.Ð.Ð. QÕ˜aÑ Ô Ð.Ð.Ð.r\   rS   r®  s    rZ   Úconvert_shape_to_symintrÆ  v  s   € ð /Ð.¨#Ð.Ñ.Ô.Ð.r\   Úopútorch._ops.OpOverloadc                óH   — t          d„ | j        j        D ¦   «         ¦  «        S )z-
    Does this op overload have aliasing
    c              3  ó(   K  — | ]}|j         d uV — Œd S rš   )Ú
alias_info©rX   rU  s     rZ   rÜ   zis_view.<locals>.<genexpr>„  s)   è è € ÐFÐF¨AˆqŒ| 4Ð'ÐFÐFÐFÐFÐFÐFr\   )ÚanyÚ_schemaÚ	arguments©rÇ  s    rZ   Úis_viewrÑ  €  s&   € õ ÐFÐF°´Ô1EÐFÑFÔFÑFÔFÐFr\   c                ó   — dS ©NFrS   )rÃ   s    rZ   ú<lambda>rÔ  ‰  s   € È€ r\   Úuser7   Úis_pointwise_fnú'Callable[[torch._ops.OpOverload], bool]c                ó˜  ‡— | j         dk    rdS t          | j        t          j        j        ¦  «        s| j        t          j        u sdS t          t          j        j        | j        ¦  «        }|t          j        u st          |¦  «        r t          ˆfd„| j        D ¦   «         ¦  «        S t          j        j        |j        v p
 ‰|¦  «        S )z™
    Do all uses of this op have torch.Tag.pointwise or return True for optional `is_pointwise_fn`

    Uses in views ops will follow the views uses
    Úcall_functionFc              3  ó8   •K  — | ]}t          |‰¦  «        V — Œd S rš   )Úis_pointwise_use)rX   ÚurÖ  s     €rZ   rÜ   z#is_pointwise_use.<locals>.<genexpr>š  s.   øè è € ÐKÐK¸AÕ# A Ñ7Ô7ÐKÐKÐKÐKÐKÐKr\   )rÇ  rŒ   ÚtargetrU   Ú_opsÚ
OpOverloadrJ  Úgetitemr   rÑ  r�   ÚusersÚTagÚ	pointwiseÚtags)rÕ  rÖ  rÝ  s    ` rZ   rÛ  rÛ  ‡  sº   ø€ ð „v�Ò Ð Øˆuå�3”:�uœzÔ4Ñ5Ô5ðØ9<¼ÅxÔGWÐ9WÐ9Wàˆuå•%”*Ô'¨¬Ñ4Ô4€FØ•Ô!Ð!Ð!¥W¨V¡_¤_Ð!ÝÐKÐKÐKÐKÀÄÐKÑKÔKÑKÔKÐKåŒ9Ô &¤+Ð-ÐH°°ÀÑ1HÔ1HÐHr\   rÝ  r   r’   ú	list[Any]Úkwargsúdict[str, Any]ú&tuple[GraphModule, list[torch.Tensor]]c           	     ó¨  ‡‡— t           j                             ¦   «         Šg Šd	ˆˆfd„} ‰j        | gt	          t           j        |||f¦  «        ¢R Ž }t          | j        j        ¦  «        dk    r+t          | j        j        d         j
        ¦  «        dk    r|f}‰                     |¦  «         t           j                             i ‰¦  «        }|‰fS )
NÚargútorch.TensorrO   r7   c                óx   •— ‰                      | ¦  «         ‰                     dt          ‰¦  «        › �¦  «        S )Nrê  )ÚappendÚplaceholderr^   )rê  ÚgÚ
graph_argss    €€rZ   Úadd_tensor_argz)gen_gm_and_inputs.<locals>.add_tensor_arg¥  s8   ø€ Ø×Ò˜#ÑÔÐØ�}Š}Ð4¥3 z¡?¤?Ð4Ð4Ñ5Ô5Ð5r\   r9   r   ÚTensor)rê  rë  rO   r7   )rU   ÚfxÚGraphrÙ  r#   rò  r^   rÎ  ÚreturnsrP   r@  Úoutputr6   )rÝ  r’   ræ  rñ  r´  Úgmrï  rð  s         @@rZ   Úgen_gm_and_inputsrø  Ÿ  sç   øø€ õ 	Œ�ŠÑÔ€AØ%'€Jð6ð 6ð 6ð 6ð 6ð 6ð 6ð ˆ1Œ?ØðÝ�uœ|¨^¸dÀF¸^ÑLÔLðð ð €Dõ 	ˆFŒNÔ"Ñ#Ô# qÒ(Ð(Ý�”Ô& qÔ)Ô.Ñ/Ô/°8Ò;Ð;àˆwˆØ‡H‚HˆT�N„N€Nå	Œ×	Ò	˜b !Ñ	$Ô	$€BØˆzˆ>Ðr\   rJ   r  c                óˆ   — | dk    rd S t          | ¦  «        }|                     ¦   «         r|                     ¦   «          d S d S ©Nr=  )rc   rV   rß   rC  s     rZ   rß   rß   ·  sT   € Ø�‚€ØˆÝ/°Ñ7Ô7ÐØ×$Ò$Ñ&Ô&ð 'Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&ð'ð 'r\   ÚmodelúCallable[..., Any]Úexample_inputsúSequence[Any]rü   c                óò   — t          |¦  «         t          j        d¦  «         t          j        ¦   «         }t          |¦  «        D ]} | |Ž }t          |¦  «         Œt          j        ¦   «         }|€J ‚||z
  S )Ni9  )rß   rU   Úmanual_seedÚtimeÚperf_counterrã   )rû  rý  rü   rº   Út0rÃ   r.  Út1s           rZ   Útimedr  ¿  s†   € õ �ÑÔÐÝ	Ô�dÑÔÐÝ	Ô	Ñ	Ô	€BÝ�5‰\Œ\ð ð ˆØ�˜Ð'ˆÝ�FÑÔÐÐÝ	Ô	Ñ	Ô	€BàÐÐÐØ�‰7€Nr\   rS   é
   ç      ð?ÚrepeatÚbaselinec                óè   ‡ ‡‡‡— t          j        ˆˆˆ ˆfd„t          |¦  «        D ¦   «         ¦  «        }t          j        |¦  «        ‰z  }t	          ||z  d›¦  «         |                     ¦   «         S )Nc                ó4   •— g | ]}t          ‰‰‰‰¦  «        ‘ŒS rS   )r  )rX   rÃ   rº   rý  rû  rü   s     €€€€rZ   r[   z%print_performance.<locals>.<listcomp>Ú  s'   ø€ ÐLÐLÐL¸�ˆu�n e¨VÑ	4Ô	4ÐLÐLÐLr\   z.6f)rU   rê   rã   ÚmedianÚprintrí   )rû  rý  rü   r  r	  rº   ÚtimingsÚtooks   ```  `  rZ   Úprint_performancer  Ñ  s{   øøøø€ õ ŒlØLÐLÐLÐLÐLÐLÐL½eÀF¹m¼mÐLÑLÔLñô €Gõ Œ<˜Ñ Ô  5Ñ(€DÝ	ˆT�H‰_Ð
"Ð
"Ñ#Ô#Ð#Ø�9Š9‰;Œ;Ðr\   ÚobjÚmethodc                ó`   ‡—  t          | |¦  «        ¦   «         Št          | |ˆfd„¦  «         dS )zKReplace obj.method() with a new method that returns a precomputed constant.c                 ó   •— ‰ S rš   rS   )r.  s   €rZ   rÔ  z#precompute_method.<locals>.<lambda>ä  s   ø€  € r\   N)rT   Úsetattr)r  r  r.  s     @rZ   Úprecompute_methodr  á  s8   ø€ à!�W�S˜&Ñ!Ô!Ñ#Ô#€FÝˆC�˜˜˜˜Ñ(Ô(Ð(Ð(Ð(r\   Úmethodsr«   c                ó0   — |D ]}t          | |¦  «         ŒdS )zFReplace methods with new methods that returns a precomputed constants.N)r  )r  r  r  s      rZ   Úprecompute_methodsr  ç  s.   € àð 'ð 'ˆÝ˜#˜vÑ&Ô&Ð&Ð&ð'ð 'r\   rU  rV  c                óP   — t          | |k    ¦  «        t          | |k     ¦  «        z
  S rš   )r„   ©rU  rV  s     rZ   Úcmpr  í  s!   € Ýˆq�1Šu‰:Œ:�˜A šE™
œ
Ñ"Ð"r\   rY   úint | Sequence[int]r_  úSequence[int]c                ó¦   — t          | t          ¦  «        r| g|z  S t          | ¦  «        dk    r" t          | ¦  «        | d         g¦  «        |z  S | S )Nr9   r   )rŒ   r„   r^   r@  )rY   r_  s     rZ   Úpad_listliker   ñ  sS   € Ý�!•SÑÔð Øˆs�T‰zÐÝ
ˆ1�v„v�‚{€{Ø�t�A‰wŒw˜˜!œ�v‰Œ Ñ%Ð%Ø€Hr\   útuple[_T, ...]úlist[_T]c                óV   — t          | ¦  «        dk    rg S dd„}t          | |¬¦  «        S )	Nr   Úelemrx   rO   rP   c                óˆ   — t          | t          ¦  «        r| S ddlm} t          | |¦  «        sJ ‚|                      ¦   «         S )Nr9   )rH   )rŒ   rP   Ú	schedulerrH   Úget_name)r$  rH   s     rZ   Ú	sort_funcztuple_sorted.<locals>.sort_funcþ  sP   € Ý�d�CÑ Ô ð 	ØˆKà0Ð0Ð0Ð0Ð0Ð0å˜$Ð 1Ñ2Ô2Ð2Ð2Ð2Ø�}Š}‰ŒÐr\   ©rv  )r$  rx   rO   rP   )r^   Úsorted)rY   r(  s     rZ   Útuple_sortedr+  ú  s?   € Ý
ˆ1�v„v�‚{€{Øˆ	ðð ð ð õ �!˜Ð#Ñ#Ô#Ð#r\   ÚPÚRV)Ú	covariantc                  ó.   — e Zd Zedd„¦   «         Zdd„ZdS )ÚCachedMethodrô   r   rO   r  c                ó   — d S rš   rS   )rô   s    rZ   Úclear_cachezCachedMethod.clear_cache  s   € Ø),¨r\   r’   úP.argsræ  úP.kwargsr-  c                ó   — d S rš   rS   ©Úselfr’   ræ  s      rZ   Ú__call__zCachedMethod.__call__  ó   € € € r\   N)rô   r   rO   r  )r’   r3  ræ  r4  rO   r-  )rž   rŸ   r    Ústaticmethodr2  r8  rS   r\   rZ   r0  r0    s2   € € € € € ØØ,Ð,Ð,ñ „\Ø,àDÐDÐDÐDÐDÐDr\   r0  ú!Callable[Concatenate[Any, P], RV]úCachedMethod[P, RV]c           	     óè   ‡— | j         }d|› d�Šd| i}t          d|› d‰› d‰› d�                     ¦   «         |¦  «          t          j        | ¦  «        ||› d�         ¦  «        }dˆfd„}||_        |S )NÚ__Ú_cacher±   z        def zC_cache_on_self(self):
            try:
                return self.zy
            except AttributeError:
                pass
            rv = fn(self)
            object.__setattr__(self, "z%", rv)
            return rv
        Ú_cache_on_selfr7  r   rO   r  c                óL   •— t          | ‰¦  «        rt          | ‰¦  «         d S d S rš   ©r6  Údelattr©r7  rv  s    €rZ   r2  z"cache_on_self.<locals>.clear_cache,  s5   ø€ Ý�4˜ÑÔð 	Ý�D˜#ÑÔÐÐÐð	ð 	r\   ©r7  r   rO   r  ©rž   ÚexecÚlstriprH  Úwrapsr2  )r±   r×   ÚctxÚwrapperr2  rv  s        @rZ   Úcache_on_selfrL    sÐ   ø€ ØŒ;€DØ
ˆtÐ
Ð
Ð
€Cð �ˆ*€CÝð		Øð		ð 		ð !ð		ð 		ð (+ð		ð 		ð 		÷ ŠF‰HŒHØñô ð ð "�iŒo˜bÑ!Ô! #¨Ð&=Ð&=Ð&=Ô">Ñ?Ô?€Gðð ð ð ð ð ð &€GÔØ€Nr\   c                ó    — t          | ¦  «        S )z]
    Variant of cache_on_self for properties. The only difference is the type signature.
    )rL  )r±   s    rZ   Úcache_property_on_selfrN  4  s   € õ ˜ÑÔÐr\   Ú
class_nameú*Callable[[FN_TYPE[P, RV]], FN_TYPE[P, RV]]c                ó   ‡ — dˆ fd„}|S )Nr±   úFN_TYPE[P, RV]rO   c           	     óæ   •‡— d‰› d| j         › d�Šd| i}t          d‰› d‰› d‰› d�                     ¦   «         |¦  «          t          j        | ¦  «        |d	         ¦  «        }dˆfd„}||_        |S )Nr>  rÃ   r?  r±   z¶            def inner(self: Any, *args: P.args, **kwargs: P.kwargs) -> RV:
                args_kwargs = (args, tuple(sorted(kwargs.items())))

                if not hasattr(self, "z2"):
                    object.__setattr__(self, "z%", {})

                cache = self.zþ

                try:
                    return cache[args_kwargs]
                except KeyError:
                    pass

                rv = fn(self, *args, **kwargs)

                cache[args_kwargs] = rv
                return rv
            Úinnerr7  r   rO   r  c                óL   •— t          | ‰¦  «        rt          | ‰¦  «         d S d S rš   rB  rD  s    €rZ   r2  z<cache_on_self_and_args.<locals>.wrapper.<locals>.clear_cacheb  s5   ø€ Ý�t˜SÑ!Ô!ð #Ý˜˜cÑ"Ô"Ð"Ð"Ð"ð#ð #r\   rE  rF  )r±   rJ  rT  r2  rv  rO  s       @€rZ   rK  z'cache_on_self_and_args.<locals>.wrapperC  sÎ   øø€ ð 4�:Ð3Ð3 ¤Ð3Ð3Ð3ˆð �RˆjˆÝðð (+ð	ð ð
 03ðð ð "ðð ð ÷$ ’‘”Øñ)	
ô 	
ð 	
ð, $•	” Ñ#Ô# C¨¤LÑ1Ô1ˆð	#ð 	#ð 	#ð 	#ð 	#ð 	#ð (ˆÔØˆr\   )r±   rR  rO   rR  rS   )rO  rK  s   ` rZ   Úcache_on_self_and_argsrV  >  s)   ø€ ð
$ð $ð $ð $ð $ð $ðL €Nr\   Únode_scheduleú*Sequence[BaseSchedulerNode] | ExternKernelúOrderedSet[Node]c                óø   — ddl m} t          | t          ¦  «        r6t	          j        t          j        d„ | D ¦   «         t          ¦   «         ¦  «        S t          | |j	        ¦  «        r| j
        S t          ¦   «         S )Nr9   ©Úirc                óT   — g | ]%}t          |d ¦  «        ¯|j        ¯|j        j        ‘Œ&S )r´  )r6  r´  Úorigins©rX   r´  s     rZ   r[   z%aggregate_origins.<locals>.<listcomp>t  sK   € ð ð ð ð Ý˜4 Ñ(Ô(ð	ð .2¬Yð	à”	Ô!ðð ð r\   )Ú r\  rŒ   r¥  rH  rI  rJ  Úor_r!   rA   r^  )rW  r\  s     rZ   Úaggregate_originsrb  l  s’   € ð ÐÐÐÐÐå�-¥Ñ&Ô&ð ÝÔÝŒLðð ð *ðñ ô õ ‰LŒLñ	
ô 	
ð 		
õ 
�M 2¤?Ñ	3Ô	3ð ØÔ$Ð$å‰|Œ|Ðr\   úSequence[BaseSchedulerNode]Údescriptive_namesú8Literal[True, 'torch', 'original_aten', 'inductor_node']c                ó˜  ‡— t          | ¦  «        }|dk    r.d„ Šˆfd„|D ¦   «         }t          t          |¦  «        ¦  «        }nî|dk    rÎg }|D ]¬}|j        dk    rŸd }d}d|j        v r|j        d         d         }nd	|j        v r|j        d	         d         }d
}|sŒOt          |d         t          ¦  «        r|                     |d         |z   ¦  «         Œ‰|                     |d         j        |z   ¦  «         Œ­t          t          |¦  «        ¦  «        }n|dk    rd„ |D ¦   «         }nt          ‚d 
                    dg|z   ¦  «        S )NÚoriginal_atenc                óü   — | j         d         }d}t          |t          j        j        ¦  «        r|j        j        }n@t          |t          j        j        ¦  «        r!t          | 	                    ¦   «         ¦  «        }|S )Nrg  r`  )
r>  rŒ   rU   rÞ  rß  Ú_overloadpacketrž   ÚHigherOrderOperatorrP   r×   )Úoriginrg  rv  s      rZ   Úget_origin_meta_strz2get_fused_kernel_name.<locals>.get_origin_meta_str‰  sl   € Ø"œK¨Ô8ˆMØˆCÝ˜-­¬Ô)>Ñ?Ô?ð 0Ø#Ô3Ô<��Ý˜M­5¬:Ô+IÑJÔJð 0Ý˜-×,Ò,Ñ.Ô.Ñ/Ô/�ØˆJr\   c                óh   •— g | ].}|j         d k    r!d|j        v r|j        d         ®# ‰|¦  «        ‘Œ/S )rÙ  rg  )rÇ  r>  )rX   rk  rl  s     €rZ   r[   z)get_fused_kernel_name.<locals>.<listcomp>“  sW   ø€ ð 
ð 
ð 
àØŒy˜OÒ+Ð+Ø 6¤;Ð.Ð.Ø”˜OÔ,Ð8ð	  Ð Ñ'Ô'ð 9Ð8Ð8r\   rU   rÙ  r`  Úsource_fn_stackrÎ   Úfwd_source_fn_stackÚbackwardr9   Úinductor_nodec                ó2   — g | ]}|j         d k    ¯|j        ‘ŒS ©rÙ  )rÇ  r×   ©rX   rk  s     rZ   r[   z)get_fused_kernel_name.<locals>.<listcomp>±  s-   € ð 
ð 
ð 
Ø"°V´YÀ/Ò5QÐ5QˆFŒKÐ5QÐ5QÐ5Qr\   rÃ   Úfused)rb  r*  r!   rÇ  r>  rŒ   rP   rí  rž   ÚNotImplementedErrorÚjoin)rW  rd  Úall_originsÚsourcesrk  Ú	source_fnÚsuffixrl  s          @rZ   Úget_fused_kernel_namer|  ‚  s¬  ø€ õ $ MÑ2Ô2€KØ˜OÒ+Ð+ð	ð 	ð 	ð
ð 
ð 
ð 
à%ð
ñ 
ô 
ˆõ � GÑ,Ô,Ñ-Ô-ˆˆØ	˜gÒ	%Ð	%àˆØ!ð 	Cð 	CˆFØŒy˜OÒ+Ð+Ø �	Ø�Ø$¨¬Ð3Ð3Ø &¤Ð,=Ô >¸rÔ B�I�IØ*¨f¬kÐ9Ð9à &¤Ð,AÔ BÀ2Ô F�IØ'�FØ ð ØÝ˜i¨œl­CÑ0Ô0ð CØ—N’N 9¨Q¤<°&Ñ#8Ñ9Ô9Ð9Ð9à—N’N 9¨Q¤<Ô#8¸6Ñ#AÑBÔBÐBøå� GÑ,Ô,Ñ-Ô-ˆˆØ	˜oÒ	-Ð	-ð
ð 
Ø&1ð
ñ 
ô 
ˆˆõ "Ð!Ø�8Š8�W�I Ñ'Ñ(Ô(Ð(r\   rK  r<   útuple[str, str]c                óü
  ‡‡‡‡ — t          | ¦  «        }d„ |D ¦   «         }t          j        t          ¦  «        }t          j        t          ¦  «        }dŠ|r‡t	          d„ |D ¦   «         ¦  «        }t          |¦  «        dk    r[|d         j        Št          ‰d¦  «        s%d„ t          ‰j	        ¦  «        D ¦   «         }|‰_
        |                     ˆfd„¬	¦  «         |D �]D}d
|j        v r²|j        d
         �¥|j        d
         }	d}
t          |	t          j        j        ¦  «        rt#          |	j        ¦  «        }
n@t          |	t          j        j        ¦  «        r!t#          |	                     ¦   «         ¦  «        }
|
r ||
                              |j        ¦  «         d|j        v r:|j        d         d         j        }
||
                              |j        ¦  «         �Œ|j                             d¦  «        dk    r%||j                                      |j        ¦  «         �ŒF‰�dnd}‰j        › d|› dd                     |                     ¦   «         ¦  «        › dd                     |                     ¦   «         ¦  «        › d�}‰j        › d�g}t5          |                     ¦   «         ¦  «        D ]G\  }}|                     ‰j        › d|› dd                     t5          |¦  «        ¦  «        › �¦  «         ŒH‰��hddlmŠ |                     ‰j        › d�¦  «         t	          ¦   «         }g }t          | ‰j        ¦  «        �slddlm } d5ˆfd!„}d6d$„Š d7ˆ fd'„}| D �]R}t          |d(¦  «        r|j!        €Œt          |j!        d)¦  «        r¤|j!        j"        �˜|j!        j"        D ]‹}|j        |v rŒ| #                    |j        ¦  «         |j         $                    |j        ¦  «        }|€ŒH |||j        ¦  «        \  }}|                     ‰j        › d*|› d+ ||¦  «        › d,|› d�¦  «         ŒŒt          |j!        d-¦  «        ri|j!        j%        �]|j!        j%        D ]P}|j         $                    |j        ¦  «        }|€Œ$ |||j        ¦  «        \  }}|                     d.|z   ¦  «         ŒQ�ŒT|D ]~}| &                    d/¬0¦  «        }|�Et          j'        j(        r4| )                    ˆfd1„| *                    ¦   «         D ¦   «         ¦  «         Œ_|                     ‰j        › d|› �¦  «         Œ|                     ‰j        › d2d3                     |¦  «        › �¦  «         |d4                     |¦  «        fS )8aH  
    Retrieves metadata information for a kernel.
    Args:
        node_schedule (Union[Sequence[BaseSchedulerNode], ExternKernel]):
            Either a sequence of BaseSchedulerNode objects or an ExternKernel instance.
        wrapper (PythonWrapperCodegen):
            An instance of PythonWrapperCodegen, used to define the code comment format.
    Returns:
        tuple[str, str]:
            A tuple containing two strings:
                - The first string represents the kernel's metadata.
                - The second string represent the kernel's detailed metadata.
    c                ó(   — g | ]}|j         d k    ¯|‘ŒS rs  rÐ  rt  s     rZ   r[   z'get_kernel_metadata.<locals>.<listcomp>Ì  s$   € ÐWÐWÐW ¸&¼)ÀÒ:VÐ:V�fÐ:VÐ:VÐ:Vr\   Nc              3  ó$   K  — | ]}|j         V — Œd S rš   )r½  )rX   Úns     rZ   rÜ   z&get_kernel_metadata.<locals>.<genexpr>Ö  s$   è è € Ð"CÐ"C¨q 1¤7Ð"CÐ"CÐ"CÐ"CÐ"CÐ"Cr\   r9   r   Ú)_inductor_kernel_metadata_node_to_idx_mapc                ó   — i | ]\  }}||“Œ	S rS   rS   )rX   Úidxr�  s      rZ   rk  z'get_kernel_metadata.<locals>.<dictcomp>Û  s   € Ð"VÐ"VÐ"V©f¨c°1 1 cÐ"VÐ"VÐ"Vr\   c                ó   •— ‰j         |          S rš   )r‚  )r�  Úsingle_graphs    €rZ   rÔ  z%get_kernel_metadata.<locals>.<lambda>Þ  s   ø€ ˜lÔTÐUVÔW€ r\   r)  rg  Ú	from_nodeÚpartitioner_tagÚis_backwardzTopologically SortedÚUnsortedr  z Source Nodes: [rr  z], Original ATen: [ú]z" Source node to ATen node mapping:ú   z => r[  z Graph fragment:r¹  Úbufferú-ir.TensorBox | ir.Buffer | ir.TorchBindObjectÚrw_namerP   rO   útuple[str, ir.Layout | None]c                ó  •— t          | ‰j        ¦  «        r,t          | j        ‰j        ¦  «        r| j        j        j        }n| j        }|€|}n|j        }	 |                      ¦   «         }n# t          $ r d }Y nw xY w||fS rš   )rŒ   Ú	TensorBoxÚdataÚ
StorageBoxÚorigin_noder×   Ú
get_layoutrv  )r�  r�  r•  r×   Úlayoutr\  s        €rZ   Úget_buffer_infoz,get_kernel_metadata.<locals>.get_buffer_info  s§   ø€ õ ˜f b¤lÑ3Ô3ð 5½
Ø”K ¤ñ9ô 9ð 5ð #)¤+Ô"2Ô">�K�Kà"(Ô"4�KØÐ&à"�D�Dà&Ô+�Dð"Ø#×.Ò.Ñ0Ô0�F�FøÝ*ð "ð "ð "Ø!�F�F�Fð"øøøà˜V�|Ð#s   ÁA, Á,A;Á:A;ÚshapeúIterable[int]c                óH   — dd                      d„ | D ¦   «         ¦  «        › d�S )Nú[rr  c                ó,   — g | ]}t          |¦  «        ‘ŒS rS   )rP   rW   s     rZ   r[   z@get_kernel_metadata.<locals>.stringify_shape.<locals>.<listcomp>  s   € Ð%<Ð%<Ð%<°¥c¨!¡f¤fÐ%<Ð%<Ð%<r\   r‹  )rw  )r™  s    rZ   Ústringify_shapez,get_kernel_metadata.<locals>.stringify_shape  s.   € Ø@˜4Ÿ9š9Ð%<Ð%<°eÐ%<Ñ%<Ô%<Ñ=Ô=Ð@Ð@Ð@Ð@r\   r—  úir.Layout | Nonec                ó˜   •— | €dS  ‰| j         ¦  «        › } ‰| j        ¦  «        › }| j        › }dt          | j                 › |› |› |› d�S )Nr`  ú")r_  Ústriderº   r    r¹   )r—  Úshape_annotationÚstride_annotationÚdevice_annotationrž  s       €rZ   Ústringfy_layoutz,get_kernel_metadata.<locals>.stringfy_layout  s|   ø€ Ø�>Ø˜2Ø&5 o°f´kÑ&BÔ&BÐ#DÐ Ø'6 °v´}Ñ'EÔ'EÐ$GÐ!Ø'-¤}Ð$6Ð!ð?� F¤LÔ1ð ?Ð3Cð ?Ø(ð?Ø*;ð?ð ?ð ?ðr\   Úread_writesÚreadsz   %z
 : Tensor z = PlaceHolder[target=Úwritesú%T)Úinclude_tensor_metadatac              3  ó0   •K  — | ]}‰j         › d |› �V — ŒdS )rŒ  N)Úcomment)rX   ÚlinerK  s     €rZ   rÜ   z&get_kernel_metadata.<locals>.<genexpr>O  sG   øè è € ð )ð )àð ”Ð1Ð1¨4Ð1Ð1ð)ð )ð )ð )ð )ð )r\   z
   return ú,ú
)r�  rŽ  r�  rP   rO   r�  )r™  rš  rO   rP   )r—  rŸ  rO   rP   )+rb  ÚcollectionsÚdefaultdictr¥  r!   r^   r½  r6  re  Únodesr‚  Úsortr>  rŒ   rU   rÞ  rß  rP   ri  rj  r×   rí  Úgetr­  rw  Úkeysr*  Úitemsr`  r\  rA   r¼  rº  r§  r¨  r  Útry_get_bufferr©  Úformat_nodeÚversionr}   ÚextendÚ
splitlines)!rW  rK  rx  Úinductor_nodesÚfrom_node_dictÚoriginal_aten_dictÚunique_graphsÚnode_to_idx_mapr´  rg  rv  Úsort_strÚmetadataÚdetailed_metadataÚoriginal_noder³  Ú	all_readsÚ
all_writesrº  r˜  r¦  r�  Úrr�  Ú
input_namer—  ÚwÚoutput_namerÃ   Úformatted_noder\  r†  rž  s!    `                            @@@rZ   Úget_kernel_metadatarÍ  ¹  sœ  øøøø€ õ$ $ MÑ2Ô2€KØWÐW¨;ÐWÑWÔW€Nå Ô,­TÑ2Ô2€NÝ$Ô0µÑ6Ô6Ðð
 €LØð 
Ý"Ð"CÐ"C°NÐ"CÑ"CÔ"CÑCÔCˆÝˆ}ÑÔ Ò"Ð"Ø)¨!Ô,Ô2ˆLå˜<Ð)TÑUÔUð YØ"VÐ"V½	À,ÔBTÑ8UÔ8UÐ"VÑ"VÔ"V�ØIX�ÔFØ×ÒØWÐWÐWÐWð  ñ ô ð ð ð 8ñ 8ˆØ˜dœiÐ'Ð'¨D¬I°oÔ,FÐ,RØ œI oÔ6ˆMØˆCÝ˜-­¬Ô)>Ñ?Ô?ð 0Ý˜-Ô7Ñ8Ô8��Ý˜M­5¬:Ô+IÑJÔJð 0Ý˜-×,Ò,Ñ.Ô.Ñ/Ô/�Øð :Ø" 3Ô'×.Ò.¨t¬yÑ9Ô9Ð9Ø˜$œ)Ð#Ð#Ø”)˜KÔ(¨Ô+Ô0ˆCØ˜3Ô×&Ò& t¤yÑ1Ô1Ð1Ñ1ØŒY�]Š]Ð,Ñ-Ô-°Ò>Ð>à˜4œ9Ô%×,Ò,¨T¬YÑ7Ô7Ð7ùØ)5Ð)AÐ%Ð%Àz€HàŒ?ð 	Cð 	C˜Xð 	Cð 	C°t·y²yÀ×ATÒATÑAVÔAVÑ7WÔ7Wð 	Cð 	CØŸ9š9Ð%7×%<Ò%<Ñ%>Ô%>Ñ?Ô?ð	Cð 	Cð 	Cð ð $œOÐOÐOÐOÐPÐÝ & ~×';Ò';Ñ'=Ô'=Ñ >Ô >ð 
ð 
Ñˆ�uØ× Ò ØŒÐPÐP =ÐPÐP°d·i²iÅÀuÁÄÑ6NÔ6NÐPÐPñ	
ô 	
ð 	
ð 	
ð
 ÑØÐÐÐÐÐà× Ò  G¤OÐ!EÐ!EÐ!EÑFÔFÐFÝ%/¡\¤\ˆ	Ø "ˆ
Ý˜-¨¬Ñ9Ô9ñ B	=Ø&Ð&Ð&Ð&Ð&Ð&ð$ð $ð $ð $ð $ð $ð(Að Að Að Að
ð 
ð 
ð 
ð 
ð 
ð #ð =ñ =�Ý˜q -Ñ0Ô0ð °A´MÐ4IØÝ˜1œ=¨'Ñ2Ô2ð °q´}Ô7JÐ7VØœ]Ô0ð ð ˜àœ6 YÐ.Ð.Ø$Ø!Ÿš a¤fÑ-Ô-Ð-Ø!"¤×!7Ò!7¸¼Ñ!?Ô!?˜Ø!˜>Ø$Ø-<¨_¸VÀQÄVÑ-LÔ-LÑ*˜
 FØ)×0Ò0Ø&œð \ð \°Jð \ð \Ø.˜¨vÑ6Ô6ð\ð \ØNXð\ð \ð \ñô ð ð õ ˜AœM¨8Ñ4Ô4ð
=àœÔ,Ð8àœ]Ô1ð =ð =˜Ø!"¤×!7Ò!7¸¼Ñ!?Ô!?˜Ø!˜>Ø$Ø)8¨¸ÀÄÑ)HÔ)H™˜ Qà"×)Ò)¨#°Ñ*;Ñ<Ô<Ð<Ð<ùà"ð 	Rð 	RˆDØ!×-Ò-ÀdÐ-ÑKÔKˆNØÐ)­e¬mÔ.?Ð)ð "×(Ò(ð )ð )ð )ð )à .× 9Ò 9Ñ ;Ô ;ð)ñ )ô )ñ ô ð ð ð
 "×(Ò(¨G¬OÐ)PÐ)PÀÐ)PÐ)PÑQÔQÐQÐQà× Ò  G¤OÐ!UÐ!U¸s¿xºxÈ
Ñ?SÔ?SÐ!UÐ!UÑVÔVÐVà�T—Y’YÐ0Ñ1Ô1Ð1Ð1r\   Úinitial_queueúIterable[torch.fx.Node]Úskip_filterúCallable[[Any], bool] | NoneúOrderedSet[torch.fx.Node]c                óþ   — t          | ¦  «        } t          | ¦  «        }| r\|                      ¦   «         }|j        D ]>}|r ||¦  «        rŒ||vr*|                     |¦  «         |                      |¦  «         Œ?| °\|S )zJReturns the set of nodes whose values depend on those within initial_queue)r¥  r!   r_   rá  r  rí  )rÎ  rÐ  Údominated_setr´  Úusers        rZ   Údominated_nodesrÖ  [  sª   € õ
 ˜Ñ'Ô'€MÝ˜}Ñ-Ô-€Mà
ð +Ø× Ò Ñ"Ô"ˆØ”Jð 	+ð 	+ˆDØð ˜{˜{¨4Ñ0Ô0ð ØØ˜=Ð(Ð(Ø×!Ò! $Ñ'Ô'Ð'Ø×$Ò$ TÑ*Ô*Ð*øð ð +ð Ðr\   úSequence[IRNode]údict[str, IRNode]c                óà   ‡‡— ddl mŠ d
ˆˆfd„Št          |¦  «        \  }}ˆfd„|D ¦   «         }t          | ¦  «        \  }}ˆfd	„|D ¦   «         }t          t	          j        g |¢|¢R Ž ¦  «        S )Nr9   r[  r�  rB   rO   rŠ   c                ó  •— t          | ‰j        ¦  «        r ‰| j        ¦  «        S t          | ‰j        ¦  «        r ‰| j        ¦  «        S t          | ‰j        ¦  «        o(t          | ‰j        ‰j        ‰j        ‰j        f¦  «         S rš   )	rŒ   r’  r“  r”  rB   ÚComputedBufferÚInputsKernelÚInputBufferÚTemplateBuffer)r�  r\  Úis_unrealized_nodes    €€rZ   rß  z*gather_origins.<locals>.is_unrealized_nodet  s™   ø€ Ý�a˜œÑ&Ô&ð 	.Ø%Ð% a¤fÑ-Ô-Ð-Ý�a˜œÑ'Ô'ð 	.Ø%Ð% a¤fÑ-Ô-Ð-Ý˜!˜RœYÑ'Ô'ð 
µ
ØàÔ!Ø”Ø”ØÔ!ð	ñ1
ô 1
ð -
ð 	
r\   c                ó4   •— g | ]} ‰|¦  «        ¯|j         ‘ŒS rS   ©r^  ©rX   r°  rß  s     €rZ   r[   z"gather_origins.<locals>.<listcomp>†  s-   ø€ ÐWÐWÐW cÐ?QÐ?QÐRUÑ?VÔ?VÐW�c”kÐWÐWÐWr\   c                ó4   •— g | ]} ‰|¦  «        ¯|j         ‘ŒS rS   rá  râ  s     €rZ   r[   z"gather_origins.<locals>.<listcomp>ˆ  s,   ø€ ÐSÐSÐS CÐ;MÐ;MÈcÑ;RÔ;RÐS�C”KÐSÐSÐSr\   )r�  rB   rO   rŠ   )r`  r\  r"   r!   Ú	itertoolsÚchain)	r’   ræ  Úkwargs_flattenrÃ   Úkwargs_originsÚargs_flattenÚargs_originsr\  rß  s	          @@rZ   Úgather_originsrê  o  sµ   øø€ ð ÐÐÐÐÐð
ð 
ð 
ð 
ð 
ð 
ð 
õ" % VÑ,Ô,Ñ€N�AØWÐWÐWÐW¨^ÐWÑWÔW€NÝ" 4Ñ(Ô(�O€L�!ØSÐSÐSÐS¨<ÐSÑSÔS€LÝ•i”oÐE |ÐE°nÐEÐEÐEÑFÔFÐFr\   rµ  c                óP   ‡‡‡‡— d
d„Šdˆˆfd„Šdˆˆfd„Šdˆfd	„Š ‰| ¦  «        S )zµ
    Normal sympy str is very slow, this is a lot faster.  The result are
    somewhat worse, as it doesn't do as much simplification.  So don't
    use this for final codegen.
    rµ  r‰   rO   rŠ   c                óˆ   — t          | t          j        ¦  «        o(t          | j        ¦  «        dk    o| j        d         dk    S )Né   r   rÎ   )rŒ   r�   ÚMulr^   r’   )rµ  s    rZ   Úis_neg_leadzsympy_str.<locals>.is_neg_lead“  s9   € å�t�UœYÑ'Ô'ÐV­C°´	©N¬N¸aÒ,?ÐVÀDÄIÈaÄLÐTVÒDVð	
r\   rP   c                ón  •— t          | t          j        ¦  «        r�t          | j        ¦  «        dk    rP ‰| j        d         ¦  «        r: ‰| j        d         ¦  «        › d ‰| j        d         j        d         ¦  «        › �S d                     t          ‰| j        ¦  «        ¦  «        S  ‰| ¦  «        S )Nrí  r9   r   z - z + )rŒ   r�   rŽ   r^   r’   rw  r�   )rµ  rï  Úsympy_str_muls    €€rZ   Úsympy_str_addz sympy_str.<locals>.sympy_str_add˜  s­   ø€ Ý�d�EœIÑ&Ô&ð 	'õ �4”9‰~Œ~ Ò"Ð" { {°4´9¸Q´<Ñ'@Ô'@Ð"Ø'˜-¨¬	°!¬Ñ5Ô5Ð_Ð_¸-¸-ÈÌ	ÐRSÌÔHYÐZ[ÔH\Ñ:]Ô:]Ð_Ð_Ð_à—z’z¥# m°T´YÑ"?Ô"?Ñ@Ô@Ð@à �= Ñ&Ô&Ð&r\   c                óæ   •— t          | t          j        ¦  «        rL ‰| ¦  «        rd ‰| j        d         ¦  «        › �S d                     t          ‰| j        ¦  «        ¦  «        S  ‰| ¦  «        S )Nú-r9   z * )rŒ   r�   rî  r’   rw  r�   )rµ  rï  Úsympy_str_atoms    €€rZ   rñ  z sympy_str.<locals>.sympy_str_mul£  sx   ø€ Ý�d�EœIÑ&Ô&ð 	(Øˆ{˜4Ñ Ô ð Bð :˜>˜>¨$¬)°A¬,Ñ7Ô7Ð9Ð9Ð9à—z’z¥# n°d´iÑ"@Ô"@ÑAÔAÐAà!�> $Ñ'Ô'Ð'r\   c                ó˜  •— t          | t          j        ¦  «        r| j        S t          | t          j        t          j        f¦  «        rd ‰| ¦  «        › d�S t          | t          t          t          t          f¦  «        r=| j
        j        › dd                     t          t          | j        ¦  «        ¦  «        › d�S t!          | ¦  «        S )Nú(ú)rr  )rŒ   r�   ÚSymbolr×   rŽ   rî  rn   rj   rk   rl   Úfuncrž   rw  r�   Ú	sympy_strr’   rP   )rµ  rò  s    €rZ   rõ  z!sympy_str.<locals>.sympy_str_atom®  s°   ø€ Ý�d�EœLÑ)Ô)ð 	Ø”9ÐÝ˜�uœy­%¬)Ð4Ñ5Ô5ð 	Ø-�}�} TÑ*Ô*Ð-Ð-Ð-Ð-Ý˜�µ½(ÅHÐMÑNÔNð 	Ø”iÔ(ÐRÐR¨4¯9ª9µS½ÀDÄIÑ5NÔ5NÑ+OÔ+OÐRÐRÐRÐRå�t‘9”9Ðr\   )rµ  r‰   rO   rŠ   ©rµ  r‰   rO   rP   rS   )rµ  rï  rò  rõ  rñ  s    @@@@rZ   rû  rû  Œ  s�   øøøø€ ð
ð 
ð 
ð 
ð
	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ðð ð ð ð ð ð ˆ=˜ÑÔÐr\   úValueRanges[Any]c                ó°   — ddl m} t          j        r2t	          |j        dd ¦  «        x}r|j        dk    rt          | ¦  «        S t          j	        ¦   «         S )Nr9   r¹  Úcurrent_nodeÚ
index_expr)
r¼  rº  rt   Úcompute_all_boundsrT   ÚinterpreterrÝ  rq   rr   Úunknown)r?  rº  Úfx_nodes      rZ   Úget_bounds_index_exprr  »  sh   € ØÐÐÐÐÐõ 	Ô!ð%å ¤¨~¸tÑDÔDÐDˆWð%ð ŒN˜lÒ*Ð*å˜5Ñ!Ô!Ð!åÔ"Ñ$Ô$Ð$r\   Úprefixc                ó   — | d         dk    S )Nr   rÈ  rS   ©r  s    rZ   Úprefix_is_reductionr	  É  s   € Ø�!Œ9˜ÒÐr\   c                ó   — | d         dv S )Nr   )rY   ÚyÚzrS   r  s    rZ   Úprefix_is_pointwiser  Í  s   € Ø�!Œ9˜Ð'Ð'r\   rp   r„  úsympy.Symbolc                óL   — | t           j        k    sJ ‚t          | |dd¬¦  «        S )ú9
    Used to generate an integer-nonnegative symbol.
    T©ÚintegerÚnonnegative)rp   ÚSIZEro   )r  r„  s     rZ   Úsympy_index_symbol_with_prefixr  Ñ  s0   € ð •T”YÒÐÐÐõ �v˜s¨D¸dÐCÑCÔCÐCr\   Úcheckc                ó6   — | st           j        ot           j        S rš   )rt   Údebug_index_assertsÚassert_indirect_indexing)r  s    rZ   Úgenerate_assertr  Ý  s   € ØÐ/•VÔ/ÐTµVÔ5TÐTr\   r×   c                óL   — | d         dk    sJ ‚t          j        | dd¬¦  «        S )r  r   rÊ   Tr  )r�   rù  ©r×   s    rZ   Úsympy_index_symbolr  á  s.   € ð �Œ7�cŠ>ˆ>ˆ>ˆ>õ Œ<˜ d¸Ð=Ñ=Ô=Ð=r\   Úreplacementsúdict[sympy.Expr, Any]c                ó"   — t          | |¦  «        S )z²
    When the passed replacement symbol v is a string, it is converted to a symbol with name v that
    have the same replaced expression integer and nonnegative properties.
    r'   )rµ  r  s     rZ   Ú
sympy_subsr!  í  s   € õ
 �t˜\Ñ*Ô*Ð*r\   ú&TypeGuard[torch.SymInt | torch.Tensor]c                óx   — t          | t          j        ¦  «        p t          | t          j        ¦  «        o| j        S rš   )rŒ   rU   r4   rò  Ú_has_symbolic_sizes_strides)rU  s    rZ   Úis_symbolicr%  õ  s2   € Ý�a�œÑ&Ô&ð Ý�1•e”lÑ#Ô#ÐE¨Ô(Eðr\   c                 ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3  ó4   K  — | ]}t          |¦  «        V — Œd S rš   )r%  rÌ  s     rZ   rÜ   z"any_is_symbolic.<locals>.<genexpr>ü  s(   è è € Ð,Ð, !�{˜1‰~Œ~Ð,Ð,Ð,Ð,Ð,Ð,r\   ©rÍ  )r’   s    rZ   Úany_is_symbolicr)  û  s   € ÝÐ,Ð, tÐ,Ñ,Ô,Ñ,Ô,Ð,r\   )z,aten._fused_moving_avg_obs_fq_helper.defaultz7aten._fused_moving_avg_obs_fq_helper_functional.defaultzfbgemm.dense_to_jagged.defaultz%fbgemm.jagged_to_padded_dense.defaultÚrun_and_save_rng_stateÚrun_with_rng_statezaten._local_scalar_densezaten._assert_scalarzaten.topk.defaultr÷  útorch.fx.GraphModuleútorch.fx.Node | Nonec                ó¬   — ddl m} | j        j        D ]@}t	          |¦  «        r|c S |j                             d¦  «        x}� ||¦  «        r|c S ŒAd S )Nr   )r*   r°  )Ú%torch.fx.experimental.symbolic_shapesr*   r½  r³  Úis_cudagraph_unsafe_fx_noder>  rµ  )r÷  r*   r´  r°  s       rZ   Ú%get_first_incompatible_cudagraph_noder1    s|   € ð LÐKÐKÐKÐKÐKà””ð ð ˆÝ& tÑ,Ô,ð 	ØˆKˆKˆKà”9—=’= Ñ'Ô'Ð'ˆCÐ4Ð9NÐ9NÈsÑ9SÔ9SÐ4ØˆKˆKˆKøàˆ4r\   c                ó†   — t          t          t          | j        j        ¦  «        ¦  «        ¦  «        }|j        dk    sJ ‚|S )z$Get the output node from an FX graphrö  )ÚnextÚiterÚreversedr½  r³  rÇ  )r÷  Ú	last_nodes     rZ   Úoutput_noder7  +  s<   € å•T�( 2¤8¤>Ñ2Ô2Ñ3Ô3Ñ4Ô4€IØŒ<˜8Ò#Ð#Ð#Ð#ØÐr\   úOrderedSet[torch.device]c                ó  — | j                              d¬¦  «        }t          d„ |D ¦   «         ¦  «        }t          | ¦  «        j        d         }t          |t          ¦  «        r|n|f}t          d„ |D ¦   «         ¦  «        }||z  S )Nrî  rÐ  c              3  óž   K  — | ]H}t          |j                             d ¦  «        t          j        ¦  «        ¯4|j        d          j        V — ŒIdS ©r°  N)rŒ   r>  rµ  rU   rò  rº   r_  s     rZ   rÜ   z"get_all_devices.<locals>.<genexpr>4  s`   è è € ð 9ð 9àÝ�d”i—m’m EÑ*Ô*­E¬LÑ9Ô9ð9ØŒ	�%ÔÔð9ð 9ð 9ð 9ð 9ð 9r\   r   c              3  óÜ   K  — | ]g}t          |t          j        j        ¦  «        ¯!t          |j                             d ¦  «        t          j        ¦  «        ¯S|j        d          j        V — ŒhdS r;  )rŒ   rU   ró  r7   r>  rµ  rò  rº   ©rX   rê  s     rZ   rÜ   z"get_all_devices.<locals>.<genexpr><  sw   è è € ð 7ð 7àÝ�c�5œ8œ=Ñ)Ô)ð7õ �s”x—|’| EÑ*Ô*­E¬LÑ9Ô9ð	7ØŒ�ŒÔð7ð 7ð 7ð 7ð 7ð 7r\   )r½  Ú
find_nodesr!   r7  r’   rŒ   Útuple)r÷  Úplaceholder_nodesÚinput_devicesÚout_argÚout_argsÚout_devicess         rZ   Úget_all_devicesrE  2  s­   € Øœ×+Ò+¨}Ð+Ñ=Ô=ÐÝ.8ð 9ð 9à%ð9ñ 9ô 9ñ /ô /€Mõ ˜"‰oŒoÔ" 1Ô%€GÝ$ W­eÑ4Ô4ÐDˆwˆw¸7¸*€HÝ,6ð 7ð 7àð7ñ 7ô 7ñ -ô -€Kð ˜;Ñ&Ð&r\   c                 óâ  — t          t          j                             ¦   «         ¦  «        D ]å} |                      d¦  «        sŒt          j        |          }|j        D ]¦}|                     d¦  «        r�t          ||¦  «        }t          |t          j	        j
        j        j        ¦  «        rV|j        D ]N}t          |t          j	        j
        j        j        ¦  «        r#|j        j        j                             ¦   «          ŒOŒ§t          j        | = Œædt          j        v r<t          j        d         }t'          |j        j        j        ¦  «        `|j        j        `t1          j        ¦   «          d S )Nz&torch._inductor.runtime.compile_tasks.Útriton_ztriton.runtime.driver)r¥  ÚsysÚmodulesr¶  Ú
startswithÚ__dict__rT   rŒ   rU   Ú	_inductorÚruntimeÚtriton_heuristicsÚCachingAutotunerÚcompile_resultsÚTritonCompileResultÚkernelÚrunÚmodÚ__del__r@  ÚdriverÚactiveÚutilsÚinstanceÚgcÚcollect)Úmodule_nameÚmÚ	attr_namerR  r.  rT  s         rZ   Úunload_xpu_triton_pydsr_  H  sS  € å�CœK×,Ò,Ñ.Ô.Ñ/Ô/ð %ð %ˆØ×%Ò%Ð&NÑOÔOð 	ØÝŒK˜Ô$ˆØœð 	<ð 	<ˆIØ×#Ò# IÑ.Ô.ð <Ý   IÑ.Ô.�ÝØ�EœOÔ3ÔEÔVñô ð 	<ð #)Ô"8ð <ð <˜Ý%Ø"Ý!œOÔ3ÔEÔYñô ð <ð
 #œMÔ-Ô1×9Ò9Ñ;Ô;Ð;øøÝŒK˜Ð$Ð$ð ¥#¤+Ð-Ð-ÝŒkÐ1Ô2ˆÝ�”Ô"Ô(Ñ)Ô)Ð2ØŒJÔÐ#å„J�L„L€L€L€Lr\   Ú_registered_cachesc                ó¦   — t          | d¦  «        rt          | j        ¦  «        st          | › d�¦  «        ‚t                               | ¦  «         | S )zh
    Use this decorator to register any caches that should be cache_clear'd
    with fresh_cache().
    Úcache_clearz# does not have a cache_clear method)r6  Úcallablerb  ÚAttributeErrorr`  rí  ©r  s    rZ   Úclear_on_fresh_cacherf  i  sY   € õ
 �3˜Ñ&Ô&ð J­h°s´Ñ.GÔ.Gð JÝ ÐHÐHÐHÑIÔIÐIå×Ò˜cÑ"Ô"Ð"Ø€Jr\   c                 óB   — t           D ]} |                      ¦   «          ŒdS )z&
    Clear all registered caches.
    N)r`  rb  re  s    rZ   Úclear_cachesrh  u  s0   € õ "ð ð ˆØ�ŠÑÔÐÐðð r\   r—   úIterator[None]c              #  óD  K  — t           j                             | ¦  «        }	 |t           j        | <   dV — |€"t           j                             | d¦  «         dS |t           j        | <   dS # |€!t           j                             | d¦  «         n|t           j        | <   w xY w)a×  Thread-safe env var set/restore using atomic C-level lookups.

    We avoid mock.patch.dict(os.environ, ...) because it internally calls
    os.environ.copy(), which iterates all env var keys then fetches values in
    separate steps. That approach is not atomic and can race with background threads
    (e.g. Triton async compilation) modifying the environment, causing KeyError,
    so we use os.environ.get() for individual keys which is an atomic C-level lookup.
    N)ÚosÚenvironrµ  r_   )rv  r—   Úolds      rZ   Ú_set_envrn  }  sœ   è è € õ Œ*�.Š.˜Ñ
Ô
€Cð"Ø�Œ
�3‰Øˆˆˆàˆ;ÝŒJ�NŠN˜3 Ñ%Ô%Ð%Ð%Ð%à!�BŒJ�s‰OˆOˆOøð ˆ;ÝŒJ�NŠN˜3 Ñ%Ô%Ð%Ð%à!�BŒJ�s‰OÐ!Ð!Ð!Ð!s   £A+ Á+4BÚcache_entriesúdict[str, Any] | NoneÚdirú
str | NoneÚdeletec              #  ó  ‡‡K  — t          ¦   «          ddlm}  |t          j        |¬¦  «        ¦  «        Š	 t          d‰¦  «        5  t                               d‰¦  «          |t          j	         
                    ‰d¦  «        ¦  «        Št          d‰¦  «        5  dV — t          | t          ¦  «        rqt          | ¦  «        dk    s
J d	¦   «         ‚t          j	                             ‰¦  «        r5t          j        ‰¦  «        }|                      ˆfd
„|D ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |r`t#          ¦   «         r,t$          j                             ¦   «         rt+          ¦   «          t-          j        ‰t#          ¦   «         ˆfd„¬¦  «         n*# t0          $ r t                               d‰¦  «         ‚ w xY wt          ¦   «          dS # t          ¦   «          w xY w)zÈ
    Contextmanager that provides a clean tmp cachedir for pt2 caches.

    Optionally, pass a dict as 'cache_entries' to get a list of filenames and sizes
    generated with this cache instance.
    r   )Únormalize_path_separator)rq  ÚTORCHINDUCTOR_CACHE_DIRzUsing inductor cache dir %sÚtritonÚTRITON_CACHE_DIRNz!expected empty cache_entries dictc           	     ó”   •— i | ]D}d |v¯|t           j                             t           j                             ‰|¦  «        ¦  «        “ŒES )z.lock)rk  ÚpathÚgetsizerw  )rX   ÚfÚtriton_cache_dirs     €rZ   rk  zfresh_cache.<locals>.<dictcomp>°  sP   ø€ ð ð ð à$%Ø#*°!Ð#3Ð#3ð !"¥2¤7§?¢?µ2´7·<²<Ð@PÐRSÑ3TÔ3TÑ#UÔ#Uà#3Ð#3Ð#3r\   c                ó>   •— t                                d‰|¬¦  «        S )Nz*Failed to remove temporary cache dir at %s)Úexc_info)rî   Úwarning)rú  rz  r  Úinductor_cache_dirs      €rZ   rÔ  zfresh_cache.<locals>.<lambda>À  s$   ø€ µS·[²[Ø@Ø&Ø%ð 6Añ 6ô 6€ r\   )Úignore_errorsÚonerrorz(on error, temporary cache dir kept at %s)rh  Útorch._inductor.cpp_builderru  ÚtempfileÚmkdtemprn  rî   rï   rk  rz  rw  rŒ   Údictr^   ÚexistsÚlistdirr¤  Ú
is_windowsrU   rL   rV   r_  ÚshutilÚrmtreeÚ	Exceptionr€  )ro  rq  rs  ru  Úfilesr�  r}  s        @@rZ   Úfresh_cacher�  ’  s¼  øøè è € õ �N„N€NàDÐDÐDÐDÐDÐDà1Ð1µ(Ô2BÀsÐ2KÑ2KÔ2KÑLÔLÐð'ÝÐ/Ð1CÑDÔDð 	ð 	Ý�IŠIÐ3Ð5GÑHÔHÐHØ7Ð7Ý”—’Ð/°Ñ:Ô:ñ ô  Ðõ Ð,Ð.>Ñ?Ô?ð ð Ø���Ý˜m­TÑ2Ô2ð 
Ý˜}Ñ-Ô-°Ò2Ð2Ð2Ð4WÑ2Ô2Ð2Ý”w—~’~Ð&6Ñ7Ô7ð Ý "¤
Ð+;Ñ <Ô <˜Ø%×,Ò,ðð ð ð à).ðñ ô ñô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð$ ð 	Ý‰|Œ|ð )¥¤	× 6Ò 6Ñ 8Ô 8ð )Ý&Ñ(Ô(Ð(åŒMØ"õ )™lœlðð ð ð ðñ ô ð øøõ ð ð ð Ý�ŠÐ>Ð@RÑSÔSÐSØðøøøõ 	‰Œˆˆˆø�‰Œˆˆøøøsh   ¸F9 ÁAEÂBD4Ä(EÄ4D8	Ä8EÄ;D8	Ä<EÄ?F9 ÅEÅF9 ÅEÅA%F9 Æ8G3 Æ9'G Ç G3 Ç3H)ÚreverseÚseqr�  ú	list[int]c               óÆ   — | j         }t          t          | ¦  «        ¦  «        }t          t	          ||d¬¦  «        ¦  «        }|st          t          |¦  «        ¦  «        S |S )NT©rv  r�  )Ú__getitem__rã   r^   r¥  r*  r5  )r‘  r�  ÚgetterÚa_rÚsort_idxs        rZ   Úargsortr™  Ó  s[   € ØŒ_€FÝ
•�C‘”‰/Œ/€Cõ •F˜3 F°DÐ9Ñ9Ô9Ñ:Ô:€HØð (Ý•H˜XÑ&Ô&Ñ'Ô'Ð'Ø€Or\   r¿  r-   ú)Sequence[int | torch.SymInt | sympy.Expr]c               ó¦   ‡ — d
ˆ fd„}d„ t          |¦  «        D ¦   «         }t          |t          j        |¦  «        |¬¦  «        }d	„ |D ¦   «         }|S )zç
    Return a symbolic sort order for optimization-only layout heuristics.

    Data-dependent comparisons can fall back to non-guarding optimization hints,
    so callers must not use this order to make correctness decisions.
    rU  útuple[int, sympy.Expr]rV  rO   r„   c                ó¶   •‡‡‡— | \  }Š|\  }Šdˆfd„}dˆfd„Š |‰‰k     ˆˆˆfd„¦  «        rdS  |‰‰k    ˆˆˆfd„¦  «        rdS ||k     rdS ||k    rdS dS )Nrµ  ú bool | torch.SymInt | sympy.ExprÚfallbackúCallable[[], bool]rO   rŠ   c                ó’   •— t          | t          ¦  «        r| S 	 ‰                     | ¦  «        S # t          $ r  |¦   «         cY S w xY wrš   )rŒ   rŠ   Úevaluate_exprr+   )rµ  rŸ  r¿  s     €rZ   Úevaluatez*argsort_sym.<locals>.cmp.<locals>.evaluateô  sb   ø€ õ ˜$¥Ñ%Ô%ð Ø�ð"Ø ×.Ò.¨tÑ4Ô4Ð4øÝ.ð "ð "ð "Ø�x‘z”zÐ!Ð!Ð!ð"øøøs   š/ ¯AÁAÚlhsr‰   Úrhsc                ó\   •— ‰                      | ¦  «        ‰                      |¦  «        k     S rš   )Úoptimization_hint)r¤  r¥  r¿  s     €rZ   Úhint_ltz)argsort_sym.<locals>.cmp.<locals>.hint_ltÿ  s-   ø€ ð ×.Ò.¨sÑ3Ô3°i×6QÒ6QÐRUÑ6VÔ6VÒVÐVr\   c                 ó   •—  ‰‰ ‰¦  «        S rš   rS   ©Úa_valÚb_valr¨  s   €€€rZ   rÔ  z*argsort_sym.<locals>.cmp.<locals>.<lambda>  ó   ø€ ¨7¨7°5¸%Ñ+@Ô+@€ r\   rÎ   c                 ó   •—  ‰‰‰ ¦  «        S rš   rS   rª  s   €€€rZ   rÔ  z*argsort_sym.<locals>.cmp.<locals>.<lambda>  r­  r\   r9   r   )rµ  rž  rŸ  r   rO   rŠ   )r¤  r‰   r¥  r‰   rO   rŠ   rS   )	rU  rV  Úa_idxÚb_idxr£  r«  r¬  r¨  r¿  s	        @@@€rZ   r  zargsort_sym.<locals>.cmpð  sÙ   øøøø€ Ø‰ˆˆuØ‰ˆˆuð		"ð 		"ð 		"ð 		"ð 		"ð 		"ð	Wð 	Wð 	Wð 	Wð 	Wð 	Wð ˆ8�E˜E’MÐ#@Ð#@Ð#@Ð#@Ð#@Ð#@ÑAÔAð 	Ø�2Øˆ8�E˜E’MÐ#@Ð#@Ð#@Ð#@Ð#@Ð#@ÑAÔAð 	Ø�1ð
 �5Š=ˆ=Ø�1Ø�5Š=ˆ=Ø�2Øˆqr\   c                óh   — g | ]/\  }}|t          |t          j        ¦  «        r|j        j        n|f‘Œ0S rS   r³  )rX   r„  rÊ   s      rZ   r[   zargsort_sym.<locals>.<listcomp>  sJ   € ð ð ð áˆC�ð 
�Z¨­5¬<Ñ8Ô8Ð?ˆaŒfŒkˆk¸aÐ@ðð ð r\   r”  c                ó   — g | ]\  }}|‘ŒS rS   rS   )rX   r„  rÃ   s      rZ   r[   zargsort_sym.<locals>.<listcomp>  s   € Ð&Ð&Ð&‘f�c˜1ˆcÐ&Ð&Ð&r\   )rU  rœ  rV  rœ  rO   r„   )re  r*  rH  Ú
cmp_to_key)r¿  r‘  r�  r  Úexprsr.  s   `     rZ   Úargsort_symrµ  ã  s   ø€ ð!ð !ð !ð !ð !ð !ðHð å ‘n”nðñ ô €Eõ �5�iÔ2°3Ñ7Ô7ÀÐIÑIÔI€EØ&Ð& Ð&Ñ&Ô&€FØ€Mr\   r¹   útorch.dtypec                óv   — | t           j        k    rdS t          j        d| ¬¦  «                             ¦   «         S )Nr‚   rS   ©r¹   )rU   r   rà   Úelement_sizer¸  s    rZ   Úget_dtype_sizerº    s7   € ð •”ÒÐØˆqÝŒ;�r Ð'Ñ'Ô'×4Ò4Ñ6Ô6Ð6r\   c                  ó   — e Zd ZU ded<   dS )ÚLineContextr   ÚcontextN©rž   rŸ   r    r®   rS   r\   rZ   r¼  r¼  &  s   € € € € € € Ø€L€L�L€L€Lr\   r¼  c                  ó$   — e Zd ZU ded<   ded<   dS )ÚValueWithLineMaprP   r—   zlist[tuple[int, LineContext]]Úline_mapNr¾  rS   r\   rZ   rÀ  rÀ  *  s'   € € € € € € à€J€J�JØ+Ð+Ð+Ñ+Ð+Ð+r\   rÀ  c                  óø   — e Zd ZdZd6d7d„Zej        d8d
„¦   «         Zd9d„Zd:d„Z	d: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?d„Zd>d?d „Zd@d#„ZdAdBd'„ZdAdCd(„ZdAdCd)„Zd>d?d*„ZdDd-„Zd:d.„ZdEd1„ZdFd4„Zd5S )GÚIndentedBufferé   r   Úinitial_indentr„   rO   r  c                ó"   — g | _         || _        d S rš   )Ú_linesÚ_indent)r7  rÅ  s     rZ   Ú__init__zIndentedBuffer.__init__3  s   € ØBDˆŒØ%ˆŒˆˆr\   Útabwidthri  c              #  óV   K  — | j         }	 || _         d V — || _         d S # || _         w xY wrš   )rÊ  )r7  rÊ  Úprevs      rZ   Úset_tabwidthzIndentedBuffer.set_tabwidth7  s@   è è € àŒ}ˆð	!Ø$ˆDŒMØˆEˆEˆEà ˆDŒMˆMˆMø˜DˆDŒMÐ Ð Ð Ð s   ‹ Ÿ	(rÀ  c                óä  — t          ¦   «         }d}g }| j        D ]µ}t          |t          ¦  «        r |¦   «         }|€Œ$n4t          |t          ¦  «        r|                     ||j        f¦  «         ŒW|}t          |t          ¦  «        sJ ‚|                     |¦  «         |                     d¦  «         |d| 	                    d¦  «        z   z  }Œ¶t          |                     ¦   «         |¦  «        S )Nr9   r°  )r   rÇ  rŒ   ÚDeferredLineBaser¼  rí  r½  rP   ÚwriteÚcountrÀ  Úgetvalue)r7  Úbufrú   ÚlinemapÚlir®  s         rZ   Úgetvaluewithlinemapz"IndentedBuffer.getvaluewithlinemap@  sì   € Ý‰jŒjˆØˆØ13ˆØ”+ð 	&ð 	&ˆBÝ˜"Õ.Ñ/Ô/ð Ø�r‘t”t�Ø�<Øð  å˜B¥Ñ,Ô,ð Ø—’  2¤:˜Ñ/Ô/Ð/Øà�Ý˜d¥CÑ(Ô(Ð(Ð(Ð(Ø�IŠI�d‰OŒOˆOØ�IŠI�d‰OŒOˆOØ��T—Z’Z Ñ%Ô%Ñ%Ñ%ˆAˆAÝ §¢¡¤°Ñ8Ô8Ð8r\   rP   c                ó4   — |                       ¦   «         j        S rš   )rÖ  r—   ©r7  s    rZ   rÒ  zIndentedBuffer.getvalueT  s   € Ø×'Ò'Ñ)Ô)Ô/Ð/r\   c                ó¸  — t          ¦   «         }| j        D ]±}t          |t          ¦  «        r |¦   «         }|€Œ$nt          |t          ¦  «        rŒ;|}t          |t
          ¦  «        sJ ‚|                     d¦  «        r|                     |d d…         ¦  «         Œ‡|                     |¦  «         |                     d¦  «         Œ²|                     ¦   «         S )Nú\rÎ   r°  )	r   rÇ  rŒ   rÏ  r¼  rP   ÚendswithrÐ  rÒ  )r7  rÓ  rÕ  r®  s       rZ   ÚgetrawvaluezIndentedBuffer.getrawvalueW  sÖ   € Ý‰jŒjˆØ”+ð 	 ð 	 ˆBÝ˜"Õ.Ñ/Ô/ð Ø�r‘t”t�Ø�<Øð  å˜B¥Ñ,Ô,ð Øà�Ý˜d¥CÑ(Ô(Ð(Ð(Ð(à�}Š}˜TÑ"Ô"ð  Ø—	’	˜$˜s ˜sœ)Ñ$Ô$Ð$Ð$à—	’	˜$‘”�Ø—	’	˜$‘”��Ø�|Š|‰~Œ~Ðr\   c                ó   — | j         S rš   ©rÇ  rØ  s    rZ   Úget_lines_refzIndentedBuffer.get_lines_refk  s
   € ØŒ{Ðr\   c                ó8   — | j                              ¦   «          d S rš   )rÇ  ÚclearrØ  s    rZ   rá  zIndentedBuffer.clearn  s   € ØŒ×ÒÑÔÐÐÐr\   rŠ   c                ó*   — t          | j        ¦  «        S rš   )rŠ   rÇ  rØ  s    rZ   Ú__bool__zIndentedBuffer.__bool__q  s   € Ý�D”KÑ Ô Ð r\   c                ó&   — d| j         | j        z  z  S )Nr  )rÈ  rÊ  rØ  s    rZ   r  zIndentedBuffer.prefixt  s   € Ø�d”l T¤]Ñ2Ñ3Ð3r\   c                ó0   — |                       d¦  «         d S )Nr°  ©Ú	writelinerØ  s    rZ   ÚnewlinezIndentedBuffer.newlinew  ó   € Ø�Š�tÑÔÐÐÐr\   r®  ú$LineContext | DeferredLineBase | strc                óÔ  — t          |t          ¦  «        r| j                             |¦  «         d S t          |t          ¦  «        rA| j                             |                     |                      ¦   «         ¦  «        ¦  «         d S |                     ¦   «         r2| j                             |                      ¦   «         › |› �¦  «         d S | j                             d¦  «         d S ©Nr`  )rŒ   r¼  rÇ  rí  rÏ  Úwith_prefixr  Ústrip©r7  r®  s     rZ   rç  zIndentedBuffer.writelinez  sÐ   € Ý�d�KÑ(Ô(ð 	#ØŒK×Ò˜tÑ$Ô$Ð$Ð$Ð$Ý˜Õ.Ñ/Ô/ð 	#ØŒK×Ò˜t×/Ò/°·²±´Ñ>Ô>Ñ?Ô?Ð?Ð?Ð?Ø�ZŠZ‰\Œ\ð 	#ØŒK×Ò $§+¢+¡-¤-Ð7°Ð7Ð7Ñ8Ô8Ð8Ð8Ð8àŒK×Ò˜rÑ"Ô"Ð"Ð"Ð"r\   c                ó0   — |                       |¦  «         dS )zGWrite to JIT buffer only. On a plain IndentedBuffer, same as writeline.Nræ  rï  s     rZ   Úwriteline_jitzIndentedBuffer.writeline_jit„  s   € à�Š�tÑÔÐÐÐr\   c                ó   — dS )z;Write to AOTI buffer only. No-op on a plain IndentedBuffer.NrS   rï  s     rZ   Úwriteline_aotzIndentedBuffer.writeline_aotˆ  r9  r\   FÚ
other_codeúIndentedBuffer | strrî  c                ó4   — |                       ||¬¦  «         dS )zESplice to JIT buffer only. On a plain IndentedBuffer, same as splice.©rî  N©Úsplice©r7  rô  rî  s      rZ   Ú
splice_jitzIndentedBuffer.splice_jit‹  s   € à�Š�J eˆÑ,Ô,Ð,Ð,Ð,r\   c                ó   — dS )z<Splice to AOTI buffer only. No-op on a plain IndentedBuffer.NrS   rú  s      rZ   Ú
splice_aotzIndentedBuffer.splice_aot�  r9  r\   Úlinesú.Sequence[LineContext | DeferredLineBase | str]c                ó:   — |D ]}|                       |¦  «         Œd S rš   ræ  ©r7  rþ  r®  s      rZ   Ú
writelineszIndentedBuffer.writelines’  ó0   € Øð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð	!ð 	!r\   r9   Úoffsetú'contextlib.AbstractContextManager[None]c                óL   ‡ ‡— t           j        dˆˆ fd„¦   «         } |¦   «         S )NrO   ri  c               3  ó€   •K  — ‰xj         ‰ z  c_         	 d V — ‰xj         ‰ z  c_         d S # ‰xj         ‰ z  c_         w xY wrš   ©rÈ  ©r  r7  s   €€rZ   rJ  z"IndentedBuffer.indent.<locals>.ctx—  sQ   øè è € àˆLŒL˜FÑ"ˆLŒLð'Ø���à�” Ñ&�”��ø��” Ñ&�”����s   •+ «=©rO   ri  ©Ú
contextlibÚcontextmanager©r7  r  rJ  s   `` rZ   ÚindentzIndentedBuffer.indent–  sB   øø€ Ý	Ô	"ð	'ð 	'ð 	'ð 	'ð 	'ð 	'ñ 
#Ô	"ð	'ð ˆs‰uŒuˆr\   c                ó&   — | xj         |z  c_         d S rš   r  ©r7  r  s     rZ   Ú	do_indentzIndentedBuffer.do_indent¡  ó   € ØˆŒ˜ÑˆŒˆˆr\   c                ó&   — | xj         |z  c_         d S rš   r  r  s     rZ   Údo_unindentzIndentedBuffer.do_unindent¤  r  r\   c           	     óü  — t          |t          ¦  «        rñt          d¦  «        }|j        D ]X}t          |t          ¦  «        sA|r?t          |t          |¦  «        t          |                     ¦   «         ¦  «        z
  ¦  «        }ŒYt          j	        |¦  «        rd}|j        D ]b}t          |t          ¦  «        r| j         
                    |¦  «         Œ2t                               | |t          |¦  «        d …         ¦  «         Œcd S t          j        |¦  «        }|r|                     ¦   «         }|sd S |                     ¦   «         }|                     d¦  «        D ]}t                               | |¦  «         Œd S )NÚinfr   r°  )rŒ   rÃ  rµ   rÇ  r¼  Úminr^   rH  ÚmathÚisinfrí  rç  r„   ÚtextwrapÚdedentÚrstripr£  )r7  rô  rî  r  r®  rÊ   s         rZ   rù  zIndentedBuffer.splice§  sŒ  € Ý�j¥.Ñ1Ô1ð 	2Ý˜5‘\”\ˆFà"Ô)ð Ið I�Ý! $­Ñ4Ô4ð I¸ð IÝ  ­¨T©¬µS¸¿º¹¼Ñ5GÔ5GÑ)GÑHÔH�FøÝŒz˜&Ñ!Ô!ð Ø�Ø"Ô)ð Hð H�Ý˜d¥KÑ0Ô0ð HØ”K×&Ò& tÑ,Ô,Ð,Ð,å"×,Ò,¨T°4½¸F¹¼¸¸Ô3FÑGÔGÐGÐGð	Hð Hõ "œ¨Ñ4Ô4ˆJØð 1Ø'×.Ò.Ñ0Ô0�
Øð Ø�Ø#×*Ò*Ñ,Ô,ˆJØ×%Ò% dÑ+Ô+ð 2ð 2�Ý×(Ò(¨¨qÑ1Ô1Ð1Ð1ð2ð 2r\   rú  úCallable[[Any], Any]c                ób   ‡— t          | j        ¬¦  «        }ˆfd„| j        D ¦   «         |_        |S )N©rÅ  c                ó&   •— g | ]} ‰|¦  «        ‘ŒS rS   rS   )rX   r®  rú  s     €rZ   r[   z&IndentedBuffer.map.<locals>.<listcomp>Á  s!   ø€ Ð9Ð9Ð9 T�d�d˜4‘j”jÐ9Ð9Ð9r\   )rÃ  rÈ  rÇ  )r7  rú  rý   s    ` rZ   r�   zIndentedBuffer.map¿  s7   ø€ Ý¨D¬LÐ9Ñ9Ô9ˆØ9Ð9Ð9Ð9¨T¬[Ð9Ñ9Ô9ˆŒ
Øˆ
r\   c                óP   — t          | ¦  «        › d|                      ¦   «         › d�S )Nr÷  rø  )r@  rÒ  rØ  s    rZ   Ú__repr__zIndentedBuffer.__repr__Ä  s'   € Ý�t‘*”*Ð1Ð1˜tŸ}š}™œÐ1Ð1Ð1Ð1r\   Úotherr   c                ó¼   — | j         |j         k    sJ ‚t          | j         ¬¦  «        }|                     | j        ¦  «         |                     |j        ¦  «         |S )Nr   )rÈ  rÃ  r  rÇ  )r7  r$  rý   s      rZ   Ú__add__zIndentedBuffer.__add__Ç  sV   € ØŒ|˜uœ}Ò,Ð,Ð,Ð,Ý¨D¬LÐ9Ñ9Ô9ˆà�Š�t”{Ñ#Ô#Ð#Ø�Š�u”|Ñ$Ô$Ð$Øˆ
r\   Únew_lineú$DeferredLineBase | LineContext | strc                ó   — || j         v S rš   rÞ  )r7  r'  s     rZ   ÚcontainszIndentedBuffer.containsÏ  s   € Ø˜4œ;Ð&Ð&r\   N©r   ©rÅ  r„   rO   r  )rÊ  r„   rO   ri  )rO   rÀ  ©rO   rP   ©rO   r  ©rO   rŠ   )r®  rê  rO   r  ©F)rô  rõ  rî  rŠ   rO   r  )rþ  rÿ  rO   r  r–   )r  r„   rO   r  ©r  r„   rO   r  )rú  r  rO   rÃ  )r$  r   rO   rÃ  )r'  r(  rO   rŠ   )rž   rŸ   r    rÊ  rÉ  r  r  rÍ  rÖ  rÒ  rÜ  rß  rá  rã  r  rè  rç  rñ  ró  rû  rý  r  r  r  r  rù  r�   r#  r&  r*  rS   r\   rZ   rÃ  rÃ  0  s0  € € € € € Ø€Hð&ð &ð &ð &ð &ð Ôð!ð !ð !ñ Ôð!ð9ð 9ð 9ð 9ð(0ð 0ð 0ð 0ðð ð ð ð(ð ð ðð ð ð ð!ð !ð !ð !ð4ð 4ð 4ð 4ðð ð ð ð#ð #ð #ð #ðð ð ð ðJð Jð Jð Jð-ð -ð -ð -ð -ðKð Kð Kð Kð Kð!ð !ð !ð !ð	ð 	ð 	ð 	ð 	ðð ð ð ð ðð ð ð ð ð2ð 2ð 2ð 2ð 2ð0ð ð ð ð
2ð 2ð 2ð 2ðð ð ð ð'ð 'ð 'ð 'ð 'ð 'r\   rÃ  c                  ó¢   ‡ — e Zd ZdZddˆ fd„Zedd	„¦   «         Zd
„ Zdd„Zdd„Z	d„ Z
ddd„Zddd„Zddd„Zd d!d„Zd d"d„Zd d"d„Zdˆ fd„Zˆ xZS )#ÚDualIndentedBufferzÿIndentedBuffer that simultaneously accumulates JIT and AOTI output.

    The base class (self._lines) holds JIT content. self.aot holds AOTI content.
    By default, writeline/splice write to both. Use _jit/_aot variants for
    mode-specific writes.
    r   rÅ  r„   rO   r  c                ór   •— t          ¦   «                              |¦  «         t          |¦  «        | _        d S rš   )ÚsuperrÉ  rÃ  Úaot)r7  rÅ  Ú	__class__s     €rZ   rÉ  zDualIndentedBuffer.__init__Û  s.   ø€ Ý‰Œ×Ò˜Ñ(Ô(Ð(Ý! .Ñ1Ô1ˆŒˆˆr\   rÃ  c                ó   — | S )uë   Read-only accessor for JIT buffer (for splicing into result).

        WARNING: Do NOT use jit for writing â€” writes would go to both buffers
        because self.writeline is overridden. Use writeline_jit/splice_jit instead.
        rS   rØ  s    rZ   ÚjitzDualIndentedBuffer.jitß  s	   € ð ˆr\   c                óp   — t                                | |¦  «         | j                             |¦  «         d S rš   )rÃ  rç  r6  rï  s     rZ   rç  zDualIndentedBuffer.writelineè  s4   € Ý× Ò   tÑ,Ô,Ð,ØŒ×Ò˜4Ñ Ô Ð Ð Ð r\   c                ó<   — t                                | |¦  «         d S rš   )rÃ  rç  rï  s     rZ   rñ  z DualIndentedBuffer.writeline_jitì  s   € Ý× Ò   tÑ,Ô,Ð,Ð,Ð,r\   c                ó:   — | j                              |¦  «         d S rš   )r6  rç  rï  s     rZ   ró  z DualIndentedBuffer.writeline_aotï  s   € ØŒ×Ò˜4Ñ Ô Ð Ð Ð r\   c                ó:   — |D ]}|                       |¦  «         Œd S rš   ræ  r  s      rZ   r  zDualIndentedBuffer.writelinesò  r  r\   Frî  rŠ   c                ó´   — t                                | ||¬¦  «         t          |t          ¦  «        r|j        n|}| j                             ||¬¦  «         d S ©Nr÷  )rÃ  rù  rŒ   r3  r6  ©r7  rô  rî  Ú	aot_others       rZ   rù  zDualIndentedBuffer.spliceö  s]   € õ 	×Ò˜d J°eÐÑ<Ô<Ð<å(¨Õ5GÑHÔHÐXˆJŒNˆNÈjð 	ð 	Œ�Š˜	¨ˆÑ/Ô/Ð/Ð/Ð/r\   c                ó@   — t                                | ||¬¦  «         d S r?  )rÃ  rù  rú  s      rZ   rû  zDualIndentedBuffer.splice_jitÿ  s#   € Ý×Ò˜d J°eÐÑ<Ô<Ð<Ð<Ð<r\   c                óz   — t          |t          ¦  «        r|j        n|}| j                             ||¬¦  «         d S r?  )rŒ   r3  r6  rù  r@  s       rZ   rý  zDualIndentedBuffer.splice_aot  s@   € å(¨Õ5GÑHÔHÐXˆJŒNˆNÈjð 	ð 	Œ�Š˜	¨ˆÑ/Ô/Ð/Ð/Ð/r\   r9   r  c                óJ   ‡ ‡— t           j        ˆˆ fd„¦   «         } |¦   «         S )Nc               3  óþ   •K  — ‰xj         ‰ z  c_         ‰j        xj         ‰ z  c_         	 d V — ‰xj         ‰ z  c_         ‰j        xj         ‰ z  c_         d S # ‰xj         ‰ z  c_         ‰j        xj         ‰ z  c_         w xY wrš   ©rÈ  r6  r	  s   €€rZ   rJ  z&DualIndentedBuffer.indent.<locals>.ctx	  sœ   øè è € àˆLŒL˜FÑ"ˆLŒLØŒHÐÔ Ñ&ÐÔð+Ø���à�” Ñ&�”Ø”Ð Ô  FÑ*Ð Ô Ð Ð øð �” Ñ&�”Ø”Ð Ô  FÑ*Ð Ô Ð Ð Ð Ð s   ªA Á'A<r  r  s   `` rZ   r  zDualIndentedBuffer.indent  s=   øø€ Ý	Ô	"ð	+ð 	+ð 	+ð 	+ð 	+ñ 
#Ô	"ð	+ð ˆs‰uŒuˆr\   c                óP   — | xj         |z  c_         | j        xj         |z  c_         d S rš   rF  r  s     rZ   r  zDualIndentedBuffer.do_indent  ó.   € ØˆŒ˜ÑˆŒØŒÐÔ˜FÑ"ÐÔÐÐr\   c                óP   — | xj         |z  c_         | j        xj         |z  c_         d S rš   rF  r  s     rZ   r  zDualIndentedBuffer.do_unindent  rH  r\   c                óz   •— t          ¦   «                              ¦   «          | j                             ¦   «          d S rš   )r5  rá  r6  ©r7  r7  s    €rZ   rá  zDualIndentedBuffer.clear  s,   ø€ Ý‰Œ�Š‰ŒˆØŒ�ŠÑÔÐÐÐr\   r+  r,  ©rO   rÃ  r.  r0  ©rî  rŠ   rO   r  r–   )r  r„   r1  )rž   rŸ   r    r¡   rÉ  Úpropertyr9  rç  rñ  ró  r  rù  rû  rý  r  r  r  rá  Ú__classcell__©r7  s   @rZ   r3  r3  Ó  sf  ø€ € € € € ðð ð2ð 2ð 2ð 2ð 2ð 2ð 2ð ðð ð ñ „Xðð!ð !ð !ð-ð -ð -ð -ð!ð !ð !ð !ð!ð !ð !ð0ð 0ð 0ð 0ð 0ð=ð =ð =ð =ð =ð0ð 0ð 0ð 0ð 0ðð ð ð ð ð#ð #ð #ð #ð #ð#ð #ð #ð #ð #ðð ð ð ð ð ð ð ð ð r\   r3  c                  ó6   — e Zd ZdZdd„Zdd„Zddd	„Zddd
„ZdS )ÚAotOnlyBuffera*  IndentedBuffer for pure-AOTI codegen.

    Mirror of the base class's pure-JIT defaults: writeline_aot/splice_aot
    write to the buffer; writeline_jit/splice_jit are no-ops. Lets call
    sites use writeline_jit/writeline_aot uniformly across pure-JIT,
    pure-AOTI, and dual-wrapper modes.
    rO   r  c                ó   — d S rš   rS   rï  s     rZ   rñ  zAotOnlyBuffer.writeline_jit+  ó   € Øˆr\   c                ó0   — |                       |¦  «         d S rš   ræ  rï  s     rZ   ró  zAotOnlyBuffer.writeline_aot.  ré  r\   Frî  rŠ   c                ó   — d S rš   rS   rú  s      rZ   rû  zAotOnlyBuffer.splice_jit1  rT  r\   c                ó4   — |                       ||¬¦  «         d S r?  rø  rú  s      rZ   rý  zAotOnlyBuffer.splice_aot4  s   € Ø�Š�J eˆÑ,Ô,Ð,Ð,Ð,r\   Nr.  r0  rM  )rž   rŸ   r    r¡   rñ  ró  rû  rý  rS   r\   rZ   rR  rR  "  sx   € € € € € ðð ðð ð ð ðð ð ð ðð ð ð ð ð-ð -ð -ð -ð -ð -ð -r\   rR  c                 ó^   — ddl m}  | j        j        rt	          ¦   «         S t          ¦   «         S )zèConstruct the IndentedBuffer subclass matching the current codegen mode.

    Pure AOTI -> AotOnlyBuffer (writeline_aot writes; writeline_jit drops).
    Pure JIT  -> IndentedBuffer  (writeline_jit writes; writeline_aot drops).
    r9   r¹  )r¼  rº  r½  Úaot_moderR  rÃ  r¹  s    rZ   Úmake_codegen_bufferrZ  8  s9   € ð ÐÐÐÐÐà„wÔð Ý‰ŒÐÝÑÔÐr\   c                  ó(   ‡ — e Zd Zdˆ fd„Zd	d„Zˆ xZS )
ÚFakeIndentedBufferrO   r  c                óH   •— t          ¦   «                              ¦   «          d S rš   )r5  rÉ  rK  s    €rZ   rÉ  zFakeIndentedBuffer.__init__F  s   ø€ Ý‰Œ×ÒÑÔÐÐÐr\   r×   rP   r   c                ój   — |dk    rt                                | |¦  «        S t          d|› d�¦  «        ‚)Nr7  zTried to call self.zÊ on FakeIndentedBuffer. This bufferis currently used on TritonTemplateKernel to prevent actualwrites to the body without explicitly specifying the body with`TritonTemplateKernel.set_subgraph_body(name)`)ÚobjectÚ__getattribute__r  )r7  r×   s     rZ   r`  z#FakeIndentedBuffer.__getattribute__I  sK   € Ø�;ÒÐÝ×*Ò*¨4°Ñ6Ô6Ð6Ýð= $ð =ð =ð =ñ
ô 
ð 	
r\   r.  )r×   rP   rO   r   )rž   rŸ   r    rÉ  r`  rO  rP  s   @rZ   r\  r\  E  sQ   ø€ € € € € ðð ð ð ð ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r\   r\  c               #  ó²   K  — t           j        t           j        }} 	 d V — | |ct           _        t           _        d S # | |ct           _        t           _        w xY wrš   )rH  ÚstdoutÚstderr)Úinitial_stdoutÚinitial_stderrs     rZ   Úrestore_stdout_stderrrf  T  sR   è è € å%(¤Zµ´�N€Nð@Øˆˆˆà!/°Ð�Œ
•C”J�J�Jø °Ð�Œ
•C”JÐ?Ð?Ð?Ð?s	   œ; »Ac                  óR   — 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S )rÏ  z.A line that can be 'unwritten' at a later timer®  rP   c                ó@   — |                      ¦   «         sd}|| _        d S rì  )rî  r®  rï  s     rZ   rÉ  zDeferredLineBase.__init__`  s"   € Ø�zŠz‰|Œ|ð 	ØˆDØˆŒ	ˆ	ˆ	r\   rO   rr  c                ó   — t           ‚)zJReturns either self.line or None to indicate the line has been 'unwritten'©rv  rØ  s    rZ   r8  zDeferredLineBase.__call__e  ó   € å!Ð!r\   r   c                ó   — t           ‚)z3Returns a new deferred line with the same conditionrj  rï  s     rZ   Ú	_new_linezDeferredLineBase._new_linei  rk  r\   r  c                ó>   — |                       |› | j        › �¦  «        S rš   ©rm  r®  )r7  r  s     rZ   rí  zDeferredLineBase.with_prefixm  s!   € Ø�~Š~ Ð4¨¬Ð4Ð4Ñ5Ô5Ð5r\   c                óZ   — |                       | j                             ¦   «         ¦  «        S rš   )rm  r®  rH  rØ  s    rZ   rH  zDeferredLineBase.lstripp  s"   € Ø�~Š~˜dœi×.Ò.Ñ0Ô0Ñ1Ô1Ð1r\   r?  úint | slicec                óB   — |                       | j        |         ¦  «        S rš   ro  )r7  r?  s     rZ   r•  zDeferredLineBase.__getitem__s  s   € Ø�~Š~˜dœi¨Ô.Ñ/Ô/Ð/r\   rŠ   c                ó*   — t          | j        ¦  «        S rš   )rŠ   r®  rØ  s    rZ   rã  zDeferredLineBase.__bool__v  s   € Ý�D”I‰ŒÐr\   r„   c                ó*   — t          | j        ¦  «        S rš   )r^   r®  rØ  s    rZ   Ú__len__zDeferredLineBase.__len__y  s   € Ý�4”9‰~Œ~Ðr\   N)r®  rP   ©rO   rr  )r®  rP   rO   r   )r  rP   rO   r   )rO   r   )r?  rq  rO   r   r/  ©rO   r„   )rž   rŸ   r    r¡   rÉ  r8  rm  rí  rH  r•  rã  ru  rS   r\   rZ   rÏ  rÏ  ]  sº   € € € € € Ø8Ð8ðð ð ð ð
"ð "ð "ð "ð"ð "ð "ð "ð6ð 6ð 6ð 6ð2ð 2ð 2ð 2ð0ð 0ð 0ð 0ðð ð ð ðð ð ð ð ð r\   rÏ  c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd	„Zdd
„Zˆ xZS )ÚDelayReplaceLinez6At end of codegen call `line.replace(key, value_fn())`rv  rP   Úvalue_fnúCallable[[], str]r®  c                óf   •— t          ¦   «                              |¦  «         || _        || _        d S rš   )r5  rÉ  rv  rz  )r7  rv  rz  r®  r7  s       €rZ   rÉ  zDelayReplaceLine.__init__€  s-   ø€ Ý‰Œ×Ò˜ÑÔÐØˆŒØ ˆŒˆˆr\   rO   c                óf   — | j                              | j        |                      ¦   «         ¦  «        S rš   )r®  Úreplacerv  rz  rØ  s    rZ   r8  zDelayReplaceLine.__call__…  s$   € ØŒy× Ò  ¤¨4¯=ª=©?¬?Ñ;Ô;Ð;r\   c                ó8   — t          | j        | j        |¦  «        S rš   )ry  rv  rz  rï  s     rZ   rm  zDelayReplaceLine._new_lineˆ  s   € Ý ¤¨$¬-¸Ñ>Ô>Ð>r\   )rv  rP   rz  r{  r®  rP   r-  )r®  rP   rO   ry  )rž   rŸ   r    r¡   rÉ  r8  rm  rO  rP  s   @rZ   ry  ry  }  sk   ø€ € € € € Ø@Ð@ð!ð !ð !ð !ð !ð !ð
<ð <ð <ð <ð?ð ?ð ?ð ?ð ?ð ?ð ?ð ?r\   ry  Úindex_or_deviceúint | torch.devicec                óÀ  — t          | t          j        ¦  «        r| }n!t          j        t          ¦   «         | ¦  «        }t	          j        |¦  «        }t          j        j        r=|j        €J ‚|j        dk     s|j        dk    rt           
                    d¦  «         dS dS |j        dk    rdnd}|j        }||k     r!t           
                    d	||d
œ¬¦  «         dS dS )Né	   r  z6GPU arch does not support max_autotune_gemm mode usageFTrL   r~   éD   z,Not enough SMs to use max_autotune_gemm mode)Úmin_smsÚ	avail_sms)Úextra)rŒ   rU   rº   rb   r   Úcreaterº  r}   Úmajorrî   r€  r@  Úmulti_processor_count)r€  rº   Úpropr…  r†  s        rZ   Ú
is_big_gpurŒ  Œ  sð   € å�/¥5¤<Ñ0Ô0ð ?Ø ˆˆå”�l™nœn¨oÑ>Ô>ˆåÔ" 6Ñ*Ô*€Dõ „}Ôð ØŒzÐ%Ð%Ð%ØŒ:˜Š>ˆ>˜TœZ¨2Ò-Ð-Ý�KŠKÐPÑQÔQÐQØ�5Øˆtà”K 5Ò(Ð(ˆbˆb¨b€GØÔ*€IØ�7ÒÐÝ�ŠØ:Ø%°IÐ>Ð>ð 	ñ 	
ô 	
ð 	
ð ˆuØˆ4r\   c                 óÌ   — t           j                             ¦   «         r#t           j                             ¦   «         j        S t           j                             d¦  «        j        S )NrJ   )rU   rL   rV   Úget_device_propertiesÚgpu_subslice_countrJ   rŠ  rS   r\   rZ   Úget_max_num_smsr�  ©  sI   € å„y×ÒÑÔð DÝŒy×.Ò.Ñ0Ô0ÔCÐCÝŒ:×+Ò+¨FÑ3Ô3ÔIÐIr\   c                 óÎ   — t           j                             ¦   «         sdS t           j                             t           j                             ¦   «         ¦  «        } | j        dk    S )zEReturns true if the device is a NVIDIA B200, otherwise returns false.Fr  )rU   rJ   rV   rŽ  rB  r‰  )Údevice_propertiess    rZ   Ú
using_b200r“  °  sQ   € õ Œ:×"Ò"Ñ$Ô$ð Øˆuåœ
×8Ò8½¼×9RÒ9RÑ9TÔ9TÑUÔUÐØÔ" bÒ(Ð(r\   c                 ó¨   — t           j                             ¦   «         o4t           j        j        du o!t           j                             ¦   «         dk    S )zCReturn true for NVIDIA CUDA devices with compute capability SM100+.N)r  r   )rU   rJ   rV   rº  r}   Úget_device_capabilityrS   r\   rZ   Úis_nvidia_sm100_or_laterr–  º  sG   € õ 	Œ
×ÒÑ!Ô!ð 	:ÝŒMÔ Ð%ð	:åŒJ×,Ò,Ñ.Ô.°'Ò9ðr\   c                 óÀ   — t           j                             ¦   «         rt          ¦   «         S t           j                             ¦   «         } t          ¦   «         | �| ndz
  S )zFHandle experimental carveout if set otherwise return hardware SM countNr   )rU   rL   rV   r�  r4  Ú_get_sm_carveout_experimental)Úcarveouts    rZ   Úget_num_smsrš  Ã  sS   € õ „y×ÒÑÔð !ÝÑ Ô Ð ÝŒx×5Ò5Ñ7Ô7€HÝÑÔ¨HÐ,@  ÀaÑHÐHr\   Únum_tma_descriptorsÚnum_programsú
int | Noner:   c                ó®   — ddl m}m} |€t          ¦   «         }|                     d¦  «        }|| z  t
          z  } |||| |j        ¦   «         ¬¦  «        S )zKBuilds and returns a WorkspaceArg for the device side TMA workspace buffer.r9   )r:   ÚWorkspaceZeroModeNF)rÑ  Ú	zero_moderº   Ú
outer_name)Úcodegen.commonr:   rŸ  rš  Ú	from_boolÚTMA_DESCRIPTOR_SIZEÚunique_name)r›  rº   rœ  r:   rŸ  r   r_  s          rZ   Úget_tma_workspace_argr¦  Ì  s€   € ð @Ð?Ð?Ð?Ð?Ð?Ð?Ð?àÐÝ"‘}”}ˆØ!×+Ò+¨EÑ2Ô2€IØÐ-Ñ-Õ0CÑC€DØˆ<ØØØØ+�<Ô+Ñ-Ô-ð	ñ ô ð r\   Úblock_kc                óˆ   — t           j        j        sdS dt           j                             d¦  «        j        v r| dk    rdS dS )Nr   Úgfx942r~   r9   rí  )rU   rº  r}   rJ   rŽ  ÚgcnArchName)r§  s    rZ   Úget_default_kpackr«  à  sE   € ÝŒ=Ôð ØˆqØ•5”:×3Ò3°AÑ6Ô6ÔBÐBÐBÀwÐRTÂ}À}ØˆqØˆ1r\   r—  rC   Úallowed_layout_dtypesúlist[torch.dtype]c                óÂ   — | j         |vr!t                               d| j         |¦  «         t          | j        j        ¦  «        o| j         |v ot          | j        ¦  «        S )NzDNot using template since dtype %s is not in allowed layout dtypes %s)r¹   rî   rï   Úis_gpurº   r@  rŒ  )r—  r¬  s     rZ   Ú_use_template_for_gpur°  è  sl   € ð „|Ð0Ð0Ð0Ý�	Š	ØRØŒLØ!ñ	
ô 	
ð 	
õ 	ˆvŒ}Ô!Ñ"Ô"ð 	&ØŒLÐ1Ð1ð	&å�v”}Ñ%Ô%ðr\   Úbackendc                ó    — |                       ¦   «         d„ t          j                              ¦   «                              d¦  «        D ¦   «         v S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS rS   r÷  rW   s     rZ   r[   z)_use_autotune_backend.<locals>.<listcomp>ù  ó-   € ð ð ð Øˆ�Š‰	Œ	ðð ð r\   r¯  )r%  rt   Úmax_autotune_gemm_backendsr£  ©r±  s    rZ   Ú_use_autotune_backendr·  ø  óP   € Ø�=Š=‰?Œ?ð ð Ý!Ô<×BÒBÑDÔD×JÒJÈ3ÑOÔOðñ ô ð ð r\   c                ó    — |                       ¦   «         d„ t          j                              ¦   «                              d¦  «        D ¦   «         v S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS rS   r÷  rW   s     rZ   r[   z._use_conv_autotune_backend.<locals>.<listcomp>ÿ  r´  r\   r¯  )r%  rt   Úmax_autotune_conv_backendsr£  r¶  s    rZ   Ú_use_conv_autotune_backendr¼  þ  r¸  r\   c                ó    — |                       ¦   «         d„ t          j                              ¦   «                              d¦  «        D ¦   «         v S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS rS   r÷  rW   s     rZ   r[   z9_use_conv_bwd_weight_autotune_backend.<locals>.<listcomp>  ó0   € ð ð ð àð 	
�Š‰	Œ	ðð ð r\   r¯  )r%  rt   Ú%max_autotune_conv_bwd_weight_backendsr£  r¶  s    rZ   Ú%_use_conv_bwd_weight_autotune_backendrÁ    sP   € Ø�=Š=‰?Œ?ð ð åÔ=×CÒCÑEÔE×KÒKÈCÑPÔPðñ ô ð ð r\   c                ó    — |                       ¦   «         d„ t          j                              ¦   «                              d¦  «        D ¦   «         v S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS rS   r÷  rW   s     rZ   r[   z8_use_conv_bwd_input_autotune_backend.<locals>.<listcomp>  r¿  r\   r¯  )r%  rt   Ú$max_autotune_conv_bwd_input_backendsr£  r¶  s    rZ   Ú$_use_conv_bwd_input_autotune_backendrÅ    sP   € Ø�=Š=‰?Œ?ð ð åÔ<×BÒBÑDÔD×JÒJÈ3ÑOÔOðñ ô ð ð r\   )Úenable_int32Úenable_float8Úcheck_max_autotunerÆ  rÇ  rÈ  c               ó  — ddl m}m} t          j        t          j        t          j        g}|r.t          j        t          j        t          j        t          j        g}|r+|                     t          j	        t          j
        g¦  «         t          | j        j        ¦  «        ot          | |¦  «        p| j        j        dk    o| j        |v o?t           j        pt           j        p| o$t'          d¦  «        o || j        |j        ¦  «        S )Nr9   )ÚBackendFeatureÚhas_backend_featurer=  ÚTRITON)r¢  rÊ  rË  rU   rá   rŒ  rŽ  r›  r»  r‚  rƒ  r¯  rº   r@  r°  r¹   rt   Úmax_autotuneÚmax_autotune_gemmr·  ÚTRITON_TEMPLATES)r—  rÆ  rÇ  rÈ  rÊ  rË  Úlayout_dtypess          rZ   Úuse_triton_templaterÑ    s  € ð DÐCÐCÐCÐCÐCÐCÐCå”]¥E¤NµE´MÐB€MØð TÝœ­¬½¼ÅuÄ{ÐSˆØð GØ×Ò�eÔ1µ5Ô3DÐEÑFÔFÐFõ �v”}Ô)Ñ*Ô*ð AÝ)¨&°-Ñ@Ô@ðOð ”Ô" eÒ+ÐM°´ÀÐ0Mð
	Põ Ô ÐV¥FÔ$<ÐVÐDVÐ@Vð
	Põ " (Ñ+Ô+ð
	Pð  Ð ¤¨~Ô/NÑOÔOðr\   ©Úoutput_layoutÚ
add_guardsÚmatricesrB   rÓ  úLayout | NonerÔ  c                óÌ   ‡‡‡‡‡‡	— ddl m} ddlmŠ dˆfd	„Šdˆˆfd„}dˆˆˆ	fd„Šdˆˆˆfd„Šdˆfd„Š	 |¦   «         o%t	          ˆfd„|D ¦   «         ¦  «        o
 || ¦  «        S )u^  
    Return True iff *all* supplied tensors satisfy the CUDA TMA constraints
    that Triton relies on today.
    * https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__TENSOR__MEMORY.html

    A tensor is accepted when:
      * 1 â‰¤ rank â‰¤ 5 (cuTensorMapEncodeTiled)
      * dtype in _TMA_SUPPORTED_DTYPES (CUtensorMapDataType enum)
      * Base pointer 16-byte aligned
      * Exactly one contiguous ("inner") dim with stride 1
      * All "outer" dims have 16-byte aligned strides
      * Inner dim size Ã— itemsize is a multiple of 16
      * For 1-byte dtypes (e.g. FP8), inner dim â‰¥ 32
    r   )Úhas_triton_tma_devicer9   r¹  Ú
expr_bytesro  rO   rŠ   c                óN   •— ‰j         j                             | t          ¦  «        S rš   )r½  r¾  Ústatically_known_multiple_ofÚTMA_ALIGNMENT)rÙ  rº  s    €rZ   Ú_alignedzcan_use_tma.<locals>._alignedD  s   ø€ ØŒwÔ×<Ò<¸ZÍÑWÔWÐWr\   r—  rÖ  c                ót   •— | €dS | j         }| j        }| j        } ‰| j        ¦  «        sdS  ‰|||¦  «        S )NTF)r_  r¢  r¹   r  )r—  r[  Ústridesr¹   rÝ  Ú_is_tma_compatibles       €€rZ   Ú_is_tma_compatible_layoutz.can_use_tma.<locals>._is_tma_compatible_layoutG  sR   ø€ Øˆ>Ø�4Ø”ˆØ”-ˆØ”ˆð ˆx˜œÑ&Ô&ð 	Ø�5à!Ð! %¨°%Ñ8Ô8Ð8r\   r]  rB   c                ó6  •— |                       ¦   «         }|                      ¦   «         }|                      ¦   «         }|                      ¦   «         ‰j        j        v rdS |                      ¦   «         x}�|j        dk    r ‰|||¦  «        S  ‰|||¦  «        S )NFrL   )Úget_sizeÚ
get_strideÚ	get_dtyper'  r½  Úunaligned_buffersÚ
get_devicer@  )r]  r[  rß  r¹   Úm_devicerº  rà  Ú_is_tma_compatible_xpus        €€€rZ   Ú_is_tma_compatible_matrixz.can_use_tma.<locals>._is_tma_compatible_matrixT  s’   ø€ Ø—
’
‘”ˆØ—,’,‘.”.ˆØ—’‘”ˆð �:Š:‰<Œ<˜1œ7Ô4Ð4Ð4Ø�5àŸš™œÐ&ˆHÐ3¸¼ÈÒ8NÐ8NØ)Ð)¨%°¸%Ñ@Ô@Ð@à!Ð! %¨°%Ñ8Ô8Ð8r\   r[  rQ  rß  úSequence[_IntLike]r¹   r¶  c                ój  •— t          | ¦  «        }|j        }|dk     s|dk    rdS |t          vrdS ‰r?‰j        j                             | ¦  «        }‰j        j                             |¦  «        }nˆfd„| D ¦   «         }ˆfd„|D ¦   «         }ˆfd„t          |¦  «        D ¦   «         }t          |¦  «        dk    rdS |d         }t          |¦  «        D ]\  }	}
|	|k    rŒ ‰|
|z  ¦  «        s dS Œ||         } ‰||z  ¦  «        sdS |dk    r"‰j        j                             |d¦  «        sdS d	S )
Nr9   r½   Fc                óN   •— g | ]!}‰j         j                             |¦  «        ‘Œ"S rS   ©r½  r¾  Ú!replace_backed_symbols_with_hints)rX   rÊ   rº  s     €rZ   r[   z;can_use_tma.<locals>._is_tma_compatible.<locals>.<listcomp>t  s9   ø€ ð ð ð ØJK�”Ô ×BÒBÀ1ÑEÔEðð ð r\   c                óN   •— g | ]!}‰j         j                             |¦  «        ‘Œ"S rS   rî  )rX   Ústrº  s     €rZ   r[   z;can_use_tma.<locals>._is_tma_compatible.<locals>.<listcomp>w  s9   ø€ ð ð ð ØKM�”Ô ×BÒBÀ2ÑFÔFðð ð r\   c                óZ   •— g | ]'\  }}‰j         j                             |d ¦  «        ¯%|‘Œ(S r–   ©r½  r¾  Ústatically_known_equals)rX   rû   rñ  rº  s      €rZ   r[   z;can_use_tma.<locals>._is_tma_compatible.<locals>.<listcomp>|  sH   ø€ ð 
ð 
ð 
á��2ØŒwÔ×7Ò7¸¸AÑ>Ô>ð
Øð
ð 
ð 
r\   r   é    T)r^   Úitemsizer€   r½  r¾  Úguard_int_seqre  Ústatically_known_geq)r[  rß  r¹   Úrankrö  Úsizes_iÚ	strides_irT  Ú	inner_idxrû   rñ  Ú	inner_dimrº  rÝ  rÔ  s               €€€rZ   rà  z'can_use_tma.<locals>._is_tma_compatibleb  s¹  ø€ õ
 �5‰zŒzˆØ”>ˆà�!Š8ˆ8�t˜a’x�xØ�5àÕ-Ð-Ð-Ø�5àð 		Ø”gÔ&×4Ò4°UÑ;Ô;ˆGØœÔ(×6Ò6°wÑ?Ô?ˆIˆIðð ð ð ØOTðñ ô ˆGðð ð ð ØQXðñ ô ˆIð

ð 
ð 
ð 
å" 9Ñ-Ô-ð
ñ 
ô 
ˆõ
 ˆu‰:Œ:˜Š?ˆ?Ø�5Ø˜!”Hˆ	õ ˜yÑ)Ô)ð 	ð 	‰EˆAˆrØ�IŠ~ˆ~ØØ�8˜B ™MÑ*Ô*ð Ø�u�uðð ˜IÔ&ˆ	Øˆx˜	 HÑ,Ñ-Ô-ð 	Ø�5ð �qŠ=ˆ= ¤Ô!1×!FÒ!FÀyÐRTÑ!UÔ!Uˆ=Ø�5àˆtr\   c                ó,  •— |d         }‰j         j                             |¦  «        }‰j         j                             |d¦  «        sdS d}| D ]D}‰j         j                             |¦  «        }‰j         j                             ||¦  «        r dS ŒEdS )NrÎ   r9   Fl   ÿÿ T)r½  r¾  rï  rô  Ústatically_known_gt)	r[  rß  r¹   Úlast_strideÚlast_stride_hintÚ
MAX_UINT32r_  Ú	size_hintrº  s	           €rZ   ré  z+can_use_tma.<locals>._is_tma_compatible_xpu—  s¯   ø€ ð ˜b”kˆØœ7Ô+×MÒMØñ
ô 
Ðð ŒwÔ×7Ò7Ð8HÈ!ÑLÔLð 	Ø�5ð ˆ
Øð 	ð 	ˆDØœÔ(×JÒJÈ4ÑPÔPˆIØŒwÔ×3Ò3°I¸zÑJÔJð Ø�u�uðð ˆtr\   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rš   rS   )rX   r]  rê  s     €rZ   rÜ   zcan_use_tma.<locals>.<genexpr>¯  s/   øè è € Ð?Ð?°Ð)Ð)¨!Ñ,Ô,Ð?Ð?Ð?Ð?Ð?Ð?r\   )rÙ  ro  rO   rŠ   )r—  rÖ  rO   rŠ   )r]  rB   rO   rŠ   )r[  rQ  rß  rë  r¹   r¶  rO   rŠ   )Útorch.utils._tritonrØ  r¼  rº  r�   )
rÓ  rÔ  rÕ  rØ  rá  rº  rÝ  rà  rê  ré  s
    `   @@@@@rZ   Úcan_use_tmar  /  s/  øøøøøø€ ð" :Ð9Ð9Ð9Ð9Ð9àÐÐÐÐÐðXð Xð Xð Xð Xð Xð9ð 9ð 9ð 9ð 9ð 9ð 9ð9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ðjð ð ð ð ð ð. 	ÐÑÔð 	5ÝÐ?Ð?Ð?Ð?°hÐ?Ñ?Ô?Ñ?Ô?ð	5à%Ð% mÑ4Ô4ðr\   c                óâ  — t          j        t           j        ¦  «        j        }g }| D ]U}t	          |t
          t          j        f¦  «        r
||k    r dS Œ-|                     t          j	        ||¦  «        ¦  «         ŒV|sdS ddl
m} t          |¦  «        dk    r|d         nt          j        |Ž }|r|j        j                             |¦  «        n|j        j                             |¦  «        S )NFTr9   r¹  r   )rU   Úiinfor›  rå   rŒ   r„   r�   r›   rí  ÚLer¼  rº  r^   ÚAndr½  r¾  Úguard_or_falseÚstatically_known_true)r[  rÔ  Ú	int32_maxÚ
conditionsr_  rº  Ú	conditions          rZ   Ú_descriptor_shape_fits_in_int32r  ´  s  € õ ”�EœKÑ(Ô(Ô,€IØ€JØð 9ð 9ˆÝ�d�S¥%¤-Ð0Ñ1Ô1ð 	9Ø�iÒÐØ�u�uð  ð ×Ò�eœh t¨YÑ7Ô7Ñ8Ô8Ð8Ð8àð ØˆtàÐÐÐÐÐå!$ Z¡¤°AÒ!5Ð!5�
˜1”�½5¼9ÀjÐ;Q€Ið ð	?ˆŒÔ×'Ò'¨	Ñ2Ô2Ð2àŒWÔ×3Ò3°IÑ>Ô>ðr\   ©rÔ  c                óV  ‡— t           j        j        sdS t          d„ |D ¦   «         ¦  «        sdS t          ˆfd„|D ¦   «         ¦  «        sdS t           j        j        rt          | j        ‰¬¦  «        sdS t          j        j	        �dS t           j        j        r| nd }t          ||‰dœŽS )NFc              3  ó`   K  — | ])}t          |                     ¦   «         ¦  «        d k    V — Œ*dS )rí  N)r^   rã  )rX   r]  s     rZ   rÜ   z*use_triton_tma_template.<locals>.<genexpr>Ò  s7   è è € Ð8Ð8¨!�s�1—:’:‘<”<Ñ Ô  AÒ%Ð8Ð8Ð8Ð8Ð8Ð8r\   c              3  ó^   •K  — | ]'}t          |                     ¦   «         ‰¬ ¦  «        V — Œ(dS )r  N)r  rã  )rX   r]  rÔ  s     €rZ   rÜ   z*use_triton_tma_template.<locals>.<genexpr>Ô  sL   øè è € ð ð àõ 	(¨¯
ª
©¬ÀÐLÑLÔLðð ð ð ð ð r\   r  TrÒ  )rt   rw  Úenable_persistent_tma_matmulr�   Úenable_template_tma_storer  r_  rU   rº  r}   r  )rÓ  rÔ  rÕ  r—  s    `  rZ   Úuse_triton_tma_templater  Í  sç   ø€ õ Œ=Ô5ð ØˆuÝÐ8Ð8¨xÐ8Ñ8Ô8Ñ8Ô8ð ØˆuÝð ð ð ð àðñ ô ñ ô ð ð ˆuÝ„}Ô.ð Õ7VØÔ zð8ñ 8ô 8ð ð ˆuõ „}ÔÐ$ØˆtÝ$œmÔEÐOˆ]ˆ]È4€FÝ˜°À:ÐNÐNÐNÐNr\   c                ó`   — t          || |dœŽsdS ddlm} ddlm}  |¦   «         o	 |¦   «         S )NrÒ  Fr   )Ú%has_triton_tensor_descriptor_host_tmar9   ©Úis_datacenter_blackwell_arch)r  r  r  Úcodegen.cuda.cuda_envr  )rÓ  rÔ  rÕ  r  r  s        rZ   Ú!use_triton_blackwell_tma_templater  å  sm   € õ #Ø	 ¸:ðð ð ð ð ˆuàIÐIÐIÐIÐIÐIàCÐCÐCÐCÐCÐCð 1Ð0Ñ2Ô2ÐUÐ7SÐ7SÑ7UÔ7UÐUr\   Úscale_option_ar8   Úscale_option_bÚscaling_typesúlist[ScalingType]c                ó   — | |v o||v S rš   rS   )r  r  r   s      rZ   Úuse_triton_scaling_templater#  õ  s   € ð
 ˜]Ð*ÐN¨~ÀÐ/NÐNr\   )Úmaxsizec                 óh   — 	 t           j                             d¦  «        duS # t          $ r Y dS w xY w)z¸Check if CuTeDSL is importable; cache the result for reuse.

    Call ensure_cute_available.cache_clear() after installing CuTeDSL
    in the same interpreter to retry the import.
    ÚcutlassNF©Ú	importlibÚutilÚ	find_specr8  rS   r\   rZ   Úensure_cute_availabler+  ý  sD   € ðÝŒ~×'Ò'¨	Ñ2Ô2¸$Ð>Ð>øÝð ð ð Øˆuˆuðøøøó   ‚ # £
1°1c                 óŽ   — 	 t           j                             d¦  «        du} n# t          $ r Y dS w xY w| rt	          ¦   «          | S )zåCheck if NVIDIA Universal GEMM (cutlass_api) is importable; cache the result for reuse.

    Call ensure_nv_universal_gemm_available.cache_clear() after installing cutlass_api
    in the same interpreter to retry the import.
    Úcutlass_apiNF)r(  r)  r*  r8  Ú_ensure_fp4_dtype_registered)Ú	availables    rZ   Ú"ensure_nv_universal_gemm_availabler1  
	  s_   € ðÝ”N×,Ò,¨]Ñ;Ô;À4ÐGˆ	ˆ	øÝð ð ð Øˆuˆuðøøøàð 'Ý$Ñ&Ô&Ð&ØÐs   ‚!$ ¤
2±2c                 óÐ   ‡‡— ddl } 	 | j                             t          j        ¦  «         dS # t
          t          f$ r& ddlŠ| j        j        Šˆˆfd„}|| j        _        Y dS w xY w)a$  Patch cutlass_api to handle torch.float4_e2m1fn_x2 -> cutlass.Float4E2M1FN.

    NOTE: cutlass_api doesn't natively map this dtype. We patch the lookup function
    in-place so all callers (including TensorWrapper) pick up the change.
    Remove once cutlass_api adds native FP4 support.
    r   Nc                óH   •— | t           j        k    r‰j        S  ‰| ¦  «        S rš   )rU   rŠ  ÚFloat4E2M1FN)r¹   Ú_origr&  s    €€rZ   Ú_patchedz._ensure_fp4_dtype_registered.<locals>._patched*	  s(   ø€ Ø�Ô.Ò.Ð.ØÔ+Ð+Ø�5˜‘<”<Ðr\   )Úcutlass_api.utilsrX  Úcutlass_type_from_torch_typerU   rŠ  ÚKeyErrorrd  r&  )r.  r6  r5  r&  s     @@rZ   r/  r/  	  s¥   øø€ ð ÐÐÐðBØÔ×6Ò6µuÔ7MÑNÔNÐNÐNÐNøÝ•nÐ%ð 
Bð 
Bð 
BØˆˆˆàÔ!Ô>ˆð	 ð 	 ð 	 ð 	 ð 	 ð 	 ð
 :BˆÔÔ6Ð6Ð6Ð6ð
Bøøøs   ˆ$. ®3A%Á$A%c                 óh   — 	 t           j                             d¦  «        duS # t          $ r Y dS w xY w)aG  Check if nvMatmulHeuristics is importable; cache the result for reuse.

    nvMatmulHeuristics provides performance model-based kernel selection
    for NVIDIA GEMM operations.

    Call ensure_nvmatmul_heuristics_available.cache_clear() after installing
    nvMatmulHeuristics in the same interpreter to retry the import.
    ÚnvMatmulHeuristicsNFr'  rS   r\   rZ   Ú$ensure_nvmatmul_heuristics_availabler<  2	  sE   € ðÝŒ~×'Ò'Ð(<Ñ=Ô=ÀTÐIÐIøÝð ð ð Øˆuˆuðøøør,  Úmat_aÚmat_bÚa_is_2dÚb_is_2dÚoffsú
Any | NoneÚbiasÚscale_resultc                ó–  — t          ¦   «         sdS t          d¦  «        sdS ddlm} t	          |j        j        ¦  «        sdS  |¦   «         sdS t          j        g}	t          ||	¦  «        sdS t          j        st          j        sdS t          | ||¬¦  «        sdS t          d„ | |fD ¦   «         ¦  «        rdS |r|rdS |€dS |€|�dS dS )	añ  
    Returns True if we can use the blackwell kernel for grouped mm.
    Required conditions:
        1. CuTeDSL backend is enabled
        2. CuTeDSL is available
        3. We are on a blackwell arch
        4. The dtype is bf16
        5. Max autotune or max autotune gemm is enabled
        6. A, B, and the output are 16B aligned
        7. We are not using dynamic shapes
        8. A is 2d
        9. B is 3d
        10. Offsets are provided
        11. Bias and Scale are not provided
    FÚCUTEDSLr9   r  )rÓ  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rš   )Ú
is_dynamicrW   s     rZ   rÜ   z3use_blackwell_cutedsl_grouped_mm.<locals>.<genexpr>t	  s(   è è € Ð
1Ð
1˜Q�:�a‰=Œ=Ð
1Ð
1Ð
1Ð
1Ð
1Ð
1r\   NT)r+  r·  r  r  r¯  rº   r@  rU   rŒ  r°  rt   rÍ  rÎ  r  rÍ  )
r=  r>  r—  r?  r@  rA  rC  rD  r  rÐ  s
             rZ   Ú use_blackwell_cutedsl_grouped_mmrI  B	  s"  € õ2 !Ñ"Ô"ð Øˆuå  Ñ+Ô+ð ØˆuàCÐCÐCÐCÐCÐCå�&”-Ô$Ñ%Ô%ð Øˆuà'Ð'Ñ)Ô)ð Øˆuå”^Ð$€MÝ  ¨Ñ7Ô7ð ØˆuåÔð ¥6Ô#;ð Øˆuõ �u˜e°6Ð:Ñ:Ô:ð Øˆuå
Ð
1Ð
1 5¨% .Ð
1Ñ
1Ô
1Ñ1Ô1ð Øˆuàð �gð Øˆuà€|ØˆuàÐ˜<Ð3Øˆuàˆ4r\   r]  r�  Úkc                óð  — ddl m} |j        j                             ||z  |z  d¬¦  «        }|dk    s|t
          j        j        k     rdS ddlm	} t          j        j        rdS t          j        t          j        t          j        g}t!          | |¦  «        o&t
          j        pt
          j        ot'          d¦  «        }|r6 |¦   «         s,t(                               d	t
          j        j        ¦  «         dS |S )
Nr9   r¹  rÎ   ©rŸ  r   F)Útry_import_cutlassÚCUTLASSzŽFailed to import CUTLASS lib. Please check whether _inductor.config.cutlass.cutlass_dir %s is set correctly. Skipping CUTLASS backend for now.)r¼  rº  r½  r¾  r§  rt   r&  Úcutlass_backend_min_gemm_sizeÚcodegen.cutlass.utilsrM  rU   rº  r}   rá   rŒ  r›  r°  rÍ  rÎ  r·  rî   r€  Úcutlass_dir)	r—  r]  r�  rJ  rº  Ú	gemm_sizerM  rÐ  rý   s	            rZ   Úuse_cutlass_templaterS  ƒ	  s  € ØÐÐÐÐÐà”Ô ×2Ò2°1°q±5¸1±9ÀrÐ2ÑJÔJ€IØ�A‚~€~˜¥V¤^Ô%QÒQÐQØˆuØ9Ð9Ð9Ð9Ð9Ð9õ „}Ôð Øˆuõ ”]¥E¤NµE´KÐ@€Må˜f mÑ4Ô4ð 	-ÝÔ Ð<¥FÔ$<ð	-å! )Ñ,Ô,ð ð ð Ø!Ð!Ñ#Ô#ð 	Ý�KŠKð4õ ”Ô*ñ	ô ð ð �5Ø€Jr\   Ú_IntLikeúIRNode | Nonerï  ú_IntLike | Nonec                óò  ‡
‡— ddl mŠ t          ¦   «         sdS t          ¦   «         sdS t	          d¦  «        sdS ddlmŠ
 ‰
j        rdS | j        j	        dk    st          j        j        rdS t          j        st          j        sdS |||g}|�|                     |¦  «         t#          ˆfd	„|D ¦   «         ¦  «        rdS ||g}	|�|	                     |¦  «         t#          ˆ
fd
„|	D ¦   «         ¦  «        rdS dS )a3  
    Return True if we can use the NVIDIA Universal GEMM Template.

    Required conditions:
        1. NVGEMM backend is enabled
        2. cutlass_api is available
        3. We are on a NVIDIA GPU
        4. Max autotune or max autotune gemm is enabled
        5. Not in AOT Inductor mode (requires runtime JIT compilation)
        6. Base pointers are 16-byte aligned
        7. Shape dimensions are not unbacked symbols

    Note:
        - Shape and stride constraints are handled internally by
          cutlass_api.get_kernels() which filters incompatible kernels.
        - GroupedGemm currently only supports TN layout (column-major B).
          Any other layout will act as a noop and fall back to ATen.
        - Dynamic shapes are supported as long as they have hints
          (from example inputs).
    r   )Úhas_free_unbacked_symbolsFÚNVGEMMr9   r¹  rJ   Nc              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rš   rS   )rX   ÚdimrX  s     €rZ   rÜ   z1use_nv_universal_gemm_template.<locals>.<genexpr>Þ	  s/   øè è € Ð
CÐ
C¨cÐ$Ð$ SÑ)Ô)Ð
CÐ
CÐ
CÐ
CÐ
CÐ
Cr\   c              3  óX   •K  — | ]$}|                      ¦   «         ‰j        j        v V — Œ%d S rš   )r'  r½  ræ  )rX   Útrº  s     €rZ   rÜ   z1use_nv_universal_gemm_template.<locals>.<genexpr>æ	  s5   øè è € Ð
OÐ
O¸ˆ1�:Š:‰<Œ<˜1œ7Ô4Ð4Ð
OÐ
OÐ
OÐ
OÐ
OÐ
Or\   T)r/  rX  r+  r1  r·  r¼  rº  Úaot_compilationrº   r@  rU   rº  r}   rt   rÍ  rÎ  rí  rÍ  )r—  r]  r�  rJ  r=  r>  rA  rï  Údims_to_checkÚtensors_to_checkrº  rX  s             @@rZ   Úuse_nv_universal_gemm_templatera  ¤	  sU  øø€ ð< PÐOÐOÐOÐOÐOå Ñ"Ô"ð Øˆuå-Ñ/Ô/ð Øˆuå  Ñ*Ô*ð ØˆuàÐÐÐÐÐàÔð Øˆuà„}Ô˜VÒ#Ð#¥u¤}Ô'8Ð#ØˆuåÔð ¥6Ô#;ð Øˆuð
 ˜˜1�I€MØ€}Ø×Ò˜QÑÔÐÝ
Ð
CÐ
CÐ
CÐ
C°]Ð
CÑ
CÔ
CÑCÔCð Øˆuð ˜u�~ÐØÐØ×Ò Ñ%Ô%Ð%Ý
Ð
OÐ
OÐ
OÐ
OÐ>NÐ
OÑ
OÔ
OÑOÔOð Øˆuàˆ4r\   Úop_namec                ó¾   — t           j        j                             ¦   «         }|dk    rdS |                      ¦   «         d„ |                     d¦  «        D ¦   «         v S )z8Check if CUTLASS should be used for the given operation.ÚALLTc                ó6   — g | ]}|                      ¦   «         ‘ŒS rS   r÷  rW   s     rZ   r[   z'_use_cutlass_for_op.<locals>.<listcomp>ñ	  s    € ÐIÐIÐI¨Q˜qŸwšw™yœyÐIÐIÐIr\   r¯  )rt   r&  Úcutlass_enabled_opsr%  r£  )rb  Úenabled_opss     rZ   Ú_use_cutlass_for_oprh  ì	  sX   € å”.Ô4×:Ò:Ñ<Ô<€KØ�eÒÐØˆtØ�=Š=‰?Œ?ÐIÐI°+×2CÒ2CÀCÑ2HÔ2HÐIÑIÔIÐIÐIr\   r   Úthreshold_multiplec           
     óP  — ddl m} t          j        j        |z  }|j        j                             t          j	        t          j
        ||| z  ¦  «        t          j
        |||z  ¦  «        ¦  «        ¦  «        o.|j        j         o!|j        j         ot          j        j        dk    S )Nr   r¹  )Útorch._inductor.virtualizedrº  rt   rw  Údecompose_k_thresholdr½  r¾  r  r�   r
  ÚGerY  Úcpp_wrapperÚnum_decompose_k_splits)r]  r�  rJ  ri  rº  rl  s         rZ   Úuse_decompose_k_choicerp  ÷	  s·   € ð .Ð-Ð-Ð-Ð-Ð-å"œMÔ?ÐBTÑTÐð 	
ŒÔ×.Ò.ÝŒIÝ”˜Ð1°AÑ5Ñ6Ô6Ý”˜Ð1°AÑ5Ñ6Ô6ñô ñ	
ô 	
ð 	5ð ”Ô Ð ð	5ð ”Ô#Ð#ð	5õ ŒMÔ0°1Ò4ð
r\   c           
     ó\  — t           j        j        }ddlm} t          t          j        j        ¦  «        ow|j	        j
                             t          j        t          j        ||| z  ¦  «        t          j        |||z  ¦  «        ¦  «        ¦  «        o|j	        j         o|j	        j         S )zŒ
    Check if we should use the contiguous subgraph transform.
    This transform makes the second matrix contiguous before the matmul.
    r   r¹  )rt   ÚrocmÚcontiguous_thresholdrk  rº  rŠ   rU   rº  r}   r½  r¾  r  r�   r
  rm  rY  rn  )r]  r�  rJ  rs  rº  s        rZ   Úuse_contiguousrt  
  s´   € õ "œ;Ô;Ðð .Ð-Ð-Ð-Ð-Ð-õ 	�UŒ]ÔÑÔð 	$ØŒGÔ×2Ò2ÝŒIÝ”˜Ð0°1Ñ4Ñ5Ô5Ý”˜Ð0°1Ñ4Ñ5Ô5ñô ñ
ô 
ð	$ð ”Ô Ð ð	$ð ”Ô#Ð#ð
r\   c                óÀ  ‡‡— t           j        j        }g d¢}t          |t          j        ¦  «        r	|j        s|S |dk    rg S t          | t          j        ¦  «        r| j        r!t          |t          j        ¦  «        r
|j        sdŠnt          || z  ||z  ¦  «        ŠdŠt	          j        |¦  «        }ˆˆfd„|D ¦   «         }g g g }}}|D ]j}	||	z  }
|
dk     rŒ|
|
dz
  z  dk    r|
dk    r| 	                    |	¦  «         Œ6|
dz  dk    r| 	                    |	¦  «         ŒU| 	                    |	¦  «         Œkt           j
        d	k    r||z   |z   S ||z   |z   }|d |…         S )
N)r~   rõ  r�   r   é   r   rv  rí  c                ó,   •— g | ]}|‰k    ¯|‰k    ¯|‘ŒS rS   rS   )rX   ÚdivisorÚmax_k_splitÚmin_k_splits     €€rZ   r[   z get_k_splits.<locals>.<listcomp><
  s8   ø€ ð ð ð àØ�kÒ!Ð! g°Ò&<Ð&<ð 	à&<Ð&<Ð&<r\   r   r9   rõ  Ú
EXHAUSTIVE)rt   rw  ro  rŒ   r�   rs  Ú	is_numberr  Údivisorsrí  Úmax_autotune_gemm_search_space)r]  r�  rJ  Úk_splits_limitÚdefault_k_splitsr}  Úpow_of_2_divisorsÚmul_of_32_divisorsÚrest_of_splitsÚdÚkPartÚbest_splitsry  rz  s               @@rZ   Úget_k_splitsr‡  $
  sÔ  øø€ õ ”]Ô9€Nð .Ð-Ð-Ðå�!•U”ZÑ Ô ð ¨¬ð ØÐØ	˜1Ò	Ð	Øˆ	å�1•e”jÑ!Ô!ð *¨!¬+ð *Ý�1•e”jÑ!Ô!ð*Ø*+¬+ð*ð ˆˆå˜!˜q™& ! q¡&Ñ)Ô)ˆà€KåŒ~˜aÑ Ô €Hðð ð ð ð àðñ ô €Hð =?ÀÀB¨>Ð)Ðàð %ð %ˆØ�Q‘ˆð �3Š;ˆ;Øð �E˜A‘IÑ !Ò#Ð#¨°ª¨Ø×$Ò$ QÑ'Ô'Ð'Ð'à�R‰Z˜1Š_ˆ_Ø×%Ò% aÑ(Ô(Ð(Ð(ð ×!Ò! !Ñ$Ô$Ð$Ð$åÔ,°Ò<Ð<Ø Ð#5Ñ5¸ÑFÐFà#Ð&8Ñ8¸>ÑI€Kà�˜�Ô'Ð'r\   c                óJ   — t           j                             | ¦  «        j        S rš   )rU   rJ   rŽ  rª  ©rº   s    rZ   Ú_rocm_native_device_arch_namerŠ  ]
  s   € åŒ:×+Ò+¨FÑ3Ô3Ô?Ð?r\   úNtuple[str | None, Callable[[], list[Any]], Callable[[], list[Any]], type[Any]]c                 óÌ   — 	 dd l } ddlm}m} ddlm} t          j                             | j	        ¦  «        }n'# t          $ r d
d„}d
d„} G d„ d	¦  «        }d }Y nw xY w||||fS )Nr   )Úgen_ops_libraryÚgen_ops_preselected)ÚCKGemmOperationrO   rå  c                 ó   — g S rš   rS   rS   r\   rZ   r�  z*try_import_ck_lib.<locals>.gen_ops_librarys
  ó   € ØˆIr\   c                 ó   — g S rš   rS   rS   r\   rZ   rŽ  z.try_import_ck_lib.<locals>.gen_ops_preselectedv
  r‘  r\   c                  ó   — e Zd ZdS )ú*try_import_ck_lib.<locals>.CKGemmOperationN)rž   rŸ   r    rS   r\   rZ   r�  r”  y
  s   € € € € € ØˆDr\   r�  )rO   rå  )Úck4inductorÚ(ck4inductor.universal_gemm.gen_instancesr�  rŽ  Úck4inductor.universal_gemm.opr�  rk  rz  ÚdirnameÚ__file__r8  )r•  r�  rŽ  r�  Úpackage_dirnames        rZ   Útry_import_ck_libr›  b
  sû   € ðØÐÐÐð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð	
ð 	
ð 	
ð 	
ð 	
ð 	
õ œ'Ÿ/š/¨+Ô*>Ñ?Ô?ˆˆøÝð ð ð ð	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð ˆˆˆðøøøð ˜OÐ-@À/ÐQÐQs   ‚69 ¹!AÁAc                óf  ‡— t           j        st           j        sdS t          j        j        sdS | j        j        dk    rdS t          | j        ¦  «        }d„ t           j	        j
        D ¦   «         p|                     d¦  «        d         |iŠˆfd„‰                     ¦   «         t           j	        j        z  D ¦   «         }|sdS | j        t          j        t          j        t          j        fvrdS t%          ¦   «         \  }}}}|st&                               d¦  «         dS |t           j	        _        dS )	NFrJ   c                óF   — i | ]}|                      d ¦  «        d         |“ŒS )ú:r   )r£  )rX   rJ  s     rZ   rk  z#use_ck_template.<locals>.<dictcomp>�
  s(   € ÐDÐDÐD¨a�q—w’w˜s‘|”| A”¨ÐDÐDÐDr\   rž  r   c                ó    •— g | ]
}‰|         ‘ŒS rS   rS   )rX   rJ  Úrequested_archss     €rZ   r[   z#use_ck_template.<locals>.<listcomp>�
  s.   ø€ ð !ð !ð !àð 	˜Ôð!ð !ð !r\   z,Please pip install Composable Kernel packageT)rt   rÍ  rÎ  rU   rº  r}   rº   r@  rŠ  rr  Úarchr£  r¶  Úck_supported_archr¹   rá   rŒ  rŽ  r›  rî   r€  Úck_dir)r—  Únative_archÚrequested_supported_archsÚck_package_dirnamerÃ   r   s        @rZ   Úuse_ck_templater§  €
  sA  ø€ åÔð ¥6Ô#;ð ØˆuåŒ=Ôð Øˆuà„}Ô˜VÒ#Ð#Øˆuõ 0°´Ñ>Ô>€KØDÐDµ6´;Ô3CÐDÑDÔDð Ø×Ò˜#ÑÔ˜qÔ! ;ðI€Oð!ð !ð !ð !à ×%Ò%Ñ'Ô'­&¬+Ô*GÑGð!ñ !ô !Ðð %ð Øˆuà„|�EœM­5¬>½5¼=ÐIÐIÐIØˆuå"3Ñ"5Ô"5ÑÐ˜˜1˜aàð Ý�ŠÐBÑCÔCÐCØˆuà+…F„KÔàˆ4r\   c                ó    — ddl m} t          d¦  «        o9t          | ¦  «        o*|j        j                             ||z  |z  d¬¦  «        dk    S )Nr9   r¹  ÚCKrÎ   rL  r   ©r¼  rº  r·  r§  r½  r¾  r§  ©r—  r]  r�  rJ  rº  s        rZ   Úuse_ck_gemm_templater¬  ¥
  se   € ØÐÐÐÐÐõ 	˜dÑ#Ô#ð 	KÝ˜FÑ#Ô#ð	KàŒGÔ×.Ò.¨q°1©u°q©yÀ2Ð.ÑFÔFÈÒJðr\   c                ó    — ddl m} t          d¦  «        o9t          | ¦  «        o*|j        j                             ||z  |z  d¬¦  «        dk    S )Nr9   r¹  ÚCKTILErÎ   rL  r   rª  r«  s        rZ   Úuse_ck_tile_gemm_templater¯  ¯
  se   € ØÐÐÐÐÐõ 	˜hÑ'Ô'ð 	KÝ˜FÑ#Ô#ð	KàŒGÔ×.Ò.¨q°1©u°q©yÀ2Ð.ÑFÔFÈÒJðr\   c                ó>   — t          d¦  «        ot          | ¦  «        S )Nr©  )r¼  r§  ©r—  s    rZ   Úuse_ck_conv_templater²  ¹
  s   € Ý% dÑ+Ô+ÐGµÀÑ0GÔ0GÐGr\   c                óR   — t           j        pt           j        o| j        j        dk    S rú  )rt   rÍ  rÎ  rº   r@  r±  s    rZ   Ú_use_template_for_cpur´  ½
  s'   € åÔÐ7�vÔ7ð&à
Œ-Ô
 Ò
%ð&r\   Úmat1úReinterpretView | BufferÚmat2c                ó²  — ddl m} t          |j        |¦  «        sJ ‚|j        j        }|j        j        }t          | ¦  «        oe|                     ¦   «         t          j	        k    oCt          |¦  «        dk    o0t          |¦  «        dk    o|d         |d         k    o|d         dk    }t          | ||d¬¦  «        o|j                             ¦   «         p|S )Nr9   )rC   é   rí  F)Úrequire_constant_mat2)r\  rC   rŒ   r—  r_  r¢  r´  rå  rU   rŽ  r^   Úuse_cpp_gemm_templateÚis_contiguous)r—  rµ  r·  rC   Ú	mat1_sizeÚmat1_strideÚmat1_each_batch_is_contiguouss          rZ   Úuse_cpp_bmm_templaterÀ  Ã
  sø   € ð ÐÐÐÐÐå�d”k 6Ñ*Ô*Ð*Ð*Ð*ð
 ”Ô €IØ”+Ô$€Kå˜fÑ%Ô%ð 	"Ø�NŠNÑÔ¥¤Ò-ð	"å�‰^Œ^˜qÒ ð	"õ �ÑÔ Ò"ð	"ð ˜Œ^˜y¨œ|Ò+ð		"ð
 ˜Œ^˜qÒ ð "õ ! ¨¨tÈ5ÐQÑQÔQð ØŒ×!Ò!Ñ#Ô#ÐDÐ'Dðr\   Úmat2_transposedrº  Úis_woq_int4Úq_group_sizec                óv  — ddl m} ddlm} ddlm}	 ddlm}
 t          | ¦  «        rt          d¦  «        sdS t          j        j        sdS |                     ¦   «         t          j        t          j        fv }t          j        t          j        t          j        t          j        t          j        g} |
|||r| j        nd ||¬¦  «        \  }}}} }}t+          ||f¦  «        rdS t-          ||j        ¦  «        r|                     ¦   «         } |	|                     ¦   «         ¦  «        \  }} |d	||||                     ¦   «         |                     ¦   «         |t3          ¦   «         | |¬
¦
  «
        }dd„}| j        |v o:|d uo6 ||¦  «        o+t-          ||j        ¦  «        o|                     ¦   «         p| S )Nr9   r[  )Úcreate_micro_gemm)Ú*get_gemm_template_output_and_compute_dtype)Úmm_argsÚCPPF)Ú	out_dtyperÁ  Úuse_4x2_dimÚ
micro_gemm)Úinput_dtypeÚinput2_dtypeÚoutput_dtypeÚnum_threadsÚuse_refrÃ  rY   rB   rO   rŠ   c                óf   — |                       ¦   «          |                      ¦   «         d         dk    S )NrÎ   r9   )Úfreeze_layouträ  ©rY   s    rZ   Úis_last_dim_stride1z2use_cpp_gemm_template.<locals>.is_last_dim_stride1  s*   € Ø	�ŠÑÔÐØ�|Š|‰~Œ~˜bÔ! QÒ&Ð&r\   )rY   rB   rO   rŠ   )r`  r\  Úcodegen.cpp_micro_gemmrÅ  Úcodegen.cpp_utilsrÆ  Úkernel.mm_commonrÇ  r´  r·  rt   ÚcppÚweight_prepackrå  rU   r�  r’  rŽ  rŒ  Úhalfr¹   Úhas_free_symbolsrŒ   ÚBaseViewÚunwrap_viewÚparallel_num_threadsr”  Úis_module_buffer)r—  rµ  r·  rÁ  rº  rÂ  rÃ  r\  rÅ  rÆ  rÇ  Ú	int8_gemmrÐ  r]  r�  rJ  rÎ  rÃ   rË  rÔ  s                       rZ   r»  r»  Ü
  s$  € ð ÐÐÐÐÐØ9Ð9Ð9Ð9Ð9Ð9ØMÐMÐMÐMÐMÐMØ)Ð)Ð)Ð)Ð)Ð)å  Ñ(Ô(ð Õ0EÀeÑ0LÔ0Lð ØˆuåŒ:Ô$ð Øˆuà—’Ñ Ô ¥U¤[µ%´*Ð$=Ð=€IÝ”]¥E¤NµE´JÅÄÍUÌZÐX€MØ") 'ØØØ"+Ð5�&”,�,°Ø'Øð#ñ #ô #Ñ€A€qˆ!ˆV�T˜4õ ˜˜A˜ÑÔð Øˆuå�$˜œÑ$Ô$ð "Ø×ÒÑ!Ô!ˆà@Ð@ÀÇÂÑAQÔAQÑRÔR�O€L�!Ø"Ð"ØØ	Ø	Ø	Ø—N’NÑ$Ô$Ø—^’^Ñ%Ô%Ø!Ý(Ñ*Ô*Ø�Ø!ðñ ô €Jð'ð 'ð 'ð 'ð
 	Œ˜Ð%ð 	CØ˜dÐ"ð	CàÐ Ñ%Ô%ð	Cõ �t˜Rœ]Ñ+Ô+ð	Cð ×"Ò"Ñ$Ô$ÐAÐ,AÐ(Aðr\   c                 óR   — t           j        pt           j         pt          d¦  «        S )NÚATEN)rt   rÍ  rÎ  r·  rS   r\   rZ   Úuse_aten_gemm_kernelsrã    s*   € åÔÐ7�vÔ7ðð 'å	˜vÑ	&Ô	&ð'r\   c                  óR   — e Zd ZU  ej        d¦  «        Zded<   dd„Zdd„Zdd
„Z	dS )ÚDebugDirManagerr   rP   Úprev_debug_namerO   r  c                óB   — t          t          j        ¦  «        | _        d S rš   )r3  rå  Úcounterr¨   rØ  s    rZ   rÉ  zDebugDirManager.__init__&  s   € Ý•Ô.Ñ/Ô/ˆŒˆˆr\   c                óž   — t           j        j        j        | _        | j        › d| j        › �| _        | j        t           j        j        _        d S )NÚ_tmp_)rU   Ú_dynamort   Údebug_dir_rootræ  r¨   Únew_namerØ  s    rZ   Ú	__enter__zDebugDirManager.__enter__)  sA   € Ý$œ}Ô3ÔBˆÔØÔ/Ð?Ð?°d´gÐ?Ð?ˆŒØ.2¬m�ŒÔÔ+Ð+Ð+r\   r’   r_  c                ón   — t          j        | j        ¦  «         | j        t          j        j        _        d S rš   )r‹  rŒ  rí  ræ  rU   rë  rt   rì  )r7  r’   s     rZ   Ú__exit__zDebugDirManager.__exit__.  s*   € ÝŒ�d”mÑ$Ô$Ð$Ø.2Ô.B�ŒÔÔ+Ð+Ð+r\   Nr.  )r’   r_  rO   r  )
rž   rŸ   r    rä  rÑ  rè  r®   rÉ  rî  rð  rS   r\   rZ   rå  rå  "  su   € € € € € € ØˆiŒo˜aÑ Ô €GØÐÐÑð0ð 0ð 0ð 0ð<ð <ð <ð <ð
Cð Cð Cð Cð Cð Cr\   rå  úCallable[P, _T]r3  r4  útuple[_T, list[str]]c                ó  ‡— ddl m} t          ¦   «         Šd	ˆfd„}t          j                             |d|¦  «        5  t          j                             ¦   «           | |i |¤Ž}d d d ¦  «         n# 1 swxY w Y   |t          ‰¦  «        fS )
Nr9   r>   ÚcoderP   rO   r  c                ó2   •— ‰                      | ¦  «         d S rš   )r  ©rô  Úsource_codess    €rZ   Úsave_output_codez*run_and_get_code.<locals>.save_output_code<  s   ø€ Ø×Ò˜ÑÔÐÐÐr\   rø  ©rô  rP   rO   r  )
r½  r?   r!   r   Úpatchr_  rU   rë  Úresetr¥  )r±   r’   ræ  r?   rø  r.  r÷  s         @rZ   Úrun_and_get_coderü  3  sî   ø€ ð
 %Ð$Ð$Ð$Ð$Ð$å$.¡L¤L€Lðð ð ð ð ð õ 
Œ×	Ò	˜=Ð*<Ð>NÑ	OÔ	Oð %ð %ÝŒ×ÒÑÔÐØ��TÐ$˜VÐ$Ð$ˆð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð •4˜Ñ%Ô%Ð%Ð%s   ½'A0Á0A4Á7A4c                ó’  — |                      dd¦  «        }t          | g|¢R i |¤Ž\  }}g }|D ]–}t          j        rGt          j        j        dur4|                     t          j        d|t          j	        ¦  «        ¦  «         n3|                     t          j        d|t          j	        ¦  «        ¦  «         |rd„ |D ¦   «         }Œ—||fS )NÚremove_quoteFTzR"TRITON\((.*?)\)TRITON"z	'''.*?'''c                ó"   — g | ]}|d d…         ‘ŒS )r¹  éýÿÿÿrS   )rX   rR  s     rZ   r[   z'run_and_get_kernels.<locals>.<listcomp>T  s    € Ð:Ð:Ð:¨�v˜a ˜d”|Ð:Ð:Ð:r\   )
r_   rü  rt   rn  rw  Úautotune_at_compile_timer»  rÕ   ÚfindallÚDOTALL)r±   r’   ræ  rþ  r.  r÷  Úkernelsrô  s           rZ   Úrun_and_get_kernelsr  E  sÙ   € ð —:’:˜n¨eÑ4Ô4€Lå+¨BÐ@°Ð@Ð@Ð@¸Ð@Ð@Ñ€FˆLØ€GØð ;ð ;ˆÝÔð 	F¥&¤-Ô"HÐPTÐ"TÐ"Tð �NŠN�2œ:Ð&AÀ4ÍÌÑSÔSÑTÔTÐTÐTà�NŠN�2œ: l°D½"¼)ÑDÔDÑEÔEÐEØð 	;Ø:Ð:°'Ð:Ñ:Ô:ˆGøØ�7ˆ?Ðr\   útuple[Any, list[str]]c                ó.   ‡ — dˆ fd„}t          |¦  «        S )NrO   r   c                 óh   •—  ‰¦   «         } |                       ¦   «                              ¦   «          | S rš   )rX  rp  )r.  r±   s    €rZ   Úrun_with_backwardz1run_fw_bw_and_get_code.<locals>.run_with_backwardY  s-   ø€ Ø�‘”ˆØ�
Š
‰Œ×ÒÑÔÐØˆr\   )rO   r   )rü  )r±   r	  s   ` rZ   Úrun_fw_bw_and_get_coder
  X  s2   ø€ ðð ð ð ð ð õ
 Ð-Ñ.Ô.Ð.r\   c                ób  ‡‡— ddl m} g Šdˆfd„Šdˆfd„}t          j                             |d|¦  «        5  t          j                             |d‰¦  «        5  t
          j                             ¦   «           | |i |¤Ž}ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ‰S )zLGet the inductor-generated code, but skip any actual compilation or running.r9   r>   rô  rP   rO   r  c                ó2   •— ‰                      | ¦  «         d S rš   ©rí  rö  s    €rZ   rø  z"get_code.<locals>.save_output_codeg  s   ø€ Ø×Ò˜DÑ!Ô!Ð!Ð!Ð!r\   r7  r?   r   c                óÚ   •—  G d„ d¦  «        }| j         r|                      ¦   «         n|                      ¦   «         \  }} ‰|j        ¦  «         |r ‰|j        ¦  «          |¦   «         S )Nc                  ó"   — e Zd ZdZd
d„Zdd„Zd	S )ú@get_code.<locals>.patched_compile_to_module.<locals>.DummyModulez4This is empty to replace the generated triton modulerO   r  c                ó   — d S rš   rS   rØ  s    rZ   rÉ  zIget_code.<locals>.patched_compile_to_module.<locals>.DummyModule.__init__n  s   € Ø�r\   r’   r   ræ  c                ó   — d S rš   rS   r6  s      rZ   ÚcallzEget_code.<locals>.patched_compile_to_module.<locals>.DummyModule.callq  s   € à�r\   Nr.  ©r’   r   ræ  r   rO   r  )rž   rŸ   r    r¡   rÉ  r  rS   r\   rZ   ÚDummyModuler  k  sB   € € € € € ØFÐFðð ð ð ðð ð ð ð ð r\   r  )rn  Úcodegen_with_cpp_wrapperÚcodegenr—   )r7  r  Úwrapper_codeÚkernel_coderø  s       €rZ   Úpatched_compile_to_modulez+get_code.<locals>.patched_compile_to_modulej  s˜   ø€ ð	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 04Ô/?ÐSˆD×)Ò)Ñ+Ô+Ð+ÀTÇ\Â\Á^Ä^ñ 	"ˆ�kð 	Ð˜Ô+Ñ,Ô,Ð,Øð 	0ØÐ˜[Ô.Ñ/Ô/Ð/àˆ{‰}Œ}Ðr\   Úcompile_to_modulerø  Nrù  )r7  r?   rO   r   )r½  r?   r   rú  r_  rU   rë  rû  )r±   r’   ræ  r?   r  rÃ   rø  r÷  s         @@rZ   Úget_coder  a  st  øø€ à$Ð$Ð$Ð$Ð$Ð$à €Lð"ð "ð "ð "ð "ð "ðð ð ð ð ð õ, 	Œ
×ÒØÐ.Ð0Iñ	
ô 	
ð ð  õ 	Œ
×Ò˜-Ð);Ð=MÑNÔNð	 ð  õ 	Œ×ÒÑÔÐàˆB�Ð˜ÐÐˆð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð Ðs5   ¸"B$Á'BÂB$ÂB	ÂB$ÂB	ÂB$Â$B(Â+B(c                óž   — t          | g|¢R i |¤Ž}dt          |¦  «        cxk    rdk    sn J dt          |¦  «        › �¦   «         ‚|d         S ©Nr9   rí  z%expected one or two code outputs got r   )r  r^   )r±   r’   ræ  r÷  s       rZ   Úget_triton_coder  Œ  ss   € å˜BÐ0 Ð0Ð0Ð0¨Ð0Ð0€Là•�LÑ!Ô!Ð&Ð&Ò&Ð& QÒ&Ð&Ð&Ð&Ð&ØCµ°LÑ0AÔ0AÐCÐCñ 'Ô&Ð&ð ˜Œ?Ðr\   c                ó¤   — t          | g|¢R i |¤Ž\  }}dt          |¦  «        cxk    rdk    sn J dt          |¦  «        › �¦   «         ‚|d         S r  )rü  r^   )r±   r’   ræ  rÃ   r÷  s        rZ   Úrun_and_get_triton_coder!  –  sy   € õ ' rÐ;¨DÐ;Ð;Ð;°FÐ;Ð;�O€A€|à•�LÑ!Ô!Ð&Ð&Ò&Ð& QÒ&Ð&Ð&Ð&Ð&ØCµ°LÑ0AÔ0AÐCÐCñ 'Ô&Ð&ð ˜Œ?Ðr\   útuple[Any, list[GraphLowering]]c                óÌ   ‡‡‡— ddl mŠ ddlm} |j        Šg Šdˆˆˆfd	„}t
          j                             |d
|¦  «        5   | |i |¤Ž}d d d ¦  «         n# 1 swxY w Y   |‰fS )Nr   r>   rF   r’   r   ræ  rO   r  c                 óv   •—  ‰| i |¤Ž | d         }t          |‰¦  «        sJ ‚‰                     |¦  «         d S )Nrí  )rŒ   rí  )r’   ræ  r½  r?   Úgraph_loweringsÚ	real_inits      €€€rZ   Ú	fake_initz-run_and_get_graph_lowering.<locals>.fake_init«  sQ   ø€ Øˆ	�4Ð"˜6Ð"Ð"Ð"Ø�Q”ˆÝ˜% Ñ/Ô/Ð/Ð/Ð/Ø×Ò˜uÑ%Ô%Ð%Ð%Ð%r\   rÉ  r  )Útorch._inductor.graphr?   Útorch._inductor.output_coderG   rÉ  r   rú  r_  )	r±   r’   ræ  rG   r'  r.  r?   r%  r&  s	         @@@rZ   Úrun_and_get_graph_loweringr*  ¢  sò   øøø€ ð 4Ð3Ð3Ð3Ð3Ð3Ø;Ð;Ð;Ð;Ð;Ð;àÔ(€IØ€Oð&ð &ð &ð &ð &ð &ð &ð &õ 
Œ×	Ò	˜?¨J¸	Ñ	BÔ	Bð %ð %Ø��TÐ$˜VÐ$Ð$ˆð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð �?Ð"Ð"s   Á	AÁAÁAÚaten_opÚoverride_fnc              #  ó¦   K  — ddl m} |j        |          }	 t          j        ||¦  «        |j        | <   dV — ||j        | <   dS # ||j        | <   w xY w)z
    Override the lowering of aten_op with override_fn.
    The first argument of override_fn is the original lowering fn.
    r   )ÚloweringN)Útorch._inductorr.  Ú	loweringsrH  Úpartial)r+  r,  r.  Úorig_fns       rZ   Úoverride_loweringr3  ·  s{   è è € ð )Ð(Ð(Ð(Ð(Ð(àÔ  Ô)€Gð.Ý&/Ô&7¸ÀWÑ&MÔ&MˆÔ˜7Ñ#Øˆˆˆà&-ˆÔ˜7Ñ#Ð#Ð#ø gˆÔ˜7Ñ#Ð-Ð-Ð-Ð-s   —!A ÁAÚpre_fnÚpost_fnúCallable[..., Any] | Nonec                ó~   ‡ ‡‡— ddl m} |j        Šd	ˆˆˆ fd„}t          j        j                             |d|¦  «        S )
zr
    Add hook functions to be called at the beginning and end of Scheduler.__init__.
    Used for unit tests.
    r   )Ú	Schedulerr&  r   r³  rO   c                óT   •—  ‰| |¦  «          ‰| |¦  «        }‰r ‰| |¦  «         |S rš   rS   )r&  r³  Úoutr2  r5  r4  s      €€€rZ   rK  z(add_scheduler_init_hook.<locals>.wrapperÔ  sE   ø€ Øˆˆy˜%Ñ Ô Ð Øˆg�i Ñ'Ô'ˆØð 	&ØˆG�I˜uÑ%Ô%Ð%Øˆ
r\   rÉ  )r&  r   r³  r   rO   r   )Útorch._inductor.schedulerr8  rÉ  Úunittestr   rú  r_  )r4  r5  r8  rK  r2  s   ``  @rZ   Úadd_scheduler_init_hookr=  É  sh   øøø€ ð 4Ð3Ð3Ð3Ð3Ð3àÔ €Gðð ð ð ð ð ð ð õ Œ=Ô×%Ò% i°¸WÑEÔEÐEr\   Úmsgc                óŠ   — t           j        rt                               | ¦  «         dS t                               | ¦  «         dS )z·
    Warnings that will be actionable for PyTorch developers, but not
    end users.  Allows us to easily disable them in stable releases but
    keep them on for nightly builds.
    N)rt   Údeveloper_warningsrî   r€  Úinfo)r>  s    rZ   Údeveloper_warningrB  Þ  s:   € õ Ô ð Ý�Š�CÑÔÐÐÐå�Š�‰Œˆˆˆr\   c                 óÖ  — 	 t           j                             d¦  «        } | dz   t          t           j        ¦  «        k     rZt          t           j        | dz            ¦  «        dk    r4t           j        | dz            d         dk    rt           j        | dz            S n# t          $ r Y nw xY wt           j        D ]0}|                     d¦  «        r|t          d¦  «        d…         c S Œ1dS )a  
    An experimental API used only when config.benchmark_kernel is true.

    The benchmark name is only available at codegen time. So we can not
    directly call it in benchmark_all_kernels which is run after codegen.

    The function assumes the argument after --only is the benchmark name.
    It works for torchbench.py/hugginface.py/timm_models.py. But for ad-hoc
    scripts, this function may return None.

    There are 2 flavors of --only argument we need to handle:
    1. --only model_name
    2. --only=model_name
    z--onlyr9   r   rô  z--only=N)rH  Úargvr?  r^   Ú
ValueErrorrJ  )r„  rê  s     rZ   Úget_benchmark_namerF  ê  sì   € ð	ÝŒh�nŠn˜XÑ&Ô&ˆà�!‰G•c�#œ(‘m”mÒ#Ð#Ý•C”H˜S 1™WÔ%Ñ&Ô&¨Ò*Ð*Ý”˜˜q™Ô! !Ô$¨Ò+Ð+å”8˜C !™GÔ$Ð$øøÝð ð ð Øˆðøøøõ Œxð )ð )ˆØ�>Š>˜)Ñ$Ô$ð 	)Ø•s˜9‘~”~Ð'Ð'Ô(Ð(Ð(Ð(ð	)ð ˆ4s   ‚BB Â
B)Â(B)r·  c                ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3  ó"   K  — | ]
}|d k    V — ŒdS rd  rS   rW   s     rZ   rÜ   zis_ones.<locals>.<genexpr>  ó&   è è € Ð%Ð%˜!ˆq�AŠvÐ%Ð%Ð%Ð%Ð%Ð%r\   ©r�   ©r·  s    rZ   Úis_onesrL    ó   € ÝÐ%Ð%˜uÐ%Ñ%Ô%Ñ%Ô%Ð%r\   c                ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3  ó"   K  — | ]
}|d k    V — ŒdS )r   NrS   rW   s     rZ   rÜ   zis_zeros.<locals>.<genexpr>  rI  r\   rJ  rK  s    rZ   Úis_zerosrP    rM  r\   ÚinputsúSequence[torch.Tensor]c                ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3  ó„   K  — | ];}t          |t          j        ¦  «        ¯|j        t          j        d ¦  «        k    V — Œ<dS )r=  N)rŒ   rU   rò  rº   )rX   rí   s     rZ   rÜ   z is_cpu_device.<locals>.<genexpr>  sY   è è € ð ð àÝ�d�EœLÑ)Ô)ðØŒ•u”| EÑ*Ô*Ò*ðð ð ð ð ð r\   rJ  )rQ  s    rZ   Úis_cpu_devicerU    s0   € Ýð ð àðñ ô ñ ô ð r\   c                óˆ   — t          | t          j        ¦  «        s
J d¦   «         ‚| j        rt          j        S t          j        S )Nz8only support sympy.Expr as input to get_sympy_Expr_dtype)rŒ   r�   rs  r£   rU   rœ  r�  r¶  s    rZ   Úget_sympy_Expr_dtyperW    sG   € Ý�c�5œ:Ñ&Ô&ð ð ØBñô Ð&ð „~ð ÝŒ{ÐåŒ}Ðr\   Úshould_profileúIterator[Any]c              /  ó€   K  — | r5t          j        j        |i |¤Ž5 }|V — d d d ¦  «         d S # 1 swxY w Y   d S d V — d S rš   )rU   ræ   rç   )rX  r’   ræ  rú   s       rZ   Úmaybe_profiler[  %  sŸ   è è € àð ÝŒ^Ô# TÐ4¨VÐ4Ð4ð 	¸ØˆGˆGˆGð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ˆˆˆˆˆs   ›-­1´1c                 óZ   — t           j        j        } | dk     rt          j        ¦   «         } | S ©Nr9   )rt   rØ  ÚthreadsrU   Úget_num_threads)r^  s    rZ   rÞ  rÞ  .  s(   € ÝŒjÔ €GØ�‚{€{ÝÔ'Ñ)Ô)ˆØ€Nr\   c                 ót   — ddl m}   | ¦   «         }|                     dt          j        j        rdnd¦  «        S )Nr9   )Úget_backend_optionsÚ
num_stagesrí  r¹  )Úruntime.triton_helpersra  rµ  rU   rº  r}   )ra  Úoptionss     rZ   Úget_backend_num_stagesre  5  sD   € à;Ð;Ð;Ð;Ð;Ð;à!Ð!Ñ#Ô#€GØ�;Š;�|­%¬-Ô*;Ð%B Q QÀÑCÔCÐCr\   c                óö  — t          | t          j        j        j        j        dk    ¬¦  «        }|�|S t          j                             ¦   «         st                               d¦  «         dS ddl	m
}m} t          j                             ¦   «         o!t          j                             ¦   «         dk    }| t          j        t          j        t          j        fv sJ ‚t!          j        |¦  «        j                             d	¦  «        rƒdd
lm}  |¦   «         }| t          j        t          j        fv r|r || |¦  «        S t          j        j        j        j        dk    r |t          j        |¦  «        S  |t          j        |¦  «        S | t          j        t          j        fv r|r || ¦  «        S t          j        j        j        j        dk    r |t          j        ¦  «        S  |t          j        ¦  «        S )z¨
    We don't want to throw errors in this function. First check to see if the device is in device_info.py,
    then fall back to the inaccurate triton estimation.
    Útf32)Úis_tf32Nz‡get_device_tflops: no Triton fallback available for non-CUDA devices. Returning 0.0; roofline estimates will use memory bandwidth only.r  r   )Úget_max_simd_tflopsÚget_max_tensorcore_tflops)r‚   r   Ú
clock_rate)Úmax_clock_rate)r   rU   ÚbackendsrJ   ÚmatmulÚfp32_precisionrV   rî   r€  Útriton.testingri  rj  r•  rá   rŒ  rŽ  ÚinspectÚ	signatureÚ
parametersrµ  Útorch._utils_internalrl  )r¹   Úds_topsri  rj  ÚSM80OrLaterrl  Úsm_clocks          rZ   Úget_device_tflopsrx  =  sô  € õ Ø•u”~Ô*Ô1Ô@ÀFÒJðñ ô €Gð ÐØˆåŒ:×"Ò"Ñ$Ô$ð Ý�ŠðPñ	
ô 	
ð 	
ð ˆsàMÐMÐMÐMÐMÐMÐMÐMå”*×)Ò)Ñ+Ô+ð µ´
×0PÒ0PÑ0RÔ0Rð Wò 1€Kð
 •U”]¥E¤NµE´MÐBÐBÐBÐBÐBåÔÐ,Ñ-Ô-Ô8×<Ò<¸\ÑJÔJð 6à8Ð8Ð8Ð8Ð8Ð8à!�>Ñ#Ô#ˆØ•U”]¥E¤NÐ3Ð3Ð3¸Ð3Ø,Ð,¨U°HÑ=Ô=Ð=åŒ>ÔÔ%Ô4¸Ò>Ð>Ø,Ð,­U¬]¸HÑEÔEÐEà&Ð&¥u¤}°hÑ?Ô?Ð?à•U”]¥E¤NÐ3Ð3Ð3¸Ð3Ø,Ð,¨UÑ3Ô3Ð3åŒ>ÔÔ%Ô4¸Ò>Ð>Ø,Ð,­U¬]Ñ;Ô;Ð;à&Ð&¥u¤}Ñ5Ô5Ð5r\   c                 ó"   — ddl m}   | ¦   «         S )Nr   ©Úget_dram_gbps)rp  r{  rz  s    rZ   Úget_gpu_dram_gbpsr|  o  s    € à,Ð,Ð,Ð,Ð,Ð,àˆ=‰?Œ?Ðr\   c                 ót   — ddl m}  | j        j                             d¦  «                             dd¦  «        S )Nr   ©rV  Úmax_shared_mem)Útriton.runtimerV  rW  rX  rŽ  rµ  r~  s    rZ   Úget_gpu_shared_memoryr�  v  s>   € Ø%Ð%Ð%Ð%Ð%Ð%àŒ=Ô×4Ò4°QÑ7Ô7×;Ò;Ð<LÈaÑPÔPÐPr\   c                 ó   — t           j                             ¦   «         rXt          j        dt           j                             ¦   «         ¦  «        } t          j        | ¦  «        }|j        }|j        }|€J ‚nd}d}||z  S )NrJ   rõ  i   )	rU   rJ   rV   rº   rB  r   rˆ  Úwarp_size_or_defaultÚmax_threads_per_block)rº   ÚpropsÚ	warp_sizer„  s       rZ   Úget_max_numwarpsr‡  |  s   € Ý„z×ÒÑ Ô ð 	%Ý”˜f¥e¤j×&?Ò&?Ñ&AÔ&AÑBÔBˆÝ Ô'¨Ñ/Ô/ˆØÔ.ˆ	Ø %Ô ;ÐØ$Ð0Ð0Ð0Ð0ð ˆ	Ø $ÐØ  IÑ-Ð-r\   Úreduction_typec                ó,   — |                       d¦  «        S )NÚwelford)rJ  ©rˆ  s    rZ   Úis_welford_reductionrŒ  Š  s   € Ø×$Ò$ YÑ/Ô/Ð/r\   c                ó4   — t          | ¦  «        rdS | dv rdS dS )Nr¹  )Úargmax_with_valueÚargmin_with_valueÚonline_softmax_reducerí  r9   )rŒ  r‹  s    rZ   Úreduction_num_outputsr‘  Ž  s5   € Ý˜NÑ+Ô+ð 	ØˆqØ	ð ð 
ð 
ð
 ˆqàˆqr\   c                 ó0   — t          j        ¦   «         dk    S )NÚLinux)ÚplatformÚsystemrS   r\   rZ   Úis_linuxr–  ›  s   € ÝŒ?ÑÔ Ò'Ð'r\   c                 ó"   — t           j        dk    S )Nrv   )rH  r”  rS   r\   rZ   rŠ  rŠ  Ÿ  s   € ÝŒ<˜7Ò"Ð"r\   Úitrc                ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3  óZ   K  — | ]&}t          |t          j        ¦  «        o|j         V — Œ'd S rš   )rŒ   r�   rs  r|  rW   s     rZ   rÜ   z#has_free_symbols.<locals>.<genexpr>¤  s7   è è € ÐJÐJÀ�z˜!�UœZÑ(Ô(Ð<°´¨_ÐJÐJÐJÐJÐJÐJr\   r(  )r˜  s    rZ   rÛ  rÛ  £  s   € ÝÐJÐJÀcÐJÑJÔJÑJÔJÐJr\   c            	     ót  — ddl m} | D ]®}t          ||j        |j        |j        |j        |j        f¦  «        rJt          | 	                    ¦   «         pd¦  «        s#t          | 
                    ¦   «         pd¦  «        r dS Œzt          ||j        ¦  «        sŒ�t          dt          |¦  «        › �¦  «        ‚dS )Nr9   r[  rS   Tzunexpected type for is_dynamic F)r`  r\  rŒ   r’  r”  rÜ  rÛ  r@   rÛ  Úmaybe_get_sizeÚmaybe_get_striderB   Ú	TypeErrorr@  )r’   r\  r]  s      rZ   rH  rH  §  sæ   € ØÐÐÐÐÐàð Ið IˆÝØ�”˜bœm¨R¬[¸"Ô:KÈRÌYÐWñ
ô 
ð 
	Iõ   × 0Ò 0Ñ 2Ô 2Ð 8°bÑ9Ô9ð Õ=MØ×"Ò"Ñ$Ô$Ð*¨ñ>ô >ð ð �t�tðõ ˜A˜rœyÑ)Ô)ð 	IØåÐG½dÀ1¹g¼gÐGÐGÑHÔHÐHàˆ5r\   c                  ó   — e Zd ZdZdZdS )ÚPlaceholderÚKERNEL_NAMEÚDESCRIPTIVE_NAMEN)rž   rŸ   r    r¡  r¢  rS   r\   rZ   r   r   »  s   € € € € € ð  €Kð *ÐÐÐr\   r   rú  r6   Úinpc                óš  — ddl m} t          j        dd¬¦  «        5 }t	          j        ¦   «         }t	          j        ¦   «         } t          |t          |¦  «        ¬¦  «        j        |Ž  t          d|j
        › �|¬¦  «         t          |j
        |¬¦  «         t          j        ¦   «         }t          ||¦  «        5   | |j
        ¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        ¦   «         |z
  }	 ||j
        ¦  «         |j
                             ¦   «          |                     ¦   «          t          d	|j
        › �|¬¦  «         t          |j
        |¬¦  «         |                     ¦   «         |                     ¦   «         k    }
t"                               d
||j        |
|	¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr9   )Ústable_topological_sortrÊ  zutf-8)ÚmodeÚencoding)r÷  Ú	fake_modezBefore:
)ÚfilezAfter:
zZ%s, save before/after graph to %s, graph before/after are the same = %s, time elapsed = %s)Úpattern_matcherr¥  r…  ÚNamedTemporaryFileÚior   rh   rd   Ú	propagater  r½  r   Únowrg   ÚlintÚ	recompilerÒ  rî   rA  r×   )rú  r÷  r£  r>  r¥  r|  Ú	before_ioÚafter_ioÚ
start_timeÚtime_elapsedr]  s              rZ   Úpass_execution_and_saverµ  Å  sA  € ð 9Ð8Ð8Ð8Ð8Ð8å	Ô	$ØØð
ñ 
ô 
ð 
ð 
Ý”K‘M”Mˆ	Ý”;‘=”=ˆØC�	�RÕ#3°CÑ#8Ô#8Ð9Ñ9Ô9ÔCÀSÐIÐIÝÐ$˜"œ(Ð$Ð$¨1Ð-Ñ-Ô-Ð-ÝˆbŒh˜YÐ'Ñ'Ô'Ð'Ý”\‘^”^ˆ
Ý# B¨Ñ,Ô,ð 	ð 	ØˆD�”‰NŒNˆNð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	å”|‘~”~¨
Ñ2ˆàÐ ¤Ñ)Ô)Ð)Ø
Œ�Š‰ŒˆØ
�Š‰ŒˆåÐ#˜œÐ#Ð#¨!Ð,Ñ,Ô,Ð,ÝˆbŒh˜XÐ&Ñ&Ô&Ð&Ø×ÒÑ Ô  H×$5Ò$5Ñ$7Ô$7Ò7ˆÝ�ŠØhØØŒFØØñ	
ô 	
ð 	
ð+
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s7   �BG Â<CÃG ÃC	ÃG Ã C	Ã!CG Ç GÇGÚ	input_bufúBuffer | Operation | Nonec                ó`   — ddl m} t          | |j        ¦  «        o|                      ¦   «         S )zB
    Check if input buffer is a multi-outputs template buffer
    r9   r[  )r`  r\  rŒ   rÞ  Úis_multi_outputs_template©r¶  r\  s     rZ   r¹  r¹  è  sA   € ð ÐÐÐÐÐõ 	�9˜bÔ/Ñ0Ô0ð 	2Ø×/Ò/Ñ1Ô1ðr\   c                óœ   — ddl m} t          | |j        ¦  «        o1t	          | j        ¦  «        dk    ot          | j        d         ¦  «        S )zL
    Check if input buffer is a output of multi-outputs template buffer
    r9   r[  r   )r`  r\  rŒ   ÚMultiOutputr^   rQ  r¹  rº  s     rZ   Ú#is_output_of_multi_outputs_templater½  ô  s\   € ð ÐÐÐÐÐõ 	�9˜bœnÑ-Ô-ð 	;Ý�	Ô Ñ!Ô! QÒ&ð	;å% iÔ&6°qÔ&9Ñ:Ô:ðr\   r´  úNode | Operation | Noneútorch._ops.OperatorBase | Nonec                óD  — | €dS ddl m} t          | |j        ¦  «        o"t          | |j        ¦  «         o|d u p| j        |u pÞt          | ¦  «        |j        u oÈt          t          j
        j        d¦  «        o#| j        t          j
        j        j        j        k    p…t          t          j
        j        d¦  «        o#| j        t          j
        j        j        j        k    pBt          t          j
        j        d¦  «        o#| j        t          j
        j        j        j        k    S )NFr9   r[  Úall_to_all_singleÚall_gather_into_tensorÚreduce_scatter_tensor)r`  r\  rŒ   Ú_CollectiveKernelÚ_WaitKernelÚop_overloadr@  ÚFallbackKernelr6  rU   r7  ÚtorchrecrÁ  ÚdefaultrÂ  rÃ  ©r´  rÇ  r\  s      rZ   Úis_collectiverË    s%  € ð €|ØˆuàÐÐÐÐÐõ 	�4˜Ô-Ñ.Ô.ð 	3Ý˜4 ¤Ñ0Ô0Ð0ð	3à�4ˆZÐ1˜4Ô+¨rÐ1ðõ 	ˆT‰
Œ
�bÔ'Ð'ð 	
õ
 �œ	Ô*Ð,?Ñ@Ô@ð UØÔ$­¬	Ô(:Ô(LÔ(TÒTðõ
 �œ	Ô*Ð,DÑEÔEð EØÔ$Ý”9Ô%Ô<ÔDòEðõ �œ	Ô*Ð,CÑDÔDð YØÔ$­¬	Ô(:Ô(PÔ(XÒXð/r\   úIRNode | Operation | Nonec                ó:   — ddl m} t          | ¦  «        |j        u S ©Nr9   r[  )r`  r\  r@  rÅ  )r´  r\  s     rZ   Úis_waitrÏ  )  s'   € ØÐÐÐÐÐå�‰:Œ:˜œÐ'Ð'r\   ÚsnoderH   Ú	filter_fnú*Callable[[BaseSchedulerNode], bool] | Nonec                ó°   — ddl m} t          | |¦  «        rt          d„ | j        D ¦   «         ¦  «        S t          | j        ¦  «        o|d u p
 || ¦  «        S )Nr   ©ÚGroupedSchedulerNodec              3  ó4   K  — | ]}t          |¦  «        V — Œd S rš   )Úcontains_collectiverW   s     rZ   rÜ   z&contains_collective.<locals>.<genexpr>6  s+   è è € Ð@Ð@¨aÕ& qÑ)Ô)Ð@Ð@Ð@Ð@Ð@Ð@r\   )r;  rÕ  rŒ   rÍ  ÚsnodesrË  r´  )rÐ  rÑ  rÕ  s      rZ   r×  r×  /  sr   € ð ?Ð>Ð>Ð>Ð>Ð>å�%Ð-Ñ.Ô.ð AÝÐ@Ð@°5´<Ð@Ñ@Ô@Ñ@Ô@Ð@å˜œÑ$Ô$ÐP¨)°tÐ*;Ð*O¸y¸yÈÑ?OÔ?OÐPr\   c                ó’   — ddl m} t          | |¦  «        rt          d„ | j        D ¦   «         ¦  «        S t          | j        ¦  «        S )Nr   rÔ  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rš   )Úcontains_waitrW   s     rZ   rÜ   z contains_wait.<locals>.<genexpr>?  s*   è è € Ð:Ð:¨•= Ñ#Ô#Ð:Ð:Ð:Ð:Ð:Ð:r\   )r;  rÕ  rŒ   rÍ  rØ  rÏ  r´  )rÐ  rÕ  s     rZ   rÛ  rÛ  ;  sV   € Ø>Ð>Ð>Ð>Ð>Ð>å�%Ð-Ñ.Ô.ð #ÝÐ:Ð:¨U¬\Ð:Ñ:Ô:Ñ:Ô:Ð:å�u”zÑ"Ô"Ð"r\   úOperation | Noneú9torch._ops.OpOverload | Collection[torch._ops.OpOverload]c                óŽ   — ddl m} t          |t          j        j        ¦  «        r|g}t          | |j        ¦  «        o| j        |v S rÎ  )r`  r\  rŒ   rU   rÞ  rß  rÇ  rÆ  rÊ  s      rZ   Úis_fallback_oprß  D  sT   € ð ÐÐÐÐÐå�"•e”jÔ+Ñ,Ô,ð ØˆTˆÝ�d˜BÔ-Ñ.Ô.ÐI°4Ô3CÀrÐ3IÐIr\   Úbuf_nameÚname_to_bufÚname_to_fused_nodec                óL   — |||          j                              ¦   «                  S rš   )Údefining_opr'  )rà  rá  râ  s      rZ   Úbuf_name_to_fused_snoderå  O  s#   € ð ˜k¨(Ô3Ô?×HÒHÑJÔJÔKÐKr\   c                ó   — dS rÓ  rS   ©rÐ  s    rZ   rÔ  rÔ  Z  ó   € °u€ r\   Úcollected_node_setúMutableSet[BaseSchedulerNode]údict[str, SchedulerBuffer]údict[str, BaseSchedulerNode]Úcriteria_cbúCallable[[Any], bool]c                ó¼   —  || ¦  «        rd S |                      | ¦  «         | j        D ]1}t          |j        ||¦  «        }||v rŒt	          |||||¬¦  «         Œ2d S )N©rí  )r  Úunmet_dependenciesrå  r×   Úfind_recursive_deps_of_node)rÐ  ré  rá  râ  rí  ÚdepÚdefining_op_for_deps          rZ   rò  rò  U  s¡   € ð €{�5ÑÔð ØˆØ×Ò˜5Ñ!Ô!Ð!ØÔ'ð 
ð 
ˆÝ5ØŒH�kÐ#5ñ
ô 
Ðð Ð"4Ð4Ð4ØÝ#ØØØØØ#ð	
ñ 	
ô 	
ð 	
ð 	
ð
ð 
r\   c                ó   — dS rÓ  rS   rç  s    rZ   rÔ  rÔ  s  rè  r\   c           	     ó‚  —  || ¦  «        rd S |                      | ¦  «         |                      ¦   «         D ]‡}|j        D ]}}|j        €J ‚|j                             ¦   «         dk    rŒ)|j                             ¦   «         |vrŒE||j                             ¦   «                  }||v rŒit          |||||¬¦  «         Œ~Œˆd S )NÚOUTPUTrð  )r  Úget_outputsrá  r´  r'  Úfind_recursive_users_of_node)rÐ  ré  rá  râ  rí  ÚorÕ  Úuser_ops           rZ   rù  rù  n  s  € ð €{�5ÑÔð ØˆØ×Ò˜5Ñ!Ô!Ð!Ø×ÒÑ Ô ð ð ˆØ”Gð 	ð 	ˆDØ”9Ð(Ð(Ð(ØŒy×!Ò!Ñ#Ô# xÒ/Ð/ØØŒy×!Ò!Ñ#Ô#Ð+=Ð=Ð=ØØ(¨¬×);Ò);Ñ)=Ô)=Ô>ˆGØÐ,Ð,Ð,ØÝ(ØØ"ØØ"Ø'ðñ ô ð ð ð	ðð r\   Údynamo_gm_num_inputsÚaot_fw_gm_num_inputsc                óF   — t           j        j        j        rdnd}|| z
  |z
  S )zaComputes the number of inputs to the aot fw graph which have fixed addresses (params and buffers)rí  r   )rU   Ú
_functorchrt   Úfunctionalize_rng_ops)rü  rý  Únum_rng_seed_offset_inputss      rZ   Únum_fw_fixed_argumentsr  ‹  s2   € õ ÔÔ$Ô:ÐAˆˆÀð ð  Ð"6Ñ6Ð9SÑSÐSr\   Úfx_gc                ó  — d	d„}d}g }| j         j        D ]2}|j        dk    r% ||¦  «        r|                     |¦  «         |dz  }Œ3|t	          t          t          |¦  «        ¦  «        ¦  «        k    sJ ‚t          |¦  «        S )
z>
    Infers which inputs are static for a backwards graph
    rY   r7   rO   rŠ   c                óJ   — d| j         vod| j         vod| j         vod| j         vS )NÚtangentsÚbwd_seedÚbwd_base_offsetÚbwd_rng_stater  rÓ  s    rZ   Úis_saved_tensorz'count_tangents.<locals>.is_saved_tensor›  s@   € à˜aœfÐ$ð .Ø !¤&Ð(ð.à!¨¬Ð/ð.ð   q¤vÐ-ð		
r\   r   rî  r9   )rY   r7   rO   rŠ   )r½  r³  rÇ  rí  r¥  rã   r^   )r  r
  Ú	arg_countÚstatic_arg_idxsr�  s        rZ   Úcount_tangentsr  –  sª   € ð

ð 
ð 
ð 
ð €IØ€OØŒZÔð ð ˆØŒ4�=Ò Ð Øˆ˜qÑ!Ô!ð 2Ø×&Ò& yÑ1Ô1Ð1Ø˜‰NˆIøà�d¥5­¨_Ñ)=Ô)=Ñ#>Ô#>Ñ?Ô?Ò?Ð?Ð?Ð?ÝˆÑÔÐr\   c                óÀ   — g }t          | j        j        ¦  «        D ]A\  }}|j        dk    r n0|j                             d¦  «        r|                     |¦  «         ŒB|S )a  
    Returns indices of backward graph inputs that are always at fixed
    addresses: primals (parameters/buffers/user inputs saved for backward).
    Excludes saved activations which may not be at fixed addresses when
    the forward is partitioned for CUDA graphs.
    rî  Úprimals_)re  r½  r³  rÇ  r×   rJ  rí  )r  Ústatic_idxsr„  r�  s       rZ   Úget_static_bw_input_idxsr  ¯  sn   € ð €KÝ˜DœJÔ,Ñ-Ô-ð $ð $‰ˆˆQØŒ4�=Ò Ð ØˆEØŒ6×Ò˜ZÑ(Ô(ð 	$Ø×Ò˜sÑ#Ô#Ð#øØÐr\   c                  ó:   — e Zd ZU ded<   d
d„Zedd„¦   «         Zd	S )Ú	BoxedBoolrŠ   r—   rO   c                ó   — | j         S rš   )r—   rØ  s    rZ   rã  zBoxedBool.__bool__Ã  s
   € ØŒzÐr\   r  r   úBoxedBool | boolc                óB   — t          | t          ¦  «        r	d| _        | S dS rÓ  )rŒ   r  r—   re  s    rZ   ÚdisablezBoxedBool.disableÆ  s%   € å�c�9Ñ%Ô%ð 	ØˆCŒIØˆJØˆur\   Nr/  )r  r   rO   r  )rž   rŸ   r    r®   rã  r:  r  rS   r\   rZ   r  r  ¿  sS   € € € € € € à€K€K�Kðð ð ð ð ðð ð ñ „\ðð ð r\   r  Úkernel_listc              #  óº   ‡ ‡K  — ddl m} |j        Š	 	 	 ddˆ ˆfd„}t          j                             |d|¦  «        5  d V — d d d ¦  «         d S # 1 swxY w Y   d S )Nr9   r;   Tr7  r<   Úkernel_namerP   r  rÃ  rr  ÚgpurŠ   Úcpp_definitionrO   r   c                óN   •— ‰                      |¦  «          ‰| |||||¦  «        S rš   r  )r7  r  r  rÃ  r  r  r  Úorig_define_kernels         €€rZ   Údefine_kernelz.collect_defined_kernels.<locals>.define_kernelÔ  s;   ø€ ð 	×Ò˜;Ñ'Ô'Ð'Ø!Ð!Ø�+˜{¨H°c¸>ñ
ô 
ð 	
r\   r  )NTN)r7  r<   r  rP   r  rP   rÃ  rr  r  rŠ   r  rr  rO   r   )Úcodegen.wrapperr<   r  r   rú  r_  )r  r<   r  r  s   `  @rZ   Úcollect_defined_kernelsr!  Î  sà   øøè è € à5Ð5Ð5Ð5Ð5Ð5à-Ô;Ðð  $ØØ%)ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
õ 
Œ×	Ò	Ð/°À-Ñ	PÔ	Pð ð Øˆˆˆðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ¾AÁAÁAc                ó   — | dz   S )NÚ__original__rS   r  s    rZ   Ú get_cloned_parameter_buffer_namer$  å  s   € Ø�.Ñ Ð r\   c                ó   — | t           v S rš   )r]   r‰  s    rZ   r¯  r¯  é  s   € Ø•YÐÐr\   c                 ó(   — t           j        j        duS )z,Check if we're running on ROCm/HIP platform.N)rU   rº  r}   rS   r\   rZ   Úis_rocmr'  í  s   € åŒ=Ô DÐ(Ð(r\   Úbackend_namer¡  ú	int | strr†  útuple[str, ...] | Nonec                ó$  — t          ¦   «         sd S 	 ddlm} ddlm}  || ||¦  «        } ||¦  «                             i ¦  «        }n$# t          t          t          t          f$ r Y d S w xY wt          |dd ¦  «        }|€d S t          |¦  «        S )Nr   )Ú	GPUTarget)Úmake_backendÚsupported_fp8_dtypes)r$   Útriton.backends.compilerr,  Útriton.compiler.compilerr-  Úparse_optionsrd  r8  r9  rž  rT   r?  )r(  r¡  r†  r,  r-  rÝ  rd  r.  s           rZ   Ú_triton_supported_fp8_dtypesr2  ò  sÎ   € õ ÑÔð ØˆtðØ6Ð6Ð6Ð6Ð6Ð6Ø9Ð9Ð9Ð9Ð9Ð9ð �˜<¨¨yÑ9Ô9ˆØ�,˜vÑ&Ô&×4Ò4°RÑ8Ô8ˆˆøÝ�K­µ9Ð=ð ð ð Øˆtˆtðøøøõ # 7Ð,BÀDÑIÔIÐØÐ#ØˆtÝÐ%Ñ&Ô&Ð&s   ’7A
 Á
A+Á*A+)Útriton_backendÚtriton_archr†  útorch.device | str | Noner3  r4  úint | str | Nonec               óÜ  — | t           j        t           j        t           j        t           j        fvrdS t          | ¦  «                             d¦  «        }|€á|€dS t          j        |¦  «        }|j        dk    rdS t           j	         
                    ¦   «         sdS |j        }|€t           j	                             ¦   «         }t           j	                             |¦  «        }t          ¦   «         r#d}|j                             d¦  «        d         }nd}|j        dz  |j        z   }t'          |dd ¦  «        }|€t)          d	¦  «        ‚|€
|dk    rd
nd}t+          |||¦  «        }|€dS ||v S )NTr¢  rJ   r}   rž  r   r  r†  z0triton_arch must be provided with triton_backendr�   rõ  )rU   r‚  rƒ  r„  r†  r¨  Úremoveprefixrº   r@  rJ   rV   r?  rB  rŽ  r'  rª  r£  r‰  ÚminorrT   rE  r2  )	r¹   rº   r3  r4  r†  Útriton_dtypeÚdevice_indexÚ
propertiesr.  s	            rZ   Úis_triton_fp8_dtype_supportedr=  	  s‡  € ð ÝÔÝÔÝÔÝÔð	ð ð ð ˆtå˜E‘?”?×/Ò/°Ñ4Ô4€LàÐØˆ>Ø�4Ý”˜fÑ%Ô%ˆØŒ;˜&Ò Ð Ø�4ÝŒz×&Ò&Ñ(Ô(ð 	Ø�4à”|ˆØÐÝ œ:×4Ò4Ñ6Ô6ˆLÝ”Z×5Ò5°lÑCÔCˆ
Ý‰9Œ9ð 	CØ"ˆNØ$Ô0×6Ò6°sÑ;Ô;¸AÔ>ˆKˆKà#ˆNØ$Ô*¨RÑ/°*Ô2BÑBˆKÝ˜J¨°TÑ:Ô:ˆ	àÐÝÐKÑLÔLÐLØÐØ(¨EÒ1Ð1�B�B°rˆ	å7Ø˜ Yñô Ðð Ð#ØˆtØÐ/Ð/Ð/r\   c                ó,   — | dk    ot          | ¦  «        S )NrK   )r¯  r‰  s    rZ   Údevice_need_guardr?  =  s   € Ø�UŠ?Ð-�v f™~œ~Ð-r\   c                ó6  — | t           j        k    r@t           j                             ¦   «         r"t           j                             ¦   «         dk     S | t           j        k    r t           j                             ¦   «         rdS | t           j        t           j        fv S )N)rƒ  r   T)rU   rŒ  rJ   rV   r•  rL   rœ  rŠ   r¸  s    rZ   Ú,needs_fallback_due_to_atomic_add_limitationsrA  A  st   € Ø•”ÒÐ¥5¤:×#:Ò#:Ñ#<Ô#<ÐÝŒz×/Ò/Ñ1Ô1°FÒ:Ð:Ø	•%”.Ò	 Ð	 ¥U¤Y×%;Ò%;Ñ%=Ô%=Ð	 Øˆtà�œ¥e¤jÐ1Ð1Ð1r\   rÆ  Ú
self_dtypeÚ	src_dtypeÚsrc_device_typeÚsrc_is_tensorc                ó*  — | j         t          j        j        j        t          j        j        j        fv r|€dS | j         t          j        j        j        k    rdnd}|d |fvp³|ot          |¦  «        ot          |¦  «        p“| j         t          j        j        j        k    oA|dk    o;|o9|dk    o3t          j
        j        o"t          j
        j        pt          ¦   «         dk    p2||k    o|t          j        t          j        fv pt          j        ¦   «         S )NFr  rX  r=  r9   )ÚoverloadpacketrU   r7  ÚatenÚscatter_reduce_Úscatter_reduceÚscatter_r¯  rA  rt   rØ  Úfallback_scatter_reduce_sumÚdynamic_threadsrÞ  rŠ   rœ  Ú$are_deterministic_algorithms_enabled)rÆ  rˆ  rB  rC  rD  rE  Ú	reduce_tys          rZ   Úuse_scatter_fallbackrP  J  s=  € ð 	Ô"ÝŒIŒNÔ*­E¬I¬NÔ,IÐJð	Kð 	KàÐ"àˆuð Ô+­u¬y¬~Ô/FÒFÐFˆˆÈEð ð
 	˜t YÐ/Ð/ð 	8àð HÝ�Ñ'Ô'ðHå<¸YÑGÔGð		8ð Ô&­%¬)¬.Ô*HÒHð LØ %Ò'ðLàðLð   5Ò(ðLõ ”
Ô6ð	Lõ
 ”Ô+ÐJÕ/CÑ/EÔ/EÈÒ/Jð	8ð ˜iÒ'ÐS¨J½5¼:ÅuÄ{Ð:SÐ,Sð	8õ Ô5Ñ7Ô7ð!r\   c                óÆ  — ddl m}m} ddlm} t          dt          | ¦  «        › d�¦  «         t          | ¦  «        D �]!\  }}t          d|d›d�¦  «         ||u rt          d	¦  «         Œ.||u rt          d
¦  «         ŒBt          ||¦  «        r²| 	                    ¦   «         }t          |rdnd› d�¦  «         |r*|j
        €J ‚t          d|j
        j        j        › �¦  «         t          d¦  «         |j        j        D ]}t          |¦  «         Œt          d¦  «         |j        j        D ]}t          |¦  «         Œ�Œt!          dt#          |¦  «        › �¦  «        ‚dS )z�
    An API that can be used in pdb to dump a node_schedule.
    Right mainly dump the read/write dependencies but can add more as needed.
    r   )ÚDisableReductionÚEnableReduction)ÚSchedulerNodezNode schedule with z nodesr  Ú3rž  zenable reductionzdisable reductionÚredÚpwz scheduler nodeNzoriginal reduction hint zReadDep:z	WriteDep:zUnrecognized node type: )Útorch._inductor.codegen.simdrR  rS  r;  rT  r  r^   re  rŒ   Úis_reductionr´  r“  Úreduction_hintr§  r¨  r©  r  r@  )rW  rR  rS  rT  r„  r´  Úis_redró  s           rZ   Údump_node_scheduler\  q  sÊ  € ð
 OÐNÐNÐNÐNÐNÐNÐNØ7Ð7Ð7Ð7Ð7Ð7å	Ð
:¥ MÑ 2Ô 2Ð
:Ð
:Ð
:Ñ;Ô;Ð;Ý˜}Ñ-Ô-ð Hñ H‰	ˆˆTÝˆl�#ˆlˆlˆlˆlÑÔÐà�?Ð"Ð"ÝÐ$Ñ%Ô%Ð%Ð%àÐ%Ð%Ð%ÝÐ%Ñ&Ô&Ð&Ð&Ý˜˜mÑ,Ô,ð 	HØ×&Ò&Ñ(Ô(ˆFÝ˜fÐ.�U�U¨$Ð?Ð?Ð?Ñ@Ô@Ð@Øð RØ”yÐ,Ð,Ð,ÝÐP°´´Ô1NÐPÐPÑQÔQÐQÝ�*ÑÔÐØÔ'Ô-ð ð �Ý�c‘
”
�
�
Ý�+ÑÔÐØÔ'Ô.ð ð �Ý�c‘
”
�
�
ñõ ÐF½$¸t¹*¼*ÐFÐFÑGÔGÐGð+Hð Hr\   rê   rë  c                óŠ   — ddl m}  ||                      ¦   «         t          | j        ¦  «        z  t
          z  dk    ¦  «        S )Nr   )r  )r/  r  Ústorage_offsetrº  r¹   ÚGPU_ALIGN_BYTES)rê   r  s     rZ   Útensor_is_alignedr`  ’  sU   € ð LÐKÐKÐKÐKÐKà Ð Ø	×	Ò	Ñ	 Ô	 ¥>°&´,Ñ#?Ô#?Ñ	?Å?ÑRÐVWÒWñô ð r\   Úexample_inputc                ón   — t          | j        j        ¦  «        sdS t          j        pt          | ¦  «        S rÓ  )r¯  rº   r@  rt   Úassume_aligned_inputsr`  )ra  s    rZ   Úshould_assume_input_alignedrd     s6   € õ �-Ô&Ô+Ñ,Ô,ð ØˆuÝÔ'ÐKÕ+<¸]Ñ+KÔ+KÐKr\   r  c                 óþ   — t           j        j                             ¦   «         } | st	          j        ¦   «         S | j        r| j        j        st	          j        ¦   «         S | j        j        }|                     ¦   «         S rš   )	rU   Ú_guardsÚTracingContextÚtry_getr  Únullcontextr¨  r¿  Úsuppress_guards)Útracing_contextr¿  s     rZ   Ú#maybe_get_suppress_shape_guards_ctxrl  ©  sw   € õ
 ”mÔ2×:Ò:Ñ<Ô<€OØð (ÝÔ%Ñ'Ô'Ð'ð Ô$ð (¨OÔ,EÔ,Oð (ÝÔ%Ñ'Ô'Ð'ØÔ)Ô3€IØ×$Ò$Ñ&Ô&Ð&r\   útuple[_T, str]c                ó  — t           j        j                             t          dd¦  «        5  t
          j                             ¦   «          dd l}dd l	} |j
        ¦   «         } |j        |¦  «        }ddlm} |                     |¦  «         |j        }|                     |j        ¦  «          | |i |¤Ž}	|                     ¦   «         }
|                     |¦  «         |                     |¦  «         d d d ¦  «         n# 1 swxY w Y   |	|
fS )Nrï   Tr   )Úoutput_code_log)r<  r   rú  r_  rt   rU   rë  rû  r¬  r(  r   ÚStreamHandlerÚtorch._inductor.codecachero  Ú
addHandlerÚlevelÚsetLevelr)  rÒ  ÚremoveHandler)r±   r’   ræ  r¬  r(  Úlog_capture_stringÚchro  Ú
prev_levelr.  rÊ   s              rZ   Úrun_and_get_cpp_codery  ¹  sZ  € õ 
ŒÔ	×	#Ò	#¥F¨G°TÑ	:Ô	:ð *ð *ÝŒ×ÒÑÔÐØˆ	ˆ	ˆ	Øˆˆˆà(˜Rœ[™]œ]ÐØ"ˆWÔ"Ð#5Ñ6Ô6ˆØ=Ð=Ð=Ð=Ð=Ð=à×"Ò" 2Ñ&Ô&Ð&Ø$Ô*ˆ
Ø× Ò  ¤Ñ/Ô/Ð/Ø��TÐ$˜VÐ$Ð$ˆØ×'Ò'Ñ)Ô)ˆØ× Ò  Ñ,Ô,Ð,Ø×%Ò% bÑ)Ô)Ð)ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *ð  �1ˆ9Ðs   ¬CD Ä DÄDúSequence[InputType]úShapeEnv | Nonec                óÈ  — t          | ¦  «        }|�|j        S | D ]Æ}t          |t          j        ¦  «        r|j        j        c S t          |t          j        ¦  «        r‚|                     ¦   «         D ],}t          |t          j        ¦  «        r|j        j        c c S Œ-|                     ¦   «         D ],}t          |t          j        ¦  «        r|j        j        c c S Œ-ŒÇd S rš   )	rd   r¿  rŒ   rU   r4   r´  rò  r_  r¢  )rQ  r¨  Úinputr_  r¢  s        rZ   Úshape_env_from_inputsr~  Ò  s  € Ý  Ñ(Ô(€Ið ÐØÔ"Ð"ð ð 1ð 1ˆÝ�e�Uœ\Ñ*Ô*ð 	(Ø”:Ô'Ð'Ð'Ð'õ �e�Uœ\Ñ*Ô*ð 	1ØŸ
š
™œð /ð /�Ý˜d¥E¤LÑ1Ô1ð /Øœ9Ô.Ð.Ð.Ð.Ð.Ð.ð/àŸ,š,™.œ.ð 1ð 1�Ý˜f¥e¤lÑ3Ô3ð 1Ø!œ;Ô0Ð0Ð0Ð0Ð0Ð0ð1øð ˆ4r\   úCallable[[list[InputType]], _T]Úinputs_to_checkÚmutated_input_idxsúOrderedSet[int]c                óF   ‡ ‡‡— t          ‰¦  «        dk    r‰ S dˆˆ ˆfd„}|S )Nr   Ú
new_inputsúlist[InputType]rO   r   c                óŽ   •— t          | ‰‰¦  «        \  }} ‰| ¦  «        }t          |¦  «        rt          j        ||¦  «         |S rš   )Úcopy_misaligned_inputsr^   rU   Ú_foreach_copy_)r„  Úold_tensorsÚnew_tensorsr:  r€  rû  r�  s       €€€rZ   rS  z)align_inputs_from_check_idxs.<locals>.run÷  sZ   ø€ Ý#9Ø˜Ð);ñ$
ô $
Ñ ˆ�[ð ˆe�JÑÔˆõ ˆ{ÑÔð 	;ÝÔ  ¨kÑ:Ô:Ð:àˆ
r\   )r„  r…  rO   r   )r^   )rû  r€  r�  rS  s   ``` rZ   Úalign_inputs_from_check_idxsr‹  ï  sN   øøø€ õ
 ˆ?ÑÔ˜qÒ Ð Øˆðð ð ð ð ð ð ð ð €Jr\   c                ó–  — d|                       ¦   «         v rd}nNt          d„ t          |                       ¦   «         |                      ¦   «         ¦  «        D ¦   «         ¦  «        dz   }t	          j        | |fd¦  «                             ¦   «         }t	          j        ||                       ¦   «         |                      ¦   «         ¦  «        S )Nr   c              3  ó,   K  — | ]\  }}|d z
  |z  V — ŒdS rd  rS   )rX   r™  r¢  s      rZ   rÜ   z)clone_preserve_strides.<locals>.<genexpr>  s/   è è € ÐTÐT©¨°�˜‘˜fÑ$ÐTÐTÐTÐTÐTÐTr\   r9   r–   )r_  rX  rë   r¢  rU   Ú
as_stridedÚclone)rY   Úneeded_sizer�  s      rZ   Úclone_preserve_stridesr‘    s¤   € ØˆA�FŠF‰HŒH€}€}àˆˆõ ÐTÐT½#¸a¿fºf¹h¼hÈÏÊÉ
Ì
Ñ:SÔ:SÐTÑTÔTÑTÔTÐWXÑXð 	õ Ô˜a + °Ñ6Ô6×<Ò<Ñ>Ô>€FÝÔ˜F A§F¢F¡H¤H¨a¯hªh©j¬jÑ9Ô9Ð9r\   r„  r…  Úcheck_inputs_idxsÚreturn_pair_idxsúOrderedSet[int] | Noneú-tuple[list[torch.Tensor], list[torch.Tensor]]c                ód  — g }g }|du}|D ]¢}| |         }t          |t          j        ¦  «        sJ dt          |¦  «        › �¦   «         ‚|                     ¦   «         t
          z  rHt          |¦  «        | |<   |r4||v r0|                     |¦  «         |                     | |         ¦  «         Œ£||fS )z¯
    Clones misaligned tensors which we inferred were aligned. Returns a tuple of [old_tensors], [new_tensors] for every
    cloned tensor which is in `return_pair_idxs`.
    Nz Expected tensors only, but got: )rŒ   rU   rò  r@  Údata_ptrÚ	ALIGNMENTr‘  rí  )r„  r’  r“  r‰  rŠ  Úret_pair_definedrû   Ú_inps           rZ   r‡  r‡    sÝ   € ð ')€KØ&(€Kð (¨tÐ3ÐØð 
2ð 
2ˆØ˜!Œ}ˆÝ˜$¥¤Ñ-Ô-ð 	
ð 	
Ø;­t°D©z¬zÐ;Ð;ñ	
ô 	
Ð-ð �=Š=‰?Œ?�YÑ&ð 	2Ý2°4Ñ8Ô8ˆJ�q‰Màð 2 AÐ)9Ð$9Ð$9Ø×"Ò" 4Ñ(Ô(Ð(Ø×"Ò" :¨a¤=Ñ1Ô1Ð1øà˜Ð#Ð#r\   Ústatic_input_idxsc                ó  — g }|D ]Y}| |         }t          |t          j        ¦  «        r5|                     ¦   «         t          z  dk    r|                     |¦  «         ŒZt          |¦  «        t          |¦  «        k    r|S |S )z[
    We require all inputs to be aligned, so introduce a copy for any
    that aren't.
    r   )rŒ   rU   rò  r—  r˜  rí  r^   )rQ  r›  Úaligned_static_input_idxsr„  r}  s        rZ   Úremove_unaligned_input_idxsrž  1  sŽ   € ð !#ÐØ ð 2ð 2ˆØ�s”ˆÝ�e�Uœ\Ñ*Ô*ð 	2°·²Ñ0@Ô0@Å9Ñ0LÐQRÒ/RÐ/RØ%×,Ò,¨SÑ1Ô1Ð1øÝ
Ð$Ñ%Ô%­Ð->Ñ)?Ô)?Ò?Ð?Ø(Ð(ØÐr\   rË   c                óÔ  — ddl m} t          j        t          j        ¦  «        j        }|j        j        j        }|j        j        j	        j
        }t          j        r"|j        j                             | |¦  «         dS |j        j                             | |k    ¦  «        rdS |j        r%|j        j                             | dk     ¦  «        rdS  || ¦  «        o || ¦  «        |k    S )zýCheck if an expression fits within 32-bit integer range.

    NOTE: This function intentionally does not install guards. Callers are
    responsible for guarding (e.g. via check_leq) when they decide to use
    32-bit indexing based on this result.
    r9   r¹  Tg@Œµx¯DF)r¼  rº  rU   r  r›  rå   r½  r¾  Úguarding_hint_or_throwr¿  Úhas_guarding_hintrt   Úassume_32bit_indexingÚ	check_leqr  r^  )rË   rº  Úint_maxr   r¡  s        rZ   Úexpr_fits_within_32bitr¥  C  sø   € ð ÐÐÐÐÐåŒk�%œ+Ñ&Ô&Ô*€GØœWÔ-ÔDÐØœÔ(Ô2ÔDÐåÔ#ð Ø	ŒÔ×"Ò" 1 gÑ.Ô.Ð.Øˆtð 	„wÔ×-Ò-¨a°7ªlÑ;Ô;ð Øˆtð 	Ôð ð Œ7Ô×1Ò1°!°d²(Ñ;Ô;ð 	ð �5ð Ð˜QÑÔÐHÐ$:Ð$:¸1Ñ$=Ô$=ÀÒ$HÐHr\   Úcompiled_graphrG   c                óî  ‡‡‡— t           j        j                             ¦   «         }|�È|j        �Ãt          |j        ¦  «        dk    sJ ‚t          | ¦  «        Š|j        €J ‚|j        D ]‹}|€|j                             d ¦  «         ŒdŠt           j        j                             ¦   «         x}r|j        Šd	ˆˆfd„Š|j                             t          ˆfd„|D ¦   «         ¦  «        ¦  «         Œˆd S d S d S )
Nr   FrË   r   rO   ú)float | int | SymInt | SymFloat | SymBoolc                ó~   •— ‰€t          | ¦  «        S ‰r‰                     | ¦  «        S ‰                     | ¦  «        S rš   )r„   Údeserialize_symexprÚevaluate_symexpr)rË   Úfakify_first_callr¿  s    €€rZ   Úmap_exprz4set_tracing_context_output_strides.<locals>.map_expr�  sE   ø€ Ø Ð(Ý" 1™vœv˜Ø(ð @Ø(×<Ò<¸QÑ?Ô?Ð?Ø$×5Ò5°aÑ8Ô8Ð8r\   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rš   rS   )rX   rË   r­  s     €rZ   rÜ   z5set_tracing_context_output_strides.<locals>.<genexpr>‰  s+   øè è € Ð5Ð5¨!˜(˜( 1™+œ+Ð5Ð5Ð5Ð5Ð5Ð5r\   )rË   r   rO   r¨  )
rU   rf  rg  rh  Úoutput_stridesr^   r~  rí  r¬  r?  )rý  r¦  r½  r´  rJ  r¬  r­  r¿  s        @@@rZ   Ú"set_tracing_context_output_stridesr°  p  s>  øøø€ õ ŒmÔ*×2Ò2Ñ4Ô4€GØÐ˜wÔ5ÐAÝ�7Ô)Ñ*Ô*¨aÒ/Ð/Ð/Ð/Ý)¨.Ñ9Ô9ˆ	ØÔ,Ð8Ð8Ð8Ø#Ô2ð 	ð 	ˆEØˆ}ØÔ&×-Ò-¨dÑ3Ô3Ð3Ð3à$)Ð!Ýœ-Ô6×>Ò>Ñ@Ô@Ð@�3ð >Ø(+Ô(=Ð%ð9ð 9ð 9ð 9ð 9ð 9ð 9ð Ô&×-Ò-ÝÐ5Ð5Ð5Ð5¨uÐ5Ñ5Ô5Ñ5Ô5ñô ð ð ð' ÐÐAÐAð	ð 	r\   c                 ó  — t           j        �t           j        S t          j        ¦   «         sdS t          j                             ¦   «         rdS 	 ddlm}  n# t          $ r Y dS w xY w| t          j         	                    d¦  «        k    S )NFr   ©ÚREMOTE_CACHE_VERSIONz.pytorch/remote_cache:fx_graph_memcache_version)
rt   Úfx_graph_remote_cacheÚ	is_fbcoderU   Ú_utils_internalÚis_fb_unit_testÚtorch._inductor.fb.remote_cacher³  ÚModuleNotFoundErrorÚjustknobs_getval_intr²  s    rZ   Ú should_use_remote_fx_graph_cacher»  �  s©   € ÝÔ#Ð/ÝÔ+Ð+ÝÔÑÔð ØˆuåÔ×,Ò,Ñ.Ô.ð ØˆuðØHÐHÐHÐHÐHÐHÐHøÝð ð ð Øˆuˆuðøøøð  ¥5Ô#8×#MÒ#MØ8ñ$ô $ò ð s   ÁA Á
A$Á#A$c                ó.   — t          j        dd| ¦  «        S )Nz[^a-zA-Z0-9_]rÃ   )rÕ   Úsubr  s    rZ   Únormalize_namer¾     s   € ÝŒ6Ð" C¨Ñ.Ô.Ð.r\   ztl.int1ztl.float8e4nvztl.float8e5ztl.float8e4b8ztl.float8e5b16ztl.uint8)ztl.boolztl.float8_e4m3fnztl.float8_e5m2ztl.float8_e4m3fnuzztl.float8_e5m2fnuzztl.float8_e8m0fnuztl.float4_e2m1fn_x2c                ó   — i | ]\  }}||“Œ	S rS   rS   )rX   rJ  rˆ   s      rZ   rk  rk  °  s   € ÐGÐGÐG¡$ ! Q˜˜AÐGÐGÐGr\   z^.*[.]c                óˆ   — t                                dt          | ¦  «        ¦  «        }t                               ||¦  «        S )z"Convert torch.dtype to triton typeútl.)Ú_triton_type_rer½  rP   Ú_triton_type_mappingrµ  )r¹   Útriton_type_names     rZ   Útriton_typerÅ  ¶  s6   € å&×*Ò*¨5µ#°e±*´*Ñ=Ô=ÐÝ×#Ò#Ð$4Ð6FÑGÔGÐGr\   c                óÊ   — t                                | | ¦  «        }|                     dd¦  «        }t          t          |¦  «        }t          |t          j        ¦  «        sJ ‚|S )NrÁ  r`  )Ú_torch_triton_mappingrµ  r~  rT   rU   rŒ   r¹   )r¹   Úadjusted_typeÚ	type_namerÉ  s       rZ   Útriton_type_to_torchrÊ  ¼  sY   € Ý)×-Ò-¨e°UÑ;Ô;€MØ×%Ò% e¨RÑ0Ô0€IÝ�˜yÑ)Ô)€IÝ�i¥¤Ñ-Ô-Ð-Ð-Ð-ØÐr\   r“  c                óê  — | j          oë|                      ¦   «         |                     ¦   «         k    oÁ|                      ¦   «         |                     ¦   «         k    o—| j        |j        k    o‡| j        |j        k    ow|                      ¦   «                              ¦   «         |                     ¦   «                              ¦   «         k    o)|                      ¦   «         |                     ¦   «         k    S rš   )Ú	is_mkldnnr_  r¢  r¹   rº   Úuntyped_storager—  r^  ©r“  r—   s     rZ   Úis_same_tensorrÏ  Ä  sÕ   € àŒNÐð 	<Ø�IŠI‰KŒK˜5Ÿ:š:™<œ<Ò'ð	<à�KŠK‰MŒM˜UŸ\š\™^œ^Ò+ð	<ð ŒJ˜%œ+Ò%ð	<ð ŒK˜5œ<Ò'ð		<ð
 × Ò Ñ"Ô"×+Ò+Ñ-Ô-°×1FÒ1FÑ1HÔ1H×1QÒ1QÑ1SÔ1SÒSð	<ð ×ÒÑ!Ô! U×%9Ò%9Ñ%;Ô%;Ò;ðr\   c                ó8  — | j         o“|                      ¦   «         |                     ¦   «         k    oi| j        |j        k    oY| j        |j        k    oIt          j        j                             | ¦  «        t          j        j                             |¦  «        k    S rš   )rÌ  r_  r¹   rº   rU   r7  Úmkldnnr—  rÎ  s     rZ   Úis_same_mkldnn_tensorrÒ  Ð  s†   € àŒð 	PØ�IŠI‰KŒK˜5Ÿ:š:™<œ<Ò'ð	PàŒJ˜%œ+Ò%ð	Pð ŒK˜5œ<Ò'ð	Põ ŒIÔ×%Ò% dÑ+Ô+­u¬yÔ/?×/HÒ/HÈÑ/OÔ/OÒOðr\   útuple[str, ...]c                 ó   — dS )N)r  ÚisnanÚlogical_notÚlogical_andÚsignbitÚand_ÚleÚltÚgeÚgtÚeqÚnera  ÚxorrS   rS   r\   rZ   Úboolean_opsrá  Ú  s   € ðð r\   c                  ó$   — e Zd ZU ded<   ded<   dS )ÚOpDtypeRuler5   Útype_promotion_kindrw  Úoverride_return_dtypeNr¾  rS   r\   rZ   rã  rã  î  s*   € € € € € € à8Ð8Ð8Ñ8Ø-Ð-Ð-Ñ-Ð-Ð-r\   rã  zdict[str, OpDtypeRule]Úop_dtype_propagation_rulesrä  r5   rå  c                ó6   — t          ||¦  «        t          | <   d S rš   )rã  ræ  )r×   rä  rå  s      rZ   Ú#register_op_dtype_propagation_rulesrè  ÷  s%   € õ
 (3ØÐ2ñ(ô (Õ˜tÑ$Ð$Ð$r\   zOrderedSet[str]Úop_requires_libdevice_fp64c                ó:   — t                                | ¦  «         d S rš   )ré  r  r  s    rZ   Ú#register_op_requires_libdevice_fp64rë    s   € Ý×"Ò" 4Ñ(Ô(Ð(Ð(Ð(r\   rÓ   c                óâ   — ddl m} | s|j                             ¦   «         j        } | dk    rt
          j        S | dk    rdS | dk    rt
          j        S | dk    rt
          j        S t
          j	        S )Nr   r¹  r=  rK   rL   Útpu)
rk  rº  r½  Úget_current_device_or_throwr@  rt   Úcpu_backendÚxpu_backendÚtpu_backendÚcuda_backend)rÓ   rº  s     rZ   Úget_current_backendró    sˆ   € Ø-Ð-Ð-Ð-Ð-Ð-àð AØ”g×9Ò9Ñ;Ô;Ô@ˆØ�eÒÐÝÔ!Ð!Ø	˜Ò	Ð	ØˆuØ	˜Ò	Ð	ÝÔ!Ð!Ø	˜Ò	Ð	ÝÔ!Ð!åÔ"Ð"r\   útorch.device | Nonec                óh   — | �/| j         dk    r$t          j                             | ¦  «        j        S dS )z+Check if the given device supports float64.NrL   T)r@  rU   rL   rŽ  Úhas_fp64r‰  s    rZ   Údevice_supports_fp64r÷    s2   € àÐ˜fœk¨UÒ2Ð2ÝŒy×.Ò.¨vÑ6Ô6Ô?Ð?Øˆ4r\   c                ó˜   — | t           j        t           j        fv r/t          j        j        rt          ¦   «         dk    rt           j        S | S )z"Maybe upcast [b]float16 to float32rw  )rU   rá   rŒ  rt   rw  Úcodegen_upcast_to_fp32ró  rŽ  r¸  s    rZ   Úupcast_compute_typerú     sC   € ð 	•%”-¥¤Ð0Ð0Ð0ÝŒMÔ0ð 	1åÑ!Ô! XÒ-Ð-åŒ}ÐØ€Lr\   ÚKeyTypeÚValTypec                  ó\   — e Zd ZdZdd„Zdd	„Zdd„Zdd„Zddd„Zd d„Z	d!d„Z
d"d„Zd#d„ZdS )$Ú
ScopedDictzè
    A dictionary-like object that allows for scoped updates. It maintains
    an original dictionary and a set of new items that can override
    the original items within the scope.  The original dictionary is
    unmodified.
    Úoriginal_dictúMapping[KeyType, ValType]c                ó"   — || _         i | _        d S rš   ©rÿ  Ú	new_items)r7  rÿ  s     rZ   rÉ  zScopedDict.__init__7  s   € Ø*ˆÔØ13ˆŒˆˆr\   rv  rû  rO   rü  c                óH   — || j         v r| j         |         S | j        |         S rš   ©r  rÿ  rD  s     rZ   r•  zScopedDict.__getitem__;  s*   € Ø�$”.Ð Ð Ø”> #Ô&Ð&ØÔ! #Ô&Ð&r\   r—   r  c                ó   — || j         |<   d S rš   )r  )r7  rv  r—   s      rZ   Ú__setitem__zScopedDict.__setitem__@  s   € Ø#ˆŒ�sÑÐÐr\   r_  rŠ   c                ó&   — || j         v p|| j        v S rš   r  rD  s     rZ   Ú__contains__zScopedDict.__contains__C  s   € Ø�d”nÐ$ÐA¨¨tÔ/AÐ(AÐAr\   NrÉ  úValType | Nonec                ód   — || j         v r| j         |         S | j                             ||¦  «        S rš   )r  rÿ  rµ  )r7  rv  rÉ  s      rZ   rµ  zScopedDict.getF  s5   € Ø�$”.Ð Ð Ø”> #Ô&Ð&ØÔ!×%Ò% c¨7Ñ3Ô3Ð3r\   r„   c                ó^   — t          | j        ¦  «        }| j        D ]}|| j        vr|dz  }Œ|S r]  )r^   rÿ  r  )r7  r�  rJ  s      rZ   ru  zScopedDict.__len__K  s@   € Ý�Ô"Ñ#Ô#ˆØ”ð 	ð 	ˆAØ˜Ô*Ð*Ð*Ø�Q‘�øØˆr\   úIterator[KeyType]c              #  óR   K  — | j         E d {V —† | j        D ]}|| j         vr|V — Œd S rš   r  )r7  rJ  s     rZ   Ú__iter__zScopedDict.__iter__R  sT   è è € ØÔ%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø”ð 	ð 	ˆAØ˜Ô*Ð*Ð*Ø���øð	ð 	r\   c                ó8   — t          | j        p| j        ¦  «        S rš   )rŠ   rÿ  r  rØ  s    rZ   rã  zScopedDict.__bool__X  s   € Ý�DÔ&Ð8¨$¬.Ñ9Ô9Ð9r\   c                ó   — t           ‚rš   rj  rD  s     rZ   Ú__delitem__zScopedDict.__delitem__[  s   € Ý!Ð!r\   )rÿ  r   )rv  rû  rO   rü  )rv  rû  r—   rü  rO   r  )rv  r_  rO   rŠ   rš   )rv  rû  rÉ  r
  rO   r
  rw  )rO   r  r/  )rv  rû  rO   r  )rž   rŸ   r    r¡   rÉ  r•  r  r	  rµ  ru  r  rã  r  rS   r\   rZ   rþ  rþ  /  sÛ   € € € € € ðð ð4ð 4ð 4ð 4ð'ð 'ð 'ð 'ð
$ð $ð $ð $ðBð Bð Bð Bð4ð 4ð 4ð 4ð 4ð
ð ð ð ðð ð ð ð:ð :ð :ð :ð"ð "ð "ð "ð "ð "r\   rþ  )Úfrozen_defaultrœ   útype[Any] | Noner¥   c              ó.   ‡— dˆfd„}| €|S  || ¦  «        S )Nrœ   rx   rO   c                ó2   •— t          j        | d‰¬¦  «        S )NT)Úkw_onlyr¥   )ÚdataclassesÚ	dataclass)rœ   r¥   s    €rZ   Úwrapzir_dataclass.<locals>.wrapa  s   ø€ ÝÔ$ S°$¸vÐFÑFÔFÐFr\   )rœ   rx   rO   rx   rS   )rœ   r¥   r  s    ` rZ   Úir_dataclassr  _  sA   ø€ ðGð Gð Gð Gð Gð Gð €{ØˆØˆ4�‰9Œ9Ðr\   úlist[int] | Nonec                 óv   — t           j        j                             ¦   «         } | �| j        r| j        j        S d S rš   )rU   rf  rg  rh  Úfw_metadataÚbw_donated_idxs)rk  s    rZ   Úget_donated_idxsr   i  s7   € Ý”mÔ2×:Ò:Ñ<Ô<€OØÐ" Ô'BÐ"ØÔ*Ô:Ð:Øˆ4r\   c                  ó"   — e Zd ZdZdZdZdZdZdS )ÚTritonAttrsDescriptorVersionr   r9   rí  r¹  rÄ  N)rž   rŸ   r    ÚV0_NO_TRITONÚV1_COMPILERÚV2_BACKENDSÚV3_BACKENDS_TUPLEÚV4_DICTrS   r\   rZ   r"  r"  p  s,   € € € € € Ø€LØ€KØ€Kà	ð ð €G€G€Gr\   r"  c                 ó  — t           j                             d¦  «        €t          j        S dd l} dd l} t          | j        j	        d¦  «        rt          j
        S t          | j	        j	        d¦  «        rt          j        S t          j        S )Nrw  r   ÚAttrsDescriptor)r(  r)  r*  r"  r#  r/  r0  r6  rm  Úcompilerr%  r$  r'  )rw  s    rZ   Ú#get_triton_attrs_descriptor_versionr+  z  sˆ   € å„~×Ò Ñ)Ô)Ð1Ý+Ô8Ð8à#Ð#Ð#Ð#Ø#Ð#Ð#Ð#åˆvŒÔ'Ð):Ñ;Ô;ð 4õ ,Ô7Ð7Ý	�”Ô)Ð+<Ñ	=Ô	=ð 4å+Ô7Ð7õ ,Ô3Ð3r\   c                 ó:   — t          ¦   «         t          j        k    S rš   )r+  r"  r'  rS   r\   rZ   Útriton_version_uses_attrs_dictr-  ”  s   € Ý.Ñ0Ô0Õ4PÔ4XÒXÐXr\   útorch._ops.OperatorBasec                óŒ   — |                       ¦   «         }t          | t          j        j        ¦  «        r|› d| j        › �n|}||fS )Nr|   )r×   rŒ   rU   rÞ  rß  Ú_overloadname)rÇ  Úop_overload_packet_nameÚop_overload_names      rZ   Úget_op_namesr3  ˜  sV   € Ø#%§7¢7¡9¤9Ðõ �b�%œ*Ô/Ñ0Ô0ð	%Ð"Ð7Ð7 RÔ%5Ð7Ð7Ð7à$ð ð
 #Ð$4Ð4Ð4r\   r  útorch.fx.Nodec                ó¾  — ddl m} | j        }t          |t          j        j        ¦  «        sdS |t          j        j        j	        j
        t          j        j        j        j
        t          j        j        j        j
        fv r\ ||| j        | j        d¬¦  «        }|�A|\  }}|d         }|D ]1}|�-|j        d         j        t          j        t          j        fv r dS Œ2dS )	a  
    Check if an FX node is cudagraph-unsafe based on its input arguments.

    Some ops are only cudagraph-unsafe depending on their inputs (e.g., index_put
    with boolean indices triggers .nonzero() during capture, but integer indices
    are safe).
    r   )Únormalize_functionFT)Únormalize_to_only_use_kwargsNrZ  r°  )Útorch.fx.operator_schemasr6  rÝ  rŒ   rU   rÞ  rß  r7  rH  Ú	index_putrÉ  Ú
index_put_Ú_unsafe_index_putr’   ræ  r>  r¹   rŠ   r�  )r  r6  rÝ  Ú
normalizedrÃ   ræ  rZ  r„  s           rZ   Ú,_fx_node_is_input_dependent_cudagraph_unsafer=  ¢  sý   € ð =Ð<Ð<Ð<Ð<Ð<àŒ^€FÝ�f�eœjÔ3Ñ4Ô4ð Øˆuð ÝŒ	ŒÔ Ô(ÝŒ	ŒÔ!Ô)ÝŒ	ŒÔ(Ô0ðð ð ð
 (Ð'Ø�G”L '¤.Ètð
ñ 
ô 
ˆ
ð Ð!Ø"‰IˆAˆvØ˜YÔ'ˆGØð  ð  �Ø�? s¤x°¤Ô'<Ý”JÝ”KðAð (ð (ð  ˜4˜4øàˆ5r\   c                ó®  — | j         }t          |¦  «        t          v rdS t          |t          j        j        ¦  «        rt          j        j        j	        |j
        v rdS t          | ¦  «        rdS | j                             d¦  «        x}�Jt          |t          t          f¦  «        s|gn|}|D ]&}t          |t          j        ¦  «        r
|j        r dS Œ'dS )a   
    Check if an FX node is cudagraph-unsafe.

    This includes:
    - Ops in FORBIDDEN_CUDAGRAPH_OPS (CPU sync, dynamic alloc, etc.)
    - Ops with the cudagraph_unsafe tag
    - Input-dependent unsafe ops (e.g., index_put with boolean indices)
    - Ops with sparse tensor outputs
    Tr°  NF)rÝ  rP   ÚFORBIDDEN_CUDAGRAPH_OPSrŒ   rU   rÞ  rß  r4  râ  Úcudagraph_unsaferä  r=  r>  rµ  r¥  r?  rò  Ú	is_sparse)r  rÝ  r°  Úvalsrˆ   s        rZ   r0  r0  Æ  sá   € ð Œ^€Fõ ˆ6�{„{Õ-Ð-Ð-Øˆtõ 	�6�5œ:Ô0Ñ1Ô1ðåŒHŒLÔ)¨V¬[Ð8Ð8àˆtõ 4°GÑ<Ô<ð Øˆtð Œ|×Ò Ñ&Ô&Ð&ˆÐ3Ý& s­Tµ5¨MÑ:Ô:ÐC�ˆuˆuÀˆØð 	ð 	ˆAÝ˜!�Uœ\Ñ*Ô*ð ¨q¬{ð Ø�t�tøàˆ5r\   rD   c                óÒ   — ddl m} t          | |j        |j        f¦  «        rdS t          | |j        |j        f¦  «        sdS t          | dd¦  «        }|�t          |¦  «        rdS dS )ah  
    Returns True if the node is an op that is not cudagraphable.
    This includes:
    - Ops in FORBIDDEN_CUDAGRAPH_OPS (CPU sync, dynamic alloc, etc.)
    - Ops with the cudagraph_unsafe tag
    - index_put_ with boolean indices (triggers .nonzero() during capture)
    - Control flow nodes (Conditional, WhileLoop)
    - Ops with sparse tensor outputs
    r9   r[  TFr  N)	r`  r\  rŒ   ÚConditionalÚ	WhileLooprÇ  rA   rT   r0  )r´  r\  r  s      rZ   Úis_cudagraph_unsafe_oprF  ë  sˆ   € ð ÐÐÐÐÐõ �$˜œ¨¬Ð6Ñ7Ô7ð Øˆtå�d˜RÔ.°´Ð@ÑAÔAð Øˆuå�d˜I tÑ,Ô,€GØÐÕ:¸7ÑCÔCÐØˆtàˆ5r\   c                 ó  — t           j                             dd¦  «        } t          j        ¦   «         rXddlm}  |¦   «         }|rFt           j                             |dd¦  «        }| r!t           j	                             || g¦  «        n|} | S )NÚLD_LIBRARY_PATHr`  r   )Úget_runtime_pathrM  Úlib)
rk  rl  rµ  rt   rµ  Úlibfb.py.parutilrI  rz  rw  Úpathsep)rz  rI  Úruntime_pathÚlib_paths       rZ   Úget_ld_library_pathrO    s‘   € ÝŒ:�>Š>Ð+¨RÑ0Ô0€DÝÔÑÔð KØ5Ð5Ð5Ð5Ð5Ð5à'Ð'Ñ)Ô)ˆØð 	KÝ”w—|’| L°)¸UÑCÔCˆHØ8<ÐJ•2”:—?’? H¨dÐ#3Ñ4Ô4Ð4À(ˆDà€Kr\   c                ó@   — ddl m} t          | |¦  «        o| j        d uS )Nr   )ÚSubgraphPythonWrapperCodegen)Útorch._inductor.codegen.wrapperrQ  rŒ   Úpartition_signatures)rK  rQ  s     rZ   Ú#is_codegen_graph_partition_subgraphrT    s9   € ØLÐLÐLÐLÐLÐLõ 	�7Ð8Ñ9Ô9ð 	5ØÔ(°Ð4ðr\   c                 ó€   — t           j        j        j        j        pt
          j        d uot           j        j        j        S rš   )rU   rL  rt   rw  Ú
cudagraphsÚ&_unstable_customized_partition_wrapperrK  Úgraph_partitionrS   r\   rZ   Úis_using_cudagraph_partitionrY    s8   € åŒÔÔ%Ô0ð 	FÝ1Ô9ÀÐEð1õ Œ/Ô
 Ô
0ð1r\   c                ó¾   — ddl m} |j        j                             | d¦  «        r,|j        j                             | d¦  «        rt          j        S t          j        S )Nr9   r¹  l        i   €)	r¼  rº  r½  r¾  Ústatically_known_ltrø  rU   r›  rœ  )r_  rº  s     rZ   Údtype_from_sizer\  "  se   € ØÐÐÐÐÐà„wÔ×+Ò+Øˆeñô ð à
Œ'Ô
×
/Ò
/°°hÑ
?Ô
?ðõ Œ{ÐåŒ{Ðr\   )r=  rL   c                ód   — | dk    r#t           j        j                             ¦   «         S d| v rdS dS )z;
    Returns True if the device supports MKL-DNN BF16.
    r=  rL   TF)rU   r7  rÑ  Ú_is_mkldnn_bf16_supported©rÓ   s    rZ   Úis_mkldnn_bf16_supportedr`  0  ó;   € ð �eÒÐÝŒyÔ×9Ò9Ñ;Ô;Ð;Ø	�+Ð	Ð	àˆtØˆ5r\   c                ód   — | dk    r#t           j        j                             ¦   «         S d| v rdS dS )z;
    Returns True if the device supports MKL-DNN FP16.
    r=  rL   TF)rU   r7  rÑ  Ú_is_mkldnn_fp16_supportedr_  s    rZ   Úis_mkldnn_fp16_supportedrd  <  ra  r\   ÚelementsúSequence[Sequence[T]]ÚheadersúSequence[T]c           
     óÊ  — d„ |D ¦   «         }| D ]l}t          |¦  «        t          |¦  «        k    sJ ‚t          |¦  «        D ]8\  }}t          ||         t          t          |¦  «        ¦  «        ¦  «        ||<   Œ9Œmg }|                     d                     d„ t          ||¦  «        D ¦   «         ¦  «        ¦  «         t          |¦  «        t          |¦  «        dz  z   t          |¦  «        dz
  z   }|                     d|z  ¦  «         | D ]B}|                     d                     d„ t          ||¦  «        D ¦   «         ¦  «        ¦  «         ŒCd                     |¦  «        S )	Nc                óF   — g | ]}t          t          |¦  «        ¦  «        ‘ŒS rS   )r^   rP   )rX   rË   s     rZ   r[   ztabulate_2d.<locals>.<listcomp>I  s$   € Ð+Ð+Ð+˜a�c•#�a‘&”&‰kŒkÐ+Ð+Ð+r\   ú|c              3  ó,   K  — | ]\  }}d ||› ›d �V — ŒdS ©r  NrS   )rX   ÚhrÊ  s      rZ   rÜ   ztabulate_2d.<locals>.<genexpr>O  s2   è è € ÐHÐH©4¨1¨a˜,˜a ˜,˜,˜,˜,ÐHÐHÐHÐHÐHÐHr\   rí  r9   rô  c              3  ó,   K  — | ]\  }}d ||› ›d �V — ŒdS rm  rS   )rX   rË   rÊ  s      rZ   rÜ   ztabulate_2d.<locals>.<genexpr>T  s2   è è € ÐHÐH©t¨q°!˜l ! Q˜l˜l˜l˜lÐHÐHÐHÐHÐHÐHr\   r°  )r^   re  rå   rP   rí  rw  rë   rX  )re  rg  ÚwidthsÚrowrû   rË   rþ  Útotal_widths           rZ   Útabulate_2drs  H  s]  € Ø+Ð+ 7Ð+Ñ+Ô+€FØð 4ð 4ˆÝ�3‰xŒx�3˜w™<œ<Ò'Ð'Ð'Ð'Ý˜c‘N”Nð 	4ð 	4‰DˆAˆqÝ˜F 1œI¥s­3¨q©6¬6¡{¤{Ñ3Ô3ˆF�1‰IˆIð	4à€EØ	‡L‚L�—’ÐHÐHµ3°wÀÑ3GÔ3GÐHÑHÔHÑHÔHÑIÔIÐIå�f‘+”+¥ V¡¤¨q¡Ñ1µS¸±[´[À1±_ÑE€KØ	‡L‚L��{Ñ"Ñ#Ô#Ð#Øð Jð JˆØ�Š�S—X’XÐHÐHµs¸3ÀÑ7GÔ7GÐHÑHÔHÑHÔHÑIÔIÐIÐIØ�9Š9�UÑÔÐr\   Údict1r   Údict2Ú
d1_defaultr
  Ú
d2_defaultúEGenerator[tuple[KeyType, ValType | None, ValType | None], None, None]c              #  ó  K  — t          |                      ¦   «         ¦  «        t          |                     ¦   «         ¦  «        z  }|D ];}|                      |¦  «        }|                     |¦  «        }||�|n||�|n|fV — Œ<dS )að  
    Zip two dictionaries together, replacing missing keys with default values.

    Args:
        dict1 (dict): The first dictionary.
        dict2 (dict): The second dictionary.
        d1_default (Any): the default value for the first dictionary
        d2_default (Any): the default value for the second dictionary

    Yields:
        tuple: A tuple containing the key, the value from dict1 (or d1_default if missing),
               and the value from dict2 (or d2_default if missing).
    N)r!   r¶  rµ  )rt  ru  rv  rw  Úall_keysrv  Úvalue1Úvalue2s           rZ   Ú	zip_dictsr}  X  s¡   è è € õ( ˜%Ÿ*š*™,œ,Ñ'Ô'­*°U·Z²Z±\´\Ñ*BÔ*BÑB€Hð ð 	
ð 	
ˆà—’˜3‘”ˆØ—’˜3‘”ˆð ØÐ(ˆFˆF¨jØÐ(ˆFˆF¨jð
ð 	
ð 	
ð 	
ð 	
ð	
ð 	
r\   Úconfig_patchesc                ó(  — dd	„}dd
„}|                       dt          j        j        ¦  «        }|                      ¦   «         } |rm || dd¦  «          || dd¦  «          || dt
          j        j         ¦  «          || dd¦  «          || dt          j        j	        ¦  «          || dd¦  «         |                       dt          j
        j        ¦  «        }|                       dt          j
        j        ¦  «        }|dk    r|rt          d¦  «        ‚| S )a6  
    Ensures the configuration is internally consistent for standalone AOTInductor.

    If `aot_inductor_mode.compile_standalone` is set to True in the provided
    `config_patches` (or falls back to the global config), this function ensures
    that the following configs are also enabled:
        - `aot_inductor.package_cpp_only`

    Args:
        config_patches (dict[str, Any]): A dictionary of user-provided config
            overrides for AOTInductor compilation.

    Returns:
        dict[str, Any]: The possibly-updated `config_patches` dictionary.
    r~  rç  Úconfig_namerP   Úconfig_valuer   rO   r  c                óª   — |                       |t          t          |¦  «        ¦  «        }|€|| |<   d S |s||k    rt          d|› d|› d�¦  «        ‚d S d S )NzInvalid config: ú=z3 when aot_inductor_mode.compile_standalone is True.)rµ  rT   rt   r  ©r~  r€  r�  r—   s       rZ   Úpatch_configz2maybe_aoti_standalone_config.<locals>.patch_configŒ  s‚   € ð ×"Ò" ;µ½ÀÑ0LÔ0LÑMÔMˆØˆ=Ø*6ˆN˜;Ñ'Ð'Ð'Øð 	˜5 LÒ0Ð0ÝØr ;ÐrÐr°ÐrÐrÐrñô ð ð	ð 	Ð0Ð0r\   c                ó¦   — |                       |t          t          |¦  «        ¦  «        }||k    rt                               d||¦  «         || |<   d S )NzDOverriding: %s=%s when aot_inductor_mode.compile_standalone is True.)rµ  rT   rt   rî   r€  r„  s       rZ   Úforce_patch_configz8maybe_aoti_standalone_config.<locals>.force_patch_config—  s_   € ð ×"Ò" ;µ½ÀÑ0LÔ0LÑMÔMˆØ�LÒ Ð Ý�KŠKØVØØñô ð ð
 '3ˆ�{Ñ#Ð#Ð#r\   z$aot_inductor_mode.compile_standalonezaot_inductor.package_cpp_onlyTz aot_inductor.embed_kernel_binaryz#aot_inductor.emit_multi_arch_kernelz+aot_inductor.model_name_for_generated_filesÚ
aoti_modelzaot_inductor.link_libtorchzaot_inductor.dynamic_linkageFz"aot_inductor.cross_target_platformz$aot_inductor.package_constants_in_soÚwindowszªconfig.aot_inductor.package_constants_in_so is not supported for windows cross-compilation. Please use config.aot_inductor.package_constants_on_disk_format = binary_blob.)r~  rç  r€  rP   r�  r   rO   r  )rµ  rt   Úaot_inductor_modeÚcompile_standaloneÚcopyrU   rº  r}   Útest_configsÚuse_libtorchÚaot_inductorÚcross_target_platformÚpackage_constants_in_sor  )r~  r…  r‡  r‹  r�  r‘  s         rZ   Úmaybe_aoti_standalone_configr’  {  s�  € ð"	ð 	ð 	ð 	ð
3ð 
3ð 
3ð 
3ð (×+Ò+Ø.ÝÔ Ô3ñô Ðð
 $×(Ò(Ñ*Ô*€NØð Ràˆ�^Ð%DÀdÑKÔKÐKàˆ�^Ð%GÈÑNÔNÐNàˆØÐAÅuÄ}ÔGXÐCXñ	
ô 	
ð 	
ð 	ˆØÐIÈ<ñ	
ô 	
ð 	
ð 	ÐØØ(ÝÔÔ,ñ	
ô 	
ð 	
ð
 	Ð˜>Ð+IÈ5ÑQÔQÐQà*×.Ò.Ø,ÝÔÔ1ñô Ðð
 -×0Ò0Ø.ÝÔÔ3ñô Ðð
  	Ò)Ð)Ð.EÐ)Ýð]ñ
ô 
ð 	
ð
 Ðr\   Úconsts_sizeútuple[bool, bool]c                ód  — t           j        j        r$t           j        j        dk    rt	          d¦  «        ‚t           j        j        r,t           j        j        dk    rt	          d¦  «        ‚d}d}||fS t           j        j        dk    rd}d}||fS | dk    rdS d}t          j        ¦   «          }||fS )	a  
    Decide whether we should mmap weights, and whether to store the weights with .so.

    If force_mmap_weights or package_constants_on_disk_format == "binary_blob" configs are set, respect the config.

    Returns tuple (use_external_weights, use_mmap_weights).
    Úbinary_blobz‚config.aot_inductor.package_constants_on_disk_format = binary_blob and config.aot_inductor.force_mmap_weights cannot both be True.r‰  zKwhen cross_target_platform is windows, use_mmap_weights should not be true.TFi ”5w)FF)rt   r�  Úforce_mmap_weightsÚ package_constants_on_disk_formatr  r�  rµ  )r“  Úuse_mmap_weightsÚuse_external_weightss      rZ   Údetermine_aoti_mmap_flagsr›  Ð  sè   € õ 	ÔÔ.ð
åÔÔ@ÀMÒQÐQåðJñ
ô 
ð 	
õ
 ÔÔ-ð 6ÝÔÔ4¸	ÒAÐAÝØ]ñô ð ð  ÐØ$ÐØ#Ð%5Ð5Ð5åÔÔ;¸}ÒLÐLØ#ÐØ ÐØ#Ð%5Ð5Ð5à�mÒ#Ð#Øˆ|à ÐÝ!Ô+Ñ-Ô-Ð-ÐàÐ!1Ð1Ð1r\   c                 óÒ   — ddl m}  | j        j        }|€dS t	          |t
          ¦  «        st          d¦  «        ‚|dk    rdS t          j        d|¦  «        st          d¦  «        ‚dS )	zL
    Validates if a model name is suitable for use in code generation.

    r   rs   NTz4Invalid AOTI model name: Model name must be a stringr`  z^[a-zA-Z_][a-zA-Z0-9_]*$zVInvalid AOTI model name: Model name can only contain letters, numbers, and underscores)	r/  rt   r�  Úmodel_name_for_generated_filesrŒ   rP   rE  rÕ   rÖ   )rt   Ú
model_names     rZ   Úis_valid_aoti_model_namerŸ  ù  s‘   € ð
 'Ð&Ð&Ð&Ð&Ð&àÔ$ÔC€JàÐØˆtå�j¥#Ñ&Ô&ð QÝÐOÑPÔPÐPà�RÒÐØˆtõ Œ8Ð/°Ñ<Ô<ð 
ÝØdñ
ô 
ð 	
ð ˆ4r\   r,   Úunbacked_onlyúOrderedSet[sympy.Symbol]c                óB   — |rt          | ¦  «        S t          | ¦  «        S rš   )r*   r)   )rY   r   s     rZ   Úget_free_symbolsr£    s$   € Øð Ý$ QÑ'Ô'Ð'å˜A‰ŒÐr\   údict[str, str]c                 ó  — i t           j        ¥dt           j                             dt           j                             t
          j        ¦  «        ¦  «        i¥} t          j        ¦   «         rt          j
        d¦  «        | d<   | S )zA
    Get a base environment for running Python subprocesses.
    Ú
PYTHONPATHÚTORCH_CUSTOM_PYTHONPATHr“  Ú
PYTHONHOME)rk  rl  rµ  rL  rw  rH  rz  rt   rµ  Ú	sysconfigÚget_path)Úenvs    rZ   Úpython_subprocess_envr¬    sv   € ð
å
Œ*ðð 	•b”j—n’nØ%¥r¤z§¢µs´xÑ'@Ô'@ñ
ô 
ð	ð €Cõ  ÔÑÔð 7Ý%Ô.¨vÑ6Ô6ˆˆLÑà€Jr\   c                  ó(   — e Zd ZU dZded<   ded<   dS )ÚCUDAGraphWrapperMetadataz˜
    Metadata for Customized CUDAGraphWrapper.

    Currently assumes there is 1 dynamo graph and will extend to
    multiple graphs in the future.
    r„   Únum_partitionsÚpartition_indexNr­   rS   r\   rZ   r®  r®  6  s8   € € € € € € ðð ð ÐÐÑð ÐÐÑÐÐr\   r®  .c                  ó   — e Zd ZU dZded<   dS )ÚCUDAGraphWrapperNzCUDAGraphWrapperType | NonerK  )rž   rŸ   r    rK  r®   rS   r\   rZ   r²  r²  M  s#   € € € € € € Ø+/€GÐ/Ð/Ð/Ñ/Ð/Ð/r\   r²  ÚCUDAGraphWrapperTypec                ó   — | t           _        d S rš   )rW  rK  )rK  s    rZ   Ú!set_customized_partition_wrappersrµ  _  s   € Ø5<Õ*Ô2Ð2Ð2r\   ú tuple[list[Any], dict[str, Any]]c                óä  ‡	‡
‡— t          d| j        ¦  «        }t          |t          j        j        j        ¦  «        r$|                     |j        |j	        ¦  «        \  }}ng |j        ¢|j	        ¢}|j
        }|                     ||¦  «        }t          |¦  «        }t          |dd ¦  «        }t          |t          j        j        ¦  «        rFd„ |j        j        D ¦   «         }|d t%          |¦  «        …         D ]}|                     |d ¦  «         Œt)          j        ||f¦  «        \  }}dd„Š	ˆ	fd„|D ¦   «         }dd	„Š
dˆ
fd„Šˆfd„|D ¦   «         }t)          j        ||¦  «        \  }}||fS )NrA   rÆ  c                ó*   — g | ]}|j         °	|j        ‘ŒS rS   )Ú
kwarg_onlyr×   r=  s     rZ   r[   z%snode_args_kwargs.<locals>.<listcomp>o  s1   € ð  
ð  
ð  
ØÀSÄ^ð 
ØŒHð 
ð  
ð  
r\   rO   rŠ   c                óÀ   — t          | t          j        j        j        ¦  «        o:t          | t          j        j        j        t          j        j        j        f¦  «         S rš   )rŒ   rU   rL  r\  rB   ÚGeneratorStateÚOpaqueObjectStaterÓ  s    rZ   Ú_is_tensor_irz(snode_args_kwargs.<locals>._is_tensor_irv  sO   € Ý˜!�Uœ_Ô/Ô6Ñ7Ô7ð 
Å
ØÝŒ_ÔÔ.µ´Ô0BÔ0TÐUñA
ô A
ð =
ð 	
r\   c                óv   •— g | ]5} ‰|¦  «        r&t           j        j                             |d ¬¦  «        n|‘Œ6S )T)Úreplace_symbols_with_hints)rU   rL  r\  Úir_node_to_tensor)rX   rU  r½  s     €rZ   r[   z%snode_args_kwargs.<locals>.<listcomp>|  sZ   ø€ ð ð ð ð ð ˆ=˜ÑÔð	�ŒÔ×,Ò,¨QÈ4Ð,ÑPÔPÐPàðð ð r\   rë  c                ó0   — t          j        | ||¬¦  «        S )Nr¸   )rU   rà   )r_  r¹   rº   s      rZ   Ú_tensorz"snode_args_kwargs.<locals>._tensorƒ  s   € ÝŒ{˜4 u°VÐ<Ñ<Ô<Ð<r\   rË   r   c                ó’   •— t          | t          j        ¦  «        s| S  ‰|                      ¦   «         | j        | j        ¦  «        }|S rš   )rŒ   rU   rò  r_  r¹   rº   )rË   r:  rÂ  s     €rZ   Úto_real_tensorz)snode_args_kwargs.<locals>.to_real_tensor†  s@   ø€ Ý˜!�Uœ\Ñ*Ô*ð 	ØˆHØˆg�a—f’f‘h”h ¤¨¬Ñ2Ô2ˆØˆ
r\   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS rS   rS   )rX   rU  rÄ  s     €rZ   r[   z%snode_args_kwargs.<locals>.<listcomp>Œ  s#   ø€ Ð6Ð6Ð6 q�� Ñ"Ô"Ð6Ð6Ð6r\   r/  )rO   rë  )rË   r   rO   r   )r   r´  rŒ   rU   rL  r\  rÇ  Úunflatten_argsrQ  Úconstant_argsræ  Úfill_non_provided_argsr‡  rT   rÞ  rß  rÎ  rÏ  r^   r_   Úpytreer"   Útree_unflatten)rÐ  r´  r’   ræ  rÆ  Úpositional_arg_namesÚarg_nameÚ	flat_argsÚflat_args_pytree_specr½  rÂ  rÄ  s            @@@rZ   Úsnode_args_kwargsrÏ  c  sÕ  øøø€ Ý� ¤
Ñ+Ô+€DÝ�$�œÔ*Ô9Ñ:Ô:ð Ø×*Ò*¨4¬;¸Ô8JÑKÔK‰ˆˆfˆfà2�”Ð2˜tÔ1Ð2ˆØ”ˆà×&Ò& t¨VÑ4Ô4€DÝ�&‰\Œ\€FÝ˜$ ¨tÑ4Ô4€KÝ�+�uœzÔ4Ñ5Ô5ð 'ð 
ð  
Ø +Ô 3Ô =ð 
ñ  
ô  
Ðð -¨[­s°4©y¬y¨[Ô9ð 	'ð 	'ˆHØ�JŠJ�x Ñ&Ô&Ð&Ð&Ý'-Ô':¸DÀ&¸>Ñ'JÔ'JÑ$€IÐ$ð
ð 
ð 
ð 
ðð ð ð ð ð	ñ ô €Ið=ð =ð =ð =ðð ð ð ð ð ð 7Ð6Ð6Ð6¨IÐ6Ñ6Ô6€IÝÔ(¨Ð4IÑJÔJ�L€Dˆ&Ø�ˆ<Ðr\   ró  r=   c                ó¢   — ddl m} | j        }|j        j        r"|                     |j        j        dz   ¦  «        }|                     d¦  «        S )Nr9   r¹  rÃ   )r  rê  Úfwd_rng_stater	  r  )r¼  rº  r×   r½  r8  rJ  )ró  rº  Údep_names      rZ   Úis_nonfreeable_buffersrÓ  ‘  s`   € ØÐÐÐÐÐàŒx€Hð 	„w„|ð =Ø×(Ò(¨¬¬¸Ñ);Ñ<Ô<ˆØ×ÒØIñô ð r\   Útemplate_dirr1   c                óˆ   — t          || › d�z  ¦  «        5 }|                     ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z,Load a template file and return its content.z	.py.jinjaN)ÚopenÚread)r×   rÔ  r|  s      rZ   Úload_templaterØ  Ÿ  sŠ   € å	ˆl Ð/Ð/Ð/Ñ/Ñ	0Ô	0ð °AØ�vŠv‰xŒxðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   –7·;¾;c                ó   — | j         }t          |t          j        j        t          j        j        f¦  «        sJ dt          |¦  «        › �¦   «         ‚t          j        sdS t          t          j
        j        j        j        t          j
        j        j        j        g¦  «        }||v rdS t          t          j
        j        j        g¦  «        }t          |t          j        j        ¦  «        r||v S t#          | ¦  «         S )zLDecide whether fallback for a node. This is only used in inductor lite mode.z6Expected OpOverload or HigherOrderOperator, but found F)rÝ  rŒ   rU   rÞ  rß  rj  r@  rt   Úfallback_by_defaultr!   r7  rH  Ú_assert_scalarrÉ  Úlift_fresh_copyÚhigher_orderÚ triton_kernel_wrapper_functionalr   )r´  rÝ  Ú"skip_fallback_due_to_dynamic_shapeÚfallback_hopss       rZ   Úshould_fallback_by_defaultrá  ¥  s  € àŒ[€FåØ•”Ô&­¬
Ô(FÐGñô ð Oð OàNÅÀVÁÄÐNÐNñOô Oð õ Ô%ð Øˆuõ *4åŒIŒNÔ)Ô1ÝŒIŒNÔ*Ô2ð	
ñ*ô *Ð&ð Ð3Ð3Ð3Øˆuõ Ý	ŒÔ	Ô	@ÐAñô €Mõ �&�%œ*Ô8Ñ9Ô9ð 'Ø˜Ð&Ð&å& tÑ,Ô,Ð,Ð,r\   )z-torch.ops._c10d_functional.all_reduce.defaultz.torch.ops._c10d_functional.all_reduce_.defaultz9torch.ops._c10d_functional.all_gather_into_tensor.defaultz8torch.ops._c10d_functional.reduce_scatter_tensor.defaultz4torch.ops._c10d_functional.all_to_all_single.defaultz6torch.ops._c10d_functional_autograd.all_reduce.defaultzBtorch.ops._c10d_functional_autograd.all_gather_into_tensor.defaultzAtorch.ops._c10d_functional_autograd.reduce_scatter_tensor.defaultz=torch.ops._c10d_functional_autograd.all_to_all_single.defaultz(torch.ops._c10d_functional.isend.defaultz(torch.ops._c10d_functional.irecv.defaultz0torch.ops._c10d_functional.batch_p2p_ops.defaultc                ó   — | t           v S )z0Check if an operation is a collective operation.)ÚCOLLECTIVE_OPS)rb  s    rZ   Úis_collective_oprä  Ý  s   € à•nÐ$Ð$r\   c                 ób   — t          j        ¦   «         r	 ddlm}  | S # t          $ r g cY S w xY wg S )Nr   ©Útlx_only_cuda_options)rt   rµ  Ú)torch._inductor.fb.tlx_templates.registryrç  r8  ræ  s    rZ   rç  rç  â  s[   € åÔÑÔð 
ð	ØWÐWÐWÐWÐWÐWà(Ð(øåð 	ð 	ð 	ØˆIˆIˆIð	øøøð ˆ	s   • �,«,r  c                ó   — | |z   dz
  |z  |z  S )z(Round x up to the nearest multiple of y.r9   rS   )rY   r  s     rZ   Ú	_round_uprê  ñ  s   € à�‰U�Q‰Y˜1Ñ Ñ!Ð!r\   Úmat_sizeútuple[Any, Any]Ú
scale_sizeútuple[Any, ...]Úscale_numelÚ	mat_dtypeÚscale_dtypeÚeq_fnúCallable[[Any, Any], bool]útuple[Any | None, Any | None]c                ó  — ddl m}m}  ||d¦  «        r|j        |j        fS t          |¦  «        dk    �rF ||d         | d         ¦  «        r ||d         d¦  «        s* ||d         d¦  «        r& ||d         | d         ¦  «        r|j        |j        fS  ||d         | d         ¦  «        r& ||d         t          | d         d¦  «        ¦  «        s> ||d         | d         ¦  «        r4 ||d         t          | d         d¦  «        ¦  «        r|j        |j        fS  ||d         t          | d         d¦  «        ¦  «        r4 ||d         t          | d         d¦  «        ¦  «        r|j	        |j        fS |t          j        k    rdnd}|t          j        k    r²|t          j        k    r¢t          | d         d¦  «        t          t          || d         z  d¦  «        d¦  «        z  }	t          | d         d¦  «        t          t          || d         z  d¦  «        d¦  «        z  }
 |||	¦  «        s |||
¦  «        r|j        |j        fS |t          j        k    �rt          j        j        s£t          | d         d¦  «        t          t          || d         z  d¦  «        d¦  «        z  }	t          | d         d¦  «        t          t          || d         z  d¦  «        d¦  «        z  }
 |||	¦  «        s |||
¦  «        r|j        |j        fS njt          | d         d¦  «        |z  | d         z  }	t          || d         z  d¦  «        | d         z  }
 |||	¦  «        s |||
¦  «        r|j        |j        fS d	S )
z:
    Core implementation for scale/swizzle inference.
    r   )r8   ÚSwizzleTyper9   rí  r   r~   rÄ  rõ  ©NN)Útorch.nn.functionalr8   rö  Ú
TensorWiseÚ
NO_SWIZZLEr^   ÚRowWiseru   ÚBlockWise1x128ÚBlockWise128x128rU   rŠ  r‚  rê  ÚBlockWise1x16ÚSWIZZLE_32_4_4rˆ  rº  r}   ÚBlockWise1x32)rë  rí  rï  rð  rñ  rò  r8   rö  ÚK_multiplierÚexpected_numel_aÚexpected_numel_bs              rZ   Ú_infer_scale_swizzle_implr	  ö  s>  € ð =Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð €uˆ[˜!ÑÔð >ØÔ% {Ô'=Ð=Ð=õ ˆ:�„˜!ÒÑØˆE�*˜Q”- ¨!¤Ñ-Ô-ð 	?°%°%¸
À1¼ÀqÑ2IÔ2Ið 	?ØˆE�*˜Q”- Ñ#Ô#ð	?Ø(-¨¨j¸¬m¸XÀa¼[Ñ(IÔ(Ið	?ð Ô&¨Ô(>Ð>Ð>ð ˆE�*˜Q”- ¨!¤Ñ-Ô-ð	Fà��j ”m¥W¨X°a¬[¸#Ñ%>Ô%>Ñ?Ô?ð	Fð ˆE�*˜Q”- ¨!¤Ñ-Ô-ð		Fð
 ��j ”m¥W¨X°a¬[¸#Ñ%>Ô%>Ñ?Ô?ð	Fð Ô-¨{Ô/EÐEÐEð ˆ5�˜A”¥¨°¬°SÑ 9Ô 9Ñ:Ô:ð 	H¸u¸uØ�qŒM�7 8¨A¤;°Ñ4Ô4ñ@
ô @
ð 	Hð Ô/°Ô1GÐGÐGð "¥UÔ%;Ò;Ð;�1�1À€Lð •EÔ*Ò*Ð*¨{½eÔ>QÒ/QÐ/QÝ$ X¨a¤[°#Ñ6Ô6½Ý�L 8¨A¤;Ñ.°Ñ3Ô3°Qñ:
ô :
ñ 
Ðõ % X¨a¤[°#Ñ6Ô6½Ý�L 8¨A¤;Ñ.°Ñ3Ô3°Qñ:
ô :
ñ 
Ðð ˆ5�Ð.Ñ/Ô/ð 	I°5°5¸ÐFVÑ3WÔ3Wð 	IØÔ,¨kÔ.HÐHÐHð •eÔ*Ò*Ñ*ÝŒ}Ô ð 	Iå(¨°!¬°cÑ:Ô:½YÝ˜ x°¤{Ñ2°BÑ7Ô7¸ñ>ô >ñ  Ðõ  )¨°!¬°cÑ:Ô:½YÝ˜ x°¤{Ñ2°BÑ7Ô7¸ñ>ô >ñ  Ðð ˆu�[Ð"2Ñ3Ô3ð M°u°uØÐ-ñ8ô 8ð Mð #Ô0°+Ô2LÐLÐLðMõ  ' x°¤{°BÑ7Ô7¸,ÑFÈÐRSÌÑTÐÝ& |°h¸q´kÑ'AÀ2ÑFÔFÈÐRSÌÑTÐØˆu�[Ð"2Ñ3Ô3ð I°u°uØÐ-ñ8ô 8ð Ið #Ô0°+Ô2HÐHÐHàˆ:r\   ÚmatÚscalec                óº   — t          | j        d         | j        d         ft          |j        ¦  «        |                     ¦   «         | j        |j        d„ ¬¦  «        S )a†  
    Infer the scaling type and swizzle mode from matrix and scale tensor shapes/dtypes.

    This function determines how scale factors are laid out relative to the matrix:
    - TensorWise: Single scale for entire tensor
    - RowWise: One scale per row
    - BlockWise1x128/128x128: Block-scaled with float32 scales
    - BlockWise1x32: MXFP8 with float8_e8m0fnu scales (swizzled on NVIDIA)
    - BlockWise1x16: NVFP4 with float8_e4m3fn scales (swizzled)

    Args:
        mat: The matrix tensor (FP8 or FP4)
        scale: The scale factor tensor

    Returns:
        Tuple of (ScalingType, SwizzleType) or (None, None) if unrecognized
    r   r9   c                ó   — | |k    S rš   rS   r  s     rZ   rÔ  z%infer_scale_swizzle.<locals>.<lambda>`  s
   € ˜1 š6€ r\   ©rë  rí  rï  rð  rñ  rò  )r	  r™  r?  Únumelr¹   )r	  r	  s     rZ   Úinfer_scale_swizzler	  F  sW   € õ( %Ø”)˜A”, ¤	¨!¤Ð-Ý˜œÑ%Ô%Ø—K’K‘M”MØ”)Ø”KØ!Ð!ðñ ô ð r\   r@   Ú	transposec                ó†  ‡— ddl mŠ |                      ¦   «         }|                     ¦   «         }|r|d         |d         f}|r t          j        t
          j        |d¦  «        nd}dˆfd	„}t          t          |¦  «        d
k    r|d         |d         fn	|d         dft          |¦  «        || j
        |j
        |¬¦  «        S )zí
    Infer the scaling type and swizzle mode for IR nodes (used during graph lowering).

    This is the IR-compatible version of infer_scale_swizzle, using symbolic
    size comparisons via V.graph.sizevars.statically_known_equals.
    r   r¹  r9   rU  r   rV  rO   rŠ   c                óD   •— ‰j         j                             | |¦  «        S )z5Compare values using symbolic equality when possible.ró  )rU  rV  rº  s     €rZ   Úsymbolic_eqz+infer_scale_swizzle_ir.<locals>.symbolic_eq{  s   ø€ àŒwÔ×7Ò7¸¸1Ñ=Ô=Ð=r\   rí  r		  )rU  r   rV  r   rO   rŠ   )rk  rº  rã  rH  rI  rJ  rK  r	  r^   r?  r¹   )r	  r	  r	  rë  rí  rï  r	  rº  s          @rZ   Úinfer_scale_swizzle_irr	  d  sö   ø€ ð .Ð-Ð-Ð-Ð-Ð-à�|Š|‰~Œ~€HØ—’Ñ!Ô!€Jð ð .Ø˜Q”K ¨!¤Ð-ˆð DNÐT•)Ô"¥8¤<°¸QÑ?Ô?Ð?ÐST€Kð>ð >ð >ð >ð >ð >õ %Ý/2°8©}¬}ÀÒ/AÐ/A�(˜1”+˜x¨œ{Ð+Ð+ÈÐQRÌÐUVÐGWÝ˜Ñ$Ô$ØØ”)Ø”KØðñ ô ð r\   r-  )rƒ   r„   rO   r„   )rˆ   r‰   rO   rŠ   )r¯   r°   )r±   r²   r³   r„   r´   r„   rO   rµ   )r¯   r°   F)
r±   r²   r³   r„   r´   r„   r   rŠ   rO   rµ   )
r  r	  r
  r	  rù   r„   r  re   rO   rµ   r/  )rº   r:  rO   r;  )rE  rF  rO   r‰   )rP  rQ  rR  rQ  rO   r‰   )rZ  rQ  r[  rQ  rO   r‰   )r?  r‰   r[  rQ  rO   ra  )rE  rg  rO   rh  )rn  ro  rp  ro  rO   ro  )rv  rw  rO   rP   )r©  rª  rO   ra  )r°  r±  rO   ro  )rû   ro  rO   r±  )r©  rÂ  rO   rÃ  )rÇ  rÈ  rO   rŠ   )rÕ  r7   rÖ  r×  rO   rŠ   )rÝ  r   r’   rå  ræ  rç  rO   rè  )rJ   )rº   rP   rO   r  )r9   rJ   )
rû  rü  rý  rþ  rü   r„   rº   rP   rO   rµ   )rS   r  r  r  rJ   )rû  rü  rý  rþ  rü   r„   r  r„   r	  rµ   rº   rP   rO   rµ   )r  r   r  rP   rO   r  )r  r   r  r«   rO   r  )rU  r„   rV  r„   rO   r„   )rY   r  r_  r„   rO   r  )rY   r!  rO   r"  )r±   r;  rO   r<  )rO  rP   rO   rP  )rW  rX  rO   rY  )rW  rc  rd  re  rO   rP   )rW  rX  rK  r<   rO   r}  rš   )rÎ  rÏ  rÐ  rÑ  rO   rÒ  )r’   r×  ræ  rØ  rO   rÒ  rü  )r?  r‰   rO   rý  )r  rP   rO   rŠ   )r  rp   r„  r„   rO   r  )r  rŠ   rO   rŠ   )r×   rP   rO   r  )rµ  r‰   r  r  rO   r‰   )rU  r   rO   r"  )r’   r   rO   rŠ   )r÷  r,  rO   r-  )r÷  r,  rO   r7   )r÷  r,  rO   r8  r.  )r  r   rO   r   )rv  rP   r—   rP   rO   ri  )NNT)ro  rp  rq  rr  rs  rŠ   rO   ri  )r‘  rþ  r�  rŠ   rO   r’  )r¿  r-   r‘  rš  r�  rŠ   rO   r’  )r¹   r¶  rO   r„   rL  r
  r+  )r€  r�  rO   rŠ   rw  )r›  r„   rº   r;  rœ  r�  rO   r:   )r~   )r§  r„   rO   r„   )r—  rC   r¬  r­  rO   rŠ   )r±  rP   rO   rŠ   )
r—  rC   rÆ  rŠ   rÇ  rŠ   rÈ  rŠ   rO   rŠ   )rÕ  rB   rÓ  rÖ  rÔ  rŠ   rO   rŠ   r0  )r[  rQ  rÔ  rŠ   rO   rŠ   )rÕ  rB   rÓ  rC   rÔ  rŠ   rO   rŠ   )r  r8   r  r8   r   r!  rO   rŠ   )r=  r   r>  r   r—  rC   r?  rŠ   r@  rŠ   rA  rB  rC  rB  rD  rB  rO   rŠ   )
r—  rC   r]  r„   r�  r„   rJ  r„   rO   rŠ   r÷  )r—  rC   r]  rT  r�  rT  rJ  rT  r=  rB   r>  rB   rA  rU  rï  rV  rO   rŠ   )rb  rP   rO   rŠ   r–   )
r]  rT  r�  rT  rJ  rT  ri  r„   rO   rŠ   )r]  rT  r�  rT  rJ  rT  rO   rŠ   )r]  rT  r�  rT  rJ  rT  rO   r’  )rº   rP   rO   rP   )rO   r‹  )r—  rC   rO   rŠ   )r—  rC   rµ  r¶  r·  rB   rO   rŠ   )FTFN)r—  rC   rµ  rB   r·  rB   rÁ  rŠ   rº  rŠ   rÂ  rŠ   rÃ  r�  rO   rŠ   )r±   rñ  r’   r3  ræ  r4  rO   rò  )r±   rü  rO   r  )r±   rñ  r’   r3  ræ  r4  rO   r«   )r±   rñ  r’   r3  ræ  r4  rO   rP   )r±   rñ  r’   r3  ræ  r4  rO   r"  )r+  rü  r,  rü  rO   ri  )r4  rü  r5  r6  rO   r   )r>  rP   rO   r  rv  )r·  rþ  rO   rŠ   )rQ  rR  rO   rŠ   )r°  r‰   rO   r¶  )rX  rŠ   r’   r   ræ  r   rO   rY  )r¹   r¶  rO   rµ   )rˆ  rP   rO   rŠ   )rˆ  rP   rO   r„   )r˜  r	  rO   rŠ   )
rú  rü  r÷  r6   r£  rþ  r>  rP   rO   r  )r¶  r·  rO   rŠ   )r´  r¾  rÇ  r¿  rO   rŠ   )r´  rÌ  rO   rŠ   )rÐ  rH   rÑ  rÒ  rO   rŠ   )rÐ  rH   rO   rŠ   )r´  rÜ  rÇ  rÝ  rO   rŠ   )rà  rP   rá  rç  râ  rç  rO   r   )rÐ  rH   ré  rê  rá  rë  râ  rì  rí  rî  rO   r  )rü  r„   rý  r„   rO   r„   )r  r,  rO   r„   )r  r,  rO   r’  )r  r«   rO   ri  )r×   rP   rO   rP   )rº   rr  rO   rŠ   )r(  rP   r¡  r)  r†  r„   rO   r*  )r¹   r¶  rº   r5  r3  rr  r4  r6  r†  r�  rO   rŠ   )rº   rP   rO   rŠ   )r¹   r¶  rO   rŠ   )rÆ  rÈ  rˆ  rr  rB  r¶  rC  r¶  rD  rP   rE  rŠ   rO   rŠ   )rW  rc  rO   r  )rê   rë  rO   rŠ   )ra  rë  rO   rŠ   )rO   r  )r±   rñ  r’   r3  ræ  r4  rO   rm  )rQ  rz  rO   r{  )rû  r  r€  r  r�  r‚  rO   r  )rY   rë  rO   rë  )r„  r…  r’  r  r“  r”  rO   r•  )rQ  rz  r›  r  rO   r  )rË   r‰   rO   rŠ   )rý  rþ  r¦  rG   rO   r  )r¹   r¶  rO   rP   )r¹   rP   rO   r¶  )r“  rë  r—   rë  rO   rŠ   )rO   rÓ  )r×   rP   rä  r5   rå  rw  rO   r  )r×   rP   rO   r  )rÓ   rr  rO   rP   )rº   rô  rO   rŠ   )r¹   r¶  rO   r¶  )rœ   r  r¥   rŠ   rO   r   )rO   r  )rO   r"  )rÇ  r.  rO   r}  )r  r4  rO   rŠ   )r´  rD   rO   rŠ   )rK  r<   rO   rŠ   )r_  r„   rO   r¶  )rÓ   rP   rO   rŠ   )re  rf  rg  rh  rO   rP   )
rt  r   ru  r   rv  r
  rw  r
  rO   rx  )r~  rç  rO   rç  )r“  r„   rO   r”  )rY   r,   r   rŠ   rO   r¡  )rO   r¤  )rK  r³  rO   r  )rÐ  rH   rO   r¶  )ró  r=   rO   rŠ   )r×   rP   rÔ  r1   rO   rP   )r´  r4  rO   rŠ   )rO   r«   )rY   r„   r  r„   rO   r„   )rë  rì  rí  rî  rï  r   rð  r¶  rñ  r¶  rò  ró  rO   rô  )r	  rë  r	  rë  rO   rô  )r	  r@   r	  r@   r	  rŠ   rO   rô  (½  Ú
__future__r   r±  r  r  ÚenumrH  r(  rq  r¬  rä  r(  r  rJ  rk  r”  rÕ   r‹  ró   rH  r©  r…  r  r  r<  Úcollections.abcr   r   r   r   r   r	   r
   r   r   r   Útypingr   r   r   r   r   r   r   r   r   r   r   Útyping_extensionsr   r   r   r   r�   rU   Útorch.utils._pytreerX  Ú_pytreerÉ  Ú$torch._inductor.analysis.device_infor   Útorch._inductor.runtime.hintsr   Ú!torch.fx.passes.regional_inductorr   Útorch.utils._dtype_abbrsr    Útorch.utils._ordered_setr!   r"   r#   r  r$   ÚOPTIMUS_EXCLUDE_POST_GRADÚ#torch.fx.experimental._size_hintingr(   r/  r)   r*   r+   r,   r-   r.   r/   r0   Úpathlibr1   r2   r3   r4   Útorch._prims_commonr5   Útorch.fxr6   Útorch.fx.noder7   rø  r8   r¢  r:   r   r<   Údependenciesr=   r½  r?   r\  r@   rA   rB   rC   rD   rE   Úoutput_coderG   r&  rH   rI   r]   rN   rô   rb   Útorch._dynamo.device_interfacerc   Útorch._dynamo.utilsrd   Útorch.autogradre   Útorch.autograd.profiler_utilrf   Ú(torch.fx.passes.graph_transform_observerrg   Útorch.fx.passes.shape_proprh   Útorch.utils._sympy.functionsri   rj   rk   rl   rm   rn   Útorch.utils._sympy.symbolro   rp   Útorch.utils._sympy.value_rangesrq   rr   r`  rt   Úruntime.runtime_utilsru   ru  Ú_IS_WINDOWSÚ	getLoggerrž   rî   r  rx   r‡  rs  Ú	VarRangesrò  r„   Ú	InputTypeÚgetenvÚXPU_KERNEL_FORMATÚGPU_KERNEL_BIN_EXTSr_  r˜  rÜ  r¤  r�  r’  rž  r”  rŸ  r›  rœ  rá   rŒ  rŽ  r�  r‚  rƒ  r„  r†  r€   r®   r†   r‡   r‘   ÚFunctionr“   r  r§   rÿ   r  r"  r  r9  rD  rO  rY  r`  rf  rm  r¨  r¯  r·  rÁ  rÆ  rÑ  rÛ  rø  rß   r  r  r  r  r  r   r+  r,  r-  ÚFN_TYPEr0  rL  rN  rV  rb  r|  rÍ  rÖ  rê  rû  r  r	  r  r  r  r  r!  r%  r)  Ú	frozensetrº  r}   r?  r1  r7  rE  rZ  r_  r`  rf  rh  r  rn  r�  Úclear_on_fresh_inductor_cacheÚclear_inductor_cachesÚfresh_inductor_cacher™  rµ  rº  r¼  rÀ  rÃ  r3  rR  rZ  r\  rf  rÏ  ry  rŒ  r�  r“  r–  rš  r¦  r«  r°  r·  r¼  rÁ  rÅ  rÑ  r  r  r  r  r#  r+  r1  r/  r<  rI  rS  ra  rh  rT  rp  rt  r‡  rŠ  r›  r§  r¬  r¯  r²  r´  rÀ  r»  rã  rå  rü  r  r
  r  r  r!  r*  r3  r=  rB  rF  rL  rP  rU  rW  r[  rÞ  re  rx  r|  r�  r‡  rŒ  r‘  r–  rŠ  rÛ  rH  ÚEnumr   rµ  r¹  r½  rË  rÏ  r×  rÛ  rß  rå  rò  rù  r  r  r  r  r!  r$  r¯  r'  r2  r=  r?  rA  rP  r\  r`  rd  rl  ry  r~  r‹  r‘  r‡  rž  r¥  r°  r»  r¾  rÃ  r·  rÇ  ÚcompilerÂ  rÅ  rÊ  rÏ  rÒ  rá  rã  ræ  rè  ré  rë  ró  r÷  rú  rû  rü  rþ  r  r   r"  r+  r-  r3  r=  r0  rF  rO  rT  rY  r\  ÚSUPPORTED_MKLDNN_DEVICESr`  rd  rs  r}  r’  r›  rŸ  r£  r¬  r®  ÚPartitionFnTyper³  r²  rW  rµ  rÏ  rÓ  rØ  rá  rã  rä  rç  rê  r	  r	  r	  rS   r\   rZ   ú<module>r@	     s}!  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð CÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ Ð Ð Ð Ð Ð à €€€à €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø :Ð :Ð :Ð :Ð :Ð :Ø EÐ EÐ EÐ EÐ EÐ EØ 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø /Ð /Ð /Ð /Ð /Ð /Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð (Ø$ðÐ ð
 <Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð >Ø>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÐÐÐÐÐà/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØCÐCÐCÐCÐCÐCØ$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"Ø/Ð/Ð/Ð/Ð/Ð/à,Ð,Ð,Ð,Ð,Ð,Ø5Ð5Ð5Ð5Ð5Ð5Ø!Ð!Ð!Ð!Ð!Ð!Ø$Ð$Ð$Ð$Ð$Ð$ØTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTØ,Ð,Ð,Ð,Ð,Ð,Ø=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ð +Ð*Ð*€	Ø€GˆC�L„L€ð
 „ñð ð ñ „ðð DÐ CÐ CÐ CÐ CÐ CØ 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø %Ð %Ð %Ð %Ð %Ð %Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø KÐ KÐ KÐ KÐ KÐ KØ 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 8Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dà Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =ð Œl˜gÒ%€à€gÔ˜Ñ!Ô!€ð  CÐ ð €WˆT�]„]€Ø�”˜UœZÐ'Ô(€	ØŒL˜3Ñ ¤Ñ-°Ñ4€	ð ÐS€E€E˜i˜bœiÐ(IÈ7ÑSÔSð ð
 ØØ"Ð Ð"Ð"ðð Ð ð €Ø€	à€ØÐ ð
 2<°àŒØŒ
ØŒØŒØŒØŒØŒØŒØŒØŒØŒØÔØÔØÔØÔðñ2ô 2Ð ð ð ð ñ ð( €Ø�{ Q‘Ñ'¨AÒ-Ð-°+ÀÒ2BÐ2BÐ2BÐDXÑ2BÔ2BÐBñ5ð 5ð 5ð 5ñ
Lð Lð Lð Lðð ð ð ð ˆEŒNñ ô ð ð €Ô˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðñ"Gñ Gð Gð Gð GðX ØØ#(ñ	ñ ð ð ð ñ86.ð 6.ð 6.ð 6.ðv ØØ#(ñ	Nñ Nð Nð Nð Nðb „ñð ð ñ „ðñð ð ð ñ;ð ;ð ;ð ;ñ@ð @ð @ð @ñ
	ð 	ð 	ð 	ñð ð ð ñ+ð +ð +ð +ñ	*ð 	*ð 	*ð 	*ñ%Að %Að %Að %AñP+ð +ð +ð +ñ	ð 	ð 	ð 	ñð ð ð ñ"/ð /ð /ð /ñGð Gð Gð Gð @O¸ðIñ Ið Ið Ið Iñ0ð ð ð ñ0'ñ 'ð 'ð 'ð 'ð Øñ	ñ ð ð ð ð( %'ØØØØññ ð ð ð ñ )ð )ð )ð )ñ'ð 'ð 'ð 'ñ#ð #ð #ð #ñð ð ð ñ$ð $ð $ð $ð  €Iˆc�N„N€Ø€WˆT˜TÐ"Ñ"Ô"€Ø
�;˜s A˜vÔ&¨Ð*Ô
+€ðEð Eð Eð Eð E�8˜W Q¨ Uœ^ñ Eô Eð Eñð ð ð ñ:ð ð ð ñ+ð +ð +ð +ñ\ð ð ð ñ,4)ð 4)ð 4)ð 4)ñn_2ð _2ð _2ð _2ðH 15ññ ð ð ð ñ(Gð Gð Gð Gñ:,ð ,ð ,ð ,ñ^%ð %ð %ð %ñð ð ð ñ(ð (ð (ð (ñ	Dð 	Dð 	Dð 	DñUð Uð Uð Uñ	>ð 	>ð 	>ð 	>ñ+ð +ð +ð +ñð ð ð ñ-ð -ð -ð -ð $˜)ðð ð ð( Œ=ÔÐ(ð  ð	
ð 	
ð ñ+ñô Ð ñ6ð ð ð ñð ð ð ñ'ð 'ð 'ð 'ð& 
€	€	€	ñð ð ð ð< !#Ð Ð "Ð "Ð "Ñ "ñ	ð 	ð 	ð 	ñð ð ð ð Õñ"ñ "ð "ñ Ôñ"ð( Õà+/ØØñ7ñ 7ñ 7ð 7ñ Ôñ7ðv !5Ñ Ø$Ñ Ù"Ñ ð 49ñ ð ñ ñ ð ñ ð( ñ	7ð 7ñ 7ñ 7ð 7ñ 7ðt €Ô�QÑÔñ7ñ 7ð 7ñ Ôñ7ðð ñ ð ñ �*ñ ô ñ ð Ôð,ð ,ñ ,ð ,ñ ,ñ ,ô ,ñ Ôñ,ð
`'ð `'ñ `'ð `'ñ `'ñ `'ô `'ñ `'ðFLð Lñ Lð Lñ L™ñ Lô Lñ Lð^-ð -ñ -ð -ñ -‘Nñ -ô -ñ -ñ,
ñ 
ð 
ñ 
ð
ð 
ñ 
ð 
ñ 
™ñ 
ô 
ñ 
ð Õñ@ñ @ð @ñ Ôñ@ðð ñ ð ñ ñ ô ñ ð@?ð ?ñ ?ð ?ñ ?Ñ'ñ ?ô ?ñ ?ð „ññ ñ ð ñ „ñð8 ÔñJñ Jð Jñ ÔñJð Ôñ)ñ )ð )ñ Ôñ)ññ ð ñ ñIñ Ið Iñ Ið  $ññ ñ ð ñ ñ(ñ ñ ð ñ ññ ð ñ ñ ñ ð ñ ññ ð ñ ññ ð ñ ññ ð ñ ð ØØ#ñð ñ ñ ð ñ ð< 7;ÈuñBð Bñ Bñ Bð Bñ BðL 5:ññ ñ ð ñ ð4 BGñOð Oñ Oñ Oð Oñ Oð2 BGñVð Vñ Vñ Vð Vñ Vñ Oñ Oð Oñ Oð €Ô˜QÑÑÔñ	ñ 	ð 	ñ  Ôñ	ð €Ô˜QÑÑÔññ ð ñ  ÔññBð Bñ Bð0 €Ô˜QÑÑÔññ ð ñ  Ôññ>ñ >ð >ñ >ñBñ ð ñ ðP ØñEñ Eñ Eð Eñ EñPJñ Jð Jñ Jð ˜EœJÑ&�Ñ &Ð &Ñ &Ñ &ð „àEFññ ñ ð ñ „ñð( „ññ ð ñ „ñð. „ñ5(ñ 5(ð 5(ñ „ñ5(ðp „ñ@ñ @ð @ñ „ñ@ð „ñRñ Rð Rñ „ñRñ:"ñ "ð "ñ "ñJñ ð ñ ññ ð ñ ñHñ Hð Hñ Hñ&ñ &ð &ñ &ññ ð ñ ð: "Ø"&ØØ#ñ=ñ =ñ =ð =ñ =ñ@'ñ 'ð 'ñ 'ðCð Cñ Cð Cñ Cñ Cô Cñ Cñ"&ñ &ð &ñ &ñ$ñ ð ñ ñ&/ñ /ð /ñ /ñ(ñ (ð (ñ (ñVñ ð ñ ñ	ñ 	ð 	ñ 	ñ#ñ #ð #ñ #ð* Õñ.ñ .ð .ñ Ôñ.ð$ FJñFñ Fñ Fð Fñ Fñ*	ñ 	ð 	ñ 	ññ ð ñ ñB&ñ &ð &ñ &ñ&ñ &ð &ñ &ññ ð ñ ññ ð ñ ð Õññ ð ñ Ôñññ ð ñ ð „ñDñ Dð Dñ „ñDð „ñ.6ñ .6ð .6ñ „ñ.6ðb „ññ ð ñ „ññQñ Qð Qñ Qñ.ñ .ð .ñ .ñ0ñ 0ð 0ñ 0ñ
ñ 
ð 
ñ 
ñ(ñ (ð (ñ (ñ#ñ #ð #ñ #ñKñ Kð Kñ Kññ ð ñ ð(*ð *ñ *ð *ñ *�$•)ñ *ô *ñ *ñ 
ñ  
ð  
ñ  
ñF	ñ 	ð 	ñ 	ññ ð ñ ð" *.ñ#ñ #ñ #ð #ñ #ñL(ñ (ð (ñ (ð =Añ	Qñ 	Qñ 	Qð 	Qñ 	Qñ#ñ #ð #ñ #ñJñ Jð Jñ JñLñ Lð Lñ Lñ *=Ð)<ð
ñ 
ñ 
ð 
ñ 
ñ< *=Ð)<ðñ ñ ð ñ ñ:Tñ Tð Tñ Tñ ñ  ð  ñ  ñ2ñ ð ñ ð  Ôðð ñ ð ñ ñ ô ñ Ôñð Õññ ð ñ Ôññ,!ñ !ð !ñ !ññ ð ñ ñ)ñ )ð )ñ )ð
 €Ô�TÑÔñ'ñ 'ð 'ñ Ôñ'ð0 )-ñ10ð "&Ø$(Ø ñ10ð 10ñ 10ñ 10ð 10ñ 10ñh.ñ .ð .ñ .ñ2ñ 2ð 2ñ 2ñ$ñ $ð $ñ $ñNHñ Hð Hñ HñBñ ð ñ ñLñ Lð Lñ Lñ'ñ 'ð 'ñ 'ñ ñ ð ñ ñ2ñ ð ñ ñ:ñ ð ñ ñ0	:ñ 	:ð 	:ñ 	:ð 04ñ$ñ $ñ $ð $ñ $ñ<ñ ð ñ ñ$*Iñ *Ið *Iñ *IñZñ ð ñ ñ:ñ ð ñ ñ&/ñ /ð /ñ /ñ Ù'Ù#Ù)Ù*ñ $Ù%ñ
ð 
Ñ ñ HÐGÑ*>×*DÓ*DÑ*FÔ*FÐGÑGÔGÑ ð �"•*™YÑ'Ô'�ñHñ Hð Hñ Hññ ð ñ ñ	ñ 	ð 	ñ 	ññ ð ñ ð „ññ ð ñ „ñð& Ôð.ð .ñ .ð .ñ .ñ .ô .ñ Ôñ.ð
 68Ñ Ñ 7Ð 7Ñ 7Ñ 7ññ ð ñ ð /9¨j©l¬lÑ Ñ :Ð :Ñ :Ñ :ñ)ñ )ð )ñ )ñ#ñ #ñ #ð #ñ #ñ"ñ ð ñ ññ ð ñ ð ˆ'‘)Ñ
Ô
�Ø
ˆ'‘)Ñ
Ô
�ð-"ð -"ñ -"ð -"ñ -"�¡©Ð 0Ô1ñ -"ô -"ñ -"ð` Ð DÑ)Ñ)Ô)ñÀDð ð ñ ñ ð ñ *Ô)ñññ ð ñ ðð ñ ð ñ  4¥9ñ ô ñ ð „ñ4ñ 4ð 4ñ „ñ4ñ2Yñ Yð Yñ Yñ5ñ 5ð 5ñ 5ñ!ñ !ð !ñ !ñH"ñ "ð "ñ "ñJñ ð ñ ñ4
ñ 
ð 
ñ 
ññ ð ñ ñ1ñ 1ð 1ñ 1ññ ð ñ ñ *Ñ ñ	ñ 	ð 	ñ 	ñ	ñ 	ð 	ñ 	ññ ð ñ ð& "&Ø!%ñ	 
ñ  
ñ  
ð  
ñ  
ñFRñ Rð Rñ Rñj&2ñ &2ð &2ñ &2ñRñ ð ñ ñ6ñ ð ñ ññ ð ñ ð6 €Ô˜dÐ#Ñ#Ô#ðð ñ ð ñ ñ ô ñ $Ô#ñð ™3 ˜8Ô$�ØÙÑ.Ð/±Ð@ôÑ ð0ð 0ñ 0ð 0ñ 0ñ 0ô 0ñ 0ð *:Ñ)9Ñ);Ô);Ñ &ñ=ñ =ð =ñ =ñ+ñ +ð +ñ +ñ\
ñ 
ð 
ñ 
ññ ð ñ ñ"-ñ "-ð "-ñ "-ðL �ðñ ð ñô �ñ$%ñ %ð %ñ %ð
 ññ ð ñ „ññ"ñ "ð "ñ "ñ
Mñ Mð Mñ Mñ`ñ ð ñ ðB ñ"ñ "ñ "ð "ñ "ð "ð "r\   