§
    ŠŠtjP ã                  óL	  — 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mZmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZ d dl m!Z! d dl"m#Z# dd	l$m%Z%m&Z& er"d d
l'm(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z. ddl/m0Z0 ddl1m2Z2 d dl3Z3d dl4Z4d dl5Z4d dl6m7c m8Z9 d dl:m;Z;m<Z< d dl=m>Z> d dl?m@Z@mAZA d dlBmCZC d dlDmEZEmFZF d dlGmHZH d dlImJZJ d dlKmLZL d dlMmNZNmOZOmPZP d dlQmRZR ddlSmTZTmUZUmVZVmWZWm$Z$mXZX ddlYmZZZ ddl[m\Z\m]Z]m^Z^ ddl_m`Z`maZa ddlWmbZbmcZcmdZdmeZe ddlfmgZgmhZh ddlimjZj dd l$mkZkmlZlmmZmmnZnmoZompZp dd!lqmrZr dd"lsmtZtmuZu dd#lvmwZwmxZx dd$lymzZzm{Z{m|Z| dd%l}m~Z~ dd&l7mZm€Z€m�Z�m‚Z‚mƒZƒm„Z„m…Z…m†Z†m‡Z‡mˆZˆm‰Z‰mŠZŠm‹Z‹mŒZŒm�Z�mŽZŽm�Z�m�Z�m‘Z‘ dd'l’m“Z“  e	j”        e•¦  «        Z–e4j—         ˜                    e•d(¦  «        Z™e4j—         ˜                    e•d)¦  «        Zše4j—         ˜                    e•d*¦  «        Z›e4j—         ˜                    e•d+¦  «        Zœe�d,         Zžd-eŸd.<    ed/¦  «        Z  e!d0¦  «        Z¡ej¢         G d1„ d2¦  «        ¦   «         Z£ej¢         G d3„ d4¦  «        ¦   «         Z¤ G d5„ d6e¦  «        Z¥ ej¢        d7¬8¦  «         G d9„ d:¦  «        ¦   «         Z¦d¯d?„Z§ G d@„ dA¦  «        Z¨ G dB„ dC¦  «        Z©ej¢         G dD„ dE¦  «        ¦   «         Zªej¢         G dF„ dGeª¦  «        ¦   «         Z« G dH„ d,¦  «        Z¬ej­        d°dJ„¦   «         Z®d±dM„Z¯d²dO„Z°d³dQ„Z± ej¢        d7¬8¦  «         G dR„ dS¦  «        ¦   «         Z²d´dV„Z³ G dW„ dX¦  «        Z´dµd_„Zµ G d`„ dae¬¦  «        Z¶ G db„ dce¬¦  «        Z· G dd„ dee¬¦  «        Z¸d¶dh„Z¹d·dm„Zº G dn„ doe¬¦  «        Z» G dp„ dqe»¦  «        Z¼ G dr„ dse»¦  «        Z½ G dt„ due»¦  «        Z¾ G dv„ dwe»¦  «        Z¿ G dx„ dye¬¦  «        ZÀ	 d¸d¹d‚„ZÁdºd‡„ZÂd»d‰„ZÃd¼d’„ZÄd½d•„ZÅej¢         G d–„ d—¦  «        ¦   «         ZÆ ejÇ        ¦   «         ZÈd¾dš„ZÉd¿d›„ZÊdÀd�„ZËd7džœdÁd „ZÌdÂd¢„ZÍdÀd£„ZÎdÃd¤„ZÏdÃd¥„ZÐdÃd¦„ZÑdÃd§„ZÒej¢         G d¨„ d©¦  «        ¦   «         ZÓej¢         G dª„ d«¦  «        ¦   «         ZÔ G d¬„ dj¦  «        ZÕ G d­„ d®¦  «        ZÖdS )Äé    )ÚannotationsN)ÚCounterÚdefaultdict)Úas_completedÚFuture)ÚAnyÚGenericÚLiteralÚ
NamedTupleÚoverloadÚTYPE_CHECKINGÚ	TypeAliasÚTypeVar)Ú	ParamSpec©Ú
OrderedSeté   )ÚComputedBufferÚ	Pointwise)ÚCallableÚIteratorÚSequence)Ú
ModuleType)ÚEnterCudaStreamContextLine)ÚPythonWrapperCodegen)ÚCoalesceVarAnalysis)ÚcountersÚdynamo_timed)Úuse_pipelined_autotuning)ÚLambdaFutureÚPyCodeCache)ÚTritonTemplateCallerBase)Úget_metric_tableÚis_metric_table_enabled)Úget_stream_name)Úfree_symbols)ÚFloorDiv)Úfree_symbol_is_typeÚsymbol_is_typeÚSymT)Ú
has_triton)ÚcommsÚconfigÚconfig_commsÚdependenciesÚirÚmetrics)Úcan_codegen_without_upcasts)ÚBackendFeatureÚget_scheduling_for_deviceÚKernel)Ú estimate_nccl_collective_runtimeÚ/estimate_nccl_collective_runtime_nccl_estimator)ÚDepÚ	MemoryDepÚStarDepÚWeakDep)ÚGPUTooOldForTritonÚTritonMissing)Úcount_flops_fx)Úassign_origin_nodeÚget_device_typeÚGraphPartitionSignatureÚMultiOutputÚMultiOutputLayoutÚ
NoneLayout)ÚLoopBody)ÚMemoryPlanningInfoForBufferÚMemoryPlanningInfoForNode)ÚDevicePropertiesÚReductionHint)Ú
green_textÚis_power_of_2Úred_text)ÚSimplifyIndexing)Ú&_unstable_customized_partition_wrapperÚcache_on_selfÚcmpÚdevice_need_guardÚget_current_backendÚget_device_tflopsÚget_dtype_sizeÚget_gpu_dram_gbpsÚget_op_namesÚGraphPartitionMapÚIndentedBufferÚis_collectiveÚis_cudagraph_unsafe_opÚis_gpuÚis_multi_outputs_templateÚ#is_output_of_multi_outputs_templateÚis_waitÚsympy_productÚ
sympy_subs)ÚVÚfusionÚloop_orderingÚcompute_dependenciesÚ
cudagraphsÚBaseSchedulerNoder   ÚPartitionTypeÚ_TÚ_Pc                  ót   — e Zd ZU dZded<   dZded<   dZded<   d„ Zedd
„¦   «         Z	e	 ddd„¦   «         Z
dS )ÚFusionResultNzbool | NoneÚshould_fusezCallable[[], bool] | NoneÚcallable_fnúLambdaFuture | NoneÚfuturec                ó@   — | j         d u| j        d uz  s
J d¦   «         ‚d S )NzLFusion result should contain either fusion decision or callable_fn, not both)rl   rm   ©Úselfs    úW/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_inductor/scheduler.pyÚ__post_init__zFusionResult.__post_init__‚   s>   € ØÔ ¨Ð,°Ô1AÈÐ1MÑNð 	
ð 	
ØZñ	
ô 	
ÐNð 	
ð 	
ó    Úboolc                ó"   — t          |¬¦  «        S )N)rl   ©rk   )Úclsrl   s     rs   ÚfusezFusionResult.fuse‡   s   € å¨Ð4Ñ4Ô4Ð4ru   úCallable[[], bool]c                ó$   — t          ||¬¦  «        S )N©rm   ro   rx   )ry   rm   ro   s      rs   Úfrom_callablezFusionResult.from_callable‹   s   € õ ¨¸FÐCÑCÔCÐCru   )rl   rv   ©N)rm   r{   ro   rn   )Ú__name__Ú
__module__Ú__qualname__rl   Ú__annotations__rm   ro   rt   Úclassmethodrz   r~   © ru   rs   rk   rk   |   s§   € € € € € € à#€KÐ#Ð#Ð#Ñ#Ø-1€KÐ1Ð1Ð1Ñ1Ø"&€FÐ&Ð&Ð&Ñ&ð
ð 
ð 
ð
 ð5ð 5ð 5ñ „[ð5ð àLPðDð Dð Dð Dñ „[ðDð Dð Dru   rk   c                  óD   — e Zd ZU ded<   ded<   ded<   dZded<   dd„ZdS )ÚPendingFusionr{   rm   rf   Únode1Únode2Nrn   ro   Úreturnú+tuple[BaseSchedulerNode, BaseSchedulerNode]c                ó   — | j         | j        fS r   ©rˆ   r‰   rq   s    rs   Úget_fusion_nodeszPendingFusion.get_fusion_nodes™   s   € Ø”
˜DœJÐ'Ð'ru   )rŠ   r‹   )r€   r�   r‚   rƒ   ro   rŽ   r…   ru   rs   r‡   r‡   ’   s_   € € € € € € à#Ð#Ð#Ñ#ØÐÐÑØÐÐÑØ"&€FÐ&Ð&Ð&Ñ&ð(ð (ð (ð (ð (ð (ru   r‡   c                  ó2   — e Zd ZU dZded<   ded<   ded<   dS )Ú_LocalEntryzåOne row of the post-rewrite slice the gate builds.

    `cur` is the step the node currently wants to run at, `baseline`
    is its original index (used to break ties when sorting), and
    `node` is the slice member itself.
    ÚintÚcurÚbaselinerf   ÚnodeN)r€   r�   r‚   Ú__doc__rƒ   r…   ru   rs   r�   r�   �   s<   € € € € € € ðð ð €H€H�HØ€M€M�MØÐÐÑÐÐru   r�   T)Úslotsc                  óp   — e Zd ZU dZded<   ded<   dZded<   dZded	<    ej        e	¬
¦  «        Z
ded<   dS )ÚComboKernelMemoryContexta  Shared state used by the memory-aware combo gate.

    Candidate windows are evaluated independently against the original
    schedule. Earlier accepted combos only contribute through `running_peak`,
    which caps the cumulative peak drift from the original graph.
    úOrderedSet[str]Úgraph_outputsúdict[BaseSchedulerNode, int]Únode_to_idxr   r‘   Úbaseline_peakÚrunning_peak©Údefault_factoryú	list[int]Úbaseline_live_beforeN)r€   r�   r‚   r•   rƒ   r�   rž   ÚdataclassesÚfieldÚlistr¢   r…   ru   rs   r˜   r˜   ª   s~   € € € € € € ðð ð #Ð"Ð"Ñ"Ø-Ð-Ð-Ñ-Ø€MÐÐÐÑð €LÐÐÐÑð '8 kÔ&7ÈÐ&MÑ&MÔ&MÐÐMÐMÐMÑMÐMÐMru   r˜   rˆ   r‰   rŠ   rv   c                ó¶   — |                       ¦   «         r|                      ¦   «         sdS |                      ¦   «         j        }|dv ot          |¦  «        dk    S )NF)ÚcudaÚxpuÚtriton)r[   Ú
get_deviceÚtyperR   )rˆ   r‰   Údevice_types      rs   Ú_is_gpu_triton_backendr­   À   s\   € ð �<Š<‰>Œ>ð  §¢¡¤ð ØˆuØ×"Ò"Ñ$Ô$Ô)€Kà�Ð&ÐWÕ+>¸{Ñ+KÔ+KÈxÒ+Wðru   c                  ó2  — e Zd ZdZedd„¦   «         Zedd„¦   «         Zedd„¦   «         Zedd„¦   «         Z	edd„¦   «         Z
edd„¦   «         Zed d„¦   «         Zed!d„¦   «         Zedd„¦   «         Zedd„¦   «         Zedd„¦   «         Zed"d„¦   «         ZdS )#ÚMixOrderReductionz™
    This class contains utility functions to decide if we should fuse reductions
    reducing across different dimensions of the same input tensor.
    r”   rf   rŠ   rv   c                ó€   — |                       ¦   «         o*t          d„ |                      ¦   «         D ¦   «         ¦  «        S )Nc              3  ó¸   K  — | ]U}t          |t          ¦  «        ¯|                     ¦   «         ¯+t          |j        t          ¦  «        ¯E|j        j        d uV — ŒVd S r   )Ú
isinstanceÚSchedulerNodeÚis_reductionr”   r   Ú_split_size©Ú.0Úsubnodes     rs   ú	<genexpr>z7MixOrderReduction.is_split_reduction.<locals>.<genexpr>Ô   s|   è è € ð +
ð +
àÝ˜'¥=Ñ1Ô1ð+
ð ×$Ò$Ñ&Ô&ð	+
õ
 ˜7œ<­Ñ8Ô8ð+
ØŒLÔ$¨DÐ0ð+
ð +
ð +
ð +
ð +
ð +
ru   )r´   ÚallÚ	get_nodes©r”   s    rs   Úis_split_reductionz$MixOrderReduction.is_split_reductionÒ   sM   € à× Ò Ñ"Ô"ð 
¥sð +
ð +
àŸ>š>Ñ+Ô+ð+
ñ +
ô +
ñ (
ô (
ð 	
ru   útuple[sympy.Expr, sympy.Expr]c                ó  — |                       |¦  «        �rjd }d }|                     ¦   «         D �]H}t          |t          ¦  «        r.|                     ¦   «         rt          |j        t          ¦  «        sŒG|j        j        €J ‚t          j	        j
                             t          |j        j        ¦  «        ¦  «        }|j        j        €J ‚t          j	        j
                             t          |j        j        ¦  «        ¦  «        }|€|}|}Œàt          j	        j
                             ||¦  «        sJ |› d|› �¦   «         ‚t          j	        j
                             ||¦  «        sJ |› d|› �¦   «         ‚�ŒJ|€J ‚||fS |j        d         S )Nú v.s. r   )r½   r»   r²   r³   r´   r”   r   Ú_original_rangesra   ÚgraphÚsizevarsÚsimplifyr_   Ú_original_reduction_rangesÚstatically_known_equalsÚgroup)ry   r”   ÚxnumelÚrnumelr¸   Ú	curxnumelÚ	currnumels          rs   Úget_numel_rnumelz"MixOrderReduction.get_numel_rnumelÜ   sÁ  € à×!Ò! $Ñ'Ô'ñ "	!ØˆFØˆFØŸ>š>Ñ+Ô+ð 4ñ 4�å˜w­Ñ6Ô6ðà×,Ò,Ñ.Ô.ðõ # 7¤<µÑ@Ô@ðð
 à”|Ô4Ð@Ð@Ð@ÝœGÔ,×5Ò5Ý! '¤,Ô"?Ñ@Ô@ñô �	ð ”|Ô>ÐJÐJÐJÝœGÔ,×5Ò5Ý! '¤,Ô"IÑJÔJñô �	ð �>Ø&�FØ&�F�Fåœ7Ô+×CÒCØ 	ñô ð 4ð 4à Ð3Ð3¨	Ð3Ð3ñ4ô 4ð õ œ7Ô+×CÒCØ 	ñô ð 4ð 4à Ð3Ð3¨	Ð3Ð3ñ4ô 4ð ñ 4ð Ð%Ð%Ð%Ø˜FÐ#Ð#à”:˜a”=Ð ru   rˆ   r‰   c                ó  — |                       |¦  «        }|                       |¦  «        }t          |¦  «        dk    st          |¦  «        dk    s||k    rdS t          |¦  «        t          t          |¦  «        ¦  «        k    S )Né   F)rÌ   ÚlenÚtupleÚreversed)ry   rˆ   r‰   Úg1Úg2s        rs   Úhas_mix_reduction_ordersz*MixOrderReduction.has_mix_reduction_orders  ss   € ð ×!Ò! %Ñ(Ô(ˆØ×!Ò! %Ñ(Ô(ˆåˆr‰7Œ7�aŠ<ˆ<�3˜r™7œ7 aš<˜<¨2°ª8¨8Ø�5å�R‰yŒy�E¥(¨2¡,¤,Ñ/Ô/Ò/Ð/ru   ÚbufÚstrc                ó.  — d}|j         j        D ]&}t          |t          ¦  «        r|j        |k    r|} nŒ'|sdS |j        }|j         j        }|sDt          |t          ¦  «        sJ t          |¦  «        › ¦   «         ‚|j	        d         j         j        }|sJ ‚t          |¦  «        t          |j        ¦  «        z
  sdS t          j        j                             t!          |j        ¦  «        t!          |                     ¦   «         ¦  «        ¦  «        rdS dS )z@
        The access to 'buf' is not a broadcast access.
        NFr   T)Úread_writesÚreadsr²   r9   ÚnameÚindexÚ
var_rangesÚFusedSchedulerNoder«   Úsnodesr   r&   ra   rÂ   rÃ   rÆ   r_   ÚsizeÚvalues)ry   rÕ   r”   Ú	found_depÚdeprÛ   rÜ   s          rs   Ú_is_full_accessz!MixOrderReduction._is_full_access  s"  € ð
 ˆ	ØÔ#Ô)ð 	ð 	ˆCÝ˜#�yÑ)Ô)ð ¨c¬h¸#ªo¨oØ�	Ø�øàð 	Ø�5à”ˆØÔ%Ô0ˆ
àð 	?Ý˜dÕ$6Ñ7Ô7ÐHÐH½DÀ¹J¼J¸ÑHÔHÐ7Øœ QœÔ3Ô>ˆJàÐÐˆzÝ˜:Ñ&Ô&­°EÔ4FÑ)GÔ)GÑGð 	Ø�4õ
 Œ7Ô×3Ò3Ý˜)œ.Ñ)Ô)­=¸×9JÒ9JÑ9LÔ9LÑ+MÔ+Mñ
ô 
ð 	ð �4Øˆuru   ú	list[str]c                óè   — g }|                      ¦   «         |                      ¦   «         z  }|D ]C}|                      ||¦  «        r+|                      ||¦  «        r|                     |¦  «         ŒD|S r   )Úused_buffer_namesrã   Úappend)ry   rˆ   r‰   ÚoutÚcommon_readsrÕ   s         rs   Úget_common_readz!MixOrderReduction.get_common_read0  s~   € ð ˆØ×.Ò.Ñ0Ô0°5×3JÒ3JÑ3LÔ3LÑLˆØð 	 ð 	 ˆCØ×"Ò" 3¨Ñ.Ô.ð  °3×3FÒ3FÀsÈEÑ3RÔ3Rð  Ø—
’
˜3‘”�øàˆ
ru   c                óP   — t          |                      ||¦  «        ¦  «        dk    S ©Nr   )rÏ   rê   ©ry   rˆ   r‰   s      rs   Úhas_common_readz!MixOrderReduction.has_common_read<  s'   € õ �3×&Ò& u¨eÑ4Ô4Ñ5Ô5¸Ò9Ð9ru   r‘   c                ó–   — |                       |¦  «        }t          j        j                             |d         |d         z  d¬¦  «        S )Nr   r   ©Úfallback)rÌ   ra   rÂ   rÃ   Úoptimization_hint)ry   r”   rÒ   s      rs   Ú	get_numelzMixOrderReduction.get_numelB  s?   € à×!Ò! $Ñ'Ô'ˆÝŒwÔ×1Ò1°"°Q´%¸"¸Q¼%±-È!Ð1ÑLÔLÐLru   c                ó,   — |                       |¦  «        S r   )ró   rí   s      rs   Úget_fusion_scorez"MixOrderReduction.get_fusion_scoreG  s   € ð
 �}Š}˜UÑ#Ô#Ð#ru   c                ó>  — t           j        j        sdS t          j        j        rdS t          ||¦  «        sdS |                     ¦   «         r|                     ¦   «         sdS |j        | 	                    ¦   «         z  s|j        | 	                    ¦   «         z  rdS |  
                    ||¦  «        sdS t                               ||¦  «        }t          |¦  «        dk    rdS |                      |¦  «        r||}}n|                      |¦  «        r||}}ndS |                      |¦  «        }|\  }}t           j        j        s¼d}	t          j        j                             t'          j        ||z  |	¦  «        dd¬¦  «        sdS t          j        j                             t'          j        ||dz  ¦  «        dd¬¦  «        sdS t          j        j                             t'          j        |d¦  «        dd¬¦  «        sdS t+          d„ |                     ¦   «         D ¦   «         ¦  «        rdS t          j        j                             |d	¦  «        sdS t                               |¦  «        rdS t3          d
„ |                     ¦   «         D ¦   «         ¦  «        }
|
S )zP
        Check whether we can fuse two reductions with mix loop orders.
        Fr   i  P T)Úsize_obliviousÚfallback_valuerÎ   i   c              3  ó�   K  — | ]A}|                      ¦   «         ¯|j        j        j        t          j        t          j        fvV — ŒBd S r   )r´   r”   ÚdataÚreduction_hintrI   ÚINNERÚDEFAULTr¶   s     rs   r¹   z-MixOrderReduction.can_fuse.<locals>.<genexpr>Ÿ  sh   è è € ð 
ð 
ð Ø×#Ò#Ñ%Ô%ð
ØŒLÔÔ,åÔ#ÝÔ%ððð
ð 
ð 
ð 
ð 
ð 
ru   i @  c              3  ót   K  — | ]3}|                      ¦   «         ¯|j                             ¦   «         d v V — Œ4dS )>   ÚsumÚprodN)r´   r”   Úget_reduction_typer¶   s     rs   r¹   z-MixOrderReduction.can_fuse.<locals>.<genexpr>µ  sb   è è € ð 
ð 
ð Ø×#Ò#Ñ%Ô%ð
ØŒL×+Ò+Ñ-Ô-ððð
ð 
ð 
ð 
ð 
ð 
ru   )r-   r©   Úmix_order_reductionra   rÂ   Úcpp_wrapperr­   r´   Ú	ancestorsÚget_operation_namesrÔ   r¯   rê   rÏ   Úis_contiguous_noderÌ   Ú#mix_order_reduction_non_strict_moderÃ   Úevaluate_exprÚsympyÚGeÚanyr»   Ústatically_known_leqr½   rº   )ry   rˆ   r‰   ré   Úcontiguous_nodeÚ
other_noderÒ   ÚnrowÚncolÚ
size_thresrè   s              rs   Úcan_fusezMixOrderReduction.can_fuseO  sÿ  € õ
 Œ}Ô0ð 	Ø�5õ Œ7Ôð 	Ø�5å% e¨UÑ3Ô3ð 	Ø�5Ø×!Ò!Ñ#Ô#ð 	¨5×+=Ò+=Ñ+?Ô+?ð 	Ø�5àŒO˜e×7Ò7Ñ9Ô9Ñ9ð 	ØŒO˜e×7Ò7Ñ9Ô9Ñ9ð	ð �5ð ×+Ò+¨E°5Ñ9Ô9ð 	Ø�5õ )×8Ò8¸ÀÑFÔFˆÝˆ|ÑÔ Ò!Ð!Ø�5à×!Ò! %Ñ(Ô(ð 	Ø*/°˜ZˆOˆOØ×#Ò# EÑ*Ô*ð 	Ø*/°˜ZˆOˆOà�5à×!Ò! /Ñ2Ô2ˆØ‰
ˆˆdõ Œ}Ô@ð "	ð #ˆJõ
 ”7Ô#×1Ò1Ý”˜ ™ jÑ1Ô1Ø#Ø$ð 2ñ ô ð ð
 �uõ
 ”7Ô#×1Ò1Ý”˜˜t a™xÑ(Ô(Ø#Ø$ð 2ñ ô ð ð
 �uõ
 ”7Ô#×1Ò1Ý”˜˜tÑ$Ô$Ø#Ø$ð 2ñ ô ð ð
 �uõ ð 
ð 
ð +×4Ò4Ñ6Ô6ð
ñ 
ô 
ñ 
ô 
ð 		ð �5õ
 ŒwÔ×4Ò4°T¸9ÑEÔEð 	Ø�5å×/Ò/°Ñ@Ô@ð 	Ø�5õ ð 
ð 
ð &×/Ò/Ñ1Ô1ð
ñ 
ô 
ñ 
ô 
ˆð ˆ
ru   c                ó.   — |                       ||¦  «        S r   )r  rí   s      rs   Úare_mix_order_reductionsz*MixOrderReduction.are_mix_order_reductionsÀ  s   € ð �|Š|˜E 5Ñ)Ô)Ð)ru   c                óZ   ‡ ‡— t          ˆ ˆfd„‰j        j        D ¦   «         ¦  «        sdS dS )Nc              3  óN   •K  — | ]}‰                      |j        ‰¦  «        V — Œ d S r   )Úis_contiguous_loadrÚ   )r·   râ   ry   r”   s     €€rs   r¹   z7MixOrderReduction.is_contiguous_node.<locals>.<genexpr>È  sF   øè è € ð 
ð 
Ø7:ˆC×"Ò" 3¤8¨TÑ2Ô2ð
ð 
ð 
ð 
ð 
ð 
ru   FT)rº   rØ   rÙ   )ry   r”   s   ``rs   r  z$MixOrderReduction.is_contiguous_nodeÆ  sS   øø€ åð 
ð 
ð 
ð 
ð 
Ø>BÔ>NÔ>Tð
ñ 
ô 
ñ 
ô 
ð 	ð �5Øˆtru   Úparent_nodec                óÞ  ‡— ddl m} |                     ¦   «         D ]Ð}t          |t          ¦  «        sJ ‚|j        }|j        |j                 }ˆfd„|D ¦   «         }t          |¦  «        dk    rŒT|D ]y}|j	        |         }	|j
        }
t          |
                     ¦   «         ¦  «        }t          j        j                             |	||¦  «        }|d         dk    s|d         dk    s  dS ŒzŒÑdS )Nr   ©ÚMemoryUsageTypec                ó4   •— g | ]}|j         ‰k    ¯|j        ‘ŒS r…   )Úbuffer_nameÚ
index_name)r·   ÚerÕ   s     €rs   ú
<listcomp>z8MixOrderReduction.is_contiguous_load.<locals>.<listcomp>Ö  s'   ø€ ÐQÐQÐQ¨A¸A¼MÈSÒ<PÐ<P˜1œ<Ð<PÐ<PÐ<Pru   éÿÿÿÿr   FT)Útorch._inductor.loop_bodyr  r»   r²   r³   Ú_bodyÚmemory_usageÚLOADrÏ   Úindexing_exprsrÜ   r¥   Úkeysra   rÂ   rÃ   Ústride_vars)ry   rÕ   r  r  r”   Ú	loop_bodyÚentriesÚindex_namesr  Ú
index_exprrÜ   Úvar_symbolsr(  s    `           rs   r  z$MixOrderReduction.is_contiguous_loadÎ  s#  ø€ à=Ð=Ð=Ð=Ð=Ð=à×)Ò)Ñ+Ô+ð 	!ð 	!ˆDÝ˜d¥MÑ2Ô2Ð2Ð2Ð2Øœ
ˆIØÔ,¨_Ô-AÔBˆGØQÐQÐQÐQ°ÐQÑQÔQˆKå�;ÑÔ 1Ò$Ð$Øð *ð !ð !�
Ø&Ô5°jÔA�
Ø&Ô1�
õ # :§?¢?Ñ#4Ô#4Ñ5Ô5�ÝœgÔ.×:Ò:ØØØñô �ð $ Bœ¨1Ò,Ð,°¸B´À1Ò0DÐ0DØ ˜5˜5˜5øð!ð ˆtru   N©r”   rf   rŠ   rv   )r”   rf   rŠ   r¾   ©rˆ   rf   r‰   rf   rŠ   rv   )rÕ   rÖ   r”   rf   rŠ   rv   )rˆ   rf   r‰   rf   rŠ   rä   ©r”   rf   rŠ   r‘   ©rˆ   rf   r‰   rf   rŠ   r‘   )rÕ   rÖ   r  rf   rŠ   rv   )r€   r�   r‚   r•   Ústaticmethodr½   r„   rÌ   rÔ   rã   rê   rî   ró   rõ   r  r  r  r  r…   ru   rs   r¯   r¯   Ì   s©  € € € € € ðð ð
 ð
ð 
ð 
ñ „\ð
ð ð#!ð #!ð #!ñ „[ð#!ðJ ð	0ð 	0ð 	0ñ „[ð	0ð ðð ð ñ „[ððB ð	ð 	ð 	ñ „[ð	ð ð:ð :ð :ñ „[ð:ð
 ðMð Mð Mñ „[ðMð ð$ð $ð $ñ „[ð$ð ðnð nð nñ „[ðnð` ð*ð *ð *ñ „[ð*ð
 ðð ð ñ „[ðð ðð ð ñ „[ðð ð ru   r¯   c                  ó  — e Zd ZdZdZdZed8d	„¦   «         Zed8d
„¦   «         Ze	d9d„¦   «         Z
 G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z ej        d¬¦  «         G d„ d¦  «        ¦   «         Ze	d:d„¦   «         Ze	d;d„¦   «         Ze	d<d„¦   «         Ze	d=d „¦   «         Ze	d>d#„¦   «         Ze	d?d'„¦   «         Ze	d@d-„¦   «         Ze	dAd/„¦   «         Ze	d9d0„¦   «         Ze	d1d2œdBd6„¦   «         Ze	dCd7„¦   «         Zd1S )DÚNestedReductiona   
    Detects when an outer reduction and a dependent grouped reduction can be
    fused into one kernel. The outer reduction reduces over a large dimension
    (e.g. D) producing per-row statistics; the grouped reduction performs a
    small local reduction over the same logical elements. The grouped reduction
    may re-read the outer reduction's large input, consume its full-resolution
    output, or both.

    This is deliberately limited to same-total-numel pairs:
    both reductions must traverse the same number of logical elements.
    General output-size-reducing nested reductions, including split reductions,
    need different grid ownership and are rejected here.

    Example:
    - layernorm + block amax: amax over groups of G after layer_norm
    i   é€   Ú
outer_noderf   Úgrouped_noderŠ   rv   c                ó¤   — |                       ¦   «         o<|                      ¦   «         o(t          |                      ¦   «         |j        z  ¦  «        S )zFCheck that the grouped reduction is a consumer of the outer reduction.)r´   rv   r  r  ©r6  r7  s     rs   Ú_is_dependent_reduction_pairz,NestedReduction._is_dependent_reduction_pair  sR   € ð ×#Ò#Ñ%Ô%ð PØ×)Ò)Ñ+Ô+ðPå�Z×3Ò3Ñ5Ô5¸Ô8NÑNÑOÔOð	
ru   c                óh   — t           j        j        o!t          j        j         ot          | |¦  «        S r   )r-   r©   Únested_reductionra   rÂ   r  r­   r9  s     rs   Ú_is_enabled_forzNestedReduction._is_enabled_for  s5   € õ
 ŒMÔ*ð AÝ”GÔ'Ð'ðAå& z°<Ñ@Ô@ð	
ru   rˆ   r‰   c                óÞ   — |                       ||¦  «        r|                      ||¦  «        sdS |j        \  }\  }}|j        \  }\  }}t          j        j                             ||¦  «         S )zECheap filter for dependent reductions with different reduction sizes.F)r=  r:  rÇ   ra   rÂ   rÃ   rÆ   )ry   rˆ   r‰   Ú_Úrnumel1Úrnumel2s         rs   Úis_candidatezNestedReduction.is_candidate  s|   € ð ×"Ò"Ø�5ñ
ô 
ð 	à×1Ò1°%¸Ñ?Ô?ð	ð �5Øœ+‰ˆ‰<ˆAˆwØœ+‰ˆ‰<ˆAˆwÝ”7Ô#×;Ò;¸GÀWÑMÔMÐMÐMru   c                  ól   — e Zd ZdZ ej        ¦   «         Z ej        ¦   «         Z ej        ¦   «         ZdS )úNestedReduction.PointwiseDomaina  
        Where a pointwise node runs in the nested pipeline.

        The local reduction stage has three meaningful domains: its reduced
        output, its input before reducing the local lane, and the outer
        reduction's parent tile after broadcast-back.
        N)	r€   r�   r‚   r•   ÚenumÚautoÚREDUCEDÚLOCAL_REDUCTION_INPUTÚPARENT_FULLr…   ru   rs   ÚPointwiseDomainrD  #  sB   € € € € € ð	ð 	ð �$”)‘+”+ˆà ) ¤	¡¤Ðà�d”i‘k”kˆˆˆru   rJ  c                  óJ   — e Zd Z ej        ¦   «         Z ej        ¦   «         ZdS )úNestedReduction.GroupedAxisN)r€   r�   r‚   rE  rF  ÚRÚXr…   ru   rs   ÚGroupedAxisrL  3  s(   € € € € € ØˆDŒI‰KŒKˆØˆDŒI‰KŒKˆˆˆru   rO  T)Úfrozenc                  óB   — e Zd ZU ded<   ded<   ded<   ded<   ded<   d	S )
ú&NestedReduction.PointwiseDomainContextr³   Úgrouped_reductionú
sympy.ExprÚgrouped_numelÚgrouped_rnumelztuple[sympy.Expr, ...]Úlocal_reduction_domainÚparent_full_domainN)r€   r�   r‚   rƒ   r…   ru   rs   ÚPointwiseDomainContextrR  7  sN   € € € € € € à(Ð(Ð(Ñ(Ø!Ð!Ð!Ñ!Ø"Ð"Ð"Ñ"Ø6Ð6Ð6Ñ6Ø2Ð2Ð2Ñ2Ð2Ð2ru   rY  rV  rT  ú*tuple[SchedulerNode, sympy.Integer] | Nonec                óš  — |                      ¦   «         sdS d„ |                     ¦   «         D ¦   «         }t          |¦  «        dk    rdS |d         }t          |t          ¦  «        rt          |j        t          ¦  «        sdS |                     ¦   «         \  }}t          |¦  «        dvst          |¦  «        dk    rdS |j                             ¦   «         dvrdS t          j
        j                             |¦  «        }t          |t          t          j        f¦  «        rt          |¦  «        dk     rdS |t          j        |¦  «        fS )z<Validate the candidate as a single simple grouped reduction.Nc                ó:   — g | ]}|                      ¦   «         ¯|‘ŒS r…   ©r´   ©r·   Úsns     rs   r   zCNestedReduction._get_grouped_reduction_and_size.<locals>.<listcomp>F  s'   € ÐQÐQÐQ˜R¸r¿ºÑ?PÔ?PÐQ�bÐQÐQÐQru   r   r   )r   rÎ   >   r  ÚmaxÚminrÿ   r   Úxor_sum)r´   r»   rÏ   r²   r³   r”   r   Ú
get_rangesr  ra   rÂ   rÃ   rÄ   r‘   r	  ÚInteger)ry   r7  rV  Ú
reductionsÚ	reductionÚiter_rangesÚreduce_rangesÚ
group_sizes           rs   Ú_get_grouped_reduction_and_sizez/NestedReduction._get_grouped_reduction_and_size?  sS  € ð
 ×(Ò(Ñ*Ô*ð 	Ø�4ØQÐQ <×#9Ò#9Ñ#;Ô#;ÐQÑQÔQˆ
Ýˆz‰?Œ?˜aÒÐØ�4Ø˜q”Mˆ	Ý˜)¥]Ñ3Ô3ð 	½:ØŒN�Nñ<
ô <
ð 	ð �4Ø%.×%9Ò%9Ñ%;Ô%;Ñ"ˆ�]õ ˆ{ÑÔ 6Ð)Ð)­S°Ñ-?Ô-?À1Ò-DÐ-DØ�4ð Œ>×,Ò,Ñ.Ô.ð 7
ð 
ð 
ð �4å”WÔ%×.Ò.¨~Ñ>Ô>ˆ
Ý˜*¥s­E¬MÐ&:Ñ;Ô;ð 	½sÀ:¹¼ÐQRÒ?RÐ?RØ�4Ø�%œ-¨
Ñ3Ô3Ð3Ð3ru   Údomain_contextc                ód   — |                       |||¦  «        }|€dS |                      ||¦  «        S )a\  Classify pointwise nodes by nested stage and validate their ranges.

        Each pointwise node must run either on the grouped reduction output,
        on the grouped reduction's full local-group domain, or on the outer
        reduction's full parent domain, based on its producer/consumer
        relationship to the grouped reduction.
        NF)Ú _classify_nested_pointwise_nodesÚ!_pointwise_domains_are_compatible)ry   r6  r7  rk  Úpointwise_domainss        rs   Ú%_pointwise_nodes_match_nested_domainsz5NestedReduction._pointwise_nodes_match_nested_domainsh  sG   € ð  ×@Ò@ØØØñ
ô 
Ðð
 Ð$Ø�5à×4Ò4°^ÐEVÑWÔWÐWru   ú2list[tuple[SchedulerNode, PointwiseDomain]] | Nonec                óè  — g }t          ¦   «         }|                     ¦   «         D ]-}|                     ¦   «         r||                     ¦   «         z  }Œ.|                     ¦   «         D ]Z}|                     ¦   «         rŒ||j        z  r9t          |t          ¦  «        s d S |                     || j        j	        f¦  «         Œ[|  
                    ||                     ¦   «         ¦  «        }|€d S g |¢|¢S r   )r   r»   r´   r  r  r²   r³   rç   rJ  rH  Ú!_classify_grouped_pointwise_nodes)ry   r6  r7  rk  Úouter_pointwise_domainsÚouter_reduction_namesr_  Úgrouped_pointwise_domainss           rs   rm  z0NestedReduction._classify_nested_pointwise_nodes€  s*  € ð ð 	 õ
 2<±´ÐØ×&Ò&Ñ(Ô(ð 	Bð 	BˆBØ�ŠÑ Ô ð BØ%¨×)?Ò)?Ñ)AÔ)AÑAÐ%øð ×&Ò&Ñ(Ô(ð 	ð 	ˆBØ�ŠÑ Ô ð ØØ$ r¤|Ñ3ð Ý! "¥mÑ4Ô4ð  Ø˜4˜4Ø'×.Ò.Ø˜Ô,ÔBÐCñô ð øð %(×$IÒ$IØØ×"Ò"Ñ$Ô$ñ%
ô %
Ð!ð %Ð,Ø�4ØEÐ(ÐEÐ+DÐEÐEru   ÚnodesúSequence[BaseSchedulerNode]c                óê  — |j         }|                     ¦   «         }t          j        j                             |j        |j        z  ¦  «        }g }|D �] }|                     ¦   «         rŒt          |t          ¦  «        s dS |                     ¦   «         }t          ||j        z  ¦  «        }	t          ||j        z  ¦  «        }
|	r|
r dS |	s|
s dS |	r| j        j        n| j        j        }|j        \  }\  }}t          j        j                             ||j        ¦  «        r| j        j        }n+t          j        j                             ||¦  «        r|}n dS |                     ||f¦  «         �Œ"|S )aV  Classify pointwise nodes relative to the grouped reduction.

        A node must be on exactly one side of the grouped reduction: either a
        producer feeding its local-group body, or a consumer of its reduced
        output. Its numel then determines whether it runs at reduced,
        grouped-full, or parent-full resolution.
        N)rS  r  ra   rÂ   rÃ   rÄ   rU  rV  r´   r²   r³   rv   r  rJ  rH  rI  rÇ   rÆ   rG  rç   )ry   rk  rw  rS  Úreduction_namesÚ
full_numelro  r_  Úsn_namesÚis_producerÚis_consumerÚfull_domainr?  Úsn_numelÚdomains                  rs   rs  z1NestedReduction._classify_grouped_pointwise_nodes¥  s¯  € ð +Ô<ÐØ+×?Ò?ÑAÔAˆÝ”WÔ%×.Ò.ØÔ(¨>Ô+HÑHñ
ô 
ˆ
ð
 ð 	ð ð  	3ñ  	3ˆBØ�ŠÑ Ô ð ØÝ˜b¥-Ñ0Ô0ð Ø�t�tà×-Ò-Ñ/Ô/ˆHÝ˜xÐ*;Ô*EÑEÑFÔFˆKÝ˜°´Ñ=Ñ>Ô>ˆKØð ˜{ð ð �t�tØð  {ð ð �t�tð ð5�Ô#Ô9Ð9àÔ(Ô4ð ð
  "œxÑˆA‰}�˜!ÝŒwÔ×7Ò7Ø˜.Ô6ñô ð ð Ô,Ô4��Ý”Ô!×9Ò9¸(ÀJÑOÔOð Ø$��à�t�tØ×$Ò$ b¨& \Ñ2Ô2Ð2Ñ2Ø Ð ru   ro  ú/Sequence[tuple[SchedulerNode, PointwiseDomain]]c                ó>   ‡ ‡— t          ˆ ˆfd„|D ¦   «         ¦  «        S )Nc              3  óL   •K  — | ]\  }}‰                      ||‰¦  «        V — Œd S r   )Ú_pointwise_domain_is_compatible)r·   r_  r�  ry   rk  s      €€rs   r¹   zDNestedReduction._pointwise_domains_are_compatible.<locals>.<genexpr>ã  sM   øè è € ð 
ð 
á��Fð ×/Ò/°°F¸NÑKÔKð
ð 
ð 
ð 
ð 
ð 
ru   )rº   )ry   rk  ro  s   `` rs   rn  z1NestedReduction._pointwise_domains_are_compatibleÝ  sC   øø€ õ ð 
ð 
ð 
ð 
ð 
à/ð
ñ 
ô 
ñ 
ô 
ð 	
ru   r_  r³   r�  c                ób  — ddl m} |j                             ¦   «         \  }}|j        \  }\  }}|| j        j        u r|j        }t          |¦  «        }	n�|| j        j	        u r9t          j        j                             |j        |j        z  ¦  «        }|j        }	nH|| j        j        u sJ ‚t          j        j                             |j        |j        z  ¦  «        }|j        }	t          j        j                             ||¦  «        o'|                     |	|                     ¦   «         ¦  «        S )Nr   ©Ú
SIMDKernel)Úcodegen.simdrˆ  rS  rc  rÇ   rJ  rG  rU  rÐ   rH  ra   rÂ   rÃ   rÄ   rV  rW  rI  rX  rÆ   Úis_compatible)
ry   r_  r�  rk  rˆ  rg  r?  r€  Úexpected_numelÚexpected_groupss
             rs   r…  z/NestedReduction._pointwise_domain_is_compatibleè  s8  € ð 	-Ð,Ð,Ð,Ð,Ð,à'Ô9×DÒDÑFÔF‰ˆ�QØœ8Ñˆ‰=ˆH�aØ�SÔ(Ô0Ð0Ð0Ø+Ô9ˆNÝ49¸+Ñ4FÔ4FˆOˆOØ�sÔ*Ô@Ð@Ð@ÝœWÔ-×6Ò6ØÔ,¨~Ô/LÑLñô ˆNð -ÔCˆOˆOà˜SÔ0Ô<Ð<Ð<Ð<Ð<ÝœWÔ-×6Ò6ØÔ,¨~Ô/LÑLñô ˆNð -Ô?ˆOÝŒwÔ×7Ò7Ø�nñ
ô 
ð Ià×&Ò& ¸¿º¹¼ÑHÔHð	Iru   Úouter_numelÚouter_rnumelÚgrouped_axisri  r‘   c               ó2  — ddl m} t          |t          t          f¦  «        sdS t
          j        j        r|                     ¦   «         nd }t          | 
                    ¦   «         ¦  «        }|                     ||||¦  «        }	t          |	¦  «        t          d¦  «        k    rdS t          j        j                             |	d         |¦  «        r+t          j        j                             |	d         |¦  «        sdS ||                      ||¦  «        k    S )Nr   ©ÚSIMDSchedulingT)ÚxÚr0_r“  r”  )r‰  r’  r²   r³   rÝ   r-   r©   Úcoalesce_tiling_analysisÚget_coalesce_analysisr¥   r»   Úselect_tilingr   ra   rÂ   rÃ   rÆ   Ú_max_min_block_group_size)
ry   r6  r�  rŽ  r�  ri  r’  Úcoalesce_analysisÚnode_scheduleÚtilings
             rs   Ú"_min_block_unprofitable_for_kernelz2NestedReduction._min_block_unprofitable_for_kernel  s  € ð 	1Ð0Ð0Ð0Ð0Ð0å˜*¥}Õ6HÐ&IÑJÔJð 	Ø�4õ Œ}Ô5ðˆJ×,Ò,Ñ.Ô.Ð.àð 	õ
 ˜Z×1Ò1Ñ3Ô3Ñ4Ô4ˆØ×-Ò-ØØØØñ	
ô 
ˆõ �fÑÔ¥¨LÑ!9Ô!9Ò9Ð9Ø�4åŒGÔ×4Ò4°V¸C´[À+ÑNÔNð	å”Ô ×8Ò8¸À¼ÈÑUÔUð	ð �4Ø˜C×9Ò9¸-ÈÑVÔVÒVÐVru   rš  c                óš   ‡— ddl mŠ ˆfd„|D ¦   «         }|| j        j        u r"|r t	          d„ |D ¦   «         ¦  «        r| j        S | j        S )Nr   ©ÚSIMDKernelFeaturesc                óÀ   •— g | ]Z}t          |t          ¦  «        ¯|                     ¦   «         ¯+t          |j        t          ¦  «        ¯E‰                     |¦  «        ‘Œ[S r…   )r²   r³   r´   r”   r   rû   )r·   r_  rŸ  s     €rs   r   z=NestedReduction._max_min_block_group_size.<locals>.<listcomp>5  sq   ø€ ð 
ð 
ð 
àÝ˜"�mÑ,Ô,ð
ð —’Ñ!Ô!ð	
õ
 ˜2œ7¥NÑ3Ô3ð
Ø×-Ò-¨bÑ1Ô1ð
ð 
ð 
ru   c              3  ó2   K  — | ]}|t           j        u V — Œd S r   )rI   rü   )r·   Úhints     rs   r¹   z<NestedReduction._max_min_block_group_size.<locals>.<genexpr>?  s*   è è € ÐLÐL°D�D�MÔ/Ð/ÐLÐLÐLÐLÐLÐLru   )Úcodegen.simd_kernel_featuresrŸ  rO  rM  rº   ÚMAX_INNER_R_GROUP_SIZEÚMAX_NON_INNER_GROUP_SIZE)ry   rš  r�  Úreduction_hintsrŸ  s       @rs   r˜  z)NestedReduction._max_min_block_group_size-  s�   ø€ ð 	EÐDÐDÐDÐDÐDð
ð 
ð 
ð 
à#ð
ñ 
ô 
ˆð ˜CœOÔ-Ð-Ð-Øð .åÐLÐL¸OÐLÑLÔLÑLÔLð .ð Ô-Ð-ØÔ+Ð+ru   c                ó  — |                       ||¦  «        sdS |                      ||¦  «        sJ ‚|}|}|j        \  }}|j        \  }}|\  }}	|\  }
}t          j        j                             |	|¦  «        rdS |                      ||¦  «        }|€dS t          j        j                             ||	z  ¦  «        }t          j        j                             |
|z  ¦  «        }t          j        j                             ||¦  «        sdS |\  }}|  	                    |||	||¬¦  «        }|€dS || j
        j        u r|	n|}|                     ¦   «         \  }}t          |¦  «        dk    rT|| j
        j        u r|d         n|d         }t          j        j                             t          ||¦  «        |¦  «        sdS n:t          j        j                             t          j        ||¦  «        d¦  «        sdS t#          |¦  «        }d|k    rt%          |¦  «        sdS |                      |||	||¬¦  «        rdS |                     ¦   «         \  }}|                      ||
|g |¢|¢R ||	f¬¦  «        }|                      |||¦  «        sdS d	S )
zACheck whether a dependent cross-axis reduction pair can be fused.FN©r6  rÎ   r   r   )r�  ri  ©rS  rU  rV  rW  rX  T)r=  r:  rÇ   ra   rÂ   rÃ   rÆ   rj  rÄ   Úget_grouped_axisrO  rM  rc  rÏ   r'   r	  ÚModr‘   rK   rœ  rY  rp  )ry   rˆ   r‰   r6  r7  r?  Úouter_groupÚgrouped_groupr�  rŽ  rU  rV  Úgrouped_reduction_infoÚouter_totalÚgrouped_totalrS  ri  r�  Úparent_grouped_axisrg  Úgrouped_axis_groupsÚgroup_size_intrh  rk  s                           rs   r  zNestedReduction.can_fuseD  s  € ð
 ×"Ò" 5¨%Ñ0Ô0ð 	Ø�5à×/Ò/°°uÑ=Ô=Ð=Ð=Ð=àˆ
Øˆð $Ô)‰ˆˆ;Ø'Ô-Ñˆˆ=Ø$/Ñ!ˆ�\Ø(5Ñ%ˆ�~ÝŒ7Ô×3Ò3°LÀ.ÑQÔQð 	Ø�5ð "%×!DÒ!DØ˜.ñ"
ô "
Ðð "Ð)Ø�5õ ”gÔ&×/Ò/°¸lÑ0JÑKÔKˆÝœÔ(×1Ò1°-À.Ñ2PÑQÔQˆÝŒwÔ×7Ò7¸À]ÑSÔSð 	Ø�5à(>Ñ%Ð˜:à×+Ò+ØØØØØ!ð ,ñ 
ô 
ˆð ÐØ�5à(¨C¬OÔ,=Ð=Ð=ˆLˆLÀ;ð 	ð +×5Ò5Ñ7Ô7‰ˆ�QÝˆ{ÑÔ˜qÒ Ð à".°#´/Ô2CÐ"CÐ"C�˜A”�ÈÐUVÌð  õ ”7Ô#×;Ò;ÝÐ,¨jÑ9Ô9Ð;Nñô ð ð �uðõ ”Ô!×9Ò9ÝŒIÐ)¨:Ñ6Ô6¸ñ
ô 
ð 	ð �5Ý˜Z™œˆØ�^Ò#Ð#­°nÑ(EÔ(EÐ#Ø�5Ø×1Ò1ØØØØ%Ø%ð 2ñ 
ô 
ð 	ð �5Ø%6×%AÒ%AÑ%CÔ%CÑ"ˆ�]Ø×3Ò3Ø/Ø'Ø)Ø#A [Ð#A°=Ð#AÐ#AØ +¨\Ð:ð 4ñ 
ô 
ˆð ×8Ò8ØØØñ
ô 
ð 	ð
 �5àˆtru   Nr¨  rS  úBaseSchedulerNode | NoneúGroupedAxis | Nonec               ó  — t           j        j        }|                     ¦   «         \  }}t	          |¦  «        dk    st	          |¦  «        dk    rÞt	          |¦  «        dk    rÉt	          |¦  «        dk    r¶|                     |d         |¦  «        sdS |                     t          ||¦  «        |d         ¦  «        r"|                     |d¦  «        r| j        j        S |                     t          ||¦  «        d¦  «        r(|                     |d         |¦  «        r| j        j	        S dS |                     |d         |¦  «        sdS |                     |d         |¦  «        r6|                     t          ||¦  «        |d         ¦  «        r| j        j        S |                     |d         |¦  «        r6|                     t          ||¦  «        |d         ¦  «        r| j        j	        S |�|  
                    ||¦  «        S dS )zAReturn which parent axis is split by the grouped local reduction.rÎ   r   r   N)ra   rÂ   rÃ   rc  rÏ   rÆ   r'   rO  rM  rN  Ú _get_grouped_axis_from_loop_body)	ry   rS  r�  rŽ  ri  r6  rÃ   rg  rh  s	            rs   rª  z NestedReduction.get_grouped_axis¦  s1  € õ ”7Ô#ˆØ%6×%AÒ%AÑ%CÔ%CÑ"ˆ�]Ýˆ{ÑÔ˜qÒ Ð ¥C¨Ñ$6Ô$6¸!Ò$;Ð$;Ý�;ÑÔ 1Ò$Ð$­¨]Ñ);Ô);¸qÒ)@Ð)@Ø×7Ò7¸ÀaÔ8HÈ*ÑUÔUð  Ø˜4ð ×3Ò3Ý˜\¨:Ñ6Ô6¸ÀA¼ñô ð -à×6Ò6°{ÀAÑFÔFð-ð œ?Ô,Ð,ð ×3Ò3Ý˜[¨*Ñ5Ô5°qñô ð -à×6Ò6°{À1´~À|ÑTÔTð-ð œ?Ô,Ð,Ø�4Ø×/Ò/°¸aÔ0@À*ÑMÔMð 	Ø�4ð ×+Ò+Ø˜ŒN˜Kñ
ô 
ð 	%à×.Ò.Ý�\ :Ñ.Ô.°¸A´ñ
ô 
ð	%ð
 ”?Ô$Ð$à×+Ò+Ø˜ŒN˜Lñ
ô 
ð 	%à×.Ò.Ý�[ *Ñ-Ô-¨{¸1¬~ñ
ô 
ð	%ð
 ”?Ô$Ð$ØÐ!Ø×7Ò7¸
ÐDUÑVÔVÐVØˆtru   c                óª  ‡‡‡— ddl mŠ d„ |                     ¦   «         D ¦   «         }t          |¦  «        dk    rdS t	          j        t          |d         ¦  «        }t          |dd¦  «        }t          |dd¦  «        }|�|€dS |                     ¦   «         \  }}|                     ¦   «         \  }	}
t          |¦  «        dk    st          |
¦  «        dk    rdS dˆfd„}t          |j	        ¦  «        dk    st          |j	        ¦  «        dk    rdS t          |j
        ¦  «        t          |¦  «        k    s%t          |j
        ¦  «        t          |	¦  «        k    rdS  ||¦  «        }d}|j	        d         } ||¦  «                             ¦   «         D ]¼\  }}|                     |¦  «        }|sŒ|D ]œ}|                     |¦  «        Š‰dk    rŒ|D ]{Š|j	        d         }‰                     |¦  «        }‰|k    }t          ˆˆfd„|j
        D ¦   «         ¦  «        }||k    rŒR|r| j        j        n| j        j        }|�||k    r   dS |}Œ|Œ�Œ½|S )z>Use LoopBody iter/reduce vars to disambiguate equal-size axes.r   r  c                ó:   — g | ]}|                      ¦   «         ¯|‘ŒS r…   r]  r^  s     rs   r   zDNestedReduction._get_grouped_axis_from_loop_body.<locals>.<listcomp>á  s'   € ÐUÐUÐU 2À2Ç?Â?ÑCTÔCTÐU˜BÐUÐUÐUru   r   Nr#  ÚbodyrE   rŠ   údict[str, list[sympy.Expr]]c                óä   •— t          t          ¦  «        }| j                             ‰j        d¦  «        D ]9}|j        �0||j                                      | j        |j                 ¦  «         Œ:|S ©Nr…   )	r   r¥   r$  Úgetr%  r  rç   r&  r  )rº  ÚresultÚentryr  s      €rs   Úload_exprs_by_namezLNestedReduction._get_grouped_axis_from_loop_body.<locals>.load_exprs_by_nameï  st   ø€ Ý2=½dÑ2CÔ2CˆFØÔ*×.Ò.¨Ô/CÀRÑHÔHð ð �ØÔ$Ð0Ø˜5Ô,Ô-×4Ò4ØÔ+¨EÔ,<Ô=ñô ð øð ˆMru   r!  c              3  óJ   •K  — | ]}‰‰                      |¦  «        k    V — Œd S r   )Úcoeff)r·   ÚvarÚgrouped_coeffÚouter_read_exprs     €€rs   r¹   zCNestedReduction._get_grouped_axis_from_loop_body.<locals>.<genexpr>  sJ   øè è € ð 'ð 'àð &¨×)>Ò)>¸sÑ)CÔ)CÒCð'ð 'ð 'ð 'ð 'ð 'ru   )rº  rE   rŠ   r»  )r"  r  r»   rÏ   ÚtypingÚcastr³   Úgetattrrc  Úreduce_varsÚ	iter_varsÚitemsr¾  rÃ  r  rO  rM  rN  )ry   r6  rS  Úouter_reductionsÚouter_reductionÚ
outer_bodyÚgrouped_bodyÚouter_iter_rangesÚouter_reduce_rangesÚgrouped_iter_rangesÚgrouped_reduce_rangesrÁ  Úouter_reads_by_namer¿  Úgrouped_reduce_varrÚ   Úgrouped_read_exprsÚouter_read_exprsÚgrouped_read_exprÚouter_reduce_varÚouter_reduce_coeffÚmatches_reductionÚmatches_iterÚ	candidater  rÅ  rÆ  s                           @@@rs   r·  z0NestedReduction._get_grouped_axis_from_loop_bodyÚ  s  øøø€ ð
 	>Ð=Ð=Ð=Ð=Ð=àUÐU¨×)=Ò)=Ñ)?Ô)?ÐUÑUÔUÐÝÐÑ Ô  AÒ%Ð%Ø�4Ý œ+¥mÐ5EÀaÔ5HÑIÔIˆÝ˜_¨g°tÑ<Ô<ˆ
ÝÐ0°'¸4Ñ@Ô@ˆØÐ Ð!5Ø�4à1@×1KÒ1KÑ1MÔ1MÑ.ÐÐ.Ø5F×5QÒ5QÑ5SÔ5SÑ2ÐÐ2ÝÐ"Ñ#Ô# qÒ(Ð(­CÐ0EÑ,FÔ,FÈ!Ò,KÐ,KØ�4ð	ð 	ð 	ð 	ð 	ð 	õ ˆzÔ%Ñ&Ô&¨!Ò+Ð+­s°<Ô3KÑ/LÔ/LÐPQÒ/QÐ/QØ�4ÝˆzÔ#Ñ$Ô$­Ð,=Ñ(>Ô(>Ò>Ð>Å#ØÔ"ñC
ô C
åÐ$Ñ%Ô%òC&ð C&ð �4à0Ð0°Ñ<Ô<ÐØ59ˆØ)Ô5°bÔ9ÐØ(:Ð(:¸<Ñ(HÔ(H×(NÒ(NÑ(PÔ(Pð 	'ð 	'Ñ$ˆDÐ$Ø2×6Ò6°tÑ<Ô<ÐØ#ð ØØ%7ð 'ð 'Ð!Ø 1× 7Ò 7Ð8JÑ KÔ K�Ø  AÒ%Ð%ØØ'7ð 'ð '�OØ'1Ô'=¸bÔ'AÐ$Ø)8×)>Ò)>Ð?OÑ)PÔ)PÐ&Ø(5Ð9KÒ(KÐ%Ý#&ð 'ð 'ð 'ð 'ð 'à#-Ô#7ð'ñ 'ô 'ñ $ô $�Lð )¨LÒ8Ð8Ø à->ÐU˜œÔ)Ð)ÀCÄOÔDUð ð Ð)¨f¸	Ò.AÐ.AØ#˜t˜t˜t˜tØ&�F�Fð!'ð	'ð* ˆru   )r6  rf   r7  rf   rŠ   rv   r/  )r7  rf   rV  rT  rŠ   rZ  )r6  rf   r7  rf   rk  rY  rŠ   rv   )r6  rf   r7  rf   rk  rY  rŠ   rq  )rk  rY  rw  rx  rŠ   rq  )rk  rY  ro  r‚  rŠ   rv   )r_  r³   r�  rJ  rk  rY  rŠ   rv   )r6  rf   r�  rT  rŽ  rT  r�  rO  ri  r‘   rŠ   rv   )rš  rx  r�  rO  rŠ   r‘   )rS  r³   r�  rT  rŽ  rT  ri  rT  r6  r´  rŠ   rµ  )r6  rf   rS  r³   rŠ   rµ  )r€   r�   r‚   r•   r¤  r¥  r2  r:  r=  r„   rB  rE  ÚEnumrJ  rO  r£   Ú	dataclassrY  rj  rp  rm  rs  rn  r…  rœ  r˜  r  rª  r·  r…   ru   rs   r4  r4  î  sº  € € € € € ðð ð" !ÐØ"Ðàð
ð 
ð 
ñ „\ð
ð ð
ð 
ð 
ñ „\ð
ð ðNð Nð Nñ „[ðNð"ð "ð "ð "ð "˜$œ)ñ "ô "ð "ð ð ð ð ð �d”iñ ô ð ð €[Ô $Ð'Ñ'Ô'ð3ð 3ð 3ð 3ð 3ñ 3ô 3ñ (Ô'ð3ð ð&4ð &4ð &4ñ „[ð&4ðP ðXð Xð Xñ „[ðXð. ð"Fð "Fð "Fñ „[ð"FðH ð5!ð 5!ð 5!ñ „[ð5!ðn ð
ð 
ð 
ñ „[ð
ð ðIð Ið Iñ „[ðIð8 ð%Wð %Wð %Wñ „[ð%WðN ð,ð ,ð ,ñ „[ð,ð, ð_ð _ð _ñ „[ð_ðB ð 04ð1ð 1ð 1ð 1ð 1ñ „[ð1ðf ð@ð @ð @ñ „[ð@ð @ð @ru   r4  c                  óÖ   — e Zd ZU ded<   ded<   ded<    ej        e¬¦  «        Zded	<    ej        e¬¦  «        Z	d
e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S )%ÚSchedulerBufferÚ	SchedulerÚ	schedulerz	ir.Bufferr”   r´  Údefining_oprŸ   úlist[NodeUser]ÚusersrF   Ú
mpi_bufferrŠ   rÖ   c                ó@   — | j         }|€J ‚|                     ¦   «         S r   )rå  Úget_name)rr   Úops     rs   Údefining_op_namez SchedulerBuffer.defining_op_name(  s!   € ØÔˆØˆ~ˆ~ˆ~Ø�{Š{‰}Œ}Ðru   r‘   c                ó4   — t          | j        j        ¦  «        S r   )Úhashr”   rÚ   rq   s    rs   Ú__hash__zSchedulerBuffer.__hash__-  s   € Ý�D”I”NÑ#Ô#Ð#ru   c                ó¶  — t          ¦   «         }|                      ¦   «         }|                     |› dt          | j        ¦  «        j        › �¦  «         |                     |› d| j        j        › �¦  «         |                      ¦   «         r9|                     |› dt          |                      ¦   «         ¦  «        › �¦  «         |  	                    ¦   «         r9|                     |› dt          |  	                    ¦   «         ¦  «        › �¦  «         t          | j        ¦  «        dk    r |                     |› d| j        › �¦  «         n}|                     |› d�¦  «         |                     d¦  «        5  | j        D ]}|                     |› d�¦  «         Œ	 d d d ¦  «         n# 1 swxY w Y   |                     d	¦  «         |                     ¦   «         S )
Nú: z
.layout = z.aliases = z.mutations = r   z	.users = z
.users = [ú,ú])rX   rê  Ú	writeliner«   r”   r€   ÚlayoutÚget_aliasesÚpformatÚget_mutationsrÏ   rç  ÚindentÚgetrawvalue)rr   r¿  rÚ   Úusers       rs   Ú	debug_strzSchedulerBuffer.debug_str0  s  € ÝÑ!Ô!ˆØ�}Š}‰ŒˆØ×Ò˜DÐ>Ð>¥D¨¬¡O¤OÔ$<Ð>Ð>Ñ?Ô?Ð?Ø×Ò˜DÐ>Ð>¨D¬IÔ,<Ð>Ð>Ñ?Ô?Ð?Ø×ÒÑÔð 	PØ×Ò ÐNÐNµ¸×9IÒ9IÑ9KÔ9KÑ1LÔ1LÐNÐNÑOÔOÐOØ×ÒÑÔð 	TØ×Ò ÐRÐRµ7¸4×;MÒ;MÑ;OÔ;OÑ3PÔ3PÐRÐRÑSÔSÐSåˆtŒz‰?Œ?˜aÒÐØ×Ò Ð;Ð;¨t¬zÐ;Ð;Ñ<Ô<Ð<Ð<à×Ò Ð0Ð0Ð0Ñ1Ô1Ð1Ø—’˜qÑ!Ô!ð 1ð 1Ø œJð 1ð 1�DØ×$Ò$¨ Z Z ZÑ0Ô0Ð0Ð0ð1ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1ð ×Ò˜SÑ!Ô!Ð!Ø×!Ò!Ñ#Ô#Ð#s   Å7#F'Æ'F+Æ.F+c                ó4   — | j                              ¦   «         S r   ©r”   rê  rq   s    rs   rê  zSchedulerBuffer.get_nameD  ó   € ØŒy×!Ò!Ñ#Ô#Ð#ru   ÚNonec                ó^  — | j         €J ‚| j                              ¦   «         sd S | j                              ¦   «         sJ| j                              ¦   «         s1t	          | j                              ¦   «         t          j        ¦  «        r+t          j	        j
                             | j         ¦  «         d S t          t          j        d¦  «        r·|                      ¦   «         t          j        j        v r’t          j        j        |                      ¦   «                  }|| j        j        v r| j        j        |         j         }n| j        j        |         j         }t          j	        j
                             || j         ¦  «         d S t          j	        j
                             | j         ¦  «         d S )NÚargs)r”   Úshould_allocateÚget_inputs_that_alias_outputÚget_mutation_namesr²   Úget_output_specr0   ÚCommBufferLayoutra   rÂ   Úwrapper_codeÚcodegen_allocationÚhasattrÚkernelrê  Úinplace_update_buffersrä  Úname_to_donated_bufferÚname_to_bufÚcodegen_inplace_reuse)rr   Úinput_buffer_nameÚinput_buffers      rs   ÚallocatezSchedulerBuffer.allocateG  sy  € ØŒyÐ$Ð$Ð$ØŒy×(Ò(Ñ*Ô*ð 	ØˆFð ŒI×2Ò2Ñ4Ô4ð	àŒy×+Ò+Ñ-Ô-ð	õ ˜$œ)×3Ò3Ñ5Ô5µrÔ7JÑKÔKð	õ
 ŒGÔ ×3Ò3°D´IÑ>Ô>Ð>ØˆFõ •A”H˜fÑ%Ô%ð	?à—’‘”¥1¤8Ô#BÐBÐBõ !"¤Ô ?ÀÇÂÁÄÔ PÐØ  D¤NÔ$IÐIÐIØ#œ~ÔDØ%ô äð �ð  $œ~Ô9Ð:KÔLÔQ�ÝŒGÔ ×6Ò6ØØ”	ñô ð ð ð õ
 ŒGÔ ×3Ò3°D´IÑ>Ô>Ð>Ð>Ð>ru   rv   c                óÚ   — | j         €J ‚t          | j         j        t          j        ¦  «        st          | j         ¦  «        rdS | j        D ]}t          |j         t          ¦  «        r dS Œ dS ©NFT)r”   r²   rõ  r0   rD   r\   rç  Ú
OutputNode)rr   Úuses     rs   Úcan_freezSchedulerBuffer.can_freeh  s}   € àŒyÐ$Ð$Ð$Ý�d”iÔ&­¬Ñ6Ô6ð 	Õ:SØŒIñ;
ô ;
ð 	ð �5Ø”:ð 	ð 	ˆCÝ˜#œ(¥JÑ/Ô/ð Ø�u�uðàˆtru   c                ó@  — i }|D ]r}t          |j        ¦  «        |v rC|                     |t          |j        ¦  «                 ¦  «        |t          |j        ¦  «        <   Œ[||t          |j        ¦  «        <   Œst          |                     ¦   «         ¦  «        | _        d S r   )Úidr”   Úmerger¥   rà   rç  )rr   rç  r¿  r  s       rs   Ú	set_userszSchedulerBuffer.set_userst  s‡   € à&(ˆØð 	+ð 	+ˆCÝ�#”(‰|Œ|˜vÐ%Ð%Ø'*§y¢y°½¸3¼8¹¼Ô1EÑ'FÔ'F�•r˜#œ(‘|”|Ñ$Ð$à'*�•r˜#œ(‘|”|Ñ$Ð$Ý˜&Ÿ-š-™/œ/Ñ*Ô*ˆŒ
ˆ
ˆ
ru   úSequence[str]c                óF   — | j         €J ‚| j                              ¦   «         S r   )r”   r  rq   s    rs   rö  zSchedulerBuffer.get_aliases~  s$   € ØŒyÐ$Ð$Ð$ØŒy×5Ò5Ñ7Ô7Ð7ru   c                óF   — | j         €J ‚| j                              ¦   «         S r   )r”   r  rq   s    rs   rø  zSchedulerBuffer.get_mutations‚  ó$   € ØŒyÐ$Ð$Ð$ØŒy×+Ò+Ñ-Ô-Ð-ru   útorch.device | Nonec                óX   — | j                              ¦   «                              ¦   «         S r   )r”   r  rª   rq   s    rs   rª   zSchedulerBuffer.get_device†  s"   € ØŒy×(Ò(Ñ*Ô*×5Ò5Ñ7Ô7Ð7ru   N©rŠ   rÖ   ©rŠ   r‘   ©rŠ   r   ©rŠ   rv   )rç  ræ  rŠ   r   ©rŠ   r  ©rŠ   r   )r€   r�   r‚   rƒ   r£   r¤   r¥   rç  rF   rè  rì  rï  rü  rê  r  r  r  rö  rø  rª   r…   ru   rs   râ  râ    sQ  € € € € € € àÐÐÑØ€O€O�OØ)Ð)Ð)Ñ)Ø-˜KÔ-¸dÐCÑCÔC€EÐCÐCÐCÑCØ.?¨kÔ.?Ø3ð/ñ /ô /€Jð ð ð ñ ðð ð ð ð
$ð $ð $ð $ð$ð $ð $ð $ð($ð $ð $ð $ð?ð ?ð ?ð ?ðB
ð 
ð 
ð 
ð+ð +ð +ð +ð8ð 8ð 8ð 8ð.ð .ð .ð .ð8ð 8ð 8ð 8ð 8ð 8ru   râ  c                  ó   — e Zd ZU dZded<   dS )ÚSchedulerDonatedBufferNr´  rå  )r€   r�   r‚   rå  rƒ   r…   ru   rs   r)  r)  Š  s#   € € € € € € à,0€KÐ0Ð0Ð0Ñ0Ð0Ð0ru   r)  c                  ó(  — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   dZded<   ded<   ded<   dZded<   ded<   ded<   dZde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ƒd1„Zd„d3„Zd…d6„Zd†d7„Zd‡d9„Zd‚d:„Zedˆd<„¦   «         Zd‰d?„Zd‚d@„ZdŠdA„ZdŠdB„Zd‚dC„Zd‚dD„Zd‹dG„Zd€dH„Zd€dI„ZedŠdJ„¦   «         Z edŠdK„¦   «         Z!ed†dL„¦   «         Z"ed†dM„¦   «         Z#dŒdO„Z$d�dQ„Z%dŽdT„Z&d�dV„Z'd†dW„Z(d†dX„Z)d†dY„Z*d†dZ„Z+d†d[„Z,d†d\„Z-d†d]„Z.d†d^„Z/d�da„Z0d†db„Z1d‚dc„Z2	 d‘d’dh„Z3ed“di„¦   «         Z4ed“dj„¦   «         Z5ed“dk„¦   «         Z6d”dn„Z7d•dp„Z8ed–dr„¦   «         Z9d—dt„Z:ed—du„¦   «         Z;d˜dw„Z<d™dy„Z=e>dšd}„¦   «         Z?dS )›rf   r™   r  z7tuple[torch.device, tuple[tuple[sympy.Expr, ...], ...]]rÇ   Ú
last_usager‘   Úmin_input_distanceÚmax_input_distanceÚ	min_orderÚ	max_orderrG   Úmpi_nodeúdict[str, str]Úmutation_renamesNúir.Operation | Noner”   úlist[SchedulerBuffer]Úoutputsúdict[str, SchedulerBuffer]Úoutputs_by_nameúfloat | NoneÚoverride_estimated_runtimeúdependencies.ReadWritesrØ   úOrderedSet[Dep]Úunmet_dependenciesFrv   Úwrittenrä  rã  rŠ   r   c                ó$   — || _         d„ | _        d S )Nc                 ó   — g S r   r…   )r  Úkwargss     rs   ú<lambda>z,BaseSchedulerNode.__init__.<locals>.<lambda>©  s   €  B€ ru   )rä  Údebug_device_str)rr   rä  s     rs   Ú__init__zBaseSchedulerNode.__init__¦  s   € Ø$-ˆŒà&Ð&ð 	ÔÐÐru   úir.Operationc                ó&  ‡ — |‰ _         t          ¦   «         ‰ _        d‰ _        d‰ _        t          t
                   ¦   «         ‰ _        d‰ _        ˆ fd„|                     ¦   «         D ¦   «         ‰ _	        d„ ‰ j	        D ¦   «         ‰ _
        i ‰ _        d S )Nr   Fc                ó>   •— g | ]}t          ‰j        |‰¬ ¦  «        ‘ŒS ))rä  r”   rå  )râ  rä  )r·   Úoutputrr   s     €rs   r   z5BaseSchedulerNode._init_from_node.<locals>.<listcomp>µ  sE   ø€ ð 
ð 
ð 
ð õ Øœ.ØØ ðñ ô ð
ð 
ð 
ru   c                ó8   — i | ]}|                      ¦   «         |“ŒS r…   ©rê  ©r·   rÕ   s     rs   ú
<dictcomp>z5BaseSchedulerNode._init_from_node.<locals>.<dictcomp>½  s"   € ÐLÐLÐL¸ §¢¡¤°ÐLÐLÐLru   )r”   r   r  r,  r-  rÖ   r+  r=  Úget_outputsr5  r7  r2  ©rr   r”   s   ` rs   Ú_init_from_nodez!BaseSchedulerNode._init_from_node¬  sª   ø€ ØˆŒ	Ý#™œˆŒØ"#ˆÔØ"#ˆÔÝ$Ýô
ñ ô ˆŒð ˆŒð
ð 
ð 
ð 
ð ×*Ò*Ñ,Ô,ð
ñ 
ô 
ˆŒð  MÐL¸t¼|ÐLÑLÔLˆÔð !#ˆÔÐÐru   rÖ   c                óZ   — t          | ¦  «        j        › d|                      ¦   «         ›d�S )Nz(name=ú)©r«   r€   rê  rq   s    rs   Ú__repr__zBaseSchedulerNode.__repr__Æ  s*   € Ý�t‘*”*Ô%ÐAÐA¨T¯]ª]©_¬_ÐAÐAÐAÐAru   c                óÄ  — |                       ¦   «         }t          ¦   «         }|                     |› dt          | ¦  «        j        › dt          t          | dd¦  «        ¦  «        j        › d|› dt          | j        j        ¦  «        › d|› dt          | j	        ¦  «        › d|› d	t          | j        j
        | j	        z
  ¦  «        › d|› d
| j        › d|› d| j        › d|› d�¦  «         |                     ¦   «         5  |                      ¦   «         D ])}|                     |                     ¦   «         ¦  «         Œ*	 ddd¦  «         n# 1 swxY w Y   |                     d¦  «         	 |                     |                      ¦   «         ¦  «         n,# t$          $ r t&                               dd¬¦  «         Y nw xY w|                     ¦   «                              ¦   «         S )ú#Longer form printout for trace logsrñ  ú(r”   Nú)
ú
.writes = ú
ú.unmet_dependencies = ú.met_dependencies = ú.min_input_distance = ú.max_input_distance = z.outputs = [
        ró  úIgnoring error in debug_str()T©Úexc_info)rê  rX   Úsplicer«   r€   rÉ  r÷  rØ   Úwritesr<  rÙ   r,  r-  rù  rL  rü  rô  Údebug_str_extraÚ	ExceptionÚlogÚwarningrú  Úrstrip)rr   rÚ   rÕ   rè   s       rs   rü  zBaseSchedulerNode.debug_strÉ  s‰  € à�}Š}‰ŒˆÝÑÔˆØ�
Š
àðð Ý	ˆd‰ŒÔ	ðð Ý#¥G¨D°&¸$Ñ$?Ô$?Ñ@Ô@ÔIðð àðð å˜Ô)Ô0Ñ1Ô1ðð ð ðð õ % TÔ%<Ñ=Ô=ðð ð ð	ð õ # 4Ô#3Ô#9¸DÔ<SÑ#SÑTÔTð	ð ð
 ðð ð
 "Ô4ðð ð ðð ð "Ô4ðð ð ðð ð ñ
	
ô 
	
ð 
	
ð �ZŠZ‰\Œ\ð 	,ð 	,Ø×'Ò'Ñ)Ô)ð ,ð ,�Ø—
’
˜3Ÿ=š=™?œ?Ñ+Ô+Ð+Ð+ð,ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	�Š�cÑÔÐð	HØ�JŠJ�t×+Ò+Ñ-Ô-Ñ.Ô.Ð.Ð.øÝð 	Hð 	Hð 	HÝ�KŠKÐ7À$ˆKÑGÔGÐGÐGÐGð	Høøøð �ŠÑ Ô ×'Ò'Ñ)Ô)Ð)s$   Ã;?EÅEÅEÅ('F Æ&F9Æ8F9c                ó   — dS )NÚ r…   rq   s    rs   rb  z!BaseSchedulerNode.debug_str_extraä  ó   € Øˆrru   rä   c                ó,   — |                       | ¦  «        S r   )rB  rq   s    rs   Ú_debug_str_for_devicez'BaseSchedulerNode._debug_str_for_deviceç  s   € Ø×$Ò$ TÑ*Ô*Ð*ru   c                ó®  — t          | j        dd ¦  «        }d}t          |t          j        j        j        ¦  «        r/d|                     |                     ¦   «         gdd¬¦  «        z   }net          |t          j        j        j	        ¦  «        rAd|                     | 
                    ¦   «         |                     ¦   «         gdd¬¦  «        z   }| › |› �S )Nrú   rh  ú, F)ÚshortenÚ	multiline)rÉ  r”   r²   ÚtorchÚ	_inductorr0   r   Ú
str_helperÚget_sizeÚ	ReductionÚget_reduction_sizer  )rr   Ú
maybe_dataÚdata_strs      rs   Údebug_str_shortz!BaseSchedulerNode.debug_str_shortê  sã   € Ý˜TœY¨°Ñ5Ô5ˆ
ØˆÝ�j¥%¤/Ô"4Ô">Ñ?Ô?ð 		Ø˜j×3Ò3Ø×$Ò$Ñ&Ô&Ð'°À%ð 4ñ ô ñ ˆHˆHõ ˜
¥E¤OÔ$6Ô$@ÑAÔAð 	Ø˜j×3Ò3Ø×.Ò.Ñ0Ô0°*×2OÒ2OÑ2QÔ2QÐRØØð 4ñ ô ñ ˆHð
 Ð"˜Ð"Ð"Ð"ru   c                ó^   — t                                d| | j        | j        j        ¦  «         d S )Nz(%s: unmet_dependencies = %s, writes = %s)rd  Úinfor<  rØ   ra  rq   s    rs   Úlog_detailszBaseSchedulerNode.log_detailsù  s7   € Ý�ŠØ6ØØÔ#ØÔÔ#ñ		
ô 	
ð 	
ð 	
ð 	
ru   Úself_depr9   Ú	other_depc                ó   — dS ©NFr…   )rr   r|  r}  s      rs   Úreorder_loops_by_dep_pairz+BaseSchedulerNode.reorder_loops_by_dep_pair  ó	   € ð ˆuru   Úrenamesc                óÔ   ‡— ˆfd„d„ | j                              ¦   «         D ¦   «         D ¦   «         | _        |                      | j                              | j        ¦  «        ¦  «         d S )Nc                ó*   •— i | ]}|‰v ¯|‰|         “ŒS r…   r…   )r·   rÚ   r‚  s     €rs   rK  z:BaseSchedulerNode.update_mutated_names.<locals>.<dictcomp>  s0   ø€ ð !
ð !
ð !
àØ�wˆˆð �'˜$”-àˆˆru   c              3  ó$   K  — | ]}|j         V — Œd S r   ©rÚ   ©r·   râ   s     rs   r¹   z9BaseSchedulerNode.update_mutated_names.<locals>.<genexpr>	  s$   è è € ÐQÐQ c˜œÐQÐQÐQÐQÐQÐQru   )rØ   Úreads_and_writesr2  Úset_read_writesÚrename©rr   r‚  s    `rs   Úupdate_mutated_namesz&BaseSchedulerNode.update_mutated_names  s{   ø€ ð!
ð !
ð !
ð !
àQÐQ¨TÔ-=×-NÒ-NÑ-PÔ-PÐQÑQÔQð!
ñ !
ô !
ˆÔð
 	×Ò˜TÔ-×4Ò4°TÔ5JÑKÔKÑLÔLÐLÐLÐLru   râ   r8   c                ó`   — |                       | j                             |¦  «        ¦  «         d S r   )r‰  rØ   Ú	with_read©rr   râ   s     rs   Úadd_fake_depzBaseSchedulerNode.add_fake_dep  s-   € Ø×Ò˜TÔ-×7Ò7¸Ñ<Ô<Ñ=Ô=Ð=Ð=Ð=ru   c                óX   — t          d„ |                      ¦   «         D ¦   «         ¦  «        S )Nc              3  óf   K  — | ],}|                      ¦   «         p|                     ¦   «         V — Œ-d S r   )rö  rø  rJ  s     rs   r¹   z=BaseSchedulerNode.has_aliasing_or_mutation.<locals>.<genexpr>  sN   è è € ð 
ð 
Ø9<ˆC�OŠOÑÔÐ4 ×!2Ò!2Ñ!4Ô!4ð
ð 
ð 
ð 
ð 
ð 
ru   )r  rL  rq   s    rs   Úhas_aliasing_or_mutationz*BaseSchedulerNode.has_aliasing_or_mutation  s<   € Ýð 
ð 
Ø@D×@PÒ@PÑ@RÔ@Rð
ñ 
ô 
ñ 
ô 
ð 	
ru   Úrwc                ó†   — || _         | j         j        | _        |                      ¦   «          |                      ¦   «          d S r   )rØ   rÙ   r<  Ú"clear_read_writes_dependent_cachesÚ
prune_deps)rr   r”  s     rs   r‰  z!BaseSchedulerNode.set_read_writes  s@   € ØˆÔØ"&Ô"2Ô"8ˆÔØ×/Ò/Ñ1Ô1Ð1Ø�ŠÑÔÐÐÐru   c                ó:   — | j                              | ¦  «         d S r   )r–  Úclear_cacherq   s    rs   r–  z4BaseSchedulerNode.clear_read_writes_dependent_caches  s   € ØÔ"×.Ò.¨tÑ4Ô4Ð4Ð4Ð4ru   úCoalesceVarAnalysis | Nonec                ó`   — ddl m} t          | t          t          f¦  «        sd S  || ¦  «        S )Nr   )Ú_analyze_memory_coalescing)Útiling_utilsrœ  r²   r³   rÝ   )rr   rœ  s     rs   r–  z'BaseSchedulerNode.get_coalesce_analysis  sB   € à<Ð<Ð<Ð<Ð<Ð<å˜$¥Õ0BÐ CÑDÔDð 	Ø�4Ø)Ð)¨$Ñ/Ô/Ð/ru   Úfuture_used_buffersÚmutation_real_namec                óz   ‡— |                       ¦   «         }t          ˆfd„|D ¦   «         ¦  «        }||z
  | _        d S )Nc              3  óD   •K  — | ]}‰                      ||¦  «        V — Œd S r   )r¾  )r·   ÚkrŸ  s     €rs   r¹   z3BaseSchedulerNode.set_last_usage.<locals>.<genexpr>+  s4   øè è € Ð!UÐ!UÀ1Ð"4×"8Ò"8¸¸AÑ">Ô">Ð!UÐ!UÐ!UÐ!UÐ!UÐ!Uru   )Úused_or_aliased_buffer_namesr   r+  )rr   rž  rŸ  Úused_bufferss     ` rs   Úset_last_usagez BaseSchedulerNode.set_last_usage'  sI   ø€ ð ×8Ò8Ñ:Ô:ˆÝ!Ð!UÐ!UÐ!UÐ!UÈÐ!UÑ!UÔ!UÑUÔUˆØ&Ð)<Ñ<ˆŒˆˆru   c                óB   — | j         D ]}|                     ¦   «          Œd S r   )r5  r  )rr   rÕ   s     rs   Úmark_runzBaseSchedulerNode.mark_run.  s,   € Ø”<ð 	ð 	ˆCØ�LŠL‰NŒNˆNˆNð	ð 	ru   c                ó‚   — t          d„ t          j        | j        j        | j        j        ¦  «        D ¦   «         ¦  «        S )Nc              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   z6BaseSchedulerNode.used_buffer_names.<locals>.<genexpr>3  s8   è è € ð 
ð 
àð ŒHð
ð 
ð 
ð 
ð 
ð 
ru   )r   Ú	itertoolsÚchainrØ   rÙ   ra  rq   s    rs   ræ   z#BaseSchedulerNode.used_buffer_names2  sH   € Ýð 
ð 
å ” tÔ'7Ô'=¸tÔ?OÔ?VÑWÔWð
ñ 
ô 
ñ 
ô 
ð 	
ru   c                ó   ‡— t          ¦   «         Šd„ t          j        | j        j        | j        j        ¦  «        D ¦   «         }t          |¦  «        dk    r¨|                     ¦   «         }‰                     |¦  «         t          j
        j                             |¦  «        rH|                     ˆfd„t          j
        j        |                              ¦   «         D ¦   «         ¦  «         t          |¦  «        dk    °¨‰S )zË
        Returns buffer names used by this node, including aliases.

        Note: is_fake WeakDeps are excluded since they are purely for ordering
        and should not affect buffer lifetime.
        c                óT   — g | ]%}t          |t          ¦  «        r|j        °|j        ‘Œ&S r…   )r²   r;   Úis_fakerÚ   r‡  s     rs   r   zBBaseSchedulerNode.used_or_aliased_buffer_names.<locals>.<listcomp>A  sF   € ð 
ð 
ð 
àÝ˜s¥GÑ,Ô,ð
ð 25´ð
ØŒHð
ð 
ð 
ru   r   c              3  ó$   •K  — | ]
}|‰v¯|V — Œd S r   r…   )r·   ÚaliasÚ
used_namess     €rs   r¹   zABaseSchedulerNode.used_or_aliased_buffer_names.<locals>.<genexpr>J  s>   øè è € ð ð àð  JÐ.Ð.ð	 ð /Ð.Ð.Ð.ðð ru   )r   rª  r«  rØ   rÙ   ra  rÏ   ÚpopÚaddra   rÂ   Úname_to_bufferr¾  Úextendr  )rr   Údepsrâ   r±  s      @rs   r£  z.BaseSchedulerNode.used_or_aliased_buffer_names8  sý   ø€ õ '1¡l¤lˆ
ð
ð 
å ” tÔ'7Ô'=¸tÔ?OÔ?VÑWÔWð
ñ 
ô 
ˆõ
 �$‰iŒi˜!ŠmˆmØ—(’(‘*”*ˆCØ�NŠN˜3ÑÔÐÝŒwÔ%×)Ò)¨#Ñ.Ô.ð Ø—’ð ð ð ð å!"¤Ô!7Øô"ç2Ò2Ñ4Ô4ð	ñ ô ñ ô ð õ	 �$‰iŒi˜!Šmˆmð Ðru   c                óR   ‡ — t          ˆ fd„‰ j        D ¦   «         ¦  «        ‰ _        d S )Nc              3  óB   •K  — | ]}|j         ‰j        j        v¯|V — Œd S r   )rÚ   rä  Úavailable_buffer_names©r·   râ   rr   s     €rs   r¹   z/BaseSchedulerNode.prune_deps.<locals>.<genexpr>T  sA   øè è € ð -
ð -
àØŒx˜tœ~ÔDÐDÐDð àDÐDÐDÐDð-
ð -
ru   ©r   r<  rq   s   `rs   r—  zBaseSchedulerNode.prune_depsS  sD   ø€ Ý",ð -
ð -
ð -
ð -
àÔ.ð-
ñ -
ô -
ñ #
ô #
ˆÔÐÐru   c                óº   ‡ ‡— dˆ fd„Št          ˆfd„‰ j        j        D ¦   «         ¦  «        }‰                      ‰ j                             |¦  «        ¦  «         d S )Nrâ   r8   rŠ   rv   c                óÔ   •— t          | t          ¦  «        sdS | j        ‰j        j        vrdS ‰j        j        | j                                      ¦   «         }|t          j        j        v S r  )	r²   r;   rÚ   rä  r  rì  ra   rÂ   Úremoved_operations)râ   Úop_namerr   s     €rs   Úshould_prunez7BaseSchedulerNode.prune_weak_deps.<locals>.should_prune\  s^   ø€ Ý˜c¥7Ñ+Ô+ð Ø�uØŒx˜tœ~Ô9Ð9Ð9Ø�uà”nÔ0°´Ô:×KÒKÑMÔMˆGØ�aœgÔ8Ð8Ð8ru   c              3  ó2   •K  — | ]} ‰|¦  «        ¯|V — Œd S r   r…   ©r·   râ   rÀ  s     €rs   r¹   z4BaseSchedulerNode.prune_weak_deps.<locals>.<genexpr>e  sF   øè è € ð 
ð 
Ø°\°\À#Ñ5FÔ5Fð
Øð
ð 
ð 
ð 
ð 
ð 
ru   ©râ   r8   rŠ   rv   )r   rØ   rÙ   r‰  Úremove_reads)rr   Ú	to_removerÀ  s   ` @rs   Úprune_weak_depsz!BaseSchedulerNode.prune_weak_depsZ  sŒ   øø€ ð	9ð 	9ð 	9ð 	9ð 	9ð 	9õ ð 
ð 
ð 
ð 
ØÔ+Ô1ð
ñ 
ô 
ñ 
ô 
ˆ	ð 	×Ò˜TÔ-×:Ò:¸9ÑEÔEÑFÔFÐFÐFÐFru   Úname_to_fused_nodeúdict[str, BaseSchedulerNode]c                ó<   — t          | || j        j        ¦  «         d S r   )Ú_prune_redundant_depsrä  r  )rr   rÇ  s     rs   Úprune_redundant_depsz&BaseSchedulerNode.prune_redundant_depsj  s"   € õ 	˜dÐ$6¸¼Ô8RÑSÔSÐSÐSÐSru   c                óF   — | j         €J ‚| j                              ¦   «         S r   )r”   Úget_operation_namerq   s    rs   rê  zBaseSchedulerNode.get_nameo  r  ru   c                ó*   — |                       ¦   «         S r   rI  rq   s    rs   Úget_first_namez BaseSchedulerNode.get_first_names  s   € Ø�}Š}‰ŒÐru   c                óX   — t          d„ |                      ¦   «         D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   rI  ©r·   r”   s     rs   r¹   z8BaseSchedulerNode.get_operation_names.<locals>.<genexpr>x  s*   è è € ÐGÐG¨d˜$Ÿ-š-™/œ/ÐGÐGÐGÐGÐGÐGru   )r   r»   rq   s    rs   r  z%BaseSchedulerNode.get_operation_namesv  s)   € åÐGÐG°d·n²nÑ6FÔ6FÐGÑGÔGÑGÔGÐGru   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   rI  ©r·   rè   s     rs   r¹   z5BaseSchedulerNode.get_buffer_names.<locals>.<genexpr>|  s*   è è € ÐAÐA¨S˜#Ÿ,š,™.œ.ÐAÐAÐAÐAÐAÐAru   )r   r5  rq   s    rs   Úget_buffer_namesz"BaseSchedulerNode.get_buffer_namesz  s!   € åÐAÐA°D´LÐAÑAÔAÑAÔAÐAru   c                óX   — t          d„ |                      ¦   «         D ¦   «         ¦  «        S )Nc              3  ób   K  — | ]*}t          |t          ¦  «        ot          |d ¬¦  «        V — Œ+dS )T)Údisallow_fp32_opsN©r²   r³   r2   ©r·   Úns     rs   r¹   zABaseSchedulerNode.can_codegen_in_low_precision.<locals>.<genexpr>€  sX   è è € ð 
ð 
ð õ �q�-Ñ(Ô(ð GÝ+¨AÀÐFÑFÔFð
ð 
ð 
ð 
ð 
ð 
ru   ©rº   r»   rq   s    rs   Úcan_codegen_in_low_precisionz.BaseSchedulerNode.can_codegen_in_low_precision~  s<   € åð 
ð 
ð —^’^Ñ%Ô%ð
ñ 
ô 
ñ 
ô 
ð 	
ru   c                óX   — t          d„ |                      ¦   «         D ¦   «         ¦  «        S )Nc              3  ó^   K  — | ](}t          |t          ¦  «        ot          |¦  «        V — Œ)d S r   rÚ  rÛ  s     rs   r¹   z@BaseSchedulerNode.can_codegen_without_upcasts.<locals>.<genexpr>ˆ  sN   è è € ð 
ð 
àõ �q�-Ñ(Ô(ÐKÕ-HÈÑ-KÔ-Kð
ð 
ð 
ð 
ð 
ð 
ru   rÝ  rq   s    rs   r2   z-BaseSchedulerNode.can_codegen_without_upcasts†  s:   € åð 
ð 
à—^’^Ñ%Ô%ð
ñ 
ô 
ñ 
ô 
ð 	
ru   rx  c                ó   — | gS r   r…   rq   s    rs   r»   zBaseSchedulerNode.get_nodes�  s	   € Øˆvˆru   úSequence[SchedulerBuffer]c                ó   — | j         S r   )r5  rq   s    rs   rL  zBaseSchedulerNode.get_outputs�  s
   € ØŒ|Ðru   Úbuf_namerâ  c                ó   — | j         |         S r   )r7  )rr   rä  s     rs   Ú
get_outputzBaseSchedulerNode.get_output“  s   € ØÔ# HÔ-Ð-ru   r   c                óF   — | j         €J ‚| j                              ¦   «         S r   )r”   rª   rq   s    rs   rª   zBaseSchedulerNode.get_device–  s$   € ØŒyÐ$Ð$Ð$ØŒy×#Ò#Ñ%Ô%Ð%ru   c                óH   — |                       ¦   «         }|d uo
|j        dk    S ©NÚcpu)rª   r«   ©rr   Údevices     rs   Úis_cpuzBaseSchedulerNode.is_cpuš  s(   € Ø—’Ñ"Ô"ˆØ˜TÐ!Ð: f¤k°UÒ&:Ð:ru   c                óZ   — |                       ¦   «         }|d uot          |j        ¦  «        S r   )rª   r[   r«   rë  s     rs   r[   zBaseSchedulerNode.is_gpuž  s+   € Ø—’Ñ"Ô"ˆØ˜TÐ!Ð9¥f¨V¬[Ñ&9Ô&9Ð9ru   c                ó   — dS r  r…   rq   s    rs   r´   zBaseSchedulerNode.is_reduction¢  ó   € Øˆuru   c                ó   — dS r  r…   rq   s    rs   Úis_native_matmulz"BaseSchedulerNode.is_native_matmul¥  rð  ru   c                ó   — dS r  r…   rq   s    rs   Úis_split_scanzBaseSchedulerNode.is_split_scan¨  rð  ru   c                ó   — dS r  r…   rq   s    rs   Úis_templatezBaseSchedulerNode.is_template«  rð  ru   c                ó   — dS r  r…   rq   s    rs   Ú	is_externzBaseSchedulerNode.is_extern®  rð  ru   c                ó   — dS r  r…   rq   s    rs   Ú
is_foreachzBaseSchedulerNode.is_foreach±  rð  ru   Úread_depúdependencies.Depc                ó   — dS r  r…   ©rr   rû  s     rs   Úcan_inplacezBaseSchedulerNode.can_inplace´  rð  ru   c                ó   — dS r  r…   rq   s    rs   Úhas_side_effectsz"BaseSchedulerNode.has_side_effects·  rð  ru   c           	     ó�	  ‡ ‡	— ddl m} t          ‰ t          ¦  «        r°t          j        r¤t          j                             ‰  	                    ¦   «         t          j        ¦  «        rht          t          j        t          j        j        j        j        ¦  «        rt%          t          j        dd¦  «        �t'          t          j        d¦  «        sdS ‰ j        t          j        j        z  ‰ j        j        z  Š	dˆ fd
„}‰                      ¦   «         D �]´}|j        }|€J ‚|                     ¦   «         ry|                     ¦   «         se|                     ¦   «         sQ|                     ¦   «         t          j        j        v s,t          |                     ¦   «         t@          j!        ¦  «        rŒœ‰ j"        j#        D �]
}|j$        ‰ j        j%        v r‰ j        j%        |j$                 }n$‰ j        j&         '                    |j$        ¦  «        }|�rµt          j        j(         )                    |‰ ¦  «        �r�t          |j*        tV          ¦  «        �st|j,        €J ‚ˆ	fd„|j,        D ¦   «         }‰ j         -                    |j$        ‰ ¦  «        }|�s5t]          |¦  «        dk    �r!|d         j/        �r|d         j        ‰ u �r|j        ��ût          |j                             ¦   «         t@          j0        t@          j1        t@          j2        t@          j!        f¦  «        �s§|j*        r[t          |j*        j        t@          j3        t@          j4        f¦  «        r+t]          |j                             ¦   «         ¦  «        dk    �sE ||j        |j        ¦  «        �r. ||¦  «        �r"t          j        j5         6                    |                     ¦   «         |                     ¦   «         ¦  «         t          t          j        t          j        j        j        j        ¦  «        rlt          j        j7         8                    |                     ¦   «         ¦  «         t          j        j7         8                    |                     ¦   «         ¦  «         |                     ¦   «         t          j        j9        |                     ¦   «         <    n�Œ�Œ¶dS )z~
        Decide if there should be inplace updates for the node
        and record the decision in the active kernel.
        r   )Úcan_match_buffer_sizeÚ	mutationsNr  Úbuf_to_be_inplacedrâ  rŠ   rv   c                óÆ  •‡— | j                              ‰¦  «        }|                      ¦   «         Št          ¦   «         }| j        D ]š}|j        }t          |t          ¦  «        sŒ|                     ¦   «         | j         j	        vs| j                              |¦  «        |urŒ\|ˆfd„|j
                             ¦   «         D ¦   «         z  }t          |¦  «        dk    r dS Œ›dS )Nc              3  ó2   •K  — | ]}|j         ‰k    ¯|V — Œd S r   r†  )r·   Úorä  s     €rs   r¹   z^BaseSchedulerNode.decide_inplace_update.<locals>.single_index_in_fused_node.<locals>.<genexpr>í  s<   øè è € ð ð àØ”v Ò)Ð)ð à)Ð)Ð)Ð)ðð ru   r   FT)rä  Úget_fused_noderê  r   rç  r”   r²   rf   rÏ  rÇ  rØ   rˆ  rÏ   )r  Ú
fused_noder¶  rû  Ú	user_noderä  rr   s        @€rs   Úsingle_index_in_fused_nodezKBaseSchedulerNode.decide_inplace_update.<locals>.single_index_in_fused_nodeÕ  s  øø€ ð
 ,Ô5×DÒDÀTÑJÔJˆJØ)×2Ò2Ñ4Ô4ˆHõ %/¡L¤LˆDØ*Ô0ð !ð !�Ø œI�	Ý! )Õ->Ñ?Ô?ð Øð ×,Ò,Ñ.Ô.Ø-Ô7ÔJðKð Kà)Ô3×BÒBÀ9ÑMÔMØ%ð&ð &ð àð ð ð ð à&Ô2×CÒCÑEÔEðñ ô ñ �õ
 �t‘9”9˜q’=�=Ø ˜5˜5ð !ð �4ru   c                óJ   •— g | ]}|j                              ¦   «         ‰v¯|‘Œ S r…   rþ  )r·   r“  Úinconsequential_nodess     €rs   r   z;BaseSchedulerNode.decide_inplace_update.<locals>.<listcomp>  s;   ø€ ð &ð &ð &àØœ6Ÿ?š?Ñ,Ô,Ð4IÐIÐIð àIÐIÐIru   r   )r  râ  rŠ   rv   ):Úcodegen.wrapperr  r²   r³   r-   Úinplace_buffersra   rÂ   Úhas_featurerª   r3   ÚINPLACE_BUFFERSr  rp  rq  ÚcodegenÚsimdrˆ  rÉ  r
  r  r¾  rä  Úcompleted_operationsrL  r”   r  r  r  rê  Úremoved_buffersr  r0   r  rØ   rÙ   rÚ   r  r  r¾  r  Ú	can_reuserå  ÚNopKernelSchedulerNoderç  Úhas_cross_stream_hazardrÏ   rÿ  rD   rC   ÚMutationLayoutSHOULDREMOVEÚFallbackKernelrB   r  Úmake_inplacer  r³  r  )
rr   r  r  rÕ   Úbuf_nodeÚreadÚ	input_bufÚremaining_usesr  r  s
   `        @rs   Údecide_inplace_updatez'BaseSchedulerNode.decide_inplace_updateº  s‡  øø€ ð
 	;Ð:Ð:Ð:Ð:Ð:õ �t�]Ñ+Ô+ð	åÔ&ð	õ ”×#Ò# D§O¢OÑ$5Ô$5µ~Ô7UÑVÔVð	õ
 �qœx­¬Ô)@Ô)EÔ)PÑQÔQð	õ �1œ8 [°$Ñ7Ô7ÐCõ �œ &Ñ)Ô)ð Dð
 ˆFð ŒNÝŒgÔ(ñ)àŒnÔ1ñ2ð 	ð 	ð  	ð  	ð  	ð  	ð  	ðD ×#Ò#Ñ%Ô%ð L	ñ L	ˆCØ”xˆHØÐ'Ð'Ð'à×,Ò,Ñ.Ô.ð	à×8Ò8Ñ:Ô:ð	ð ×.Ò.Ñ0Ô0ð	ð —<’<‘>”>¥Q¤WÔ%<Ð<Ð<õ ˜h×6Ò6Ñ8Ô8½"Ô:MÑNÔNð =ð
 àÔ(Ô.ð >ñ >�à”9 ¤Ô EÐEÐEØ $¤Ô EÀdÄiÔ P�I�Ià $¤Ô :× >Ò >¸t¼yÑ IÔ I�Ið ñ7åœÔ,×6Ò6°yÀ$ÑGÔGñ7õ ' yÔ'<Õ>TÑUÔUñ7ð
 %œ?Ð6Ð6Ð6ð&ð &ð &ð &à!*¤ð&ñ &ô &�Nð
 /3¬n×.TÒ.TØœ	 4ñ/ô /Ð+ð
 4ñ(å Ñ/Ô/°1Ò4Ñ4Ø*¨1Ô-Ô9ñ 5à*¨1Ô-Ô2°dÐ:Ñ:Ø%œNÑ6Ý *Ø%œN×:Ò:Ñ<Ô<å "¤Ý "Ô 4Ý "Ô =Ý "Ô 3ð	ñ!ô !ñ 7ð &Ô1ð 7õ !+Ø )Ô 5Ô :Ý!#Ô!2µB´NÐ Cñ!ô !ð 7õ  !$ I¤N×$OÒ$OÑ$QÔ$QÑ RÔ RÐUVÒ VÑ Và1Ð1°)´.À#Ä(ÑKÔKñ !Wð 7Ð6°yÑAÔAñ !Wõ œœ×2Ò2°9×3EÒ3EÑ3GÔ3GÈÏÊÉÌÑXÔXÐXå%ÝœH¥e¤oÔ&=Ô&BÔ&Mñô ð Cõ œHÔ.×2Ò2°9×3EÒ3EÑ3GÔ3GÑHÔHÐHÝœHÔ.×2Ò2°3·<²<±>´>ÑBÔBÐBð &×.Ò.Ñ0Ô0õ œÔ7¸¿º¹¼ÑGð ˜ùùðYL	ð L	ru   TÚbufferrX   Ú	only_oncec                ón  — t           j        sd S |r	| j        rd S | j        €J ‚| j                             ¦   «         }g }|D �]B}|j        dk    rŒ|                     d¦  «         |                     d¦  «         d|j        › d|j        › �}d|j        v r|d|j        d         › �z   }|                     |¦  «         d|j        v r½|j        d         › }| 	                    d	d
¬¦  «        d         }|                     d| 
                    dd¦  «         
                    dd¦  «         
                    dd¦  «         
                    dd¦  «        z   ¦  «         |                     d¦  «         |                     d¦  «         �ŒDt          |¦  «        dk    rd S |                     |¦  «         d| _        d S )NrG  rh  z#pragma CMT ORIGIN:z#pragma CMT ú Úseq_nrz seq_nr:Ústack_traceú|r   )Úmaxsplitr!  Ú{z{{Ú}z}}rX  ú\z\\z#pragma CMT END ORIGINr   T)r-   Úcomment_originr=  r”   Úget_originsrë  rç   ÚtargetÚmetaÚrsplitÚreplacerÏ   Ú
writelines)	rr   r"  r#  ÚoriginsÚ	out_linesr  Úop_info_strr'  Ústack_trace_last_lines	            rs   Úcodegen_originating_infoz*BaseSchedulerNode.codegen_originating_infoE  sî  € õ Ô$ð 	ØˆFàð 	˜œð 	ØˆFØŒyÐ$Ð$Ð$Ø”)×'Ò'Ñ)Ô)ˆØˆ	àð 	%ñ 	%ˆAØŒt�xÒÐàà×Ò˜RÑ Ô Ð à×ÒÐ2Ñ3Ô3Ð3Ø:¨¬Ð:Ð:°´Ð:Ð:ˆKØ˜1œ6Ð!Ð!Ø)Ð,I°q´v¸hÔ7GÐ,IÐ,IÑI�Ø×Ò˜[Ñ)Ô)Ð)Ø ¤Ð&Ð&Ø!"¤¨Ô!6Ð8�Ø(3×(:Ò(:¸3ÈÐ(:Ñ(KÔ(KÈBÔ(OÐ%Ø× Ò Ø"Ø+×3Ò3°C¸Ñ>Ô>ß’W˜S $Ñ'Ô'ß’W˜T 4Ñ(Ô(ß’WØ˜fñô ñ	ñô ð ð × Ò Ð!9Ñ:Ô:Ð:Ø× Ò  Ñ$Ô$Ð$ùåˆy‰>Œ>˜QÒÐØˆFð 	×Ò˜)Ñ$Ô$Ð$ØˆŒˆˆru   c                ó0   — |                       dd¬¦  «        S )NT©Úinclude_readsÚinclude_writes©Ú!get_read_write_buffers_sizes_implrq   s    rs   Úget_read_write_buffers_sizesz.BaseSchedulerNode.get_read_write_buffers_sizest  s$   € à×5Ò5Ø¨tð 6ñ 
ô 
ð 	
ru   c                ó0   — |                       dd¬¦  «        S )NTFr:  r=  rq   s    rs   Úget_read_buffer_sizesz'BaseSchedulerNode.get_read_buffer_sizesz  s$   € à×5Ò5Ø¨uð 6ñ 
ô 
ð 	
ru   c                ó0   — |                       dd¬¦  «        S )NFTr:  r=  rq   s    rs   Úget_write_buffer_sizesz(BaseSchedulerNode.get_write_buffer_sizes€  s$   € à×5Ò5Ø°ð 6ñ 
ô 
ð 	
ru   r;  r<  c                ór   — t          |                      ||¬¦  «                             ¦   «         d¬¦  «        S )Nr:  r   )Ústart)rÿ   Úget_read_write_buffer_accessesrà   )rr   r;  r<  s      rs   r>  z3BaseSchedulerNode.get_read_write_buffers_sizes_impl†  sD   € õ Ø×/Ò/Ø+¸Nð 0ñ ô çŠf‰hŒhØð	
ñ 
ô 
ð 	
ru   údict[str, int]c                óø  ‡ ‡‡‡‡‡— t          ‰ t          ¦  «        ri S t          ‰ t          ¦  «        rt          ‰ j        t          ¦  «        ri S t          ‰ t          ¦  «        rCt          ‰ j        t
          j        ¦  «        r$‰ j        j        t          j	        j
        j        u ri S dd„Št          ‰ t          ¦  «        rY ‰t          ‰                      ¦   «         d         ¦  «        t          ‰                      ¦   «         d         ¦  «        z  ¦  «        Šnt          d¦  «        Št!          j        t$          ¦  «        }|r/‰ j        j        D ]"}||j                                      |¦  «         Œ#|r/‰ j        j        D ]"}||j                                      |¦  «         Œ#|r#t1          d	„ ‰ j        j        D ¦   «         ¦  «        nt1          ¦   «         }|r#t1          d
„ ‰ j        j        D ¦   «         ¦  «        nt1          ¦   «         }dˆ fd„Št          ‰ t2          ¦  «        r&t1          ˆˆ fd„|D ¦   «         ¦  «        }||z
  }||z
  }i }||z  D ]¨}	t5          ˆfd„||	         D ¦   «         ¦  «        Š|	t6          j        j        v rt6          j        j        |	         }
n,|	t6          j        j        v rt6          j        j        |	         }
nŒzdˆˆˆ ˆfd„Š ‰|
¦  «        }|	|vr|||	<   Œ˜||	xx         |z  cc<   Œ©|S )az  
        Counting the number of bytes accessed for a kernel is
        surprisingly tricky. In particular, there is a differentiation
        between 'theoretical' memory accesses and practical memory
        accesses. For example, a layernorm kernel may actually access an
        input 3 times, but in theory, it only needs to access its input
        once (and may be optimized to do so through say, persistent
        reductions)

        Another example is that even though a buffer is passed in, we may
        not access the entire buffer. This may occur if we are accessing
        a slice of the buffer. Another tricky case is for indirect
        indexing, where the amount of bytes accessed depends on the
        values of the input.

        What this function aims to compute is the memory accesses for
        worst-case inputs, best-case optimization. What this means is
        that for each buffer we compute the amount of potential accesses in two ways and take the minimum.

        1. Numel in ranges multiplied by number of deps the buffer has
        2. The buffer size

        Returns memory accesses per buffer.
        ÚsrT  rŠ   r‘   c                óN   — t           j        j                             | d¬¦  «        S )Nr   rð   )ra   rÂ   rÃ   rò   )rI  s    rs   Útry_size_hintzGBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.try_size_hintº  s    € Ý”7Ô#×5Ò5°aÀ!Ð5ÑDÔDÐDru   r   r   ç    eÍÍAc              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zCBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.<genexpr>Ï  s$   è è € ÐBÐB C�s”xÐBÐBÐBÐBÐBÐBru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zCBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.<genexpr>Ô  ó$   è è € ÐCÐC C�s”xÐCÐCÐCÐCÐCÐCru   rÕ   rÖ   rÞ   rx  rv   c                óª   •— ‰j         j        |          j        }t          d„ |D ¦   «         ¦  «        }t	          |t          |¦  «        z
  ¦  «        dk    S )Nc              3  ó$   K  — | ]}|j         V — Œd S r   r¼   )r·   rû  s     rs   r¹   z\BaseSchedulerNode.get_read_write_buffer_accesses.<locals>.is_materialized.<locals>.<genexpr>Û  s$   è è € Ð!>Ð!>° $¤)Ð!>Ð!>Ð!>Ð!>Ð!>Ð!>ru   r   )rä  r  rç  r   rÏ   )rÕ   rÞ   rç  Úbuf_usesrr   s       €rs   Úis_materializedzIBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.is_materializedÙ  sQ   ø€ Ø”NÔ.¨sÔ3Ô9ˆEÝ!Ð!>Ð!>¸Ð!>Ñ!>Ô!>Ñ>Ô>ˆHÝ�x¥*¨VÑ"4Ô"4Ñ4Ñ5Ô5¸Ò9Ð9ru   c              3  ó>   •K  — | ]} ‰|‰j         ¦  «        °|V — Œd S r   ©rÞ   )r·   râ   rS  rr   s     €€rs   r¹   zCBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.<genexpr>ß  sJ   øè è € ð )ð )Ø¨_¨_¸SÀ$Ä+Ñ-NÔ-Nð)Øð)ð )ð )ð )ð )ð )ru   c              3  ó   •K  — | ]}‰V — Œd S r   r…   )r·   râ   Ú
node_numels     €rs   r¹   zCBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.<genexpr>è  s#   øè è € Ð$RÐ$R°C ZÐ$RÐ$RÐ$RÐ$RÐ$RÐ$Rru   ú4ir.Buffer | ir.TensorBox | ir.TorchBindObject | Nonec                ó`  •— | sdS t          | t          j        ¦  «        r|                      ¦   «         S t          | j        t
          ¦  «        rº‰j        j        |                      ¦   «                  j	        }d}|D ]Š}t          |j
        t          ¦  «        rŒt          |j
        t          ¦  «        sJ ‚t          |j
        j
        t          ¦  «        r0|j
                             ¦   «         D ]}| ‰|j
        ¦  «        z  }ŒŒˆ dS |S t          | j        t          j        ¦  «        r-t!          ˆfd„|                      ¦   «         D ¦   «         ¦  «        S  ‰	t%          |                      ¦   «         ¦  «        ¦  «        }t)          |                      ¦   «         ¦  «        t-          ‰|¦  «        z  S )Nr   c              3  óh   •K  — | ],} ‰t           j                             |¦  «        ¦  «        V — Œ-d S r   )ra   rÂ   Ú
get_buffer)r·   Úmut_nameÚget_buf_bytess     €rs   r¹   zZBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.get_buf_bytes.<locals>.<genexpr>  sQ   øè è € ð ð à$ð &˜¥a¤g×&8Ò&8¸Ñ&BÔ&BÑCÔCðð ð ð ð ð ru   )r²   r0   ÚTorchBindObjectr]  rõ  rC   rä  r  rê  rç  r”   r  rf   rB   rL  rD   rÿ   r  r_   rs  rT   Ú	get_dtypera  )
rÕ   rç  Útotrû  Ú	sched_bufÚ	buf_elemsÚbuf_accessed_elemsr]  rr   rK  s
         €€€€rs   r]  zGBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.get_buf_bytesñ  s¸  ø€ ð ð Ø˜1å˜c¥2Ô#5Ñ6Ô6ð Ø×,Ò,Ñ.Ô.Ð.Ý ¤
Õ,=Ñ>Ô>ð ð !œNÔ6°s·|²|±~´~ÔFÔL�EØ�CØ %ð %ð %˜Ý% d¤iµÑ<Ô<ð %Ø$Ý)¨$¬)Õ5FÑGÔGÐGÐGÐGÝ% d¤i¤nµkÑBÔBð %Ø-1¬Y×-BÒ-BÑ-DÔ-Dð Eð E 	Ø # } }°Y´^Ñ'DÔ'DÑ D  ðEð $% 1 1Ø�JÝ ¤
­B¬MÑ:Ô:ð 	Ýð ð ð ð à(+×(>Ò(>Ñ(@Ô(@ðñ ô ñ ô ð ð
 !. ­m¸C¿LºL¹N¼NÑ.KÔ.KÑ LÔ L�IÝ)¨#¯-ª-©/¬/Ñ:Ô:½SØ*¨Iñ>ô >ñ ð ru   )rI  rT  rŠ   r‘   )rÕ   rÖ   rÞ   rx  rŠ   rv   )rÕ   rX  rŠ   r‘   )r²   r  ÚExternKernelSchedulerNoder”   rB   r0   r  Úop_overloadrp  Ú_primsÚ	rng_primsÚgraphsafe_run_with_rng_stater³   r_   rc  r‘   Úcollectionsr   r¥   rØ   rÙ   rÚ   rç   ra  r   rÝ   rÿ   ra   rÂ   r´  Úgraph_inputs)rr   r;  r<  Úbuf_accessesrâ   rÙ   ra  r  Úbuf_byte_accessesrä  rÕ   Ú	buf_bytesrc  r]  rS  rW  rK  s   `           @@@@@rs   rF  z0BaseSchedulerNode.get_read_write_buffer_accesses�  s¨  øøøøøø€ õ6 �dÕ2Ñ3Ô3ð 	ØˆIÝ�dÕ5Ñ6Ô6ð 	½:ØŒI•{ñ<
ô <
ð 	ð ˆIå�tÕ6Ñ7Ô7ð	å˜4œ9¥bÔ&7Ñ8Ô8ð	ð ”	Ô%ÝŒ|Ô%ÔBðCð Cð ˆIð	Eð 	Eð 	Eð 	Eõ �d�MÑ*Ô*ð 	"Ø&˜Ý˜dŸošoÑ/Ô/°Ô2Ñ3Ô3Ý §¢Ñ 1Ô 1°!Ô 4Ñ5Ô5ñ6ñô ˆJˆJõ
 ˜S™œˆJÝ"Ô.­tÑ4Ô4ˆàð 	3ØÔ'Ô-ð 3ð 3�Ø˜SœXÔ&×-Ò-¨cÑ2Ô2Ð2Ð2àð 	3ØÔ'Ô.ð 3ð 3�Ø˜SœXÔ&×-Ò-¨cÑ2Ô2Ð2Ð2ð ð�JÐBÐB¨4Ô+;Ô+AÐBÑBÔBÑBÔBÐBå‘”ð 	ð ð�JÐCÐC¨4Ô+;Ô+BÐCÑCÔCÑCÔCÐCå‘”ð 	ð	:ð 	:ð 	:ð 	:ð 	:ð 	:õ
 �dÕ.Ñ/Ô/ð 	,Ý(ð )ð )ð )ð )ð )Ø%ð)ñ )ô )ñ ô ˆOð ˜oÑ-ˆFØ˜OÑ+ˆEà,.Ðà ™ð 3	9ð 3	9ˆHÝ!$Ð$RÐ$RÐ$RÐ$R¸<ÈÔ;QÐ$RÑ$RÔ$RÑ!RÔ!RÐà�1œ7Ô1Ð1Ð1Ý”gÔ,¨XÔ6��Ø�QœWÔ1Ð1Ð1Ý”gÔ*¨8Ô4��àð#ð #ð #ð #ð #ð #ð #ð #ð #ðJ &˜ cÑ*Ô*ˆIØÐ0Ð0Ð0Ø.7Ð! (Ñ+Ð+à! (Ð+Ð+Ô+¨yÑ8Ð+Ð+Ñ+Ð+à Ð ru   ú
int | Nonec                óF  — | j         €d S | j                              ¦   «         }|€d S t          |¦  «        }|€d S t          |t          j        ¦  «        r|j         j        }t          j        j	         
                    |d¬¦  «        }t          d         dxx         |z  cc<   |S )Nr   rð   ÚinductorÚ
flop_count)r”   Úget_origin_noder>   r²   rp  ÚSymIntÚexprra   rÂ   rÃ   rò   r   )rr   Úfx_nodeÚflopsÚresolved_flopss       rs   Úestimate_flopsz BaseSchedulerNode.estimate_flops  s¤   € àŒ9ÐØ�4Ø”)×+Ò+Ñ-Ô-ˆØˆ?Ø�4å˜wÑ'Ô'ˆØˆ=Ø�4å�e�Uœ\Ñ*Ô*ð 	$Ø”J”OˆEåœÔ)×;Ò;¸EÈAÐ;ÑNÔNˆÝ�Ô˜\Ð*Ð*Ô*¨nÑ<Ð*Ð*Ñ*ØÐru   Úfloatc                óF   — | j         �| j         S |                      ¦   «         S r   )r9  Ú_get_estimated_runtimerq   s    rs   Úget_estimated_runtimez'BaseSchedulerNode.get_estimated_runtime1  s&   € ØÔ*Ð6ØÔ2Ð2à×*Ò*Ñ,Ô,Ð,ru   c                óš  — |                       ¦   «         d                              ¦   «         d         }|j                             ¦   «         }t	          t          |¦  «        ¦  «        sdS t          | j        ¦  «        �r,t          | j        t          j	        ¦  «        sJ ‚	 t          j        r‹t          | ¦  «        }t          ¦   «         }|                     |¦  «        }|�t          |t          ¦  «        sJ ‚|S t!          | ¦  «        }|€t#          | j        ¦  «        }|                     ||¬¦  «         |S t#          | j        ¦  «        S # t&          $ r%}t(                               |¦  «         Y d}~dS d}~wt,          $ r%}t(                               |¦  «         Y d}~dS d}~ww xY wt/          | j        ¦  «        rdS t1          | ¦  «        }|�|S |j                             ¦   «         }		 t5          ¦   «         }
t7          |	¦  «        dz  }|
dk    rt9          d|
› �¦  «        ‚|dk    rt9          d|› �¦  «        ‚n# t:          $ r Y dS w xY w|                      ¦   «         }|dk    s|€|                      ¦   «         |
z  }|dz  }|S d}|                      ¦   «         }|€dn|}||z  |z  d	z  }||
z  }tA          ||¦  «        }|dz  }|S )
zC
        Returns estimated op runtime in milliseconds (ms)
        r   N©Úvaluel    J)£z-gpu_memory_bandwidth cannot be <= 0, but got z"gpu_flops cannot be <= 0, but got g    €„.Ag      ð?rL  )!r»   rL  r”   r  r[   r@   rY   r²   r0   ÚIRNoder.   Ú,runtime_estimations_use_nccl_lib_estimationsÚ)get_estimate_runtime_cache_key_from_snodeÚget_estimate_runtime_cacheÚlookupry  r7   r6   Ú	set_valueÚ
ValueErrorrd  rz  Ú	TypeErrorr^   Ú maybe_estimate_runtime_benchmarkÚmaybe_get_dtyperU   rS   ÚAssertionErrorrc  rx  r?  r`  )rr   rÕ   rõ  Ú	cache_keyÚcacheÚ	cache_valÚmsr  ÚretÚdtypeÚgpu_memory_bandwidthÚ	gpu_flopsÚ	flops_estÚnsÚfactorÚcounted_bytesÚcompute_timeÚtransfer_times                     rs   r{  z(BaseSchedulerNode._get_estimated_runtime7  s#  € ð
 �nŠnÑÔ˜qÔ!×-Ò-Ñ/Ô/°Ô2ˆØ”×)Ò)Ñ+Ô+ˆÝ•o fÑ-Ô-Ñ.Ô.ð 	à�1õ ˜œÑ#Ô#ñ "	Ý˜dœi­¬Ñ3Ô3Ð3Ð3Ð3ðÝÔLð Ý IÈ$Ñ OÔ O�IÝ6Ñ8Ô8�EØ %§¢¨YÑ 7Ô 7�IØ Ð,Ý)¨)µUÑ;Ô;Ð;Ð;Ð;Ø(Ð(åHÈÑNÔN�BØ�zå=¸d¼iÑHÔH˜à—O’O I°R�OÑ8Ô8Ð8Ø�IÝ7¸¼	ÑBÔBÐBøÝð ð ð õ —’˜‘”�Ø�q�q�q�q�qøøøøÝð ð ð å—’˜‘”�Ø�q�q�q�q�qøøøøðøøøõ
 �T”YÑÔð 	ð
 �1å.¨tÑ4Ô4ˆØˆ?ØˆJà”×(Ò(Ñ*Ô*ˆð	Ý#4Ñ#6Ô#6Ð Ý)¨%Ñ0Ô0°6Ñ9ˆIð $ qÒ(Ð(Ý$ØZÐDXÐZÐZñô ð ð ˜AŠ~ˆ~Ý$Ð%UÈ)Ð%UÐ%UÑVÔVÐVð øåð 	ð 	ð 	Ø�1�1ð	øøøð ×'Ò'Ñ)Ô)ˆ	à˜Š>ˆ>˜YÐ.à×2Ò2Ñ4Ô4Ð7KÑKˆBØ�c‘ˆBØˆIð ˆØ×9Ò9Ñ;Ô;ˆØ*Ð2˜˜¸ˆØ Ñ*¨YÑ6¸#Ñ=ˆØ%Ð(<Ñ<ˆõ �˜}Ñ-Ô-ˆØ�#‰XˆØˆ	sD   Â!AE Ã:=E Ä8E Å
F(ÅE6Å6F(ÆF#Æ#F(Ç.AH? È?
IÉIúir.TemplateBuffer | Nonec                ó   — d S r   r…   rq   s    rs   Úget_template_nodez#BaseSchedulerNode.get_template_node�  ó   € Øˆtru   úir.TemplateBufferc                ó6   — |                       ¦   «         }|€J ‚|S r   ©r›  )rr   Útemplates     rs   Úget_template_node_or_throwz,BaseSchedulerNode.get_template_node_or_throw’  s$   € Ø×)Ò)Ñ+Ô+ˆØÐ#Ð#Ð#Øˆru   rw  úlist[BaseSchedulerNode]úJtuple[list[BaseSchedulerNode], BaseSchedulerNode, list[BaseSchedulerNode]]c                ó–   — t          d„ t          | ¦  «        D ¦   «         ¦  «        }| d|…         }| |         }| |dz   d…         }|||fS )zQ
        For the list of nodes, get the prologue, template, and epilogue
        c              3  óH   K  — | ]\  }}|                      ¦   «         ¯|V — Œd S r   ©rö  ©r·   ÚirÜ  s      rs   r¹   zCBaseSchedulerNode.get_prologue_template_epilogue.<locals>.<genexpr>ž  s3   è è € ÐPÐP¡D A qÀÇÂÁÄÐP˜aÐPÐPÐPÐPÐPÐPru   Nr   )ÚnextÚ	enumerate)rw  Útemplate_indexÚprologueÚtemplate_nodeÚepilogues        rs   Úget_prologue_template_epiloguez0BaseSchedulerNode.get_prologue_template_epilogue—  sb   € õ ÐPÐP­I°eÑ,<Ô,<ÐPÑPÔPÑPÔPˆà˜˜.˜Ô)ˆØ˜nÔ-ˆØ˜¨!Ñ+Ð-Ð-Ô.ˆØ˜¨Ð0Ð0ru   )rä  rã  rŠ   r   )r”   rD  rŠ   r   r"  )rŠ   rä   r$  ©r|  r9   r}  r9   rŠ   rv   ©r‚  r1  rŠ   r   )râ   r8   rŠ   r   r%  )r”  r:  rŠ   r   )rŠ   rš  ©rž  r™   rŸ  r1  rŠ   r   ©rŠ   r™   ©rÇ  rÈ  rŠ   r   ©rŠ   rx  )rŠ   râ  )rä  rÖ   rŠ   râ  r'  ©rû  rü  rŠ   rv   ©T)r"  rX   r#  rv   rŠ   r   r#  )r;  rv   r<  rv   rŠ   r‘   )r;  rv   r<  rv   rŠ   rG  ©rŠ   rn  ©rŠ   ry  ©rŠ   r™  )rŠ   r�  )rw  r¢  rŠ   r£  )@r€   r�   r‚   rƒ   r”   r9  r=  rC  rN  rR  rü  rb  rk  rx  r{  r€  rŒ  r�  r“  r‰  r–  rO   r–  r¥  r§  ræ   r£  r—  rÆ  rË  rê  rÏ  r  rÖ  rÞ  r2   r»   rL  ræ  rª   rí  r[   r´   rò  rô  rö  rø  rú  rÿ  r  r!  r8  r?  rA  rC  r>  rF  rx  r|  r{  r›  r¡  r2  r¯  r…   ru   rs   rf   rf   �  sä  € € € € € € ØÐÐÑØBÐBÐBÑBØÐÐÑð ÐÐÑØÐÐÑØ€N€N�NØ€N€N�NØ'Ð'Ð'Ñ'Ø$Ð$Ð$Ñ$Ø $€DÐ$Ð$Ð$Ñ$Ø"Ð"Ð"Ñ"Ø/Ð/Ð/Ñ/Ø/3ÐÐ3Ð3Ð3Ñ3Ø(Ð(Ð(Ñ(Ø'Ð'Ð'Ñ'Ø€GÐÐÐÑð
ð 
ð 
ð 
ð#ð #ð #ð #ð4Bð Bð Bð Bð*ð *ð *ð *ð6ð ð ð ð+ð +ð +ð +ð#ð #ð #ð #ð
ð 
ð 
ð 
ðð ð ð ð
Mð Mð Mð Mð>ð >ð >ð >ð
ð 
ð 
ð 
ð
ð ð ð ð5ð 5ð 5ð 5ð ð0ð 0ð 0ñ „]ð0ð=ð =ð =ð =ðð ð ð ð
ð 
ð 
ð 
ðð ð ð ð6
ð 
ð 
ð 
ðGð Gð Gð Gð Tð Tð Tð Tð
.ð .ð .ð .ðð ð ð ð ðHð Hð Hñ „]ðHð ðBð Bð Bñ „]ðBð ð
ð 
ð 
ñ „]ð
ð ð
ð 
ð 
ñ „]ð
ðð ð ð ðð ð ð ð.ð .ð .ð .ð&ð &ð &ð &ð;ð ;ð ;ð ;ð:ð :ð :ð :ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðIð Ið Ið IðX 9=ð-ð -ð -ð -ð -ð^ ð
ð 
ð 
ñ „]ð
ð
 ð
ð 
ð 
ñ „]ð
ð
 ð
ð 
ð 
ñ „]ð
ð

ð 
ð 
ð 
ðL!ð L!ð L!ð L!ð\ ðð ð ñ „]ðð$-ð -ð -ð -ð ðUð Uð Uñ „]ðUðnð ð ð ðð ð ð ð
 ð1ð 1ð 1ñ „\ð1ð 1ð 1ru   ú$torch._inductor.codecache.LocalCachec                 óH   — t           j        j                             ¦   «         S r   )rp  rq  Ú	codecacheÚ
LocalCacher…   ru   rs   rƒ  rƒ  ¦  s   € åŒ?Ô$×/Ò/Ñ1Ô1Ð1ru   ÚsnoderÖ   c                ó\  ‡— t          | j        dd¦  «        }| j        j        }| j                             g |¢| j        j        ¢| j        j        ¦  «        }| j        j        }t          j        ||f¦  «        \  }}dd„Št          |ft          ˆfd„|D ¦   «         ¦  «        z   ¦  «        }|S )NÚpython_kernel_namerh  rŠ   rv   c                ó„   — t          | t          j        ¦  «        o&t          | t          j        t          j        f¦  «         S r   )r²   r0   r€  ÚGeneratorStateÚOpaqueObjectState©r“  s    rs   Ú_is_tensor_irz@get_estimate_runtime_cache_key_from_snode.<locals>._is_tensor_irµ  s<   € Ý˜!�RœYÑ'Ô'ð 
µ
Ø•Ô!¥2Ô#7Ð8ñ1
ô 1
ð -
ð 	
ru   c              3  ót   •K  — | ]2} ‰|¦  «        r!t          |                     ¦   «         ¦  «        nd V — Œ3d S r   )rÐ   rs  )r·   ÚarÆ  s     €rs   r¹   z<get_estimate_runtime_cache_key_from_snode.<locals>.<genexpr>¼  sG   øè è € ÐUÐUÀa } }°QÑ'7Ô'7ÐA•�a—j’j‘l”lÑ#Ô#Ð#¸TÐUÐUÐUÐUÐUÐUru   r%  )
rÉ  r”   ÚinputsÚfill_non_provided_argsÚconstant_argsr@  ÚpytreeÚtree_flattenrÖ   rÐ   )r¿  rÁ  r  r@  Ú	flat_argsÚflat_args_pytree_specr‹  rÆ  s          @rs   r‚  r‚  «  sÒ   ø€ Ý  ¤Ð-AÀ2ÑFÔFÐØŒ:Ô€DØŒ:×,Ò,Ø*ˆ$Ð*�”Ô)Ð*ØŒ
Ôñô €Dð ŒZÔ€FÝ'-Ô':¸DÀ&¸>Ñ'JÔ'JÑ$€IÐ$ð
ð 
ð 
ð 
õ
 Ø	ÐÝ
ÐUÐUÐUÐUÈ9ÐUÑUÔUÑ
UÔ
Uñ	Vñô €Ið Ðru   úCallable[[Any], Any] | Nonec                óö   — t          | t          ¦  «        sd S t          | j        t          j        ¦  «        sd S | j        j        }t          |t          j        j        ¦  «        sd S |j	        }ddl
m} ||vrd S |S )Nr   )Úflop_registry)r²   rd  r”   r0   ÚExternKernelre  rp  Ú_opsÚ
OpOverloadÚoverloadpacketÚtorch.utils.flop_counterrÒ  )r¿  re  rë  rÒ  s       rs   Ú_get_benchmarkable_extern_fnrØ  Á  sŒ   € õ �eÕ6Ñ7Ô7ð ØˆtÝ�e”j¥"¤/Ñ2Ô2ð Øˆtà”*Ô(€KÝ�k¥5¤:Ô#8Ñ9Ô9ð Øˆtà	Ô	#€Bà6Ð6Ð6Ð6Ð6Ð6à	�ÐÐØˆtà€Iru   r8  c                ó–  ‡ ‡— d }d }t           j        rt          ‰ ¦  «        }|€d S |}ˆ ˆfd„}nd S t          ‰ ¦  «        }t	          ¦   «         }|                     |¦  «        }|�t          |t          ¦  «        sJ ‚|S ddlm	Š  |¦   «         \  }}ddl
m}	 |	                     |||ddd¬¦  «        }
|                     ||
¬	¦  «         |
S )
Nc                 ó   •—  ‰‰ ¦  «        S r   r…   )r¿  Úsnode_args_kwargss   €€rs   rA  z2maybe_estimate_runtime_benchmark.<locals>.<lambda>à  s   ø€ Ð!2Ð!2°5Ñ!9Ô!9€ ru   r   )rÛ  r   )Úbenchmarkeré   é
   )Úmemory_warmup_itersÚbenchmark_itersÚmax_benchmark_durationr~  )r-   Ú!runtime_estimations_mms_benchmarkrØ  r‚  rƒ  r„  r²   ry  ÚutilsrÛ  Ú$torch._inductor.runtime.benchmarkingrÜ  Ú	benchmarkr…  )r¿  Úbench_fnÚargs_kwargs_fnÚmm_fnr‹  rŒ  r�  r  r@  rÜ  rŽ  rÛ  s   `          @rs   rˆ  rˆ  ×  s  øø€ Ø€HØ€NÝÔ/ð Ý,¨UÑ3Ô3ˆØˆ=Ø�4Øˆà9Ð9Ð9Ð9Ð9ˆˆàˆtå9¸%Ñ@Ô@€IÝ&Ñ(Ô(€EØ—’˜YÑ'Ô'€IØÐÝ˜)¥UÑ+Ô+Ð+Ð+Ð+ØÐà(Ð(Ð(Ð(Ð(Ð(à!�>Ñ#Ô#�L€Dˆ&Ø@Ð@Ð@Ð@Ð@Ð@à	×	Ò	ØØØØØØ!ð 
ñ 
ô 
€Bð 
‡O‚O�I R€OÑ(Ô(Ð(Ø€Iru   c                  óP   — e Zd ZU ded<   ded<   ded<   ded<   dd„Zdd„Zdd„ZdS )Ú	WhyNoFuserÖ   Úname1Úname2Úreasonútuple[Any, ...]r  rˆ   rf   r‰   rŠ   r   c                ój   — |                      ¦   «         | _        |                      ¦   «         | _        d S r   )rê  rë  rì  ©rr   rˆ   r‰   s      rs   rC  zWhyNoFuse.__init__  s(   € Ø—^’^Ñ%Ô%ˆŒ
Ø—^’^Ñ%Ô%ˆŒ
ˆ
ˆ
ru   r   c                óV   — || _         || _        t                               | ¦  «         d S r   )rí  r  Ú
fusion_logÚdebug)rr   rí  r  s      rs   Ú__call__zWhyNoFuse.__call__  s*   € ØˆŒØˆŒ	Ý×Ò˜ÑÔÐÐÐru   c                óH   — d| j         › d| j        › d�| j        | j        z  z   S )Nzcannot fuse z with rñ  )rë  rì  rí  r  rq   s    rs   Ú__str__zWhyNoFuse.__str__  s2   € Ø>˜dœjÐ>Ð>°´
Ð>Ð>Ð>ØŒK˜$œ)Ñ#ñ
ð 	
ru   N©rˆ   rf   r‰   rf   rŠ   r   )rí  rÖ   r  r   rŠ   r   r"  )r€   r�   r‚   rƒ   rC  rô  rö  r…   ru   rs   rê  rê  ý  sy   € € € € € € à€J€J�JØ€J€J�JØ€K€K�KØÐÐÑð&ð &ð &ð &ðð ð ð ð

ð 
ð 
ð 
ð 
ð 
ru   rê  Úobjr   c                óÎ   — t          | t          t          f¦  «        rt          | t          ¬¦  «        } t          j        | d¬¦  «        }d|v rdt          j        |d¦  «        › �S |S )N©Úkeyé   )rù  rX  ú    )	r²   r   ÚsetÚsortedrÖ   Úpprintr÷  Útextwraprù  )rø  r¿  s     rs   r÷  r÷    sg   € Ý�#�
¥CÐ(Ñ)Ô)ð #å�S�cÐ"Ñ"Ô"ˆÝŒ^˜C¨Ð*Ñ*Ô*€FØˆv€~€~Ø6•H”O F¨GÑ4Ô4Ð6Ð6Ð6Ø€Mru   c                  ó2   — e Zd Zdd„Zdd„Zdd	„Zdd„ZeZdS )r  râ   r:   rŠ   r   c                ó0   — t          |g¦  «        | _        d S r   r»  r�  s     rs   rC  zOutputNode.__init__  s   € Ý",¨c¨UÑ"3Ô"3ˆÔÐÐru   rv   c                ó   — dS r  r…   rq   s    rs   r´   zOutputNode.is_reduction!  rð  ru   r  c                ó   — dS r½  r…   rq   s    rs   r  z'OutputNode.get_inputs_that_alias_output$  ri  ru   rÖ   c                ó   — dS )NÚOUTPUTr…   rq   s    rs   rê  zOutputNode.get_name'  s   € Øˆxru   N)râ   r:   rŠ   r   r%  r&  r"  )r€   r�   r‚   rC  r´   r  rê  rR  r…   ru   rs   r  r    se   € € € € € ð4ð 4ð 4ð 4ðð ð ð ðð ð ð ðð ð ð ð €H€H€Hru   r  r”   rÇ  rÈ  r  r6  r   c                óÔ  ‡ ‡‡‡‡— t          j        ¦   «         Š‰ j        D ]^}t          |t          ¦  «        sG‰|j                                      ¦   «         }‰‰|                              ¦   «         xx         dz  cc<   Œ_d	ˆˆˆˆ fd„Št          ˆfd„‰ j        D ¦   «         ¦  «        }|r>‰ j        |z
  ‰ _        ‰  	                    ‰ j
                             |¦  «        ¦  «         dS dS )
am  
    Prunes weakdeps intended for mutation ordering
    on an upstream fused node if after fusion there is another dependency
    on the fused upstream node, making the weakdep redundant

    In essence this enforces an ordering on fusions. As fusions occur, weakdeps will
    be incrementally removed, enabling other fusions, ensuring they are fused in order.
    r   râ   r8   rŠ   rv   c                ó  •— t          | t          ¦  «        ru‰| j                                      ¦   «         }‰‰|                              ¦   «                  dk    o!‰j                             | ‰|         ‰¦  «        }‰|         ‰k    }|p|S dS )Nr   F)r²   r;   rÚ   rì  rê  rä  Úfusable_weak_dep)râ   r¿  Úis_redundantÚis_self_depr  Úname_to_dep_countrÇ  r”   s       €€€€rs   rÀ  z+_prune_redundant_deps.<locals>.should_pruneA  sž   ø€ Ý�c�7Ñ#Ô#ð 	Ø! #¤(Ô+×<Ò<Ñ>Ô>ˆGØ,Ø" 7Ô+×4Ò4Ñ6Ô6ôàòð à”n×5Ò5ØÐ'¨Ô0°$ñô ð ð -¨WÔ5¸Ò=ˆKØÐ. ;Ð.à�5ru   c              3  ó2   •K  — | ]} ‰|¦  «        ¯|V — Œd S r   r…   rÂ  s     €rs   r¹   z(_prune_redundant_deps.<locals>.<genexpr>Q  sF   øè è € ð ð Ø°,°,¸sÑ2CÔ2CðØðð ð ð ð ð ru   NrÃ  )ri  r   r<  r²   r;   rÚ   rì  rê  r   r‰  rØ   rÄ  )r”   rÇ  r  râ   r¿  Údeps_to_pruner  rÀ  s   ```   @@rs   rÊ  rÊ  -  s?  øøøøø€ õ '2Ô&9Ñ&;Ô&;ÐàÔ&ð Kð KˆÝ˜#�wÑ'Ô'ð 	KØ! #¤(Ô+×<Ò<Ñ>Ô>ˆGØÐ0°Ô9×BÒBÑDÔDÐEÐEÔEÈÑJÐEÐEÑEøðð ð ð ð ð ð ð ð õ  ð ð ð ð ØÔ.ðñ ô ñ ô €Mð ð KØ"&Ô"9¸MÑ"IˆÔØ×Ò˜TÔ-×:Ò:¸=ÑIÔIÑJÔJÐJÐJÐJðKð Kru   c                  óH   ‡ — e Zd Zdˆ fd„Zdd	„Zdd„Zdd„Zdd„Zdd„Zˆ xZ	S )rd  rä  rã  r”   rD  rŠ   r   c                ó°  •— t          ¦   «                              |¦  «         |                      |¦  «         |                      |                     ¦   «         ¦  «         t          |t          j        ¦  «        r[|                     ¦   «         rIt          j
        |j        d         j        ¦  «        }d}|                     ¦   «         }|||ff| _        d S d S d S ©Nr   r   )ÚsuperrC  rN  r‰  Úget_read_writesr²   r0   ÚUserDefinedTritonKernelÚcan_fuse_epilogueÚmathr   Úmutable_argsÚshapeÚget_device_or_errorrÇ   )rr   rä  r”   ÚnumelrÉ   rì  Ú	__class__s         €rs   rC  z"ExternKernelSchedulerNode.__init__[  sÏ   ø€ Ý‰Œ×Ò˜Ñ#Ô#Ð#Ø×Ò˜TÑ"Ô"Ð"Ø×Ò˜T×1Ò1Ñ3Ô3Ñ4Ô4Ð4å�d�BÔ6Ñ7Ô7ð 	3¸D×<RÒ<RÑ<TÔ<Tð 	3Ý”I˜dÔ/°Ô2Ô8Ñ9Ô9ˆEØˆFØ×-Ò-Ñ/Ô/ˆFà  5¨& /Ð2ˆDŒJˆJˆJð	3ð 	3ð 	3ð 	3ru   rÖ   c                ó\   — |                       ¦   «         › dt          | j        dd ¦  «        › �S )Nz.node.kernel = rÁ  )rê  rÉ  r”   rq   s    rs   rb  z)ExternKernelSchedulerNode.debug_str_extrag  s.   € Ø—-’-‘/”/ÐbÐbµ'¸$¼)ÐEYÐ[_Ñ2`Ô2`ÐbÐbÐbru   rv   c                ó   — dS ©NTr…   rq   s    rs   rø  z#ExternKernelSchedulerNode.is_externj  rœ  ru   c                óp   — | j         €J ‚t          | j         d¦  «        o| j                              ¦   «         S )Nr  )r”   r
  r  rq   s    rs   r  z*ExternKernelSchedulerNode.has_side_effectsm  s6   € ØŒyÐ$Ð$Ð$Ý�t”yÐ"4Ñ5Ô5ÐV¸$¼)×:TÒ:TÑ:VÔ:VÐVru   úSequence[Sequence[sympy.Expr]]c                óÖ   — t          | j        t          j        ¦  «        rG| j                             ¦   «         r.t          j        | j        j        d         j        ¦  «        }|gg fS g g fS rì   )	r²   r”   r0   r  r  r  r   r  r  )rr   r  s     rs   rc  z$ExternKernelSchedulerNode.get_rangesq  sb   € å�t”y¥"Ô"<Ñ=Ô=ð	!à”	×+Ò+Ñ-Ô-ð	!õ ”I˜dœiÔ4°QÔ7Ô=Ñ>Ô>ˆEØ�G˜R�=Ð Ø�Bˆxˆru   Úwrapperr   c                óx   — t          | j        t          j        ¦  «        sJ ‚| j                             |¦  «        S r   )r²   r”   r0   rÓ  r  )rr   r#  s     rs   r  z!ExternKernelSchedulerNode.codegenz  s2   € Ý˜$œ)¥R¤_Ñ5Ô5Ð5Ð5Ð5ØŒy× Ò  Ñ)Ô)Ð)ru   ©rä  rã  r”   rD  rŠ   r   r"  r%  ©rŠ   r!  ©r#  r   rŠ   r   )
r€   r�   r‚   rC  rb  rø  r  rc  r  Ú__classcell__©r  s   @rs   rd  rd  Z  s©   ø€ € € € € ð
3ð 
3ð 
3ð 
3ð 
3ð 
3ðcð cð cð cðð ð ð ðWð Wð Wð Wðð ð ð ð*ð *ð *ð *ð *ð *ð *ð *ru   rd  c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )	r  rä  rã  r”   rD  rŠ   r   c                óÂ   •— t          ¦   «                              |¦  «         |                      |¦  «         |                      |                     ¦   «         ¦  «         d S r   )r  rC  rN  r‰  r  ©rr   rä  r”   r  s      €rs   rC  zNopKernelSchedulerNode.__init__€  sU   ø€ Ý‰Œ×Ò˜Ñ#Ô#Ð#Ø×Ò˜TÑ"Ô"Ð"Ø×Ò˜T×1Ò1Ñ3Ô3Ñ4Ô4Ð4Ð4Ð4ru   r%  )r€   r�   r‚   rC  r(  r)  s   @rs   r  r    s=   ø€ € € € € ð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ru   r  c                  ó†  ‡ — e Zd ZU dZded<   ded<   dMˆ fd„Z	 	 dNdOd„Z	 	 dNdPd„ZdQd„ZdRd„Z	dSd„Z
dTd„ZdUd„ZdVd!„ZdWd$„ZdUd%„ZdXd'„ZdUd(„ZdYd,„ZdUd-„ZdZd1„Zd[d3„Zd\d5„Zd]d6„Zd]d7„Zd]d8„Zd]d9„Zd^d;„Zd_d=„Zd`d?„Zdad@„Z	 dbdcdD„Ze dddE„¦   «         Z!e dddF„¦   «         Z"dedI„Z#e dfdK„¦   «         Z$e d]ˆ fdL„¦   «         Z%ˆ xZ&S )gr³   zu
    A SchedulerNode is a node for scheduling that encapsulates either
    a ComputedBuffer or a TemplateBuffer.
    z tuple[Sequence[sympy.Expr], ...]Ú_sizesrE   r#  rä  rã  r”   ú%ir.ComputedBuffer | ir.TemplateBufferrŠ   r   c                óª   •— t          ¦   «                              |¦  «         d | _        |                      |¦  «         |                      ¦   «          d S r   )r  rC  Ú_loop_mutation_listenerrN  Ú_compute_attrsr,  s      €rs   rC  zSchedulerNode.__init__�  sQ   ø€ õ
 	‰Œ×Ò˜Ñ#Ô#Ð#ØOSˆÔ$Ø×Ò˜TÑ"Ô"Ð"Ø×ÒÑÔÐÐÐru   NÚextra_indexing_constraintsú'tuple[dict[Any, Any], list[Any]] | NoneÚrecompute_sizes_body_funcúCallable[_P, _T] | Nonec                óš  — t          | j        t          j        t          j        f¦  «        sJ ‚| j                             ||¬¦  «        \  | _        }|| _        | j                             ¦   «         }| j	         
                    |¦  «        j        }| || j        ¦  «        f| _        t          j         pt          |j        ¦  «         }t          | j        t          j        ¦  «        r0|                      | j                             |¬¦  «        ¦  «         d S |                      t'          j        | j        g| j        ¢R d|iŽ¦  «         d S )N©r3  r5  )Ú	normalizer9  )r²   r”   r0   r   ÚTemplateBufferÚsimplify_and_reorderr.  r#  r  rä  Úget_backendÚgroup_fnrÇ   r-   Úloop_ordering_after_fusionr[   r«   r‰  Úextract_read_writesr/   )rr   r3  r5  rº  rì  r=  Úshould_normalizes          rs   r2  zSchedulerNode._compute_attrs™  so  € õ
 ˜$œ)¥bÔ&7½Ô9JÐ%KÑLÔLÐLÐLÐLØ œI×:Ò:Ø'AØ&?ð ;ñ 
ô 
ÑˆŒ�Tð ˆŒ
à”×.Ò.Ñ0Ô0ˆØ”>×-Ò-¨fÑ5Ô5Ô>ˆØ˜h˜h t¤{Ñ3Ô3Ð4ˆŒ
õ  &Ô@Ð@ð 
ÍØŒKñI
ô I
ð E
Ðõ �d”i¥Ô!2Ñ3Ô3ð 		Ø× Ò Ø”	×-Ò-Ð8HÐ-ÑIÔIñô ð ð ð ð × Ò ÝÔ0Ø”JðØ!%¤ðð ð Ø8Hðð ñô ð ð ð ru   úCallable[..., Any] | Nonec                ó  — t          d„ | j        j        D ¦   «         ¦  «        }|                      ||¬¦  «         |rG|                      | j                             |¦  «                             | j        ¦  «        ¦  «         d S d S )Nc              3  óR   K  — | ]"}t          |t          t          f¦  «        ¯|V — Œ#d S r   ©r²   r;   r:   r‡  s     rs   r¹   z8SchedulerNode.recompute_size_and_body.<locals>.<genexpr>¿  óJ   è è € ð 0
ð 0
ØµZÀÅgÍwÐEWÑ5XÔ5Xð0
Øð0
ð 0
ð 0
ð 0
ð 0
ð 0
ru   r8  )r   rØ   rÙ   r2  r‰  rŽ  rŠ  r2  )rr   r3  r5  Ú	fake_depss       rs   Úrecompute_size_and_bodyz%SchedulerNode.recompute_size_and_bodyº  sµ   € õ
 &0ð 0
ð 0
ØÔ+Ô1ð0
ñ 0
ô 0
ñ &
ô &
ˆ	ð 	×ÒØ'AØ&?ð 	ñ 	
ô 	
ð 	
ð ð 	Ø× Ò ØÔ ×*Ò*¨9Ñ5Ô5×<Ò<¸TÔ=RÑSÔSñô ð ð ð ð	ð 	ru   r9  rv   Úneed_clear_tiling_cachec                ó0  — t          d„ | j        j        D ¦   «         ¦  «        }|                      t	          j        | j        g| j        ¢R d|iŽ                     |¦  «         	                    | j
        ¦  «        ¦  «         |                      |¦  «         d S )Nc              3  óR   K  — | ]"}t          |t          t          f¦  «        ¯|V — Œ#d S r   rD  r‡  s     rs   r¹   z5SchedulerNode.refresh_dependencies.<locals>.<genexpr>Ð  rE  ru   r9  )r   rØ   rÙ   r‰  r/   r?  r#  r.  rŽ  rŠ  r2  Ú clear_loop_body_dependent_caches)rr   r9  rH  rF  s       rs   Úrefresh_dependenciesz"SchedulerNode.refresh_dependenciesË  s¼   € õ
 &0ð 0
ð 0
ØÔ+Ô1ð0
ñ 0
ô 0
ñ &
ô &
ˆ	ð 	×ÒÝÔ,Ø”
ðØ!œ[ðð ð Ø4=ðð ÷ ŠY�yÑ!Ô!ßŠV�DÔ)Ñ*Ô*ñ	
ô 	
ð 	
ð 	×-Ò-Ð.EÑFÔFÐFÐFÐFru   c                ó¨   — |                       ¦   «          | j                             | ¦  «         |r!ddlm} |j                             ¦   «          d S d S )Nr   r‘  )r–  Úpointwise_read_writesr™  r‰  r’  Úcandidate_tilingsÚcache_clear)rr   rH  r’  s      rs   rK  z.SchedulerNode.clear_loop_body_dependent_cachesà  sl   € Ø×/Ò/Ñ1Ô1Ð1ØÔ"×.Ò.¨tÑ4Ô4Ð4à"ð 	;Ø4Ð4Ð4Ð4Ð4Ð4ð Ô,×8Ò8Ñ:Ô:Ð:Ð:Ð:ð	;ð 	;ru   rî  c                óB   — | j         | j        | j        | j        | j        fS )z¶Snapshot mutable state modified by loop transformations
        (apply_new_loop_order, apply_loop_reindexing). Must be kept
        in sync with those methods and restore_loop_state.)r#  r.  rÇ   rØ   r<  rq   s    rs   Úsnapshot_loop_statez!SchedulerNode.snapshot_loop_stateí  s)   € ð
 ŒJØŒKØŒJØÔØÔ#ð
ð 	
ru   Ústatec                ót   — |\  | _         | _        | _        | _        | _        |                      d¬¦  «         dS )z'Restore state from snapshot_loop_state.T)rH  N)r#  r.  rÇ   rØ   r<  rK  )rr   rS  s     rs   Úrestore_loop_statez SchedulerNode.restore_loop_stateù  sD   € ð ñ	
ØŒJØŒKØŒJØÔØÔ#à×-Ò-ÀdÐ-ÑKÔKÐKÐKÐKru   c                óB   — | j         �|                       | ¦  «         d S d S r   )r1  rq   s    rs   Ú_before_loop_state_mutationz)SchedulerNode._before_loop_state_mutation	  s-   € ØÔ'Ð3Ø×(Ò(¨Ñ.Ô.Ð.Ð.Ð.ð 4Ð3ru   Ú	new_orderúSequence[int]c                ó¼   — |                       ¦   «          | j                             |¦  «        | _        | j        j        | _        |                      dd¬¦  «         d S ©NFT©r9  rH  )rW  r#  Úreorder_iter_loopsÚsizesr.  rL  )rr   rX  s     rs   Úapply_new_loop_orderz"SchedulerNode.apply_new_loop_order	  s]   € Ø×(Ò(Ñ*Ô*Ð*Ø”Z×2Ò2Øñ
ô 
ˆŒ
ð ”jÔ&ˆŒà×!Ò!¨EÈ4Ð!ÑPÔPÐPÐPÐPru   Únew_iter_sizesúSequence[sympy.Expr]c                ó´  — t          | j        t          j        t          j        f¦  «        sJ ‚|                      ¦   «          | j                             |¦  «        | _        | j        j        | _	        | j         
                    ¦   «         }| j                             |¦  «        j        }| || j	        ¦  «        f| _        |                      dd¬¦  «         d S r[  )r²   r”   r0   r   r:  rW  r#  Úreindex_iter_loopsr^  r.  r  rä  r<  r=  rÇ   rL  )rr   r`  rì  r=  s       rs   Úapply_loop_reindexingz#SchedulerNode.apply_loop_reindexing	  s¼   € Ý˜$œ)¥bÔ&7½Ô9JÐ%KÑLÔLÐLÐLÐLà×(Ò(Ñ*Ô*Ð*Ø”Z×2Ò2°>ÑBÔBˆŒ
Ø”jÔ&ˆŒà”×.Ò.Ñ0Ô0ˆØ”>×-Ò-¨fÑ5Ô5Ô>ˆØ˜h˜h t¤{Ñ3Ô3Ð4ˆŒ
à×!Ò!¨EÈ4Ð!ÑPÔPÐPÐPÐPru   c                óÈ  — | j                              ¦   «         }t          | j         j        ¦  «        |z
  }t	          t          |¦  «        ¦  «        }t	          t          |||z   ¦  «        ¦  «        }|                      ||z   ¦  «         t          | j        d         ¦  «        dk    sJ ‚| j        d         | j        d         d         | j        d         d         ff| _        d S )Nr   rÎ   r   )r#  Úget_original_num_rdimsrÏ   rË  rÐ   Úranger_  rÇ   )rr   Ú	num_rdimsÚ
num_pwdimsÚpwdimsÚrdimss        rs   Úswap_pw_red_dimensionz#SchedulerNode.swap_pw_red_dimension	  sÅ   € Ø”J×5Ò5Ñ7Ô7ˆ	Ý˜œÔ-Ñ.Ô.°Ñ:ˆ
Ý•u˜ZÑ(Ô(Ñ)Ô)ˆÝ•e˜J¨
°YÑ(>Ñ?Ô?Ñ@Ô@ˆà×!Ò! %¨&¡.Ñ1Ô1Ð1Ý�4”:˜a”=Ñ!Ô! QÒ&Ð&Ð&Ð&Ø”Z ”] T¤Z°¤]°1Ô%5°t´zÀ!´}ÀQÔ7GÐ$HÐHˆŒ
ˆ
ˆ
ru   rf   c                óB   — | j                              ¦   «         | _         | S r   )r#  Úextract_pw_from_reductionrq   s    rs   rn  z'SchedulerNode.extract_pw_from_reduction(	  s   € Ø”Z×9Ò9Ñ;Ô;ˆŒ
Øˆru   c                ó  — t                                | ¦  «        sd S t          | j        t          j        ¦  «        sJ ‚| j                             ¦   «         5  |                      ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S r   )r¯   r½   r²   r”   r0   r   Úwith_original_inner_fnr2  rq   s    rs   Úcancel_reduction_splitz$SchedulerNode.cancel_reduction_split,	  sÂ   € Ý ×3Ò3°DÑ9Ô9ð 	ØˆFÝ˜$œ)¥RÔ%6Ñ7Ô7Ð7Ð7Ð7ØŒY×-Ò-Ñ/Ô/ð 	"ð 	"Ø×ÒÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s   ÁA9Á9A=Â A=Ú	dimensionr‘   Ú	new_rangec                óŽ  — t          | j        t          j        t          j        f¦  «        sJ ‚| j                             ||¦  «        | _        | j        j        | _        | j         	                    ¦   «         }| j
                             |¦  «        j        }| || j        ¦  «        f| _        |                      dd¬¦  «         d S )NTr\  )r²   r”   r0   r   r:  r#  Ú#expand_dimension_for_pointwise_noder^  r.  r  rä  r<  r=  rÇ   rL  )rr   rr  rs  rì  r=  s        rs   ru  z1SchedulerNode.expand_dimension_for_pointwise_node3	  s·   € õ ˜$œ)¥bÔ&7½Ô9JÐ%KÑLÔLÐLÐLÐLà”Z×CÒCØ�yñ
ô 
ˆŒ
ð ”jÔ&ˆŒà”×.Ò.Ñ0Ô0ˆØ”>×-Ò-¨fÑ5Ô5Ô>ˆØ˜h˜h t¤{Ñ3Ô3Ð4ˆŒ
ð 	×!Ò!¨DÈ$Ð!ÑOÔOÐOÐOÐOru   c                ó’   — | j                              ¦   «         | _         | j         j        | _        |                      dd¬¦  «         d S )NTFr\  )r#  Úmerge_loopsr^  r.  rL  rq   s    rs   rw  zSchedulerNode.merge_loopsD	  sD   € Ø”Z×+Ò+Ñ-Ô-ˆŒ
Ø”jÔ&ˆŒð 	×!Ò!¨DÈ%Ð!ÑPÔPÐPÐPÐPru   r|  r9   r}  c                ó®  — d }| j         d         }t          |¦  «        |j        cxk    r|j        k    rn n|                     |¦  «        }|rZt          xj        dz  c_        t                               d|                      ¦   «         |¦  «         |  	                    |¦  «         dS t                               d|                      ¦   «         ¦  «         dS )Nr   r   z"Reorder loops for %s with order %sTzEDon't reordering %s because we can not decide the suitable loop orderF)
r.  rÏ   Únum_varsÚdecide_loop_order_to_matchr1   Únum_loop_reorderingÚloop_ordering_logró  rê  r_  )rr   r|  r}  rX  Ú
self_sizess        rs   r€  z'SchedulerNode.reorder_loops_by_dep_pairP	  sà   € ð ˆ	Ø”[ ”^ˆ
Ýˆz‰?Œ?˜hÔ/ÐEÐEÒEÐE°9Ô3EÒEÐEÐEÐEÐEØ ×;Ò;¸IÑFÔFˆIàð 	åÐ'Ô'¨1Ñ,Ð'Ô'Ý×#Ò#Ø4°d·m²m±o´oÀyñô ð ð ×%Ò% iÑ0Ô0Ð0Ø�4å×#Ò#ØWØ—’‘”ñô ð ð �5ru   rÖ   c                ó0  — |                       ¦   «         }|› d| j        d         › �|› d| j        d         › �|› d| j        › �g}| j                             ¦   «         D ]ƒ}t          |t          ¦  «        sl|j        }t          j	         
                    |¦  «        }t          |t          j        ¦  «        s,|                     |› dt          |j        ¦  «        › �¦  «         Œ„t          | j        t"          ¦  «        rX|                     d|› d�¦  «         |                     t%          j        | j                             ¦   «         d	¦  «        ¦  «         | j        €J ‚|                     |                      ¦   «         ¦  «         d
                     |¦  «        S )Nz.group.device = r   z.group.iteration = r   z	.sizes = z
_layout = zclass z_loop_body:rý  rX  )rê  rÇ   r.  rØ   rˆ  r²   r;   rÚ   ra   rÂ   r[  r0   r^  rç   r÷  rõ  r#  rE   r  rù  rü  r”   rµ  rk  Újoin)rr   rÚ   Úlinesrâ   rä  rÕ   s         rs   rb  zSchedulerNode.debug_str_extrag	  s†  € Ø�}Š}‰ŒˆàÐ4Ð4 T¤Z°¤]Ð4Ð4ØÐ7Ð7¨¬
°1¬Ð7Ð7ØÐ+Ð+˜dœkÐ+Ð+ð
ˆð
 Ô#×4Ò4Ñ6Ô6ð 	Oð 	OˆCÝ˜c¥7Ñ+Ô+ð OØœ8�Ý”g×(Ò(¨Ñ2Ô2�Ý! #¥rÔ'9Ñ:Ô:ð OØ—L’L HÐ!MÐ!M½ÀÄ
Ñ8KÔ8KÐ!MÐ!MÑNÔNÐNøÝ�d”j¥(Ñ+Ô+ð 	JØ�LŠLÐ3 $Ð3Ð3Ð3Ñ4Ô4Ð4Ø�LŠL�œ¨¬×)=Ò)=Ñ)?Ô)?ÀÑHÔHÑIÔIÐIàŒyÐ$Ð$Ð$Ø�Š�T×/Ò/Ñ1Ô1Ñ2Ô2Ð2à�yŠy˜ÑÔÐru   r!  c                ó   — | j         S r   )r.  rq   s    rs   rc  zSchedulerNode.get_ranges}	  ó
   € ØŒ{Ðru   c                ó  — t          | j        t          j        t          j        f¦  «        sJ dt          | j        ¦  «        ›�¦   «         ‚t          | j                             ¦   «         ¦  «        o| j        d u p| j        j	         S ©Nútype(self.node)=)
r²   r”   r0   r   r:  r«   rv   r  r#  Úhas_partial_accumulaterq   s    rs   r´   zSchedulerNode.is_reduction€	  s‚   € Ý˜$œ)¥bÔ&7½Ô9JÐ%KÑLÔLð 	
ð 	
Ø!�t�D”I‰ŒÐ!Ð!ñ	
ô 	
ÐLõ �D”I×0Ò0Ñ2Ô2Ñ3Ô3ð 
ØŒJ˜$ÐÐG d¤jÔ&GÐ"Gð	
ru   c                ó¸   — t          | j        t          j        ¦  «        sJ dt	          | j        ¦  «        ›�¦   «         ‚| j                             ¦   «         dk    S )Nr…  Údot)r²   r”   r0   r   r«   r  rq   s    rs   rò  zSchedulerNode.is_native_matmul�	  sO   € Ý˜$œ)¥RÔ%6Ñ7Ô7ÐNÐNÐ9N½DÀÄ¹O¼OÐ9NÐ9NÑNÔNÐ7ØŒy×+Ò+Ñ-Ô-°Ò6Ð6ru   c                ó  — t          | j        t          j        t          j        f¦  «        sJ dt          | j        ¦  «        ›�¦   «         ‚t          | j        t          j        ¦  «        o#t          | j        j        t          j        ¦  «        S r„  )r²   r”   r0   r   r:  r«   rú   Ú	SplitScanrq   s    rs   rô  zSchedulerNode.is_split_scan‘	  s{   € Ý˜$œ)¥bÔ&7½Ô9JÐ%KÑLÔLð 	
ð 	
Ø!�t�D”I‰ŒÐ!Ð!ñ	
ô 	
ÐLõ ˜$œ)¥RÔ%6Ñ7Ô7ð 
½JØŒIŒN�BœLñ=
ô =
ð 	
ru   c                ó@   — t          | j        t          j        ¦  «        S r   ©r²   r”   r0   r:  rq   s    rs   rö  zSchedulerNode.is_template™	  s   € Ý˜$œ)¥RÔ%6Ñ7Ô7Ð7ru   r™  c                óR   — t          | j        t          j        ¦  «        r| j        nd S r   rŒ  rq   s    rs   r›  zSchedulerNode.get_template_nodeœ	  s"   € Ý& t¤yµ"Ô2CÑDÔDÐNˆtŒyˆyÈ$ÐNru   Ú
index_varsc                ó€   — |                       ¦   «          |                      ¦   «          |                      |¦  «         d S r   )r!  r§  r  )rr   rŽ  s     rs   ÚrunzSchedulerNode.runŸ	  s9   € Ø×"Ò"Ñ$Ô$Ð$Ø�Š‰ŒˆØ�Š�ZÑ Ô Ð Ð Ð ru   údict[sympy.Expr, sympy.Expr]c                óR  — | j         }t          t          t          |¦  «        ¦  «        t          t          t          |¦  «        ¦  «        k    sJ ‚t	          t          t          j                             |¦  «        t          j                             |¦  «        ¦  «        ¦  «        }|S r   )	r.  rÿ   ÚmaprÏ   ÚdictÚziprª  r«  Úfrom_iterable)rr   rŽ  r^  rÜ   s       rs   Úranges_from_index_varsz$SchedulerNode.ranges_from_index_vars¤	  sˆ   € ð ”ˆÝ•3•s˜E‘?”?Ñ#Ô#¥s­3­s°JÑ+?Ô+?Ñ'@Ô'@Ò@Ð@Ð@Ð@ÝÝÝ”×-Ò-¨jÑ9Ô9Ý”×-Ò-¨eÑ4Ô4ñô ñ
ô 
ˆ
ð Ðru   c                óª  — |                       |¦  «        }	 t          j        t          t          j        ¦   «         |¦  «        ¦  «        5  t          j                             | ¦  «        5   | j        |Ž  ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS # t          $ r" t           
                    d| j        ¦  «         ‚ w xY w)aê  
        Generate code for this node using the provided index variables.

        This method sets up the appropriate context for code generation, including
        simplifying indexing expressions based on the variable ranges, and then
        calls the node's body function with the index variables.

        Args:
            index_vars: A sequence of sequences of sympy expressions representing
                        the index variables for each dimension of the computation.
        NzError in codegen for %s)r—  ra   Úset_ops_handlerrM   Úget_ops_handlerr  Úset_current_noder#  rc  rd  Úfatalr”   )rr   rŽ  rÜ   s      rs   r  zSchedulerNode.codegen±	  sX  € ð ×0Ò0°Ñ<Ô<ˆ
ð	åÔ!Õ"2µ1Ô3DÑ3FÔ3FÈ
Ñ"SÔ"SÑTÔTð(ð (å”×)Ò)¨$Ñ/Ô/ð(ð (ð �”
˜JÐ'Ð'ð	(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (øõ
 ð 	ð 	ð 	Ý�IŠIÐ/°´Ñ;Ô;Ð;Øð	øøøsS   —3B& Á
 BÁ*BÁ5BÂB	ÂBÂB	Â	BÂB& ÂBÂB& Â BÂ!B& Â&,CTÚ	pointwiser:  c                ó¼   — |r| j         nt          | j         ¦  «        \  }}t          j        | j        |t
          j        j        gt          |¦  «        z  g¬¦  «        S )z\
        Get the memory dependencies in either the pointwise or the reduction axes.
        )Úhidden_args)	r.  rÑ   r/   r?  r#  r	  ÚSÚZerorÏ   )rr   r�  Ú
keep_sizesÚignore_sizess       rs   Ú"pointwise_or_reduction_read_writesz0SchedulerNode.pointwise_or_reduction_read_writesÈ	  s\   € ð 3<Ð#V 4¤; ;ÅÈ$Ì+ÑAVÔAVÑ ˆ
�LÝÔ/ØŒJ˜
µ%´'´,°Å#ÀlÑBSÔBSÑ1SÐ0Tð
ñ 
ô 
ð 	
ru   c                ó.   — |                       d¬¦  «        S )zH
        Get the memory dependencies in the non-reduction axes.
        T©r�  ©r¤  rq   s    rs   rN  z#SchedulerNode.pointwise_read_writesÓ	  s   € ð
 ×6Ò6ÀÐ6ÑFÔFÐFru   c                ó.   — |                       d¬¦  «        S )zD
        Get the memory dependencies in the reduction axes.
        Fr¦  r§  rq   s    rs   Úreduction_read_writesz#SchedulerNode.reduction_read_writesÚ	  s   € ð
 ×6Ò6ÀÐ6ÑGÔGÐGru   rû  rü  c                óî  — |                       ¦   «         rdS t          d„ |                      ¦   «         D ¦   «         ¦  «        rdS t          | j        j        ¦  «        dk    r”t          |t          j        ¦  «        rzt          t          | j        j        ¦  «        ¦  «        }t          |t          j        ¦  «        sJ dt          |¦  «        ›�¦   «         ‚|j        |j        k    o|j        |j        k    S dS )NFc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )rö  rÕ  s     rs   r¹   z,SchedulerNode.can_inplace.<locals>.<genexpr>ä	  s,   è è € Ð?Ð? Sˆs�ŠÑ Ô Ð?Ð?Ð?Ð?Ð?Ð?ru   r   ztype(write_dep)=)rö  r  rL  rÏ   rØ   ra  r²   r/   r9   r©  Úiterr«   rÛ   rß   )rr   rû  Ú	write_deps      rs   rÿ  zSchedulerNode.can_inplaceá	  sê   € Ø×ÒÑÔð 	Ø�5ÝÐ?Ð?¨D×,<Ò,<Ñ,>Ô,>Ð?Ñ?Ô?Ñ?Ô?ð 	Ø�5ÝˆtÔÔ&Ñ'Ô'¨1Ò,Ð,µØ•lÔ,ñ2
ô 2
Ð,õ �T $Ô"2Ô"9Ñ:Ô:Ñ;Ô;ˆIÝ˜i­Ô)?Ñ@Ô@ÐWÐWÐBWÅTÈ)Á_Ä_ÐBWÐBWÑWÔWÐ@Ø”> Y¤_Ò4ÐX¸¼È)Ì.Ò9XÐXØˆuru   r™   c                óà  — t          ¦   «         }t          | j        t          ¦  «        rÅ| j                             ¦   «         D ]«}|j        dk    rž|j        dk    r“d|j        v r|j        d         dk    s)t          |j	        ¦  «        dk    ra|j	        d         dk    rP| 
                    d|j        v r|j        d         n&t          |j	        ¦  «        dk    r|j	        d	         nd
¦  «         Œ¬|S )NÚcall_methodÚstoreÚmodeÚ
atomic_addrÝ  rü  rÚ   rÎ   r   rh  )r   r²   r#  rE   r»   rë  r/  r@  rÏ   r  r³  )rr   Úbuffers_store_as_atomic_addr”   s      rs   Ú_get_atomic_add_buffersz%SchedulerNode._get_atomic_add_buffersî	  sö   € å7A±|´|Ð#Ý�d”j¥(Ñ+Ô+ð 	Øœ
×,Ò,Ñ.Ô.ð ð �à”G˜}Ò,Ð,Øœ wÒ.Ð.à 4¤;Ð.Ð.°4´;¸vÔ3FÈ,Ò3VÐ3VÝ ¤	™NœN¨aÒ/Ð/°D´I¸a´LÀLÒ4PÐ4Pð 0×3Ò3à! T¤[Ð0Ð0ð œ FÔ+Ð+å.1°$´)©n¬nÀÒ.AÐ.A˜dœi¨œl˜lÀrñô ð øð
 +Ð*ru   c                óŠ   •— | j         �| j                              d¦  «        rdS t          ¦   «                              ¦   «         S )NÚdevice_assert_asyncT)r#  Úhas_opr  r  ©rr   r  s    €rs   r  zSchedulerNode.has_side_effects
  s>   ø€ ð Œ:Ð! d¤j×&7Ò&7Ð8MÑ&NÔ&NÐ!Ø�4Ý‰wŒw×'Ò'Ñ)Ô)Ð)ru   )rä  rã  r”   r/  rŠ   r   ©NN)r3  r4  r5  r6  rŠ   r   )r3  r4  r5  rA  rŠ   r   )r9  rv   rH  rv   rŠ   r   )rH  rv   rŠ   r   )rŠ   rî  )rS  rî  rŠ   r   r$  )rX  rY  rŠ   r   )r`  ra  rŠ   r   ©rŠ   rf   )rr  r‘   rs  r‘   rŠ   r   r°  r"  r&  r%  rº  )rŽ  ra  rŠ   r   )rŽ  r!  rŠ   r‘  )rŽ  r!  rŠ   r   r·  )r�  rv   rŠ   r:  )rŠ   r:  r¶  r³  )'r€   r�   r‚   r•   rƒ   rC  r2  rG  rL  rK  rR  rU  rW  r_  rd  rl  rn  rq  ru  rw  r€  rb  rc  r´   rò  rô  rö  r›  r�  r—  r  r¤  rO   rN  r©  rÿ  r´  r  r(  r)  s   @rs   r³   r³   †  sW  ø€ € € € € € ðð ð
 -Ð,Ð,Ñ,Ø€O€O�Oðð ð ð ð ð ð OSØ=Aðð ð ð ð ðF OSØ?Cðð ð ð ð ð"Gð Gð Gð Gð*;ð ;ð ;ð ;ð

ð 

ð 

ð 

ð	Lð 	Lð 	Lð 	Lð/ð /ð /ð /ðQð Qð Qð QðQð Qð Qð QðIð Ið Ið Iðð ð ð ð"ð "ð "ð "ðPð Pð Pð Pð"
Qð 
Qð 
Qð 
Qðð ð ð ð. ð  ð  ð  ð,ð ð ð ð
ð 
ð 
ð 
ð7ð 7ð 7ð 7ð
ð 
ð 
ð 
ð8ð 8ð 8ð 8ðOð Oð Oð Oð!ð !ð !ð !ð
ð ð ð ðð ð ð ð0 !%ð	
ð 	
ð 	
ð 	
ð 	
ð ðGð Gð Gñ „]ðGð ðHð Hð Hñ „]ðHðð ð ð ð ð+ð +ð +ñ „]ð+ð& ð*ð *ð *ð *ð *ñ „]ð*ð *ð *ð *ð *ru   r³   Úgroup_snodeú)FusedSchedulerNode | GroupedSchedulerNodec                ó  ‡ — ‰ j         }‰                      t          j                             d„ |D ¦   «         ¦  «        ¦  «         t          ˆ fd„t          j        d„ |D ¦   «         Ž D ¦   «         ¦  «        ‰ j        j        z
  ‰ _	        d S )Nc                ó   — g | ]	}|j         ‘Œ
S r…   ©rØ   ©r·   r“  s     rs   r   z3refresh_group_node_dependencies.<locals>.<listcomp>
  s   € Ð+JÐ+JÐ+J¸a¨A¬MÐ+JÐ+JÐ+Jru   c              3  óR   •K  — | ]!}|j         ‰                     ¦   «         v¯|V — Œ"d S r   ©rÚ   rÖ  )r·   râ   r»  s     €rs   r¹   z2refresh_group_node_dependencies.<locals>.<genexpr>
  sH   øè è € ð 
ð 
àØŒx˜{×;Ò;Ñ=Ô=Ð=Ð=ð à=Ð=Ð=Ð=ð
ð 
ru   c                ó   — g | ]	}|j         ‘Œ
S r…   )r<  rÀ  s     rs   r   z3refresh_group_node_dependencies.<locals>.<listcomp>
  s   € Ð)OÐ)OÐ)OÀ1¨!Ô*>Ð)OÐ)OÐ)Oru   )
rÞ   r‰  r/   Ú
ReadWritesÚ
merge_listr   ÚunionrØ   ra  r<  )r»  rÞ   s   ` rs   Úrefresh_group_node_dependenciesrÇ  

  s²   ø€ ð Ô€FØ×ÒÝÔ×*Ò*Ð+JÐ+JÀ6Ð+JÑ+JÔ+JÑKÔKñô ð õ
 	ð 
ð 
ð 
ð 
å!Ô'Ð)OÐ)OÈÐ)OÑ)OÔ)OÐPð
ñ 
ô 
ñ 	
ô 	
ð
 Ô
!Ô
(ñ	)ð Ô"Ð"Ð"ru   rä  rã  rÞ   r¢  c                ó"  — t          | t          t          f¦  «        sJ ‚|| _        || _        d | _        t          j        d„ |D ¦   «         Ž | _        t          | ¦  «         t          d„ | j        D ¦   «         ¦  «        | _        t          d„ | j        D ¦   «         ¦  «        | _        t          d„ | j        D ¦   «         ¦  «        | _        t          d„ | j        D ¦   «         ¦  «        | _        d„ |                      ¦   «         D ¦   «         | _        d S )Nc                ó*   — g | ]}|j         ®	|j         ‘ŒS r   ©r  rÀ  s     rs   r   z#init_group_node.<locals>.<listcomp>&
  s!   € Ð	AÐ	AÐ	A˜!¨¬Ð)@ˆ!Œ+Ð)@Ð)@Ð)@ru   c              3  ó$   K  — | ]}|j         V — Œd S r   ©r.  rÀ  s     rs   r¹   z"init_group_node.<locals>.<genexpr>+
  ó$   è è € ÐHÐH° ¤ÐHÐHÐHÐHÐHÐHru   c              3  ó$   K  — | ]}|j         V — Œd S r   )r/  rÀ  s     rs   r¹   z"init_group_node.<locals>.<genexpr>,
  rÍ  ru   c              3  ó$   K  — | ]}|j         V — Œd S r   )r,  rÀ  s     rs   r¹   z"init_group_node.<locals>.<genexpr>-
  ó6   è è € ð )ð )Ø!"ˆÔð)ð )ð )ð )ð )ð )ru   c              3  ó$   K  — | ]}|j         V — Œd S r   )r-  rÀ  s     rs   r¹   z"init_group_node.<locals>.<genexpr>0
  rÐ  ru   c                ó8   — i | ]}|                      ¦   «         |“ŒS r…   rI  rJ  s     rs   rK  z#init_group_node.<locals>.<dictcomp>3
  s/   € ð #ð #ð #Ø #ˆ�Š‰Œ˜ð#ð #ð #ru   )r²   rÝ   ÚGroupedSchedulerNoderÞ   rä  r”   r   rÆ  r  rÇ  ra  r.  r`  r/  r,  r-  rL  r7  )r»  rä  rÞ   s      rs   Úinit_group_noderÔ  
  sE  € õ
 �kÕ$6Õ8LÐ#MÑNÔNÐNÐNÐNØ€KÔØ%€KÔØ€KÔÝ&Ô,Ø	AÐ	A˜vÐ	AÑ	AÔ	Að€KÔõ $ KÑ0Ô0Ð0åÐHÐH°[Ô5GÐHÑHÔHÑHÔH€KÔÝÐHÐH°[Ô5GÐHÑHÔHÑHÔH€KÔÝ%(ð )ð )Ø&1Ô&8ð)ñ )ô )ñ &ô &€KÔ"õ &)ð )ð )Ø&1Ô&8ð)ñ )ô )ñ &ô &€KÔ"ð#ð #Ø'2×'>Ò'>Ñ'@Ô'@ð#ñ #ô #€KÔÐÐru   c                  óè  ‡ — e Zd ZU dZded<   ed;d„¦   «         Zd<d	„Zd=d„Ze	d>d„¦   «         Z
d?d„Zd@ˆ fd„Ze	dAd„¦   «         ZdAd„Ze	dBd„¦   «         ZdCd„ZdAd„ZdAd„ZdDˆ fd"„Ze	dBd#„¦   «         Ze	dBd$„¦   «         ZdEd&„ZdAd'„Ze	dFd(„¦   «         Ze	dFd)„¦   «         Ze	dFd*„¦   «         Ze	dFd+„¦   «         Ze	dGd-„¦   «         ZdHd/„Ze	dFd0„¦   «         ZdId2„ZdJd5„Z dKd8„Z!dAd9„Z"e	dFˆ fd:„¦   «         Z#ˆ xZ$S )LrÝ   zæ
    This is a "fake" scheduler node that represents a group of scheduler nodes
    that are meant to be fused together. The way it does this is by maintaining
    its unmet dependencies as the union of its constituent nodes.
    r¢  rÞ   rˆ   rf   r‰   rŠ   c                óÞ  — |j         |j         u sJ ‚t          |t          t          f¦  «        sJ ‚|                     ¦   «         r7t          |t
          ¦  «        r"t          |j        t          j        ¦  «        sJ ‚nt          |t          t          f¦  «        sJ ‚t          t          j        |                     ¦   «         |                     ¦   «         ¦  «        ¦  «        } | |j         |¦  «        S r   )rä  r²   r³   rÝ   rö  rd  r”   r0   rB   r¥   rª  r«  r»   )ry   rˆ   r‰   rw  s       rs   rz   zFusedSchedulerNode.fuseA
  s×   € ð Œ %¤/Ð1Ð1Ð1Ð1Ý˜%¥-Õ1CÐ!DÑEÔEÐEÐEÐEØ×ÒÑÔð 	J¥:¨eÕ5NÑ#OÔ#Oð 	JÝ˜eœj­"¬.Ñ9Ô9Ð9Ð9Ð9Ð9å˜e¥mÕ5GÐ%HÑIÔIÐIÐIÐIÝ•Y”_ U§_¢_Ñ%6Ô%6¸¿ºÑ8IÔ8IÑJÔJÑKÔKˆØˆs�5”? EÑ*Ô*Ð*ru   c                óœ   — | j         D ]C}t          |t          ¦  «        sJ ‚|                     ¦   «         sJ ‚|                     ¦   «          ŒD| S r   )rÞ   r²   r³   r´   rn  ©rr   r¸   s     rs   rn  z,FusedSchedulerNode.extract_pw_from_reductionN
  s[   € Ø”{ð 	0ð 	0ˆGÝ˜g¥}Ñ5Ô5Ð5Ð5Ð5Ø×'Ò'Ñ)Ô)Ð)Ð)Ð)Ø×-Ò-Ñ/Ô/Ð/Ð/Øˆru   r   c                óp   — | j         D ]-}t          |t          ¦  «        sJ ‚|                     ¦   «          Œ.d S r   )rÞ   r²   r³   rl  rØ  s     rs   rl  z(FusedSchedulerNode.swap_pw_red_dimensionU
  sH   € Ø”{ð 	,ð 	,ˆGÝ˜g¥}Ñ5Ô5Ð5Ð5Ð5Ø×)Ò)Ñ+Ô+Ð+Ð+ð	,ð 	,ru   rn  c                óÀ   — t          t          d d„ |                      ¦   «         D ¦   «         ¦  «        ¦  «        }t          |¦  «        dk    rd S t	          |¦  «        }|S )Nc              3  óŽ   K  — | ]@}|                      ¦   «         s|                     ¦   «         ¯*|                     ¦   «         V — ŒAd S r   ©rö  rø  rx  rÒ  s     rs   r¹   z4FusedSchedulerNode.estimate_flops.<locals>.<genexpr>`
  óh   è è € ð ð àØ×'Ò'Ñ)Ô)ðð .2¯^ª^Ñ-=Ô-=ðØ×'Ò'Ñ)Ô)ðð ð ð ð ð ru   r   ©r¥   Úfilterr»   rÏ   rÿ   ©rr   Úfpsr�  s      rs   rx  z!FusedSchedulerNode.estimate_flopsZ
  óo   € õ ÝØðð à $§¢Ñ 0Ô 0ðñ ô ñô ñ	
ô 	
ˆõ ˆs‰8Œ8�qŠ=ˆ=Ø�4Ý�#‰hŒhˆØˆ
ru   r|  r9   r}  rv   c                ó  — |                       ¦   «         rdS d}| j        D ]q}t          |t          ¦  «        s dS |�Ht	          |¦  «        t	          |j        d         ¦  «        k    rt                               d¦  «          dS |j        d         }Œrd}|€J ‚t          |¦  «        |j	        cxk    r|j	        k    rn n| 
                    |¦  «        }|s/t                               d|                      ¦   «         ¦  «         dS t          xj        dz  c_        t                               d|                      ¦   «         |¦  «         | j        D ].}t          |t          ¦  «        sJ ‚|                     |¦  «         Œ/t          | ¦  «         dS )	z@
        Return true if a loop reordering is performed.
        FNr   z1Can not reorder fused node due to different sizeszODont reordering fused node %s because we can not decide the suitable loop orderr   z-Reorder loops for fused node %s with order %sT)rö  rÞ   r²   r³   rÐ   r.  r|  ró  rÏ   ry  rz  rê  r1   r{  r_  rÇ  )rr   r|  r}  r}  r¿  rX  s         rs   r€  z,FusedSchedulerNode.reorder_loops_by_dep_pairl
  s¹  € ð ×ÒÑÔð 	à�5Øˆ
Ø”[ð 	)ð 	)ˆEÝ˜e¥]Ñ3Ô3ð Ø�u�uØÐ%­%°
Ñ*;Ô*;½uÀUÄ\ÐRSÄ_Ñ?UÔ?UÒ*UÐ*UÝ!×'Ò'ØGñô ð ð �u�uØœ aœˆJˆJØˆ	àÐ%Ð%Ð%Ýˆz‰?Œ?˜hÔ/ÐEÐEÒEÐE°9Ô3EÒEÐEÐEÐEÐEØ ×;Ò;¸IÑFÔFˆIàð 	Ý×#Ò#ØaØ—’‘”ñô ð ð �5åÐ#Ô# qÑ(Ð#Ô#Ý×ÒØ;¸T¿]º]¹_¼_Èiñ	
ô 	
ð 	
ð ”[ð 	2ð 	2ˆEÝ˜e¥]Ñ3Ô3Ð3Ð3Ð3Ø×&Ò& yÑ1Ô1Ð1Ð1å'¨Ñ-Ô-Ð-Øˆtru   rä  rã  c                ó²   •— t          ¦   «                              |¦  «         t          | ||¦  «         g | _        t	          |d„ ¬¦  «        j        | _        d S )Nc                óD   — t          |                      ¦   «         ¦  «        S r   )r‘   r´   rÅ  s    rs   rA  z-FusedSchedulerNode.__init__.<locals>.<lambda>›
  s   € ­s°1·>²>Ñ3CÔ3CÑ/DÔ/D€ ru   rú  )r  rC  rÔ  rç  r`  rÇ   )rr   rä  rÞ   r  s      €rs   rC  zFusedSchedulerNode.__init__—
  sS   ø€ Ý‰Œ×Ò˜Ñ#Ô#Ð#Ý˜˜i¨Ñ0Ô0Ð0Ø%'ˆŒ
Ý˜Ð%DÐ%DÐEÑEÔEÔKˆŒ
ˆ
ˆ
ru   rÖ   c                óJ   — d                      d„ | j        D ¦   «         ¦  «        S )Nr?  c                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   rI  rÀ  s     rs   r   z/FusedSchedulerNode.get_name.<locals>.<listcomp>Ÿ
  ó    € Ð;Ð;Ð;¨!˜Ÿš™œÐ;Ð;Ð;ru   ©r  rÞ   rq   s    rs   rê  zFusedSchedulerNode.get_name�
  ó%   € à�xŠxÐ;Ð;¨t¬{Ð;Ñ;Ô;Ñ<Ô<Ð<ru   c                ó@   — | j         d                              ¦   «         S rì   ©rÞ   rê  rq   s    rs   rÏ  z!FusedSchedulerNode.get_first_name¡
  ó   € ØŒ{˜1Œ~×&Ò&Ñ(Ô(Ð(ru   r™   c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   ©rÖ  rÀ  s     rs   r   z7FusedSchedulerNode.get_buffer_names.<locals>.<listcomp>¦
  ó$   € Ð!LÐ!LÐ!L¸1 !×"4Ò"4Ñ"6Ô"6Ð!LÐ!LÐ!Lru   ©r   rÆ  rÞ   rq   s    rs   rÖ  z#FusedSchedulerNode.get_buffer_names¤
  ó!   € åÔÐ!LÐ!LÀÄÐ!LÑ!LÔ!LÐMÐMru   r4  c                ól   — g }| j         D ])}|                     |                     ¦   «         ¦  «         Œ*|S r   ©rÞ   rµ  rL  ©rr   r¿  r”   s      rs   rL  zFusedSchedulerNode.get_outputs¨
  ó>   € Ø(*ˆØ”Kð 	.ð 	.ˆDØ�MŠM˜$×*Ò*Ñ,Ô,Ñ-Ô-Ð-Ð-Øˆru   c                ó.  ‡ — ˆ fd„t          ‰ j        ¦  «        D ¦   «         }‰ j        d         j        }|�'|                     ‰                      ¦   «         ¦  «         t          j        d                     |¦  «                             ¦   «         d¦  «        S )Nc                ór   •— g | ]3\  }}‰                      ¦   «         › d |› d|                     ¦   «         › �‘Œ4S )z.snodes[z] =
)rê  rü  )r·   r¨  r”   rr   s      €rs   r   z6FusedSchedulerNode.debug_str_extra.<locals>.<listcomp>¯
  sU   ø€ ð 
ð 
ð 
á��4ð �}Š}‰ŒÐBÐB¨ÐBÐB°·²Ñ0@Ô0@ÐBÐBð
ð 
ð 
ru   r   rX  rý  )	rª  rÞ   r”   rµ  rk  r  rù  r  rf  )rr   r€  r”   s   `  rs   rb  z"FusedSchedulerNode.debug_str_extra®
  s“   ø€ ð
ð 
ð 
ð 
å$ T¤[Ñ1Ô1ð
ñ 
ô 
ˆð Œ{˜1Œ~Ô"ˆØÐØ�LŠL˜×3Ò3Ñ5Ô5Ñ6Ô6Ð6åŒ˜tŸyšy¨Ñ/Ô/×6Ò6Ñ8Ô8¸&ÑAÔAÐAru   c                ó2   — d„ | j         D ¦   «         }| › d|› �S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   )rx  rÒ  s     rs   r   z6FusedSchedulerNode.debug_str_short.<locals>.<listcomp>º
  s$   € ÐEÐEÐE°�d×*Ò*Ñ,Ô,ÐEÐEÐEru   z
, snodes: rU  )rr   Ú
snodes_strs     rs   rx  z"FusedSchedulerNode.debug_str_short¹
  s+   € ØEÐE¸¼ÐEÑEÔEˆ
ØÐ.Ð. *Ð.Ð.Ð.ru   rž  rŸ  r1  c                óö   •— t          ¦   «                              ||¦  «         t          ¦   «         }t          | j        ¦  «        D ]2}|                     ||¦  «         |                     |j        ¦  «         Œ3d S r   )r  r¥  r   rÑ   rÞ   Úupdater+  )rr   rž  rŸ  r”   r  s       €rs   r¥  z!FusedSchedulerNode.set_last_usage½
  s�   ø€ õ
 	‰Œ×ÒÐ2Ð4FÑGÔGÐGõ 0:©|¬|ÐÝ˜Tœ[Ñ)Ô)ð 	8ð 	8ˆDØ×ÒÐ 3Ð5GÑHÔHÐHØ×&Ò& t¤Ñ7Ô7Ð7Ð7ð	8ð 	8ru   c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   ©ræ   rÀ  s     rs   r   z8FusedSchedulerNode.used_buffer_names.<locals>.<listcomp>Ì
  s$   € Ð!MÐ!MÐ!M¸A !×"5Ò"5Ñ"7Ô"7Ð!MÐ!MÐ!Mru   rò  rq   s    rs   ræ   z$FusedSchedulerNode.used_buffer_namesÊ
  s!   € åÔÐ!MÐ!MÀÄÐ!MÑ!MÔ!MÐNÐNru   c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   )r£  rÀ  s     rs   r   zCFusedSchedulerNode.used_or_aliased_buffer_names.<locals>.<listcomp>Ñ
  s$   € ÐDÐDÐD°1ˆa×,Ò,Ñ.Ô.ÐDÐDÐDru   rò  rq   s    rs   r£  z/FusedSchedulerNode.used_or_aliased_buffer_namesÎ
  s%   € åÔØDÐD¸¼ÐDÑDÔDð
ð 	
ru   rx  c                ó   — | j         S r   rU  rq   s    rs   r»   zFusedSchedulerNode.get_nodesÔ
  r‚  ru   c                óZ   — t          | ¦  «        j        › d|                      ¦   «         › d�S )Nz(nodes=rP  rQ  rq   s    rs   rR  zFusedSchedulerNode.__repr__×
  s*   € Ý�t‘*”*Ô%Ð@Ð@¨d¯mªm©o¬oÐ@Ð@Ð@Ð@ru   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   r]  rÀ  s     rs   r¹   z2FusedSchedulerNode.is_reduction.<locals>.<genexpr>Ü
  s,   è è € Ð9Ð9¨�1—>’>Ñ#Ô#Ð9Ð9Ð9Ð9Ð9Ð9ru   ©r  rÞ   rq   s    rs   r´   zFusedSchedulerNode.is_reductionÚ
  s!   € åÐ9Ð9¨T¬[Ð9Ñ9Ô9Ñ9Ô9Ð9ru   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )rò  rÀ  s     rs   r¹   z6FusedSchedulerNode.is_native_matmul.<locals>.<genexpr>à
  s.   è è € Ð=Ð=¨A�1×%Ò%Ñ'Ô'Ð=Ð=Ð=Ð=Ð=Ð=ru   r  rq   s    rs   rò  z#FusedSchedulerNode.is_native_matmulÞ
  s!   € åÐ=Ð=°´Ð=Ñ=Ô=Ñ=Ô=Ð=ru   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )rô  rÀ  s     rs   r¹   z3FusedSchedulerNode.is_split_scan.<locals>.<genexpr>ä
  s,   è è € Ð:Ð:¨�1—?’?Ñ$Ô$Ð:Ð:Ð:Ð:Ð:Ð:ru   r  rq   s    rs   rô  z FusedSchedulerNode.is_split_scanâ
  s!   € åÐ:Ð:¨d¬kÐ:Ñ:Ô:Ñ:Ô:Ð:ru   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   r¦  rÀ  s     rs   r¹   z1FusedSchedulerNode.is_template.<locals>.<genexpr>è
  s*   è è € Ð8Ð8 q�1—=’=‘?”?Ð8Ð8Ð8Ð8Ð8Ð8ru   r  rq   s    rs   rö  zFusedSchedulerNode.is_templateæ
  s!   € åÐ8Ð8¨D¬KÐ8Ñ8Ô8Ñ8Ô8Ð8ru   r™  c                ón   — | j         D ],}|                     ¦   «         r|                     ¦   «         c S Œ-d S r   )rÞ   rö  r›  rM  s     rs   r›  z$FusedSchedulerNode.get_template_nodeê
  sI   € à”Kð 	0ð 	0ˆDØ×ÒÑ!Ô!ð 0Ø×-Ò-Ñ/Ô/Ð/Ð/Ð/ð0àˆtru   útorch.devicec                ó   — | j         d         S rì   )rÇ   rq   s    rs   rª   zFusedSchedulerNode.get_deviceñ
  s   € ØŒz˜!Œ}Ðru   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )r“  rÀ  s     rs   r¹   z>FusedSchedulerNode.has_aliasing_or_mutation.<locals>.<genexpr>ö
  s.   è è € ÐEÐE°A�1×-Ò-Ñ/Ô/ÐEÐEÐEÐEÐEÐEru   r  rq   s    rs   r“  z+FusedSchedulerNode.has_aliasing_or_mutationô
  s!   € åÐEÐE¸¼ÐEÑEÔEÑEÔEÐEru   r‚  c                ó   — t           ‚r   ©ÚNotImplementedErrorr‹  s     rs   rŒ  z'FusedSchedulerNode.update_mutated_namesú
  ó   € Ý!Ð!ru   rÚ   r8   c                ó   — t           ‚r   r  )rr   rÚ   s     rs   r�  zFusedSchedulerNode.add_fake_depý
  r  ru   rû  rü  c                ó   — t           ‚r   r  rþ  s     rs   rÿ  zFusedSchedulerNode.can_inplace   r  ru   c                óÊ  — |                       ¦   «         }d                     d„ | j        D ¦   «         ¦  «        }t          ¦   «         }|                     |› dt          | ¦  «        j        › d|› d|› dt          | j        j	        ¦  «        › d|› dt          | j
        ¦  «        › d|› d	t          | j        j        | j
        z
  ¦  «        › d|› d
| j        › d|› d| j        › d|› d�¦  «         |                     ¦   «         5  |                      ¦   «         D ])}|                     |                     ¦   «         ¦  «         Œ*	 ddd¦  «         n# 1 swxY w Y   |                     d¦  «         	 |                     |                      ¦   «         ¦  «         n,# t&          $ r t(                               dd¬¦  «         Y nw xY w|                     ¦   «                              ¦   «         S )rT  rò  c              3  ó>   K  — | ]}t          |¦  «        j        V — Œd S r   )r«   r€   rÛ  s     rs   r¹   z/FusedSchedulerNode.debug_str.<locals>.<genexpr>  s+   è è € ÐFÐF°Q¥ Q¡¤Ô 0ÐFÐFÐFÐFÐFÐFru   rñ  rU  rV  rW  rX  rY  rZ  r[  r\  z.outputs = [
            Nró  r]  Tr^  )rê  r  rÞ   rX   r`  r«   r€   r÷  rØ   ra  r<  rÙ   r,  r-  rù  rL  rü  rô  rb  rc  rd  re  rú  rf  )rr   rÚ   Únode_typestrrÕ   rè   s        rs   rü  zFusedSchedulerNode.debug_str  s”  € à�}Š}‰ŒˆØ—x’xÐFÐF¸$¼+ÐFÑFÔFÑFÔFˆÝÑÔˆØ�
Š
àðð Ý	ˆd‰ŒÔ	ðð Ø+ðð àðð å˜Ô)Ô0Ñ1Ô1ðð ð ðð õ % TÔ%<Ñ=Ô=ðð ð ð	ð õ # 4Ô#3Ô#9¸DÔ<SÑ#SÑTÔTð	ð ð
 ðð ð
 "Ô4ðð ð ðð ð "Ô4ðð ð ðð ð ñ
	
ô 
	
ð 
	
ð �ZŠZ‰\Œ\ð 	,ð 	,Ø×'Ò'Ñ)Ô)ð ,ð ,�Ø—
’
˜3Ÿ=š=™?œ?Ñ+Ô+Ð+Ð+ð,ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	�Š�cÑÔÐð	HØ�JŠJ�t×+Ò+Ñ-Ô-Ñ.Ô.Ð.Ð.øÝð 	Hð 	Hð 	HÝ�KŠKÐ7À$ˆKÑGÔGÐGÐGÐGð	Høøøð �ŠÑ Ô ×'Ò'Ñ)Ô)Ð)s$   Ã>?E
Å
EÅEÅ+'F Æ&F<Æ;F<c                óŽ   •— | j         �t          d„ | j         D ¦   «         ¦  «        S t          ¦   «                              ¦   «         S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )r  rÒ  s     rs   r¹   z6FusedSchedulerNode.has_side_effects.<locals>.<genexpr>"  s.   è è € ÐGÐG°4�t×,Ò,Ñ.Ô.ÐGÐGÐGÐGÐGÐGru   )rÞ   r  r  r  r¸  s    €rs   r  z#FusedSchedulerNode.has_side_effects  s@   ø€ àŒ;Ð"ÝÐGÐG¸4¼;ÐGÑGÔGÑGÔGÐGÝ‰wŒw×'Ò'Ñ)Ô)Ð)ru   ©rˆ   rf   r‰   rf   rŠ   rÝ   rº  r$  r¸  r°  )rä  rã  rÞ   r¢  rŠ   r   r"  r³  ©rŠ   r4  r²  rµ  r%  rº  )rŠ   r  r±  )rÚ   r8   rŠ   r   r¶  )%r€   r�   r‚   r•   rƒ   r„   rz   rn  rl  rO   rx  r€  rC  rê  rÏ  rÖ  rL  rb  rx  r¥  ræ   r£  r»   rR  r´   rò  rô  rö  r›  rª   r“  rŒ  r�  rÿ  rü  r  r(  r)  s   @rs   rÝ   rÝ   8
  sP  ø€ € € € € € ðð ð $Ð#Ð#Ñ#àð
+ð 
+ð 
+ñ „[ð
+ðð ð ð ð,ð ,ð ,ð ,ð
 ðð ð ñ „]ðð")ð )ð )ð )ðVLð Lð Lð Lð Lð Lð ð=ð =ð =ñ „]ð=ð)ð )ð )ð )ð ðNð Nð Nñ „]ðNðð ð ð ð	Bð 	Bð 	Bð 	Bð/ð /ð /ð /ð8ð 8ð 8ð 8ð 8ð 8ð ðOð Oð Oñ „]ðOð ð
ð 
ð 
ñ „]ð
ð
ð ð ð ðAð Að Að Að ð:ð :ð :ñ „]ð:ð ð>ð >ð >ñ „]ð>ð ð;ð ;ð ;ñ „]ð;ð ð9ð 9ð 9ñ „]ð9ð ðð ð ñ „]ððð ð ð ð ðFð Fð Fñ „]ðFð
"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ð*ð *ð *ð *ð8 ð*ð *ð *ð *ð *ñ „]ð*ð *ð *ð *ð *ru   rÝ   c                  ó<   ‡ — e Zd ZdZdˆ fd„Zdd
„Zdd„Zdd„Zˆ xZS )ÚFusedMixOrderReductionszNFused node for two reductions with different iteration orders (inner + outer).rˆ   rf   r‰   rŠ   r   c                ó°  •— t                                |¦  «        s t                                |¦  «        sJ ‚||}}|| _        || _        t	          ¦   «                              |j        t          |                     ¦   «         ¦  «        t          |                     ¦   «         ¦  «        z   ¦  «         t            	                    | j        ¦  «        | _
        d S r   )r¯   r  rˆ   r‰   r  rC  rä  r¥   r»   ró   r  )rr   rˆ   r‰   r  s      €rs   rC  z FusedMixOrderReductions.__init__)  s³   ø€ Ý ×3Ò3°EÑ:Ô:ð 	(Ý$×7Ò7¸Ñ>Ô>Ð>Ð>Ð>Ø  %�5ˆEàˆŒ
ØˆŒ
Ý‰Œ×ÒØŒO�T %§/¢/Ñ"3Ô"3Ñ4Ô4µt¸E¿OºOÑ<MÔ<MÑ7NÔ7NÑNñ	
ô 	
ð 	
õ '×0Ò0°´Ñ<Ô<ˆŒ
ˆ
ˆ
ru   Úother_nodesútuple[BaseSchedulerNode, ...]c                óú  — t          |t          ¦  «        rJ ‚t          |t          ¦  «        rJ ‚| j                             ||d¬¦  «        sdS t                               |¦  «        rt                               |¦  «        sdS d
d„}d
d„}|r4 |||f¦  «         ||¦  «        z  s ||¦  «         |||f¦  «        z  rdS |                     ¦   «          p%| j                             ||d¬	¦  «        | j        k    S )a  
        node1 is from the current mix order reduction; node2 is another node we want to fuse in.

        other_nodes are passed in to check if fusion will introduce producer/consumer relationship
        between the inner and outer reduction. If yes, we don't fuse.
        F©Úallow_mix_order_reductionrw  r%  rŠ   r™   c                óF   — t          ¦   «         } |j        d„ | D ¦   «         Ž S )Nc              3  ó$   K  — | ]}|j         V — Œd S r   rÊ  rÛ  s     rs   r¹   zTFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_ancestors.<locals>.<genexpr>S  s$   è è € Ð:Ð:¨q˜qœ{Ð:Ð:Ð:Ð:Ð:Ð:ru   ©r   rÆ  ©rw  rè   s     rs   Ú_get_ancestorszAFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_ancestorsQ  s)   € Ý‘,”,ˆCØ�3”9Ð:Ð:°EÐ:Ñ:Ô:Ð;Ð;ru   c                óF   — t          ¦   «         } |j        d„ | D ¦   «         Ž S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )r  rÛ  s     rs   r¹   zZFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_operation_names.<locals>.<genexpr>Y  s.   è è € ÐFÐF¸1˜q×4Ò4Ñ6Ô6ÐFÐFÐFÐFÐFÐFru   r+  r,  s     rs   Ú_get_operation_nameszGFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_operation_namesU  s+   € õ ‘,”,ˆCØ�3”9ÐFÐFÀÐFÑFÔFÐGÐGru   )Úcount_bytes)rw  r%  rŠ   r™   )	r²   r"  rä  r  r¯   r  r´   Úscore_fusion_memoryr  )rr   rˆ   r‰   r$  r-  r0  s         rs   Úsub_node_can_fusez)FusedMixOrderReductions.sub_node_can_fuse5  s_  € õ ˜eÕ%<Ñ=Ô=Ð=Ð=Ð=Ý˜eÕ%<Ñ=Ô=Ð=Ð=Ð=ð
 Œ~×&Ò& u¨eÈuÐ&ÑUÔUð 	Ø�5õ ×/Ò/Øñ
ô 
ð 	å#×6Ò6°uÑ=Ô=ð	ð �5ð	<ð 	<ð 	<ð 	<ð	Hð 	Hð 	Hð 	Hð ð 	Ø�  u˜~Ñ.Ô.Ð1EÐ1EÀkÑ1RÔ1RÑRð Ø�˜{Ñ+Ô+Ð.BÐ.BÀEÈ5À>Ñ.RÔ.RÑRðð �uð ×"Ò"Ñ$Ô$Ð$ð ØŒ~×1Ò1°%¸ÈEÐ1ÑRÔRØŒzòð	
ru   Úotherc                óú  — t           j        j        }|dk    r²t          ¦   «         }t	          j        |                      ¦   «         |                     ¦   «         ¦  «        D ]@}|j        j        D ]1}t          |t          ¦  «        r|                     |j        ¦  «         Œ2ŒAt          |¦  «        |k    rt          xj        dz  c_        dS t          |t           ¦  «        sD|                      | j        || j        f¦  «        p!|                      | j        || j        f¦  «        S |                      | j        |j        | j        |j        f¦  «        o,|                      | j        |j        t)          ¦   «         ¦  «        S )Nr   r   F)r-   r©   Úmix_order_reduction_max_readsr   rª  r«  r»   rØ   rÙ   r²   r9   r³  rÚ   rÏ   r1   Ú#rejected_mix_order_reduction_fusionr"  r3  rˆ   r‰   rÐ   )rr   r4  Ú	max_readsÚ	all_readsr_  râ   s         rs   Úcan_fuse_withz%FusedMixOrderReductions.can_fuse_withg  sh  € õ ”MÔ?ˆ	Ø�qŠ=ˆ=Ý)3©¬ˆIÝ”o d§n¢nÑ&6Ô&6¸¿ºÑ8IÔ8IÑJÔJð 0ð 0�Øœ>Ô/ð 0ð 0�CÝ! #¥yÑ1Ô1ð 0Ø!Ÿš c¤hÑ/Ô/Ð/øð0õ �9‰~Œ~ 	Ò)Ð)åÐ;Ô;¸qÑ@Ð;Ô;Ø�uÝ˜%Õ!8Ñ9Ô9ð 		KØ×)Ò)Ø”
˜E D¤J =ñô ð Jà×'Ò'¨¬
°E¸D¼J¸=ÑIÔIðJð ×)Ò)Ø”
˜EœK¨$¬*°e´kÐ)Bñô ð Kà×(Ò(¨¬°U´[Å%Á'Ä'ÑJÔJðKru   c                ó6  — | j                              ¦   «         }| j                             |¦  «        }t	          |t
          ¦  «        rP|                     | j         |j         ¦  «        }|                     | j        |j        ¦  «        }t          ||¦  «        S |                      | j         || j        f¦  «        r0|                     | j         |¦  «        }t          || j        ¦  «        S |                     | j        |¦  «        }t          | j         |¦  «        S r   )	rˆ   rª   rä  r<  r²   r"  rz   r‰   r3  )rr   r4  rì  ÚbackendÚfused_node1Úfused_node2r
  s          rs   Ú	fuse_withz!FusedMixOrderReductions.fuse_with€  së   € Ø”×&Ò&Ñ(Ô(ˆØ”.×,Ò,¨VÑ4Ô4ˆå�eÕ4Ñ5Ô5ð 
	GØ!Ÿ,š, t¤z°5´;Ñ?Ô?ˆKØ!Ÿ,š, t¤z°5´;Ñ?Ô?ˆKÝ*¨;¸ÑDÔDÐDà×%Ò% d¤j°%¸$¼*¸ÑGÔGð GØ$Ÿ\š\¨$¬*°eÑ<Ô<�
Ý.¨z¸4¼:ÑFÔFÐFà$Ÿ\š\¨$¬*°eÑ<Ô<�
Ý.¨t¬z¸:ÑFÔFÐFru   r÷  )rˆ   rf   r‰   rf   r$  r%  )r4  rf   )	r€   r�   r‚   r•   rC  r3  r:  r?  r(  r)  s   @rs   r"  r"  &  sŒ   ø€ € € € € ØXÐXð
=ð 
=ð 
=ð 
=ð 
=ð 
=ð0
ð 0
ð 0
ð 0
ðdKð Kð Kð Kð2Gð Gð Gð Gð Gð Gð Gð Gru   r"  c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd„Zdd„Zˆ xZS )ÚFusedNestedReductionsz¶
    Fused node for two dependent reductions over the same logical elements.
    The outer reduction owns the codegen grid; the grouped reduction is staged
    inside that grid.
    rˆ   rf   r‰   rŠ   r   c                óæ  •— || _         || _        t          ¦   «                              |j        t          |                     ¦   «         ¦  «        t          |                     ¦   «         ¦  «        z   ¦  «         | xj        |                      ¦   «         z  c_        |}|j	        \  }\  }}t                               ||¦  «        }|€J ‚|\  }}	|| _        |	| _        |j	        \  }\  }
}t                               ||
||	|¬¦  «        }|€J ‚|| _        | j        t          j        j        u | _        |                     ¦   «         \  }}t                               |||g |¢|¢R |
|f¬¦  «        | _        d S )Nr¨  r©  )rˆ   r‰   r  rC  rä  r¥   r»   r  r  rÇ   r4  rj  rS  ri  rª  r�  rO  rM  Úgroup_size_in_rrc  rY  rk  )rr   rˆ   r‰   r7  r?  rU  rV  r®  rS  Úexact_group_sizer�  rŽ  r�  rg  rh  r  s                  €rs   rC  zFusedNestedReductions.__init__˜  s™  ø€ ØˆŒ
ØˆŒ
Ý‰Œ×ÒØŒO�T %§/¢/Ñ"3Ô"3Ñ4Ô4µt¸E¿OºOÑ<MÔ<MÑ7NÔ7NÑNñ	
ô 	
ð 	
ð 	ˆŒ˜$×2Ò2Ñ4Ô4Ñ4ˆŒØˆØ-9Ô-?Ñ*ˆÑ*ˆM˜>Ý!0×!PÒ!PØ˜.ñ"
ô "
Ðð &Ð1Ð1Ð1Ø.DÑ+ÐÐ+Ø0AˆÔØ)9ˆŒØ).¬Ñ&ˆÑ&ˆK˜Ý&×7Ò7ØØØØØð 8ñ 
ô 
ˆð Ð'Ð'Ð'Ø9EˆÔØ%)Ô%6½/Ô:UÔ:WÐ%WˆÔØ%6×%AÒ%AÑ%CÔ%CÑ"ˆ�]å×2Ò2Ø"3Ø+Ø-Ø'E¨Ð'E°}Ð'EÐ'EØ$/°Ð#>ð 3ñ ô ð 	ÔÐÐru   r4  Úcan_reorderrv   c               ó   — |                      ¦   «         rdS | j                             ¦   «         |j        z  sdS t                               | j        |                     ¦   «         ¦  «        }|€dS t                               | j        |¦  «        sdS t          d„ |D ¦   «         ¦  «        rdS | j
                             | j        |||¬¦  «        S )zÚAllow downstream pointwise of the grouped reduction to fuse in.

        Consumers fused directly into the grouped reduction must run at either
        reduced-output resolution or full parent-tile resolution.
        FNc              3  óB   K  — | ]\  }}|t           j        j        u V — Œd S r   )r4  rJ  rH  )r·   r?  r�  s      rs   r¹   z6FusedNestedReductions.can_fuse_with.<locals>.<genexpr>Ý  sE   è è € ð 
ð 
á��6ð •oÔ5ÔKÐKð
ð 
ð 
ð 
ð 
ð 
ru   ©rE  )r´   r‰   r  r  r4  rs  rk  r»   rn  r  rä  Ú!_can_fuse_nested_reduction_append)rr   r4  rE  ro  s       rs   r:  z#FusedNestedReductions.can_fuse_withÂ  s  € ð ×ÒÑÔð 	Ø�5ð ”
×.Ò.Ñ0Ô0°5´?ÑBð 	Ø�5õ ×=Ò=ØÔØ�OŠOÑÔñ
ô 
ð 	ð Ð$Ø�5Ý×@Ò@ØÔÐ!2ñ
ô 
ð 	ð �5õ ð 
ð 
à.ð
ñ 
ô 
ñ 
ô 
ð 	ð �5ØŒ~×?Ò?ØŒJØØØ#ð	 @ñ 
ô 
ð 	
ru   c                óÈ   — | j                              ¦   «         }| j                             |¦  «        }|                     | j         |¦  «        }t          | j        |¦  «        S r   )r‰   rª   rä  r<  rz   rA  rˆ   )rr   r4  rì  r<  Ú	new_node2s        rs   r?  zFusedNestedReductions.fuse_withé  sQ   € Ø”×&Ò&Ñ(Ô(ˆØ”.×,Ò,¨VÑ4Ô4ˆØ—L’L ¤¨UÑ3Ô3ˆ	Ý$ T¤Z°Ñ;Ô;Ð;ru   r÷  )r4  rf   rE  rv   rŠ   rv   )r4  rf   rŠ   rA  )r€   r�   r‚   r•   rC  r:  r?  r(  r)  s   @rs   rA  rA  ‘  sq   ø€ € € € € ðð ð(
ð (
ð (
ð (
ð (
ð (
ðT%
ð %
ð %
ð %
ðN<ð <ð <ð <ð <ð <ð <ð <ru   rA  c                  óP   ‡ — e Zd Zdˆ fd	„Zedd„¦   «         Zdd„Zdd„Zdd„Zˆ xZ	S )Ú$FusedExternTritonKernelSchedulerNoderä  rã  Úkernel_noderd  Úfused_epiloguer³   rŠ   r   c                ó2  •— t          |j        t          j        ¦  «        sJ ‚t	          j        t          t                   ||g¦  «        }t          ¦   «          	                    ||¦  «         || _
        || _        | j
        j        | _        |j        | _        d S r   )r²   r”   r0   r  rÇ  rÈ  r¥   rf   r  rC  rN  rO  r.  r5  )rr   rä  rN  rO  rÞ   r  s        €rs   rC  z-FusedExternTritonKernelSchedulerNode.__init__ñ  s‚   ø€ õ ˜+Ô*­BÔ,FÑGÔGÐGÐGÐGÝ”�TÕ"3Ô4°{ÀNÐ6SÑTÔTˆÝ‰Œ×Ò˜ FÑ+Ô+Ð+Ø&ˆÔØ,ˆÔØÔ)Ô3ˆŒØ%Ô-ˆŒˆˆru   rˆ   r‰   rÝ   c                ór  — t          |j        t          j        ¦  «        sJ ‚|j        }t          |j        j        ¦  «        dk    sJ ‚|j        j        d         j        }|j         	                    ||¦  «        }|j
        |         j                             t          |¦  «        ¦  «          | |||¦  «        S )Nr   r   )r²   r”   r0   r  rä  rÏ   Úmutation_outputsrÚ   rŸ  r¾  r  rç  ÚremoveÚNodeUser)ry   rˆ   r‰   rä  Úmutated_nameÚ	real_names         rs   Úepilogue_fusez2FusedExternTritonKernelSchedulerNode.epilogue_fuseÿ  s©   € õ ˜%œ*¥bÔ&@ÑAÔAÐAÐAÐAØ”Oˆ	å�5”:Ô.Ñ/Ô/°1Ò4Ð4Ð4Ð4à!œJÔ7¸Ô:Ô?ˆð Ô0×4Ò4°\À<ÑPÔPˆ	ØÔ˜iÔ(Ô.×5Ò5µh¸u±o´oÑFÔFÐFØˆs�9˜e UÑ+Ô+Ð+ru   r#  r   c                óV  — t          | j        j        t          j        ¦  «        sJ ‚t          | j        j        t          j        ¦  «        sJ ‚| j        j                             ¦   «         sJ ‚t          j	        | j        j        j
        d         j        ¦  «        }ddlm} |                     | j        g|¦  «        \  }}ddlm}  || j        g|¦  «        }ddlm}  |||| ¦  «        }	|	                     ¦   «         }
| j        j                             || j        j        |
f¦  «        S )Nr   r‘  rž  )ÚFusedUserDefinedTritonKernel)r²   rO  r”   r0   r   rN  r  r  r  r   r  r  Útorch._inductor.codegen.simdr’  Úget_tiling_and_scoresÚ,torch._inductor.codegen.simd_kernel_featuresrŸ  Útorch._inductor.codegen.tritonrY  r  Úcodegen_with_epilogue_fusion)rr   r#  r  r’  r›  r?  rŸ  Úkernel_featuresrY  Úfused_user_kernelÚnew_kernel_srcs              rs   r  z,FusedExternTritonKernelSchedulerNode.codegen  sA  € Ý˜$Ô-Ô2µBÔ4EÑFÔFÐFÐFÐFÝ˜$Ô*Ô/µÔ1KÑLÔLÐLÐLÐLØÔÔ$×6Ò6Ñ8Ô8Ð8Ð8Ð8Ý”	˜$Ô*Ô/Ô<¸QÔ?ÔEÑFÔFˆØ?Ð?Ð?Ð?Ð?Ð?à"×8Ò8¸$Ô:MÐ9NÐPUÑVÔV‰	ˆ�àSÐSÐSÐSÐSÐSà,Ð,¨dÔ.AÐ-BÀEÑJÔJˆàOÐOÐOÐOÐOÐOà8Ð8¸ÀÐRVÑWÔWÐØ*×2Ò2Ñ4Ô4ˆàÔÔ$×AÒAØ�dÔ)Ô.°Ð?ñ
ô 
ð 	
ru   rv   c                ó   — dS r  r…   rq   s    rs   rø  z.FusedExternTritonKernelSchedulerNode.is_extern(  rœ  ru   r!  c                ó4   — | j                              ¦   «         S r   )rN  rc  rq   s    rs   rc  z/FusedExternTritonKernelSchedulerNode.get_ranges+  s   € ØÔ×*Ò*Ñ,Ô,Ð,ru   )rä  rã  rN  rd  rO  r³   rŠ   r   )rˆ   rd  r‰   r³   rŠ   rÝ   r'  r%  r&  )
r€   r�   r‚   rC  r„   rW  r  rø  rc  r(  r)  s   @rs   rM  rM  ð  s™   ø€ € € € € ð.ð .ð .ð .ð .ð .ð ð,ð ,ð ,ñ „[ð,ð$
ð 
ð 
ð 
ð,ð ð ð ð-ð -ð -ð -ð -ð -ð -ð -ru   rM  c                  ó  ‡ — e Zd ZU dZd-d„Zd.d„Zed/d
„¦   «         Zed0d„¦   «         Z	 	 	 	 d1d2ˆ fd„Z	ed3d„¦   «         Z
ed4d„¦   «         ZeZded<   ed5d „¦   «         Zed4d!„¦   «         Zd6d"„Zd6d#„Zd7d$„Zd8d%„Zd9d'„Zd:d)„Zd;d,„Zˆ xZS )<ÚForeachKernelSchedulerNodezš
    This is a schedular node that consists of a set of scheduler nodes that
    has no data dependencies among them and can be executed in parallel.
    Úproducerrf   rŠ   r´  c                ó¬   — |                      ¦   «         D ]>}|                     ¦   «         | j        v r!| j        |                     ¦   «                  c S Œ?d S r   )rL  rê  Úread_to_node)rr   rf  rÕ   s      rs   Úget_consumer_subnode_forz3ForeachKernelSchedulerNode.get_consumer_subnode_for5  s]   € ð ×'Ò'Ñ)Ô)ð 	9ð 	9ˆCØ�|Š|‰~Œ~ Ô!2Ð2Ð2ØÔ(¨¯ª©¬Ô8Ð8Ð8Ð8ð 3ð ˆtru   Úconsumerc                ó€  — t          t                   ¦   «         }|j        j        D ]h}|j        | j        j        vrŒ| j        j        |j                                      ¦   «         }|| j        v r | 	                    | j        |         ¦  «         Œit          |¦  «        dk    rt          t          |¦  «        ¦  «        S d S ©Nr   )r   rf   rØ   rÙ   rÚ   rä  r  rì  Úname_to_noder³  rÏ   r©  r¬  )rr   rj  Ú	producersÚrdÚ	node_names        rs   Úget_producer_subnode_forz3ForeachKernelSchedulerNode.get_producer_subnode_for>  s±   € õ Õ0Ô1Ñ3Ô3ˆ	ØÔ&Ô,ð 	<ð 	<ˆBØŒw˜dœnÔ8Ð8Ð8ØàœÔ2°2´7Ô;×LÒLÑNÔNˆIØ˜DÔ-Ð-Ð-Ø—’˜dÔ/°	Ô:Ñ;Ô;Ð;øõ ˆy‰>Œ>˜QÒÐÝ�˜Y™œÑ(Ô(Ð(à�4ru   rv   c                ó
  ‡— t          ‰|¦  «        }‰                     ¦   «         r´|                     ¦   «         r t          j        t          ‰¦  «        Št          j        t          |¦  «        }t          ‰j        ¦  «        t          |j        ¦  «        k    }|s |d¦  «         |o2t          ˆfd„t          ‰j        |j        ¦  «        D ¦   «         ¦  «        S |                     ¦   «         rz‰ 	                    ¦   «         r |d¦  «         dS t          j        t          |¦  «        }| 
                    ‰¦  «        }|�|j                             ‰|¦  «        S  |d¦  «         dS ‰                     ¦   «         rz| 	                    ¦   «         r |d¦  «         dS t          j        t          ‰¦  «        Š‰                     |¦  «        }|�‰j                             ||¦  «        S  |d¦  «         dS t          d¦  «        ‚)	Nzforeach do not have same lengthc              3  óT   •K  — | ]"\  }}‰j                              ||¦  «        V — Œ#d S r   )rä  r  )r·   ÚlÚrrf  s      €rs   r¹   z6ForeachKernelSchedulerNode.can_fuse.<locals>.<genexpr>Z  sN   øè è € ð )ð )á�A�qð Ô"×+Ò+¨A¨qÑ1Ô1ð)ð )ð )ð )ð )ð )ru   zXcandidate producer is a reduction, foreach ops cannot be fused with reductions currentlyFz5candidate producer is not dep of any foreach consumerzXcandidate consumer is a reduction, foreach ops cannot be fused with reductions currentlyz5candidate consumer has no dep in any foreach producerzXAt least one node passed to ForeachKernelSchedulerNode.can_fuse should be a foreach node)rê  rú  rÇ  rÈ  re  rÏ   rÞ   rº   r•  r´   ri  rä  r  rq  rŠ  )ry   rf  rj  ÚwhyÚforeach_matchÚconsumer_subnodeÚproducer_subnodes    `     rs   r  z#ForeachKernelSchedulerNode.can_fuseQ  s<  ø€ å˜ (Ñ+Ô+ˆØ×ÒÑ Ô ð &	 X×%8Ò%8Ñ%:Ô%:ð &	Ý”{Õ#=¸xÑHÔHˆHÝ”{Õ#=¸xÑHÔHˆHÝ ¤Ñ0Ô0µC¸¼Ñ4HÔ4HÒHˆMØ ð 7Ø�Ð5Ñ6Ô6Ð6Ø ð ¥Sð )ð )ð )ð )å ¤°´ÑAÔAð)ñ )ô )ñ &ô &ð ð × Ò Ñ"Ô"ð 	Ø×$Ò$Ñ&Ô&ð Ø�Ønñô ð ð �uå”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØÐ+ØÔ)×2Ò2°8Ð=MÑNÔNÐNàˆCÐGÑHÔHÐHØ�5à× Ò Ñ"Ô"ð 	Ø×$Ò$Ñ&Ô&ð Ø�Ønñô ð ð �uå”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØÐ+ØÔ)×2Ò2Ð3CÀXÑNÔNÐNàˆCÐGÑHÔHÐHØ�5åØfñ
ô 
ð 	
ru   c                óö  — |                      ¦   «         s|                      ¦   «         sJ ‚|                      ¦   «         r)t          j        t          |¦  «        }|j        }|j        }n(t          j        t          |¦  «        }|j        }|j        }d }d }|                      ¦   «         rn|                      ¦   «         rZt          j        t          |¦  «        }t          j        t          |¦  «        }d„ t          |j        |j        ¦  «        D ¦   «         }�nO|                      ¦   «         rŒt          j        t          |¦  «        }|                     |¦  «        }g }|}d }|j        D ]N}	|	|u r3t           
                    |	|¦  «        }
|
}|                     |
¦  «         Œ9|                     |	¦  «         ŒOn¯|                      ¦   «         rŒt          j        t          |¦  «        }|                     |¦  «        }g }|}d }|j        D ]N}	|	|u r3t           
                    ||	¦  «        }
|
}|                     |
¦  «         Œ9|                     |	¦  «         ŒOnt          d¦  «        ‚ | |j        |||||¬¦  «        S )Nc                óJ   — g | ] \  }}t                                ||¦  «        ‘Œ!S r…   )rÝ   rz   )r·   rt  ru  s      rs   r   z3ForeachKernelSchedulerNode.fuse.<locals>.<listcomp>“  s<   € ð ð ð á�A�qõ #×'Ò'¨¨1Ñ-Ô-ðð ð ru   zTAt least one node passed to ForeachKernelSchedulerNode.fuse should be a foreach node)Úuse_custom_partition_algoÚprev_node_1Úprev_node_2Úenable_autotune)rú  rÇ  rÈ  re  r|  r  r•  rÞ   rq  rÝ   rz   rç   ri  rŠ  rä  )ry   rf  rj  r|  r  r}  r~  Úfused_nodesry  r”   Únew_noderx  s               rs   rz   zForeachKernelSchedulerNode.fuse€  s½  € ð ×"Ò"Ñ$Ô$Ð=¨×(;Ò(;Ñ(=Ô(=Ð=Ð=Ð=Ø×ÒÑ Ô ð 	7Ý”{Õ#=¸xÑHÔHˆHØ(0Ô(JÐ%Ø&Ô6ˆOˆOå”{Õ#=¸xÑHÔHˆHØ(0Ô(JÐ%Ø&Ô6ˆOØˆØˆà×ÒÑ Ô ð &	 X×%8Ò%8Ñ%:Ô%:ð &	Ý”{Õ#=¸xÑHÔHˆHÝ”{Õ#=¸xÑHÔHˆHðð å ¤°´ÑAÔAðñ ô ˆK‰Kð × Ò Ñ"Ô"ð 	Ý”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØˆKØ"ˆKØˆKØ œð -ð -�ØÐ+Ð+Ð+Ý1×6Ò6°t¸XÑFÔF�HØ"*�KØ×&Ò& xÑ0Ô0Ð0Ð0à×&Ò& tÑ,Ô,Ð,Ð,ð-ð × Ò Ñ"Ô"ð 	Ý”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØˆKØ"ˆKØˆKà œð -ð -�ØÐ+Ð+Ð+Ý1×6Ò6°xÀÑFÔF�HØ"*�KØ×&Ò& xÑ0Ô0Ð0Ð0à×&Ò& tÑ,Ô,Ð,Ð,ð-õ !Øfñô ð ð ˆsØÔØØ&?Ø#Ø#Ø+ð
ñ 
ô 
ð 	
ru   NFrä  rã  rÞ   r¢  r|  r}  r~  r  Úper_subkernel_blocksr   c                ó¤  •‡ — i ‰ _         i ‰ _        |�|€ht          ¦   «                              ||¦  «         |D ]A}|j        j        D ]}	|‰ j         |	j        <   Œ|                     ¦   «         D ]}
|‰ j        |
<   ŒŒB�nÛ|‰ _        |‰ _	        d ‰ _
        g ‰ _        ‰                      t          j                             |j        |j        g¦  «        ¦  «         t!          ˆ fd„t!          j        |j        |j        ¦  «        D ¦   «         ¦  «        ‰ j        j        z
  ‰ _        t)          |j        |j        g¦  «        ‰ _        t-          |j        |j        g¦  «        ‰ _        t)          |j        |j        ¦  «        ‰ _        t-          |j        |j        ¦  «        ‰ _        |                     ¦   «         rt7          |t8          ¦  «        sJ ‚||}}nt7          |t8          ¦  «        sJ ‚||}}|j        ‰ _        ‰ j                             |j        ¦  «         |j        ‰ _        |                     ¦   «         D ]}
|‰ j        |
<   Œd„ ‰ j	        D ¦   «         ‰ _        |‰ _         |d          !                    ¦   «         }|sJ ‚|tE          j#        d¦  «        fff‰ _$        t!          tJ          j&        j'                 ¦   «         ‰ _(        |‰ _)        |‰ _*        d S )Nc              3  óR   •K  — | ]!}|j         ‰                     ¦   «         v¯|V — Œ"d S r   rÂ  rº  s     €rs   r¹   z6ForeachKernelSchedulerNode.__init__.<locals>.<genexpr>ä  sL   øè è € ð ð àð ”x t×'<Ò'<Ñ'>Ô'>Ð>Ð>ð	 ð ?Ð>Ð>Ð>ðð ru   c                óR   — i | ]$}|j                              ¦   «         D ]\  }}||“Œ	Œ%S r…   )r7  rÌ  )r·   r¿  r¢  Úvs       rs   rK  z7ForeachKernelSchedulerNode.__init__.<locals>.<dictcomp>  sW   € ð @ð @ð @Ø¸%Ô:O×:UÒ:UÑ:WÔ:Wð@ð @Ù26°!°Q��1ð@ð @ð @ð @ru   r   Úcombo_kernel)+rh  rm  r  rC  rØ   rÙ   rÚ   r  rä  rÞ   r”   rç  r‰  r/   rÄ  rÅ  r   rÆ  r<  ra  ra  r.  r`  r/  r,  r-  rú  r²   re  r  rþ  r7  r|  rª   r	  ÚExprrÇ   rp  ÚfxÚNoder4  r  r‚  )rr   rä  rÞ   r|  r}  r~  r  r‚  r”   r  rÚ   Úforeach_noder  rì  r  s   `             €rs   rC  z#ForeachKernelSchedulerNode.__init__Á  s"  øø€ ð ˆÔØˆÔàÐ +Ð"5Ý‰GŒG×Ò˜Y¨Ñ/Ô/Ð/àð 3ð 3�Ø Ô,Ô2ð 8ð 8�DØ37�DÔ% d¤iÑ0Ð0à ×4Ò4Ñ6Ô6ð 3ð 3�DØ.2�DÔ% dÑ+Ð+ð3ñ	3ð 'ˆDŒNØ ˆDŒKØˆDŒIØ)+ˆDŒJà× Ò ÝÔ'×2Ò2Ø Ô,¨kÔ.EÐFñô ñô ð õ ð ð ð ð å)Ô/Ø#Ô6¸Ô8Vñ ô  ðñ ô ñ ô ð Ô"Ô)ñ*ð Ô#õ ! +Ô"7¸Ô9NÐ!OÑPÔPˆDŒNÝ  +Ô"7¸Ô9NÐ!OÑPÔPˆDŒNÝ&)ØÔ.°Ô0Nñ'ô 'ˆDÔ#õ '*ØÔ.°Ô0Nñ'ô 'ˆDÔ#ð ×%Ò%Ñ'Ô'ð DÝ! +Õ/IÑJÔJÐJÐJÐJØ+6¸˜j��å! +Õ/IÑJÔJÐJÐJÐJØ+6¸˜j�à)Ô3ˆDŒNØŒN×!Ò! *Ô"6Ñ7Ô7Ð7à ,Ô 9ˆDÔØ"×6Ò6Ñ8Ô8ð 5ð 5�Ø*4�Ô! $Ñ'Ð'ð@ð @Ø"&¤+ð@ñ @ô @ˆDÔ ð *CˆÔ&Ø˜”×%Ò%Ñ'Ô'ˆØˆˆˆvØ¥¤
¨>Ñ :Ô :Ð<Ð>Ð?ˆŒ
Ý!¥%¤(¤-Ô0Ñ2Ô2ˆŒØ.ˆÔØ$8ˆÔ!Ð!Ð!ru   rw  c                ó�  ‡	— d„ |D ¦   «         }|r3t                                dt          |¦  «        d„ |D ¦   «         ¦  «         d„ |D ¦   «         }|r(t                                dt          |¦  «        ¦  «         d„ |D ¦   «         }|r(t                                dt          |¦  «        ¦  «         d„ |D ¦   «         }|r(t                                d	t          |¦  «        ¦  «         d
„ |D ¦   «         }d„ |D ¦   «         }|r(t                                dt          |¦  «        ¦  «         d„ |D ¦   «         }d„ |D ¦   «         Š	‰	r)t                                dt          ‰	¦  «        ‰	¦  «         ˆ	fd„|D ¦   «         }t          j        rBd„ |D ¦   «         }|r(t                                dt          |¦  «        ¦  «         d„ |D ¦   «         }|S )Nc                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r…   )r²   rd  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s(   € ÐOÐOÐO˜¥j°Õ4MÑ&NÔ&NÐO�!ÐOÐOÐOru   z/ComboKernels: %d external nodes are filtered %sc                óN   — g | ]"}|j         ®	|j                              ¦   «         ‘Œ#S r   ©r”   r.  rÒ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s-   € ÐUÐUÐU¨T¸t¼yÐ?T�”×&Ò&Ñ(Ô(Ð?TÐ?TÐ?Tru   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r…   )r²   rÓ  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s(   € ÐKÐKÐK˜¥z°!Õ5IÑ'JÔ'JÐK�1ÐKÐKÐKru   z+ComboKernels: %d grouped nodes are filteredc                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r…   )r²   r"  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>"  s(   € ÐPÐPÐP˜1­°AÕ7NÑ)OÔ)OÐP�QÐPÐPÐPru   z;ComboKernels: %d FusedMixOrderReductions nodes are filteredc                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r…   )r²   rA  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>(  s(   € ÐVÐVÐV 1µ¸AÕ?TÑ1UÔ1UÐV˜QÐVÐVÐVru   z9ComboKernels: %d FusedNestedReductions nodes are filteredc           
     ón   — g | ]2}t          |t          t          t          t          t
          f¦  «        °0|‘Œ3S r…   )r²   r  rd  rÓ  r"  rA  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>/  sO   € ð 
ð 
ð 
àÝØå*Ý-Ý(Ý+Ý)ðñ	ô 	ð
Øð
ð 
ð 
ru   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r…   ©r²   re  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>=  s8   € ð 
ð 
ð 
Ø­°AÕ7QÑ)RÔ)Rð
Øð
ð 
ð 
ru   z+ComboKernels: %d foreach nodes are filteredc                ó<   — g | ]}t          |t          ¦  «        °|‘ŒS r…   r•  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>B  s8   € ð 
ð 
ð 
Ø­Z¸Õ;UÑ-VÔ-Vð
Øð
ð 
ð 
ru   c                ó:   — g | ]}|                      ¦   «         ¯|‘ŒS r…   r¦  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>E  s%   € ÐGÐGÐG °q·}²}±´ÐG˜!ÐGÐGÐGru   z0ComboKernels: %d template nodes are filtered: %sc                ó   •— g | ]}|‰v¯|‘Œ	S r…   r…   )r·   r“  Útemplate_nodess     €rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>L  s#   ø€ ÐOÐOÐO °qÀÐ7NÐ7N˜!Ð7NÐ7NÐ7Nru   c                ó:   — g | ]}|                      ¦   «         ¯|‘ŒS r…   r]  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>P  s'   € ÐMÐMÐM Q¸A¿NºNÑ<LÔ<LÐM˜qÐMÐMÐMru   zCComboKernels: %d reduction nodes are filtered (pointwise_only mode)c                ó:   — g | ]}|                      ¦   «         °|‘ŒS r…   r]  rÀ  s     rs   r   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>V  s'   € ÐPÐPÐP A¸q¿~º~Ñ?OÔ?OÐP˜aÐPÐPÐPru   )rd  ró  rÏ   r-   Úcombo_kernels_pointwise_only)
ry   rw  ÚexternÚgroupedÚ	mix_orderÚnested_reductionsÚfiltered_nodesÚforeach_nodesÚreduction_nodesr™  s
            @rs   Úcombinable_nodesz+ForeachKernelSchedulerNode.combinable_nodes  sd  ø€ ð PÐO˜UÐOÑOÔOˆØð 	Ý�IŠIØAÝ�F‘”ØUÐU°VÐUÑUÔUñô ð ð
 LÐK˜eÐKÑKÔKˆØð 	Ý�IŠIØ=Ý�G‘”ñô ð ð QÐP ÐPÑPÔPˆ	Øð 	Ý�IŠIØMÝ�I‘”ñô ð ð WÐV¨ÐVÑVÔVÐØð 	Ý�IŠIØKÝÐ%Ñ&Ô&ñô ð ð

ð 
àð
ñ 
ô 
ˆð
ð 
Ø%ð
ñ 
ô 
ˆð ð 	YÝ�IŠIÐCÅSÈÑEWÔEWÑXÔXÐXð
ð 
Ø%ð
ñ 
ô 
ˆð HÐG ^ÐGÑGÔGˆØð 	Ý�IŠIØBÝ�NÑ#Ô#Øñô ð ð
 PÐOÐOÐO ^ÐOÑOÔOˆõ Ô.ð 	QØMÐM¨.ÐMÑMÔMˆOØð Ý—	’	ØYÝ˜Ñ(Ô(ñô ð ð QÐP¨ÐPÑPÔPˆNàÐru   úlist[list[BaseSchedulerNode]]c                óò  ‡
‡— |                       ¦   «         }g }t          j        Š
t          d„ |D ¦   «         ¦  «        }|D �]5}t	          t
          ¦  «        }|D ]b}|                     ¦   «         }|r|j        dk    s|j        dk    rŒ/|                     ¦   «         |z  rŒG||          	                    |¦  «         Œc| 
                    ¦   «         D ]¤}t	          t
          ¦  «        }	|D ]6}|	| j                             |d¦  «                  	                    |¦  «         Œ7|	 
                    ¦   «         D ]@Š|                     ˆ
ˆfd„t          dt          ‰¦  «        ‰
¦  «        D ¦   «         ¦  «         ŒAŒ¥�Œ7|S )zS
        Returns a list of lists of nodes that are to be grouped together.
        c                ót   — g | ]5}|D ]0}t          |t          ¦  «        ¯|                     ¦   «         D ]}|‘ŒŒ1Œ6S r…   )r²   r"  rÖ  )r·   rÇ   r”   rä  s       rs   r   zUForeachKernelSchedulerNode._default_group_nodes_for_combo_kernels.<locals>.<listcomp>f  sw   € ð ð ð àØ!ðð ð Ý˜dÕ$;Ñ<Ô<ð	ð
 !%× 5Ò 5Ñ 7Ô 7ðð ð
 ð	 ðð ð ð ð ru   Úmpsrê  r   c                ó*   •— g | ]}‰||‰z   …         ‘ŒS r…   r…   )r·   r¨  Úmax_num_nodesÚstream_nodess     €€rs   r   zUForeachKernelSchedulerNode._default_group_nodes_for_combo_kernels.<locals>.<listcomp>†  s8   ø€ ð ð ð à !ð )¨¨Q°Ñ->Ð)>Ô?ðð ð ru   )Ú_topological_sort_nodesr-   Úcombo_kernel_max_num_nodesr   r   r¥   rª   r«   ræ   rç   rà   Únode_to_streamr¾  rµ  rg  rÏ   )rä  Úsorted_nodesÚgrouped_nodesÚexcluded_buffer_namesrw  Údevice_groupsr”   rì  Údevice_nodesÚstream_groupsrª  r«  s             @@rs   Ú&_default_group_nodes_for_combo_kernelszAForeachKernelSchedulerNode._default_group_nodes_for_combo_kernelsZ  sæ  øø€ ð !×8Ò8Ñ:Ô:ˆØˆÝÔ9ˆå1;ðð à)ðñ ô ñ2
ô 2
Ðð "ð 	ñ 	ˆEõ �DÑ!Ô!ð ð ð 3ð 3�ØŸšÑ*Ô*�Øð ˜vœ{¨eÒ3Ð3°v´{ÀeÒ7KÐ7KØð ×)Ò)Ñ+Ô+Ð.CÑCð ØØ˜fÔ%×,Ò,¨TÑ2Ô2Ð2Ð2ð
 !.× 4Ò 4Ñ 6Ô 6ð 
ð 
�ÝDOÕPTÑDUÔDU�Ø(ð Vð V�DØ! )Ô":×">Ò">¸tÀQÑ"GÔ"GÔH×OÒOÐPTÑUÔUÐUÐUØ$1×$8Ò$8Ñ$:Ô$:ð ð �LØ!×(Ò(ðð ð ð ð å%*¨1­c°,Ñ.?Ô.?ÀÑ%OÔ%Oðñ ô ñô ð ð ðñ	
ð Ðru   ú4Callable[[Scheduler], list[list[BaseSchedulerNode]]]Ú!group_algorithm_for_combo_kernelsÚcustom_group_algorithmc                ó   — | t           _        d S r   ©re  r·  )r¸  s    rs   Ú%set_group_algorithm_for_combo_kernelsz@ForeachKernelSchedulerNode.set_group_algorithm_for_combo_kernels‘  s   € ð
 #õ 	#ÔDÐDÐDru   c                ó6   — t                                | ¦  «        S r   rº  ©rä  s    rs   Úgroup_nodes_for_combo_kernelsz8ForeachKernelSchedulerNode.group_nodes_for_combo_kernels™  s   € õ *×KÒKÈIÑVÔVÐVru   c                ó   — t           ‚r   r  rq   s    rs   r§  z#ForeachKernelSchedulerNode.mark_runŸ  r  ru   c                ó   — t           ‚r   r  rq   s    rs   r  z"ForeachKernelSchedulerNode.codegen¢  r  ru   c                ó   — dS r  r…   rq   s    rs   rú  z%ForeachKernelSchedulerNode.is_foreach¥  rœ  ru   c                ó*   — t          | j        ¦  «        S )zeReturns a list of nodes which comprise the combo kernel.
        These nodes may be vertically fused.)r¥   rÞ   rq   s    rs   Úget_subkernel_nodesz.ForeachKernelSchedulerNode.get_subkernel_nodes¨  s   € õ �D”KÑ Ô Ð ru   rx  c                óx   — t          t          j                             d„ | j        D ¦   «         ¦  «        ¦  «        S )zqReturns all nodes contained in this kernel, unpacking fused nodes
        into their constituent scheduler nodes.c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )r»   rÀ  s     rs   r¹   z7ForeachKernelSchedulerNode.get_nodes.<locals>.<genexpr>°  s*   è è € Ð1UÐ1UÀA°!·+²+±-´-Ð1UÐ1UÐ1UÐ1UÐ1UÐ1Uru   )r¥   rª  r«  r–  rÞ   rq   s    rs   r»   z$ForeachKernelSchedulerNode.get_nodes­  s3   € õ •I”O×1Ò1Ð1UÐ1UÈÌÐ1UÑ1UÔ1UÑUÔUÑVÔVÐVru   rÖ   c                ó@   — | j         d                              ¦   «         S rì   )rÞ   rÏ  rq   s    rs   rÏ  z)ForeachKernelSchedulerNode.get_first_name²  s   € ØŒ{˜1Œ~×,Ò,Ñ.Ô.Ð.ru   rÇ  rÈ  c                óz   — t          | || j        j        ¦  «         | j        D ]}|                     |¦  «         Œd S r   )rÊ  rä  r  rÞ   rË  )rr   rÇ  r”   s      rs   rË  z/ForeachKernelSchedulerNode.prune_redundant_depsµ  sO   € õ 	˜dÐ$6¸¼Ô8RÑSÔSÐSà”Kð 	:ð 	:ˆDØ×%Ò%Ð&8Ñ9Ô9Ð9Ð9ð	:ð 	:ru   )rf  rf   rŠ   r´  )rj  rf   rŠ   r´  ©rf  rf   rj  rf   rŠ   rv   )rf  rf   rj  rf   rŠ   re  )NNFF)rä  rã  rÞ   r¢  r|  rv   r}  r´  r~  r´  r  rv   r‚  rv   rŠ   r   ©rw  r¢  rŠ   r¢  )rä  rã  rŠ   r¥  )r¸  r¶  rŠ   r   r$  r%  ©rŠ   r¢  rµ  r"  r´  )r€   r�   r‚   r•   ri  rq  r„   r  rz   rC  r¤  r2  rµ  r·  rƒ   r»  r¾  r§  r  rú  rÃ  r»   rÏ  rË  r(  r)  s   @rs   re  re  /  s  ø€ € € € € € ðð ð
ð ð ð ðð ð ð ð& ð,
ð ,
ð ,
ñ „[ð,
ð\ ð>
ð >
ð >
ñ „[ð>
ðJ 15Ø04Ø %Ø%*ðN9ð N9ð N9ð N9ð N9ð N9ð N9ð` ðFð Fð Fñ „[ðFðP ð0ð 0ð 0ñ „\ð0ðh 	/ð &ð /ð /ð /ñ /ð ð
ð 
ð 
ñ „\ð
ð ðWð Wð Wñ „\ðWð
"ð "ð "ð "ð"ð "ð "ð "ðð ð ð ð!ð !ð !ð !ð
Wð Wð Wð Wð
/ð /ð /ð /ð:ð :ð :ð :ð :ð :ð :ð :ru   re  c                  óÜ   ‡ — e Zd ZU dZded<   ed"d„¦   «         Z	 d#d$ˆ fd„Zd%d„Zd&d„Z	e
d'd„¦   «         Zd'd„Ze
d(d„¦   «         Zd)d„Ze
d*d„¦   «         Zd+d„Zd,d„Zed-d!„¦   «         Zˆ xZS ).rÓ  aC  
    This is a "fake" scheduler node that represents a group of scheduler nodes
    that are meant to be *grouped* together (it does not allow another node to be scheduled
    in between its constituent nodes, nor does it allow another node to fuse into any of its constituent nodes).
    The way it does this is by maintaining its unmet dependencies as the union of its constituent nodes.
    Fusion will still happen among the nodes within each GroupedSchedulerNode.
    At codegen time, this scheduler node will be unpacked and codegen is called on each constituent node.
    r¢  rÞ   rŠ   c                óî   ‡— |d         j         Št          ˆfd„|D ¦   «         ¦  «        sJ ‚ | ‰|¦  «        }|D ]}|‰j        |                     ¦   «         <   Œ|‰j        |                     ¦   «         <   |S )Nr   c              3  ó*   •K  — | ]}|j         ‰u V — Œd S r   r½  )r·   r”   rä  s     €rs   r¹   z.GroupedSchedulerNode.create.<locals>.<genexpr>Í  s*   øè è € ÐBÐB°4�4”> YÐ.ÐBÐBÐBÐBÐBÐBru   )rä  rº   rÇ  rê  )ry   rÞ   Úgrouped_snoder¿  rä  s       @rs   ÚcreatezGroupedSchedulerNode.createÊ  s“   ø€ à˜1”IÔ'ˆ	ÝÐBÐBÐBÐB¸6ÐBÑBÔBÑBÔBÐBÐBÐBØ˜˜I vÑ.Ô.ˆØð 	Kð 	KˆEØ=JˆIÔ(¨¯ªÑ)9Ô)9Ñ:Ð:ØANˆ	Ô$ ]×%;Ò%;Ñ%=Ô%=Ñ>ØÐru   Frä  rã  Útemp_groupingrv   r   c                óz   •— t          ¦   «                              |¦  «         t          | ||¦  «         || _        d S r   )r  rC  rÔ  rÐ  )rr   rä  rÞ   rÐ  r  s       €rs   rC  zGroupedSchedulerNode.__init__Ô  s?   ø€ õ 	‰Œ×Ò˜Ñ#Ô#Ð#Ý˜˜i¨Ñ0Ô0Ð0ð +ˆÔÐÐru   c                óð   — | j         r| j        S | j        D ]#}|| j        j        |                     ¦   «         <   Œ$| j        j        |                      ¦   «         = | j                             | j        ¦  «        S )z�
        Do fusion among nodes within this GroupedSchedulerNode,
        and then unpack this GroupedSchedulerNode into regular nodes.
        )rÐ  rÞ   rä  rÇ  rê  Ú
fuse_nodes)rr   r¿  s     rs   ÚunpackzGroupedSchedulerNode.unpackã  ss   € ð
 Ôð 	Ø”;Ðà”[ð 	Hð 	HˆEØBGˆDŒNÔ-¨e¯nªnÑ.>Ô.>Ñ?Ð?ØŒNÔ-¨d¯mªm©o¬oÐ>ØŒ~×(Ò(¨¬Ñ5Ô5Ð5ru   Úfake_depr8   c                ó”   — |                       | j                             |¦  «        ¦  «         | j                             |¦  «         d S r   )r‰  rØ   rŽ  r<  r³  )rr   rÕ  s     rs   r�  z!GroupedSchedulerNode.add_fake_depð  sD   € Ø×Ò˜TÔ-×7Ò7¸ÑAÔAÑBÔBÐBØÔ×#Ò# HÑ-Ô-Ð-Ð-Ð-ru   rÖ   c                óJ   — d                      d„ | j        D ¦   «         ¦  «        S )Nr?  c                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   rI  rÀ  s     rs   r   z1GroupedSchedulerNode.get_name.<locals>.<listcomp>ö  rè  ru   ré  rq   s    rs   rê  zGroupedSchedulerNode.get_nameô  rê  ru   c                ó@   — | j         d                              ¦   «         S rì   rì  rq   s    rs   rÏ  z#GroupedSchedulerNode.get_first_nameø  rí  ru   r™   c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   rð  rÀ  s     rs   r   z9GroupedSchedulerNode.get_buffer_names.<locals>.<listcomp>ý  rñ  ru   rò  rq   s    rs   rÖ  z%GroupedSchedulerNode.get_buffer_namesû  ró  ru   r4  c                ól   — g }| j         D ])}|                     |                     ¦   «         ¦  «         Œ*|S r   rõ  rö  s      rs   rL  z GroupedSchedulerNode.get_outputsÿ  r÷  ru   rn  c                óÀ   — t          t          d d„ |                      ¦   «         D ¦   «         ¦  «        ¦  «        }t          |¦  «        dk    rd S t	          |¦  «        }|S )Nc              3  óŽ   K  — | ]@}|                      ¦   «         s|                     ¦   «         ¯*|                     ¦   «         V — ŒAd S r   rÜ  rÒ  s     rs   r¹   z6GroupedSchedulerNode.estimate_flops.<locals>.<genexpr>  rÝ  ru   r   rÞ  rà  s      rs   rx  z#GroupedSchedulerNode.estimate_flops  râ  ru   rx  c                ó   — | j         S r   rU  rq   s    rs   r»   zGroupedSchedulerNode.get_nodes  r‚  ru   r   c                óR   — | j         r| j         d                              ¦   «         nd S rì   )rÞ   rª   rq   s    rs   rª   zGroupedSchedulerNode.get_device  s&   € Ø.2¬kÐCˆtŒ{˜1Œ~×(Ò(Ñ*Ô*Ð*¸tÐCru   rf  rf   rj  c                ó   — dS r  r…   )ry   rf  rj  s      rs   r  zGroupedSchedulerNode.can_fuse  r�  ru   )rÞ   r¢  rŠ   rÓ  )F)rä  rã  rÞ   r¢  rÐ  rv   rŠ   r   rÊ  )rÕ  r8   rŠ   r   r"  r³  r   r¸  rµ  r'  rÈ  )r€   r�   r‚   r•   rƒ   r„   rÏ  rC  rÔ  r�  rO   rê  rÏ  rÖ  rL  rx  r»   rª   r  r(  r)  s   @rs   rÓ  rÓ  ¾  s  ø€ € € € € € ðð ð $Ð#Ð#Ñ#àðð ð ñ „[ðð $ð	+ð +ð +ð +ð +ð +ð +ð6ð 6ð 6ð 6ð.ð .ð .ð .ð ð=ð =ð =ñ „]ð=ð)ð )ð )ð )ð ðNð Nð Nñ „]ðNðð ð ð ð ðð ð ñ „]ðð"ð ð ð ðDð Dð Dð Dð ðð ð ñ „[ðð ð ð ð ru   rÓ  r…   Ústride_lengthsúlist[list[int]]r^  ra  Úpriority_idxrY  r¡   c           
     ó:  ‡ ‡— t           j        d	ˆˆ fd„¦   «         }t          t          t	          t          ‰ d         ¦  «        ¦  «        ¦  «        ¦  «        }t          |¦  «        dk    rˆ fd„|D ¦   «         Š t          j        r|                     |¬¦  «         |S )
z�
    A heuristic to decide loop iteration orders.  This has not been well
    tuned and may be something we should autotune.
    rÈ  r‘   ÚbrŠ   c                ó”  •‡ ‡— ‰‰          dk    s‰‰         dk    r$t          ‰‰          dk    ‰‰         dk    ¦  «        S ˆ fd„‰D ¦   «         }ˆfd„‰D ¦   «         }t          d„ t          ||¦  «        D ¦   «         ¦  «        }t          d„ t          ||¦  «        D ¦   «         ¦  «        }||k    rdS ||k    rdS t          ‰‰ ¦  «        S )Nr   c                ó:   •— g | ]}t          |‰         ¦  «        ‘ŒS r…   ©Úabs)r·   ÚslrÈ  s     €rs   r   z6pick_loop_order.<locals>.index_cmp.<locals>.<listcomp>5  ó#   ø€ Ð<Ð<Ð< r�˜B˜qœE™
œ
Ð<Ð<Ð<ru   c                ó:   •— g | ]}t          |‰         ¦  «        ‘ŒS r…   ré  )r·   rë  ræ  s     €rs   r   z6pick_loop_order.<locals>.index_cmp.<locals>.<listcomp>6  rì  ru   c              3  ó4   K  — | ]\  }}|d k    p||k     V — ŒdS ©r   Nr…   ©r·   Úsl_aÚsl_bs      rs   r¹   z5pick_loop_order.<locals>.index_cmp.<locals>.<genexpr>:  óD   è è € ð 
ð 
Ù)3¨¨tˆD�AŠIÐ$˜ šð
ð 
ð 
ð 
ð 
ð 
ru   c              3  ó4   K  — | ]\  }}|d k    p||k     V — ŒdS rï  r…   rð  s      rs   r¹   z5pick_loop_order.<locals>.index_cmp.<locals>.<genexpr>=  ró  ru   r!  )rP   rÿ   r•  )rÈ  ræ  Ústride_len_aÚstride_len_bÚa_firstÚb_firstr^  râ  s   ``    €€rs   Ú	index_cmpz"pick_loop_order.<locals>.index_cmp-  s  øøø€ à�Œ8�qŠ=ˆ=˜E !œH¨šM˜Må�u˜Q”x 1’} e¨A¤h°!¢mÑ4Ô4Ð4ð =Ð<Ð<Ð<¨^Ð<Ñ<Ô<ˆØ<Ð<Ð<Ð<¨^Ð<Ñ<Ô<ˆõ ð 
ð 
Ý7:¸<ÈÑ7VÔ7Vð
ñ 
ô 
ñ 
ô 
ˆõ ð 
ð 
Ý7:¸<ÈÑ7VÔ7Vð
ñ 
ô 
ñ 
ô 
ˆð �WÒÐØ�2Ø�WÒÐØ�1õ �1�a‰yŒyÐru   r   c                ó    •— g | ]
}‰|         ‘ŒS r…   r…   )r·   Úpirâ  s     €rs   r   z#pick_loop_order.<locals>.<listcomp>K  s   ø€ ÐDÐDÐD°˜.¨Ô,ÐDÐDÐDru   rú  )rÈ  r‘   ræ  r‘   rŠ   r‘   )	Ú	functoolsÚ
cmp_to_keyr¥   rÑ   rg  rÏ   r-   Úpick_loop_ordersÚsort)râ  r^  rä  rù  Úorders   ``   rs   Úpick_loop_orderr  #  s³   øø€ õ Ôðð ð ð ð ð ñ Ôðõ4 •�%¥ N°1Ô$5Ñ 6Ô 6Ñ7Ô7Ñ8Ô8Ñ9Ô9€EÝ
ˆ<ÑÔ˜1ÒÐàDÐDÐDÐD°|ÐDÑDÔDˆÝÔð "Ø�
Š
�yˆ
Ñ!Ô!Ð!Ø€Lru   Ú	orig_nodeúir.MultiTemplateBufferr�  úir.OperationBufferc                óz  — |                      ¦   «         }|                       ¦   «         }t          |t          ¦  «        rt          |t          ¦  «        sJ ‚|                     ¦   «         }|                      ¦   «         }t          |t          ¦  «        rt          |t          ¦  «        sJ ‚t          j        j        |= ||_        t          j        j        |= ||_	        t          j        j
                             | ¦  «        }t          j        j
                             |¦  «         |t          j        j
        |<   |t          j        j        |<   t          j        j                             | ¦  «        }t          j        j                             |¦  «         |t          j        j        |<   |t          j        j        |<   d S r   )rê  r²   rÖ   rÍ  ra   rÂ   r´  rÚ   Ú
name_to_opÚoperation_nameÚbuffersrÛ   rS  Ú
operations)r  r�  Úreplaced_buf_nameÚorig_buf_nameÚreplaced_op_nameÚorig_op_nameÚorigs          rs   Ú_replace_operation_bufferr  Q  sb  € ð !×)Ò)Ñ+Ô+ÐØ×&Ò&Ñ(Ô(€MÝ�m¥SÑ)Ô)ÐP­jÐ9JÍCÑ.PÔ.PÐPÐPÐPà×2Ò2Ñ4Ô4ÐØ×/Ò/Ñ1Ô1€LÝ�l¥CÑ(Ô(ÐN­ZÐ8HÍ#Ñ-NÔ-NÐNÐNÐNå	ŒÔÐ0Ð1Ø!€H„Må	ŒÔÐ+Ð,Ø*€HÔåŒ7Œ?× Ò  Ñ+Ô+€DÝ„G„O×Ò˜8Ñ$Ô$Ð$Ø$…A„G„O�DÑØ,4…A„GÔ˜=Ñ)åŒ7Ô×#Ò# IÑ.Ô.€DÝ„GÔ×Ò˜hÑ'Ô'Ð'Ø'…A„GÔ�tÑØ'/…A„GÔ�|Ñ$Ð$Ð$ru   ry  c                ó€   — |                       ¦   «         }|                     ¦   «         }||z
  }||z  }|d|z   z  }||z  S rl  )rC  rA  )rˆ   r‰   Úepilogue_runtimeÚtemplate_write_bytesÚepilogue_read_bytesÚextra_bytesÚextra_bytes_ratioÚextra_memory_ratios           rs   Ú _estimate_fused_epilogue_runtimer  m  s^   € Ø ×7Ò7Ñ9Ô9ÐØ×5Ò5Ñ7Ô7ÐØ%Ð(<Ñ<€Kð $Ð&:Ñ:Ðð +¨aÐ2CÑ.CÑDÐØÐ 0Ñ0Ð0ru   Úunfused_n_regsr‘   Úfused_n_regsÚfused_n_spillsÚ	num_warpsÚdevice_propsrH   útuple[int, int]c                ót   — |dk    rdS |j         }|€dS |sJ ‚||j        z  }| |z  }||z  }||z  }	||z  }
|	|
fS )Né   )r   r!  )r   r   )Úregs_per_multiprocessorÚwarp_size_or_default)r  r  r  r  r  Úregs_per_smÚthreads_per_blockÚregs_per_block_unfusedÚregs_per_block_fusedÚblocks_unfusedÚblocks_fuseds              rs   Ú"_occupancy_before_and_after_fusionr(  z  s{   € ð ˜ÒÐØˆuð Ô6€KØÐØˆtàÐÐˆ9Ø! LÔ$EÑEÐà+Ð.?Ñ?ÐØ'Ð*;Ñ;Ðà Ð$:Ñ:€NØÐ"6Ñ6€Là˜<Ð'Ð'ru   Úms1Úms2c                ó‚   — d}d}t          |||||¦  «        \  }	}
|d| z  k    o|
dk    }|
dk    o|
|k    p
|
|	z  |k    p|S )zE
    Determine whether to fuse an epilogue into a GEMM template.
    rü  g      à?rÎ   r   r!  )r(  )r)  r*  r  r  r  r  r  ÚMIN_ACCEPTED_OCCUPANCYÚREGRESSED_OCCUPANCY_RATIOr&  r'  Ú,epilogue_dominated_with_sufficient_occupancys               rs   Ú_fuse_epiloguer/  •  s…   € ð ÐØ #Ðõ $FØ˜ n°iÀñ$ô $Ñ €N�Lð 47¸¸S¹²=Ð3UÀ\ÐTUÒEUÐ0ð
 ˜2Òð ØÐ.Ò.ð 	8Ø˜.Ñ(Ð+DÒDð	8à7ðru   c                  óV   — e Zd ZU ded<   dZded<   dZded<   dd	„Zdd„Zdd„Zdd„Z	dS )rT  úBaseSchedulerNode | OutputNoder”   Frv   rÿ  Úis_weakrŠ   r‘   c                óh   — t          | j                             ¦   «         | j        | j        f¦  «        S r   )rî  r”   rê  rÿ  r2  rq   s    rs   rï  zNodeUser.__hash__¾  s*   € Ý�T”Y×'Ò'Ñ)Ô)¨4Ô+;¸T¼\ÐJÑKÔKÐKru   r4  Úobjectc                óÀ   — t          |t          ¦  «        oI|                      ¦   «         |                     ¦   «         k    o| j        |j        k    o| j        |j        k    S r   )r²   rT  rê  rÿ  r2  ©rr   r4  s     rs   Ú__eq__zNodeUser.__eq__Á  sY   € å�u�hÑ'Ô'ð .Ø—’‘” 5§>¢>Ñ#3Ô#3Ò3ð.àÔ  EÔ$5Ò5ð.ð ” ¤Ò-ð		
ru   rÖ   c                ó4   — | j                              ¦   «         S r   rþ  rq   s    rs   rê  zNodeUser.get_nameÉ  rÿ  ru   c                ó~   — | j         |j         u sJ ‚t          | j         | j        o|j        | j        o|j        ¦  «        S r   )r”   rT  rÿ  r2  r6  s     rs   r  zNodeUser.mergeÌ  sH   € ØŒy˜EœJÐ&Ð&Ð&Ð&ÝØŒIØÔÐ2 Ô!2ØŒLÐ*˜Uœ]ñ
ô 
ð 	
ru   Nr#  )r4  r4  rŠ   rv   r"  )r4  rT  rŠ   rT  )
r€   r�   r‚   rƒ   rÿ  r2  rï  r7  rê  r  r…   ru   rs   rT  rT  µ  sš   € € € € € € à(Ð(Ð(Ñ(Ø€KÐÐÐÑð €GÐÐÐÑðLð Lð Lð Lð
ð 
ð 
ð 
ð$ð $ð $ð $ð
ð 
ð 
ð 
ð 
ð 
ru   rT  ú	ir.IRNodeúOrderedSet[sympy.Symbol]c                óÂ  — t          ¦   «         }|                      ¦   «         }t          |t          j        ¦  «        r“|                     t          |j        ¦  «        t          |j        ¦  «        z  t          |j	        ¦  «        z  ¦  «         t          |t          j
        ¦  «        r'|                     t          |j        ¦  «        ¦  «         n|�J d|› �¦   «         ‚|S )z=Get free symbols from a node's layout (size, stride, offset).Nz*Expect layout to be None but found layout=)r   Úmaybe_get_layoutr²   r0   ÚLayoutrþ  r&   rß   ÚstrideÚoffsetr  Úget_layout_symintsr/  )r”   Úfree_symbol_usesrõ  s      rs   rA  rA  Ø  sÑ   € å1;±´ÐØ×"Ò"Ñ$Ô$€FÝ�&�"œ)Ñ$Ô$ð 
UØ×ÒÝ˜œÑ%Ô%Ý˜6œ=Ñ)Ô)ñ*å˜6œ=Ñ)Ô)ñ*ñ	
ô 	
ð 	
õ
 �f�bÔ;Ñ<Ô<ð 	Gà×#Ò#Õ$6°v´}Ñ$EÔ$EÑFÔFÐFøàˆ~ˆ~ÐTÈFÐTÐT‰~Œ~ˆ~ØÐru   c                ó  — t          | t          ¦  «        r% t          ¦   «         j        d„ | j        D ¦   «         Ž S | j        €J ‚| j                             ¦   «         } |j        d„ | j                             ¦   «         D ¦   «         Ž  |S )z‡
    Gets symbols used in a scheduler node, including free symbols from
    the node's operations and layout symints from outputs.
    c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   ©Úget_scheduler_node_symbol_uses)r·   r¿  s     rs   r¹   z1get_scheduler_node_symbol_uses.<locals>.<genexpr>ó  s+   è è € ÐMÐM¸Õ,¨UÑ3Ô3ÐMÐMÐMÐMÐMÐMru   Nc              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   )rA  )r·   Úir_nodes     rs   r¹   z1get_scheduler_node_symbol_uses.<locals>.<genexpr>ø  s+   è è € Ð	MÐ	M¨'Õ
˜WÑ
%Ô
%Ð	MÐ	MÐ	MÐ	MÐ	MÐ	Mru   )	r²   rÝ   r   rÆ  rÞ   r”   Úget_free_symbol_usesrþ  rL  )r”   rB  s     rs   rF  rF  ê  sž   € õ �$Õ*Ñ+Ô+ð 
Ø!�z‰|Œ|Ô!ØMÐMÀÄÐMÑMÔMð
ð 	
ð Œ9Ð Ð Ð Ø”y×5Ò5Ñ7Ô7ÐØÐÔØ	MÐ	M°T´Y×5JÒ5JÑ5LÔ5LÐ	MÑ	MÔ	Mðð ð Ðru   r­  c                ób   — |                       ¦   «         }|�|j        �|j        S t          j        S ©z4Check per-template flag, fall back to global config.)r›  Úallow_epilogue_fusionr-   Úepilogue_fusion©r­  Útbs     rs   Ú_is_epilogue_fusion_enabledrP  ý  ó2   € à	×	(Ò	(Ñ	*Ô	*€BØ	€~˜"Ô2Ð>ØÔ'Ð'ÝÔ!Ð!ru   ©Úcheck_configrS  c               óT  — |rt           j        sdS t          | t          ¦  «        sdS t          | j        t
          j        ¦  «        sdS t          | j        j        t
          j        ¦  «        sdS | j        j        j	        dk    rdS |  
                    ¦   «         }t          |¦  «        dk    rdS |d                              ¦   «         s+t          |d                              ¦   «         ¦  «        dk    rdS | j        j        }t!          |¦  «        ot#          d„ |D ¦   «         ¦  «        S )NFr²  r   r   c              3  óV   K  — | ]$}t          |t          ¦  «        o
|j        d k    V — Œ%dS )r²  N)r²   r9   r±  )r·   Úwrites     rs   r¹   z3_is_atomic_add_mutation_epilogue.<locals>.<genexpr>  sI   è è € ð  ð  ØHM�
�5�)Ñ$Ô$ÐC¨¬°|Ò)Cð ð  ð  ð  ð  ð  ru   )r-   Úepilogue_fusion_with_atomic_addr²   r³   r”   r0   r   rú   ÚScatterÚscatter_moderL  rÏ   rö  rø  rØ   ra  rv   rº   )r”   rS  r5  ra  s       rs   Ú _is_atomic_add_mutation_epiloguerZ    s.  € ð ð �FÔBð ØˆuÝ�d�MÑ*Ô*ð ØˆuÝ�d”i¥Ô!2Ñ3Ô3ð ØˆuÝ�d”i”n¥b¤jÑ1Ô1ð ØˆuØ„y„~Ô" lÒ2Ð2Øˆuà×ÒÑ Ô €GÝ
ˆ7�|„|�qÒÐØˆuØˆq„z×ÒÑÔð ¥3 w¨q¤z×'?Ò'?Ñ'AÔ'AÑ#BÔ#BÀaÒ#GÐ#GØˆuàÔÔ$€FÝ�‰<Œ<ð �Cð  ð  ØQWð ñ  ô  ñ ô ð ru   Úepilogue_nodec                ó|   — |                       ¦   «         }t          |t          j        ¦  «        ot	          |¦  «        S r   )r›  r²   r0   ÚTritonTemplateBufferrZ  )r­  r[  Útemplate_bufs      rs   Ú&_can_fuse_atomic_add_template_epiloguer_    s?   € ð !×2Ò2Ñ4Ô4€LÝØ•bÔ-ñô ð :å
*¨=Ñ
9Ô
9ð:ru   c                ób   — |                       ¦   «         }|�|j        �|j        S t          j        S rK  )r›  Úallow_prologue_fusionr-   Úprologue_fusionrN  s     rs   Ú_is_prologue_fusion_enabledrc  (  rQ  ru   c                ór   — |                       ¦   «         o#|                      ¦   «          ot          | ¦  «        S r   )rö  rP  r�   s     rs   Úis_epilogue_fusionre  0  ó=   € à×ÒÑÔð 	/Ø×!Ò!Ñ#Ô#Ð#ð	/å'¨Ñ.Ô.ðru   c                ór   — |                      ¦   «         o#|                       ¦   «          ot          |¦  «        S r   )rö  rc  r�   s     rs   Úis_prologue_fusionrh  8  rf  ru   c                óB   — t          | |¦  «        pt          | |¦  «        S r   )re  rh  r�   s     rs   Úis_template_fusionrj  @  s"   € Ý˜e UÑ+Ô+ÐOÕ/AÀ%ÈÑ/OÔ/OÐOru   c                ó*   — t          | |¦  «        r|n| S r   ©re  r�   s     rs   Útemplate_fusion_pw_noderm  D  s   € Ý& u¨eÑ4Ô4Ð?ˆ5ˆ5¸%Ð?ru   c                  ó¤   — e Zd ZU dZ ej        e¬¦  «        Zded<    ej        e¬¦  «        Z	ded<   e
dd
„¦   «         Zdd„Zdd„Zdd„Zdd„ZdS )Ú_LoopStateSnapshota  Captured loop state for a set of scheduler nodes, restorable on rollback.

    Stores both SchedulerNode loop state (body, sizes, deps) and
    FusedSchedulerNode group assignments, since the latter is reassigned
    directly after child reindexing and has no mutation listener.
    rŸ   z$dict[SchedulerNode, tuple[Any, ...]]Úscheduler_node_stateszdict[FusedSchedulerNode, Any]Úfused_node_groupsrw  r%  rŠ   c                óN   —  | ¦   «         }|D ]}|                      |¦  «         Œ|S )zDCapture scheduler-node boundaries and their mutable leaf loop state.)Úsnapshot_node)ry   rw  Úsnapshotr”   s       rs   rÏ  z_LoopStateSnapshot.createX  s:   € ð �3‘5”5ˆØð 	)ð 	)ˆDØ×"Ò" 4Ñ(Ô(Ð(Ð(Øˆru   r_  r³   r   c                óT   — || j         vsJ ‚|                     ¦   «         | j         |<   dS )z?Capture one leaf scheduler node before its first loop mutation.N)rp  rR  ©rr   r_  s     rs   Ú_snapshot_scheduler_nodez+_LoopStateSnapshot._snapshot_scheduler_node`  s5   € à˜Ô3Ð3Ð3Ð3Ð3Ø)+×)?Ò)?Ñ)AÔ)AˆÔ" 2Ñ&Ð&Ð&ru   r”   rÝ   c                ó:   — || j         vsJ ‚|j        | j         |<   dS )zACapture fused-node group metadata changed outside leaf listeners.N)rq  rÇ   rM  s     rs   Ú_snapshot_fused_nodez'_LoopStateSnapshot._snapshot_fused_nodee  s+   € à˜4Ô1Ð1Ð1Ð1Ð1Ø'+¤zˆÔ˜tÑ$Ð$Ð$ru   rf   c                óÜ   — t          |t          ¦  «        r|                      |¦  «         |                     ¦   «         D ],}t          |t          ¦  «        r|                      |¦  «         Œ-dS )zBCapture a scheduler node boundary and all mutable leaf loop state.N)r²   rÝ   ry  r»   r³   rw  )rr   r”   r_  s      rs   rs  z _LoopStateSnapshot.snapshot_nodej  ss   € å�dÕ.Ñ/Ô/ð 	,Ø×%Ò% dÑ+Ô+Ð+Ø—.’.Ñ"Ô"ð 	2ð 	2ˆBÝ˜"�mÑ,Ô,ð 2Ø×-Ò-¨bÑ1Ô1Ð1øð	2ð 	2ru   c                óØ   — | j                              ¦   «         D ]\  }}|                     |¦  «         Œ| j                             ¦   «         D ]\  }}||_        t          |¦  «         ŒdS )z>Restore all captured loop state and fused-node group metadata.N)rp  rÌ  rU  rq  rÇ   rÇ  )rr   r_  rS  r”   rÇ   s        rs   Úrestorez_LoopStateSnapshot.restorer  s   € àÔ3×9Ò9Ñ;Ô;ð 	)ð 	)‰IˆB�Ø×!Ò! %Ñ(Ô(Ð(Ð(ØÔ1×7Ò7Ñ9Ô9ð 	2ð 	2‰KˆD�%ØˆDŒJÝ+¨DÑ1Ô1Ð1Ð1ð	2ð 	2ru   N)rw  r%  rŠ   ro  ©r_  r³   rŠ   r   )r”   rÝ   rŠ   r   ©r”   rf   rŠ   r   r$  )r€   r�   r‚   r•   r£   r¤   r”  rp  rƒ   rq  r„   rÏ  rw  ry  rs  r|  r…   ru   rs   ro  ro  H  s   € € € € € € ðð ð CTÀ+ÔBSØðCñ Cô CÐð ð ð ñ ð 8I°{Ô7HØð8ñ 8ô 8Ðð ð ð ñ ð ðð ð ñ „[ððBð Bð Bð Bð
2ð 2ð 2ð 2ð
2ð 2ð 2ð 2ð2ð 2ð 2ð 2ð 2ð 2ru   ro  c                  óˆ   — e Zd ZU dZded<    ej        e¬¦  «        Zded<   dZ	ded	<   e
dd„¦   «         Zdd„Zdd„Zdd„ZdS )Ú_LoopMutationTrackera+  Rollback scope for speculative loop mutations during can_fuse().

    can_fuse() may speculatively reorder or reindex loops while evaluating
    whether a fusion is legal. If the final decision rejects the fusion,
    this tracker restores the original loop structure so later fusion
    candidates do not inherit a speculative layout chosen for a fusion
    that did not happen.

    The first active tracker for a SchedulerNode leaf owns that leaf's
    listener. Recursive can_fuse() calls reuse the outer listener instead of
    installing nested listeners, so the captured state is the original state at
    the outermost decision boundary.

    Usage: call finish(commit=True) to keep mutations, or finish(commit=False)
    to restore the original state. If no mutation occurred, finish() is a no-op.
    r%  rw  rŸ   zOrderedSet[SchedulerNode]Úwatched_nodesNz_LoopStateSnapshot | NonerS  rŠ   c                óâ   — t          |¦  «        } | t          |¦  «        ¬¦  «        }|D ]C}|                     ¦   «         D ],}t          |t          ¦  «        r|                     |¦  «         Œ-ŒD|S )z?Create a rollback scope and watch mutable leaf scheduler nodes.)rw  )r   rÐ   r»   r²   r³   Úwatch)ry   rw  ÚseenÚtrackerr”   r_  s         rs   rÏ  z_LoopMutationTracker.create”  s‚   € õ ˜%Ñ Ô ˆØ�#�E $™KœKÐ(Ñ(Ô(ˆØð 	&ð 	&ˆDØ—n’nÑ&Ô&ð &ð &�Ý˜b¥-Ñ0Ô0ð &Ø—M’M "Ñ%Ô%Ð%øð&ð ˆru   r_  r³   r   c                ód   — |j         �dS | j                             |¦  «         | j        |_         dS )z<Install this scope as the mutation listener for a leaf node.N)r1  r�  r³  Útrackrv  s     rs   rƒ  z_LoopMutationTracker.watchŸ  s7   € àÔ%Ð1àˆFØÔ×Ò˜rÑ"Ô"Ð"Ø%)¤ZˆÔ"Ð"Ð"ru   c                óv   — || j         v sJ ‚| j        �dS t                               | j        ¦  «        | _        dS )z?Lazily snapshot candidate roots when the first mutation occurs.N)r�  rS  ro  rÏ  rw  rv  s     rs   r‡  z_LoopMutationTracker.track§  s@   € à�TÔ'Ð'Ð'Ð'Ð'ØŒ:Ð!àˆFõ
 (×.Ò.¨t¬zÑ:Ô:ˆŒ
ˆ
ˆ
ru   Úrollbackrv   c               óp   — | j         D ]	}d|_        Œ
|r| j        €dS | j                             ¦   «          dS )z<Detach listeners and restore captured state if rolling back.N)r�  r1  rS  r|  )rr   r‰  r_  s      rs   Úfinishz_LoopMutationTracker.finish³  sM   € àÔ$ð 	.ð 	.ˆBØ)-ˆBÔ&Ð&Øð 	˜4œ:Ð-ØˆFØŒ
×ÒÑÔÐÐÐru   )rw  r%  rŠ   r€  r}  )r‰  rv   rŠ   r   )r€   r�   r‚   r•   rƒ   r£   r¤   r   r�  rS  r„   rÏ  rƒ  r‡  r‹  r…   ru   rs   r€  r€  {  sË   € € € € € € ðð ð" )Ð(Ð(Ñ(Ø/@¨{Ô/@Ø"ð0ñ 0ô 0€Mð ð ð ñ ð (,€EÐ+Ð+Ð+Ñ+àðð ð ñ „[ðð0ð 0ð 0ð 0ð
;ð 
;ð 
;ð 
;ðð ð ð ð ð ru   r€  c                  ó  ‡ — e Zd ZdZ�dd„Z�dˆ fd„Z�dd	„Z�dd
„Z�dd„Z�dd„Z	�d	d„Z
e�d
d„¦   «         Zej        �dd„¦   «         Z�dd„Z�dd„Z�dd„Z�dd„Z�dd„Z�dd„Z�dd „Z�dd#„Z�dd%„Z�dd&„Z�dd(„Z�dd*„Z�dd+„Z�dd,„Z�dd-„Z�dd.„Z�dd/„Z�dd2„Z	 �d�dd7„Z �dd;„Z!�dd>„Z"�dd?„Z#�ddD„Z$�ddF„Z%	 �d�ddH„Z&�ddL„Z'�ddM„Z(�ddP„Z)�ddS„Z*�ddV„Z+�dd]„Z,�d d^„Z-�d!da„Z.�d"db„Z/e0�d#dg„¦   «         Z1�d�d$di„Z2�d%dk„Z3�d&dp„Z4�d'du„Z5�d(dv„Z6�d)dw„Z7�d*dx„Z8�d*dy„Z9�d+d{„Z:�d*d|„Z;�d,d„Z<�d-d€„Z=�d-d�„Z>�d-d‚„Z?�d*dƒ„Z@�d.d„„ZA�d/d‰„ZB�d0d‹„ZC�d1d�„ZD�d2d‘„ZE�d3d—„ZF	 	 �d4�d5d›„ZG	 	 �d4�d5dœ„ZH	 	 	 �d6�d7dž„ZId3dŸœ�d8d „ZJ�d9d£„ZKe0�d:d§„¦   «         ZLd˜d¨œ�d;d«„ZM�d:d¬„ZNe0�d:d­„¦   «         ZO�d<d±„ZPe0�d=d´„¦   «         ZQ�d>�d?d·„ZR	 	 �d@�dAd¸„ZS	 	 �d@�dBd¹„ZTeU	 	 	 �dC�dDd½„¦   «         ZVeU	 	 	 �dC�dEdÀ„¦   «         ZV	 	 	 �dF�dGdÂ„ZV�d*dÃ„ZW�d-dÄ„ZX�dHdÅ„ZY�dIdÈ„ZZ�ddÉ„Z[�ddÊ„Z\�ddË„Z]�dJdÍ„Z^�dKdÏ„Z_�dLdÐ„Z`�dMdÑ„Za�dNdÔ„Zb�dOdÕ„Zced�dPd×„¦   «         Ze�dOdØ„Zf�dQdÚ„Zg�dRdÝ„Zh�dSdá„Zi�dTdæ„Zj�dUdê„Zk�ddë„Zl�ddì„Zm�ddí„Zn�dVdï„Zo�dWdð„Zp�dMdñ„Zq�ddò„Zr�dXdó„Zs�dYdõ„Zt�dWdö„Zu�dd÷„Zv�d(dø„Zw�dZdú„Zx�d[dû„Zy�d\dý„Zz�ddþ„Z{e�d]dÿ„¦   «         Z|e�d^�d „¦   «         Z}�dM�d„Z~�d�d„Z�dM�d„Z€ˆ xZ�S (_  rã  z�
    A Scheduler is a graph of BaseSchedulerNodes. It is responsible for
    optimizations such as fusion, reorder, and graph partition.
    rw  úlist[ir.Operation]rŠ   r   c                ó€   — t          d¦  «        5  |                      |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NzScheduler.__init__)r   Ú_init©rr   rw  s     rs   rC  zScheduler.__init__Â  s‡   € ÝÐ.Ñ/Ô/ð 	ð 	Ø�JŠJ�uÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   �3³7º7c           
     óB  •‡ — t          ¦   «                              ¦   «          ‰ t          j        _        i ‰ _        t          t          ¦  «        ‰ _        t          j
        ¦   «         ‰ _        t          ¦   «         ‰ _        t          g t          j        j                             ¦   «         ¢t          j        j                             ¦   «         ¢t          j        j                             ¦   «         ¢¦  «        ‰ _        ˆ fd„|D ¦   «         ‰ _        d ‰ _        d ‰ _        ‰                      ¦   «          ‰ j                             t          j        j                             ¦   «         ¦  «         ‰ j        D ]}|                     ¦   «          Œd ‰ _        ‰                      ¦   «         ‰ _        d„ ‰ j        D ¦   «         ‰ _        d„ ‰ j        D ¦   «         ‰ _        ‰ j                             ¦   «         ‰ _        i ‰ _         i ‰ _!        t          ¦   «         ‰ _"        tG          j$        ‰ j        ‰ j        ‰ j        ¦  «        ‰ _        ‰  %                    ¦   «          ‰  &                    ‰ j        ¦  «        ‰ _        ‰  '                    ¦   «          d„ ‰ j        D ¦   «         ‰ _        ‰  (                    ¦   «          ‰  )                    ¦   «          tT          xj+        tY          ‰ j        ¦  «        z  c_+        ddl-m.}m/}  |‰ j        ¦  «         tY          ‰ j        ¦  «        ‰ _0        ‰  1                    ¦   «          ‰  &                    ‰ j        ¦  «        ‰ _        t          td          tf          tf          f                  ¦   «         ‰ _4        tj          j6        �tk          j6        ‰ j        ¦  «        ‰ _        tj          j7        r/ddl8m9} | :                    ‰ ¦  «         ‰  (                    ¦   «          i ‰ _;        i ‰ _<        d	‰ _=        i ‰ _>        ‰  ?                    ¦   «          ‰  @                    ‰ j        ¦  «        ‰ _        tj          jA        �tk          jA        ‰ j        ¦  «        ‰ _        t…          d
„ ‰ j        D ¦   «         ¦  «        r‰  '                    ¦   «          ‰  C                    ¦   «          ‰  D                    ¦   «          tj          jE        stj          jF        r6t�          ¦   «         r(t�          jI        jJ        jK         L                    ¦   «          tj          jM        r@t�          ddd¬¦  «        5  ‰  O                    d ¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰  P                    ¦   «          tj          jQ        r€ddlRmQ}  |‰ j        ‰ j        ‰ j        t          t          j        j                             ¦   «         ¦  «        t          t          j         S                    ¦   «         ¦  «        ¦  «        ‰ _        tj          jT        s¾tj          jU        r²tj          jQ        sddlRmV}  |‰ j        ‰ j        ¦  «         t®          jX        r<d	}‰ j        D ]}t³          |jZ        ¦  «        rd} nŒ|rddl#m[}	  |	‰ j        ¦  «         t®          j\        rddl]m^}
  |
dd„ ˆ fd„¬¦  «         tG          j_        ‰ j        ¦  «        ‰ _        ‰  `                    ¦   «          tj          ja        r`tj          jb        jc        rOtj          jb        jd        r>‰  e                    ‰ j        ¦  «        ‰ _        ‰  f                    ‰ j        ¦  «        ‰ _        ‰  g                    ¦   «          t�          jI        j5        jh        ji        r‰  j                    ¦   «           |‰ j        ¦  «         t          jk         l                    ‰ j        ¦  «         ‰  m                    ¦   «          t          ¦   «         ‰ _n        i ‰ _o        d ‰ _p        tã          d¦  «         r                    ˆ fd„¦  «         t          ¦   «         ‰ _s        d S )Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r…   )Úcreate_scheduler_node©r·   rÜ  rr   s     €rs   r   z#Scheduler._init.<locals>.<listcomp>Õ  s'   ø€ ÐCÐCÐC¸�d×0Ò0°Ñ3Ô3ÐCÐCÐCru   c                ó8   — i | ]}|                      ¦   «         |“ŒS r…   rI  rÛ  s     rs   rK  z#Scheduler._init.<locals>.<dictcomp>ä  s/   € ð ;
ð ;
ð ;
Ø !ˆA�JŠJ‰LŒL˜!ð;
ð ;
ð ;
ru   c                óf   — i | ].}|                      ¦   «         D ]}|                     ¦   «         |“ŒŒ/S r…   )rL  rê  )r·   r”   rÕ   s      rs   rK  z#Scheduler._init.<locals>.<dictcomp>è  sO   € ð 8
ð 8
ð 8
Ø$(À$×BRÒBRÑBTÔBTð8
ð 8
Ø;>ˆC�LŠL‰NŒN˜Cð8
ð 8
ð 8
ð 8
ru   c                ó8   — i | ]}|                      ¦   «         |“ŒS r…   rI  rÛ  s     rs   rK  z#Scheduler._init.<locals>.<dictcomp>  s"   € Ð"GÐ"GÐ"G°q 1§:¢:¡<¤<°Ð"GÐ"GÐ"Gru   r   )Úlog_ir_post_fusionÚlog_ir_pre_fusionr   )Údistributed_autotuneFc              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   )r²   rM  rÒ  s     rs   r¹   z"Scheduler._init.<locals>.<genexpr>/  sA   è è € ð 
ð 
àõ �tÕAÑBÔBð
ð 
ð 
ð 
ð 
ð 
ru   z#Scheduler.create_combo_kernel_nodesT©Úlog_pt2_compile_eventÚlog_waitcounter)Únum_ck_nodes)Úreorder_for_peak_memory)Ú1assign_memory_planning_info_for_scheduler_buffers)Ú6align_runtime_estimations_across_all_distributed_ranks)Útrace_structuredÚartifactc                 ó   — dddœS )NÚ#scheduler_nodes_before_comm_overlapÚstring)rÚ   Úencodingr…   r…   ru   rs   rA  z!Scheduler._init.<locals>.<lambda>u  s   € Ø EØ$,ð)ð )€ ru   c                 óf   •— d                      d„ t          ‰ j        ¦  «        D ¦   «         ¦  «        S )Nz

c                óz   — g | ]8\  }}d |› d�|                      ¦   «         z   d|                     ¦   «         › �z   ‘Œ9S )zsnode[ró  z buffer_names:)rü  rÖ  r§  s      rs   r   z5Scheduler._init.<locals>.<lambda>.<locals>.<listcomp>z  sc   € ð ð ð ñ !%  1ð * Q˜M˜M˜MØŸkšk™mœmñ,àE¨q×/AÒ/AÑ/CÔ/CÐEÐEñFðð ð ru   )r  rª  rw  rq   s   €rs   rA  z!Scheduler._init.<locals>.<lambda>y  s=   ø€  v§{¢{ðð õ )2°$´*Ñ(=Ô(=ð	ñ ô ñ(ô (€ ru   )Úmetadata_fnÚ
payload_fnÚgraph_statsc                 óH   •— ‰ j         ‰ j        t          ‰ j        ¦  «        dœS )N)Úgraph_idÚnum_nodes_before_fusionÚnum_nodes_after_fusion)Úpost_grad_graph_idÚnum_orig_nodesrÏ   rw  rq   s   €rs   rA  z!Scheduler._init.<locals>.<lambda>¥  s&   ø€ Ø Ô3Ø+/Ô+>Ý*-¨d¬j©/¬/ðð € ru   )tr  rC  ra   rÂ   rä  Úbackendsr©  Ú_post_grad_graph_counterr²  rª  ÚcountÚ_graph_partition_counterr   r  rj  r'  Ú	constantsÚtorchbind_constantsr¹  rw  Úprevious_nodeÚcurrent_nodeÚupdate_zero_dim_cpu_tensorrþ  r—  Údefault_device_contextÚget_donated_buffersr  rm  r  ÚcopyrÇ  rŸ  r2  Úseen_template_fusionsr,   Údecide_global_ordering_of_commsrd   Útopological_sort_scheduleÚdead_node_eliminationÚcompute_ancestorsÚcompute_input_distancesr1   Úir_nodes_pre_fusionrÏ   Útorch._inductor.debugr˜  r™  r³  Úcreate_foreach_nodesrÐ   rÖ   Úlogged_slow_fusionr-   Ú_pre_fusion_custom_passÚdistributed_max_autotune_gemmrh  rš  Úscheduler®  Úbuff_to_streamÚ_multi_stream_nodesÚstream_idx_to_user_obj_idxÚ_populate_stream_assignmentsrÓ  Ú_post_fusion_custom_passr  rw  Úfinalize_multi_template_buffersÚmax_autotune_gemmÚmax_autotuner   rp  rq  Úselect_algorithmÚPrecompileThreadPoolÚshutdown_instanceÚcombo_kernelsr   Úcreate_combo_kernel_nodesÚ_enforce_conditional_orderingr   ÚmemoryÚget_output_namesÚdeterministicÚ reorder_for_compute_comm_overlapr¡  r.   Ú6runtime_estimations_align_across_all_distributed_ranksrY   r”   r¢  Úreorder_sink_verbose_loggingÚtorch._loggingr£  Ú$reorder_compute_and_comm_for_overlapÚprocess_grouped_nodesÚgraph_partitionr©   re   Ú%reorder_for_reducing_graph_partitionsÚ&maybe_reorder_for_minimizing_partitionÚ,reorder_for_partition_with_simple_dependencyÚcompute_last_usageÚtest_configsÚtrack_memory_lifecycleÚinsert_memory_check_nodesró  Úgraph_diagramÚdebug_draw_graphÚbuffer_names_to_freeÚorigin_to_indexÚ_current_stream_ctxr#   Úadd_rowÚremoved_ops)rr   rw  r”   r˜  r™  rš  r   r¡  Úhas_collectivesr¢  r£  r  s   `          €rs   r�  zScheduler._initÆ  sp  øø€ Ý‰Œ×ÒÑÔÐØ �ŒÔØ<>ˆŒÝ"&Õ'?Ñ"@Ô"@ˆÔÝ(1¬Ñ(9Ô(9ˆÔ%å5?±\´\ˆÔ!Ý&0ðÝ”Ô%×*Ò*Ñ,Ô,ðå”Ô"×'Ò'Ñ)Ô)ðõ ”Ô,×1Ò1Ñ3Ô3ðñ'
ô '
ˆÔ#ð DÐCÐCÐC¸UÐCÑCÔCˆŒ
Ø7;ˆÔØ6:ˆÔØ×'Ò'Ñ)Ô)Ð)àÔ#×*Ò*­1¬7Ô+<×+AÒ+AÑ+CÔ+CÑDÔDÐDØ”Jð 	ð 	ˆDØ�OŠOÑÔÐÐð <@ˆÔ#ð ×$Ò$Ñ&Ô&ð 	Ô#ð;
ð ;
Ø%)¤Zð;
ñ ;
ô ;
ˆÔð8
ð 8
Ø,0¬Jð8
ñ 8
ô 8
ˆÔð AEÔ@Q×@VÒ@VÑ@XÔ@XˆÔð 35ˆÔð 13ˆÔõ ‰LŒLð 	Ô"õ
 Ô:ØŒJØÔØÔ#ñ
ô 
ˆŒ
ð 	×!Ò!Ñ#Ô#Ð#Ø×3Ò3°D´JÑ?Ô?ˆŒ
Ø×"Ò"Ñ$Ô$Ð$Ø"GÐ"G¸D¼JÐ"GÑ"GÔ"GˆÔØ×ÒÑ Ô Ð Ø×$Ò$Ñ&Ô&Ð&õ 	Ð#Ô#¥s¨4¬:¡¤Ñ6Ð#Ô#ØOÐOÐOÐOÐOÐOÐOÐOàÐ˜$œ*Ñ%Ô%Ð%Ý! $¤*™oœoˆÔØ×!Ò!Ñ#Ô#Ð#Ø×3Ò3°D´JÑ?Ô?ˆŒ
Ý",­Uµ3½°8¬_Ô"=Ñ"?Ô"?ˆÔÝÔ)Ð5ÝÔ7¸¼
ÑCÔCˆDŒJåÔ/ð 	%Ø.Ð.Ð.Ð.Ð.Ð.à ×)Ò)¨$Ñ/Ô/Ð/Ø×"Ò"Ñ$Ô$Ð$ð =?ˆÔØ.0ˆÔØ).ˆÔ à:<ˆÔ'Ø×)Ò)Ñ+Ô+Ð+à—_’_ T¤ZÑ0Ô0ˆŒ
ÝÔ*Ð6ÝÔ8¸¼ÑDÔDˆDŒJåð 
ð 
àœ
ð
ñ 
ô 
ñ 
ô 
ð 	)ð ×&Ò&Ñ(Ô(Ð(à×ÒÑÔÐØ×,Ò,Ñ.Ô.Ð.åÔ$ð	VÝ(.Ô(;ð	Vå&Ñ(Ô(ð	Võ ŒOÔ,ÔA×SÒSÑUÔUÐUåÔð 	BÝØ5Ø&*Ø $ðñ ô ð Bð Bð
 ×.Ò.¸DÐ.ÑAÔAÐAðBð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bð 	×*Ò*Ñ,Ô,Ð,õ Ô)ð 		Ø7Ð7Ð7Ð7Ð7Ð7à0Ð0Ø”
ØÔ ØÔ'Ý�1œ7Ô/×4Ò4Ñ6Ô6Ñ7Ô7Ý�1œ7×3Ò3Ñ5Ô5Ñ6Ô6ñô ˆDŒJõ Ô#ð (	P­Ô(Oð (	PÝÔ1ð ØUÐUÐUÐUÐUÐUàAÐAØ”J Ô 0ñô ð õ ÔRð WØ"'�Ø œJð ð �DÝ$ T¤YÑ/Ô/ð Ø*.˜Ø˜ðð #ð Wðð ð ð ð ð ð KÐJÈ4Ì:ÑVÔVÐVõ Ô8ð Ø;Ð;Ð;Ð;Ð;Ð;à Ð Øð!ð !ð ð  ð  ð  ðñ ô ð õ ÔCÀDÄJÑOÔOˆDŒJØ×"Ò"Ñ$Ô$Ð$õ Ô"ð		Wõ ”Ô(ð			Wõ ”ÔCð		Wð ×DÒDÀTÄZÑPÔPˆDŒJØ×JÒJÈ4Ì:ÑVÔVˆDŒJà×ÒÑ!Ô!Ð!åŒ?Ô!Ô.ÔEð 	-Ø×*Ò*Ñ,Ô,Ð,àÐ˜4œ:Ñ&Ô&Ð&å	Œ×Ò˜dœjÑ)Ô)Ð)Ø×ÒÑÔÐõ 6@±\´\ˆÔ!ð :<ˆÔð GKˆÔ å˜Ñ'Ô'×/Ò/ðð ð ð ñ	
ô 	
ð 	
õ -7©L¬LˆÔÐÐs   Ô#UÕU
ÕU
ú!dict[str, SchedulerDonatedBuffer]c                óä   — i }t           j        j        D ][}t          t           j        j        |         t          j        ¦  «        r*t          | t           j        j        |         d ¬¦  «        ||<   Œ\|S )N)rå  )ra   rÂ   Úgraph_inputs_originalr²   r0   ÚDonatedBufferr)  )rr   Úname_to_donated_bufrÚ   s      rs   r¾  zScheduler.get_donated_buffers°  sq   € Ø ÐÝ”GÔ1ð 	ð 	ˆDÝ�!œ'Ô7¸Ô=½rÔ?OÑPÔPð Ý,BØÝ”GÔ1°$Ô7Ø $ð-ñ -ô -Ð# DÑ)øð
 #Ð"ru   c                óJ  ‡
— ddl mŠ
 i }t          j        d¦  «        }| j        D ]{}‰
}|j        �E|j                             ¦   «         }|�*||vrt          |¦  «        }|||<   || j        |<   ||         }|| j	        |<   | 
                    ¦   «         D ]}|| j        |<   ŒŒ|t          ˆ
fd„| j	                             ¦   «         D ¦   «         ¦  «        r™t          d„ | j        D ¦   «         d¦  «        }|�x| j        D ]p}|j        }	|                     ¦   «         €St          |	t           j        ¦  «        r9t          |	j        t           j        ¦  «        rt!          j        |¬¦  «        |	_        Œqt          ˆ
fd„| j	                             ¦   «         D ¦   «         ¦  «        | _        dS )a=  Populate node_to_stream and buff_to_stream from IR node stream_idx.

        Reads the stream_idx field set on IR nodes during lowering to determine
        which stream each scheduler node should run on. This field is propagated
        from 'custom.stream' FX node metadata via IRNode.current_stream_idx().
        r   )ÚDEFAULT_STREAM_IDXNc              3  ó$   •K  — | ]
}|‰k    V — Œd S r   r…   )r·   rI  rú  s     €rs   r¹   z9Scheduler._populate_stream_assignments.<locals>.<genexpr>Þ  s)   øè è € ÐMÐM¨1ˆqÐ&Ò&ÐMÐMÐMÐMÐMÐMru   c              3  óf   K  — | ],}|                      ¦   «         ®|                      ¦   «         V — Œ-d S r   ©rª   rÛ  s     rs   r¹   z9Scheduler._populate_stream_assignments.<locals>.<genexpr>à  s7   è è € ÐRÐR A°q·|²|±~´~Ð7Q�—’‘”Ð7QÐ7QÐ7QÐ7QÐRÐRru   ©rì  c              3  ó$   •K  — | ]
}|‰k    V — Œd S r   r…   )r·   Ú
stream_idxrú  s     €rs   r¹   z9Scheduler._populate_stream_assignments.<locals>.<genexpr>î  s=   øè è € ð '
ð '
àð Ð,Ò,ð'
ð '
ð '
ð '
ð '
ð '
ru   )Ústream_constantsrú  rª  r¶  rw  r”   Úget_stream_idxr©  rÏ  r®  rÖ  rÍ  r  rà   rª   r²   r0   ÚBufferrõ  rD   rÎ  )rr   Úuser_obj_to_stream_idxÚstream_idx_counterr”   r   Úuser_obj_idxÚnew_stream_idxrÕ   rì  rH  rú  s             @rs   rÐ  z&Scheduler._populate_stream_assignments»  sÿ  ø€ ð 	9Ð8Ð8Ð8Ð8Ð8ð 24ÐÝ&œ_¨QÑ/Ô/Ðà”Jð 	6ð 	6ˆDØ+ˆJàŒyÐ$Ø#œy×7Ò7Ñ9Ô9�ØÐ+Ø#Ð+AÐAÐAÝ)-Ð.@Ñ)AÔ)A˜Ø?MÐ.¨|Ñ<ØJV˜Ô7¸ÑGØ!7¸Ô!E�Jà(2ˆDÔ Ñ%ð ×,Ò,Ñ.Ô.ð 6ð 6�Ø+5�Ô# CÑ(Ð(ð6õ ÐMÐMÐMÐM°Ô0C×0JÒ0JÑ0LÔ0LÐMÑMÔMÑMÔMð 	FÝØRÐR¨¬ÐRÑRÔRÐTXñô ˆFð Ð!Ø œJð Fð F�DØ"œi�GàŸšÑ)Ô)Ð1Ý& wµ´	Ñ:Ô:ð 2å& w¤~µr´}ÑEÔEð 2õ
 *,¬¸fÐ)EÑ)EÔ)E˜œøõ $'ð '
ð '
ð '
ð '
à"Ô1×8Ò8Ñ:Ô:ð'
ñ '
ô '
ñ $
ô $
ˆÔ Ð Ð ru   rv   c                ó   — | j         S )z7Check if any nodes are assigned to non-default streams.)rÎ  rq   s    rs   Ú_has_multi_stream_nodesz!Scheduler._has_multi_stream_nodesó  s   € àÔ'Ð'ru   rä  rÖ   r‘   c                ó    — | j                              ||¦  «        }| j                             || j                             |d¦  «        ¦  «        S )zAReturn the stream index for a buffer, resolving mutation renames.r   )r2  r¾  rÍ  )rr   rä  Úreals      rs   Úget_buf_streamzScheduler.get_buf_stream÷  sF   € àÔ$×(Ò(¨°8Ñ<Ô<ˆØÔ"×&Ò& t¨TÔ-@×-DÒ-DÀXÈqÑ-QÔ-QÑRÔRÐRru   r”   rf   c                ó’   — |                       ¦   «         sdS |                      |¦  «        | j                             |d¦  «        k    S )z»True if buf_name was produced on a different stream than node.

        Resolves mutation renames so that mutated buffers inherit the
        stream of their original definition.
        Fr   )r	  r  r®  r¾  )rr   rä  r”   s      rs   r  z!Scheduler.has_cross_stream_hazardü  sI   € ð ×+Ò+Ñ-Ô-ð 	Ø�5Ø×"Ò" 8Ñ,Ô,°Ô0C×0GÒ0GÈÈaÑ0PÔ0PÒPÐPru   r   c                ó$   — t           j        j        S r   ©ra   rÂ   Úcurrent_devicerq   s    rs   r  zScheduler.current_device  s   € åŒwÔ%Ð%ru   rì  c                ó(   — |t           j        _        d S r   r  rë  s     rs   r  zScheduler.current_device
  s   € à!'�ŒÔÐÐru   c                ó‚   — t           j                             dd¦  «        dk    rddlm}  || j        d¬¦  «         dS dS )z,Generate an image of the graph for debuggingÚINDUCTOR_WRITE_SCHEDULER_GRAPHNÚ1r   )Údraw_buffersT)Úprint_graph)ÚosÚenvironr¾  ró  r  rw  )rr   r  s     rs   rí  zScheduler.debug_draw_graph  sV   € åŒ:�>Š>Ð:¸DÑAÔAÀSÒHÐHØ+Ð+Ð+Ð+Ð+Ð+àˆL˜œ°Ð6Ñ6Ô6Ð6Ð6Ð6ð IÐHru   Úlabelc                óÄ   — t                                t          j        ¦  «        r9t                                d|¦  «         | j        D ]}|                     ¦   «          Œd S d S )Nz%s:)rd  ÚisEnabledForÚloggingÚINFOrz  rw  r{  )rr   r  r”   s      rs   Údebug_print_nodeszScheduler.debug_print_nodes  sh   € Ý×Ò�GœLÑ)Ô)ð 	#Ý�HŠH�U˜EÑ"Ô"Ð"Øœ
ð #ð #�Ø× Ò Ñ"Ô"Ð"Ð"ð	#ð 	#ð#ð #ru   rD  c                ód  — |                      ¦   «         €
J d¦   «         ‚|                     ¦   «         rt          | |¦  «        S t          |t          j        t          j        f¦  «        rt          | |¦  «        S t          |t          j        ¦  «        rt          | |¦  «        S t          |¦  «        ‚)Nz2All nodes passed to scheduling must have an origin)r.  Úis_no_opr  r²   r0   r   r:  r³   rÓ  rd  r  rM  s     rs   r“  zScheduler.create_scheduler_node  s¦   € Ø×ÒÑ!Ô!Ð-Ð-Ø@ñ .Ô-Ð-ð �=Š=‰?Œ?ð 	,Ý)¨$°Ñ5Ô5Ð5Ý˜�rÔ0µ"Ô2CÐDÑEÔEð 	,Ý   tÑ,Ô,Ð,Ý˜�bœoÑ.Ô.ð 	,Ý,¨T°4Ñ8Ô8Ð8å% dÑ+Ô+Ð+ru   c                óò  ‡ ‡‡— t          ¦   «         Šg }‰ j                             ¦   «         Št          j        j                             ¦   «         D ]~}ˆˆ fd„|D ¦   «         }|sŒ‰                     |¦  «         ˆ fd„|D ¦   «         }t          j	        dk    }t          ‰ |d|¬¦  «        }|                     |¦  «         |D ]}|‰ j        |<   ŒŒˆfd„‰ j        D ¦   «         t          |¦  «        z   ‰ _        d S )Nc                ó\   •— g | ](}|‰v ¯t          ‰j        |         t          ¦  «        °&|‘Œ)S r…   )r²   rm  r  )r·   rÚ   Úkept_node_namesrr   s     €€rs   r   z2Scheduler.create_foreach_nodes.<locals>.<listcomp>.  sI   ø€ ð ð ð àØ˜?Ð*Ð*Ý" 4Ô#4°TÔ#:Õ<RÑSÔSð +ð à*Ð*Ð*ru   c                ó*   •— g | ]}‰j         |         ‘ŒS r…   )rm  ©r·   rÚ   rr   s     €rs   r   z2Scheduler.create_foreach_nodes.<locals>.<listcomp>9  s!   ø€ Ð@Ð@Ð@°$�dÔ'¨Ô-Ð@Ð@Ð@ru   r   F)r|  r  c                ó@   •— g | ]}|                      ¦   «         ‰v¯|‘ŒS r…   rI  )r·   r”   Úremoved_node_namess     €rs   r   z2Scheduler.create_foreach_nodes.<locals>.<listcomp>H  s3   ø€ ð 
ð 
ð 
Ø¨4¯=ª=©?¬?ÐBTÐ+TÐ+TˆDÐ+TÐ+TÐ+Tru   )r   rÇ  r'  ra   rÂ   Úlistsrà   rþ  r-   Úcombo_kernels_autotunere  rç   rw  r¥   )	rr   Úfe_nodesÚnamesrÞ   r  Úfe_noderÚ   r#  r'  s	   `      @@rs   rÈ  zScheduler.create_foreach_nodes(  sQ  øøø€ Ý.8©l¬lÐØˆØÔ1×6Ò6Ñ8Ô8ˆå”W”]×)Ò)Ñ+Ô+ð 	8ð 	8ˆEðð ð ð ð à!ðñ ô ˆEð ð àà×%Ò% eÑ,Ô,Ð,Ø@Ð@Ð@Ð@¸%Ð@Ñ@Ô@ˆFå$Ô;¸aÒ?ˆOÝ0ØØØ*/Ø /ð	ñ ô ˆGð �OŠO˜GÑ$Ô$Ð$àð 8ð 8�Ø07�Ô'¨Ñ-Ð-ð8ð
ð 
ð 
ð 
Ø!œZð
ñ 
ô 
å�‰NŒNñˆŒ
ˆ
ˆ
ru   c                óB  ‡ ‡$‡%‡&‡'—  G ˆ$fd„dt           t                   ¦  «        Š$t          j        ‰$¦  «        Š&‰ j        D ]å}|                     ¦   «         D ]Î}|                     ¦   «         }t          |j        j	        t          j        ¦  «        r&t          |                     ¦   «         ¦  «        dk    rŒ`|                     ¦   «         D ]Y}|‰&v r8|‰&v r4‰&|         }‰&|         }||z   }‰&D ]}‰&|         |u s
‰&|         |u r|‰&|<   ŒŒ>|‰&v r‰&|         ‰&|<   ŒN‰&|         ‰&|<   ŒZŒÏŒæd*ˆ'ˆ fd„Š'	 	 d+d,ˆ&ˆ'fd„}	i }
t          j        j                             ¦   «         D ]x}t          |t$          j        ¦  «        r|j        D ]}d|
|<   ŒŒ,t          |t          j        ¦  «        r2d„ |                     ¦   «         D ¦   «         }|D ]}|j        D ]}d|
|<   ŒŒŒyd}‰ j        D ]r}|j        €J ‚t/          |j                             ¦   «         d„ ¬¦  «        }|D ];}t          |t$          j        ¦  «        sJ ‚d}||
vr|                     ¦   «         |
|<   Œ<Œs‰ j        D �]‹}t4                               d|j        ¦  «         |r¬|j        €J ‚t/          |j                             d¬¦  «        d„ ¬¦  «        }|D ]u}||
v sJ |› d|
› �¦   «         ‚|
|         x}�V‰ j        |                              ¦   «         D ]6}|                     t?          |                     ¦   «         ¦  «        ¦  «         Œ7Œvt          |j         j!        ¦  «        dk    rEtE          tG          |j         j!        ¦  «        ¦  «        x}rt          |tH          ¦  «        r|j%        }nd}|                     ¦   «         D �]l}t          | &                    ¦   «         ¦  «        dk    sJ ‚| &                    ¦   «         D �],} ‰'|¦  «        } |	||¦  «         |                     t?          ||¬¦  «        ¦  «         ‰&|         j'        D ]à}|                     ¦   «         |                     ¦   «         k    rŒ-t          |j        tP          ¦  «        sJ ‚|j                             ¦   «         D ]}}|                     ¦   «         } ‰'|¦  «        }||                     ¦   «         v }|                     tS          ||                     ¦   «         | ¬¦  «        ¦  «          |	||d¬¦  «         Œ~Œá�Œ.�Œnt          j        j*        |                     ¦   «                  D ]G} |	||d¬¦  «         |                     tS          ||                     ¦   «         d¬¦  «        ¦  «         ŒHt          j        j+        |                     ¦   «                  D ]2} |	||d¬¦  «         |                     t?          |¦  «        ¦  «         Œ3|j         j,        D ]<}t          |tR          ¦  «        s% |	|j-        || .                    |¦  «        ¦  «         Œ=| /                    ‰ j0        ¦  «         |                     ¦   «         D ]�}| &                    ¦   «         D ]x}|                     ¦   «         ‰ j0         ‰'|¦  «        <   |                     ¦   «         ‰ j0        |<   ‰ j1         2                    ||¦  «        ‰ j1        |                     ¦   «         <   ŒyŒ��Œ�t          j         3                    ¦   «         D ]C}t4                               d|¦  «          |	|ti          t?          |¦  «        ¦  «        ¦  «         ŒD|rÀt          j        j5        D ]®}|                     d¬¦  «        D ]•}||
v s!J |› d|
 6                    ¦   «         › �¦   «         ‚|
|         x}rd‰ j        |          7                    ¦   «         D ]D}t4                               d||¦  «          |	|ti          t?          |¦  «        ¦  «        ¦  «         ŒEŒ–Œ¯‰ j0        D ]™}|t          j        j        v rK |	|ti          t?          |¦  «        ¦  «        ¦  «         t          j        j8         9                    |¦  «         Œ`|t          j        j:        v r& |	|ti          t?          |¦  «        ¦  «        ¦  «         Œšd „ tw          t          j        j         6                    ¦   «         ¦  «        D ¦   «         Š%ˆ%fd!„t          j        j8        D ¦   «         t          j        _<        ‰ j        D ]K}|                     ¦   «         D ]4}| =                    ‰&|                     ¦   «                  j'        ¦  «         Œ5ŒL‰ j>        D ]-}‰ j>        |          =                    ‰&|         j'        ¦  «         Œ.t          ¦   «         } |  @                    d"¦  «         ‰& '                    ¦   «         D ]^\  }}!|  A                    ¦   «         5  d#„ |!j'        D ¦   «         }"|  @                    d$|› d%|"› d&�¦  «         ddd¦  «         n# 1 swxY w Y   Œ_|  @                    d'¦  «         |  B                    ¦   «          C                    ¦   «         }#tˆ                               d(¦  «         tˆ                               d)|#¦  «         dS )-zi
        Create dependency edges between nodes, handling aliasing and
        mutation properly.
        c                  ó6   •— e Zd ZdZ	 	 ddd	„Zdd„Zdˆ fd„ZdS )ú1Scheduler.compute_dependencies.<locals>.DedupListan  
            This data structure behaves like a list except it makes sure the
            elements remain unique.
            Normally one could use a OrderedSet/dict for this purpose however
            the list in question gets elements appended as it is being
            iterated over which means that we need to keep the list
            semantics.
            NrÌ  úlist[_T] | NoneÚ
membershipúOrderedSet[_T] | NonerŠ   r   c                óB   — |pg | _         |pt          ¦   «         | _        d S r   )rÌ  r   r1  )rr   rÌ  r1  s      rs   rC  z:Scheduler.compute_dependencies.<locals>.DedupList.__init__\  s#   € ð
 #˜[ b�”
Ø",Ð"<µ
±´�”��ru   Ú	node_userrh   c                ó„   — || j         v rd S | j                             |¦  «         | j                              |¦  «         d S r   )r1  rÌ  rç   r³  )rr   r4  s     rs   rç   z8Scheduler.compute_dependencies.<locals>.DedupList.appendd  sF   € Ø ¤Ð/Ð/Ø�FØ”
×!Ò! )Ñ,Ô,Ð,Ø”×#Ò# IÑ.Ô.Ð.Ð.Ð.ru   r4  úDedupList[_T]c                ó’   •‡ — t          j        ‰ j        |j        ¦  «        }‰ j        ˆ fd„|j        D ¦   «         z   } ‰||¦  «        S )Nc                ó&   •— g | ]}|‰j         v¯|‘ŒS r…   )r1  )r·   r“  rr   s     €rs   r   zMScheduler.compute_dependencies.<locals>.DedupList.__add__.<locals>.<listcomp>l  s,   ø€ ð *ð *ð *Ø¨a°t´Ð.FÐ.F�AÐ.FÐ.FÐ.Fru   )r   rÆ  r1  rÌ  )rr   r4  Únew_membershipÚ	new_itemsÚ	DedupLists   `   €rs   Ú__add__z9Scheduler.compute_dependencies.<locals>.DedupList.__add__j  sc   øø€ Ý!+Ô!1°$´/À5ÔCSÑ!TÔ!T�Ø œJð *ð *ð *ð *Ø$œ{ð*ñ *ô *ñ �	ð !�y ¨NÑ;Ô;Ð;ru   r¹  )rÌ  r0  r1  r2  rŠ   r   )r4  rh   rŠ   r   )r4  r6  rŠ   r6  )r€   r�   r‚   r•   rC  rç   r<  )r;  s   €rs   r;  r/  R  sr   ø€ € € € € ðð ð *.Ø48ð=ð =ð =ð =ð =ð/ð /ð /ð /ð<ð <ð <ð <ð <ð <ð <ð <ru   r;  r   rÜ  rÖ   rŠ   c                óF   •— | ‰j         v r ‰‰j         |          ¦  «        S | S r   )r2  )rÜ  rŠ  rr   s    €€rs   rŠ  z.Scheduler.compute_dependencies.<locals>.rename—  s.   ø€ Ø�DÔ)Ð)Ð)Ø�v˜dÔ3°AÔ6Ñ7Ô7Ð7ØˆHru   FÚused_by_namer  r1  rÿ  rv   r2  r   c                ón   •— ‰ ‰| ¦  «                                       t          |||¦  «        ¦  «         d S r   )rç   rT  )r>  r  rÿ  r2  Úname_to_usersrŠ  s       €€rs   Úadd_userz0Scheduler.compute_dependencies.<locals>.add_userœ  sE   ø€ ð ˜&˜& Ñ.Ô.Ô/×6Ò6Ý˜ K°Ñ9Ô9ñô ð ð ð ru   Nc                óF   — g | ]}t          |t          j        ¦  «        ¯|‘ŒS r…   )r²   r	  rˆ  ©r·   rI  s     rs   r   z2Scheduler.compute_dependencies.<locals>.<listcomp>´  s)   € ÐSÐSÐS !½ÀAÅuÄzÑ9RÔ9RÐS˜AÐSÐSÐSru   c                ó   — | j         S r   r†  rÅ  s    rs   rA  z0Scheduler.compute_dependencies.<locals>.<lambda>¿  s   € ÀAÄF€ ru   rú  Tzscheduling %s)Úunbacked_onlyc                ó   — | j         S r   r†  rÅ  s    rs   rA  z0Scheduler.compute_dependencies.<locals>.<lambda>Ò  s   €  !¤&€ ru   z not in )r±  ©Úmutating_bufr®  )r2  )r®  zscheduling output %sz+scheduling output %s for unbacked symint %sc                ó   — i | ]\  }}||“Œ	S r…   r…   )r·   rÛ   rÚ   s      rs   rK  z2Scheduler.compute_dependencies.<locals>.<dictcomp>@  s+   € ð 
ð 
ð 
Ù'˜E 4ˆD�%ð
ð 
ð 
ru   c                ó    •— g | ]
}‰|         ‘ŒS r…   r…   )r·   rÚ   Ú	inp_namess     €rs   r   z2Scheduler.compute_dependencies.<locals>.<listcomp>C  s*   ø€ ð &
ð &
ð &
Ø $ˆI�dŒOð&
ð &
ð &
ru   r*  c                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   rI  )r·   r†  s     rs   r   z2Scheduler.compute_dependencies.<locals>.<listcomp>T  rè  ru   ú'z': rò  r+  zBUFFER USER LIST
z===== AFTER SCHEDULING =====
%s)rÜ  rÖ   rŠ   rÖ   )FF)
r>  rÖ   r  r1  rÿ  rv   r2  rv   rŠ   r   )Er	   rh   ri  r   rw  rL  rê  r²   r”   rõ  r0   rD   rÏ   rö  ra   rÂ   rj  rà   r	  rˆ  r&   Ú	TensorBoxrs  rÿ  Úget_unbacked_symbol_defsÚSymbolrd  ró  rI  rm  r�  r:   rØ   ra  r©  r¬  r9   r±  rø  rÌ  rf   r;   Úadditional_buffer_depsÚadditional_star_depsrÙ   rÚ   rÿ  rŒ  r2  rŸ  r¾  rÜ  r  rš   r'  rÖ  Úmutated_inputsr³  r¸  rª  Úmutated_input_idxsr  r  rX   r`  rù  rú  rf  Úcompute_dependencies_log)(rr   r”   Úbuf1Ú	buf1_nameÚ	buf2_nameÚlist1Úlist2Úcombinedrû  rA  Úunbacked_symbol_to_origin_nodeÚvalÚfsÚsym_sizerI  Úhas_non_input_unbacked_defsÚunbacked_symbol_defsÚunbacked_symbol_usesru  rÕ   râ   Ú	node_modeÚalt_namerû  Úout_bufÚ
other_nameÚis_aliasÚadd_depr  rä  rè   rÚ   Úlogbufr  rç  rÖ   r;  rK  r@  rŠ  s(   `                                   @@@@rs   rd   zScheduler.compute_dependenciesL  s�  øøøøø€ ð	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<�¥œñ 	<ô 	<ð 	<õ@ @KÔ?VØñ@
ô @
ˆð ”Jð 	Lð 	LˆDØ×(Ò(Ñ*Ô*ð Lð L�Ø ŸMšM™OœO�	õ ˜tœyÔ/µ´Ñ?Ô?ðå˜D×,Ò,Ñ.Ô.Ñ/Ô/°!Ò3Ð3àØ!%×!1Ò!1Ñ!3Ô!3ð Lð L�IØ  MÐ1Ð1°iÀ=Ð6PÐ6Pà -¨iÔ 8˜Ø -¨iÔ 8˜Ø#(¨5¡=˜Ø#0ð >ð >˜Cà -¨cÔ 2°eÐ ;Ð ;Ø#0°Ô#5¸Ð#>Ð#>à5= ¨cÑ 2øð>ð # mÐ3Ð3Ø3@ÀÔ3K˜ iÑ0Ð0à3@ÀÔ3K˜ iÑ0Ð0ðLðLð:	ð 	ð 	ð 	ð 	ð 	ð 	ð !&Ø!ð		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð JLÐ&õ
 ”7Ô'×.Ò.Ñ0Ô0ð 
	Bð 
	BˆCÝ˜#�uœzÑ*Ô*ð 	BØÔ*ð >ð >�BØ9=Ð2°2Ñ6Ð6ð>å˜C¥¤Ñ.Ô.ð Bð TÐS s§|¢|¡~¤~ÐSÑSÔS�Ø!ð Bð B�AØœnð Bð B˜Ø=AÐ6°rÑ:Ð:ðBøð ',Ð#Ø”Jð 	Hð 	HˆDØ”9Ð(Ð(Ð(õ $*Ø”	×2Ò2Ñ4Ô4Ð:JÐ:Jð$ñ $ô $Ð ð *ð Hð H�Ý! !¥U¤\Ñ2Ô2Ð2Ð2Ð2ð /3Ð+ØÐ:Ð:Ð:Ø8<¿º¹¼Ð2°1Ñ5øðHð ”Jð V	ñ V	ˆDÝ�IŠI�o t¤yÑ1Ô1Ð1à*ð GØ”yÐ,Ð,Ð,å'-Ø”I×2Ò2ÀÐ2ÑFÔFØ(Ð(ð(ñ (ô (Ð$ð
 .ð Gð G�AØÐ >Ð>Ð>Ð>ØÐFÐFÐ&DÐFÐFñ ?Ô>Ð>ð <¸AÔ>Ð>˜ÐKØ#'Ô#4°QÔ#7×#CÒ#CÑ#EÔ#Eð Gð G˜CØ ×-Ò-­g°c·l²l±n´nÑ.EÔ.EÑFÔFÐFÐFøõ �DÔ$Ô+Ñ,Ô,°Ò1Ð1Ý ¥ dÔ&6Ô&=Ñ!>Ô!>Ñ?Ô?Ð?�Sð 2å˜s¥IÑ.Ô.ð 2ð  œH�	�	à �	ð ×'Ò'Ñ)Ô)ð Eñ E�å˜3×,Ò,Ñ.Ô.Ñ/Ô/°1Ò4Ð4Ð4Ð4Ø #× 1Ò 1Ñ 3Ô 3ð Eñ E�HØ%˜v hÑ/Ô/�Hà�H˜X tÑ,Ô,Ð,Ø×%Ò%¥g¨h¸YÐ&GÑ&GÔ&GÑHÔHÐHØ -¨hÔ 7Ô =ð Eð E˜ØŸ=š=™?œ?¨d¯mªm©o¬oÒ=Ð=Ø$å)¨$¬)Õ5FÑGÔGÐGÐGÐGØ'+¤y×'<Ò'<Ñ'>Ô'>ð Eð E˜GØ)0×)9Ò)9Ñ);Ô);˜Jà)/¨°
Ñ);Ô);˜Jð (0°7×3FÒ3FÑ3HÔ3HÐ'H˜HØ ×-Ò-Ý 'Ø$.Ø14·²±´Ø08¨Lð!"ñ !"ô !"ñô ð ð %˜H Z°¸tÐDÑDÔDÐDÐDð%EñEñEõ< œ7Ô9¸$¿-º-¹/¼/ÔJð Sð S�Ø�˜ $°Ð5Ñ5Ô5Ð5ð ×!Ò!¥'¨'°4·=²=±?´?ÈDÐ"QÑ"QÔ"QÑRÔRÐRÐRåœ7Ô7¸¿º¹¼ÔHð 4ð 4�Ø�˜ $°Ð6Ñ6Ô6Ð6Ø×!Ò!¥'¨'Ñ"2Ô"2Ñ3Ô3Ð3Ð3ð Ô(Ô.ð Fð F�Ý! $­Ñ0Ô0ð FØ�H˜TœY¨¨d×.>Ò.>¸tÑ.DÔ.DÑEÔEÐEøà×%Ò% dÔ&;Ñ<Ô<Ð<ð ×'Ò'Ñ)Ô)ð ð �Ø #× 1Ò 1Ñ 3Ô 3ð ð �HØ>A¿lºl¹n¼n�DÔ)¨&¨&°Ñ*:Ô*:Ñ;Ø69·l²l±n´n�DÔ)¨(Ñ3àÔ/×3Ò3°H¸hÑGÔGð Ô+¨C¯LªL©N¬NÑ;Ð;ðñõ œ×0Ò0Ñ2Ô2ð 	>ð 	>ˆHÝ�IŠIÐ,¨hÑ7Ô7Ð7ØˆH�X�z­'°(Ñ*;Ô*;Ñ<Ô<Ñ=Ô=Ð=Ð=ð 'ð 	NÝ”wÔ,ð Nð N�Ø×1Ò1ÀÐ1ÑEÔEð Nð N�AØÐ >Ð>Ð>Ð>ØÐMÐMÐ&D×&IÒ&IÑ&KÔ&KÐMÐMñ ?Ô>Ð>ð ;¸1Ô=Ð=�qð NØ(,Ô(9¸!Ô(<×(MÒ(MÑ(OÔ(Oð Nð N˜HÝŸIšIØ MØ (Ø !ñô ð ð
 %˜H X­z½'À(Ñ:KÔ:KÑ/LÔ/LÑMÔMÐMÐMøðNð Ô)ð 	:ð 	:ˆDØ•q”wÔ+Ð+Ð+Ø�˜�z­'°$©-¬-Ñ8Ô8Ñ9Ô9Ð9Ý”Ô&×*Ò*¨4Ñ0Ô0Ð0Ð0Ø�œÔ*Ð*Ð*à�˜�z­'°$©-¬-Ñ8Ô8Ñ9Ô9Ð9øð
ð 
Ý+4µQ´WÔ5I×5NÒ5NÑ5PÔ5PÑ+QÔ+Qð
ñ 
ô 
ˆ	ð&
ð &
ð &
ð &
Ý()¬Ô(>ð&
ñ &
ô &
�ŒÔ"ð
 ”Jð 	Cð 	CˆDØ×'Ò'Ñ)Ô)ð Cð C�Ø—’˜m¨C¯LªL©N¬NÔ;ÔAÑBÔBÐBÐBðCð Ô/ð 	Sð 	SˆDØÔ'¨Ô-×7Ò7¸ÀdÔ8KÔ8QÑRÔRÐRÐRõ  Ñ!Ô!ˆØ�Š�cÑÔÐØ'×-Ò-Ñ/Ô/ð 	4ð 	4‰JˆC�Ø—’‘”ð 4ð 4Ø;Ð;¨u¬{Ð;Ñ;Ô;�Ø—’Ð2 #Ð2Ð2¨%Ð2Ð2Ð2Ñ3Ô3Ð3ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4øð 	�Š�cÑÔÐØ× Ò Ñ"Ô"×)Ò)Ñ+Ô+ˆÝ ×&Ò&Ð';Ñ<Ô<Ð<Ý ×&Ò&Ð'IÈ3ÑOÔOÐOÐOÐOs   ç).h#è#h'	è*h'	c           
     óæ  ‡ ‡— ddl m}m}m}m} t          t          j        j         	                    ¦   «         ¦  «        } |‰ j
        |¦  «        }t          j        j        j        s |‰ j
        ‰ j        ¦  «         t          t          j                             ¦   «         ¦  «        } |‰ j
        ||¦  «        \  }}	}	d„ t#          t%          ‰ j
        ¦  «        ¦  «        D ¦   «         Š|D ]~}
|
j        dk    r|
j        dk    rŒ|
j                             ¦   «         }‰|
j                 d                              |¦  «         ‰|
j                 d                              |¦  «         Œddlm}  |¦   «          dˆ ˆfd„}g }t9          ‰ j
        ¦  «        D ]S\  }}|                     |¦  «         |                      |||t%          ‰ j
        ¦  «        dz
  k    ¬¦  «        ¦  «         ŒT|‰ _
        d S )Nr   )r¡  Úcompute_memory_timelineÚFreeableInputBufferÚget_freeable_input_bufc                ó   — g | ]}g g f‘ŒS r…   r…   )r·   r?  s     rs   r   z7Scheduler.insert_memory_check_nodes.<locals>.<listcomp>t  s/   € ð C
ð C
ð C
ØˆR�ˆHðC
ð C
ð C
ru   r   )Úregister_check_mem_opÚstep_idxr‘   Úis_final_steprv   rŠ   rd  c                óZ  •— ‰|          d         }‰|          d         }|||g}t          j        t          t          j        d¦  «        ¬¦  «        t          j        j        j        j        g |d„ ¬¦  «        }d‰j	        |           
                    ¦   «         › �|_        t          ‰|¦  «        S )Nr   r   rê  rþ  c                ó6   — | |d         |d         |d         dœfS )Nr   r   rÎ   )ÚaliveÚdeadrq  r…   )Útensor_argsrË  s     rs   rA  zWScheduler.insert_memory_check_nodes.<locals>.construct_mem_check_node.<locals>.<lambda>’  s/   € Øà!.¨qÔ!1Ø -¨aÔ 0Ø)6°qÔ)9ðð ðC€ ru   )rõ  r  rv  Únontensor_argsÚunflatten_argsÚ
mem_check_)r0   ÚMemoryCheckKernelrD   rp  rì  ÚopsÚ_inductor_debugÚcheck_memory_stepÚdefaultrw  rê  r  rd  )rp  rq  Úexpected_newly_aliveÚexpected_newly_deadrw  r”   rr   Ústep_allocs_deallocss         €€rs   Úconstruct_mem_check_nodezEScheduler.insert_memory_check_nodes.<locals>.construct_mem_check_node…  sµ   ø€ ð $8¸Ô#AÀ!Ô#DÐ Ø"6°xÔ"@ÀÔ"CÐà2Ð4GÈÐWˆNåÔ'Ý!­¬°eÑ)<Ô)<Ð=Ñ=Ô=Ý”yÔ0ÔBÔJØØ-ð ð  ðñ ô ˆDð #Q¨t¬z¸(Ô/C×/LÒ/LÑ/NÔ/NÐ"PÐ"PˆDÔÝ,¨T°4Ñ8Ô8Ð8ru   )rq  )rp  r‘   rq  rv   rŠ   rd  )rÛ  r¡  rk  rl  rm  r   ra   rÂ   rj  r'  rw  rp  rq  r-   r   r  rÜ  rg  rÏ   Ú
size_allocÚ	size_freer"  rê  Ú
start_steprç   Úend_stepÚ#torch._inductor.runtime.debug_utilsro  rª  )rr   r¡  rk  rl  rm  rj  Úname_to_freeable_input_bufrš   Úbuf_info_listr?  Úbuf_inforä  ro  r‚  Ú	new_nodesr¨  r”   r�  s   `                @rs   rë  z#Scheduler.insert_memory_check_nodes[  sr  øø€ ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ )3µ1´7Ô3G×3LÒ3LÑ3NÔ3NÑ(OÔ(Oˆà"Ð" 4¤:¨|Ñ<Ô<ð 	#õ ŒÔ%Ô=ð 	Ø=Ð=Ø”
˜DÔ,ñô ð õ *4µA´G×4LÒ4LÑ4NÔ4NÑ)OÔ)OˆØ5Ð5ØŒJØ&Øñ
ô 
Ñˆ�q˜!ðC
ð C
Ý#¥C¨¬
¡O¤OÑ4Ô4ðC
ñ C
ô C
Ðð &ð 	Hð 	HˆHàÔ" aÒ'Ð'¨HÔ,>À!Ò,CÐ,CØà”×/Ò/Ñ1Ô1ˆHà  Ô!4Ô5°aÔ8×?Ò?ÀÑIÔIÐIØ  Ô!2Ô3°AÔ6×=Ò=¸hÑGÔGÐGÐGàMÐMÐMÐMÐMÐMàÐÑÔÐð	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð2 ˆ	å  ¤Ñ,Ô,ð 	ð 	‰GˆAˆtØ×Ò˜TÑ"Ô"Ð"Ø×ÒØ(Ð(¨¸1ÅÀDÄJÁÄÐRSÑ@SÒ;SÐUÑUÔUñô ð ð ð ˆŒ
ˆ
ˆ
ru   c                óø  ‡‡— t           j        sdS g }t          | j        ¦  «        D �]’Šdd„Šd}‰                     ¦   «         D ]Š}t          ˆfd„|j        D ¦   «         ¦  «        }|rdt                               d	| 	                    ¦   «         ¦  «         t          j        j                             | 	                    ¦   «         ¦  «         Œˆd
}Œ‹‰                     ¦   «          o| }|s|                     ‰¦  «         ŒØt                               d‰ 	                    ¦   «         ¦  «         t          j        j                             ‰ 	                    ¦   «         ¦  «         ‰j        j        D ]J}|j        | j        v r:| j        |j                 j        }ˆfd„|D ¦   «         | j        |j                 _        ŒK�Œ”t+          t          |¦  «        ¦  «        | _        | j        D ]Š‰                     ¦   «          ŒdS )z0
        Remove any nodes without users
        Nrû  rT  rŠ   rv   c                óZ   — | j         p$|                      ¦   «         t          j        j        v S r   )r2  rê  ra   rÂ   r¾  )rû  s    rs   Úcan_eliminate_userz;Scheduler.dead_node_elimination.<locals>.can_eliminate_userµ  s!   € Ø”|ÐT t§}¢}¡¤½!¼'Ô:TÐ'TÐTru   Fc              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r…   )r·   ÚurŽ  s     €rs   r¹   z2Scheduler.dead_node_elimination.<locals>.<genexpr>º  s/   øè è € Ð#MÐ#M¸aÐ$6Ð$6°qÑ$9Ô$9Ð#MÐ#MÐ#MÐ#MÐ#MÐ#Mru   zremoved dead buffer: %sTzremoved dead operation: %sc                ór   •— g | ]3}|j                              ¦   «         ‰                     ¦   «         k    ¯1|‘Œ4S r…   rþ  )r·   r�  r”   s     €rs   r   z3Scheduler.dead_node_elimination.<locals>.<listcomp>Ì  s>   ø€ ð =ð =ð =Ø"#°´·²Ñ0AÔ0AÀTÇ]Â]Á_Ä_Ò0TÐ0T˜AÐ0TÐ0TÐ0Tru   )rû  rT  rŠ   rv   )r-   Úuse_dcerÑ   rw  rL  rº   rç  rd  ró  rê  ra   rÂ   r  r³  r  rç   r¾  rØ   rÙ   rÚ   r  r¥   rÆ  )	rr   Úupdated_nodesÚactive_buffersrÕ   Úcan_eliminater  rç  rŽ  r”   s	          @@rs   rÃ  zScheduler.dead_node_elimination¨  s  øø€ õ Œ~ð 	ØˆFð
 ˆÝ˜TœZÑ(Ô(ð 	ñ 	ˆDðUð Uð Uð Uð #ˆNØ×'Ò'Ñ)Ô)ð *ð *�Ý #Ð#MÐ#MÐ#MÐ#MÀ3Ä9Ð#MÑ#MÔ#MÑ MÔ M�Ø ð *Ý—I’IÐ7¸¿º¹¼ÑHÔHÐHÝ”GÔ+×/Ò/°·²±´Ñ?Ô?Ð?Ð?à%)�N�Nà $× 5Ò 5Ñ 7Ô 7Ð7ÐNÀÐ<NˆMà ð Ø×$Ò$ TÑ*Ô*Ð*Ð*õ —	’	Ð6¸¿º¹¼ÑHÔHÐHÝ”Ô*×.Ò.¨t¯}ª}©¬Ñ?Ô?Ð?Ø Ô,Ô2ð ð �DØ”y DÔ$4Ð4Ð4Ø $Ô 0°´Ô ;Ô A˜ð=ð =ð =ð =Ø',ð=ñ =ô =˜Ô(¨¬Ô3Ô9øñõ �( =Ñ1Ô1Ñ2Ô2ˆŒ
ð ”Jð 	#ð 	#ˆDØ× Ò Ñ"Ô"Ð"Ð"ð	#ð 	#ru   r±  ú
str | Nonec                ó
   — |duS )z:Check if store mode requires cross-thread synchronization.Nr…   )rr   r±  s     rs   Úmode_requires_synchronizationz'Scheduler.mode_requires_synchronizationÕ  s   € à˜4ÐÐru   r¢  c                óÔ   ‡‡‡‡— t          t                   ¦   «         Št          ¦   «         Šg Šdˆˆˆˆfd„Š|D ]}|                     ¦   «         D ]}|‰|<   ŒŒ|D ]} ‰|¦  «         Œ‰S )z?
        Ensure nodes is in topologically sorted order
        rÜ  rf   rŠ   r   c                óÜ   •— | ‰vrf‰                      | ¦  «         t          | j        d„ ¬¦  «        D ]"}|j        ‰vrŒ ‰‰|j                 ¦  «         Œ#‰                     | ¦  «         d S d S )Nc                ó   — | j         S r   r†  )Úds    rs   rA  zDScheduler.topological_sort_schedule.<locals>.visit.<locals>.<lambda>æ  s   € ÀaÄf€ ru   rú  )r³  rÿ  r<  rÚ   rç   )rÜ  râ   rm  r¿  r„  Úvisits     €€€€rs   r�  z2Scheduler.topological_sort_schedule.<locals>.visitã  s‡   ø€ Ø˜ˆ}ˆ}Ø—’˜‘”�Ý! !Ô"6Ð<LÐ<LÐMÑMÔMð 2ð 2�Cà”x |Ð3Ð3Ø Ø�E˜, s¤xÔ0Ñ1Ô1Ð1Ð1Ø—’˜aÑ Ô Ð Ð Ð ð ˆ}ru   )rÜ  rf   rŠ   r   )r   rf   r”  rÖ  )rr   rw  r”   rÚ   rm  r¿  r„  r�  s       @@@@rs   rÂ  z#Scheduler.topological_sort_scheduleÙ  sµ   øøøø€ õ Õ+Ô,Ñ.Ô.ˆÝ59±V´VˆØ*,ˆð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð ð 	*ð 	*ˆDØ×-Ò-Ñ/Ô/ð *ð *�Ø%)�˜TÑ"Ð"ð*àð 	ð 	ˆDØˆE�$‰KŒKˆKˆKØˆru   c                ó”  — d„ | j         D ¦   «         }t          dt          |¦  «        ¦  «        D ]˜}t          t	          ||                              ¦   «         ¦  «        ¦  «        }t          t	          ||dz
                                ¦   «         ¦  «        ¦  «        }||                              t          ||d¬¦  «        ¦  «         Œ™d S )Nc                óP   — g | ]#}t          |j        t          j        ¦  «        ¯!|‘Œ$S r…   )r²   r”   r0   ÚConditionalrÛ  s     rs   r   z;Scheduler._enforce_conditional_ordering.<locals>.<listcomp>õ  s;   € ð 
ð 
ð 
Ø¥Z°´½¼Ñ%GÔ%Gð
Øð
ð 
ð 
ru   r   TrG  )rw  rg  rÏ   r©  r¬  rÖ  r�  r;   )rr   Úconditional_nodesr¨  rH  Úprev_bufs        rs   rÚ  z'Scheduler._enforce_conditional_orderingô  s×   € ð
ð 
Ø”zð
ñ 
ô 
Ðõ �q�#Ð/Ñ0Ô0Ñ1Ô1ð 	ð 	ˆAÝ¥Ð%6°qÔ%9×%JÒ%JÑ%LÔ%LÑ MÔ MÑNÔNˆLÝ�DÐ!2°1°q±5Ô!9×!JÒ!JÑ!LÔ!LÑMÔMÑNÔNˆHØ˜aÔ ×-Ò-Ý˜¨|ÀTÐJÑJÔJñô ð ð ð	ð 	ru   r¿  c                ór  ‡ — t          ¦   «         }t          |t          t          t          t
          t          f¦  «        r%|j        D ]}|                     |j	        ¦  «         Œn t          dt          |¦  «        › d�¦  «        ‚ˆ fd„|D ¦   «         }t          t          ˆ fd„|D ¦   «         ¦  «        ¦  «        S )Nz+get_unmet_dep_nodes is not implemented for ú.c              3  óV   •K  — | ]#}‰j         |                              ¦   «         V — Œ$d S r   )r  rì  rº  s     €rs   r¹   z1Scheduler._get_unmet_dep_nodes.<locals>.<genexpr>  s7   øè è € ÐXÐXÀc˜Ô)¨#Ô.×?Ò?ÑAÔAÐXÐXÐXÐXÐXÐXru   c              3  ó2   •K  — | ]}‰j         |         V — Œd S r   ©rÇ  r”  s     €rs   r¹   z1Scheduler._get_unmet_dep_nodes.<locals>.<genexpr>  s+   øè è € ÐQÐQ¸a˜tÔ6°qÔ9ÐQÐQÐQÐQÐQÐQru   )r   r²   r³   rd  r  rÝ   rÓ  r<  r³  rÚ   ÚRuntimeErrorr«   r¥   )rr   r¿  Ú
unmet_depsrâ   Úunmet_dep_opss   `    rs   Ú_get_unmet_dep_nodeszScheduler._get_unmet_dep_nodesÿ  sÔ   ø€ Ý&0¡l¤lˆ
ÝØåÝ)Ý&Ý"Ý$ðñ	
ô 	
ð 	ð Ô/ð )ð )�Ø—’˜sœxÑ(Ô(Ð(Ð(ð)õ ØL½dÀ5¹k¼kÐLÐLÐLñô ð ð YÐXÐXÐXÈZÐXÑXÔXˆÝ•JÐQÐQÐQÐQÀ=ÐQÑQÔQÑQÔQÑRÔRÐRru   r¥  c                ób  — g }t                                | j        d¦  «        }i }| j        D ]^}|                      |¦  «        }t	          |¦  «        ||<   |D ]2}|                     |g ¦  «        }|                     |¦  «         |||<   Œ3Œ_d„ |                     ¦   «         D ¦   «         }|rx|                     |¦  «         |D ]@}	|                     |	g ¦  «        D ]}
||
xx         dz  cc<   Œ|                     |	¦  «         ŒAd„ |                     ¦   «         D ¦   «         }|°x|r
J d¦   «         ‚|S )zU
        Sort nodes by their topological order, return a list of node lists.
        r   c                ó$   — g | ]\  }}|d k    ¯|‘ŒS ©r   r…   ©r·   rÜ  r†  s      rs   r   z5Scheduler._topological_sort_nodes.<locals>.<listcomp>#  s!   € Ð@Ð@Ð@¡  1¸¸aº¸˜!¸¸¸ru   r   c                ó$   — g | ]\  }}|d k    ¯|‘ŒS r®  r…   r¯  s      rs   r   z5Scheduler._topological_sort_nodes.<locals>.<listcomp>*  s!   € ÐDÐDÐD¡D A q¸QÀ!ºV¸V˜a¸V¸V¸Vru   zTopological sort failed!)	r”  Úfromkeysrw  r«  rÏ   r¾  rç   rÌ  r²  )rr   r   rw  Úchildrenr”   r¶  râ   ÚcÚzero_deg_nodesrÜ  rû  s              rs   r¬  z!Scheduler._topological_sort_nodes  sf  € ð ˆÝ—’˜dœj¨!Ñ,Ô,ˆØ#%ˆØ”Jð 	"ð 	"ˆDØ×,Ò,¨TÑ2Ô2ˆDÝ˜d™)œ)ˆE�$‰KØð "ð "�Ø—L’L  bÑ)Ô)�Ø—’˜‘”�Ø !�˜‘�ð"ð
 AÐ@¨¯ª©¬Ð@Ñ@Ô@ˆØð 	EØ�LŠL˜Ñ(Ô(Ð(Ø#ð ð �Ø$ŸLšL¨¨BÑ/Ô/ð %ð %�DØ˜$�K�K”K 1Ñ$�K�K‘K�KØ—	’	˜!‘”��ØDÐD¨E¯KªK©M¬MÐDÑDÔDˆNð ð 	Eð Ð4Ð4Ð4Ñ4Ô4ˆyØˆru   c                ób  — i }| j         D ]|}t          ¦   «         }|j        D ]F}| j        |j                                      ¦   «         }|                     |¦  «         |||         z  }ŒG|||                     ¦   «         <   ||_        Œ}t          | j         ¦  «        D ]\  }}||_
        ||_        ŒdS )z.
        Populate each node.ancestors
        N)rw  r   r<  r  rÚ   rì  r³  rê  r  rª  r.  r/  )rr   Úname_to_ancestorsr”   r  râ   Údep_node_namer   s          rs   rÄ  zScheduler.compute_ancestors.  sÈ   € ð
 9;ÐØ”Jð 	'ð 	'ˆDÝ)3©¬ˆIØÔ.ð >ð >�Ø $Ô 0°´Ô :× KÒ KÑ MÔ M�Ø—’˜mÑ,Ô,Ð,ØÐ.¨}Ô=Ñ=�	�	Ø1:Ð˜dŸmšm™oœoÑ.Ø&ˆDŒNˆNå$ T¤ZÑ0Ô0ð 	#ð 	#‰KˆE�4Ø"ˆDŒNØ"ˆDŒNˆNð	#ð 	#ru   c                óD  ‡ ‡‡— i Ši Š‰ j         D ]�}|j        sd}d}nFˆˆ fd„|j        D ¦   «         }ˆˆ fd„|j        D ¦   «         }t          |¦  «        }t          |¦  «        }|‰|                     ¦   «         <   |‰|                     ¦   «         <   ||_        ||_        Œ‘dS )zí
        Populate each node's min/max_input_distance with the depth from graph
        inputs, measured as dependency hops before fusion. Nodes whose
        dependencies are all satisfied by graph inputs/constants have depth 0.
        r   c                ój   •— g | ]/}‰‰j         |j                                      ¦   «                  d z   ‘Œ0S ©r   ©r  rÚ   rì  )r·   râ   Úname_to_min_distancerr   s     €€rs   r   z5Scheduler.compute_input_distances.<locals>.<listcomp>N  óN   ø€ ð !ð !ð !ð ð )¨Ô)9¸#¼(Ô)C×)TÒ)TÑ)VÔ)VÔWØñð!ð !ð !ru   c                ój   •— g | ]/}‰‰j         |j                                      ¦   «                  d z   ‘Œ0S rº  r»  )r·   râ   Úname_to_max_distancerr   s     €€rs   r   z5Scheduler.compute_input_distances.<locals>.<listcomp>S  r½  ru   N)rw  r<  ra  r`  rê  r,  r-  )rr   r”   Úmin_distÚmax_distÚdep_min_distsÚdep_max_distsr¿  r¼  s   `     @@rs   rÅ  z!Scheduler.compute_input_distancesA  sþ   øøø€ ð 02ÐØ/1ÐØ”Jð 	/ð 	/ˆDØÔ*ð .Ø�Ø��ð!ð !ð !ð !ð !ð  $Ô6ð!ñ !ô !�ð
!ð !ð !ð !ð !ð  $Ô6ð!ñ !ô !�õ
 ˜}Ñ-Ô-�Ý˜}Ñ-Ô-�Ø4<Ð  §¢¡¤Ñ1Ø4<Ð  §¢¡¤Ñ1Ø&.ˆDÔ#Ø&.ˆDÔ#Ð#ð)	/ð 	/ru   c                ób  — t           j        sd S | j        D ]˜}t          |t          t
          f¦  «        r$|                     ¦   «         st           j        dk    rŒC|                     ¦   «         D ]@}t          |t          ¦  «        r| 	                    ¦   «         rŒ,| 
                    ¦   «          ŒAŒ™d S )NÚhalide)r-   r>  rw  r²   r³   rÝ   r[   Úcpu_backendr»   rö  rw  )rr   r”   r¿  s      rs   rw  zScheduler.merge_loops_  sÃ   € ÝÔ0ð 	ØˆFà”Jð 	$ð 	$ˆDõ ˜d¥]Õ4FÐ$GÑHÔHð Ø—K’K‘M”MðÝ&,Ô&8¸HÒ&DÐ&DàØŸšÑ)Ô)ð $ð $�å! %­Ñ7Ô7ð ¸5×;LÒ;LÑ;NÔ;Nð Øà×!Ò!Ñ#Ô#Ð#Ð#ð$ð	$ð 	$ru   c                ó   — t          ddd¬¦  «        5  t          d¦  «        D ]¢}t          |¦  «        }t                               d|dz   |¦  «         |                      |d¬¦  «        }t          |¦  «        }t                               d	|dz   ||¦  «         ||k    s|dk    r t                               d
|dz   ¦  «          nŒ£t          j        st          j        r|                      |d¬¦  «        }|cddd¦  «         S # 1 swxY w Y   dS )zB
        Combine eligible nodes into FusedSchedulerNodes.
        zScheduler.fused_nodesTrœ  rÞ  z/===== attempting fusion (%d/10): %d nodes =====r   F)Úis_reorder_roundz=completed fusion round (%d/10): fused %d nodes into %d nodes
z+===== fusion complete (%d iterations) =====N)	r   rg  rÏ   rò  ró  Úfuse_nodes_oncer-   r>  Úloop_index_inversion_in_fusion)rr   rw  r¨  Úold_lenÚnew_lens        rs   rÓ  zScheduler.fuse_nodesz  s’  € õ Ø#¸4ÐQUð
ñ 
ô 
ð 	ð 	õ ˜2‘Y”Yð ð �Ý˜e™*œ*�Ý× Ò ØEØ˜‘EØñô ð ð
 ×,Ò,¨UÀUÐ,ÑKÔK�Ý˜e™*œ*�Ý× Ò ØTØ˜‘EØØñ	ô ð ð ˜gÒ%Ð%¨°Aª¨Ý×$Ò$ØEÀqÈ1Áuñô ð ð �Eð	 *6õ Ô1ðKåÔ8ðKð ×,Ò,¨UÀTÐ,ÑJÔJ�Øð;	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   “C#DÄDÄ
Dc                óª   — g }| j         D ]A}|                     t          |t          ¦  «        r|                     ¦   «         n|g¦  «         ŒB|| _         dS )zA
        Unpack GroupedSchedulerNode into regular nodes.
        N)rw  rµ  r²   rÓ  rÔ  )rr   r‹  r”   s      rs   rã  zScheduler.process_grouped_nodes�  se   € ð .0ˆ	Ø”Jð 	ð 	ˆDØ×ÒÝ!+¨DÕ2FÑ!GÔ!GÐS�—’‘”�ÈdÈVñô ð ð ð ˆŒ
ˆ
ˆ
ru   rx  útuple[float, str]c                ó  — t          |¦  «        dk    sJ ‚|d                              ¦   «         }|| _        |                      |¦  «        }t	          ddd¬¦  «        5  |                     |¦  «        cddd¦  «         S # 1 swxY w Y   dS )úƒ
        Benchmark fused list of nodes and return the execution time
        in milliseconds on randomly generated inputs.
        r   Úbenchmark_fused_nodesTÚcompile_time_autotune_time_us)r�  Údynamo_compile_column_usN)rÏ   rª   r  r<  r   rÑ  )rr   rw  rì  r<  s       rs   rÑ  zScheduler.benchmark_fused_nodes¨  sÜ   € õ �5‰zŒz˜AŠ~ˆ~ˆ~ˆ~Ø�q”×$Ò$Ñ&Ô&ˆØ$ˆÔØ×"Ò" 6Ñ*Ô*ˆÝØ#Ø"&Ø%Dð
ñ 
ô 
ð 	8ð 	8ð
 ×0Ò0°Ñ7Ô7ð	8ð 	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8s   ÁB Â BÂBNÚbenchmark_kernelÚhint_overridern  c                ó  — t          |¦  «        dk    sJ ‚|d                              ¦   «         }|| _        |                      |¦  «        }t	          d¦  «        5  |                     |||¬¦  «        cddd¦  «         S # 1 swxY w Y   dS )úD
        Generate a kernel given a list of pre-fused nodes.
        r   Úgenerate_kernel_code_from_nodes©rÕ  N)rÏ   rª   r  r<  r   rØ  )rr   rw  rÔ  rÕ  rì  r<  s         rs   rØ  z)Scheduler.generate_kernel_code_from_nodesº  sÚ   € õ �5‰zŒz˜AŠ~ˆ~ˆ~ˆ~Ø�q”×$Ò$Ñ&Ô&ˆØ$ˆÔØ×"Ò" 6Ñ*Ô*ˆÝÐ;Ñ<Ô<ð 	ð 	Ø×:Ò:ØÐ'°}ð ;ñ ô ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ÁB Â BÂBÚmoduler   r  c                ó¶   — || _         |                      |¦  «        }t          d¦  «        5  |                     |¦  «        cddd¦  «         S # 1 swxY w Y   dS )ú�
        Benchmark a compiled module and return the execution time
        in milliseconds on randomly generated inputs.
        Úbenchmark_codegened_moduleN)r  r<  r   rÝ  )rr   rÚ  rì  r<  s       rs   rÝ  z$Scheduler.benchmark_codegened_moduleÌ  s£   € ð %ˆÔØ×"Ò" 6Ñ*Ô*ˆÝÐ6Ñ7Ô7ð 	>ð 	>Ø×5Ò5°fÑ=Ô=ð	>ð 	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð 	>ð 	>s   ¬AÁAÁAÚ
multi_noder  c                ó  — t           j        j        }|sdS t                               d||¦  «         |j        D ]Å}|                     ¦   «         }t          j        j	         
                    |¦  «        sŒ;|j        }||         }t          |t          j        ¦  «        r!|                     |j        ¦  «         |j        }t          |t          j        ¦  «        r&||k    r t                               d|||¦  «          dS ŒÆdS )z 
        Check if selecting a Triton template would cause layout conflicts.
        Returns True if there's a conflict and we should fall back to ATen.
        FzNode %s has constraints %szOLayout conflict detected for %s: template expects %s but layout is frozen to %sT)ra   rÂ   Úbuffer_layout_constraintsrd  ró  rÉ  rê  rp  rq  rÕ  Úshould_use_layout_constraintsrõ  r²   r0   ÚFlexibleLayoutÚ freeze_layout_with_exact_stridesr?  ÚFixedLayoutre  )rr   rÞ  ÚconstraintsÚinpÚinp_namerõ  Úexpected_layouts          rs   Ú!_has_layout_conflict_for_templatez+Scheduler._has_layout_conflict_for_templateØ  s  € õ ”gÔ7ˆØð 	Ø�5å�	Š	Ð.°
¸KÑHÔHÐHØÔ$ð 	ð 	ˆCà—|’|‘~”~ˆHå”?Ô3×QÒQÐRUÑVÔVð Øð ”ZˆFØ)¨(Ô3ˆOÝ˜&¥"Ô"3Ñ4Ô4ð $ð ×4Ò4°_Ô5KÑLÔLÐLàœ�å˜&¥"¤.Ñ1Ô1ð °oÈÒ6OÐ6Oå—’ØeØØ#Øñ	ô ð ð �t�tøàˆuru   c                ód  ‡— t          | j        ¦  «        D �]˜\  }}t          |t          ¦  «        �r|t          |j        t
          j        ¦  «        �r\|j        }t          j        j	        s-|  
                    |¦  «        s|                     ¦   «         \  }}nad„ |j        D ¦   «         }|s
J d¦   «         ‚t          |¦  «        dk    r)|                     ¦   «         Št          |ˆfd„¬¦  «        }n|d         }t          |t           j        j        j        ¦  «        r¼t          j        r”i }||d<   t          j        D ]e}|                     |¬¦  «        Šd	„ ‰                     ¦   «         D ¦   «         }	t          |	                     ¦   «         d
„ ¬¦  «        d         }
|
||<   Œf|j                             |¦  «         n|j                             |¦  «         �ŒÂt
          j                             |j        ¦  «        5  |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |j        }t          |t
          j        ¦  «        sJ ‚|j        }t          |t
          j        ¦  «        sJ ‚|j        rt?          ||j        ¦  «         |j         |_         |  !                    ||||¦  «         �ŒšdS )a€  
        Finalize a backing choice for MultiTemplateBuffers which did not already have a
        choice finalized through fusion. In the case of an extern choice, this will result
        in replacing the SchedulerNode.

        If a MultiTemplateBuffer did not have any fusion opportunities, finalizing a choice
        will force completion of compilation and benchmarking.
        c                óZ   — g | ](}t          |t          j        j        j        ¦  «        ¯&|‘Œ)S r…   )r²   rp  rq  rÕ  ÚExternKernelCaller©r·   r³  s     rs   r   z=Scheduler.finalize_multi_template_buffers.<locals>.<listcomp>  sF   € ð &ð &ð &àÝ%ØÝ!œOÔ<ÔOñô ð&Øð&ð &ð &ru   z&No extern kernel detected for fallbackr   c                ó   •— ‰|          S r   r…   )r³  Útimingss    €rs   rA  z;Scheduler.finalize_multi_template_buffers.<locals>.<lambda>"  s   ø€ ÈWÐUVÌZ€ ru   rú  r   NrÙ  c                óD   — i | ]\  }}t          |t          ¦  «        ¯||“ŒS r…   ©r²   r"   )r·   r¢  r†  s      rs   rK  z=Scheduler.finalize_multi_template_buffers.<locals>.<dictcomp>2  s?   € ð .ð .ð .á$( A qÝ#-¨aÕ1IÑ#JÔ#Jð.Ø ! 1ð.ð .ð .ru   c                ó   — | d         S rl  r…   rÅ  s    rs   rA  z;Scheduler.finalize_multi_template_buffers.<locals>.<lambda>7  s   € ÈqÐQRÌt€ ru   )"rª  rw  r²   r³   r”   r0   ÚMultiTemplateBufferr-   ré  Ú%force_extern_kernel_in_multi_templateré  Úget_min_choiceÚchoicesrÏ   Úchoice_timingsra  rp  rq  r"   Úmulti_kernel_hintsrÌ  Úfinalize_as_triton_callersÚfinalize_as_triton_callerr€  Úcurrent_originsr4  Úoutput_noderú   Ú
StorageBoxÚOperationBufferÚorigin_noder?   rõ  Ú_replace_node)rr   r¨  r”   rÞ  Úmin_node_unfusedr?  Úextern_choicesÚcallersr¢  Útriton_timingsÚchoiceÚout_tensorboxÚout_storageÚ
out_bufferrï  s                 @rs   rÒ  z)Scheduler.finalize_multi_template_buffers  s6  ø€ õ ! ¤Ñ,Ô,ð ?	Dñ ?	D‰GˆAˆtÝ˜$¥Ñ.Ô.ñ >Dµ:Ø”	�2Ô1ñ4ô 4ñ >Dð "œY�
åÔ+ÔQð=à ×BÒBÀ:ÑNÔNð=ð
 +5×*CÒ*CÑ*EÔ*EÑ'Ð$ a að&ð &à!+Ô!3ð&ñ &ô &�Nð *ÐSÐSÐ+SÑSÔS˜>Ý˜>Ñ*Ô*¨QÒ.Ð.Ø",×";Ò";Ñ"=Ô"=˜Ý+.¨~ÐCWÐCWÐCWÐCWÐ+XÑ+XÔ+XÐ(Ð(à+9¸!Ô+<Ð(åØ$Ý”OÔ&Ô?ñô ð õ
 Ô0ð NØNP˜Ø(8˜ ™õ %+Ô$=ð 3ð 3˜DØ&0×&?Ò&?ÈdÐ&?Ñ&SÔ&S˜Gð.ð .à,3¯MªM©O¬Oð.ñ .ô .˜Nõ
 &)¨×)=Ò)=Ñ)?Ô)?À^À^Ð%TÑ%TÔ%TÐUVÔ%W˜FØ,2˜G D™M˜Màœ	×<Ò<¸WÑEÔEÐEÐEàœ	×;Ò;Ð<LÑMÔMÐMÙå”Y×.Ò.¨zÔ/AÑBÔBð Cð CØ$4×$@Ò$@Ñ$BÔ$B�MðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð Cà+Ô0�Ý! +­r¬}Ñ=Ô=Ð=Ð=Ð=Ø(Ô-�
Ý! *­bÔ.@ÑAÔAÐAÐAÐAàÔ)ð NÝ& }°jÔ6LÑMÔMÐMà$.Ô$5�
Ô!Ø×"Ò" :¨z¸1¸dÑCÔCÐCùð?	Dð ?	Ds   Ç<HÈH!	È$H!	r  r  r¨  r³   c                ó  ‡— t          ||¦  «         |                      |¦  «        }|| j        |<   || j        |                     ¦   «         <   || j        |                     ¦   «         <   i Št          j        |j        j	        |j
        ¦  «        D ].}| j                             |j        d ¦  «        x}r
|j        ‰|<   Œ/dˆfd„} ||j
        ¦  «        |_
         ||j        j	        ¦  «        |j        _	        t          |                     ¦   «         |                     ¦   «         ¦  «        D ]-\  }	}
|	| j        |
                     ¦   «         <   |
j        |	_        Œ.|j        |_        |j        |_        |j        |_        |j        |_        d S )Nr¶  r;  rŠ   c                ó:   •— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3  óB   •K  — | ]}|                      ‰¦  «        V — Œd S r   )rŠ  )r·   râ   r2  s     €rs   r¹   z?Scheduler._replace_node.<locals>.rename_deps.<locals>.<genexpr>a  s0   øè è € ÐKÐK¸s˜cŸjšjÐ)9Ñ:Ô:ÐKÐKÐKÐKÐKÐKru   r   )r¶  r2  s    €rs   Úrename_depsz,Scheduler._replace_node.<locals>.rename_deps`  s&   ø€ ÝÐKÐKÐKÐKÀdÐKÑKÔKÑKÔKÐKru   )r¶  r;  rŠ   r;  )r  r“  rw  rm  rê  rÇ  rª  r«  rØ   rÙ   r<  rŸ  r¾  rÚ   r•  rL  r  rç  r.  r/  r  r+  )rr   r  rÞ  r¨  r”   Únew_scheduler_noderâ   rV  r  Únew_outÚold_outr2  s              @rs   r   zScheduler._replace_nodeL  s³  ø€ õ 	" *¨jÑ9Ô9Ð9Ø!×7Ò7¸
ÑCÔCÐà*ˆŒ
�1‰Ø-?ˆÔ˜$Ÿ-š-™/œ/Ñ*Ø3EˆÔ §¢¡¤Ñ0ð ÐÝ”? 4Ô#3Ô#9¸4Ô;RÑSÔSð 	7ð 	7ˆCØ Ô3×7Ò7¸¼À$ÑGÔGÐGˆyð 7Ø.1¬hÐ  Ñ+øð	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 1<°ØÔ1ñ1
ô 1
ÐÔ-ð 0;¨{ØÔ*Ô0ñ0
ô 0
ÐÔ&Ô,õ !$Ø×*Ò*Ñ,Ô,¨d×.>Ò.>Ñ.@Ô.@ñ!
ô !
ð 	*ð 	*ÑˆG�Wð 4;ˆDÔ˜W×-Ò-Ñ/Ô/Ñ0Ø#œMˆGŒMˆMà'+¤~ÐÔ$Ø'+¤~ÐÔ$Ø'+¤~ÐÔ$Ø(,¬ÐÔ%Ð%Ð%ru   Ú	node_listc                ó4   — t          d„ |D ¦   «         ¦  «        S )Nc              3  ó°   K  — | ]Q}t          |j        d ¦  «        o7|j        duo.t          |j        j        d¦  «        o|j        j        j        dk    V — ŒRdS )rú   NrY  r²  )r
  r”   rú   rY  rÛ  s     rs   r¹   z,Scheduler._any_atomic_add.<locals>.<genexpr>v  s   è è € ð 
ð 
ð
 õ	 �A”F˜FÑ#Ô#ð 9Ø”˜dÐ"ð9å˜œœ ^Ñ4Ô4ð9ð ””Ô(¨LÒ8ð	
ð 
ð 
ð 
ð 
ð 
ru   ©r  )rr   r  s     rs   Ú_any_atomic_addzScheduler._any_atomic_addu  s2   € Ýð 
ð 
ð
 ð
ñ 
ô 
ñ 
ô 
ð 	
ru   ú&tuple[LambdaFuture | None, ModuleType]c                ó2  — |                       |d|¬¦  «        }t          j        |¦  «        }t          j        j                             ¦   «         }|                     ¦   «         sd }n.|                     d|¬¦  «        }t          |t          ¦  «        sJ ‚||fS )NT)rÔ  rÕ  Útriton_)Úkernel_nameÚsource_code)rØ  r!   Úloadrp  rq  Úasync_compileÚAsyncCompileÚuse_process_poolr©   r²   r    )rr   rw  rÕ  Úsrc_codeÚmodr  Úfuts          rs   Úcompile_kernelzScheduler.compile_kernel~  s    € ð ×7Ò7Ø D¸ð 8ñ 
ô 
ˆõ Ô˜xÑ(Ô(ˆÝœÔ5×BÒBÑDÔDˆØ×-Ò-Ñ/Ô/ð 	1ØˆCˆCà×&Ò&°9È(Ð&ÑSÔSˆCÝ˜c¥<Ñ0Ô0Ð0Ð0Ð0à�SˆzÐru   rˆ   r‰   rk   c                óL  ‡ ‡‡‡‡‡‡‡ ‡!‡"‡#‡$‡%‡&‡'‡(‡)‡*‡+‡,‡-‡.‡/— t          d„ ‰‰fD ¦   «         ¦  «        }t          ‰                     ¦   «         t          j        ¦  «        ot          ‰d¬¦  «        }|r&t          j        st           	                    d¦  «        S t          j
        s|st           	                    d¦  «        S ‰                     ¦   «         r,t          ‰                     ¦   «         t          j        ¦  «        r(‰                     ¦   «         s‰                     ¦   «         rt           	                    d¦  «        S ‰                     ¦   «         }|d                              ¦   «         Š ‰ sJ ‚‰ j        dk    r*t          j        dk    rt           	                    d¦  «        S ‰                     ¦   «         }t#          t%          j        ||¦  «        ¦  «        Š.‰                      ‰.¦  «        }|r|st           	                    d¦  «        S ddlmŠ t/          ‰‰¦  «        Š/‰.d                              ¦   «         Š ‰ €J ‚d&ˆˆfd„Š(|�rht          d„ ‰‰fD ¦   «         ¦  «        �rL‰                     ¦   «         d	uŠ!‰!r‰                     ¦   «         n‰                     ¦   «         Š-t          ‰-t          j        ¦  «        sJ ‚‰                      ‰-¦  «        rt           	                    d¦  «        S i Š'|�ság Š%t          j        D �]Ñ}‰-                     |¦  «        Št9          ‰                     ¦   «         d„ ¬¦  «        D ]Š\  }	}
t          |	t<          j        j         j!        ¦  «        sŒ*‰- "                    |	¦  «        5  ‰% #                    |	g‰  $                    ‰.|	j%        ¬¦  «        ¢R ¦  «         d	d	d	¦  «         n# 1 swxY w Y   Œ‹tM          d¦  «        }d	}i }‰%D ]Î\  }	}}	 |�| '                    ¦   «          n[# tP          $ rN}tR           *                    tV          j,        ¦  «        r tR           -                    d‰!sdnd|¦  «         Y d	}~Œqd	}~ww xY w‰- "                    |	¦  «        5  ‰  .                    |‰ ¦  «        \  }}|||	<   ||k     r|}|	}d	d	d	¦  «         n# 1 swxY w Y   ŒÏ|‰-j/        |<   t          |t`          ¦  «        sJ ‚|‰'|<   �ŒÓt          j1        Šte          d„ ‰-j3        D ¦   «         ¦  «        }ti          ¦   «         o‰ o|t          j5        k    Š&tM          d¦  «        tM          d¦  «        cŠ*Š+d	Š)‰&sa‰-                     ¦   «         Š‰- 6                    ¦   «         \  Š)Š*t9          ‰                     ¦   «         to          j8        d¦  «        ¬¦  «        }nd„ ‰-j3        D ¦   «         }ddl9m:Š d'ˆ!ˆ-fd „}d(ˆˆ!ˆ-ˆ.ˆ fd"„}|�r?‰!st           	                    d¦  «        S g t          j        ¢d	‘D ]»}‰-                     |¦  «        Šd	}t9          ‰                     ¦   «         to          j8        d¦  «        ¬¦  «        D ]I\  }	}
 ||	¦  «        sŒtw          j<        t<          j        j         j!        |	¦  «        } ||¦  «        r|} nŒJ|€t           	                    d¦  «        c S |‰'|<   Œ¼t          j        r‰- =                    ‰'¦  «         n‰- >                    ‰'d	         ¦  «         t           	                    d¦  «        S ‰r0‰!r‰  ?                    |¦  «        n‰  ?                    |¦  «        \  Š+}nA‰!st           	                    d¦  «        S ‰ @                    ¦   «         Š+tƒ          ‰‰‰+¦  «        Š,g Š%d}|D ]Á\  }	} ||	¦  «        sŒtw          j<        t`          |	¦  «        }	‰r|‰*‰+z   k    r nŠ|dz  }|t          j5        k    r ns‰- "                    |	¦  «        5  	 ‰% #                    |	g‰  $                    ‰.¦  «        ¢R ¦  «         n# ‰$ r Y d	d	d	¦  «         Œ¥w xY w	 d	d	d	¦  «         n# 1 swxY w Y   ŒÂt…          ‰%¦  «        dk    rt           	                    d¦  «        S d)ˆˆˆ ˆ!ˆ%ˆ&ˆ'ˆ(ˆ)ˆ*ˆ+ˆ,ˆ-ˆ fd#„}t           C                    |‰%d         d         ¦  «        S ‰  $                    |¦  «        Š"‰  $                    |¦  «        Š$‰  $                    ‰.¦  «        Š#d)ˆˆ ˆ"ˆ#ˆ$ˆ(ˆ ˆ/fd$„}t           C                    |‰#d         ¬%¦  «        S )*ú‡
        If config.benchmark_fusion is False, always return True.
        Otherwise, return True if fusion can brings speedup.
        c              3  ó–   K  — | ]D}|                      ¦   «         o+t          |                     ¦   «         t          j        ¦  «        V — ŒEd S r   )rö  r²   r›  r0   ró  rÛ  s     rs   r¹   z.Scheduler.speedup_by_fusion.<locals>.<genexpr>–  sb   è è € ð  
ð  
ð ð �MŠM‰OŒOð JÝ˜1×.Ò.Ñ0Ô0µ"Ô2HÑIÔIð 
ð  
ð  
ð  
ð  
ð  
ru   FrR  Tr   rê  r©   ©ÚCompilationErrorNÚms_fusedry  r)  r*  rŠ   r   c           
     óÂ  •— t                                t          j        ¦  «        r¹| ||z   k     rXt                                d‰                     ¦   «         ‰                     ¦   «         t          ||z   | z  d›¦  «        ¦  «         d S t                                d‰                     ¦   «         ‰                     ¦   «         t          | ||z   z  d›¦  «        ¦  «         d S d S )Nz9can fuse (benchmark): fusing %s with %s cause %sx speedupú.3fz=cannot fuse (benchmark): fusing %s with %s cause %sx slowdown)rò  r  r  ÚDEBUGró  rÖ  rJ   rL   )r'  r)  r*  rˆ   r‰   s      €€rs   Ú
log_fusionz/Scheduler.speedup_by_fusion.<locals>.log_fusionÈ  sð   ø€ Ý×&Ò&¥w¤}Ñ5Ô5ð Ø˜c C™iÒ'Ð'Ý×$Ò$ØSØ×.Ò.Ñ0Ô0Ø×.Ò.Ñ0Ô0Ý" s¨S¡y°HÑ&<Ð#BÐ#BÑCÔCñ	ô ð ð ð õ ×$Ò$ØWØ×.Ò.Ñ0Ô0Ø×.Ò.Ñ0Ô0Ý  H°°c±	Ñ$:Ð!@Ð!@ÑAÔAñ	ô ð ð ð ðð ru   c              3  óB   K  — | ]}|                      ¦   «         d uV — Œd S r   rŸ  rÛ  s     rs   r¹   z.Scheduler.speedup_by_fusion.<locals>.<genexpr>Ù  sD   è è € ð %
ð %
Ø23ˆA×ÒÑ!Ô!¨Ð-ð%
ð %
ð %
ð %
ð %
ð %
ru   c                ó   — | d         S rl  r…   rÅ  s    rs   rA  z-Scheduler.speedup_by_fusion.<locals>.<lambda>î  s   € ÐRSÐTUÔRV€ ru   rú  rÙ  ÚinfúException in compiling %s: %sr¬  r®  c              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   rñ  rí  s     rs   r¹   z.Scheduler.speedup_by_fusion.<locals>.<genexpr>  s>   è è € ð %ð %Ø<=•
˜1Õ6Ñ7Ô7ð%ð %ð %ð %ð %ð %ru   r   c                ó   — g | ]}|d f‘ŒS r®  r…   rí  s     rs   r   z/Scheduler.speedup_by_fusion.<locals>.<listcomp>1  s   € Ð&JÐ&JÐ&J°!¨¨1 vÐ&JÐ&JÐ&Jru   )Ú	CantSplitr  úir.ChoiceCallerrv   c                ó˜   •— t          | t          j        j        j        ¦  «        sdS ‰ ot          | d¦  «        o| j        ‰j        k     S )NFÚallowed_prologue_inps)r²   rp  rq  rÕ  ÚTritonTemplateCallerr
  r5  )r  rM  rÞ  s    €€rs   Úchoice_supports_fusionz;Scheduler.speedup_by_fusion.<locals>.choice_supports_fusion5  sc   ø€ Ý!Ø�EœOÔ<ÔQñô ð !ð !˜5ð (Ð'ð YÝ Ð(?Ñ@Ô@ðYàÔ4¸
Ô8XÒXðð ru   ú5torch._inductor.select_algorithm.TritonTemplateCallerc                óö  •— ‰                      | ¦  «        5  	 ‰                     ‰| j        ¬¦  «        \  }}|�|                     ¦   «          n|j                             ¦   «          ny# ‰$ r Y d d d ¦  «         dS t          $ rZ}t                               t          j
        ¦  «        r t                               d‰sdnd|¦  «         Y d }~d d d ¦  «         dS d }~ww xY wd d d ¦  «         n# 1 swxY w Y   dS )NrÙ  Fr/  r¬  r®  T)Úswap_as_triton_callerr!  rÕ  r¿  r  Ú
precompilerc  rò  r  r  r*  ró  )	r  ro   Ú	mod_fusedr  r2  rM  rÞ  Únode_list_fusedrr   s	       €€€€€rs   Úcompile_without_benchmarkingzAScheduler.speedup_by_fusion.<locals>.compile_without_benchmarkingE  s¢  ø€ ð  ×5Ò5°fÑ=Ô=ð %ð %ð%Ø,0×,?Ò,?Ø+¸6Ô;Oð -@ñ -ô -Ñ)˜ 	ð "Ð-Ø"ŸMšM™OœO˜O˜Oà%Ô-×8Ò8Ñ:Ô:Ð:øøØ$ð %ð %ð %Ø$ð%ð %ð %ñ %ô %ð %ð %ð %õ %ð %ð %ð %Ý%×2Ò2µ7´=ÑAÔAð Ý&×,Ò,Ø ?Ø2AÐ Q 
 
ÀzØ !ñô ð ð
  %˜u˜u˜uð%%ð %ð %ñ %ô %ð %ð %ð %øøøøð%øøøð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð& �tsH   —C.™AA)Á(C.Á)CÁ.C.Á<	CÂACÃ	C.ÃCÃC.Ã.C2Ã5C2c                 óð  •— t          d¦  «        } d }i }‰rk‰rt          ‰t          j        ¦  «        sJ ‚‰                     ¦   «         Š‰                     ¦   «         \  ŠŠˆfd„‰D ¦   «         Št          ‰ˆfd„¬¦  «        Š‰D �]Š\  }}}	 |�|                     ¦   «         }n ‰s|j        }| 	                    ¦   «          nd }n[# t          $ rN}t                               t          j        ¦  «        r t                               d‰sdnd|¦  «         Y d }~Œ“d }~ww xY w‰rV‰                     |¦  «        5  ‰                     |‰¦  «        \  }}	|||<   || k     r|} |}d d d ¦  «         n# 1 swxY w Y   Œó‰|k    p‰‰z   ‰|         ‰z   k    }
|r}|
r{| 	                    ¦   «          |j        r|j        sJ ‚|j        d         }|j        }|j        }t+          ‰‰|j        |||j        j        t1          j        ‰¦  «        ¦  «        }|r|} n�ŒŒ‰r ‰| ‰‰¦  «         ‰r	| ‰‰z   k     rL|�Jt4          j        r|‰d <   ‰                     ‰¦  «         n‰                     |¦  «         ‰r
|‰j        d <   d	S d
S )Nr.  c                ó(   •— g | ]}|d          ‰v ¯|‘ŒS r®  r…   )r·   Ú
fut_choicer÷  s     €rs   r   zMScheduler.speedup_by_fusion.<locals>.benchmark_when_ready.<locals>.<listcomp>´  s2   ø€ ð &ð &ð &à&Ø% aœ=¨NÐ:Ð:ð #à:Ð:Ð:ru   c                ó    •— ‰| d                  S rì   r…   )r“  r÷  s    €rs   rA  zKScheduler.speedup_by_fusion.<locals>.benchmark_when_ready.<locals>.<lambda>¼  s   ø€  n°Q°q´TÔ&:€ ru   rú  r/  r¬  r®  r   TF)ry  r²   r0   ró  r÷  rõ  rÿ  r¿  r  r;  rc  rò  r  r  r*  ró  r:  rÝ  Ú	launchersÚn_regsÚn_spillsr/  Úbmreqr  rH   rÏ  r-   rø  rù  rú  Ú_choice_timings)Úmin_ms_fusedÚms_fused_choiceÚnew_timingsr  ro   r<  Úresr  r'  ÚpathÚfusible_choiceÚcompiled_kernelr  r  Úshould_fuse_epilogueÚbench_epiloguer÷  rì  rM  Úfuture_choicesÚget_choice_timings_asyncÚ hint_override_best_fusion_choicer+  Ú
min_choicer)  r*  Ú	ms2_fusedrÞ  rr   s                  €€€€€€€€€€€€€€rs   Úbenchmark_when_readyz9Scheduler.speedup_by_fusion.<locals>.benchmark_when_ready¨  s¤  ø€ å$ U™|œ|�Ø"&�Ø �à+ð Ø%ÐX­*°ZÅÔAWÑ*XÔ*XÐXÐXÐXØ%/×%>Ò%>Ñ%@Ô%@�NØ&0×&?Ò&?Ñ&AÔ&A‘O�J ð&ð &ð &ð &à*8ð&ñ &ô &�Nõ &,Ø&Ø:Ð:Ð:Ð:ð&ñ &ô &�Nð
 2@ð <&ñ <&Ñ-�F˜F Ið!Ø!Ð-Ø"(§-¢-¡/¤/˜C˜CØ!/ð 'Ø"+Ô"3˜CØŸNšNÑ,Ô,Ð,Ð,à"&˜Cøøõ %ð !ð !ð !Ý%×2Ò2µ7´=ÑAÔAð Ý&×,Ò,Ø ?Ø2AÐ Q 
 
ÀzØ !ñô ð ð
 !˜˜˜˜øøøøð!øøøð &ð '&à'×=Ò=¸fÑEÔEð 	9ð 	9Ø-1×-LÒ-LØ )à &ñ.ô .™N˜H dð
 3;˜K¨Ñ/Ø'¨,Ò6Ð6Ø/7 Ø28 ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9øð '¨&Ò0ð NØ" S™y¨>¸&Ô+AÀIÑ+MÒMð 'ð
 ð & >ð &Ø"×-Ò-Ñ/Ô/Ð/à#&¤=ÐB°V´]ÐBÐBÐ#Bà.1¬m¸AÔ.>˜Oà+:Ô+A˜Là-<Ô-E˜NÝ3AØ #Ø #Ø &¤Ø ,Ø .Ø &¤Ô 6Ý 0Ô 7¸Ñ ?Ô ?ñ4ô 4Ð0ð  4ð &Ø28 Ø % ùà!ð 7Ø�J˜|¨S°#Ñ6Ô6Ð6ð 'ð!Ø*6¸#À¹)Ò*DÐ*DØ%Ð1ÝÔ0ð NØAPÐ8¸Ñ>à"×=Ò=Ø<ñô ð ð ð
 #×<Ò<¸_ÑMÔMÐMà%ð Gà;F˜
Ô2°4Ñ8Ø˜4à ˜5s+   Â7CÃ
DÃADÄDÄ6)E+Å+E/	Å2E/	c                 óT  •‡‡‡‡‡‡— ddl m}  	 ‰d         ‰d         ‰d         fD ]}|�|                     ¦   «          Œ‰                     ‰d         ‰
¦  «        \  ŠŠt	          j        ‰¦  «        r ‰d¦  «         dS ‰                     ‰d         ‰
¦  «        \  ŠŠt	          j        ‰¦  «        r ‰d¦  «         dS ‰                     ‰d         ‰
¦  «        \  ŠŠt	          j        ‰¦  «        r ‰d¦  «         dS  ‰‰‰‰¦  «         t          d¦  «        rZ‰‰‰z   k    rQ‰‰f‰j        vrF‰j                             ‰‰f¦  «         t          d¦  «         
                    ˆˆˆˆˆˆfd	„¦  «         ‰‰‰z   k     S # | $ r Y dS ‰	$ r}d
t          |¦  «        v rY d }~dS ‚ d }~ww xY w)Nr   )ÚNoTritonConfigsErrorr   z%register spilling of the first kernelFz&register spilling of the second kernelz%register spilling of the fused kernelÚslow_fusionc            	     ó$   •— ‰‰ ‰‰‰‰‰‰ ‰z   z  dœS )N)Úkernel1_pathÚkernel1_latencyÚkernel2_pathÚkernel2_latencyÚfused_kernel_pathÚfused_kernel_latencyÚslow_down_ratior…   )r)  r*  r'  Úpath1Úpath2Ú
path_fuseds   €€€€€€rs   rA  zKScheduler.speedup_by_fusion.<locals>.benchmark_when_ready.<locals>.<lambda>Q  s-   ø€ Ø05Ø36Ø05Ø36Ø5?Ø8@Ø3;¸sÀS¹yÑ3Ið%ð %€ ru   úLoop-carried variableT)Ú)torch._inductor.runtime.triton_heuristicsrX  r¿  rÝ  r  Úisinfr$   rÉ  r³  r#   rñ  rÖ   )rX  r   r  r)  r*  r'  rb  rc  rd  r&  rì  Úfuture_and_mod_l1Úfuture_and_mod_l1_fusedÚfuture_and_mod_l2r+  rr   rv  s      @@@@@@€€€€€€€€rs   rV  z9Scheduler.speedup_by_fusion.<locals>.benchmark_when_ready  sm  øøøøøøø€ ðð ð ð ð ð ðAð *¨!Ô,Ø)¨!Ô,Ø/°Ô2ð ð )ð )˜ð
 ˜?ØŸJšJ™LœL˜Løà!%×!@Ò!@Ø)¨!Ô,àñ"ô "‘J�C˜õ
 ”z #‘”ð %Ø˜ÐCÑDÔDÐDØ$˜uà!%×!@Ò!@Ø)¨!Ô,àñ"ô "‘J�C˜õ
 ”z #‘”ð %Ø˜ÐDÑEÔEÐEØ$˜uà+/×+JÒ+JØ/°Ô2àñ,ô ,Ñ(�H˜jõ
 ”z (Ñ+Ô+ð %Ø˜ÐCÑDÔDÐDØ$˜uà�J˜x¨¨cÑ2Ô2Ð2õ 0°Ñ>Ô>ðà$¨¨c©	Ò1Ð1Ø" E˜N°$Ô2IÐIÐIàÔ/×3Ò3°U¸E°NÑCÔCÐCÝ(¨Ñ7Ô7×?Ò?ðð ð ð ð ð ð ð ð ñ
ô 
ð 
ð $ c¨C¡iÒ/Ð/øà+ð !ð !ð !Ø ˜5˜5à'ð ð ð Ø.µ#°a±&´&Ð8Ð8Ø#˜t˜t˜t˜t˜tØøøøøðøøøs7   �A.E> Á?>E> Â?>E> Ã?A>E> Å>F'ÆF'Æ
F"Æ!F"Æ"F'r}   )r'  ry  r)  ry  r*  ry  rŠ   r   )r  r3  rŠ   rv   )r  r8  rŠ   rv   r%  )Dr  r²   r›  r0   r]  rZ  r-   rW  rk   rz   Úbenchmark_fusionrö  rú  r»   rª   r«   rÆ  r¥   rª  r«  r  Útriton.compiler.errorsr&  rê  ró  ré  rø  r÷  rÿ  rÌ  rp  rq  rÕ  r6  r:  rç   r!  rÕ  ry  r¿  rc  rò  r  r  r*  ró  rÝ  rG  r"   Úbenchmark_epilogue_fusionrÿ   rö  r   Ú max_epilogue_benchmarked_choicesrõ  ÚoperatorÚ
itemgetterrZ  r2  rÇ  rÈ  rù  rú  rÑ  r{  r  rÏ   r~   )0rr   rˆ   r‰   Úis_multi_templateÚatomic_add_template_epilogueÚnode_list_1Únode_list_2Úhas_atomic_addrÕ  r  r?  rH  rI  rJ  ro   r<  r  r'  rL  Únum_triton_callersÚchoice_timings_iterr7  r>  Útriton_choicerc  Útriton_choicesÚunfused_timerV  r2  r&  rP  r÷  rì  rM  rh  ri  rj  rQ  rR  rS  r+  rT  r)  r*  rU  rÞ  r=  rv  s0   ```                         @@@@@@@@@@@@@@@@@@@@rs   Úspeedup_by_fusionzScheduler.speedup_by_fusionŽ  s€  øøøøøøøøøøøøøøøøøøøøøøø€ õ  ð  
ð  
ð ˜U�^ð 
ñ  
ô  
ñ 
ô 
Ðõ
 (2Ø×#Ò#Ñ%Ô%¥rÔ'>ñ(
ô (
ð (Jå.¨uÀ5ÐIÑIÔIð 	%ð (ð 	,µÔ0Vð 	,Ý×$Ò$ UÑ+Ô+Ð+åÔ&ð 	+Ð/@ð 	+Ý×$Ò$ TÑ*Ô*Ð*ð ×ÒÑÔð	+å˜u×6Ò6Ñ8Ô8½"Ô:QÑRÔRð	+ð ×ÒÑ!Ô!ð	+ð ×ÒÑ!Ô!ð		+õ  ×$Ò$ TÑ*Ô*Ð*à—o’oÑ'Ô'ˆØ˜Q”×*Ò*Ñ,Ô,ˆØˆˆˆvð Œ;˜%ÒÐ¥FÔ$6¸(Ò$BÐ$BÝ×$Ò$ TÑ*Ô*Ð*à—o’oÑ'Ô'ˆÝ�yœ¨{¸KÑHÔHÑIÔIˆØ×-Ò-¨oÑ>Ô>ˆð ð 	+Ð"3ð 	+Ý×$Ò$ TÑ*Ô*Ð*à;Ð;Ð;Ð;Ð;Ð;å˜˜uÑ%Ô%ˆà  Ô#×.Ò.Ñ0Ô0ˆØÐ!Ð!Ð!ð	ð 	ð 	ð 	ð 	ð 	ð 	ð" ñ O	¥ð %
ð %
Ø8=¸u°~ð%
ñ %
ô %
ñ "
ô "
ñ O	ð $×5Ò5Ñ7Ô7¸tÐCˆOð #ð/�×'Ò'Ñ)Ô)Ð)à×,Ò,Ñ.Ô.ð õ
 ˜j­"Ô*@ÑAÔAÐAÐAÐAà×5Ò5°jÑAÔAð 0Ý#×(Ò(¨Ñ/Ô/Ð/ð ð -ð "ñ .VØTV�Ý%+Ô%>ð ,Vñ ,V�MØ%/×%>Ò%>¸}Ñ%MÔ%M�NÝ%+¨N×,@Ò,@Ñ,BÔ,BÈÈÐ%WÑ%WÔ%Wð ð ™	˜ Ý)Ø"Ý!œOÔ<ÔQñ ô  ð %ð %Ø'×=Ò=¸fÑEÔEð 	ð 	Ø*×1Ò1à$*ð!"à%)×%8Ò%8Ø(7Ø6<Ô6Jð &9ñ &&ô &&ð!"ð !"ñô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øõ $)¨¡<¤<�LØGK�OØ"$�KØ5Cð 9ð 9Ñ1˜ ¨	ð
%Ø%Ð1Ø &§¢¡¤ øøÝ(ð %ð %ð %Ý)×6Ò6µw´}ÑEÔEð "Ý *× 0Ò 0Ø$CØ6EÐ$U J JÈ:Ø$%ñ!"ô !"ð !"ð
 %˜H˜H˜H˜Høøøøð%øøøð (×=Ò=¸fÑEÔEð 9ð 9Ø-1×-LÒ-LØ )¨6ñ.ô .™N˜H dð 3;˜K¨Ñ/Ø'¨,Ò6Ð6Ø/7 Ø28 ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9øð AL�JÔ.¨}Ñ=Ý% oÕ7OÑPÔPÐPÐPÐPØFUÐ4°]ÑCÑCå#Ô=ˆNÝ!$ð %ð %ØAKÔASð%ñ %ô %ñ "ô "Ðõ
 )Ñ*Ô*ð RØ&Ð&ðRà&­&Ô*QÒQð %õ ˜U‘|”|¥U¨5¡\¤\ˆHˆC�Ø15ˆJØ+ð 
Kà!+×!:Ò!:Ñ!<Ô!<�Ø",×";Ò";Ñ"=Ô"=‘�
˜CÝ&,Ø"×(Ò(Ñ*Ô*µÔ0CÀAÑ0FÔ0Fð'ñ 'ô 'Ð#Ð#ð 'KÐ&J°zÔ7IÐ&JÑ&JÔ&JÐ#à>Ð>Ð>Ð>Ð>Ð>ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð0 ñ /Ø&ð 4Ý'×,Ò,¨UÑ3Ô3Ð3à%G¥vÔ'@Ð%GÀ$Ð%Gð Vð V�MØ%/×%>Ò%>¸}Ñ%MÔ%M�NØGK�OÝ%+Ø&×,Ò,Ñ.Ô.µHÔ4GÈÑ4JÔ4Jð&ñ &ô &ð "ð "™	˜ ð  6Ð5°fÑ=Ô=ð %Ø$Ý(.¬Ý!œOÔ<ÔQØ"ñ)ô )˜ð 8Ð7¸ÑFÔFð "Ø.;˜OØ!˜Eð"ð 'Ð.Ý+×0Ò0°Ñ7Ô7Ð7Ð7Ð7ØFUÐ4°]ÑCÐCåÔ,ð Ø×9Ò9Ø8ñô ð ð ð ×8Ò8Ø8¸Ô>ñô ð õ $×(Ò(¨Ñ.Ô.Ð.àð Pð 'ðA�D×.Ò.¨{Ñ;Ô;Ð;à×3Ò3°KÑ@Ô@ñ ��U�Uð 'ð 4Ý'×,Ò,¨UÑ3Ô3Ð3à×2Ò2Ñ4Ô4�Ý<¸UÀEÈ3ÑOÔO�	ð QSˆNØˆNØ(;ð !ð !Ñ$�˜Ø-Ð-¨fÑ5Ô5ð ØÝœÕ%=¸vÑFÔF�à!ð  l°c¸C±iÒ&?Ð&?Ø�Eà !Ñ#�Ø!¥FÔ$KÒKÐKØ�Eà×5Ò5°fÑ=Ô=ð !ð !ð!Ø&×-Ò-Ø#ÐK d×&9Ò&9¸/Ñ&JÔ&JÐKÐKñô ð ð øð %ð !ð !ð !ð !ð!ð !ð !ñ !ô !ð !ð !ð
!øøøðð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !øõ �>Ñ"Ô" aÒ'Ð'Ý#×(Ò(¨Ñ/Ô/Ð/ðj!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!ð j!õX  ×-Ò-Ø$ n°QÔ&7¸Ô&:ñô ð ð !%× 3Ò 3°KÑ @Ô @ÐØ $× 3Ò 3°KÑ @Ô @ÐØ&*×&9Ò&9¸/Ñ&JÔ&JÐ#ðFð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð FõP  ×-Ò-Ø0Ð9PÐQRÔ9Sð .ñ ô ð ss   Î4OÏO	ÏO	Ï-PÐ
QÐAQÑQÑ4)R)Ò)R-Ò0R-ß3aß5,`"à!aà"`5à'aà4`5à5aáa		áa		c                ó@   — | j         |                     ¦   «                  S )z0Look up the node in Scheduler name_to_fused_node)rÇ  rÏ  rM  s     rs   r	  zScheduler.get_fused_nodej  s   € àÔ& t×':Ò':Ñ'<Ô'<Ô=Ð=ru   r€  úOrderedSet[BaseSchedulerNode]c                óp  ‡— t                                d|                     ¦   «         |                     ¦   «         ¦  «         |                     ¦   «         }|                     ¦   «         |k    sJ ‚|                      |¦  «                             ||¦  «        Š|                     |¦  «         |                     |¦  «         |                     ‰¦  «         | j         	                    ˆfd„‰ 
                    ¦   «         D ¦   «         ¦  «         | j                             |¦  «        }|�
|| j        ‰<   ‰S )Nzfusing %s with %sc                ó:   •— i | ]}|                      ¦   «         ‰“ŒS r…   rI  )r·   rÜ  Únode3s     €rs   rK  z,Scheduler.fuse_two_nodes.<locals>.<dictcomp>|  s#   ø€ Ð'WÐ'WÐ'WÀ¨¯
ª
©¬°eÐ'WÐ'WÐ'Wru   )rò  ró  rê  rª   r<  rz   rS  r³  rÇ  rþ  r»   r®  r¾  )rr   rˆ   r‰   r€  rì  Ústream1r€  s         @rs   Úfuse_two_nodeszScheduler.fuse_two_nodesn  s#  ø€ õ 	×ÒÐ,¨e¯nªnÑ.>Ô.>ÀÇÂÑ@PÔ@PÑQÔQÐQà×!Ò!Ñ#Ô#ˆØ×ÒÑ!Ô! VÒ+Ð+Ð+Ð+Ø× Ò  Ñ(Ô(×-Ò-¨e°UÑ;Ô;ˆØ×Ò˜5Ñ!Ô!Ð!Ø×Ò˜5Ñ!Ô!Ð!Ø�Š˜ÑÔÐØÔ×&Ò&Ð'WÐ'WÐ'WÐ'WÀUÇ_Â_ÑEVÔEVÐ'WÑ'WÔ'WÑXÔXÐXð Ô%×)Ò)¨%Ñ0Ô0ˆØÐØ)0ˆDÔ Ñ&àˆru   Ú
speedup_fnr{   c                ó¤   — |                       ||¦  «        r9|                      ||¦  «        s# |¦   «         r|                      |||¦  «         dS dS ©NTF)r  Úwill_fusion_create_cycler‚  )rr   rˆ   r‰   rƒ  r€  s        rs   Úfuse_if_speedupzScheduler.fuse_if_speedup†  sf   € ð �MŠM˜% Ñ'Ô'ð	à×1Ò1°%¸Ñ?Ô?ð	ð �
‘”ð	ð
 ×Ò  u¨kÑ:Ô:Ð:Ø�4àˆuru   Útemplate_fusion_candidatesú,dict[BaseSchedulerNode, list[PendingFusion]]c                óä  — |�rìg }i }t          ¦   «         }|D �]8}||v rt          ||         ¦  «        dk    sJ ‚||                              d¦  «        }t          ||         ¦  «        dk    r|                     |¦  «         |                     ¦   «         \  }}	|	|k    rt          ||	¦  «        sJ ‚|}
n||k    sJ ‚t          ||	¦  «        sJ ‚|	}
|                      |
¦  «        |
urŒÑ|j        r.|j        j        }|€J ‚| 	                    |¦  «         ||f||<   �Œ|  
                    ||	|j        |¦  «        r|                     |¦  «         �Œ:t          |¦  «        D ]o}||         \  }}|  
                    |                      |j        ¦  «        |                      |j        ¦  «        |j        |¦  «        r|                     |¦  «         Œp|D ]}|                     |¦  «         Œ|�°êdS dS )zÁ
        Evaluate pending template fusions for a set of fusion candidate nodes.
        The fusion candidate nodes are pointwise nodes as potential epilogue
        or prologue fusions
        r   r   N)r   rÏ   r²  r³  rŽ   re  rh  r	  ro   rç   r‡  rm   r   rˆ   r‰   )rr   rˆ  r€  Útemplate_futuresÚfuture_to_pending_fusionÚfusions_to_removerÞ  Úpending_fusionrˆ   r‰   r­  ÚfÚcands                rs   Ú"_evaluate_pending_template_fusionsz,Scheduler._evaluate_pending_template_fusions—  s†  € ð )ñ 9	2Ø-/Ðð ð %õ @J¹|¼|ÐØ7ð %9ñ %9�	àÐ!;Ð;Ð;ÝÐ6°yÔAÑBÔBÀaÒGÐGÐGðHð "<¸IÔ!F×!JÒ!JÈ1Ñ!MÔ!M�åÐ1°)Ô<Ñ=Ô=ÀÒBÐBØ%×)Ò)¨)Ñ4Ô4Ð4à-×>Ò>Ñ@Ô@‘��uà˜IÒ%Ð%Ý-¨e°UÑ;Ô;Ð;Ð;Ð;Ø$)�M�Mà  IÒ-Ð-Ð-Ð-Ý-¨e°UÑ;Ô;Ð;Ð;Ð;Ø$)�Mð ×&Ò& }Ñ5Ô5¸]ÐJÐJØà!Ô(ð 
9Ø&Ô-Ô4�AØ˜=˜=˜=Ø$×+Ò+¨AÑ.Ô.Ð.Ø3AÀ9Ð2MÐ,¨QÑ/Ñ/ð ×+Ò+Ø˜u nÔ&@À+ñô ð 9ð *×-Ò-¨iÑ8Ô8Ð8ùõ "Ð"2Ñ3Ô3ð 0ð 0�Ø'?ÀÔ'BÑ$� Ø×'Ò'Ø×'Ò'¨Ô(<Ñ=Ô=Ø×'Ò'¨Ô(<Ñ=Ô=Ø"Ô.Øñ	ô ð 0ð &×)Ò)¨$Ñ/Ô/Ð/øà&ð 2ð 2�Ø*×.Ò.¨qÑ1Ô1Ð1Ð1ðs )ñ 9	2ð 9	2ð 9	2ð 9	2ð 9	2ru   Úpossible_fusion_pairsú1list[tuple[BaseSchedulerNode, BaseSchedulerNode]]Úpending_fusionsú&dict[BaseSchedulerNode, PendingFusion]Útemplate_fusion_nodesrÈ  c                óÖ  ‡ ‡‡— dˆˆˆ fd„}|D �]Y\  }} |||¦  «         ‰                       |¦  «        }‰                       |¦  «        }t          ||¦  «        r||f‰ j        v rŒX‰                      |||¦  «        rê‰                      ||¦  «        sÔ‰                      ||¦  «        }	|	j        �—t          |	j        |||	j        ¬¦  «        }
t          ||¦  «        r^||f‰ j        vsJ ‚‰ j         	                    ||f¦  «         t          ||¦  «        }||vrg ||<   ||                              |
¦  «         n
|
‰|<   |
‰|<   �Œ9|	j        s�ŒB‰                      ||‰¦  «         �Œ[d S )	Nrˆ   rf   r‰   rŠ   r   c                óÚ  •— ‰                      | ¦  «        ‰v s‰                      |¦  «        ‰v �r:‰                     ‰                      | ¦  «        ‰                     ‰                      |¦  «        ¦  «        ¦  «        }|€J ‚|                     ¦   «         \  }}|j        }‰                     |d ¦  «         ‰                     |d ¦  «         ‰                      |¦  «        |u sJ ‚‰                      |¦  «        |u sJ ‚ |¦   «         r‰                     | |¦  «        r�Œ ‰                     ||‰¦  «         ‰                      | ¦  «        ‰v �° ‰                      |¦  «        ‰v �°8d S d S r   )r	  r¾  rŽ   rm   r²  r†  r‚  )	rˆ   r‰   rŽ  Ú	node_key1Ú	node_key2Ú
is_speedupr€  r”  rr   s	         €€€rs   Úresolve_pending_fusionsz<Scheduler._try_fusion_pairs.<locals>.resolve_pending_fusionså  s’  ø€ ð
 ×#Ò# EÑ*Ô*¨oÐ=Ð=Ø×&Ò& uÑ-Ô-°Ð@Ñ@à!0×!4Ò!4Ø×'Ò'¨Ñ.Ô.Ø#×'Ò'¨×(;Ò(;¸EÑ(BÔ(BÑCÔCñ"ô "�ð &Ð1Ð1Ð1à'5×'FÒ'FÑ'HÔ'HÑ$�	˜9Ø+Ô7�
à×#Ò# I¨tÑ4Ô4Ð4Ø×#Ò# I¨tÑ4Ô4Ð4à×*Ò*¨9Ñ5Ô5¸ÐBÐBÐBÐBØ×*Ò*¨9Ñ5Ô5¸ÐBÐBÐBÐBà!�z‘|”|ð  t×'DÒ'DÀUÈEÑ'RÔ'Rð Ùà×#Ò# I¨y¸+ÑFÔFÐFð+ ×#Ò# EÑ*Ô*¨oÐ=Ñ=Ø×&Ò& uÑ-Ô-°Ð@Ñ@Ð@Ð@Ð@Ð@ru   )rm   rˆ   r‰   ro   r÷  )r	  rj  rÀ  r  r†  r{  rm   r‡   ro   r³  rm  rç   rl   r‚  )rr   r’  r”  r–  r€  rÈ  rœ  rˆ   r‰   Ú
fusion_resrŽ  Útemplate_pw_nodes   ` ` `       rs   Ú_try_fusion_pairszScheduler._try_fusion_pairsÝ  s   øøø€ ð	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð8 2ð +	?ñ +	?‰LˆE�5ð $Ð# E¨5Ñ1Ô1Ð1Ø×'Ò'¨Ñ.Ô.ˆEØ×'Ò'¨Ñ.Ô.ˆEõ # 5¨%Ñ0Ô0ðà˜E�N dÔ&@Ð@Ð@àà�}Š}Ø�uÐ.ñô ð ?à×3Ò3°E¸5ÑAÔAð?ð "×3Ò3°E¸5ÑAÔA�
ØÔ)Ð5Ý%2Ø$.Ô$:Ø#Ø#Ø)Ô0ð	&ñ &ô &�Nõ *¨%°Ñ7Ô7ð 
@Ø % u˜~°TÔ5OÐOÐOÐOÐOØÔ2×6Ò6¸¸u°~ÑFÔFÐFå+BÀ5È%Ñ+PÔ+PÐ(Ø+Ð3HÐHÐHØFHÐ1Ð2BÑCØ-Ð.>Ô?×FÒFÀ~ÑVÔVÐVÐVà1?˜¨Ñ.Ø1?˜¨Ñ.áà!Ô-ð Ùà×#Ò# E¨5°+Ñ>Ô>Ð>ùðW+	?ð +	?ru   c                ót  — t          ¦   «         }|                     ¦   «         D ]”}|                     ¦   «         \  }}|j        }||v st	          ||¦  «        rŒ5|                     |¦  «         |                      |¦  «        |u sJ ‚|                      |¦  «        |u sJ ‚|                      ||||¦  «         Œ•d S r   )r   rà   rŽ   rm   rj  r³  r	  r‡  )rr   r€  r”  Úseen_pair_speedup_fnrŽ  r™  rš  Úis_speedup_fns           rs   Ú_finish_pending_fusionsz!Scheduler._finish_pending_fusions.  sî   € õ
 @J¹|¼|Ðð .×4Ò4Ñ6Ô6ð 	Sð 	SˆNØ#1×#BÒ#BÑ#DÔ#DÑ ˆI�yØ*Ô6ˆMàÐ 4Ð4Ð4Õ8JØ˜9ñ9ô 9Ð4ð à ×$Ò$ ]Ñ3Ô3Ð3à×&Ò& yÑ1Ô1°YÐ>Ð>Ð>Ð>Ø×&Ò& yÑ1Ô1°YÐ>Ð>Ð>Ð>à× Ò  ¨I°}ÀkÑRÔRÐRÐRð	Sð 	Sru   Úpossible_fusionsÚdeferred_prologue_fusionsc                óÒ   — t          d„ |D ¦   «         ¦  «        }g }|D ]H\  }}t          ||¦  «        r||v r|                     ||f¦  «         Œ1|                     ||f¦  «         ŒI|S )Nc                ó8   — g | ]\  }}t          ||¦  «        ¯|‘ŒS r…   rl  )r·   Ún1Ún2s      rs   r   z6Scheduler._handle_template_overlap.<locals>.<listcomp>O  s,   € ÐMÐMÐM‘F�B˜Õ2DÀRÈÑ2LÔ2LÐMˆRÐMÐMÐMru   )r   rh  rç   )rr   r¤  r¥  Úepilogue_template_nodesÚnew_possible_fusionsr¨  r©  s          rs   Ú_handle_template_overlapz"Scheduler._handle_template_overlapF  sš   € õ #-ØMÐMÐ.ÐMÑMÔMñ#
ô #
Ðð  "ÐØ&ð 	6ð 	6‰FˆB�Ý! " bÑ)Ô)ð 6¨bÐ4KÐ.KÐ.KØ)×0Ò0°"°b°Ñ:Ô:Ð:Ð:à$×+Ò+¨R°¨HÑ5Ô5Ð5Ð5à#Ð#ru   c                ó$  — |                       |¦  «         t          |¦  «        }t                               t          j        ¦  «        rLt                               d¦  «         |D ]/}t                               d|                     ¦   «         ¦  «         Œ0i }i }g }|                      ||¦  «        }t          j
        st          j        r|                      ||¦  «        }|                      |||||¦  «         |                      ||¦  «         |                      ||¦  «         |                     ¦   «          |r/|                      |||||¦  «         |                      ||¦  «         t#          |d„ ¬¦  «        }|                      |¦  «        }|S )a  
        Combine eligible nodes into FusedSchedulerNodes.

        This relies on two key functions to control the logic:
            - self.can_fuse(): checks if a fusion is legal
            - self.score_fusion(): assigns priority to a given fusion
        zfuse_nodes_once, candidates:z  %sc                ó   — | j         S r   rÌ  rÅ  s    rs   rA  z+Scheduler.fuse_nodes_once.<locals>.<lambda>›  s   € °!´+€ ru   rú  )rË  r   rò  r  r  r*  ró  rx  Úget_possible_fusionsr-   rÓ  rÔ  r¬  rŸ  r£  r‘  Úclearrÿ  rÂ  )	rr   rw  rÈ  r€  r”   r”  r–  r¥  r¤  s	            rs   rÉ  zScheduler.fuse_nodes_onceZ  sÙ  € ð 	×!Ò! %Ñ(Ô(Ð(Ý  Ñ'Ô'ˆÝ×"Ò"¥7¤=Ñ1Ô1ð 	AÝ×ÒÐ;Ñ<Ô<Ð<Ø#ð Að A�Ý× Ò  ¨×)=Ò)=Ñ)?Ô)?Ñ@Ô@Ð@Ð@ð ð 	ð
 OQÐð ð 	"ð  ×4Ò4ØØñ
ô 
Ðõ
 Ô#ð 	¥vÔ':ð 	Ø#×<Ò<Ø Ð";ñ ô  Ðð 	×ÒØØØ!ØØñ	
ô 	
ð 	
ð 	×$Ò$ [°/ÑBÔBÐBà×/Ò/Ð0EÀ{ÑSÔSÐSØ×#Ò#Ñ%Ô%Ð%à$ð 	XØ×"Ò"Ø)ØØ%ØØ ñô ð ð ×3Ò3Ð4IÈ;ÑWÔWÐWå�{Ð(=Ð(=Ð>Ñ>Ô>ˆØ×.Ò.¨uÑ5Ô5ˆØˆru   rœ   r›   Úmax_distanceú!Iterator[list[BaseSchedulerNode]]c              #  óÖ   ‡K  — t          | ˆfd„¬¦  «        }|dk     r|r|V — dS g }d}|D ]4}‰|         }|r||z
  |k    r|V — g }|s|}|                     |¦  «         Œ5|r|V — dS dS )u  Sort `nodes` by baseline index, then yield groups whose span
        is at most `max_distance`. Start a new window whenever the next
        node would push the span past the limit. Negative `max_distance`
        means "no limit" â€” yield everything as one window.
        c                ó   •— ‰|          S r   r…   )rÜ  rœ   s    €rs   rA  z-Scheduler._distance_windows.<locals>.<lambda>ª  s   ø€ ¨k¸!¬n€ ru   rú  r   Nr!  )rÿ  rç   )rw  rœ   r±  ÚorderedÚwindowÚ
window_minrÜ  Úidxs    `      rs   Ú_distance_windowszScheduler._distance_windowsŸ  sÎ   øè è € õ ˜Ð$<Ð$<Ð$<Ð$<Ð=Ñ=Ô=ˆØ˜!ÒÐØð Ø���ØˆFØ*,ˆØˆ
Øð 	ð 	ˆAØ˜a”.ˆCØð ˜# 
Ñ*¨\Ò9Ð9Ø���Ø�Øð !Ø �
Ø�MŠM˜!ÑÔÐÐØð 	ØˆLˆLˆLˆLˆLð	ð 	ru   rŸ  c           	     óP  ‡ ‡‡— t          ‰ j        ¦  «        ŠdŠt          ‰ j        ¦  «        }t                               d|¦  «         t
          j        dk    }t
          j        }t
          j        }|dup|du}t
          j	        }d}d}	|r‰  
                    ¦   «         }	|	j        }
nd„ t          ‰ j        ¦  «        D ¦   «         }
dˆˆˆ fd„}t          t                               ‰ ¦  «        ¦  «        D �]\  }}|�	‰|k    r �nt                               |¦  «        }t          |¦  «        dk     rŒ?t                                ||
|¦  «        D ]¸}|�‰|k    r n­t          |¦  «        dk     s‰                      |¦  «        sŒ5|rK|	€J ‚t'          j        ¦   «         }‰                      |||	||¬¦  «         |t'          j        ¦   «         |z
  z  }Œ‚t          |d         j        |d|t
          j        ¬¦  «        } ||||¦  «         Œ¹�Œt1          ‰d„ ¬¦  «        ‰ _        ‰                      ‰ j        ¦  «        ‰ _        t                               d‰|t          ‰ j        ¦  «        ¦  «         |rt                               d|¦  «         ‰                      ‰ j        ¦  «         dS )a"  Group parallel nodes into combo kernels.

        Each parallel group is split into windows whose baseline-index
        span is at most `combo_kernel_max_distance` (set the config to a
        negative value to disable splitting). If a peak-memory threshold is set,
        each window goes through the gate, which simulates the
        post-fusion peak and accepts the combo only if the peak stays
        under the threshold; rejected windows are halved and retried.
        Without a threshold, every window becomes a combo directly.
        r   z2ComboKernels: Generating with num_ck_nodes = %s...Nç        c                ó   — i | ]\  }}||“Œ	S r…   r…   r§  s      rs   rK  z7Scheduler.create_combo_kernel_nodes.<locals>.<dictcomp>×  s   € ÐBÐBÐB¡D A q˜1˜aÐBÐBÐBru   Ú
combo_nodere  Úacceptedr¢  Únumr‘   rŠ   r   c                ó�  •‡ — ‰dz  Št                                dt          |¦  «        |¦  «         |D ]}‰                     |¦  «         Œ‰                     ‰ ¦  «         ‰j                             ˆ fd„‰                      ¦   «         D ¦   «         ¦  «         ‰j         	                    |d         ¦  «        }|�|‰j        ‰ <   d S d S )Nr   z0ComboKernels: Combining %d nodes for %d-th groupc                ó:   •— i | ]}|                      ¦   «         ‰“ŒS r…   rI  )r·   rÜ  r½  s     €rs   rK  zQScheduler.create_combo_kernel_nodes.<locals>._register_accept.<locals>.<dictcomp>é  s#   ø€ ÐJÐJÐJ¨a�—’‘”˜zÐJÐJÐJru   r   )
rd  rz  rÏ   rS  r³  rÇ  rþ  r»   r®  r¾  )r½  r¾  r¿  r”   Ústreamr¶  r€  rr   s   `    €€€rs   Ú_register_acceptz=Scheduler.create_combo_kernel_nodes.<locals>._register_acceptÙ  sé   øø€ ð �Q‰JˆEÝ�HŠHØBÝ�H‘”Øñô ð ð
 !ð )ð )�Ø×"Ò" 4Ñ(Ô(Ð(Ð(Ø�OŠO˜JÑ'Ô'Ð'ØÔ#×*Ò*ØJÐJÐJÐJ°:×3GÒ3GÑ3IÔ3IÐJÑJÔJñô ð ð Ô(×,Ò,¨X°a¬[Ñ9Ô9ˆFØÐ!Ø28�Ô# JÑ/Ð/Ð/ð "Ð!ru   rÎ   )r  Ú	on_acceptT©r|  r  r‚  c                ó   — | j         S r   rÌ  rÅ  s    rs   rA  z5Scheduler.create_combo_kernel_nodes.<locals>.<lambda>  s   € °q´{€ ru   rú  zDGenerated ComboKernel nodes: %d ComboKernels, totally %d -> %d nodesz9ComboKernels memory-aware: %.3fs spent in peak simulation)r½  re  r¾  r¢  r¿  r‘   rŠ   r   )r   rw  rÏ   rd  ró  r-   r)  Ú$combo_kernel_peak_memory_increase_gbÚ&combo_kernel_peak_memory_pct_thresholdÚcombo_kernel_max_distanceÚ_init_peak_memory_contextrœ   rª  re  r¾  r¤  rã  r¹  Úspeedup_by_combo_kernelÚtimeÚperf_counterÚ_try_combo_with_halvingrä  Ú!combo_kernel_per_subkernel_blocksrÿ  rÂ  rz  rË  )rr   rŸ  Únum_nodes_origr  Ú
abs_thr_gbÚpct_thrÚmemory_checkr±  Úmemory_sim_timeÚmem_ctxrœ   rÃ  r¿  r  Úmembersr¶  Ú	sim_startr½  r¶  r€  s   `                 @@rs   rÙ  z#Scheduler.create_combo_kernel_nodes¼  s  øøø€ õ ! ¤Ñ,Ô,ˆØˆÝ˜TœZ™œˆÝ�	Š	ÐFÈÑUÔUÐUÝ Ô7¸!Ò;ˆåÔ@ˆ
ÝÔ?ˆØ!¨Ð-ÐD°ÀÐ1DˆÝÔ7ˆØˆØ37ˆØð 	CØ×4Ò4Ñ6Ô6ˆGØ!Ô-ˆKˆKàBÐB­I°d´jÑ,AÔ,AÐBÑBÔBˆKð	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9õ, (Ý&×DÒDÀTÑJÔJñ
ô 
ð #	>ñ #	>‰NˆC�ð Ð'¨E°LÒ,@Ð,@Ø‘Ý0×AÒAÀ)ÑLÔLˆGÝ�7‰|Œ|˜aÒÐØå#×5Ò5Ø˜ lñô ð >ð >�ð  Ð+°¸Ò0DÐ0DØ�EÝ�v‘;”; ’?�?¨$×*FÒ*FÀvÑ*NÔ*N�?ØØð >Ø"Ð.Ð.Ð.Ý $Ô 1Ñ 3Ô 3�IØ×0Ò0ØØØØ(7Ø"2ð 1ñ ô ð ð $¥tÔ'8Ñ':Ô':¸YÑ'FÑF�O�Oå!;Ø˜qœ	Ô+ØØ26Ø(7Ý-3Ô-Uð"ñ "ô "�Jð %Ð$ Z°¸Ñ=Ô=Ð=Ð=ùå˜KÐ-BÐ-BÐCÑCÔCˆŒ
Ø×3Ò3°D´JÑ?Ô?ˆŒ
Ý�ŠØRØØÝ�”
‰OŒOñ		
ô 	
ð 	
ð ð 	Ý�HŠHØKØñô ð ð 	×!Ò! $¤*Ñ-Ô-Ð-Ð-Ð-ru   r˜   c                ój  — ddl m}m}m}m}m}m} t          t          j	        j
                             ¦   «         ¦  «        }t          t          j	                             ¦   «         ¦  «        } || j        |¦  «        }	 || j        | j        ¦  «          || j        | j        | j        |	¦  «          || j        |	|¦  «        \  }
}} ||
t!          | j        ¦  «        ¦  «        \  }} ||
t!          | j        ¦  «        ¦  «        }t#          |d„ t%          | j        ¦  «        D ¦   «         |||¬¦  «        S )zŠBuild the immutable baseline state the gate compares against:
        original buffer lifetimes, original peak, and step indices.
        r   )r¡  Ú/assign_memory_planning_info_for_scheduler_nodesrk  rm  Ú+live_memory_before_steps_from_buf_info_listÚpeak_memory_from_buf_info_listc                ó   — i | ]\  }}||“Œ	S r…   r…   ©r·   r¸  r”   s      rs   rK  z7Scheduler._init_peak_memory_context.<locals>.<dictcomp>G  s   € ÐJÐJÐJ¡y s¨D˜˜sÐJÐJÐJru   )rš   rœ   r�   rž   r¢   )rÛ  r¡  rÙ  rk  rm  rÚ  rÛ  r   ra   rÂ   rj  r'  rÜ  rw  r  rÇ  rÏ   r˜   rª  )rr   r¡  rÙ  rk  rm  rÚ  rÛ  rj  rš   Úname_to_freeabler‰  r?  r�   r¢   s                 rs   rÊ  z#Scheduler._init_peak_memory_context#  s‘  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ "¥!¤'Ô"6×";Ò";Ñ"=Ô"=Ñ>Ô>ˆÝ"¥1¤7×#;Ò#;Ñ#=Ô#=Ñ>Ô>ˆà1Ð1°$´*¸lÑKÔKÐØ9Ð9¸$¼*ÀdÔFVÑWÔWÐWØ7Ð7ØŒJØÔ#ØÔØñ		
ô 	
ð 	
ð 6Ð5ØŒJÐ(¨-ñ
ô 
Ñˆ�q˜!ð :Ð9Ø�3˜tœz™?œ?ñ
ô 
Ñˆ�qð  KÐJØ�3˜tœz™?œ?ñ 
ô  
Ðõ (Ø'ØJÐJµI¸d¼jÑ4IÔ4IÐJÑJÔJØ'Ø&Ø!5ð
ñ 
ô 
ð 	
ru   Úgroup_nodesrÕ  r  ú-tuple[ForeachKernelSchedulerNode | None, int]c                ó8  ‡‡‡‡— ddl m} t          |d         j        |d|t          j        ¬¦  «        }t          ¦   «         }|D ]!}|                     |j        j	        ¦  «         Œ"t          |¬¦  «        |_        |j        Št          ¦   «         }t          j        Šd}	|D ]/}
|                     |
¦  «         ‰|
         }|‰k     r|Š||	k    r|}	Œ0g Šd}dˆfd„}t          ‰|	dz   ¦  «        D ]2}| j        |         }
|
|v r|s ||‰|¦  «         d}Œ% ||
||¦  «         Œ3d„ t#          ‰d„ ¬¦  «        D ¦   «         }|                      |¦  «        }ˆfd„t'          |¦  «        D ¦   «         Š‰|         }|D ]}
|‰|
<   Œdˆˆfd„}|j        ‰         } ||‰|	||j        |¬¦  «        }|j        }t/          |j        |¦  «        }||z
  }t          j        }t          j        }|�t7          |¦  «        dz  gng }|�|                     ||z  ¦  «         |sJ ‚|t;          |¦  «        k    }|dk    rd|z  |z  nd}|s,t<                               dtA          |¦  «        ||¦  «         dS t<           !                    dtA          |¦  «        ||¦  «         ||_        ||fS ) a4  The gate: does fusing `group_nodes` into one combo keep peak
        memory under the threshold?

        Returns `(combo_node, combo_step)` if accepted, or `(None, 0)`
        if rejected. The running peak lives on `mem_ctx.running_peak`.

        The pretend rewrite only changes node order inside the window
        `[region_start, region_end]` (the smallest range containing all
        members). Inside that window:
          - the members collapse into one combo node, all at `combo_step`,
          - everything else is evaluated from the original schedule.
        Outside the window, nothing moves. Earlier accepts are accounted
        for only by `mem_ctx.running_peak`. The threshold is checked
        against `mem_ctx.baseline_peak` (the original graph peak) so total
        peak drift is capped.
        r   )Úestimate_region_peak_memoryr   TrÅ  )Úpred_buffersr!  Fr”   rf   r’   r‘   r“   rŠ   r   c                óP   •— ‰                      t          ||| ¦  «        ¦  «         d S r   )rç   r�   )r”   r’   r“   Úlocal_entriess      €rs   Ú	add_localz9Scheduler._try_combo_with_memory_check.<locals>.add_localˆ  s)   ø€ Ø× Ò ¥¨S°(¸DÑ!AÔ!AÑBÔBÐBÐBÐBru   c                ó   — g | ]	}|j         ‘Œ
S r…   r¼   )r·   r  s     rs   r   z:Scheduler._try_combo_with_memory_check.<locals>.<listcomp>”  s'   € ð 
ð 
ð 
ØˆAŒFð
ð 
ð 
ru   c                ó   — | j         | j        fS r   )r’   r“   )r  s    rs   rA  z8Scheduler._try_combo_with_memory_check.<locals>.<lambda>•  s   € ÀÄÈÌ
Ð@S€ ru   rú  c                ó"   •— i | ]\  }}|‰|z   “ŒS r…   r…   )r·   r¨  rÜ  Úregion_starts      €rs   rK  z:Scheduler._try_combo_with_memory_check.<locals>.<dictcomp>™  s$   ø€ ÐKÐKÐK©D¨A¨q�A�| aÑ'ÐKÐKÐKru   c                ó,   •— | ‰v r‰|          S ‰|          S r   r…   )r”   Únew_steprœ   s    €€rs   Ústep_ofz7Scheduler._try_combo_with_memory_check.<locals>.step_ofž  s#   ø€ Ø�xÐÐØ ”~Ð%Ø˜tÔ$Ð$ru   )rê  Ú
region_endrí  rš   Ú
cur_memoryNi   @g      Y@r»  zLComboKernels memory-aware: rejected %d nodes (peak delta %+d bytes = %.3f%%)rì   zLComboKernels memory-aware: accepted %d nodes (peak delta %+d bytes = %.3f%%))r”   rf   r’   r‘   r“   r‘   rŠ   r   r0  )"rÛ  râ  re  rä  r-   rÏ  r   rþ  r0  rã  rG   rœ   ÚsysÚmaxsizer³  rg  rw  rÿ  rÂ  rª  r¢   rš   r�   r`  rž   rÇ  rÈ  ry  rç   ra  rd  ró  rÏ   rz  ) rr   rß  rÕ  r  râ  r½  Úcombo_pred_buffersÚmÚ	group_setrî  rÜ  r¸  Úinserted_comboræ  r¨  Úlocal_nodesÚ
combo_steprí  rï  Úregion_peakÚoriginal_peakÚnew_peakÚdeltarÑ  rÒ  ÚlimitsÚacceptÚpctrå  rì  rœ   rê  s                                @@@@rs   Ú_try_combo_with_memory_checkz&Scheduler._try_combo_with_memory_checkM  s®  øøøø€ ð, 	8Ð7Ð7Ð7Ð7Ð7å/Ø˜ŒNÔ$ØØ&*Ø+Ý!'Ô!Ið
ñ 
ô 
ˆ
õ (™\œ\ÐØð 	?ð 	?ˆAØ×%Ò% a¤jÔ&=Ñ>Ô>Ð>Ð>Ý7Ø+ð
ñ 
ô 
ˆ
Ôð Ô)ˆõ 4>±<´<ˆ	Ý”{ˆØˆ
Øð 	!ð 	!ˆAØ�MŠM˜!ÑÔÐØ˜a”.ˆCØ�\Ò!Ð!Ø"�Ø�ZÒÐØ �
øð ,.ˆØˆð	Cð 	Cð 	Cð 	Cð 	Cð 	Cõ �| Z°!¡^Ñ4Ô4ð 	ð 	ˆAØ”
˜1”ˆAØ�Iˆ~ˆ~Ø%ð *Ø�I˜j¨,¸Ñ:Ô:Ð:Ø%)�NØØˆI�a˜˜AÑÔÐÐð
ð 
Ý" =Ð6SÐ6SÐTÑTÔTð
ñ 
ô 
ˆð ×4Ò4°[ÑAÔAˆàKÐKÐKÐKµI¸kÑ4JÔ4JÐKÑKÔKˆØ˜jÔ)ˆ
Øð 	%ð 	%ˆAØ$ˆH�Q‰KˆKð	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð Ô1°,Ô?ˆ
à1Ð1ØØ%Ø!ØØ!Ô/Ø!ð
ñ 
ô 
ˆð  Ô-ˆÝ�wÔ+¨[Ñ9Ô9ˆØ˜=Ñ(ˆÝÔ@ˆ
ÝÔ?ˆØ4>Ð4J•%˜
Ñ#Ô# wÑ/Ð0Ð0ÐPRˆØÐØ�MŠM˜' MÑ1Ñ2Ô2Ð2ØˆˆˆvØ�#˜f™+œ+Ò%ˆà1>ÀÒ1BÐ1Bˆu�u‰}˜}Ñ,Ð,ÈˆØð 	Ý�IŠIð2å�KÑ Ô ØØñô ð ð �7å�Šð.å�ÑÔØØñ	
ô 	
ð 	
ð  (ˆÔØ˜:Ð%Ð%ru   rÞ  r¿  rÄ  úJCallable[[ForeachKernelSchedulerNode, list[BaseSchedulerNode], int], None]c               ó¶  ‡‡— |j         Š|g}|�rI|                     ¦   «         }t          |¦  «        dk     s|                      |¦  «        sŒ@t                               | |||¦  «        \  }}	|� ||||¦  «         Œpˆfd„|D ¦   «         }
t          |
¦  «        t          |
¦  «        }}||k    rŒ£||z   dz  Šˆˆfd„|D ¦   «         }ˆˆfd„|D ¦   «         }dt          |¦  «        cxk    rt          |¦  «        k     rn n|                     |¦  «         dt          |¦  «        cxk    rt          |¦  «        k     rn n|                     |¦  «         |�°GdS dS )zkTry the full candidate; on reject, halve at the
        baseline-index midpoint and try each half.
        rÎ   Nc                ó    •— g | ]
}‰|         ‘ŒS r…   r…   )r·   rÜ  Ún2is     €rs   r   z5Scheduler._try_combo_with_halving.<locals>.<listcomp>ï  s   ø€ Ð+Ð+Ð+˜q�C˜”FÐ+Ð+Ð+ru   c                ó,   •— g | ]}‰|         ‰k    ¯|‘ŒS r…   r…   ©r·   rÜ  Úmidr	  s     €€rs   r   z5Scheduler._try_combo_with_halving.<locals>.<listcomp>ô  s"   ø€ Ð8Ð8Ð8˜1¨#¨a¬&°Cª-¨-�Q¨-¨-¨-ru   c                ó,   •— g | ]}‰|         ‰k    ¯|‘ŒS r…   r…   r	  s     €€rs   r   z5Scheduler._try_combo_with_halving.<locals>.<listcomp>õ  s"   ø€ Ð6Ð6Ð6˜!¨¨Q¬°#ª¨�A¨¨¨ru   )	rœ   r²  rÏ   rË  rã  rÿ  ra  r`  rç   )rr   rÞ  r¿  rÕ  r  rÄ  ÚstackÚsubsetr½  r÷  ÚidxsÚloÚhiÚearlyÚlater	  r	  s                  @@rs   rÎ  z!Scheduler._try_combo_with_halvingÒ  s­  øø€ ð Ô!ˆà09¨{ˆØñ 	$Ø—Y’Y‘[”[ˆFÝ�6‰{Œ{˜QŠˆ d×&BÒ&BÀ6Ñ&JÔ&JˆØå%.×%KÒ%KØ�f˜g ñ&ô &Ñ"ˆJ˜
ð Ð%Ø�	˜* f¨cÑ2Ô2Ð2Øà+Ð+Ð+Ð+ FÐ+Ñ+Ô+ˆDÝ˜‘Y”Y¥ D¡	¤	�ˆBØ�RŠxˆxØØ˜‘7˜q‘.ˆCØ8Ð8Ð8Ð8Ð8 Ð8Ñ8Ô8ˆEØ6Ð6Ð6Ð6Ð6˜vÐ6Ñ6Ô6ˆDØ•C˜‘I”IÐ+Ð+Ò+Ð+¥ F¡¤Ò+Ð+Ð+Ð+Ð+Ø—’˜TÑ"Ô"Ð"Ø•C˜‘J”JÐ,Ð,Ò,Ð,¥ V¡¤Ò,Ð,Ð,Ð,Ð,Ø—’˜UÑ#Ô#Ð#ð- ñ 	$ð 	$ð 	$ð 	$ð 	$ru   c                óD   — |D ]}|                      | j        ¦  «         Œd S r   )rË  rÇ  )rr   rw  r”   s      rs   rË  zScheduler.prune_redundant_depsû  s5   € Øð 	?ð 	?ˆDØ×%Ò% dÔ&=Ñ>Ô>Ð>Ð>ð	?ð 	?ru   c                ó0  ‡ ‡‡
‡— g Š
t          t          t          t          f                  ¦   «         Šdˆˆ
ˆˆ fd„}t          j        t
          ¦  «        }|D ]J}‰                      |¦  «        rŒ|                     ¦   «         D ]}||                              |¦  «         ŒŒK| 	                    ¦   «         D ]} ||¦  «         Œt          j        rnt          j        t
          ¦  «        }|D ]0}t          |dd¦  «        }	|	r||	                              |¦  «         Œ1| 	                    ¦   «         D ]} ||¦  «         Œ‰                      ‰
¦  «        Š
‰
                     ‰ j        d¬	¦  «         t                                d
t%          ‰
¦  «        ¦  «         ‰
S )z^
        Helper to find all legal fusion opportunities, sorted by self.score_fusion()
        rw  r¢  rŠ   r   c                ó´  •— t          | ¦  «        D ]Æ\  }}| |dz   |dz   t          j        z   …         D ]£}||f}|‰v rŒ‰                     |¦  «         ‰                     ||‰¦  «        r‰                     |¦  «         ŒM|                     ¦   «         s|                     ¦   «         r.‰                     ||‰¦  «        r‰                     ||f¦  «         Œ¤ŒÇd S rl  )rª  r-   Ú)max_fusion_buffer_group_pairwise_attemptsr³  r  rç   rö  rú  )	rw  Únode1_indexrˆ   r‰   rû  rÈ  r¤  r„  rr   s	        €€€€rs   Úcheck_all_pairsz7Scheduler.get_possible_fusions.<locals>.check_all_pairs
  s'  ø€ Ý&/°Ñ&6Ô&6ð @ð @Ñ"�˜UØ"Ø !‘O kØñ'åÔFñ'Gð Gôð @ð @�Eð
 ! %˜.�CØ˜d�{�{Ø Ø—H’H˜S‘M”M�Mà—}’} U¨EÐ3CÑDÔDð @Ø(×/Ò/°Ñ4Ô4Ð4Ð4Ø×+Ò+Ñ-Ô-ð @°×1AÒ1AÑ1CÔ1Cð @ÈÏÊØ˜uÐ&6ñJô Jð @ð )×/Ò/°¸°Ñ?Ô?Ð?øð!@ð@ð @ru   rÇ   NT)rû  Úreversezfound %d possible fusions©rw  r¢  rŠ   r   )r   rÐ   rf   ri  r   r¥   Úunfusable_noderæ   rç   rà   r-   Úaggressive_fusionrÉ  Ú*get_possible_fusions_with_highest_priorityrÿ  Úscore_fusion_keyrò  ró  rÏ   )rr   rw  rÈ  r	  Úbuffer_names_groupingr”   rÕ   Únode_groupingÚgroup_groupingrÇ   r¤  r„  s   ` `       @@rs   r¯  zScheduler.get_possible_fusionsÿ  sí  øøøø€ ð ÐÝ�%Õ 1Õ3DÐ DÔEÔFÑHÔHˆð	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@õ( !,Ô 7½Ñ =Ô =ÐØð 	8ð 	8ˆDØ×"Ò" 4Ñ(Ô(ð ØØ×-Ò-Ñ/Ô/ð 8ð 8�Ø% cÔ*×1Ò1°$Ñ7Ô7Ð7Ð7ð8à2×9Ò9Ñ;Ô;ð 	+ð 	+ˆMØˆO˜MÑ*Ô*Ð*Ð*åÔ#ð 	/Ý(Ô4µTÑ:Ô:ˆNØð 7ð 7�Ý  g¨tÑ4Ô4�Øð 7Ø" 5Ô)×0Ò0°Ñ6Ô6Ð6øØ!/×!6Ò!6Ñ!8Ô!8ð /ð /�Ø� Ñ.Ô.Ð.Ð.à×JÒJØñ
ô 
Ðð 	×Ò $Ô"7ÀÐÑFÔFÐFÝ×ÒÐ4µcÐ:JÑ6KÔ6KÑLÔLÐLØÐru   c                óò  ‡ ‡‡‡‡— t          t                   ¦   «         Šdˆˆˆˆ ˆfd„Š|                     ¦   «         j                             ¦   «         |                     ¦   «         j                             ¦   «         z  Š|j        j                             ¦   «         |j        j                             ¦   «         z  ‰z
  Št          ˆˆ fd„‰D ¦   «         ¦  «        }|r t          ||¦  «        d¦  «         |S )	z~
        Finds whether there's a path from node1 to node2 (or vice-versa)
        caused indirectly by other fusions.
        r”   rf   rŠ   rv   c                ó,  •— t          | t          ¦  «        r}| ‰vry‰                     | ¦  «         |                      ¦   «                              ‰¦  «        rdS t          ‰| j        z  ¦  «        p#t          ˆˆfd„| j        ‰z
  D ¦   «         ¦  «        S dS )NFc              3  óD   •K  — | ]} ‰‰j         |         ¦  «        V — Œd S r   r§  ©r·   rÜ  Ú
found_pathrr   s     €€rs   r¹   zIScheduler.will_fusion_create_cycle.<locals>.found_path.<locals>.<genexpr>R  sQ   øè è € ð Hð Hàð #˜
 4Ô#:¸1Ô#=Ñ>Ô>ðHð Hð Hð Hð Hð Hru   )r²   rÝ   r³  r  Úissubsetrv   r  r  )r”   Úcombined_ancestorsÚcombined_namesr"	  rr   Úvisiteds    €€€€€rs   r"	  z6Scheduler.will_fusion_create_cycle.<locals>.found_pathA  sÊ   ø€ å˜$Õ 2Ñ3Ô3ð ¸ÀGÐ8KÐ8KØ—’˜DÑ!Ô!Ð!Ø×+Ò+Ñ-Ô-×6Ò6Ð7IÑJÔJð ð !˜5õ   °´Ñ ?Ñ@Ô@ð ÅCð Hð Hð Hð Hð Hà!%¤Ð2DÑ!DðHñ Hô Hñ Eô Eð ð �5ru   c              3  óD   •K  — | ]} ‰‰j         |         ¦  «        V — Œd S r   r§  r!	  s     €€rs   r¹   z5Scheduler.will_fusion_create_cycle.<locals>.<genexpr>`  s5   øè è € ÐWÐW¸q�J�J˜tÔ6°qÔ9Ñ:Ô:ÐWÐWÐWÐWÐWÐWru   zwill create cycler.  )r   rÝ   r  Ú_dictr'  r  r  rê  )rr   rˆ   r‰   Úcycler$	  r%	  r"	  r&	  s   `   @@@@rs   r†  z"Scheduler.will_fusion_create_cycle7  s  øøøøø€ õ Õ/Ô0Ñ2Ô2ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð2 ×%Ò%Ñ'Ô'Ô-×2Ò2Ñ4Ô4Ø×'Ò'Ñ)Ô)Ô/×4Ò4Ñ6Ô6ñ7ð 	ð
 ŒOÔ!×&Ò&Ñ(Ô(¨5¬?Ô+@×+EÒ+EÑ+GÔ+GÑGØñÐõ ÐWÐWÐWÐWÐWÐDVÐWÑWÔWÑWÔWˆØð 	9Ø#�I�e˜UÑ#Ô#Ð$7Ñ8Ô8Ð8Øˆru   c                óÈ  ‡ ‡— ddl mŠ dˆ fd„} ||¦  «        } ||¦  «        }t          ˆfd„|D ¦   «         ¦  «        }t          ˆfd	„|D ¦   «         ¦  «        }|                     |¦  «        }d
}	|D ]-}
	 |	t	          |
d         ¦  «        z  }	Œ# t
          $ r Y  dS w xY w‰                      ||¦  «        }t          j        j	         
                    |	d|z  ¦  «        rdS dS )aó  
        Return true if fusing the two nodes can potentially increasing peak memory.

        The implementation is more like a heuristic since we don't really know if we are at peak
        or not when trying to fuse these two nodes. The order of nodes may change later which makes the
        peak memory estimation hard.

        Here is how we decide the LOWER BOUND of extra memory allocation if we fuse these 2 nodes:
        1. find all buffers read by each node with a single user. These buffers are supposed to
           be reused if we don't fuses these 2 nodes
        2. find the intersection of these buffers for the two node and sum the total buffer size.
           If we don't fuse these two nodes, we can at lease avoid this much memory allocation.
           Note that the extra memory allocation is not necessarily causing peak memory increase.
           This is just a heuristic.

        We return true only if the saving for fusion can not trade off the extra memory allocation.
        r   )Úbuffer_reuse_keyr”   rf   rŠ   úlist[ir.Buffer]c                ó  •— g }| j         j        D ]n}‰j                             |j        ¦  «        }|rKt          |j        ¦  «        dk    r3|j                             ¦   «         r| 	                    |j        ¦  «         Œo|S rl  )
rØ   rÙ   r  r¾  rÚ   rÏ   rç  r”   Úhas_tensor_outputrç   )r”   rG  ro  rÕ   rr   s       €rs   Ú_find_single_user_inputszKScheduler.can_fusion_increase_peak_memory.<locals>._find_single_user_inputs|  s~   ø€ ð ˆFØÔ&Ô,ð ,ð ,�ØÔ&×*Ò*¨2¬7Ñ3Ô3�Øð ,�3˜sœy™>œ>¨QÒ.Ð.°3´8×3MÒ3MÑ3OÔ3OÐ.Ø—M’M #¤(Ñ+Ô+Ð+øØˆMru   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r…   ©r·   rÕ   r+	  s     €rs   r¹   z<Scheduler.can_fusion_increase_peak_memory.<locals>.<genexpr>Š  ó/   øè è € Ð#SÐ#S¸cÐ$4Ð$4°SÑ$9Ô$9Ð#SÐ#SÐ#SÐ#SÐ#SÐ#Sru   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r…   r1	  s     €rs   r¹   z<Scheduler.can_fusion_increase_peak_memory.<locals>.<genexpr>‹  r2	  ru   r   rÎ   Fé    T)r”   rf   rŠ   r,	  )r  r+	  r   Úintersectionr‘   r†  r2  ra   rÂ   rÃ   Ústatically_known_gt)rr   rˆ   r‰   r/	  Úlhs_dep_nodesÚrhs_dep_nodesÚlhs_reuse_keysÚrhs_reuse_keysÚcommon_reuse_keysÚmemory_overheadrû  Ú	bw_savingr+	  s   `           @rs   Úcan_fusion_increase_peak_memoryz)Scheduler.can_fusion_increase_peak_memorye  sG  øø€ ð* 	6Ð5Ð5Ð5Ð5Ð5ð	ð 	ð 	ð 	ð 	ð 	ð 1Ð0°Ñ7Ô7ˆØ0Ð0°Ñ7Ô7ˆå#Ð#SÐ#SÐ#SÐ#SÀ]Ð#SÑ#SÔ#SÑSÔSˆÝ#Ð#SÐ#SÐ#SÐ#SÀ]Ð#SÑ#SÔ#SÑSÔSˆà*×7Ò7¸ÑGÔGÐàˆØ$ð 	ð 	ˆCðØ¥3 s¨1¤v¡;¤;Ñ.��øÝð ð ð à�u�u�uðøøøð ×,Ò,¨U°EÑ:Ô:ˆ	õ Œ7Ô×/Ò/°ÀÀiÁÑPÔPð 	Ø�4Øˆus   Á7BÂ
BÂBÚ	thresholdc                ó0  — t          d„ |                     ¦   «         D ¦   «         d„ |                     ¦   «         D ¦   «         z   ¦  «        }t          d„ |j        j        D ¦   «         ¦  «        }t          d„ |j        j        D ¦   «         ¦  «        }||z  }t          ¦   «         }|j        j        D ]7}	|                      |	j        |¦  «        r|                     |	j        ¦  «         Œ8t          d„ |j        j        D ¦   «         ¦  «        t          d„ |j        j        D ¦   «         ¦  «        z  }
t          d„ |j        j        D ¦   «         ¦  «        t          d„ |j        j        D ¦   «         ¦  «        z  }|
|z
  }||z
  }||z  }t          |¦  «        |k    S )	Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   rI  rÒ  s     rs   r   zFScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<listcomp>¦  s    € Ð;Ð;Ð; ˆT�]Š]‰_Œ_Ð;Ð;Ð;ru   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   rI  rÒ  s     rs   r   zFScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<listcomp>§  s    € Ð=Ð=Ð= 4ˆt�}Š}‰ŒÐ=Ð=Ð=ru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zEScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<genexpr>¬  s$   è è € Ð&TÐ&T°C s¤xÐ&TÐ&TÐ&TÐ&TÐ&TÐ&Tru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zEScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<genexpr>­  ó$   è è € Ð%RÐ%R°3 c¤hÐ%RÐ%RÐ%RÐ%RÐ%RÐ%Rru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zEScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<genexpr>º  s5   è è € ð $
ð $
ØˆCŒHð$
ð $
ð $
ð $
ð $
ð $
ru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zEScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<genexpr>¼  rO  ru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zEScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<genexpr>¿  s5   è è € ð %
ð %
ØˆCŒHð%
ð %
ð %
ð %
ð %
ð %
ru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zEScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<genexpr>Á  s$   è è € ÐDÐD C�s”xÐDÐDÐDÐDÐDÐDru   )	r   r»   rØ   ra  rÙ   Ú$can_buffer_be_removed_through_fusionrÚ   r³  rÏ   )rr   rˆ   r‰   r?	  Úfused_node_namesÚnode1_write_namesÚnode2_read_namesÚreads_removed_through_fusionÚwrites_removed_through_fusionr­  Úall_read_namesÚall_write_namesÚunique_readsÚunique_writesÚunique_io_bufferss                  rs   Ú(fusion_prevent_too_many_reads_and_writesz2Scheduler.fusion_prevent_too_many_reads_and_writesž  sî  € õ &Ø;Ð;¨¯ªÑ):Ô):Ð;Ñ;Ô;Ø=Ð=¨5¯?ª?Ñ+<Ô+<Ð=Ñ=Ô=ñ>ñ
ô 
Ðõ 'Ð&TÐ&T¸5Ô;LÔ;SÐ&TÑ&TÔ&TÑTÔTÐÝ%Ð%RÐ%R¸%Ô:KÔ:QÐ%RÑ%RÔ%RÑRÔRÐØ'7Ð:KÑ'KÐ$õ :D¹¼Ð%ØÔ*Ô1ð 	Bð 	BˆIØ×8Ò8Ø”Ð 0ñô ð Bð .×1Ò1°)´.ÑAÔAÐAøõ $ð $
ð $
Ø %Ô 1Ô 7ð$
ñ $
ô $
ñ 
ô 
åÐCÐC¨5Ô+<Ô+BÐCÑCÔCÑCÔCñDˆõ
 %ð %
ð %
Ø %Ô 1Ô 8ð%
ñ %
ô %
ñ 
ô 
åÐDÐD¨5Ô+<Ô+CÐDÑDÔDÑDÔDñEˆð
 &Ð(DÑDˆð (Ð*GÑGˆð )¨=Ñ8ÐåÐ$Ñ%Ô%¨	Ò1Ð1ru   c                ó–   — t          t          |j        |j        z
  ¦  «        t          |j        |j        z
  ¦  «        ¦  «        }|dk    S )aA  
        This function prevents fusion for nodes that can increase memory
        footprint. This problem is more common in horizontal fusion, where nodes
        that are far apart in the original order get fused, lengthening the live
        intervals of tensors. This is very evident in models with activation
        checkpointing, where the recomputed nodes from different checkpointed
        regions get fused and significantly increase the memory footprint.

        The current attempt is a quick, possibly hacky, heuristic to prevent the
        fusion of nodes that are far away in the original order.

        A better but difficult to implement heuristic would be to use live
        intervals of the buffers, find region of peak pressure in the original
        program and prevent fusion that crosses that peak region. We might need
        special care or good approximation in this implementation, as fusion of
        node changes live intervals, and re-computing live intervals and peak
        memory after each fusion can introduce large compilation overhead.
        é@   )r`  rê  r.  r/  )rr   rˆ   r‰   Úproximity_scores       rs   Úare_long_distant_nodesz Scheduler.are_long_distant_nodesÎ  sH   € õ* Ý�” %¤/Ñ1Ñ2Ô2Ý�” %¤/Ñ1Ñ2Ô2ñ
ô 
ˆð  Ò#Ð#ru   Úcommon_buf_namesú!tuple[str, ...] | OrderedSet[str]c                ó  — i }d„ |j                              ¦   «         D ¦   «         }d„ |j                              ¦   «         D ¦   «         }|D �]³}t          j                             |¦  «        }||         }	||         }
t          |	t          ¦  «        rt          |
t          ¦  «        s&dt          |	¦  «        › dt          |
¦  «        › �||<   Œ‚|	                     ¦   «         |
                     ¦   «         k    r0d|	                     ¦   «         › d|
                     ¦   «         › �||<   ŒÜt          |	j
        ¦  «        t          |
j
        ¦  «        k    rd||<   �Œ|	                     ¦   «         }|
                     ¦   «         }||k    rd|› d|› �||<   �ŒH|	                     ¦   «         |
                     ¦   «         k    rd|	› d|
› �||<   �Œd	}t          |t          j        ¦  «        s
d
|j        › �}d|	› d|
› d|› �||<   �Œµt!          |¦  «        S )z}
        Try to decide reasons why fusion fail due to no shared memory even though
        there are common buffers.
        c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  z7Scheduler.decide_fusion_fail_reason.<locals>.<dictcomp>ô  ó   € ÐXÐXÐX¨C˜#œ( CÐXÐXÐXru   c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  z7Scheduler.decide_fusion_fail_reason.<locals>.<dictcomp>õ  r^	  ru   znot MemoryDep: rÀ   zdifferent numel: Ú	broadcastzdifferent offset: zMismatch loop orders: rh  zLayout: zUnknown reason: z. )rØ   rˆ  ra   rÂ   r[  r²   r9   r«   ró   r_   rß   Ú
get_offsetÚnormalize_with_stride_orderr0   r^  rõ  rÖ   )rr   rˆ   r‰   rZ	  ÚreasonsÚnode1_name2depÚnode2_name2deprä  rÕ   Úlhs_depÚrhs_depÚlhs_offÚrhs_offÚ
layout_strs                 rs   Údecide_fusion_fail_reasonz#Scheduler.decide_fusion_fail_reasoné  sY  € ð ˆØXÐX°5Ô3D×3UÒ3UÑ3WÔ3WÐXÑXÔXˆØXÐX°5Ô3D×3UÒ3UÑ3WÔ3WÐXÑXÔXˆà(ð ,	ñ ,	ˆHÝ”'×$Ò$ XÑ.Ô.ˆCØ$ XÔ.ˆGØ$ XÔ.ˆGå˜g¥yÑ1Ô1ð ½ÀGÍYÑ9WÔ9Wð àJ¥d¨7¡m¤mÐJÐJ½4À¹=¼=ÐJÐJð ˜Ñ!ð à× Ò Ñ"Ô" g×&7Ò&7Ñ&9Ô&9Ò9Ð9àX¨×(9Ò(9Ñ(;Ô(;ÐXÐXÀ7×CTÒCTÑCVÔCVÐXÐXð ˜Ñ!ð õ ˜Wœ\Ñ*Ô*­m¸G¼LÑ.IÔ.IÒIÐIØ$/�˜Ñ!Ùà×(Ò(Ñ*Ô*ˆGØ×(Ò(Ñ*Ô*ˆGØ˜'Ò!Ð!ð %R¸Ð$QÐ$QÈÐ$QÐ$Q�˜Ñ!Ùð ×3Ò3Ñ5Ô5Ø×6Ò6Ñ8Ô8ò9ð 9ð %V¸WÐ$UÐ$UÈGÐ$UÐ$U�˜Ñ!Ùð ˆJÝ˜c¥2Ô#5Ñ6Ô6ð 5Ø4¨¬
Ð4Ð4�
àI 7ÐIÐI°'ÐIÐI¸ZÐIÐIð �HÑÑõ �7‰|Œ|Ðru   c                ó0  — t           j        sdS t          d„ ||fD ¦   «         ¦  «        rdS |j                             ¦   «         }|j                             ¦   «         }||z  }|sdS t          d„ |j        D ¦   «         ¦  «        }||z
  rdS t          |¦  «        dk    rdS t          |j        j        ¦  «        dk    st          |j        j	        ¦  «        dk    rdS t          t          |j        j        ¦  «        ¦  «        }t          t          |j        j	        ¦  «        ¦  «        }t          |t          ¦  «        rt          |t          ¦  «        sdS d„ |j        j	        D ¦   «         }	|j        |	vrdS |	|j                 }
t          |
t          ¦  «        sdS |
                     ¦   «         }
|
j        |j        k    r|
j        |j        k    rdS |j        |j        k    st          |j        ¦  «        dk    rdS t          |j        j        ¦  «        dk    rdS |j        j        rdS d|j        j        v rd|j        j        v sJ ‚t          d	„ |j                             ¦   «         D ¦   «         ¦  «        }t          |¦  «        dk    rdS t          t          |¦  «        ¦  «        }||j        j        d         k    rd}d}n||j        j        d         k    sJ ‚d}d}d
dlm} |j        j        d
         }t          |¦  «        dk    rdS g }t4          j                             |¦  «        D ]9}|                     t<          j        j          !                    |¦  «        ¦  «         Œ:tE          |¦  «        } |||d
         ¦  «        }|€dS |j        j        |         |j        j        |<   ||j        j        |<   | #                    dd¦  «         |  $                    ||¦  «        }t          |tJ          ¦  «        sJ ‚tL           '                    d|¦  «         |S )aW  
        Attempts to enable fusion between two nodes by inverting indexing patterns.

        This optimization targets cases where node1 has a contiguous write and
        node2 has a contiguous write but discontiguous read. By inverting the
        indexing in node2's read and write operations, we can make them compatible
        with node1 for potential fusion.

        Args:
            node1: First scheduler node (source)
            node2: Second scheduler node (target for inversion)

        Returns:
            int: Fusion score if successful, 0 if optimization not applicable
        r!  c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   ©rí  rÛ  s     rs   r¹   zAScheduler.shared_data_after_inverting_indexing.<locals>.<genexpr>=  ó*   è è € Ð2Ð2˜aˆq�xŠx‰zŒzÐ2Ð2Ð2Ð2Ð2Ð2ru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zAScheduler.shared_data_after_inverting_indexing.<locals>.<genexpr>I  s5   è è € ð .
ð .
ØˆCŒHð.
ð .
ð .
ð .
ð .
ð .
ru   r   c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  zBScheduler.shared_data_after_inverting_indexing.<locals>.<dictcomp>^  ó   € ÐJÐJÐJ¨#˜œ #ÐJÐJÐJru   rÎ   Úindex0Úindex1c              3  ó   K  — | ]}|V — Œd S r   r…   )r·   rt  s     rs   r¹   zAScheduler.shared_data_after_inverting_indexing.<locals>.<genexpr>„  s"   è è € Ð%TÐ%T¨t dÐ%TÐ%TÐ%TÐ%TÐ%TÐ%Tru   r   )Úgenerate_inverse_formulaNTFz!Shared memory after inversion: %d)(r-   rÊ  r  rØ   Úbuffer_namesr   r<  rÏ   rÙ   ra  r©  r¬  r²   r9   rÚ   r9  rÛ   rß   Ú	var_namesr#  r&  Ú	subblocksÚget_read_exprsÚ$torch._inductor.invert_expr_analysisrv	  Úvarsr	  ÚAddÚ	make_argsrç   ra   rÂ   rÃ   Úcombine_modular_indexing_pairsrÿ   rL  r2  r‘   rò  rz  )rr   rˆ   r‰   Únode1_buffer_namesÚnode2_buffer_namesÚcommon_buffer_namesÚnode2_unmet_dependenciesÚ
node2_readÚnode2_writeÚnode1_writesÚnode1_writeÚnode2_read_exprsÚ	read_exprÚread_expr_indexÚwrite_expr_indexrv	  rŽ  Úsimplified_termsÚtermÚsimplified_read_exprÚinverse_formulaÚscores                         rs   Ú$shared_data_after_inverting_indexingz.Scheduler.shared_data_after_inverting_indexing'  sˆ  € õ& Ô4ð 	Ø�2åÐ2Ð2 E¨5 >Ð2Ñ2Ô2Ñ2Ô2ð 	Ø�2ð #Ô.×;Ò;Ñ=Ô=ÐØ"Ô.×;Ò;Ñ=Ô=ÐØ0Ð3EÑEÐà"ð 	Ø�2õ $.ð .
ð .
Ø %Ô 8ð.
ñ .
ô .
ñ $
ô $
Ð ð $Ð&8Ñ8ð 	Ø�2åÐ'Ñ(Ô(¨1Ò,Ð,Ø�2õ ˆuÔ Ô&Ñ'Ô'¨!Ò+Ð+­s°5Ô3DÔ3KÑ/LÔ/LÈqÒ/PÐ/PØ�2å�$˜uÔ0Ô6Ñ7Ô7Ñ8Ô8ˆ
Ý�4 Ô 1Ô 8Ñ9Ô9Ñ:Ô:ˆå˜*¥iÑ0Ô0ð 	½
Ø�ñ9
ô 9
ð 	ð �2àJÐJ°Ô1BÔ1IÐJÑJÔJˆØŒ? ,Ð.Ð.Ø�2à" :¤?Ô3ˆå˜+¥yÑ1Ô1ð 	Ø�2ð "×+Ò+Ñ-Ô-ˆð Ô Ô!2Ò2Ð2ØÔ  KÔ$4Ò4Ð4à�2àŒ?˜kÔ.Ò.Ð.µ#°jÔ6JÑ2KÔ2KÈqÒ2PÐ2PØ�2õ ˆuŒ{Ô)Ñ*Ô*¨aÒ/Ð/Ø�2ð Œ;Ô ð 	Ø�2ð ˜œÔ2Ð2Ð2Ø˜EœKÔ6Ð6Ð6Ð6ð7õ
 &Ð%TÐ%T°u´{×7QÒ7QÑ7SÔ7SÐ%TÑ%TÔ%TÑTÔTÐÝÐÑ Ô  AÒ%Ð%Ø�2å�Ð.Ñ/Ô/Ñ0Ô0ˆ	ð ˜œÔ2°8Ô<Ò<Ð<Ø&ˆOØ'ÐÐà ¤Ô :¸8Ô DÒDÐDÐDÐDØ&ˆOØ'ÐàQÐQÐQÐQÐQÐQà”[Ô% aÔ(ˆ
Ýˆz‰?Œ?˜aÒÐØ�2àÐÝ”I×'Ò'¨	Ñ2Ô2ð 	ð 	ˆDØ×#Ò#Ý”Ô ×?Ò?ÀÑEÔEñô ð ð õ  #Ð#3Ñ4Ô4Ðà2Ð2Ð3GÈÐTUÌÑWÔWˆð Ð"Ø�2ð
 7<´kÔ6PØô7
ˆŒÔ" ?Ñ3ð 8GˆŒÔ"Ð#3Ñ4ð 	×"Ò" 4¨Ñ/Ô/Ð/Ø×(Ò(¨°Ñ6Ô6ˆÝ˜%¥Ñ%Ô%Ð%Ð%Ð%å�ŠÐ;¸UÑCÔCÐCØˆru   c                ó  — t          d„ ||fD ¦   «         ¦  «        rdS |                     ¦   «         s|                     ¦   «         rdS |j                             ¦   «         |j                             ¦   «         z  }|sdS t          j        r|                      ||¦  «        }|dk    r|S t          j        r|                      ||¦  «        sdS t          j        r|                      ||¦  «        }|dk    r|S |  	                    ||¦  «        S )a«  
        Right now just greedily reorder the loop of node1 to be compatible with node2,
        but ideally we should have some heuristics to reorder the loop for node2
        to be compatible with node1 if that's more efficient.

        Return the amount of shared data re-computed in this method.
        If no such recomputation happens, return -1 (not return 0 since 0 is a valid
        amount of shared data).

        c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   rn	  rÛ  s     rs   r¹   z>Scheduler.shared_data_after_reordering_loop.<locals>.<genexpr>Æ  ro	  ru   r!  r   )
r  rö  rØ   rw	  r-   r>  Ú!_try_reorder_loops_for_candidatesÚloop_reindexing_after_fusionÚ$_try_reindex_pointwise_for_reductionr2  )rr   rˆ   r‰   r‚	  r�	  s        rs   Ú!shared_data_after_reordering_loopz+Scheduler.shared_data_after_reordering_loop¶  s4  € õ  Ð2Ð2 E¨5 >Ð2Ñ2Ô2Ñ2Ô2ð 	Ø�2ð
 ×ÒÑÔð 	 %×"3Ò"3Ñ"5Ô"5ð 	Ø�2ð Ô×*Ò*Ñ,Ô,¨uÔ/@×/MÒ/MÑ/OÔ/OÑOð 	ð #ð 	Ø�2åÔ,ð 	Ø×:Ò:¸5À%ÑHÔHˆEØ˜ŠzˆzØ�õ Ô3ð	à×<Ò<¸UÀEÑJÔJð	ð �2åÔ,ð 	Ø×:Ò:¸5À%ÑHÔHˆEØ˜ŠzˆzØ�à×'Ò'¨¨uÑ5Ô5Ð5ru   c                óT  ‡‡— |j                              ¦   «         |j                              ¦   «         z  }d„ |j         j        D ¦   «         }d„ |j         j        D ¦   «         }d„ |j         j        D ¦   «         }d„ |j         j        D ¦   «         }g }|D �]©}	|                     |	¦  «        p||	         }
|                     |	¦  «        p||	         }|	|v o|	|v p|	|v o|	|v }|
                     ¦   «         |                     ¦   «         k    rP|                     |t          j        j	         
                    |
                     ¦   «         d¬¦  «        |
|f¦  «         ŒÇ|rà|                     |	¦  «        p|                     |	¦  «        }|                     |	¦  «        p|                     |	¦  «        }t          |t          ¦  «        rwt          |t          ¦  «        rbt          j        j	        Š|                     ¦   «         j        }|                     ¦   «         j        Št!          ˆˆfd„|D ¦   «         ¦  «        s dS �Œ«t#          |¦  «        dk    rdS t%          |t'          j        dd	¦  «        ¬
¦  «        \  }}}
}t          |
t          ¦  «        rt          |t          ¦  «        sdS |
j        |j        k    rA|
                     ¦   «         |                     ¦   «         k    r|                      |
¦  «        S dS d}|                     ¦   «         s|                     |
|¦  «        }nk|                     ¦   «         s|                     ||
¦  «        }n@t2                               d|                     ¦   «         |                     ¦   «         ¦  «         |r|                      ||¦  «        ndS )z–
        Find common buffers with matching normalized stride order but different
        loop orders, and try to reorder loops to align them.
        c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  z?Scheduler._try_reorder_loops_for_candidates.<locals>.<dictcomp>û  ó   € ÐHÐHÐH¨�s”x ÐHÐHÐHru   c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  z?Scheduler._try_reorder_loops_for_candidates.<locals>.<dictcomp>ü  rr	  ru   c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  z?Scheduler._try_reorder_loops_for_candidates.<locals>.<dictcomp>ý  rš	  ru   c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  z?Scheduler._try_reorder_loops_for_candidates.<locals>.<dictcomp>þ  rr	  ru   r   rð   c              3  óR   •‡K  — | ] Št          ˆˆfd „‰D ¦   «         ¦  «        V — Œ!dS )c              3  óD   •K  — | ]}‰                      ‰|¦  «        V — Œd S r   )rÆ   )r·   ÚrsÚsvÚwss     €€rs   r¹   zHScheduler._try_reorder_loops_for_candidates.<locals>.<genexpr>.<genexpr>%  s3   øè è € ÐQÐQÀ2˜B×6Ò6°r¸2Ñ>Ô>ÐQÐQÐQÐQÐQÐQru   Nr  )r·   r¢	  Úr_sizesr¡	  s    @€€rs   r¹   z>Scheduler._try_reorder_loops_for_candidates.<locals>.<genexpr>$  sX   øøè è € ð ð àõ ÐQÐQÐQÐQÐQÈÐQÑQÔQÑQÔQðð ð ð ð ð ru   r!  r   rú  Fz?Don't reorder loops since both nodes are reductions: %s v.s. %s)rØ   rw	  rÙ   ra  r¾  rb	  rç   ra   rÂ   rÃ   rò   ró   r²   r9   r9  rß   rº   rÏ   r`  ro  rp  ry  Údep_size_hintr´   r€  r|  ró  rê  r2  )rr   rˆ   r‰   r‚	  Únode1_readsr†	  Únode2_readsÚnode2_writesÚ
candidatesr  rf	  rg	  Úis_write_readÚwru  Úw_sizesÚ_is_wrÚ_numelÚ	reorderedr£	  r¡	  s                      @@rs   r”	  z+Scheduler._try_reorder_loops_for_candidatesï  sù  øø€ ð Ô×*Ò*Ñ,Ô,¨uÔ/@×/MÒ/MÑ/OÔ/OÑOð 	ð IÐH°Ô0AÔ0GÐHÑHÔHˆØJÐJ°Ô1BÔ1IÐJÑJÔJˆØHÐH°Ô0AÔ0GÐHÑHÔHˆØJÐJ°Ô1BÔ1IÐJÑJÔJˆàˆ
Ø.ð '	"ñ '	"ˆKØ"×&Ò& {Ñ3Ô3ÐO°{À;Ô7OˆGØ"×&Ò& {Ñ3Ô3ÐO°{À;Ô7OˆGð ˜|Ð+ÐJ°¸{Ð0JðNà Ð-ÐL°+ÀÐ2Lð ð
 ×3Ò3Ñ5Ô5Ø×6Ò6Ñ8Ô8ò9ð 9ð ×!Ò!à%ÝœÔ(×:Ò:Ø#×-Ò-Ñ/Ô/¸!ð ;ñ ô ð  Øðñ	ô 	ð 	ð 	ð ð "ð !×$Ò$ [Ñ1Ô1ÐR°\×5EÒ5EÀkÑ5RÔ5R�Ø—O’O KÑ0Ô0ÐP°K·O²OÀKÑ4PÔ4P�Ý˜a¥Ñ+Ô+ð "µ
¸1½iÑ0HÔ0Hð "ÝœÔ)�BØŸkšk™mœmÔ0�GØŸkšk™mœmÔ0�GÝð ð ð ð ð à")ðñ ô ñ ô ð "ð  "˜r˜rùåˆz‰?Œ?˜aÒÐØ�2õ ,/Ø�HÔ/°°1Ñ5Ô5ð,
ñ ,
ô ,
Ñ(ˆ�˜ õ ˜'¥9Ñ-Ô-ð 	µZÀÍÑ5SÔ5Sð 	Ø�2àÔ˜wÔ/Ò/Ð/ð
 × Ò Ñ"Ô" g×&7Ò&7Ñ&9Ô&9Ò9Ð9Ø×)Ò)¨'Ñ2Ô2Ð2Ø�2àˆ	à×!Ò!Ñ#Ô#ð 		Ø×7Ò7¸ÀÑIÔIˆIˆIØ×#Ò#Ñ%Ô%ð 	Ø×7Ò7¸ÀÑIÔIˆIˆIå×#Ò#ØQØ—’Ñ Ô Ø—’Ñ Ô ñô ð ð :CÐJˆt×'Ò'¨¨uÑ5Ô5Ð5ÈÐJru   c                ó0  ‡ ‡‡‡‡‡‡‡— ddl mŠ |                     ¦   «         s|                     ¦   «         rdS |                     ¦   «         r|                     ¦   «         s||}}n/|                     ¦   «         r|                     ¦   «         s||}}ndS |j        \  }}t          j        t          j        |d         ¦  «        Št          j        t          j        |d         ¦  «        Š‰‰z  Št          d„ | 
                    ¦   «         D ¦   «         ¦  «        sdS t          j        t          t                   | 
                    ¦   «         ¦  «        }t          ˆfd„|D ¦   «         ¦  «        sdS t          ˆˆˆfd„|D ¦   «         ¦  «        sdS ‰‰fŠt          ˆfd„|D ¦   «         ¦  «        rdS t                               |f¦  «        }|D ]}	|	                     ‰‰g¦  «         Œt!          |t"          ¦  «        r!|d         j        |_        t%          |¦  «         |j                             ¦   «         |j                             ¦   «         z  }
d	„ |j                             ¦   «         D ¦   «         Šd
„ |j                             ¦   «         D ¦   «         Št-          ˆˆˆ fd„|
D ¦   «         ¦  «        }|s|                     ¦   «          dS t0          j        s@|D ]}	|	                     dd¬¦  «         Œt!          |t"          ¦  «        rt%          |¦  «         dS )zÿ
        Reindex a pointwise's iteration loops to match a reduction's
        groups. After reindexing, the shared reads have identical index
        expressions, enabling the codegen to CSE loads.

        Returns True if reindexing was applied.
        r   r‡  Fr   c              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   ©r²   r³   r^  s     rs   r¹   zAScheduler._try_reindex_pointwise_for_reduction.<locals>.<genexpr>m  s,   è è € ÐOÐO°R•:˜b¥-Ñ0Ô0ÐOÐOÐOÐOÐOÐOru   c              3  ó’   •K  — | ]A}t           j        j                             t	          |j        d          ¦  «        ‰¦  «        V — ŒBdS rï  )ra   rÂ   rÃ   rÆ   r_   r.  )r·   r_  Útarget_numels     €rs   r¹   zAScheduler._try_reindex_pointwise_for_reduction.<locals>.<genexpr>s  sa   øè è € ð 
ð 
ð õ ŒGÔ×4Ò4Ý˜bœi¨œlÑ+Ô+¨\ñô ð
ð 
ð 
ð 
ð 
ð 
ru   c              3  ól   •K  — | ].}‰                      ‰‰f|                     ¦   «         ¦  «        V — Œ/d S r   )rŠ  rc  )r·   r_  rˆ  Ú	red_numelÚ
red_rnumels     €€€rs   r¹   zAScheduler._try_reindex_pointwise_for_reduction.<locals>.<genexpr>{  sT   øè è € ð 
ð 
àð ×$Ò$ i°Ð%<¸b¿mºm¹o¼oÑNÔNð
ð 
ð 
ð 
ð 
ð 
ru   c              3  óT   •K  — | ]"}t          |j        d          ¦  «        ‰k    V — Œ#dS rï  )rÐ   r.  )r·   r_  Útarget_iter_sizess     €rs   r¹   zAScheduler._try_reindex_pointwise_for_reduction.<locals>.<genexpr>ƒ  s7   øè è € ÐIÐI¸B�u�R”Y˜q”\Ñ"Ô"Ð&7Ò7ÐIÐIÐIÐIÐIÐIru   c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  zBScheduler._try_reindex_pointwise_for_reduction.<locals>.<dictcomp>—  ó   € ÐQÐQÐQ S�3”8˜SÐQÐQÐQru   c                ó   — i | ]
}|j         |“ŒS r…   r†  r‡  s     rs   rK  zBScheduler._try_reindex_pointwise_for_reduction.<locals>.<dictcomp>˜  rº	  ru   c              3  ó\   •K  — | ]&}‰                      ‰|         ‰|         ¦  «        V — Œ'd S r   )Údeps_match_normalized)r·   rÚ   Ún1_depsÚn2_depsrr   s     €€€rs   r¹   zAScheduler._try_reindex_pointwise_for_reduction.<locals>.<genexpr>™  sO   øè è € ð 
ð 
àð ×&Ò& w¨t¤}°g¸d´mÑDÔDð
ð 
ð 
ð 
ð 
ð 
ru   Tr\  )r‰  rˆ  rí  r´   rÇ   rÇ  rÈ  r	  rˆ  rº   r»   r¥   r³   ro  rÏ  rd  r²   rÝ   rÇ  rØ   rw	  rˆ  r  r|  r-   r>  rL  )rr   rˆ   r‰   Úreduction_nodeÚpw_noder?  ÚgroupsrÞ   Úrollback_snapshotr_  Úcommon_namesÚhas_benefitrˆ  r¾	  r¿	  rµ	  r¶	  r¸	  r³	  s   `           @@@@@@@rs   r–	  z.Scheduler._try_reindex_pointwise_for_reductionN  s¬  øøøøøøøø€ ð 	-Ð,Ð,Ð,Ð,Ð,ð �<Š<‰>Œ>ð 	˜UŸ\š\™^œ^ð 	Ø�5à×ÒÑÔð 	¨×(:Ò(:Ñ(<Ô(<ð 	Ø&+¨U˜GˆNˆNØ×ÒÑ!Ô!ð 	¨%×*<Ò*<Ñ*>Ô*>ð 	Ø&+¨U˜GˆNˆNà�5à"Ô(‰	ˆˆ6Ý”K¥¤
¨F°1¬IÑ6Ô6ˆ	Ý”[¥¤¨V°A¬YÑ7Ô7ˆ
Ø  :Ñ-ˆåÐOÐO¸7×;LÒ;LÑ;NÔ;NÐOÑOÔOÑOÔOð 	Ø�5Ý”�T¥-Ô0°'×2CÒ2CÑ2EÔ2EÑFÔFˆõ ð 
ð 
ð 
ð 
ð ð	
ñ 
ô 
ñ 
ô 
ð 	ð �5åð 
ð 
ð 
ð 
ð 
ð 
àð
ñ 
ô 
ñ 
ô 
ð 	ð �5ð '¨
Ð3ÐÝÐIÐIÐIÐIÀ&ÐIÑIÔIÑIÔIð 	Ø�5õ /×5Ò5°w°jÑAÔAÐàð 	>ð 	>ˆBØ×$Ò$ i°Ð%<Ñ=Ô=Ð=Ð=å�gÕ1Ñ2Ô2ð 	5Ø" 1œIœOˆGŒMÝ+¨GÑ4Ô4Ð4ð Ô×*Ò*Ñ,Ô,¨uÔ/@×/MÒ/MÑ/OÔ/OÑOð 	ð RÐQ¨EÔ,=×,NÒ,NÑ,PÔ,PÐQÑQÔQˆØQÐQ¨EÔ,=×,NÒ,NÑ,PÔ,PÐQÑQÔQˆÝð 
ð 
ð 
ð 
ð 
ð 
à$ð
ñ 
ô 
ñ 
ô 
ˆð ð 	Ø×%Ò%Ñ'Ô'Ð'Ø�5õ Ô0ð 	9Øð Wð W�Ø×'Ò'°$ÐPUÐ'ÑVÔVÐVÐVÝ˜'Õ#5Ñ6Ô6ð 9Ý/°Ñ8Ô8Ð8àˆtru   c                ót  — t          |t          ¦  «        r*|                     ¦   «          ot          |j        ¦  «         S t          |t
          ¦  «        rct          |j        t          j        ¦  «        r|j                             ¦   «          S |                     ¦   «          ot          |j        ¦  «         S dS )z>
        Is this node unfusable under any conditions.
        F)	r²   r  rö  r]   r”   rd  r0   r  r  rM  s     rs   r	  zScheduler.unfusable_node®  sÇ   € õ �dÕ2Ñ3Ô3ð 	Ø×'Ò'Ñ)Ô)Ð)ð Õ2UØ”	ñ3ô 3ð /ð õ �dÕ5Ñ6Ô6ð 	Ý˜$œ)¥RÔ%?Ñ@Ô@ð 9Øœ9×6Ò6Ñ8Ô8Ð8Ð8Ø×'Ò'Ñ)Ô)Ð)ð Õ2UØ”	ñ3ô 3ð /ð ð ˆuru   Úprologue_noder­  rv  rê  c                óB  — |                      ¦   «         t          j        j        k    rdS |                     ¦   «         }|                     ¦   «         }d}|||z  k    r |d¦  «         dS t          d„ |                     ¦   «         D ¦   «         ¦  «        }|t          j	        j
        j        j        fk    r |d¦  «         dS dd„}|                     ¦   «         }	|	                     ¦   «         s1 ||	j        ¦  «        r!|                     ¦   «         s |d¦  «         dS dS )zT
        Heuristics to avoid benchmarking predictably slow prologue fusions
        Tgš™™™™™ñ?z@prologue fusion will not increase amount of bytes read in kernelFc              3  ó€   K  — | ]9}|j         �0|j                              ¦   «         D ]}|j        dk    ¯|j        V — ŒŒ:d S )NÚcall_function)r”   r.  rë  r/  )r·   rÜ  r  s      rs   r¹   zEScheduler.check_prologue_fusion_heuristics_fusable.<locals>.<genexpr>Þ  sf   è è € ð 
ð 
àØŒvÐ!Ø”V×'Ò'Ñ)Ô)ð "Ð!ØØŒt�Ò&Ð&ð	 ŒHð 'Ð&Ð&Ð&Ð&ð
ð 
ru   z\prologue fusion will not increase attempt to fuse in padding bc it increases unaligned readsr�  útorch.dtyperŠ   rv   c                ó&   — | j         dk    o| j        S )NrÎ   )ÚitemsizeÚis_floating_point)r�  s    rs   Úlow_prec_fpzGScheduler.check_prologue_fusion_heuristics_fusable.<locals>.low_prec_fpë  s   € Ø”> QÒ&ÐB¨5Ô+BÐBru   zVprologue fusion that must be upcast to fp32 not profitable for low precision templates)r�  rË	  rŠ   rv   )r  ra   rÂ   Úinvoke_quant_opsrA  rC  rÐ   r»   rp  r{  ÚatenÚconstant_pad_ndr~  r¡  r\   r�  rÞ  )
rr   rÇ	  r­  rv  Ú
read_bytesÚwrite_bytesÚBYTES_THRESHOLD_MULTIPLIERr4  rÏ	  r^  s
             rs   Ú(check_prologue_fusion_heuristics_fusablez2Scheduler.check_prologue_fusion_heuristics_fusable¾  sv  € ð ×,Ò,Ñ.Ô.µ!´'Ô2JÒJÐJØ�4à"×8Ò8Ñ:Ô:ˆ
Ø#×:Ò:Ñ<Ô<ˆð &)Ð"Ø˜Ð'AÑAÒBÐBØˆCÐRÑSÔSÐSØ�5õ ð 
ð 
à"×,Ò,Ñ.Ô.ð
ñ 
ô 
ñ 
ô 
ˆð •u”y”~Ô5Ô=Ð?Ò?Ð?ØˆCØnñô ð ð �5ð	Cð 	Cð 	Cð 	Cð %×?Ò?ÑAÔAˆà×6Ò6Ñ8Ô8ð	à�˜LÔ.Ñ/Ô/ð	ð "×>Ò>Ñ@Ô@ð	ð
 ˆCØhñô ð ð �5àˆtru   ú,tuple[int, SchedulerNode, sympy.Expr] | Nonec                óˆ  ‡ — t          |t          ¦  «        rt          |t          ¦  «        sdS t          |j        t          j        ¦  «        rt          |j        t          j        ¦  «        sdS |                     ¦   «         s|                     ¦   «         rdS t          j        dk    rdS |j        |j        }}|\  }}|\  }}| 	                    ¦   «         s:| 	                    ¦   «         s&||k    s t          |¦  «        t          |¦  «        k    rdS t          |j        j        ¦  «        dk    st          |j        j        ¦  «        dk    rdS ‰                      t          t          |j        j        ¦  «        ¦  «        ¦  «        }	‰                      t          t          |j        j        ¦  «        ¦  «        ¦  «        }
t!          |	|
¦  «        t          j        k    rdS d
ˆ fd„} ||¦  «        s ||¦  «        rdS g }t%          t'          ||¦  «        ¦  «        D ]#\  }\  }}||k    r|                     |¦  «         Œ$t          |¦  «        dk    rdS |d	         }||         ||         }}t*          j        j                             ||¦  «        r|||fS t*          j        j                             ||¦  «        r|||fS dS )ao  
        Fusing two small pointwise nodes significantly reduces kernel overhead
        and launch overhead. However, slightly different sizes would prevent fusion.
        Here, we decide if expanding sizes of one node is profitible by allowing
        fusion, and returns the dimension to expand, node with smaller sizes,
        and new size after expand.
        NrÅ  r   r”   rf   rŠ   rv   c                ó.  •— | j         j        D ]†}|j        ‰j        v r‰j        |j                 }n‰j                             |j        ¦  «        }|rBt          j        j         	                    || ¦  «        rt          |j        t          ¦  «        s dS Œ‡dS r…  )rØ   rÙ   rÚ   r  r  r¾  ra   rÂ   r  r  r²   rå  r  )r”   r  r  rr   s      €rs   Úhas_reusable_bufferzIScheduler.get_expand_dim_for_pointwise_nodes.<locals>.has_reusable_buffer5  sŸ   ø€ ØÔ(Ô.ð  ð  �à”9 Ô ;Ð;Ð;Ø $Ô ;¸D¼IÔ F�I�Ià $Ô 0× 4Ò 4°T´YÑ ?Ô ?�Ið ð åœÔ,×6Ò6°yÀ$ÑGÔGð õ ' yÔ'<Õ>TÑUÔUð ð
  ˜4˜4øØ�5ru   r   r.  )r²   r³   r”   r0   r   r“  r-   rÆ  r.  r´   rÏ   rØ   ra  r¤	  r©  r¬  r`  Úsmall_memory_access_thresholdrª  r•  rç   ra   rÂ   rÃ   Ústatically_known_lt)rr   rˆ   r‰   Ún1_sizesÚn2_sizesÚn1_iter_sizesÚn1_reduce_sizesÚn2_iter_sizesÚn2_reduce_sizesÚnode1_write_memoryÚnode2_write_memoryrÚ	  Úmismatch_dimensionsr¸  Ún1_sizeÚn2_sizeÚmismatch_dimÚmismatch_size1Úmismatch_size2s   `                  rs   Ú"get_expand_dim_for_pointwise_nodesz,Scheduler.get_expand_dim_for_pointwise_nodesû  s  ø€ õ ˜%¥Ñ/Ô/ð 	µzÀ%ÍÑ7WÔ7Wð 	Ø�4õ �u”z¥2Ô#4Ñ5Ô5ð	å˜5œ:¥rÔ'8Ñ9Ô9ð	ð �4ð ×)Ò)Ñ+Ô+ð 	¨u×/MÒ/MÑ/OÔ/Oð 	Ø�4õ Ô Ò)Ð)Ø�4ð #œ\¨5¬<�(ˆØ)1Ñ&ˆ�Ø)1Ñ&ˆ�à×ÒÑ Ô ð	à×!Ò!Ñ#Ô#ð	ð  /Ò1Ð1Ý�=Ñ!Ô!¥S¨Ñ%7Ô%7Ò7Ð7à�4õ ˆuÔ Ô'Ñ(Ô(¨1Ò,Ð,µ°EÔ4EÔ4LÑ0MÔ0MÐPQÒ0QÐ0QØ�4ð "×/Ò/µµT¸%Ô:KÔ:RÑ5SÔ5SÑ0TÔ0TÑUÔUÐØ!×/Ò/µµT¸%Ô:KÔ:RÑ5SÔ5SÑ0TÔ0TÑUÔUÐåÐ"Ð$6Ñ7Ô7ÝÔ2ò3ð 3ð �4ð	ð 	ð 	ð 	ð 	ð 	ð  Ð˜uÑ%Ô%ð 	Ð)<Ð)<¸UÑ)CÔ)Cð 	Ø�4ð !ÐÝ'0µ°]ÀMÑ1RÔ1RÑ'SÔ'Sð 	0ð 	0Ñ#ˆCÑ#�'˜7Ø˜'Ò!Ð!Ø#×*Ò*¨3Ñ/Ô/Ð/øåÐ"Ñ#Ô# qÒ(Ð(Ø�4à*¨1Ô-ˆà˜,Ô'Ø˜,Ô'ð 'ˆõ Œ7Ô×/Ò/°ÀÑOÔOð 	Ø ¨Ð6Ð6ÝŒWÔ×1Ò1°.À.ÑQÔQð 	Ø ¨Ð6Ð6à�4ru   rf  rj  r™   c                ó°   ‡ ‡‡— t          ˆ fd„|                     ¦   «         D ¦   «         ¦  «        Št          ˆˆˆ fd„|j        j        D ¦   «         ¦  «        S )Nc              3  óN   •K  — | ]}‰j                              ||¦  «        V — Œ d S r   ©r2  r¾  r%  s     €rs   r¹   zDScheduler._producer_output_names_read_by_consumer.<locals>.<genexpr>`  sJ   øè è € ð (
ð (
àð Ô!×%Ò% d¨DÑ1Ô1ð(
ð (
ð (
ð (
ð (
ð (
ru   c              3  ón   •K  — | ]/}‰j                              |j        |j        ¦  «        xŠ‰v ¯+‰V — Œ0d S r   ©r2  r¾  rÚ   )r·   râ   rÚ   Úproducer_buf_namesrr   s     €€€rs   r¹   zDScheduler._producer_output_names_read_by_consumer.<locals>.<genexpr>d  sc   øè è € ð 
ð 
àØÔ-×1Ò1°#´(¸C¼HÑEÔEÐE�Ø!ð"ð "ð ð"ð "ð "ð "ð
ð 
ru   )r   rÖ  rØ   rÙ   )rr   rf  rj  rÚ   rñ	  s   `  @@rs   Ú'_producer_output_names_read_by_consumerz1Scheduler._producer_output_names_read_by_consumer]  s“   øøø€ õ (ð (
ð (
ð (
ð (
à ×1Ò1Ñ3Ô3ð(
ñ (
ô (
ñ 
ô 
Ðõ ð 
ð 
ð 
ð 
ð 
ð 
àÔ+Ô1ð
ñ 
ô 
ñ 
ô 
ð 	
ru   úOrderedSet[str] | Nonec                ó¢   — t                                ||¦  «        sd S t                                ||¦  «        sd S |                      ||¦  «        S r   )r4  rB  r  rò	  rð  s      rs   Ú"_nested_index_equivalent_dep_namesz,Scheduler._nested_index_equivalent_dep_namesk  sV   € õ
 ×+Ò+¨E°5Ñ9Ô9ð 	Ø�4õ ×'Ò'¨¨uÑ5Ô5ð 	Ø�4Ø×;Ò;¸EÀ5ÑIÔIÐIru   r7  r4  ro  úCSequence[tuple[BaseSchedulerNode, NestedReduction.PointwiseDomain]]rE  c               óX  ‡ ‡	— t          ¦   «         }t          ˆ fd„|                     ¦   «         D ¦   «         ¦  «        Š	|D ]R\  }}|t          j        j        urŒˆ fd„|j        j        D ¦   «         }|                     ˆ	fd„|D ¦   «         ¦  «         ŒS‰                      ||||¬¦  «        S )Nc              3  óN   •K  — | ]}‰j                              ||¦  «        V — Œ d S r   rî	  r%  s     €rs   r¹   z>Scheduler._can_fuse_nested_reduction_append.<locals>.<genexpr>‡  sJ   øè è € ð '
ð '
àð Ô!×%Ò% d¨DÑ1Ô1ð'
ð '
ð '
ð '
ð '
ð '
ru   c              3  ób   •K  — | ])}‰j                              |j        |j        ¦  «        V — Œ*d S r   rð	  rº  s     €rs   r¹   z>Scheduler._can_fuse_nested_reduction_append.<locals>.<genexpr>Ž  sN   øè è € ð ð àð Ô%×)Ò)¨#¬(°C´HÑ=Ô=ðð ð ð ð ð ru   c              3  ó$   •K  — | ]
}|‰v ¯|V — Œd S r   r…   )r·   Údep_nameÚgrouped_buf_namess     €rs   r¹   z>Scheduler._can_fuse_nested_reduction_append.<locals>.<genexpr>’  s7   øè è € ð .ð .Ø%°(Ð>OÐ2OÐ2O�Ð2OÐ2OÐ2OÐ2Oð.ð .ru   )rE  Úindex_equivalent_dep_names)	r   rÖ  r4  rJ  rI  rØ   rÙ   rþ  Ú	_can_fuse)
rr   r7  r4  ro  rE  rý	  r_  r�  rÙ   rü	  s
   `        @rs   rI  z+Scheduler._can_fuse_nested_reduction_append|  s  øø€ õ 7A±l´lÐ"Ý&ð '
ð '
ð '
ð '
à$×5Ò5Ñ7Ô7ð'
ñ '
ô '
ñ 
ô 
Ðð ,ð 		ð 		‰JˆB�Ø�_Ô<ÔHÐHÐHØðð ð ð àœ>Ô/ðñ ô ˆEð '×-Ò-ð .ð .ð .ð .Ø).ð.ñ .ô .ñ ô ð ð ð �~Š~ØØØ#Ø'Að	 ñ 
ô 
ð 	
ru   FTr(  c                óž   — t                                ||f¦  «        }|                      ||||¬¦  «        }|                     | ¬¦  «         |S )zÛDetermine if node1 and node2 can be combined into a single fused node.

        Speculative loop mutations (reordering, reindexing) are automatically
        rolled back if the fusion decision ultimately fails.
        ©rE  r(  )r‰  )r€  rÏ  Ú_can_fuse_implr‹  )rr   rˆ   r‰   rE  r(  r…  r  s          rs   r  zScheduler.can_fuseŸ  s^   € õ '×-Ò-¨u°e¨nÑ=Ô=ˆØ×&Ò&ØØØ#Ø&?ð	 'ñ 
ô 
ˆð 	�Š H ˆÑ-Ô-Ð-Øˆru   c                ó4   — |                       ||||¬¦  «        S )zj
        Determine if it is possible to combine node1 and node2 into a
        single fused node.
        r 
  )rþ	  )rr   rˆ   r‰   rE  r(  s        rs   r
  zScheduler._can_fuse_implµ  s+   € ð �~Š~ØØØ#Ø&?ð	 ñ 
ô 
ð 	
ru   rý	  c                ó¢  ‡ ‡‡‡ ‡!‡"— ‰‰u rdS |�t          ˆ fd„|D ¦   «         ¦  «        }‰                      ¦   «         r@‰ j                             ‰¦  «        }‰ j                             ‰¦  «        }|�
|�||k    rdS t	          ‰t
          ¦  «        r‰                     ‰|¬¦  «        S t	          ‰t
          ¦  «        rdS t	          ‰t          ¦  «        r‰                     ‰¦  «        S t	          ‰t          ¦  «        rdS t          ‰‰¦  «        }‰ 	                    ¦   «         r=‰  
                    ‰                     ¦   «         ¦  «                             ‰‰¦  «        rdS t	          ‰t          ¦  «        st	          ‰t          ¦  «        r |d¦  «         dS t	          ‰t          ¦  «        r!‰ 	                    ¦   «         s |d¦  «         dS t	          ‰t          ¦  «        �rlt	          ‰j        t"          j        ¦  «        s |d¦  «         dS ‰j                             ¦   «         s |d¦  «         dS t	          ‰t(          ¦  «        s |d	¦  «         dS t	          ‰j        t*          ¦  «        s |d
¦  «         dS t	          ‰j        j        t.          ¦  «        s |d¦  «         dS t1          ‰j        j        ¦  «        dk    sJ ‚‰j        j        d         j        Š"t7          ˆ"fd„‰j        j        D ¦   «         ¦  «        r |d¦  «         dS ‰j        j                             ¦   «         }	|	D ]=}
‰j        j                             |
¦  «        }t7          d„ |D ¦   «         ¦  «        r dS Œ>t1          ‰j        j         ¦  «        dk    sJ ‚‰j        j         d         j!        }‰j        j!        }t	          |t"          j"        ¦  «        rt	          |t"          j"        ¦  «        sJ ‚|j#        |j#        k    s |j$        |j$        k    s|j%        |j%        k    r |d¦  «         dS d*ˆˆˆ"fd„Š t7          ˆ fd„‰ j&        D ¦   «         ¦  «        rdS t	          ‰t          t          f¦  «        r!‰ 	                    ¦   «         s |d¦  «         dS ‰ '                    ¦   «         ‰j(        z  r |d¦  «         dS ‰ 	                    ¦   «         �rDtS          ‰¦  «        s |d¦  «         dS ‰ *                    ¦   «         s‰ 	                    ¦   «         r |d¦  «         dS ‰ +                    ¦   «         }| ,                    ¦   «         }|s |d¦  «         dS t          d„ |j-        D ¦   «         ¦  «        |z
  }‰ .                    ¦   «         |z  r |d¦  «         dS ‰ /                    ¦   «         s| 0                    ‰¦  «        r |d¦  «         dS ‰ 1                    ¦   «         Š!‰!d d…         D ]J}| 2                    ¦   «         }|D ]1}tg          ˆ!fd„|j4        D ¦   «         ¦  «        s |d ¦  «           dS Œ2ŒKt	          ‰tj          ¦  «        s‰gnd!„ ‰j6        D ¦   «         }t1          |¦  «        dk    sJ ‚|d         }t1          ‰!d         j7        ¦  «        dk    rNt1          ‰!d         j7        d         j4        ¦  «        dk    r%‰!d         j7        d         j4        d         j        |u s |d"¦  «         dS ‰  8                    ‰‰|¦  «        sdS ‰ 	                    ¦   «         r®ts          ‰‰¦  «        }‰ /                    ¦   «         r|r#‰ *                    ¦   «         stu          ‰¦  «        s |d#¦  «         dS ‰ ;                    ¦   «         }|€J ‚| <                    ¦   «         r,t	          ‰j        t"          j        ¦  «        s |d$¦  «         dS ‰ .                    ¦   «         tz          j>        j?        z  s&‰ .                    ¦   «         tz          j>        j?        z  r |d%¦  «         dS ‰                     ¦   «         }‰                     ¦   «         }||k    r |d&||¦  «         dS ~|€‰  @                    ‰‰¦  «        }‰  A                    ‰‰||¬'¦  «        }|rF|t„          jC        k     r6t„          jD        st„          jE        r‰  F                    ‰‰¦  «        }|dk    r|}t„          jG        rL‰  H                    ‰‰¦  «        x}r4|\  }}}| I                    ||¦  «         ‰  A                    ‰‰|¬(¦  «        }t„          jJ        r.|t„          jC        k     r‰  K                    ‰‰¦  «        }|dk    r|}t˜           M                    tœ          jO        ¦  «        rAt˜           P                    d)‰ Q                    ¦   «         ‰ Q                    ¦   «         |¦  «         tz          jR         S                    ‰ ‰‰|¦  «        sdS ‰ '                    ¦   «         ‰j(        z  rì‰  T                    ‰‰|¬(¦  «        rMtz          jR         T                    ‰ ‰‰|¦  «        r+‰  
                    |¦  «         T                    ‰‰¦  «        rdS t„          jE        ry‰  U                    ‰‰¦  «        rc‰  T                    ‰‰|¬(¦  «        oJtz          jR         T                    ‰ ‰‰|¦  «        o(‰  
                    |¦  «         T                    ‰‰¦  «        S dS tz          jR         V                    ‰ ‰‰|¦  «        o(‰  
                    |¦  «         V                    ‰‰¦  «        S )+NFc              3  óN   •K  — | ]}‰j                              ||¦  «        V — Œ d S r   rî	  r%  s     €rs   r¹   z&Scheduler._can_fuse.<locals>.<genexpr>Ò  sJ   øè è € ð 4ð 4àð Ô%×)Ò)¨$°Ñ5Ô5ð4ð 4ð 4ð 4ð 4ð 4ru   rH  Tz/grouped node must not be fused with other nodesznode1 is nopz'node1 is extern but not a triton kernelz5node1's triton kernel doesn't support epilogue fusionz.node1 is extern but node2 is not SchedulerNodez3node1 is extern but node2.node is not SchedulerNodez4node1 is extern but node2.node.data is not Pointwiser   r   c              3  ó.   •K  — | ]}|j         ‰k    V — Œd S r   r†  )r·   râ   Úwritten_buffer_names     €rs   r¹   z&Scheduler._can_fuse.<locals>.<genexpr>  s+   øè è € ÐVÐV°s�3”8Ð2Ò2ÐVÐVÐVÐVÐVÐVru   z9epilogue reads from buffers other than the mutated outputc              3  ó"   K  — | ]
}|d k    V — ŒdS )r  Nr…   )r·   Úusages     rs   r¹   z&Scheduler._can_fuse.<locals>.<genexpr>  s&   è è € Ð;Ð;¨5�u ’Ð;Ð;Ð;Ð;Ð;Ð;ru   z*node1 and node2 uses different buf layoutsr  rf   c                ó@   •— | ‰uo| ‰uo‰|                       ¦   «         v S r   r  )r  rˆ   r‰   r
  s    €€€rs   Ú._is_other_node_that_references_mutation_bufferzKScheduler._can_fuse.<locals>._is_other_node_that_references_mutation_buffer-  s:   ø€ ð   uÐ,ð NØ#¨5Ð0ðNà+¨z×/KÒ/KÑ/MÔ/MÐMðru   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r…   )r·   r”   r

  s     €rs   r¹   z&Scheduler._can_fuse.<locals>.<genexpr>6  sB   øè è € ð ð àð ?Ð>¸tÑDÔDðð ð ð ð ð ru   znode2 is extern or nopznode1 must go before node2zprologue fusion turned offz2prologue fusion only supported for pointwise nodesz'template has no allowed prologue inputsc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   rI  )r·   ræ  s     rs   r¹   z&Scheduler._can_fuse.<locals>.<genexpr>W  s*   è è € ÐEÐE¨c˜3Ÿ<š<™>œ>ÐEÐEÐEÐEÐEÐEru   z;prologue fusion not implemented for kernel for these inputsz:template prologue can only fuse functional pointwise nodesr!  c              3  ó*   •K  — | ]}|j         ‰v V — Œd S r   r¼   )r·   rû  Úprologue_nodess     €rs   r¹   z&Scheduler._can_fuse.<locals>.<genexpr>i  s*   øè è € ÐQÐQ¸t˜tœy¨NÐ:ÐQÐQÐQÐQÐQÐQru   z7template prologue can only fuse nodes with a single usec                ó:   — g | ]}|                      ¦   «         ¯|‘ŒS r…   r¦  rÛ  s     rs   r   z'Scheduler._can_fuse.<locals>.<listcomp>p  s%   € ÐAÐAÐA˜A°·²±´ÐA�aÐAÐAÐAru   zEtemplate prologue can only fuse nodes with a single use into templateztemplate epilogue not satisfiedz6multi-output template epilogue requires ComputedBufferz#fusion for buffer explicit disabledzdevice mismatch (%s vs %s))r(  rý	  ©rý	  z%s and %s has %s shared data)r  rf   )Wr   r	  r®  r¾  r²   rA  r:  r"  rê  rö  r<  rª   Úcan_fuse_multi_outputs_templaterÓ  r  rd  r”   r0   r  r  r³   r   rú   r   rÏ   rR  rÚ   r  rØ   rÙ   Úinner_fn_free_symbolsÚcollect_inner_fn_symbol_usager  rõ  r>  rß   r?  rì  rw  r  r  rc  r´   r¡  Úget_allowed_prologue_inpsrÉ  rÖ  r“  Ú,has_aliasing_or_mutation_for_prologue_fusionr»   rL  rº   rç  rÝ   rÞ   r5  rÖ	  r_  rP  r›  r\   ra   rÂ   Úno_fuse_buffer_namesrõ	  Ú!_score_fusion_memory_for_can_fuser-   Úscore_fusion_memory_thresholdr>  r•	  r—	  Ú$expand_dimension_for_pointwise_nodesrë	  ru  rÊ  r‘	  r|  r  r  r*  ró  rê  rö  r  Úcan_fuse_verticalr–	  Úcan_fuse_horizontal)#rr   rˆ   r‰   rE  r(  rý	  r�  Ústream2rv  Únode2_inner_fn_free_symbolsÚsymbolÚusagesÚlayout1Úlayout2r   r5  Úunsupported_prologue_argsr”   Ú	node_outsrè   Útemplate_snodesÚtemplate_snodeÚatomic_add_mutation_epiloguer^  rì  Údevice2Úshared_data_scoreÚnew_shared_data_scoreÚexpand_analysisÚ
expand_dimÚsmaller_nodeÚexpand_sizer

  r
  r
  s#   ```                             @@@rs   rþ	  zScheduler._can_fuseÇ  s-  øøøøøø€ ð �Eˆ>ˆ>Ø�5Ø%Ð1Ý)3ð 4ð 4ð 4ð 4à6ð4ñ 4ô 4ñ *ô *Ð&ð ×'Ò'Ñ)Ô)ð 	ØÔ)×-Ò-¨eÑ4Ô4ˆGØÔ)×-Ò-¨eÑ4Ô4ˆGØÐ" wÐ':¸wÈ'Ò?QÐ?QØ�uå�eÕ2Ñ3Ô3ð 	GØ×&Ò& u¸+Ð&ÑFÔFÐFÝ�eÕ2Ñ3Ô3ð 	Ø�5å�eÕ4Ñ5Ô5ð 	.Ø×&Ò& uÑ-Ô-Ð-Ý�eÕ4Ñ5Ô5ð 	ð �5å˜˜uÑ%Ô%ˆà×ÒÑÔð 	 4×#3Ò#3Ø×ÒÑÔñ$
ô $
ç
)Ò
)¨%°Ñ
7Ô
7ð	ð �4å�eÕ1Ñ2Ô2ð 	µjØÕ'ñ7
ô 7
ð 	ð ˆCÐAÑBÔBÐBØ�5Ý�eÕ3Ñ4Ô4ð 	¸U×=NÒ=NÑ=PÔ=Pð 	ØˆC�ÑÔÐØ�5å�eÕ6Ñ7Ô7ñ @	Ý˜eœj­"Ô*DÑEÔEð Ø�Ð=Ñ>Ô>Ð>Ø�uà”:×/Ò/Ñ1Ô1ð Ø�ÐKÑLÔLÐLØ�uå˜e¥]Ñ3Ô3ð Ø�ÐDÑEÔEÐEØ�uÝ˜eœj­.Ñ9Ô9ð Ø�ÐIÑJÔJÐJØ�uÝ˜eœjœo­yÑ9Ô9ð Ø�ÐJÑKÔKÐKØ�uå�u”zÔ2Ñ3Ô3°qÒ8Ð8Ð8Ð8Ø"'¤*Ô"=¸aÔ"@Ô"EÐõ ÐVÐVÐVÐV¸eÔ>OÔ>UÐVÑVÔVÑVÔVð Ø�ÐOÑPÔPÐPØ�uð +0¬*¬/×*OÒ*OÑ*QÔ*QÐ'Ø5ð !ð !�Øœœ×FÒFÀvÑNÔN�ÝÐ;Ð;°FÐ;Ñ;Ô;Ñ;Ô;ð !Ø ˜5˜5ð!õ �u”zÔ.Ñ/Ô/°1Ò4Ð4Ð4Ð4ð ”jÔ-¨aÔ0Ô7ˆGØ”jÔ'ˆGÝ˜g¥r¤yÑ1Ô1ÐTµjÀÍ"Ì)Ñ6TÔ6TÐTÐTÐTà” ¤Ò,Ð,Ø”> W¤^Ò3Ð3Ø”> W¤^Ò3Ð3à�Ð@ÑAÔAÐAØ�uðð ð ð ð ð ð ð õ ð ð ð ð à œJðñ ô ñ ô ð ð �uõ �uÕ8Õ:PÐQÑRÔRð	à×%Ò%Ñ'Ô'ð	ð ˆCÐ(Ñ)Ô)Ð)Ø�5à×$Ò$Ñ&Ô&¨¬Ñ8ð 	ØˆCÐ,Ñ-Ô-Ð-Ø�5à×ÒÑÔñ 9	Ý.¨uÑ5Ô5ð Ø�Ð0Ñ1Ô1Ð1Ø�uà×!Ò!Ñ#Ô#ð  u×'8Ò'8Ñ':Ô':ð Ø�ÐHÑIÔIÐIØ�uà×7Ò7Ñ9Ô9ˆHØ$,×$FÒ$FÑ$HÔ$HÐ!Ø(ð Ø�Ð=Ñ>Ô>Ð>Ø�uõ ÐEÐE°X´_ÐEÑEÔEÑEÔEØ'ñ(ð &ð
 ×%Ò%Ñ'Ô'Ð*CÑCð Ø�ÐQÑRÔRÐRØ�uà×-Ò-Ñ/Ô/ð Ø×EÒEÀeÑLÔLðð �ÐPÑQÔQÐQØ�uà"Ÿ_š_Ñ.Ô.ˆNØ& s¨ sÔ+ð %ð %�Ø ×,Ò,Ñ.Ô.�	Ø$ð %ð %�CÝÐQÐQÐQÐQÀsÄyÐQÑQÔQÑQÔQð %Ø˜ÐUÑVÔVÐVØ$˜u˜u˜uð%ð%õ " %Õ);Ñ<Ô<ðB���àAÐA ¤ÐAÑAÔAð õ
 �Ñ'Ô'¨1Ò,Ð,Ð,Ð,Ø,¨QÔ/ˆNõ �N 2Ô&Ô.Ñ/Ô/°1Ò4Ð4Ý˜ rÔ*Ô2°1Ô5Ô;Ñ<Ô<ÀÒAÐAØ" 2Ô&Ô.¨qÔ1Ô7¸Ô:Ô?À>ÐQÐQà�Ø[ñô ð ð �uà×@Ò@ÀÈÈsÑSÔSð Ø�uà×ÒÑÔð 	Ý+QØ�uñ,ô ,Ð(ð ×/Ò/Ñ1Ô1ðØ:Vðà×%Ò%Ñ'Ô'ðõ 3°5Ñ9Ô9ðð
 �Ð5Ñ6Ô6Ð6Ø�uØ ×2Ò2Ñ4Ô4ˆLØÐ+Ð+Ð+Ø×5Ò5Ñ7Ô7ð Å
Ø”
�BÔ-ñAô Að ð �ÐLÑMÔMÐMØ�uà×"Ò"Ñ$Ô$¥q¤wÔ'CÑCð 	Ø×"Ò"Ñ$Ô$¥q¤wÔ'CÑCð	ð ˆCÐ5Ñ6Ô6Ð6Ø�5Ø×!Ò!Ñ#Ô#ˆØ×"Ò"Ñ$Ô$ˆØ�WÒÐØˆCÐ,¨f°gÑ>Ô>Ð>Ø�5Øà%Ð-Ø)-×)PÒ)PØ�uñ*ô *Ð&ð !×BÒBØØØ&?Ø'Að	 Cñ 
ô 
Ðð ð		:à!¥FÔ$HÒHÐHåÔ1ð Iå5;Ô5Xð Ið
 %)×$JÒ$JÈ5ÐRWÑ$XÔ$XÐ!Ø$¨Ò)Ð)Ø$9Ð!åÔ6ð 		Ø#×FÒFÀuÈeÑTÔTÐTˆOð		ð 7FÑ3ˆZ˜ {Ø×<Ò<¸ZÈÑUÔUÐUØ $× FÒ FØØØ+Eð !Gñ !ô !Ðõ Ô1ð	:à!¥FÔ$HÒHÐHà$(×$MÒ$MØ�uñ%ô %Ð!ð %¨Ò)Ð)Ø$9Ð!å×)Ò)­'¬-Ñ8Ô8ð 	Ý×#Ò#Ø.Ø—’Ñ Ô Ø—’Ñ Ô Ø!ñ	ô ð õ Œy×!Ò! $¨¨uÐ6GÑHÔHð 	Ø�5à×$Ò$Ñ&Ô&¨¬Ñ8ð %	Mð ×&Ò&ØØØ/Ið 'ñ ô ð	õ ”I×/Ò/°°e¸UÐDUÑVÔVð	ð ×$Ò$ VÑ,Ô,×>Ò>¸uÀeÑLÔLð	ð �tõ Ô3ðà×=Ò=¸eÀUÑKÔKðð
 ×*Ò*ØØØ3Mð +ñ ô ð Qõ
 œ	×3Ò3Ø˜e UÐ,=ñô ðQð ×(Ò(¨Ñ0Ô0×BÒBÀ5È%ÑPÔPð
ð �5å”9×0Ò0Ø�e˜UÐ$5ñô ð Mà×"Ò" 6Ñ*Ô*×>Ò>¸uÀeÑLÔLðMru   r
  c               ó  — |                      ¦   «         }t          ||¦  «        }t          t          ¦  «        }|j        D ]o}| j                             |j        |j        ¦  «        }t          |t          ¦  «        r|  
                    |||¦  «        rŒT||                              |¦  «         Œp|j        j        D �]}	t          |	t          ¦  «        st          |	t          ¦  «        sŒ.| j                             |	j        |	j        ¦  «        }
|                     |
¦  «        }|r¬|D ]©}t          |	t          ¦  «        rL|                      |                     | j        ¦  «        |	|duo|
|v ¬¦  «        r|                     |¦  «         Œct          |	t          ¦  «        r1|                      ||	|j        ¦  «        r|                     |¦  «         Œª�Œt+          d„ t,          j                             |                     ¦   «         ¦  «        D ¦   «         ¦  «        }||z  r |d¦  «         dS |                     ¦   «         }|D ]D}| j        |                              ¦   «         }|| j        |         j        z  r |d¦  «          dS ŒEdS )aÔ  
        Check if it is legal to fuse a consumer (node2) into a producer (node1).

        We can fuse them if all the reads of node2 either match
        corresponding writes in node1, or are written by nodes that can
        be scheduled before the fusion of node1 and node2.

        ``index_equivalent_dep_names`` relaxes write/read matching only for
        named producer outputs; the remaining intermediate-dependency checks
        still run normally.
        N©Úallow_index_equivalencec              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   z.Scheduler.can_fuse_vertical.<locals>.<genexpr>1  s8   è è € ð $
ð $
àð ŒHð$
ð $
ð $
ð $
ð $
ð $
ru   zmemory deps did not matchFz(intermediate nodes between node1 & node2T)rÖ  rê  r   r¥   r<  r2  r¾  rÚ   r²   r;   r
  rç   rØ   ra  r9   r:   Úfusable_read_and_writerŠ  rS  Ú.fusable_stardep_write_and_read_on_empty_tensorr”   r   rª  r«  r–  rà   r  r  rì  rÇ  r  )rr   rˆ   r‰   rý	  Únode1_buf_namesrv  Úremaining_deps_by_namerâ   rÚ   ÚcdÚ
write_nameÚ	remainingro  Úremaining_depsÚnode1_op_namesr¿  s                   rs   r
  zScheduler.can_fuse_verticalþ  sÎ  € ð$  ×0Ò0Ñ2Ô2ˆÝ˜˜uÑ%Ô%ˆÝ7BÅ4Ñ7HÔ7HÐàÔ+ð 	5ð 	5ˆCØÔ(×,Ò,¨S¬X°s´xÑ@Ô@ˆDÝ˜#�wÑ'Ô'ð ¨D×,AÒ,AÀ#ÀuÈeÑ,TÔ,Tð ØØ" 4Ô(×/Ò/°Ñ4Ô4Ð4Ð4àÔ#Ô*ð 	-ñ 	-ˆBÝ˜b¥)Ñ,Ô,ð µZÀÅGÑ5LÔ5Lð ØØÔ.×2Ò2°2´7¸B¼GÑDÔDˆJØ.×2Ò2°:Ñ>Ô>ˆIØð -Ø#ð -ð -�BÝ! "¥iÑ0Ô0ð -°T×5PÒ5PØŸ	š	 $Ô"7Ñ8Ô8Øà6¸dÐBð IØ *Ð.HÐ Hð 6Qñ 6ô 6ð -ð "×(Ò(¨Ñ,Ô,Ð,Ð,Ý# B­Ñ0Ô0ð -Ø×KÒKØ  E¤Jñô ð-ð
 "×(Ò(¨Ñ,Ô,Ð,øùå#ð $
ð $
å ”×4Ò4Ð5K×5RÒ5RÑ5TÔ5TÑUÔUð$
ñ $
ô $
ñ 
ô 
ˆð
 ˜OÑ+ð 	ð
 ˆCÐ+Ñ,Ô,Ð,Ø�5à×2Ò2Ñ4Ô4ˆØ"ð 	ð 	ˆDØÔ& tÔ,×=Ò=Ñ?Ô?ˆGØ Ô 7¸Ô @Ô JÑJð Ø�Ð>Ñ?Ô?Ð?Ø�u�uðð ˆtru   Úweak_depr;   c                óŠ  ‡‡	‡
— ‰j         |                     ¦   «         vrdS ˆfd„|j        j        D ¦   «         }t	          |¦  «        dk    rdS |d         Š
t          ‰
t          ¦  «        rdS t          ‰
t          ¦  «        sJ ‚t          ‰
j	        t          j        ¦  «        rdS t          ‰
j        ¦  «        ‰
j	        j        k    sdS | j        ‰j                 Š	|g}t          |t"          ¦  «        r|j        }d}|D ]@}ˆ	fd„|j        j        D ¦   «         }|sŒ|dz  }t)          ˆ
fd„|D ¦   «         ¦  «        s dS ŒA|dk    S )NFc                ó4   •— g | ]}|j         ‰j        k    ¯|‘ŒS r…   )rÚ   rH  )r·   rV  r;
  s     €rs   r   z.Scheduler.fusable_weak_dep.<locals>.<listcomp>O  s3   ø€ ð 
ð 
ð 
àØŒz˜XÔ2Ò2Ð2ð à2Ð2Ð2ru   r   r   c                ó*   •— g | ]}|j         ‰k    ¯|‘ŒS r…   r†  )r·   r  rV  s     €rs   r   z.Scheduler.fusable_weak_dep.<locals>.<listcomp>j  s0   ø€ ð ð ð àØ”9 	Ò)Ð)ð à)Ð)Ð)ru   c              3  óÂ   •K  — | ]Y}t          |t          ¦  «        o?t          |j        t          j        ¦  «         o|j        ‰j        k    o|j        ‰j        k    V — ŒZd S r   )r²   r9   r(   rÛ   r*   ÚTMPrß   )r·   r  rV  s     €rs   r¹   z-Scheduler.fusable_weak_dep.<locals>.<genexpr>r  s€   øè è € ð ð ð
 õ	 ˜4¥Ñ+Ô+ð ,Ý+¨D¬J½¼ÑAÔAÐAð,à”J %¤+Ò-ð,ð ”I ¤Ò+ð	ð ð ð ð ð ru   )rÚ   rÖ  rØ   ra  rÏ   r²   r:   r9   r(   rÛ   r*   r@
  r   rx	  r&   rŸ  rH  re  rÞ   rÙ   rº   )rr   r;
  rˆ   r‰   Úmutating_writesÚrelevant_reading_nodesÚnum_concurrent_readsÚreading_nodeÚrelevant_readsrV  rV  s    `       @@rs   r
  zScheduler.fusable_weak_depG  sÃ  øøø€ ð Œ= × 6Ò 6Ñ 8Ô 8Ð8Ð8Ø�5ð
ð 
ð 
ð 
àÔ*Ô1ð
ñ 
ô 
ˆõ
 ˆÑÔ 1Ò$Ð$Ø�5Ø Ô"ˆÝ�e�WÑ%Ô%ð 	Ø�5Ý˜%¥Ñ+Ô+Ð+Ð+Ð+å˜uœ{­D¬HÑ5Ô5ð 	Ø�5õ
 ˜%œ/Ñ*Ô*¨e¬kÔ.FÒFÐFØ�5àÔ+¨HÔ,AÔBˆ	Ø"' ÐÝ�eÕ7Ñ8Ô8ð 	2Ø%*¤\Ð"Ø ÐØ2ð 	ð 	ˆLðð ð ð à(Ô4Ô:ðñ ô ˆNð
 "ð ØØ  AÑ%Ð Ýð ð ð ð ð
 +ðñ ô ñ ô ð ð �u�uðð $ qÒ(Ð(ru   r  r9   rV  c                óÊ   — | j         |j         k    oSt          | j        ¦  «        t          |j        ¦  «        k    o)| j        d t          |j        ¦  «        …         |j        k    S r   )rÛ   rÏ   rß   )r  rV  s     rs   Ú_same_index_with_prefix_sizez&Scheduler._same_index_with_prefix_size|  sV   € ð ŒJ˜%œ+Ò%ð ;Ý�D”I‘”¥# e¤j¡/¤/Ò1ð;à”	Ð+�C ¤
™OœOÐ+Ô,°´
Ò:ð	
ru   r/
  r8   r0
  c               ó¨  — t          |t          ¦  «        rþ|j        |j        k    s>t          |j        t
          j        ¦  «        st          |j        t
          j        ¦  «        rdS |}|}|                      |j        ¦  «        rdS |  	                    ||¦  «        rdS t          j        r8|j        |j        k    r(|                     ¦   «         }|                     ¦   «         }|  	                    ||¦  «        rdS |sdS |                      ||¦  «        S t          |t          ¦  «        r)|j        |j        k    r|j        �|j        |j        k    rdS dS )aÐ  Return whether a producer write can satisfy a consumer read.

        The default path accepts exact matches, plus the existing
        loop-ordering-normalized exact match when that config is enabled.
        ``allow_index_equivalence`` only runs after those checks fail. It keeps
        the producer write dense and injective, then accepts conservative
        consumer-side equivalent reads such as broadcasts or normalized
        loop-order changes.
        FT)r²   r9   rÚ   r(   rÛ   r*   r@
  r˜  r±  rG
  r-   r>  ry  r9  Ú%_fusable_read_after_index_equivalencer:   )rr   r  rV  r0
  Úoriginal_readÚoriginal_writes         rs   r2
  z Scheduler.fusable_read_and_write…  sg  € õ �d�IÑ&Ô&ð 0	à”	˜UœZÒ'Ð'Ý& t¤zµ4´8Ñ<Ô<ð (å& u¤{µD´HÑ=Ô=ð (ð �uà ˆMØ"ˆNð ×1Ò1°.Ô2EÑFÔFð Ø�uð ×0Ò0°ÀÑOÔOð Ø�tåÔ0ð *°T´]ÀeÄnÒ5TÐ5Tð —~’~Ñ'Ô'�ØŸšÑ)Ô)�ð
 ×0Ò0°°uÑ=Ô=ð Ø�tà*ð Ø�uà×=Ò=Ø˜~ñô ð õ ˜�gÑ&Ô&ð 	à”	˜UœZÒ'Ð'Ø”JÐ*Ø”I ¤Ò+Ð+à�tØˆuru   c                ó>  — t          |j        ¦  «        |j        j        k    sdS |                     ¦   «                              ¦   «         s(|                     ¦   «                              ¦   «         sdS |                      ||¦  «        p|                      ||¦  «        S r  )	r   rx	  rÛ   r&   r9  Úis_contiguousrb	  r½	  Ú_fusable_read_after_broadcast)rr   r  rV  s      rs   rI
  z/Scheduler._fusable_read_after_index_equivalenceÄ  sŸ   € õ ˜%œ/Ñ*Ô*¨e¬kÔ.FÒFÐFØ�5ð
 �OŠOÑÔ×+Ò+Ñ-Ô-ð	à×0Ò0Ñ2Ô2×@Ò@ÑBÔBð	ð �5à×)Ò)Ø�%ñ
ô 
ð =à×/Ò/°°eÑ<Ô<ð	=ru   c           
     ó(  ‡ — t          ˆ fd„‰ j        D ¦   «         ¦  «        }t          |¦  «        ‰ j        k    rˆˆ fd„|D ¦   «         }t	          ‰ j        ‰ j        t          |¦  «        t          |                     ¦   «         ¦  «        ‰ j        ¦  «        Š ‰  	                    ¦   «         | 	                    ¦   «         k    rdS ‰ j        |j        k    rdS t          j        j        }t          d„ t          ‰ j        ¦  «        D ¦   «         ¦  «        }i }i }t          ‰ j        ‰ j        ||j        ¦  «        D ]Â\  }}	}
}|                     |	|¦  «        r|
||<   Œ#|                     t#          j        |	|¦  «        d¦  «        s dS |                     t)          |	|¦  «        ¦  «        }|                     |d¦  «        s dS t#          j        dt          |¦  «        › �dd¬	¦  «        }|
|z  |z   ||<   |||<   ŒÃ|sdS |                     t1          ‰ j        |¦  «        i t3          t          ||j        ¦  «        ¦  «        ¥|¥¦  «        }t1          |j        t3          t          |j        |¦  «        ¦  «        ¦  «        }|                     ||¦  «        S )
aQ  Match conservative broadcasted read forms.

        This handles two nested-reduction dependency shapes:

        - Pure broadcast dims absent from the read index:

              read:  d1, {d0: 1024, d1: 16}
              write: d0, {d0: 16}

        - Same-rank expanded dims used through a quotient:

              read:  32*d0 + FloorDiv(d1, 128), {d0: 128, d1: 4096}
              write: 32*d0 + d1,                {d0: 128, d1: 32}

        Producer-side broadcast and non-dense writes are rejected before this
        helper, so these cases only relax consumer-side broadcasts.
        c              3  ó8   •K  — | ]}|‰j         j        v ¯|V — Œd S r   )rÛ   r&   ©r·   rÄ  r  s     €rs   r¹   z:Scheduler._fusable_read_after_broadcast.<locals>.<genexpr>î  s;   øè è € ð 
ð 
Ø¨S°D´JÔ4KÐ-KÐ-KˆCÐ-KÐ-KÐ-KÐ-Kð
ð 
ru   c                ó,   •— i | ]}|‰j         |         “ŒS r…   )ÚrangesrQ
  s     €rs   rK  z;Scheduler._fusable_read_after_broadcast.<locals>.<dictcomp>ò  s"   ø€ ÐFÐFÐF°S˜3 ¤¨CÔ 0ÐFÐFÐFru   TFc              3  óJ   K  — | ]}t          j        d |› �dd¬¦  «        V — ŒdS )Ú_fusable_broadcast_T©ÚintegerÚnonnegativeN)r	  rP  )r·   r¨  s     rs   r¹   z:Scheduler._fusable_read_after_broadcast.<locals>.<genexpr>  sP   è è € ð 
ð 
àõ ŒLÐ2¨qÐ2Ð2¸DÈdÐSÑSÔSð
ð 
ð 
ð 
ð 
ð 
ru   r   r   Ú_fusable_broadcast_tail_rV
  )rÐ   rx	  rÏ   ry  r9   rÚ   rÛ   rà   r±  r9  ra   rÂ   rÃ   rg  r•  rß   rÆ   r	  r«  rÄ   r'   r6	  rP  Úsimplify_with_rangesr`   r”  )r  rV  Ú	read_varsÚread_rangesrÃ   Ú
write_varsÚreplacementsÚtail_rangesÚread_varÚ	read_sizeÚ	write_varÚ
write_sizer•  Útail_varÚ
read_indexÚwrite_indexs   `               rs   rN
  z'Scheduler._fusable_read_after_broadcastÙ  sØ  ø€ õ* ð 
ð 
ð 
ð 
Øœ>ð
ñ 
ô 
ñ 
ô 
ˆ	õ ˆy‰>Œ>˜Tœ]Ò*Ð*ØFÐFÐFÐF¸IÐFÑFÔFˆKÝØ”	Ø”
Ý�kÑ"Ô"Ý�k×(Ò(Ñ*Ô*Ñ+Ô+Ø”	ñô ˆDð �~Š~ÑÔ 5§?¢?Ñ#4Ô#4Ò4Ð4Ø�tàŒ=˜EœNÒ*Ð*Ø�5õ
 ”7Ô#ˆÝð 
ð 
å˜4œ=Ñ)Ô)ð
ñ 
ô 
ñ 
ô 
ˆ
ð 68ˆØ68ˆÝ:=ØŒN˜DœI z°5´:ñ;
ô ;
ð 	+ð 	+Ñ6ˆH�i ¨Jð ×/Ò/°	¸:ÑFÔFð Ø)2�˜XÑ&Øà×3Ò3Ý”	˜) ZÑ0Ô0°!ñô ð ð �u�uØ×&Ò&¥x°	¸:Ñ'FÔ'FÑGÔGˆFØ×/Ò/°¸Ñ:Ô:ð Ø�u�uå”|Ø=­3¨{Ñ+;Ô+;Ð=Ð=ØØ ðñ ô ˆHð
 &/°Ñ%7¸(Ñ%BˆL˜Ñ"Ø$*ˆK˜Ñ!Ð!àð 	Ø�5à×2Ò2Ý�t”z <Ñ0Ô0Ø@�t•C˜
 E¤JÑ/Ô/Ñ0Ô0Ð@°KÐ@ñ
ô 
ˆ
õ ! ¤­dµ3°u´È
Ñ3SÔ3SÑ.TÔ.TÑUÔUˆØ×/Ò/°
¸KÑHÔHÐHru   r:   Úwriting_noder3  c                ó8  — t          |t          j        ¦  «        sdS |                     ¦   «         sdS | j                             |j        |j        ¦  «        }| j                             |j        |j        ¦  «        }t          |t          ¦  «        r||k    rdS dS r  )r²   r0   r  r  r2  r¾  rÚ   r:   )rr   r  rV  rg
  Ú	read_namer7
  s         rs   r3
  z8Scheduler.fusable_stardep_write_and_read_on_empty_tensor.  s•   € õ ˜,­Ô(BÑCÔCð 	Ø�5Ø×-Ò-Ñ/Ô/ð 	Ø�5ØÔ)×-Ò-¨d¬i¸¼ÑCÔCˆ	ØÔ*×.Ò.¨u¬z¸5¼:ÑFÔFˆ
Ý�e�WÑ%Ô%ð 	¨)°zÒ*AÐ*AØ�4Øˆuru   Údep1Údep2c                ó2  — t          | t          ¦  «        rt          |t          ¦  «        sdS | |k    rdS | j        |j        k    r*|                      ¦   «         |                     ¦   «         k    S |                      ¦   «         |                     ¦   «         k    S )a  Check if two deps refer to the same access pattern after normalization.

        Handles the case where FusedSchedulerNodes have more loop vars
        than a single SchedulerNode (e.g., 3 vars vs 2) by falling back
        to normalize() which merges loops before comparing.
        FT)r²   r9   ry  rb	  r9  ©rj
  rk
  s     rs   r½	  zScheduler.deps_match_normalized;  s�   € õ ˜$¥	Ñ*Ô*ð 	µ*¸TÅ9Ñ2MÔ2Mð 	Ø�5Ø�4Š<ˆ<Ø�4ØŒ=˜DœMÒ)Ð)à×0Ò0Ñ2Ô2°d×6VÒ6VÑ6XÔ6XÒXðð �~Š~ÑÔ 4§>¢>Ñ#3Ô#3Ò3Ð3ru   râ   r1  c                óB   — t           j                             ||¦  «        S r   )ra   rÂ   Úget_dep_size_hint)rr   râ   r1  s      rs   r¤	  zScheduler.dep_size_hintM  s   € ÝŒw×(Ò(¨¨kÑ:Ô:Ð:ru   c           
     ól  — |                      ¦   «         |j        z  sdS t          |j        j        ¦  «        }t          ¦   «         }d}|j        j        D ]ß}t          |t          ¦  «        sŒ| j	         
                    |j        |j        ¦  «        }	t          |¦  «        D ]’\  }
}|
|v rŒ
|                      |                     | j	        ¦  «        ||duo|	|v ¬¦  «        rR|                     |
¦  «         |t!          |                      ||¦  «        |                      ||¦  «        ¦  «        z  } nŒ“Œà|S )a0  Score vertical producer-output deps missed by exact dep scoring.

        Exact scoring is set-intersection based, but vertical legality can also
        accept normalized equivalent read/write deps. Give those pairs a memory
        score so heuristics do not discard them before legality runs.
        r   Nr/
  )r  r  r¥   rØ   rÙ   r   ra  r²   r9   r2  r¾  rÚ   rª  r2
  rŠ  r³  r`  r¤	  )rr   rf  rj  r1  rý	  rÙ   Úmatched_readsr�	  rV  r7
  r¨  r  s               rs   Ú*_score_fusion_memory_by_fusable_read_writez4Scheduler._score_fusion_memory_by_fusable_read_writeP  sd  € ð ×,Ò,Ñ.Ô.°Ô1CÑCð 	Ø�1å�XÔ)Ô/Ñ0Ô0ˆÝ)3©¬ˆØˆØÔ)Ô0ð 	ð 	ˆEÝ˜e¥YÑ/Ô/ð ØØÔ.×2Ò2°5´:¸u¼zÑJÔJˆJÝ$ UÑ+Ô+ð ð ‘��4Ø˜Ð%Ð%ØØ×.Ò.Ø—K’K Ô 5Ñ6Ô6Øà2¸$Ð>ð EØ&Ð*DÐDð /ñ ô ð ð "×%Ò% aÑ(Ô(Ð(Ø�SØ×*Ò*¨4°Ñ=Ô=Ø×*Ò*¨5°+Ñ>Ô>ñô ñ �Eð �Eðøð ˆru   c                ó¤   — |                       |||¬¦  «        }t          |t          ¦  «        sJ ‚|dk    r|r|                      |||¬¦  «        }|S )Nr'  r   r
  )r2  r²   r‘   rr
  )rr   rˆ   r‰   r(  rý	  r�	  s         rs   r
  z+Scheduler._score_fusion_memory_for_can_fusez  sx   € ð ×(Ò(ØØØ&?ð )ñ 
ô 
ˆõ
 ˜%¥Ñ%Ô%Ð%Ð%Ð%Ø�AŠ:ˆ:Ð4ˆ:Ø×CÒCØØØ+Eð Dñ ô ˆEð
 ˆru   .Úreturn_is_mix_order_reductionúLiteral[False]c                ó   — d S r   r…   ©rr   rˆ   r‰   r1  rt
  r(  s         rs   r2  zScheduler.score_fusion_memory�  s	   € ð ˆcru   úLiteral[True]útuple[int, int, bool]c                ó   — d S r   r…   rw
  s         rs   r2  zScheduler.score_fusion_memory™  s	   € ð !$ ru   úint | tuple[int, int, bool]c           	     ó(  ‡ ‡‡‡— ˆfd„}|rCt                                ||¦  «        r(t                                ||¦  «        } ||dd¦  «        S t          |j        t
          j        ¦  «        r|j                             ¦   «         s(|                     ¦   «         s|                     ¦   «         r”|j	        j
        |j	        j        z  }|j	        j
        |j	        j        z  Šdd„}	d}|D ]L}
‰D ]G} |	|
|¦  «        r9|t          ‰                      |
¦  «        ‰                      |¦  «        ¦  «        z  }ŒHŒM ||dd¦  «        S |j	        j
        |j	        j        z  }|j	        j
        |j	        j        z  Št          |¦  «        t          ‰¦  «        k    r‰|c}Šˆfd	„|D ¦   «         }t          ˆˆ fd
„|D ¦   «         ¦  «        }|r ||dd¦  «        S d}|dk    r,‰                      ||¦  «        r‰                      ||¦  «        } |||d¦  «        S )a2  
        The first term in our fusion score that estimates number of saved
        memory operations.

        This function scores fusion candidates based on shared memory access patterns.
        Higher scores indicate better fusion candidates.

        Scoring strategy:
        1. If nodes share exact memory deps (same buffer + same indexing), return
           the sum of shared dep sizes (original behavior).
        2. If no dependency score remains, check for same-buffer reads with
           different indexing (e.g., split operations reading different slices).
           - Give bonus if nodes read from exactly the same set of buffers
           - Score based on overlap ratio: common_buffer_size / total_read_size
           - High overlap (>50%) suggests good cache locality benefit from fusion
        c                ó   •— ‰r| ||fS | |z   S r   r…   )r�	  Úbuffer_overlap_scoreÚis_mix_order_reductionrt
  s      €rs   Ú_construct_return_valuez>Scheduler.score_fusion_memory.<locals>._construct_return_value¼  s)   ø€ ð -ð MØÐ3Ð5KÐLÐLØÐ/Ñ/Ð/ru   r   Trj
  r8   rk
  c                ó¦   — | |k    rdS t          | t          t          f¦  «        r,t          |t          t          f¦  «        r| j        |j        k    S dS r…  )r²   r:   r9   rÚ   rm
  s     rs   Ú_matchz-Scheduler.score_fusion_memory.<locals>._matchÜ  sX   € Ø˜4’<�<Ø˜4Ý˜d¥W­iÐ$8Ñ9Ô9ð 2½jØ�7¥IÐ.ñ?ô ?ð 2ð  œ9¨¬	Ò1Ð1Ø�uru   Fc                ó   •— g | ]}|‰v ¯|‘Œ	S r…   r…   )r·   râ   Ú
node2_depss     €rs   r   z1Scheduler.score_fusion_memory.<locals>.<listcomp>ô  s#   ø€ ÐMÐMÐM c¸3À*Ð;LÐ;L˜cÐ;LÐ;LÐ;Lru   c              3  óD   •K  — | ]}‰                      |‰¦  «        V — Œd S r   ©r¤	  )r·   râ   r1  rr   s     €€rs   r¹   z0Scheduler.score_fusion_memory.<locals>.<genexpr>õ  s3   øè è € ÐWÐW¸S�D×&Ò& s¨KÑ8Ô8ÐWÐWÐWÐWÐWÐWru   )rj
  r8   rk
  r8   )r¯   r  rõ   r²   r”   r0   r  r  rö  rØ   rÙ   ra  r`  r¤	  rÏ   rÿ   Ú_can_use_buffer_overlap_scoringÚ&_score_fusion_memory_by_buffer_overlap)rr   rˆ   r‰   r1  rt
  r(  r€
  r�	  Ú
node1_depsr‚
  Ú	node1_depÚ	node2_depÚcommon_memory_depsr~
  r„
  s   `  ``         @rs   r2  zScheduler.score_fusion_memory£  s�  øøøø€ ð2	0ð 	0ð 	0ð 	0ð 	0ð %ð 	;Õ):×)CÒ)CÀEÈ5Ñ)QÔ)Qð 	;õ
 &×6Ò6°u¸eÑDÔDˆEØ*Ð*¨5°!°TÑ:Ô:Ð:õ ˜5œ:¥rÔ'AÑBÔBð	<ð ”J×0Ò0Ñ2Ô2ð	<ð
 × Ò Ñ"Ô"ð	<ð × Ò Ñ"Ô"ð	<ð Ô*Ô0°5Ô3DÔ3KÑKˆJØÔ*Ô0°5Ô3DÔ3KÑKˆJðð ð ð ð ˆEØ'ð ð �	Ø!+ð ð �IØ�v˜i¨Ñ3Ô3ð Ø¥Ø ×.Ò.¨yÑ9Ô9¸4×;MÒ;MÈiÑ;XÔ;Xñ"ô "ñ ˜øðð +Ð*¨5°!°UÑ;Ô;Ð;àÔ&Ô,¨uÔ/@Ô/GÑGˆ
ØÔ&Ô,¨uÔ/@Ô/GÑGˆ
Ýˆz‰?Œ?�S ™_œ_Ò,Ð,Ø%/°Ð"ˆJ˜
àMÐMÐMÐM¨ZÐMÑMÔMÐÝÐWÐWÐWÐWÐWÐDVÐWÑWÔWÑWÔWˆØð 	<Ø*Ð*¨5°!°UÑ;Ô;Ð;ð  !ÐØ�AŠ:ˆ:˜$×>Ò>¸uÀeÑLÔLˆ:Ø#'×#NÒ#NØ�uñ$ô $Ð ð 'Ð& uÐ.BÀEÑJÔJÐJru   c                ór  — |                      ¦   «         s|                      ¦   «         rdS |                     ¦   «         s|                     ¦   «         rdS t          j        st          j        �rI|                     ¦   «         }|                     ¦   «         }|r|sdS t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          ¦   «         }|D ]Ö}|j        D ]Ì}	t          |	j	        t          ¦  «        r°|	j	                             ¦   «         r—t          |	j	        ¦  «        rƒ|	j	                             ¦   «         }
|
�Nt          |
t          j        ¦  «        r4|
                     ¦   «         }||z  r|                     |	j	        ¦  «         Œ²|                     |	j	        ¦  «         ŒÍŒ×|r¢|D ]Ÿ}|j        D ]•}	t          |	j	        t          ¦  «        ry|	j	                             ¦   «         r`|	j	        |v rW|	j	                             ¦   «         }
|
�8t          |
t          j        ¦  «        r|
                     ¦   «         }||z  r  dS Œ‘  dS Œ–Œ ||fD ]Y}|j        j        D ]J}| j                             |j        ¦  «        }|�'|                     ¦   «         rt-          |¦  «        r  dS ŒKŒZdS )a@  
        Check if buffer overlap scoring should be used for this node pair.

        Buffer overlap scoring handles split/cat patterns where nodes read from
        the same buffer at different indices. We skip it when:
        - Either node is a reduction (different memory access patterns)
        - Either node is a template
        - Both nodes are prologue/epilogue candidates for the same template,
          because horizontal fusion would prevent them from being absorbed
          into the template kernel. For example, in:
            q = a[:64, :]; k = a[64:, :]
            return mm(q + 2, k - 2)
          "q + 2" and "k - 2" both read from `a` and would get a high overlap
          score, but fusing them horizontally prevents prologue fusion into mm
          (resulting in 2 kernels instead of 1).

        We allow buffer overlap scoring when:
        - The node outputs are not actually in the template's allowed_prologue_inps,
          meaning they can't be prologue-fused anyway, so horizontal fusion doesn't
          prevent any optimization opportunity.
        FTc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   rI  rJ  s     rs   r¹   z<Scheduler._can_use_buffer_overlap_scoring.<locals>.<genexpr>*   ó*   è è € Ð+TÐ+T¸s¨C¯LªL©N¬NÐ+TÐ+TÐ+TÐ+TÐ+TÐ+Tru   c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   rI  rJ  s     rs   r¹   z<Scheduler._can_use_buffer_overlap_scoring.<locals>.<genexpr>+   r�
  ru   )r´   rö  r-   rÔ  rÓ  rL  r   rç  r²   r”   rf   rc  r›  r0   r]  r
  r³  rØ   rÙ   rÇ  r¾  rÚ   rP  )rr   rˆ   r‰   Únode1_outputsÚnode2_outputsÚnode1_output_namesÚnode2_output_namesÚ&node1_prologue_eligible_template_usersrÕ   rû  r­  Úallowed_inpsr”   râ   rf  s                  rs   r‡
  z)Scheduler._can_use_buffer_overlap_scoring   s?  € ð4 ×ÒÑÔð 	 5×#5Ò#5Ñ#7Ô#7ð 	Ø�5Ø×ÒÑÔð 	 %×"3Ò"3Ñ"5Ô"5ð 	Ø�5åÔð C	%¥&Ô":ñ C	%Ø!×-Ò-Ñ/Ô/ˆMØ!×-Ò-Ñ/Ô/ˆMð !ð ¨ð Ø�tå!+Ð+TÐ+TÀmÐ+TÑ+TÔ+TÑ!TÔ!TÐÝ!+Ð+TÐ+TÀmÐ+TÑ+TÔ+TÑ!TÔ!TÐõ
 ‘”ð 3ð %ð Rð R�ØœIð Rð R�Då" 4¤9Õ.?Ñ@Ô@ðRà œI×1Ò1Ñ3Ô3ðRõ 8¸¼	ÑBÔBðRð )-¬	×(CÒ(CÑ(EÔ(E˜Ø(Ð4½Ø)­2Ô+Bñ:ô :Ð4ð ,9×+RÒ+RÑ+TÔ+T˜LØ1°LÑ@ð VØ F× JÒ JÈ4Ì9Ñ UÔ UÐ Uøð C×FÒFÀtÄyÑQÔQÐQøð%Rð, 6ð -Ø(ð -ð -�CØ #¤	ð -ð -˜å& t¤yÕ2CÑDÔDð-à $¤	× 5Ò 5Ñ 7Ô 7ð-ð !%¤	Ð-SÐ SÐ Sð -1¬I×,GÒ,GÑ,IÔ,I˜MØ,Ð8½ZØ -­rÔ/Fñ>ô >Ð8ð 0=×/VÒ/VÑ/XÔ/X Ø#5¸Ñ#Dð !1Ø+0¨5¨5¨5ð!1ð (- u u uøð!-ð$  ˜ð %ð %�ØÔ+Ô1ð %ð %�CØ#Ô6×:Ò:¸3¼8ÑDÔD�Hà Ð,Ø$×0Ò0Ñ2Ô2ð -å7¸ÑAÔAð -ð  %˜u˜u˜uøð%ð ˆtru   c                óh  ‡ ‡‡‡— dŠdˆˆ fd„Št          d„ |j        j        D ¦   «         ¦  «        }t          d„ |j        j        D ¦   «         ¦  «        }||z  Š‰sd	S t          ˆfd
„|j        j        D ¦   «         ¦  «        }t          ˆfd„|j        j        D ¦   «         ¦  «        }t	          ||¦  «        }|d	k    rd	S t          ˆˆfd„|j        j        D ¦   «         ¦  «        }t          ˆˆfd„|j        j        D ¦   «         ¦  «        }	t	          ||	¦  «        }
|
|z  }|t
          j        k    r|
nd	S )a8  
        Score fusion based on buffer name overlap when exact dep matching fails.

        This handles the split/cat fusion case where nodes read from the same buffer
        but at different indices (e.g., different slices from a split operation).

        Scoring logic:
        - If nodes read from exactly the same buffers: high bonus (encourages fusion)
        - For common buffers: score based on overlap ratio
          - overlap_ratio = common_buffer_size /
            max(node1_total_reads, node2_total_reads)
          - If overlap_ratio > threshold (e.g., 0.5): give proportional score
          - If overlap_ratio < threshold: minimal/no score (not worth fusing)

        Note on dynamic shapes:
        - When deps have unbacked symbols (dynamic shapes), dep_size_hint returns 0
        - In this case, we use count * 10 as a proxy for size
        - This ensures fusion still works for models with dynamic batch sizes

        Note on multiple deps from same buffer:
        - A node may have multiple MemoryDep entries for the same buffer name
          (e.g., 4 split reads from arg0_1 at different indices)
        - We sum ALL dep sizes for each buffer, not just take max
        - This ensures overlap ratio is calculated correctly when nodes read
          multiple slices from the same underlying buffer
        rÞ  râ   r8   rŠ   r‘   c                óB   •— ‰                      | ¦  «        }|dk    r|n‰S rì   r†
  )râ   rß   ÚFALLBACK_DEP_SIZErr   s     €€rs   Úget_dep_sizezFScheduler._score_fusion_memory_by_buffer_overlap.<locals>.get_dep_size‰   s)   ø€ Ø×%Ò% cÑ*Ô*ˆDØ !š8˜8�4�4Ð):Ð:ru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zCScheduler._score_fusion_memory_by_buffer_overlap.<locals>.<genexpr>�   rE	  ru   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   zCScheduler._score_fusion_memory_by_buffer_overlap.<locals>.<genexpr>Ž   rE	  ru   r   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r…   ©r·   râ   rš
  s     €rs   r¹   zCScheduler._score_fusion_memory_by_buffer_overlap.<locals>.<genexpr>—   ó>   øè è € ð $
ð $
Ø"%ˆLˆL˜ÑÔð$
ð $
ð $
ð $
ð $
ð $
ru   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r…   rž
  s     €rs   r¹   zCScheduler._score_fusion_memory_by_buffer_overlap.<locals>.<genexpr>š   rŸ
  ru   c              3  ó@   •K  — | ]}|j         ‰v ¯ ‰|¦  «        V — Œd S r   r†  ©r·   râ   rÄ	  rš
  s     €€rs   r¹   zCScheduler._score_fusion_memory_by_buffer_overlap.<locals>.<genexpr>¥   óF   øè è € ð %
ð %
àØŒx˜<Ð'Ð'ð ˆL˜ÑÔà'Ð'Ð'Ð'ð%
ð %
ru   c              3  ó@   •K  — | ]}|j         ‰v ¯ ‰|¦  «        V — Œd S r   r†  r¢
  s     €€rs   r¹   zCScheduler._score_fusion_memory_by_buffer_overlap.<locals>.<genexpr>ª   r£
  ru   )râ   r8   rŠ   r‘   )r   rØ   rÙ   rÿ   r`  r-   Úmin_overlap_ratio)rr   rˆ   r‰   Únode1_read_namesrM	  Únode1_total_read_sizeÚnode2_total_read_sizeÚmax_total_read_sizeÚnode1_common_read_sizeÚnode2_common_read_sizeÚcommon_read_buffer_sizeÚoverlap_ratior™
  rÄ	  rš
  s   `           @@@rs   rˆ
  z0Scheduler._score_fusion_memory_by_buffer_overlapi   sø  øøøø€ ð< Ðð	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;õ &Ð%RÐ%R¸%Ô:KÔ:QÐ%RÑ%RÔ%RÑRÔRÐÝ%Ð%RÐ%R¸%Ô:KÔ:QÐ%RÑ%RÔ%RÑRÔRÐð (Ð*:Ñ:ˆàð 	Ø�1õ !$ð $
ð $
ð $
ð $
Ø).Ô):Ô)@ð$
ñ $
ô $
ñ !
ô !
Ðõ !$ð $
ð $
ð $
ð $
Ø).Ô):Ô)@ð$
ñ $
ô $
ñ !
ô !
Ðõ "Ð"7Ð9NÑOÔOÐØ !Ò#Ð#Ø�1õ
 "%ð %
ð %
ð %
ð %
ð %
àÔ(Ô.ð%
ñ %
ô %
ñ "
ô "
Ðõ
 "%ð %
ð %
ð %
ð %
ð %
àÔ(Ô.ð%
ñ %
ô %
ñ "
ô "
Ðõ #&Ð&<Ð>TÑ"UÔ"UÐð 0Ð2EÑEˆð
 (5½Ô8PÒ'PÐ'PÐ#Ð#ÐVWð	
ru   c                ó$  — t          |¦  «        dk    r|S i }|D ]¥\  }}|                     ¦   «         |                     ¦   «         k    sJ ‚|                     ¦   «         }t          |                      |¦  «                             ||¦  «        ¦  «        }||vr	||fg||<   Œˆ||                              ||f¦  «         Œ¦t          |                     ¦   «         t          j	        d¦  «        ¬¦  «        d         }t          |¦  «        dk    sJ ‚|S )Nr   rú  r   )
rÏ   rª   r‘   r<  Úget_fusion_pair_priorityrç   ra  rÌ  ro  rp  )rr   r¤  Ú"possible_fusions_group_by_priorityrˆ   r‰   rì  Úfusion_pair_priorityÚ&possible_fusions_with_highest_prioritys           rs   r	  z4Scheduler.get_possible_fusions_with_highest_priority½   sY  € õ
 ÐÑ Ô  AÒ%Ð%Ø#Ð#ð ð 	+ð -ð 	ð 	‰LˆE�5Ø×#Ò#Ñ%Ô%¨×)9Ò)9Ñ);Ô);Ò;Ð;Ð;Ð;Ø×%Ò%Ñ'Ô'ˆFÝ#&Ø× Ò  Ñ(Ô(×AÒAÀ%ÈÑOÔOñ$ô $Ð ð $Ð+MÐMÐMà˜E�NðLÐ2Ð3GÑHÐHð 3Ð3GÔH×OÒOØ˜E�Nñô ð ð õ 25Ø.×4Ò4Ñ6Ô6½HÔ<OÐPQÑ<RÔ<Rð2
ñ 2
ô 2
à
ô2Ð.õ Ð9Ñ:Ô:¸QÒ>Ð>Ð>Ð>Ø5Ð5ru   r‹   r   c                ó0   — t          j        j        | g|¢R Ž S )z-
        Shim for list.sort(key=...)
        )ra   rö  Úscore_fusionr�  s     rs   r	  zScheduler.score_fusion_keyÝ   s   € õ ŒyÔ% dÐ3¨UÐ3Ð3Ð3Ð3ru   c                óô   — t          t          j                             ¦   «         ¦  «        }t	          | j        ¦  «        D ]7}|                     || j        ¦  «         |                     |j	        ¦  «         Œ8dS )zg
        Populate node.last_usage recursively (also for the nodes within a FusedSchedulerNode)
        N)
r   ra   rÂ   rÜ  rÑ   rw  r¥  rŸ  rþ  r+  )rr   rž  r”   s      rs   rè  zScheduler.compute_last_usageå   sv   € õ
 )­¬×)AÒ)AÑ)CÔ)CÑDÔDÐå˜TœZÑ(Ô(ð 	8ð 	8ˆDØ×ÒÐ 3°TÔ5LÑMÔMÐMØ×&Ò& t¤Ñ7Ô7Ð7Ð7ð	8ð 	8ru   c                óD  — t          | j        t          j        j        z
  t          j        j        j        z
  ¦  «        D �]G}|| j        v rK| j        |         }|                     ¦   «         r)t          j        j         	                    |j
        ¦  «         ŒW|t          j        j        v rÝt          j        j        |         }t          |t          j        ¦  «        r%t          j        j         	                    |¦  «         ŒÀt          |t          j        t          j        f¦  «        rŒç|j        }t          |t          j        ¦  «        r|                     ¦   «         sJ ‚t          j        j         	                    |j        ¦  «         �ŒI| j                             ¦   «          dS )z*Free any buffers that are no longer neededN)rÿ  rî  ra   rÂ   r  r  Úfreedr  r  Úcodegen_freer”   rj  r²   r0   r^  rÃ  rÄ  rú   rý  Úis_input_bufferr°  )rr   rÚ   rÕ   ræ  Ústorages        rs   Úfree_bufferszScheduler.free_buffersð   sj  € åØÔ%ÝŒgÔ%ñ&åŒgÔ"Ô(ñ)ñ
ô 
ð 	Dñ 	DˆDð
 �tÔ'Ð'Ð'ØÔ& tÔ,�Ø—<’<‘>”>ð @Ý”GÔ(×5Ò5°c´hÑ?Ô?Ð?øØ�œÔ-Ð-Ð-Ý”gÔ*¨4Ô0�Ý˜c¥2Ô#5Ñ6Ô6ð 	DÝ”GÔ(×5Ò5°cÑ:Ô:Ð:Ð:Ý ¥bÔ&7½Ô9MÐ%NÑOÔOð DØà!œh�Gå" 7­B¬MÑ:Ô:ðØ?F×?VÒ?VÑ?XÔ?Xðð ØXå”GÔ(×5Ò5°g´lÑCÔCÐCùàÔ!×'Ò'Ñ)Ô)Ð)Ð)Ð)ru   c                óŽ   — | j                              ¦   «         D ]}|                     ¦   «          Œ|                      ¦   «          d S r   )r´  rà   Úflushr»
  )rr   r<  s     rs   r½
  zScheduler.flush
!  sF   € Ø”}×+Ò+Ñ-Ô-ð 	ð 	ˆGØ�MŠM‰OŒOˆOˆOØ×ÒÑÔÐÐÐru   Úscheduler_nodec                ó¬  — t          |t          t          f¦  «        sJ ‚t          d         dxx         dz  cc<   t	          j        t          d¬¦  «        ¦  «        5  |                     ¦   «          |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   | 	                    t          j
        j        ¦  «         |                      ¦   «          d S )Nrp  Úextern_callsr   F)Úincrease_kernel_count)r²   rd  rM  r   ra   Úset_kernel_handlerr5   r!  r§  r  rÂ   r  r»
  )rr   r¾
  s     rs   Úcodegen_extern_callzScheduler.codegen_extern_call!  s  € õ ØÝ&Õ(LÐMñ
ô 
ð 	
ð 	
ð 
õ 	�Ô˜^Ð,Ð,Ô,°Ñ1Ð,Ð,Ñ,ÝÔ!¥&¸uÐ"EÑ"EÔ"EÑFÔFð 	&ð 	&Ø×0Ò0Ñ2Ô2Ð2Ø×#Ò#Ñ%Ô%Ð%ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð 	×Ò�qœwÔ3Ñ4Ô4Ð4Ø×ÒÑÔÐÐÐs   Á)BÂBÂBÚBaseSchedulingc                óF  — t          |j        ¦  «        r|j        €J |› d�¦   «         ‚t          j                             |¦  «         t          |j        ¦  «        }|€t          d|j        › �¦  «        ‚t          ¦   «         s•|j        dk    rKt          j
                             |¦  «        x}j        dk     r!t          |t          j        ¦   «         ¦  «        ‚t          |j        ¦  «        r+|j        dk    s t!          t          j        ¦   «         ¦  «        ‚ || ¦  «        S )Nz( should have been normalized in loweringzUnsupported device type: r§   é   r¨  )r[   r«   rÛ   ra   rÂ   Úadd_device_infor4   r¨  r+   rp  r§   Úget_device_propertiesÚmajorr<   ÚinspectÚcurrentframer=   )rr   rì  Údevice_schedulingr  s       rs   Úcreate_backendzScheduler.create_backend"!  s  € Ý˜&œ+Ñ&Ô&ð 	
¨&¬,Ð*BÐ*BØÐ?Ð?Ð?ñ +CÔ*BÐBõ 	
Œ×Ò Ñ'Ô'Ð'å5°f´kÑBÔBÐØÐ$ÝÐH¸6¼;ÐHÐHÑIÔIÐIå‰|Œ|ð 	<à”˜vÒ%Ð%Ý%*¤Z×%EÒ%EÀfÑ%MÔ%MÐM�\ÔTÐWXÒXÐXå(¨µwÔ7KÑ7MÔ7MÑNÔNÐNÝ˜œÑ$Ô$ð <¨V¬[¸EÒ-AÐ-AÝ#¥GÔ$8Ñ$:Ô$:Ñ;Ô;Ð;à Ð  Ñ&Ô&Ð&ru   c                óp   — |€J ‚|| j         vr|                      |¦  «        | j         |<   | j         |         S r   )r´  rÍ
  rë  s     rs   r<  zScheduler.get_backend7!  sB   € ØÐ!Ð!Ð!Ø˜œÐ&Ð&Ø$(×$7Ò$7¸Ñ$?Ô$?ˆDŒM˜&Ñ!ØŒ}˜VÔ$Ð$ru   c                ó4  ‡ ‡— d	ˆ fd„Šˆfd„|                      ¦   «         D ¦   «         }t          |                     ¦   «         ¦  «        }|rLt          |t	          j        d¦  «        ¬¦  «        \  }}t          j        j         	                    |¦  «         d S d S )
NrÜ  útorch.fx.NoderŠ   r‘   c                ó¦   •— | ‰j         vr;‰j                              d„ t          | j        j        ¦  «        D ¦   «         ¦  «         ‰j         |          S )Nc                ó   — i | ]\  }}||“Œ	S r…   r…   r§  s      rs   rK  z>Scheduler.enter_context.<locals>.get_order.<locals>.<dictcomp>@!  s   € Ð,WÐ,WÐ,W±d°a¸¨Q°Ð,WÐ,WÐ,Wru   )rï  rþ  rª  rÂ   rw  )rÜ  rr   s    €rs   Ú	get_orderz*Scheduler.enter_context.<locals>.get_order>!  sQ   ø€ Ø˜Ô,Ð,Ð,ØÔ$×+Ò+Ð,WÐ,W½iÈÌÌÑ>VÔ>VÐ,WÑ,WÔ,WÑXÔXÐXØÔ'¨Ô*Ð*ru   c                ór   •— i | ]3}|j         ®	|j                              ¦   «         D ]} ‰|¦  «        |fd “ŒŒ4S r   r�  )r·   rÜ  r  rÓ
  s      €rs   rK  z+Scheduler.enter_context.<locals>.<dictcomp>D!  sY   ø€ ð 
ð 
ð 
àØŒvÐ!Ø”V×'Ò'Ñ)Ô)ð "Ð!Øð ˆY�q‰\Œ\˜1Ð˜tà!Ð!Ð!Ð!ru   r   rú  )rÜ  rÐ
  rŠ   r‘   )
r»   r¥   r'  r`  ro  rp  ra   rÂ   r  Úenter_context)rr   r”   r4  r?  ÚlastrÓ
  s   `    @rs   rÕ
  zScheduler.enter_context=!  s½   øø€ ð	+ð 	+ð 	+ð 	+ð 	+ð 	+ð
ð 
ð 
ð 
à—^’^Ñ%Ô%ð
ñ 
ô 
ˆõ �w—|’|‘~”~Ñ&Ô&ˆØð 	5Ý˜'¥xÔ':¸1Ñ'=Ô'=Ð>Ñ>Ô>‰GˆAˆtÝŒGÔ ×.Ò.¨tÑ4Ô4Ð4Ð4Ð4ð	5ð 	5ru   rÚ   rK	  c                ó¨   ‡— 	 | j         |         j        }n# t          $ r Y dS w xY wt          ˆfd„|D ¦   «         ¦  «        o|| j        vo|| j        vS )NFc              3  óR   •K  — | ]!}|j         p|                     ¦   «         ‰v V — Œ"d S r   )r2  rê  )r·   rû  rK	  s     €rs   r¹   zAScheduler.can_buffer_be_removed_through_fusion.<locals>.<genexpr>W!  s8   øè è € ÐVÐVÈ�”ÐC §¢¡¤Ð3CÐ CÐVÐVÐVÐVÐVÐVru   )r  rç  ÚKeyErrorrº   r2  rŸ  )rr   rÚ   rK	  rç  s     ` rs   rJ	  z.Scheduler.can_buffer_be_removed_through_fusionO!  s„   ø€ ð	ØÔ$ TÔ*Ô0ˆEˆEøÝð 	ð 	ð 	Ø�5�5ð	øøøõ ÐVÐVÐVÐVÐPUÐVÑVÔVÑVÔVð 4Ø˜DÔ1Ð1ð4à˜DÔ3Ð3ð	
s   ƒ –
$£$c                óž  — |j         }t          |t          j        j        j        ¦  «        r]|j        x}rTt          |¦  «        \  }}|t          j	        v s|t          j	        v r&t          |t          j
        j        ¦  «        sJ ‚d|› �S t          j        j        j        j        st          j        €dS t          |t           ¦  «        r'|j        D ]}|                      |¦  «        }|r|c S ŒdS |j         €J ‚|                     ¦   «         s|                     ¦   «         › d�S t          |j         t          j        ¦  «        rdS t          |j         t          j        ¦  «        rdS t/          |j         dd¦  «        rdS t1          |j         ¦  «        rd	S |                      |¦  «        x}r|S t          j        j        rt7          |¦  «        rd
S dS )zŠ
        Return the reason why we should partition the inductor graph on this node,
        or None if the node is cudagraphable.
        zcustom partition op: Nz6partition includes all ops when cudagraphs is disabledz opszDeviceCopy opszConditional opsÚunbacked_bindingszunbacked binding opszCUDAGraph-unsafe custom opszdynamic shape ops)r”   r²   rp  rq  r0   r  re  rV   r-   Úcustom_should_partition_opsrÔ  rÕ  r©   re   rN   r#  rÝ   rÞ   Úshould_partitionr[   rª   Ú
DeviceCopyr   rÉ  rZ   Ú&_uses_cudagraph_unsafe_unbacked_symintÚcudagraph_skip_dynamic_graphsrF  )rr   r”   rH  rë  Úop_overload_packet_nameÚop_overload_namer¿  rí  s           rs   rÝ
  zScheduler.should_partition\!  sù  € ð ”)ˆÝ�g�uœÔ1Ô@ÑAÔAð 		BØÔ%Ð%ˆBð		Bõ 9EÀRÑ8HÔ8HÑ5Ð#Ð%5à'­6Ô+MÐMÐMØ#¥vÔ'IÐIÐIå! "¥e¤jÔ&;Ñ<Ô<Ð<Ð<Ð<ØAÐ/?ÐAÐAÐAõ ”Ô&Ô-Ô8ð	Lå6Ô>ÐFàKÐKå�dÕ.Ñ/Ô/ð 	Øœð "ð "�Ø×.Ò.¨uÑ5Ô5�Øð "Ø!�M�M�Mð"à�4àŒyÐ$Ð$Ð$à�{Š{‰}Œ}ð 	.Ø—o’oÑ'Ô'Ð-Ð-Ð-Ð-å�d”i¥¤Ñ/Ô/ð 	$Ø#Ð#å�d”i¥¤Ñ0Ô0ð 	%Ø$Ð$å�4”9Ð1°4Ñ8Ô8ð 	*Ø)Ð)å! $¤)Ñ,Ô,ð 	1Ø0Ð0à×@Ò@ÀÑFÔFÐFˆ6ð 	ØˆMõ Œ=Ô6ð 	+Ý-¨dÑ3Ô3ð +Ø*Ð*àˆtru   r;  c                ó  — t          ¦   «         }t          j        s|S | j        D ]à}|j        }|€Œt          |t          j        j        j	        ¦  «        sŒ1|j
        }|€Œ;t          |¦  «        \  }}|t          j        vr|t          j        vrŒj|                     ¦   «         D ]a}t          j        j                             |¦  «        }t#          |t$          j        t$          j        f¦  «        r|                     |¦  «         ŒbŒá|S )zc
        Collect output unbacked symints from ops in config.cudagraph_unsafe_unbacked_ops.
        )r   r-   Úcudagraph_unsafe_unbacked_opsrw  r”   r²   rp  rq  r0   r  re  rV   rO  ra   rÂ   rÃ   rÄ   r)   r*   ÚUNBACKED_INTÚUNBACKED_FLOATr³  )rr   Úunsafe_symintsr”   rH  rë  rá
  râ
  Úsyms           rs   Ú&_get_cudagraph_unsafe_unbacked_symintsz0Scheduler._get_cudagraph_unsafe_unbacked_symints›!  s  € õ
 4>±<´<ˆåÔ3ð 	"Ø!Ð!à”Jð 	,ð 	,ˆDØ”iˆGØˆØå˜g¥u¤Ô'9Ô'HÑIÔIð ØàÔ$ˆBØˆzØå8DÀRÑ8HÔ8HÑ5Ð#Ð%5à'­vÔ/SÐSÐSØ$­FÔ,PÐPÐPàà×7Ò7Ñ9Ô9ð ,ð ,�Ý”gÔ&×/Ò/°Ñ4Ô4�Ý! #­Ô(9½4Ô;NÐ'OÑPÔPð ,Ø"×&Ò& sÑ+Ô+Ð+øð,ð
 Ðru   c                óÔ   — |                       ¦   «         }|sd S t          |¦  «        }|D ]=}t          j        j                             |¦  «        }|j        D ]}||v r	d|› �c c S ŒŒ>d S )Nz'uses cudagraph-unsafe unbacked symint: )ré
  rF  ra   rÂ   rÃ   rÄ   r&   )rr   r”   rç
  Únode_symbolsrè
  Úsimplified_symÚfree_syms          rs   rß
  z0Scheduler._uses_cudagraph_unsafe_unbacked_symint¿!  s£   € ð ×DÒDÑFÔFˆØð 	Ø�4å5°dÑ;Ô;ˆàð 	Pð 	PˆCÝœWÔ-×6Ò6°sÑ;Ô;ˆNØ*Ô7ð Pð P�Ø˜~Ð-Ð-ØOÀXÐOÐOÐOÐOÐOÐOÐOð .ðPð ˆtru   ú6dict[str, ir.IRNode | ir.TorchBindObject | sympy.Expr]c                ó¸   — i }|                      t          j        j        ¦  «         | j        D ]+}|j                             ¦   «         D ]\  }}|j        ||<   ŒŒ,|S )z~
        Return a mapping from name strings to the corresponding graph inputs or
        base scheduler node outputs.
        )rþ  ra   rÂ   rj  rw  r7  rÌ  r”   )rr   rm  r”   rÚ   Úscheduler_buffers        rs   Úget_name_to_nodeszScheduler.get_name_to_nodesÐ!  sv   € ð PRˆØ×Ò�AœGÔ0Ñ1Ô1Ð1à”Jð 	;ð 	;ˆDØ*.Ô*>×*DÒ*DÑ*FÔ*Fð ;ð ;Ñ&�Ð&Ø%5Ô%:�˜TÑ"Ð"ð;ð Ðru   Ú
signaturesúlist[GraphPartitionSignature]c           	     ó‚  — d„ t          t          j        j        ¦  «        D ¦   «         }d„ t          t          j                             ¦   «         ¦  «        D ¦   «         }g t          j        _        t          |¦  «        D ]À\  }}|j        rŒg }|j        D ]*}|                     | 	                    |¦  «        ¦  «         Œ+g }|j
        D ]<}	|                     | 	                    |	                     ¦   «         ¦  «        ¦  «         Œ=t          j        j                             t          ||||j        ¦  «        ¦  «         ŒÁdS )z‚
        computes a mapping from partition input/output indices to graph input/output
        indices for each partition.
        c                ó   — i | ]\  }}||“Œ	S r…   r…   ©r·   r¸  rÚ   s      rs   rK  z:Scheduler.compute_graph_partition_maps.<locals>.<dictcomp>è!  s+   € ð %
ð %
ð %
Ù#˜#˜tˆD�#ð%
ð %
ð %
ru   c                ó   — i | ]\  }}||“Œ	S r…   r…   rö
  s      rs   rK  z:Scheduler.compute_graph_partition_maps.<locals>.<dictcomp>ë!  s+   € ð &
ð &
ð &
Ù#˜#˜tˆD�#ð&
ð &
ð &
ru   N)rª  ra   rÂ   rj  rÜ  Úpartition_mapsÚskip_cudagraphÚinput_nodesrç   r¾  Úoutput_nodesrê  rW   Úconstant_names)
rr   rò
  Úname_to_graph_input_indexÚname_to_graph_output_indexÚpartition_idÚ	signatureÚinput_mappingrÚ   Úoutput_mappingr”   s
             rs   Úcompute_graph_partition_mapsz&Scheduler.compute_graph_partition_mapsà!  si  € ð%
ð %
Ý'0µ´Ô1EÑ'FÔ'Fð%
ñ %
ô %
Ð!ð&
ð &
Ý'0µ´×1IÒ1IÑ1KÔ1KÑ'LÔ'Lð&
ñ &
ô &
Ð"ð "$�ŒÔÝ'0°Ñ'<Ô'<ð 	ð 	Ñ#ˆL˜)ØÔ'ð ð
 àˆMØ!Ô-ð Jð J�Ø×$Ò$Ð%>×%BÒ%BÀ4Ñ%HÔ%HÑIÔIÐIÐIàˆNØ!Ô.ð Wð W�Ø×%Ò%Ð&@×&DÒ&DÀTÇ]Â]Á_Ä_Ñ&UÔ&UÑVÔVÐVÐVåŒGÔ"×)Ò)Ý!Ø Ø!Ø"ØÔ,ñ	ô ñô ð ð ð!	ð 	ru   Ú	partitionrg   rú
  c                ó¼  ‡— dd„Šdd„} t          ¦   «         j        d„ |D ¦   «         Ž } |j        ˆfd	„|                     ¦   «         D ¦   «         Ž   ||¦  «        }t          ¦   «         }|D ]@}t          j        j                             |¦  «        }|                     |j        ¦  «         ŒAt          t          |t          j        d
¦  «        ¬¦  «        ¦  «        S )ai  
        Returns all symbol inputs which are required to be in scope to successfully
        perform codegen for this graph partition, including:
        - free symbols used in partition nodes
        - free symbols in partition input/node shapes, strides, and offsets. This is needed
          for recording cudagraphs for tensors with dynamic shapes.
        r”   ú+ir.IRNode | sympy.Expr | ir.TorchBindObjectrŠ   r;  c                óâ   — t          | t          j        ¦  «        rt          ¦   «         S t          | t          j        ¦  «        rt          | ¦  «        S t          dt          | ¦  «        › �¦  «        ‚)zW
            Gets symbols used in input node shapes, strides, and offsets.
            zUnsupported input node type: )r²   r0   r^  r   r€  rA  r  r«   r¼   s    rs   Úget_input_node_symbolszKScheduler.get_graph_partition_symbol_inputs.<locals>.get_input_node_symbols"  sf   € õ ˜$¥Ô 2Ñ3Ô3ð Xå!‘|”|Ð#Ý˜D¥"¤)Ñ,Ô,ð XÝ)¨$Ñ/Ô/Ð/õ *Ð*VÍ$ÈtÉ*Ì*Ð*VÐ*VÑWÔWÐWru   Úsymbolsc                ó4   — t          d„ | D ¦   «         ¦  «        S )zÌ
            Filters a set of symbols that are required for codegen. Skip symbols
            that are always internal to kernels, such as SymT.TMP, SymT.INDEX,
            and SymT.R0_INDEX.
            c              3  ó’   K  — | ]B}t          |t          j        t          j        t          j        t          j        f¦  «        ¯>|V — ŒCd S r   )r)   r*   ÚSIZEÚFLOATrå
  ræ
  rC  s     rs   r¹   zVScheduler.get_graph_partition_symbol_inputs.<locals>.filter_symbols.<locals>.<genexpr>."  sd   è è € ð ð àÝ!Øåœ	Ýœ
ÝÔ)ÝÔ+ð	ñô ðØðð ð ð ð ð ru   r   )r	  s    rs   Úfilter_symbolszCScheduler.get_graph_partition_symbol_inputs.<locals>.filter_symbols&"  s2   € õ ð ð à ðñ ô ñ ô ð ru   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   rE  rÒ  s     rs   r¹   z>Scheduler.get_graph_partition_symbol_inputs.<locals>.<genexpr>="  s+   è è € ÐIÐI°tÕ,¨TÑ2Ô2ÐIÐIÐIÐIÐIÐIru   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r…   )r·   r”   r  s     €rs   r¹   z>Scheduler.get_graph_partition_symbol_inputs.<locals>.<genexpr>@"  s/   øè è € ÐLÐL¨tÐ$Ð$ TÑ*Ô*ÐLÐLÐLÐLÐLÐLru   rÚ   rú  )r”   r  rŠ   r;  )r	  r;  rŠ   r;  )r   rÆ  rþ  rà   ra   rÂ   rÃ   rÄ   r&   rÿ  ro  Ú
attrgetter)	rr   r  rú
  r  Úcandidate_symbolsrK  rI  Úsymplified_sr  s	           @rs   Ú!get_graph_partition_symbol_inputsz+Scheduler.get_graph_partition_symbol_inputs	"  s  ø€ ð	Xð 	Xð 	Xð 	Xð 	ð 	ð 	ð 	ð, 7Iµj±l´lÔ6HØIÐI¸yÐIÑIÔIð7
Ðð 	!ÐÔ ØLÐLÐLÐL°{×7IÒ7IÑ7KÔ7KÐLÑLÔLð	
ð 	
ð +˜NÐ+<Ñ=Ô=Ðå(2©¬ˆØ"ð 	2ð 	2ˆAÝœ7Ô+×4Ò4°QÑ7Ô7ˆLà�JŠJ�|Ô0Ñ1Ô1Ð1Ð1å�& ­(Ô*=¸fÑ*EÔ*EÐFÑFÔFÑGÔGÐGru   Ú
partitionsúlist[PartitionType]Úskip_cudagraphsú
list[bool]c           	     óØ  ‡ ‡‡‡— g }t          t          j                             ¦   «         ¦  «        }‰                      ¦   «         Šdˆˆ fd„Št          t          |¦  «        t          |¦  «        ¦  «        D �]è\  }}t          ¦   «         }|D ].}|                     |j         	                    ¦   «         ¦  «         Œ/| 
                    |¦  «        }	t          j                             d„ |D ¦   «         ¦  «        }
t          d„ |
j        |
j        z  D ¦   «         ¦  «        |z
  }t          ˆ fd„|D ¦   «         ¦  «        }t          ¦   «         Š|D ]}‰                     |j        ¦  «         Œˆfd	„‰|z
  D ¦   «         }|                     |¦  «         ˆfd
„|D ¦   «         }ˆˆfd„|D ¦   «         }ˆˆfd„|D ¦   «         }|	                     |¦  «         t          ˆ fd„|	D ¦   «         ¦  «        }	ˆˆfd„|	D ¦   «         }d„ |D ¦   «         }‰                      ||¦  «        }t%          ||||||¦  «        }|                     |¦  «         |                     ||	z
  ¦  «        }�Œê|ddd…         S )z¡
        Gets signature for each graph partition, including input nodes, output nodes, and
        whether deallocating an input within graph partition.
        rä  rÖ   rŠ   rv   c                óØ   •— ‰j                              | d¦  «        }|€dS t          |j        j        t
          ¦  «        r*‰j                             | d¦  «        x}r ‰|¦  «        S dS dS )zì
            Checks if buf_name resolves to a NoneLayout buffer (following mutation_real_name).
            Buffers with NoneLayout are not allocated so graph partition should not
            take them as inputs or outputs.
            NFT)r  r¾  r²   r”   rõ  rD   rŸ  )rä  rÕ   rV  Úis_unallocated_bufferrr   s      €€rs   r  zFScheduler.get_graph_partition_signature.<locals>.is_unallocated_bufferY"  sz   ø€ ð Ô"×&Ò& x°Ñ6Ô6ˆCàˆ{Ø�uå˜#œ(œ/­:Ñ6Ô6ð ð !%Ô 7× ;Ò ;¸HÀdÑ KÔ KÐK�9ð <Ø0Ð0°Ñ;Ô;Ð;à�tà�5ru   c                ó   — g | ]	}|j         ‘Œ
S r…   r¿  rÒ  s     rs   r   z;Scheduler.get_graph_partition_signature.<locals>.<listcomp>|"  s   € Ð8Ð8Ð8 d�Ô!Ð8Ð8Ð8ru   c                óF   — g | ]}t          |t          ¦  «        °|j        ‘ŒS r…   )r²   r;   rÚ   rÀ  s     rs   r   z;Scheduler.get_graph_partition_signature.<locals>.<listcomp>ƒ"  s:   € ð ð ð àÝ)¨!­WÑ5Ô5ðØœðð ð ru   c              3  óN   •K  — | ]}‰j                              ||¦  «        V — Œ d S r   ©rŸ  r¾  r%  s     €rs   r¹   z:Scheduler.get_graph_partition_signature.<locals>.<genexpr>Œ"  óJ   øè è € ð /ð /àð Ô'×+Ò+¨D°$Ñ7Ô7ð/ð /ð /ð /ð /ð /ru   c                ó   •— g | ]}|‰v ¯|‘Œ	S r…   r…   ©r·   rÚ   rm  s     €rs   r   z;Scheduler.get_graph_partition_signature.<locals>.<listcomp>˜"  s.   ø€ ð !ð !ð !àØ˜<Ð'Ð'ð à'Ð'Ð'ru   c                ó*   •— i | ]}|‰v ¯|‰|         “ŒS r…   r…   r"  s     €rs   rK  z;Scheduler.get_graph_partition_signature.<locals>.<dictcomp>Ÿ"  s5   ø€ ð ð ð àØ˜<Ð'Ð'ð �l 4Ô(à'Ð'Ð'ru   c                ó"   •— i | ]}|‰v ¯||‰v “ŒS r…   r…   ©r·   rÚ   rî  rm  s     €€rs   rK  z;Scheduler.get_graph_partition_signature.<locals>.<dictcomp>¤"  s6   ø€ ð "ð "ð "àØ˜<Ð'Ð'ð �dÐ2Ð2à'Ð'Ð'ru   c                ó$   •— g | ]}|‰v ¯|‰v¯
|‘ŒS r…   r…   r%  s     €€rs   r   z;Scheduler.get_graph_partition_signature.<locals>.<listcomp>®"  s9   ø€ ð "ð "ð "àØ˜<Ð'Ð'¨DÐ8LÐ,LÐ,Lð à,LÐ,LÐ,Lru   c              3  óN   •K  — | ]}‰j                              ||¦  «        V — Œ d S r   r  r%  s     €rs   r¹   z:Scheduler.get_graph_partition_signature.<locals>.<genexpr>¶"  r   ru   c                ó6   •— g | ]} ‰|¦  «        °‰|         ‘ŒS r…   r…   )r·   rÚ   r  rm  s     €€rs   r   z;Scheduler.get_graph_partition_signature.<locals>.<listcomp>»"  s?   ø€ ð ð ð àØ,Ð,¨TÑ2Ô2ðØ˜TÔ"ðð ð ru   c                ó8   — g | ]}|t           j        j        v ¯|‘ŒS r…   )ra   rÂ   r¸  )r·   rÚ   s     rs   r   z;Scheduler.get_graph_partition_signature.<locals>.<listcomp>Á"  s.   € ð ð ð Ø¸$Å!Ä'ÔBSÐ:SÐ:S�Ð:SÐ:SÐ:Sru   Nr!  )rä  rÖ   rŠ   rv   )r   ra   rÂ   rÜ  rñ
  r•  rÑ   rþ  r7  r'  r5	  r/   rÄ  rÅ  rÙ   ra  r+  r  rA   rç   rÆ  )rr   r  r  rò
  Úunmet_output_namesr  rù
  Úoutput_namesr”   Úreturned_output_namesrØ   Úpartition_input_namesÚextra_input_namesrú
  Úinput_deallocationÚextra_output_namesrû
  rü
  Úsymbol_inputsÚpartition_signaturerî  r  rm  s   `                   @@@rs   Úget_graph_partition_signaturez'Scheduler.get_graph_partition_signatureM"  s´  øøøø€ ð ˆ
å'­¬×(@Ò(@Ñ(BÔ(BÑCÔCÐØ×-Ò-Ñ/Ô/ˆð	ð 	ð 	ð 	ð 	ð 	ð 	õ, *-Ý�ZÑ Ô ¥(¨?Ñ";Ô";ñ*
ô *
ð g	ñ g	Ñ%ˆI�~õ -7©L¬LˆLà!ð Að A�Ø×#Ò# DÔ$8×$=Ò$=Ñ$?Ô$?Ñ@Ô@Ð@Ð@à$0×$=Ò$=Ð>PÑ$QÔ$QÐ!õ 'Ô1×<Ò<Ø8Ð8¨iÐ8Ñ8Ô8ñô ˆKõ ðð à!,Ô!2°[Ô5GÑ!Gðñ ô ñô ð ñð "õ %/ð /ð /ð /ð /à1ð/ñ /ô /ñ %ô %Ð!õ
 5?±L´LÐ Ø!ð =ð =�Ø$×+Ò+¨D¬OÑ<Ô<Ð<Ð<ð
!ð !ð !ð !à1°LÑ@ð!ñ !ô !Ðð
 "×(Ò(Ð):Ñ;Ô;Ð;ðð ð ð à1ðñ ô ˆKð
"ð "ð "ð "ð "à1ð"ñ "ô "Ðð"ð "ð "ð "ð "à1ð"ñ "ô "Ðð "×(Ò(Ð);Ñ<Ô<Ð<å$.ð /ð /ð /ð /à1ð/ñ /ô /ñ %ô %Ð!ð
ð ð ð ð à1ðñ ô ˆLðð Ø!6ðñ ô ˆNð !×BÒBØ˜;ñô ˆMõ #:ØØØØ"ØØñ#ô #Ðð ×ÒÐ1Ñ2Ô2Ð2à!6×!<Ò!<Ø"Ð%:Ñ:ñ"ô "ÐÑð ˜$˜$˜B˜$ÔÐru   r   rA   r  c                ó   ‡— ˆfd„|j                              ¦   «         D ¦   «         }ˆfd„|j                             ¦   «         D ¦   «         }ˆfd„|j        D ¦   «         }ˆfd„|j        D ¦   «         }t          |j        ||||j        |¦  «        S )z™
        Updates the partition signature by removing buffers specified in
        removed_buffers. See [Note: Removed Graph Partition Arguments]
        c                ó$   •— i | ]\  }}|‰v¯	||“ŒS r…   r…   )r·   rÚ   r"  r  s      €rs   rK  zLScheduler.clean_removed_buffer_from_partition_signatures.<locals>.<dictcomp>ã"  s4   ø€ ð 
ð 
ð 
á��fØ˜?Ð*Ð*ð �&à*Ð*Ð*ru   c                ó$   •— i | ]\  }}|‰v¯	||“ŒS r…   r…   )r·   rÚ   r]  r  s      €rs   rK  zLScheduler.clean_removed_buffer_from_partition_signatures.<locals>.<dictcomp>è"  s4   ø€ ð 
ð 
ð 
á��cØ˜?Ð*Ð*ð �#à*Ð*Ð*ru   c                ó@   •— g | ]}|                      ¦   «         ‰v¯|‘ŒS r…   )Úmaybe_get_name)r·   r”   r  s     €rs   r   zLScheduler.clean_removed_buffer_from_partition_signatures.<locals>.<listcomp>í"  s:   ø€ ð 
ð 
ð 
àØ×"Ò"Ñ$Ô$¨OÐ;Ð;ð à;Ð;Ð;ru   c                ó   •— g | ]}|‰v¯|‘Œ	S r…   r…   )r·   rÚ   r  s     €rs   r   zLScheduler.clean_removed_buffer_from_partition_signatures.<locals>.<listcomp>ò"  s*   ø€ ð 
ð 
ð 
Ø¸À_Ð9TÐ9TˆDÐ9TÐ9TÐ9Tru   )rú
  rÌ  r/  rû
  rü
  rA   r1  rù
  )rr   r   r  rú
  r/  rû
  rü
  s     `    rs   Ú.clean_removed_buffer_from_partition_signaturesz8Scheduler.clean_removed_buffer_from_partition_signaturesÚ"  sô   ø€ ð
ð 
ð 
ð 
à )Ô 5× ;Ò ;Ñ =Ô =ð
ñ 
ô 
ˆð

ð 
ð 
ð 
à&Ô9×?Ò?ÑAÔAð
ñ 
ô 
Ðð

ð 
ð 
ð 
à!Ô.ð
ñ 
ô 
ˆð

ð 
ð 
ð 
Ø&Ô5ð
ñ 
ô 
ˆõ 'ØÔ#ØØØØÔ$Øñ
ô 
ð 	
ru   c                ó¦  ‡ ‡‡‡	‡
‡‡— ddl Št          ¦   «         Š
g Šg Šd„ t          |¦  «        D ¦   «         Šdˆˆˆˆˆ fd„Š	dˆ	ˆ
fd	„}|D ]5}t          |j        j        ¦  «        ‰
|<   ‰
|         dk    r ‰	|¦  «         Œ6g }d}|t          |¦  «        k     r˜‰s‰r”‰r:‰                     ‰¦  «        \  }}|                     |¦  «          ||¦  «         ‰°:‰r:‰                     ‰¦  «        \  }}|                     |¦  «          ||¦  «         ‰°:|d
z  }|t          |¦  «        k     r‰°’‰°”|t          |¦  «        k    rt          d¦  «        ‚|S )aœ  
        Reorder nodes to minimize the number of partitions via a bfs
        topological sort. This is the optimal reordering such that the
        number of partitions cannot be reduced further. This may be
        sub-optimal for other metrics such as peak memory. This does not
        change relative orders of two cudagraphable nodes, nor the
        relative order of two non_cudagraphable nodes.
        r   Nc                ó   — i | ]\  }}||“Œ	S r…   r…   rÝ  s      rs   rK  z>Scheduler.reorder_for_minimizing_partition.<locals>.<dictcomp>#  s   € ÐEÐEÐE¡y s¨D˜˜sÐEÐEÐEru   r”   rf   rŠ   r   c                ó¢   •— ‰|          | f}‰                      | ¦  «        r‰                     ‰|¦  «         d S ‰                     ‰|¦  «         d S r   )rÝ
  Úheappush)r”   Únode_with_indexÚcudagraphable_nodesÚheapqÚnode_to_indexÚnon_cudagraphable_nodesrr   s     €€€€€rs   Úinsert_pending_nodeszHScheduler.reorder_for_minimizing_partition.<locals>.insert_pending_nodes#  s_   ø€ Ø,¨TÔ2°DÐ9ˆOØ×$Ò$ TÑ*Ô*ð EØ—’Ð6¸ÑHÔHÐHÐHÐHà—’Ð2°OÑDÔDÐDÐDÐDru   c                ó�   •— | j         j        D ]7}‰|         dk    sJ ‚‰|xx         dz  cc<   ‰|         dk    r ‰|¦  «         Œ8d S r  )r0  Ú
succ_nodes)r”   Ú	succ_noderD  Únode_to_indegrees     €€rs   Úupdate_indegreezCScheduler.reorder_for_minimizing_partition.<locals>.update_indegree#  su   ø€ Ø!œ]Ô5ð 4ð 4�	Ø'¨	Ô2°QÒ6Ð6Ð6Ð6Ø  Ð+Ð+Ô+¨qÑ0Ð+Ð+Ñ+Ø# IÔ.°!Ò3Ð3Ø(Ð(¨Ñ3Ô3Ð3øð	4ð 4ru   r   z’
                Failed to schedule, while loop ran too long when
                reordering for minimizing the num of partitions
                r~  )	rA  r”  rª  rÏ   r0  Ú
pred_nodesÚheappoprç   r¨  )rr   rw  rI  r”   rÌ  Ú	num_itersr?  r@  rA  rD  rH  rB  rC  s   `      @@@@@@rs   Ú reorder_for_minimizing_partitionz*Scheduler.reorder_for_minimizing_partitionþ"  s  øøøøøøø€ ð 	ˆˆˆå9=¹¼ÐØCEÐØGIÐØEÐEµI¸eÑ4DÔ4DÐEÑEÔEˆð	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð ð 	+ð 	+ˆDÝ%(¨¬Ô)AÑ%BÔ%BÐ˜TÑ"Ø Ô%¨Ò*Ð*Ø$Ð$ TÑ*Ô*Ð*øà,.ˆØˆ	Ø�#˜e™*œ*Ò$Ð$Ø#ð %Ø':ð %ð *ð &ØŸ-š-Ð(?Ñ@Ô@‘��4Ø—’ Ñ%Ô%Ð%Ø� Ñ%Ô%Ð%ð *ð &ð
 &ð &ØŸ-š-Ð(;Ñ<Ô<‘��4Ø—’ Ñ%Ô%Ð%Ø� Ñ%Ô%Ð%ð &ð &ð
 ˜‰NˆIð �#˜e™*œ*Ò$Ð$Ø#ð %Ø':ð %ð •s˜5‘z”zÒ!Ð!Ýðñô ð ð ˆru   c           	     ó~  — ddl m}m} t          t          j                             ¦   «         ¦  «        } ||| j        | j        t          t          j        j	         
                    ¦   «         ¦  «        |¦  «        \  }}|                      |¦  «        } ||||¦  «        \  }}	||t          j        j        z  k     r|S |S )zx
        Reorder nodes to minimize the number of partitions if this only slightly
        increase peak memory.
        r   )Úestimate_peak_memoryÚprepare_planning_info)rÛ  rO  rP  r   ra   rÂ   rÜ  r  rÇ  rj  r'  rM  r-   r©   Ú!cudagraph_partition_memory_budget)
rr   rw  rO  rP  rš   Údefault_peak_memoryrˆ  Úreordered_nodesÚreorder_peak_memoryr?  s
             rs   ræ  z0Scheduler.maybe_reorder_for_minimizing_partition?#  sß   € ð 	HÐGÐGÐGÐGÐGÐGÐGå"¥1¤7×#;Ò#;Ñ#=Ô#=Ñ>Ô>ˆà:OÐ:OØØÔØÔ#Ý•q”wÔ+×0Ò0Ñ2Ô2Ñ3Ô3Øñ;
ô ;
Ñ7ÐÐ7ð ×?Ò?ÀÑFÔFˆØ!5Ð!5ØÐ7¸ñ"
ô "
ÑÐ˜Qð
  Ø!¥F¤MÔ$SÑSòTð Tð #Ð"àˆru   c                ó.  — g }g }g }dd„}|D ]�}|                       |¦  «        du}|r.t          |j        ¦  «        dk    r|                     |¦  «         ŒI|r! ||¦  «        r|                     |¦  «         Œl|                     |¦  «         Œ‚||z   |z   S )	a  
        Reorder a node if it should be partitioned and has simple dependency:
        1. move a partitioned node to the front if it has no dependency
        2. move a partitioned node to the back if it is only used by OutputNode
        3. otherwise do not reorder
        r”   rf   rŠ   rv   c                ó„   — |                       ¦   «         D ]*}|j        D ] }t          |j        t          ¦  «        s  dS Œ!Œ+dS r  )rL  rç  r²   r”   r  )r”   rÕ   r  s      rs   Úonly_output_userzPScheduler.reorder_for_partition_with_simple_dependency.<locals>.only_output_usern#  s\   € Ø×'Ò'Ñ)Ô)ð %ð %�Øœ9ð %ð %�CÝ% c¤hµ
Ñ;Ô;ð %Ø$˜u˜u˜uð%ð%ð �4ru   Nr   r.  )rÝ
  rÏ   r<  rç   )rr   rw  ÚfrontÚmiddleÚbackrW  r”   rÝ
  s           rs   rç  z6Scheduler.reorder_for_partition_with_simple_dependency`#  s×   € ð *,ˆØ*,ˆØ(*ˆð	ð 	ð 	ð 	ð ð 	$ð 	$ˆDØ#×4Ò4°TÑ:Ô:À$ÐFÐØð $¥C¨Ô(?Ñ$@Ô$@ÀAÒ$EÐ$EØ—’˜TÑ"Ô"Ð"Ð"Ø!ð $Ð&6Ð&6°tÑ&<Ô&<ð $Ø—’˜DÑ!Ô!Ð!Ð!à—’˜dÑ#Ô#Ð#Ð#à�v‰~ Ñ$Ð$ru   ú9tuple[list[PartitionType], list[GraphPartitionSignature]]c                óÎ  — g }d}g }g }| j         D ]d}|                      |¦  «        du}|r2||k    r,|                     |¦  «         |                     |¦  «         g }|}|                     |¦  «         Œe|r*|                     |¦  «         |                     |¦  «         t          j        j        }|dk    rit          t          ||¦  «        ¦  «        D ]K\  }\  }	}
|
sAt          d„ |	D ¦   «         ¦  «        }||k     r"d||<   t           
                    d|||¦  «         ŒL|                      ||¬¦  «        }|                      |¦  «         |                      ||¦  «         ||fS )z’
        Given a list of BaseSchedulerNodes, split into a list of
        graph partitions and compute partition input/output signatures.
        TNr   c              3  óD   K  — | ]}t          |t          ¦  «        °d V — ŒdS ©r   N)r²   r  rÛ  s     rs   r¹   z,Scheduler.graph_partition.<locals>.<genexpr> #  sG   è è € ð 'ð 'àÝ)¨!Õ-CÑDÔDð'Øð'ð 'ð 'ð 'ð 'ð 'ru   zFPartition %d has %d kernels, below minimum size %d, skipping cudagraph)r  r  )rw  rÝ
  rç   r-   r©   Úcudagraph_min_partition_sizerª  r•  rÿ   Úcudagraphs_logró  r3  r  Ú_log_graph_partitions)rr   r  rù
  Úcur_partitionr  r”   Únode_should_partitionÚmin_sizer¨  r  ÚskipÚkernel_countrò
  s                rs   rä  zScheduler.graph_partition€#  sÕ  € ð +-ˆ
ØˆØ')ˆØˆØ”Jð 	'ð 	'ˆDØ$(×$9Ò$9¸$Ñ$?Ô$?ÀtÐ$KÐ!Øð # Ð3HÒ!HÐ!HØ×!Ò! -Ñ0Ô0Ð0Ø×&Ò& ~Ñ6Ô6Ð6Ø "�à2ˆNØ× Ò  Ñ&Ô&Ð&Ð&àð 	3Ø×Ò˜mÑ,Ô,Ð,Ø×"Ò" >Ñ2Ô2Ð2õ ”=Ô=ˆØ�aŠ<ˆ<Ý(1µ#°jÀ/Ñ2RÔ2RÑ(SÔ(Sð ð Ñ$�Ñ$�I˜tØð å#&ð 'ð 'à!*ð'ñ 'ô 'ñ $ô $�Lð
 $ hÒ.Ð.Ø-1˜¨Ñ*Ý&×,Ò,ØdØØ(Ø$ñ	ô ð øð ×7Ò7Ø!°?ð 8ñ 
ô 
ˆ
ð 	×)Ò)¨*Ñ5Ô5Ð5à×"Ò" :¨zÑ:Ô:Ð:à˜:Ð%Ð%ru   c                ó”  — t                                t          j        ¦  «        sd S t	          d„ t
          j        j        D ¦   «         ¦  «        }|sd S t          d„ |D ¦   «         ¦  «        }t          |¦  «        |z
  }t            
                    dt          |¦  «        ||¦  «         t          t          ||¦  «        ¦  «        D ]‚\  }\  }}t            
                    d|t          |¦  «        |j        rdndt          |j        ¦  «        t          |j        ¦  «        ¦  «         |j        r|D ]}	|                      |	¦  «         ŒŒƒd S )Nc              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   )r[   )r·   rì  s     rs   r¹   z2Scheduler._log_graph_partitions.<locals>.<genexpr>Á#  s(   è è € ÐOÐO°�V F™^œ^ÐOÐOÐOÐOÐOÐOru   c              3  ó(   K  — | ]}|j         °	d V — ŒdS r^  )rù
  rC  s     rs   r¹   z2Scheduler._log_graph_partitions.<locals>.<genexpr>Å#  s*   è è € Ð!PÐ!P¨¸qÔ?OÐ!P !Ð!PÐ!PÐ!PÐ!PÐ!PÐ!Pru   zCCreated %d graph partitions: %d cudagraphable, %d non-cudagraphablez3  Partition %d: %d nodes, %s, inputs=%d, outputs=%dznon-cudagraphableÚcudagraphable)r`  r  r  r*  r  ra   rÂ   Údevice_typesrÿ   rÏ   ró  rª  r•  rù
  rú
  rû
  Ú_log_non_cudagraphable_node)
rr   r  rò
  Úhas_gpu_deviceÚcudagraphable_countÚnon_cudagraphable_countr¨  r  r   r”   s
             rs   ra  zScheduler._log_graph_partitions·#  si  € õ
 ×*Ò*­7¬=Ñ9Ô9ð 	ØˆFõ ÐOÐO½!¼'Ô:NÐOÑOÔOÑOÔOˆØð 	ØˆFå!Ð!PÐ!P¨ZÐ!PÑ!PÔ!PÑPÔPÐÝ"% j¡/¤/Ð4GÑ"GÐÝ×ÒØQÝ�
‰OŒOØØ#ñ		
ô 	
ð 	
õ *3µ3°zÀ:Ñ3NÔ3NÑ)OÔ)Oð 	;ð 	;Ñ%ˆAÑ%�	˜9Ý× Ò ØEØÝ�I‘”Ø'0Ô'?ÐTÐ#Ð#À_Ý�IÔ)Ñ*Ô*Ý�IÔ*Ñ+Ô+ñô ð ð Ô'ð ;à%ð ;ð ;�DØ×4Ò4°TÑ:Ô:Ð:Ð:øð	;ð 	;ru   c                óÒ  — |                       |¦  «        }|sdS |                     ¦   «         }|j        �|j                             ¦   «         nd}d|› �g}t	          |j        ¦  «        j        }|                     d|› �¦  «         |�G|j        › dd                     d„ |j	        D ¦   «         ¦  «        › d�}|                     d|› �¦  «         t                               d	|d                     |¦  «        ¦  «         |�b|j                             d
d¦  «        }|rG|                     ¦   «                              d¦  «        D ]!}	t                               d|	¦  «         ŒdS dS dS )z)Log details for a non-cudagraphable node.Nzreason=zir=rU  rm  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   )rÖ   )r·   rÈ  s     rs   r¹   z8Scheduler._log_non_cudagraphable_node.<locals>.<genexpr>ç#  s(   è è € Ð2PÐ2P¸aµ3°q±6´6Ð2PÐ2PÐ2PÐ2PÐ2PÐ2Pru   rP  zfx=z
    %s: %sr'  rX  z         %s)rÝ
  rê  r”   rr  r«   r€   rç   r/  r  r  r`  ró  r0  r¾  ÚstripÚsplit)
rr   r”   rí  rp  ru  ÚpartsÚir_typeÚfx_strr'  Úlines
             rs   rl  z%Scheduler._log_non_cudagraphable_nodeÛ#  s‚  € à×&Ò& tÑ,Ô,ˆØð 	ØˆFà—M’M‘O”Oˆ	Ø15´Ð1F�$”)×+Ò+Ñ-Ô-Ð-ÈDˆØ#˜6Ð#Ð#Ð$ˆÝ�t”y‘/”/Ô*ˆØ�Š�_˜7�_�_Ñ%Ô%Ð%ØÐØœÐSÐS¨¯ªÐ2PÐ2PÀ7Ä<Ð2PÑ2PÔ2PÑ)PÔ)PÐSÐSÐSˆFØ�LŠL˜˜v˜˜Ñ(Ô(Ð(å×Ò˜\¨9°d·i²iÀÑ6FÔ6FÑGÔGÐGð ÐØ!œ,×*Ò*¨=¸$Ñ?Ô?ˆKØð >Ø'×-Ò-Ñ/Ô/×5Ò5°dÑ;Ô;ð >ð >�DÝ"×(Ò(¨¸Ñ=Ô=Ð=Ð=ð	 Ðð>ð >ð>ð >ru   c                óÞ   — t          d¦  «        5  t          j        j        j        r|                      ¦   «         n|                      | j        ¦  «        	 cd d d ¦  «         S # 1 swxY w Y   d S )NzScheduler.codegen)r   rp  rq  r-   rä  Ú_codegen_partitionsÚ_codegenrw  rq   s    rs   r  zScheduler.codegenó#  s®   € ÝÐ-Ñ.Ô.ð 	ð 	õ ”?Ô)Ô9ð/�×(Ò(Ñ*Ô*Ð*à—]’] 4¤:Ñ.Ô.ðð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   �AA"Á"A&Á)A&c                ó  — ddl m} t          j        j        }t          | j        ¦  «        }t          j                             ¦   «         5  t          j                             dd|› �||¬¦  «         t          j        j	         
                    ¦   «         }|                      |¦  «         t          t          j        j        |¦  «        sJ ‚t          j        j	        |z
  }|                      ||¦  «        }|t          j        j        _        t          j        j                             ¦   «          t          j        j        }t          j        j                             t          j        j        ¦  «        \  }	}
ddd¦  «         n# 1 swxY w Y   t          j        j                             ||	¦  «         t          j        j                             ||¦  «         t          j        j        j                             d„ |j        D ¦   «         ¦  «         dS )z,Codegen a partition given its inputs/outputsr   )ÚSubgraphPythonWrapperCodegenTÚ
partition_)Úis_subgraphÚsubgraph_nameÚparent_wrapper_codeÚpartition_signaturesNc                ó6   — g | ]}|                      ¦   «         ‘ŒS r…   rI  rÒ  s     rs   r   z8Scheduler._codegen_partition_wrapper.<locals>.<listcomp>+$  s    € Ð@Ð@Ð@ ˆT�]Š]‰_Œ_Ð@Ð@Ð@ru   )r  r|  ra   rÂ   r  r©  r·  Úset_current_wrapper_codeÚinit_wrapper_coder  r¿  rz  r²   r:  r�  Úwrite_prefixrÚ   ÚgenerateÚis_inferenceÚdefine_subgraph_launcher_fnÚcodegen_partition_callÚ	allocatedrþ  rû
  )rr   r  r   r|  r€  Úgraph_partition_idÚremoved_buffers_before_codegenÚremoved_buffers_during_codegenÚ
graph_nameÚpartition_coder?  s              rs   Ú_codegen_partition_wrapperz$Scheduler._codegen_partition_wrapperû#  s$  € ð 	BÐAÐAÐAÐAÐAåœgÔ2ÐÝ! $Ô"?Ñ@Ô@ÐåŒW×-Ò-Ñ/Ô/ð 	Tð 	TÝŒG×%Ò%Ø Ø?Ð+=Ð?Ð?Ø$7Ø%.ð	 &ñ ô ð õ ./¬WÔ-D×-IÒ-IÑ-KÔ-KÐ*Ø�MŠM˜)Ñ$Ô$Ð$õ �aœgÔ2Ð4PÑQÔQÐQÐQÐQå”Ô'Ð*HÑHð +ð ×KÒKØÐ9ñô ˆIð 9B�AŒGÔ Ô5ÝŒGÔ ×-Ò-Ñ/Ô/Ð/åœœˆJÝ !¤Ô 4× =Ò =½a¼gÔ>RÑ SÔ SÑˆN˜Að?	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tøøøð 	Tð 	Tð 	Tð 	TõB 	
ŒÔ×8Ò8¸À^ÑTÔTÐTå	ŒÔ×3Ò3Ð4FÈ	ÑRÔRÐRÝ	ŒÔÔ&×-Ò-Ø@Ð@¨Ô)?Ð@Ñ@Ô@ñ	
ô 	
ð 	
ð 	
ð 	
s   Á
D*F Æ FÆFú'contextlib.AbstractContextManager[None]c                óP   ‡ ‡‡— t           j        dˆˆ ˆfd„¦   «         } |¦   «         S )NrŠ   úIterator[None]c               3  ó<  •K  — ‰                      ‰ ‰¦  «         ‰j        r]t          ‰j        j        ¦  «        rD‰j        j        €
J d¦   «         ‚t
          j        j                             ‰j        j        ¦  «         	 d V — ‰j        r<t          ‰j        j        ¦  «        r#t
          j        j         	                    ¦   «          d ‰_        d S # ‰j        r<t          ‰j        j        ¦  «        r#t
          j        j         	                    ¦   «          d ‰_        w xY w)Núdevice should have an index)
Ú%update_graph_partition_default_devicer½  rQ   r«   rÛ   ra   rÂ   r  Úcodegen_device_guard_enterÚcodegen_device_guard_exit)r  rr   rò
  s   €€€rs   Úctxz1Scheduler.use_default_device_context.<locals>.ctx1$  s@  øè è € à×6Ò6°zÀ:ÑNÔNÐNØÔ*ð Õ/@ØÔ+Ô0ñ0ô 0ð ð Ô2Ô8ÐDÐDØ1ñ EÔDÐDõ ”Ô$×?Ò?ØÔ/Ô5ñô ð ð3Ø���àÔ.ð EÕ3DØÔ/Ô4ñ4ô 4ð Eõ ”GÔ(×BÒBÑDÔDÐDØ.2�Ô+Ð+Ð+øð	 Ô.ð EÕ3DØÔ/Ô4ñ4ô 4ð Eõ ”GÔ(×BÒBÑDÔDÐDØ.2�Ô+Ð2Ð2Ð2Ð2s   Á?C ÃAD)rŠ   r“  )Ú
contextlibÚcontextmanager)rr   r  rò
  r™  s   ``` rs   Úuse_default_device_contextz$Scheduler.use_default_device_context.$  sJ   øøø€ õ 
Ô	"ð	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ñ 
#Ô	"ð	3ð* ˆs‰uŒuˆru   c                ó   — t          |¦  «        dk    r|d         j        sd S dd„}dd
„}d }t          ||¦  «        D ]\  }}|j        s ||¦  «        } nŒ|€d S t          ||¦  «        D ]\  }}|j        r |||¦  «        s d S Œ|| _        d S )Nr   r   r  rg   rŠ   r  c                óB   — | d                               ¦   «         }|€J ‚|S rì   rý  )r  Úpartition_devices     rs   Úget_cudagraph_partition_devicezWScheduler.update_graph_partition_default_device.<locals>.get_cudagraph_partition_deviceX$  s*   € Ø(¨œ|×6Ò6Ñ8Ô8ÐØ#Ð/Ð/Ð/Ø#Ð#ru   Útarget_devicerv   c                óJ   — | D ]}|                      ¦   «         }||k    r dS Œ dS r  rý  )r  r¡  r”   rì  s       rs   Úall_on_target_devicezMScheduler.update_graph_partition_default_device.<locals>.all_on_target_device]$  s>   € ð "ð !ð !�ØŸšÑ*Ô*�Ø˜]Ò*Ð*Ø ˜5˜5ð +à�4ru   )r  rg   rŠ   r  )r  rg   r¡  r  rŠ   rv   )rÏ   rù
  r•  r½  )rr   r  rò
  r   r£  Úcudagraph_partition_devicer  r   s           rs   r–  z/Scheduler.update_graph_partition_default_deviceI$  s  € õ ˆz‰?Œ?˜aÒÐ¨
°1¬Ô(DÐð ˆFð	$ð 	$ð 	$ð 	$ð
	ð 	ð 	ð 	ð &*Ð"Ý$'¨
°JÑ$?Ô$?ð 	ð 	Ñ ˆI�yØÔ+ð Ø-KÐ-KÈIÑ-VÔ-VÐ*Ø�ðð
 &Ð-ØˆFå$'¨
°JÑ$?Ô$?ð 	ð 	Ñ ˆI�yØÔ'ð Ð0DÐ0DØÐ5ñ1ô 1ð ð ��øà&@ˆÔ#Ð#Ð#ru   c                ó6  — |                       ¦   «         \  }}t          |¦  «        dk    r(t          d         dxx         t          |¦  «        z  cc<   |                      ||¦  «        5  t	          ||¦  «        D ]e\  }}t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚|j        r|                      |¦  «         ŒO|                      ||¦  «         Œf	 ddd¦  «         n# 1 swxY w Y   t          | j	        ¦  «        }t          j        j                             |¦  «         |dk    rat          j        j        €J ‚|t          t          j        j        ¦  «        k    s.J d|› dt          t          j        j        ¦  «        › �¦   «         ‚dS dS )	zÊ
        Split nodes into partitions and codegen each partition into separate functions.
        This allows further applying different optimizations (e.g., cudagraph) to
        each function.
        r   rp  Úcudagraph_partitionsz5Each partition must have at least one node but found Nr   zExpect z partition maps but got )rä  rÏ   r   rœ  r•  rù
  rz  r�  r©  r·  ra   rÂ   r  Úset_all_partition_namesrø
  )rr   r  rò
  r  r   Únum_partitionss         rs   ry  zScheduler._codegen_partitionsx$  s   € ð "&×!5Ò!5Ñ!7Ô!7Ñˆ
�Jåˆz‰?Œ?˜QÒÐÝ�ZÔ Ð!7Ð8Ð8Ô8½CÀ
¹O¼OÑKÐ8Ð8Ñ8à×,Ò,¨Z¸ÑDÔDð 		Jð 		JÝ(+¨J¸
Ñ(CÔ(Cð Jð JÑ$�	˜9Ý˜9‘~”~¨Ò*Ð*Ð*Ø\ÍCÐPYÉNÌNÐ\Ð\ñ +Ô*Ð*ð Ô+ð JØ—M’M )Ñ,Ô,Ð,Ð,à×3Ò3°I¸yÑIÔIÐIÐIðJð		Jð 		Jð 		Jñ 		Jô 		Jð 		Jð 		Jð 		Jð 		Jð 		Jð 		Jøøøð 		Jð 		Jð 		Jð 		Jõ ˜dÔ;Ñ<Ô<ˆÝ	ŒÔ×4Ò4°^ÑDÔDÐDð ˜AÒÐÝ”7Ô)Ð5Ð5Ð5Ø!¥S­¬Ô)?Ñ%@Ô%@Ò@Ð@Ð@Ø_˜.Ð_Ð_Å#ÅaÄgÔF\ÑB]ÔB]Ð_Ð_ñ AÔ@Ð@ð Ðà@Ð@s   Á)A7C-Ã-C1Ã4C1c                ó  — t           j        r dd l}t          j        ¦   «         }t          ¦   «         }t          |¦  «        D ]k}|j        dk    r|j        |j	        j
        j        k    r nC|j        |j        f}||vsJ d|j        › d|j        › d�¦   «         ‚|                     |¦  «         Œl| j        | _        | j        �J ‚| j        r4t           j        j        r#t&          j        j                             ¦   «          t&          j        j                             ¦   «          |D �]n}t0                               t4          j        ¦  «        r	 t0                               d|                     ¦   «         |                     ¦   «         ¦  «         n=# t>          $ r0 t0                               d|                     ¦   «         ¦  «         Y nw xY w|                       |¦  «         t           j!        r8t&          j        j         "                    d„ |j#        j$        D ¦   «         ¦  «         | %                    ¦   «         x}�r_|| j        k    s(| &                    ¦   «         s| '                    ¦   «         r|  (                    ¦   «          || j        k    �r| j        rWtS          | j        j*        ¦  «        r>| j+        �|  ,                    ¦   «          t&          j        j         -                    ¦   «          || _        tS          |j*        ¦  «        r“|j.        €
J d	¦   «         ‚d
}	|  /                    ¦   «         r<t          | j0         1                    ¦   «         ¦  «        }
|
rte          |
¦  «        d
z   nd
}	t&          j        j         3                    |j.        |	| j4        ¦  «         |  /                    ¦   «         r| j        �|  5                    |¦  «         t&          j        j         6                    d„ |j#        j$        D ¦   «         ¦  «         || _7        | j8         9                    |j:        ¦  «         | '                    ¦   «         rd| ;                    ty          | =                    ¦   «         ¦  «        ¦  «        \  }}}|  >                    |¦  «         ?                    |||¦  «         �n·| &                    ¦   «         r|  @                    |¦  «         �nŒ| A                    ¦   «         rŒt…          jC        tˆ          |¦  «        }|  >                    |¦  «        }d
dlEmF} d
dlGmH} d
dlImJ} t—          ||||f¦  «        r|}nt™          dtU          | ¦  «        ›�¦  «        ‚| M                    |¦  «         nìt—          |tœ          ¦  «        r)|  >                    |¦  «         O                    |¦  «         n®t—          |t           ¦  «        r)|  >                    |¦  «         Q                    |¦  «         npt—          |t¤          t¦          f¦  «        r)|  >                    |¦  «         T                    |¦  «         n+t—          |tª          ¦  «        sJ ‚| V                    ¦   «          t           j        jW        r'|  >                    |¦  «         X                    ¦   «          | jY         9                    | Z                    ¦   «         ¦  «         | j[         9                    | \                    ¦   «         ¦  «         t—          |tª          ¦  «        s\| %                    ¦   «         }|�F|j*        dk    r;|  >                    |¦  «         ]                    ¦   «         r|  (                    ¦   «          t½          d„ | =                    ¦   «         D ¦   «         ¦  «        r	|| _        �Œgd | _        �Œp| j        | j        k    rE| j        €J ‚tS          | j        j*        ¦  «        r#t&          j        j         -                    ¦   «          d | _        |  (                    ¦   «          d S )Nr   Ú_compile_innerzDuplicate stack frame ú:zs; did you add a decorator to one of the functions in this stack trace?  If so, try using a context manager instead.z5Generating code for node %s with estimated runtime %fz6Generating code for node %s with estimated runtime 0.0c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   z%Scheduler._codegen.<locals>.<genexpr>Ê$  s=   è è € ð Dð DØ!$�C”HðDð Dð Dð Dð Dð Dru   r•  r   c              3  ó$   K  — | ]}|j         V — Œd S r   r†  r‡  s     rs   r¹   z%Scheduler._codegen.<locals>.<genexpr>û$  s=   è è € ð Cð CØ �”ðCð Cð Cð Cð Cð Cru   )ÚCUDACombinedSchedulingr‘  )ÚXPUCombinedSchedulingztype(self)=r0  c              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   r±	  rÛ  s     rs   r¹   z%Scheduler._codegen.<locals>.<genexpr>:%  s,   è è € ÐJÐJ°A•:˜a¥Ñ/Ô/ÐJÐJÐJÐJÐJÐJru   )_r-   Ú"check_stack_no_cycles_TESTING_ONLYÚtorch._dynamo.convert_frameÚ	tracebackÚextract_stackr   rÑ   rÚ   ÚfilenameÚ_dynamoÚconvert_frameÚ__file__Úlinenor³  r½  r  rº  r©   Úautotune_at_compile_timera   rÂ   r  Úwrite_get_raw_stream_headerÚregister_alignment_check_inputsrd  r  r  r*  ró  rê  r|  rc  rÕ
  Úsize_assertsÚcodegen_deferred_input_assertsrØ   rÙ   rª   rø  rö  r½
  rQ   r«   Úcurrent_stream_idxÚgenerate_stream_ctx_exitr˜  rÛ   r	  r®  rà   r`  r—  rÏ  Úgenerate_stream_ctx_switchingÚ!codegen_deferred_alignment_copiesr»  rî  rþ  r+  r¯  r¥   r»   r<  Úcodegen_templaterÃ
  rú  rÇ  rÈ  re  Ú codegen.cuda_combined_schedulingr®  r‰  r’  Ú#codegen.xpu.xpu_combined_schedulingr¯  r²   rŠ  Úcodegen_combo_kernelrA  Úcodegen_nested_reductionr"  Úcodegen_mix_order_reductionrÝ   r³   Úcodegen_noder  r§  Údebug_sync_kernelÚcodegen_syncr¹  rÖ  r  r  Úready_to_flushrº   )rr   rw  rp  r	  r„  Úframerû  r”   rì  Únum_streamsÚunique_streamsr¬  r­  r®  Úbackend_r®  r’  r¯  r<  s                      rs   rz  zScheduler._codegen˜$  s#  € ÝÔ4ð 	Ø.Ð.Ð.Ð.åÔ+Ñ-Ô-ˆEÝ7A±|´|ˆDÝ! %™œð ð �ð ”JÐ"2Ò2Ð2Øœ¨%¬-Ô*EÔ*NÒNÐNà�EØ”~ u¤|Ð4�Ø $���ðJ¨U¬^ð Jð J¸e¼lð Jð Jð Jñ '”�ð
 —’˜‘”��à"Ô9ˆÔØÔ!Ð)Ð)Ð)ð Ô&ð 	?­6¬=Ô+Qð 	?ÝŒGÔ ×<Ò<Ñ>Ô>Ð>õ 	
ŒÔ×<Ò<Ñ>Ô>Ð>àð E	*ñ E	*ˆDÝ×Ò¥¤Ñ.Ô.ð ð
Ý—I’IØOØŸš™œØ×2Ò2Ñ4Ô4ñô ð ð øõ
 !ð ð ð Ý—I’IØPØŸš™œñô ð ð ð ðøøøð ×Ò˜tÑ$Ô$Ð$õ Ô"ð Ý”Ô$×CÒCð Dð DØ(,Ô(8Ô(>ðDñ Dô Dñ ô ð ð ŸšÑ*Ô*Ð*ˆvñ à˜dÔ1Ò1Ð1Ø—~’~Ñ'Ô'ð 2à×'Ò'Ñ)Ô)ð 2ð —J’J‘L”L�LØ˜TÔ0Ò0Ñ0ØÔ*ð IÕ/@ØÔ+Ô0ñ0ô 0ð Ið  Ô2Ð>Ø ×9Ò9Ñ;Ô;Ð;ÝœÔ,×FÒFÑHÔHÐHØ*0�DÔ'Ý(¨¬Ñ5Ô5ð Ø%œ|Ð7Ð7Ð9VÑ7Ô7Ð7à&'˜Ø×7Ò7Ñ9Ô9ð å-7¸Ô8K×8RÒ8RÑ8TÔ8TÑ-UÔ-U˜Nà;IÐ P¥ NÑ 3Ô 3°aÑ 7Ð 7Èqð (õ œÔ,×GÒGØ"œLØ'Ø Ô;ñô ð ð ×+Ò+Ñ-Ô-ð 9°$Ô2EÐ2QØ×2Ò2°4Ñ8Ô8Ð8õ ŒGÔ ×BÒBð Cð CØ$(Ô$4Ô$:ðCñ Cô Cñ ô ð ð !%ˆDÔØÔ%×,Ò,¨T¬_Ñ=Ô=Ð=à×ÒÑ!Ô!ð % Ø48×4WÒ4WÝ˜ŸšÑ)Ô)Ñ*Ô*ñ5ô 5Ñ1�˜-¨ð × Ò  Ñ(Ô(×9Ò9Ø! 8¨Xñô ð ñ ð —’Ñ!Ô!ð  Ø×(Ò(¨Ñ.Ô.Ð.Ñ.Ø—’Ñ"Ô"ð  Ý”{Õ#=¸tÑDÔD�à×+Ò+¨FÑ3Ô3�ØTÐTÐTÐTÐTÐTØ8Ð8Ð8Ð8Ð8Ð8ØVÐVÐVÐVÐVÐVåØØ#Ð%;Ð=RÐSñô ð ;ð '�G�Gå(Ð)9­D°©J¬JÐ)9Ð)9Ñ:Ô:Ð:Ø×,Ò,¨TÑ2Ô2Ð2Ð2Ý˜DÕ"7Ñ8Ô8ð  à× Ò  Ñ(Ô(×AÒAÀ$ÑGÔGÐGÐGÝ˜DÕ"9Ñ:Ô:ð  à× Ò  Ñ(Ô(×DÒDÀTÑJÔJÐJÐJÝ˜DÕ#5µ}Ð"EÑFÔFð  à× Ò  Ñ(Ô(×5Ò5°dÑ;Ô;Ð;Ð;å! $Õ(>Ñ?Ô?Ð?Ð?Ð?Ø—’‘”�õ Œ}Ô.ð 8à× Ò  Ñ(Ô(×5Ò5Ñ7Ô7Ð7àÔ'×.Ò.¨t×/DÒ/DÑ/FÔ/FÑGÔGÐGØÔ%×,Ò,¨T×-EÒ-EÑ-GÔ-GÑHÔHÐHå˜dÕ$:Ñ;Ô;ð !ØŸšÑ*Ô*�àÐ&Øœ vÒ-Ð-Ø×(Ò(¨Ñ0Ô0×?Ò?ÑAÔAð .ð —J’J‘L”L�LåÐJÐJ¸¿ºÑ9IÔ9IÐJÑJÔJÑJÔJð *Ø%)�Ô"Ñ"à%)�Ô"Ñ"àÔ $Ô"=Ò=Ð=ð Ô&Ð2Ð2Ð2Ý  Ô!4Ô!9Ñ:Ô:ð Aõ ”Ô$×>Ò>Ñ@Ô@Ð@à!ˆÔØ�
Š
‰Œˆˆˆs   Å
A FÆ7GÇGú%tuple[float, float, list[str | None]]c                óÄ   — |d                               ¦   «         }| t          j        _        || _        |€J ‚|                      |¦  «        }|                     ||¦  «        S )rÐ  r   )rª   ra   rÂ   rä  r  r<  Úbenchmark_combo_kernel)rr   r  Únode_benchmark_resultsrì  r<  s        rs   rÓ  z Scheduler.benchmark_combo_kernelL%  sa   € ð ˜1”×(Ò(Ñ*Ô*ˆØ �ŒÔØ$ˆÔØÐ!Ð!Ð!Ø×"Ò" 6Ñ*Ô*ˆØ×-Ò-¨iÐ9OÑPÔPÐPru   c                ó¼  ‡— |}|d                               ¦   «         Št          ˆfd„|D ¦   «         ¦  «        s
J d¦   «         ‚t          j        sdS ddlm} dg }}i }t          |¦  «        D ]õ\  }}|                     ¦   «         }	|                      |	¦  «        rt           
                    d¦  «         	 |                      |	¦  «        \  }
}|
|f||<   t          j        |
¦  «        rt           
                    d|¦  «          d	S n@# |$ r8}d
t          |¦  «        v r!t           
                    d¦  «         Y d}~ dS ‚ d}~ww xY w||
z  }|                     |¦  «         Œö	 |                      ||¦  «        \  }}}n?# |$ r7}d
t          |¦  «        v r t           
                    d¦  «         Y d}~dS ‚ d}~ww xY w||z
  dk     p|dk     }t                               t"          j        ¦  «        rc||k    s|r.t           
                    dt'          ||z  d›¦  «        ¦  «         n-t           
                    dt)          ||z  d›¦  «        ¦  «         ||z
  |k     p|S )r#  r   c              3  óH   •K  — | ]}|                      ¦   «         ‰k    V — Œd S r   rý  )r·   r”   rì  s     €rs   r¹   z4Scheduler.speedup_by_combo_kernel.<locals>.<genexpr>c%  s2   øè è € ÐKÐK°4�4—?’?Ñ$Ô$¨Ò.ÐKÐKÐKÐKÐKÐKru   z<All nodes in a combo kernel group must be on the same deviceTr%  r»  z<ComboKernel: benchmarking may not accurate due to atomic_addz;ComboKernel benchmark: register spilling of %d-th subkernelFre  zCComboKernel benchmark: return True because of loop-carried variableNg333333Ó?z/can fuse (benchmark): fusing causes %sx speedupr)  z3cannot fuse (benchmark): fusing causes %sx slowdown)rª   rº   r-   rÓ  rl  r&  rª  r»   r  rò  ró  rÑ  r  rg  rÖ   rç   r  r  r*  rJ   rL   )rr   rw  Úsubkernel_nodesr&  r)  Ú
path1_listrÔ  r¨  r¿  r  rŽ  rL  r  r*  Ú	ms2_cloneÚ_path2_listÚsmall_kernelrì  s                    @rs   rË  z!Scheduler.speedup_by_combo_kernelZ%  s  ø€ ð  ˆØ  Ô#×.Ò.Ñ0Ô0ˆåÐKÐKÐKÐK¸?ÐKÑKÔKÑKÔKð 	
ð 	
ØJñ	
ô 	
ÐKõ Ô,ð 	Ø�4à;Ð;Ð;Ð;Ð;Ð;à˜rˆZˆØ!#ÐÝ! /Ñ2Ô2ð 	$ð 	$‰HˆAˆuØŸšÑ)Ô)ˆIð ×#Ò# IÑ.Ô.ð Ý× Ò ØRñô ð ðØ×5Ò5°iÑ@Ô@‘��DØ13°T°
Ð& uÑ-Ý”:˜b‘>”>ð !Ý×$Ò$ØUØñô ð ð !˜5˜5ð!øð $ð ð ð à*­c°!©f¬fÐ4Ð4Ý×$Ò$Ø]ñô ð ð  ˜4˜4˜4˜4˜4˜4àøøøøðøøøð �2‰IˆCØ×Ò˜dÑ#Ô#Ð#Ð#ð	Ø*.×*EÒ*EØÐ!7ñ+ô +Ñ'ˆC�˜K˜Køð  ð 	ð 	ð 	à&­#¨a©&¬&Ð0Ð0Ý× Ò ØYñô ð ð �t�t�t�t�tàøøøøð	øøøð ˜Y‘¨Ò,Ð9°°c²	ˆÝ×"Ò"¥7¤=Ñ1Ô1ð 
	Ø�SŠyˆy˜LˆyÝ× Ò ØEÝ #¨¡)Ð1Ð1Ñ2Ô2ñô ð ð õ
 × Ò ØIÝ  c¡	Ð/Ð/Ñ0Ô0ñô ð ð
 �Y‰ Ò$Ð4¨Ð4s=   Â5ADÄEÄ+D?Ä>D?Ä?EÅ#E> Å>F:Æ+F5Æ4F5Æ5F:ú	ir.Layoutc                ó`   — | j         |         }|j        €J ‚|j                             ¦   «         S r   )r  r”   Ú
get_layout)rr   rä  rÕ   s      rs   Úget_buffer_layoutzScheduler.get_buffer_layoutª%  s1   € ØÔ˜xÔ(ˆØŒxÐ#Ð#Ð#ØŒx×"Ò"Ñ$Ô$Ð$ru   c                ó   — | j         D ]Å}|                     ¦   «         r¯|j        j        D ]¢}t          j        j                             |j        ¦  «        }|rut          |¦  «        dk    rbt          |j        t          t          f¦  «        sA|                     ¦   «         g k    r)t          j        j                             |j        ¦  «         Œ£ŒÆd S ré  )rw  r[   rØ   rÙ   ra   rÂ   r´  r¾  rÚ   r@   r²   rõ  rD   rC   rs  Úzero_dim_cpu_tensor_listr³  )rr   r”   r  r"  s       rs   r¼  z$Scheduler.update_zero_dim_cpu_tensor¯%  sÒ   € Ø”Jð 	Hð 	HˆDØ�{Š{‰}Œ}ð HØ Ô,Ô2ð 
Hð 
H�DÝœWÔ3×7Ò7¸¼	ÑBÔB�FàðHå+¨FÑ3Ô3°uÒ<Ð<Ý *Ø"œM­JÕ8IÐ+Jñ!ô !ð =ð #ŸOšOÑ-Ô-°Ò3Ð3åœÔ8×<Ò<¸T¼YÑGÔGÐGøøð	Hð 	Hru   c                ó,   — | j         �| j         j        S dS )z:CUDA Stream index that current scheduler node assigned to.N)rð  r   rq   s    rs   r¿  zScheduler.current_stream_idx¾%  s   € ð Ô#Ð/ØÔ+Ô6Ð6à�4ru   c                ó6   — | j         x}�t          |¦  «        S dS )z9CUDA Stream name that current scheduler node assigned to.N)r¿  r%   )rr   r   s     rs   Úcurrent_stream_namezScheduler.current_stream_nameÆ%  s%   € ð Ô1Ð1ˆJÐ>Ý" :Ñ.Ô.Ð.à�4ru   c                ó¢   — t          |t          ¦  «        rJ ‚| j        |         }t          j        j                             |¬¦  «        | _        dS )z6Code-gen to enter the Stream context assigned to node.)r   N)r²   r  r®  ra   rÂ   r  Úcodegen_cuda_stream_enterrð  )rr   r”   Únode_streams      rs   Úgenerate_stream_ctx_enterz#Scheduler.generate_stream_ctx_enterÎ%  sR   € å˜dÕ$:Ñ;Ô;Ð;Ð;Ð;ØÔ)¨$Ô/ˆÝ#$¤7Ô#7×#QÒ#QØ"ð $Rñ $
ô $
ˆÔ Ð Ð ru   c                ól   — | j         €J ‚t          j        j                             ¦   «          d| _         dS )z1Code-gen to exit from the current Stream context.N)rð  ra   rÂ   r  Úcodegen_cuda_stream_exitrq   s    rs   rÀ  z"Scheduler.generate_stream_ctx_exitÖ%  s6   € àÔ'Ð3Ð3Ð3Ý	ŒÔ×5Ò5Ñ7Ô7Ð7Ø#'ˆÔ Ð Ð ru   c                ó&  — || j         v sJ ‚t          |t          ¦  «        rdn| j         |         }| j        |k    rdS | j        �|€dS | j        €|�|                      |¦  «         dS |                      ¦   «          |                      |¦  «         dS )am  Generate stream entering and exiting to properly run node in a multi-stream scenario.

        Stream context switching is only generated if ``node``'s assigned stream is different from
        the previous node's stream. NopKernelSchedulerNodes have stream=None and inherit the
        enclosing stream context (or do nothing if no context is active yet).
        N)r®  r²   r  r¿  rè  rÀ  )rr   r”   rÂ  s      rs   rÁ  z'Scheduler.generate_stream_ctx_switchingÜ%  sÂ   € ð �tÔ*Ð*Ð*Ð*Ð*õ ˜$Õ 6Ñ7Ô7ð+ˆDˆDàÔ$ TÔ*ð 	ð
 Ô" fÒ,Ð,ð ˆFØÔ$Ð0°V°^ð ˆFØÔ$Ð,°Ð1Cà×*Ò*¨4Ñ0Ô0Ð0Ð0Ð0ð ×)Ò)Ñ+Ô+Ð+Ø×*Ò*¨4Ñ0Ô0Ð0Ð0Ð0ru   )rw  r�  rŠ   r   )rŠ   rô  r$  r%  )rä  rÖ   rŠ   r‘   )rä  rÖ   r”   rf   rŠ   rv   r'  )rì  r   rŠ   r   )r  rÖ   rŠ   r   )r”   rD  rŠ   rf   )r±  r–  rŠ   rv   rÉ  )r¿  rf   rŠ   r¢  )rŠ   r¥  ©rw  rx  rŠ   rÎ  r   ©rw  rx  rÔ  rv   rÕ  rn  rŠ   rÖ   )rÚ  r   rì  r  rŠ   rÎ  )rÞ  r  rŠ   rv   )
r  r  rÞ  r  r¨  r‘   r”   r³   rŠ   r   )r  rx  rŠ   rv   )rw  rx  rÕ  rn  rŠ   r  )rˆ   rf   r‰   rf   rŠ   rk   )r”   rf   rŠ   rf   )rˆ   rf   r‰   rf   r€  r}  rŠ   rf   )rˆ   rf   r‰   rf   rƒ  r{   r€  r}  )rˆ  r‰  r€  r}  rŠ   r   )
r’  r“  r”  r•  r–  r‰  r€  r}  rÈ  rv   )r€  r}  r”  r•  )r¤  r“  r¥  r“  )rw  r¢  rÈ  rv   rŠ   r¢  )rw  r¢  rœ   r›   r±  r‘   rŠ   r²  )rŸ  rn  rŠ   r   )rŠ   r˜   )rß  r¢  rÕ  r˜   r  rv   rŠ   rà  )rÞ  r¢  r¿  r‘   rÕ  r˜   r  rv   rÄ  r 	  rŠ   r   r	  )rw  r¢  rÈ  rv   rŠ   r“  r/  )rˆ   rf   r‰   rf   r?	  r‘   rŠ   rv   )rˆ   rf   r‰   rf   rZ	  r[	  rŠ   rÖ   r1  r.  )rÇ	  rf   r­  rf   rv  rê  rŠ   rv   )rˆ   rf   r‰   rf   rŠ   r×	  )rf  rf   rj  rf   rŠ   r™   )rˆ   rf   r‰   rf   rŠ   ró	  )
r7  rf   r4  rf   ro  rö	  rE  rv   rŠ   rv   )FT)
rˆ   rf   r‰   rf   rE  rv   r(  rv   rŠ   rv   )FTN)rˆ   rf   r‰   rf   rE  rv   r(  rv   rý	  ró	  rŠ   rv   )rˆ   rf   r‰   rf   rý	  ró	  rŠ   rv   )r;
  r;   rˆ   rf   r‰   rf   rŠ   rv   )r  r9   rV  r9   rŠ   rv   )r  r8   rV  r9   r0
  rv   rŠ   rv   )r  r8   rV  r:   rg
  r3  rŠ   rv   )rj
  r8   rk
  r8   rŠ   rv   r·  )râ   r8   r1  rv   rŠ   r‘   )TN)
rf  rf   rj  rf   r1  rv   rý	  ró	  rŠ   r‘   )
rˆ   rf   r‰   rf   r(  rv   rý	  ró	  rŠ   r‘   )...)rˆ   rf   r‰   rf   r1  rv   rt
  ru
  r(  rv   rŠ   r‘   )rˆ   rf   r‰   rf   r1  rv   rt
  rx
  r(  rv   rŠ   ry
  )TFT)rˆ   rf   r‰   rf   r1  rv   rt
  rv   r(  rv   rŠ   r{
  )r¤  r“  rŠ   r“  )rw  r‹   rŠ   r   )r¾
  rf   rŠ   r   )rì  r  rŠ   rÄ
  )rì  r   rŠ   rÄ
  r~  )rÚ   rÖ   rK	  r™   rŠ   rv   )r”   rf   rŠ   r–  )rŠ   r;  )rŠ   rî
  )rò
  ró
  rŠ   r   )r  rg   rú
  rî
  rŠ   r;  )r  r  r  r  rŠ   ró
  )r   rA   r  r™   rŠ   rA   )rŠ   r[  )r  r  rò
  ró
  rŠ   r   )r  rg   r   rA   rŠ   r   )r  r  rò
  ró
  rŠ   r‘  ©r  rx  rŠ   rÑ  )rw  r¢  rŠ   rv   )rä  rÖ   rŠ   rÜ  r¸  )rŠ   r–  )‚r€   r�   r‚   r•   rC  r�  r¾  rÐ  r	  r  r  Úpropertyr  Úsetterrí  r  r“  rÈ  rd   rë  rÃ  r˜  rÂ  rÚ  r«  r¬  rÄ  rÅ  rw  rÓ  rã  rÑ  rØ  rÝ  ré  rÒ  r   r  r!  r{  r	  r‚  r‡  r‘  rŸ  r£  r¬  rÉ  r2  r¹  rÙ  rÊ  rÿ  rÎ  rË  r¯  r†  r>	  rU	  rY	  rk	  r‘	  r—	  r”	  r–	  r	  rÖ	  rë	  rò	  rõ	  rI  r  r
  rþ	  r
  r
  rG
  r2
  rI
  rN
  r3
  r½	  r¤	  rr
  r
  r   r2  r‡
  rˆ
  r	  r	  rè  r»
  r½
  rÃ
  rÍ
  r<  rÕ
  rJ	  rÝ
  rO   ré
  rß
  rñ
  r  r  r3  r:  rM  ræ  rç  rä  ra  rl  r  r�  rœ  r–  ry  rz  rÓ  rË  rß  r¼  r¿  rä  rè  rÀ  rÁ  r(  r)  s   @rs   rã  rã  ¼  sé  ø€ € € € € ðð ñ
ð ð ð ñh9ð h9ð h9ð h9ð h9ð h9ñT	#ð 	#ð 	#ð 	#ñ6
ð 6
ð 6
ð 6
ñp(ð (ð (ð (ñSð Sð Sð Sñ
Qð Qð Qð Qð ñ&ð &ð &ñ „Xð&ð Ôñ(ð (ð (ñ Ôð(ñ7ð 7ð 7ð 7ñ#ð #ð #ð #ñ,ð ,ð ,ð ,ñ"ð "ð "ð "ñHMPð MPð MPð MPñ^Kð Kð Kð KñZ+#ð +#ð +#ð +#ñZ ð  ð  ð  ñð ð ð ñ6	ð 	ð 	ð 	ñSð Sð Sð Sñ*ð ð ð ñ4#ð #ð #ð #ñ&/ð /ð /ð /ñ<$ð $ð $ð $ñ6!ð !ð !ð !ñF	ð 	ð 	ð 	ñ8ð 8ð 8ð 8ð, %)ñ	ñ ð ð ð ñ$
>ð 
>ð 
>ð 
>ñ'ð 'ð 'ð 'ñRIDð IDð IDð IDñV'8ð '8ð '8ð '8ñR
ð 
ð 
ð 
ð OSññ ð ð ð ñ Zð Zð Zð Zñx>ð >ð >ð >ñð ð ð ñ0ð ð ð ñ"D2ð D2ð D2ð D2ñLO?ð O?ð O?ð O?ñbSð Sð Sð Sñ0$ð $ð $ð $ñ(Cð Cð Cð CðJ ñð ð ñ „\ðñ8e.ñ e.ð e.ð e.ð e.ñN(
ð (
ð (
ð (
ñTC&ð C&ð C&ð C&ñJ'$ð '$ð '$ð '$ñR?ð ?ð ?ð ?ñ6 ð 6 ð 6 ð 6 ñp,ð ,ð ,ð ,ñ\7ð 7ð 7ð 7ñr.2ð .2ð .2ð .2ñ`$ð $ð $ð $ñ6<ð <ð <ð <ñ|Mð Mð Mð Mñ^76ð 76ð 76ð 76ñr]Kð ]Kð ]Kð ]Kñ~^ð ^ð ^ð ^ñ@ð ð ð ñ ;ð ;ð ;ð ;ñz`ð `ð `ð `ñD
ð 
ð 
ð 
ñJð Jð Jð Jñ"!
ð !
ð !
ð !
ðN "Ø*.ññ ð ð ð ð4 "Ø*.ñ
ñ 
ð 
ð 
ð 
ð, "Ø*.Ø=AñuMñ uMð uMð uMð uMðx	 >BðGð Gñ Gð Gð Gð GñR3)ð 3)ð 3)ð 3)ðj ñ
ð 
ð 
ñ „\ð
ð OTð=ð =ñ =ð =ð =ð =ñ~=ð =ð =ð =ð* ñOIð OIð OIñ „\ðOIñhð ð ð ð ñ4ð 4ð 4ñ „\ð4ñ";ñ ;ð ;ð ;ð ;ð !Ø=Añ(ñ (ð (ð (ð (ð\ +/Ø=Aññ ð ð ð ð* ð
  Ø8;Ø*-ññ ð ð ñ „Xðð ð
  Ø7:Ø*-ñ$ñ $ð $ð $ñ „Xð$ð !Ø.3Ø*.ñ^Kñ ^Kð ^Kð ^Kð ^Kñ@dð dð dð dñLR
ð R
ð R
ð R
ñh6ð 6ð 6ð 6ñ@4ð 4ð 4ð 4ñ	8ð 	8ð 	8ð 	8ñ*ð *ð *ð *ñ4ð ð ð ñ
ð ð ð ñ&'ð 'ð 'ð 'ñ*%ð %ð %ð %ñ5ð 5ð 5ð 5ñ$
ð 
ð 
ð 
ñ=ð =ð =ð =ð~ ñ!ð !ð !ñ „]ð!ñFð ð ð ñ"ð ð ð ñ 'ð 'ð 'ð 'ñRBHð BHð BHð BHñHK ð K ð K ð K ñZ"
ð "
ð "
ð "
ñH?ð ?ð ?ð ?ñBð ð ð ñB%ð %ð %ð %ñ@5&ð 5&ð 5&ð 5&ñn";ð ";ð ";ð ";ñH>ð >ð >ð >ñ0ð ð ð ñ1
ð 1
ð 1
ð 1
ñfð ð ð ñ6-Að -Að -Að -Añ^ð ð ð ñ@rð rð rð rñhQð Qð Qð QñN5ð N5ð N5ð N5ñ`%ð %ð %ð %ñ
Hð Hð Hð Hð ñð ð ñ „Xðð ññ ð ñ „Xðñ
ñ 
ð 
ð 
ñ(ñ (ð (ð (ñ1ñ 1ð 1ð 1ð 1ð 1ð 1ð 1ru   c                  óÈ   ‡ — e Zd Zd<ˆ fd„Zd=d„Zd>d
„Zd?d„Zd?d„Zd?d„Zd@d„Z	dAd„Z
dBd„Z	 dCdDd$„ZdEd'„ZdFd)„ZdGd+„Zd=d,„ZdHd-„Zd=d.„ZdId0„ZdJd3„ZdKd5„ZdLd8„Z	 dCdMd;„Zˆ xZS )NrÄ
  rä  úScheduler | Nonec                óV   •— t          ¦   «                              ¦   «          || _        d S r   )r  rC  rä  )rr   rä  r  s     €rs   rC  zBaseScheduling.__init__û%  s$   ø€ Ý‰Œ×ÒÑÔÐØ"ˆŒˆˆru   rŠ   r   c                óJ   — | j         r| j                              ¦   «          d S d S r   )rä  r»
  rq   s    rs   Úfree_buffers_in_schedulerz(BaseScheduling.free_buffers_in_schedulerÿ%  s0   € ØŒ>ð 	*ØŒN×'Ò'Ñ)Ô)Ð)Ð)Ð)ð	*ð 	*ru   rì  r  úOrderedSet[BackendFeature]c                ó   — t          ¦   «         S )z0Return a set of .codegen.common.BackendFeature()r   rë  s     rs   Úget_backend_featuresz#BaseScheduling.get_backend_features&  s   € å‰|Œ|Ðru   rˆ   rf   r‰   rv   c                ó   — t           ‚)zO
        Check whether node1 and node2 can be vertically fused or not.
        r  rð  s      rs   r
  z BaseScheduling.can_fuse_vertical&  ó
   € õ "Ð!ru   c                ó   — t           ‚)zQ
        Check whether node1 and node2 can be horizontally fused or not.
        r  rð  s      rs   r
  z"BaseScheduling.can_fuse_horizontal&  rú  ru   c                óÒ  — |                      ¦   «         }t          |t          j        ¦  «        sdS |                     ¦   «         sdS t          |j        t          j        ¦  «        r�t          |j        j        ¦  «        dk    oct          |j        j        d         t          j	        ¦  «        o9|j        j        d          
                    ¦   «         | 
                    ¦   «         k    S dS )av  
        A Multi-Output Template (referenced in #144012) is a template node
        with MultiOutputLayout, and its output buffers are instances of MultiOutput.
        In this context, we verify whether node1 represents the Multi-Output Template
        and node2 corresponds to one of its outputs. If so, we further check if
        backend supports this fusion.

        Fr   r   )r›  r²   r0   r:  r\   r”   rB   rÏ   rÉ  r€  rê  )rr   rˆ   r‰   r^  s       rs   r
  z.BaseScheduling.can_fuse_multi_outputs_template&  sÎ   € ð ×.Ò.Ñ0Ô0ˆÝ˜,­Ô(9Ñ:Ô:ð 	Ø�5Ø×5Ò5Ñ7Ô7ð 	Ø�5å�e”j¥"¤.Ñ1Ô1ð 	å�E”JÔ%Ñ&Ô&¨!Ò+ð OÝ˜uœzÔ0°Ô3µR´YÑ?Ô?ðOà”JÔ% aÔ(×1Ò1Ñ3Ô3°|×7LÒ7LÑ7NÔ7NÒNðð ˆuru   rÝ   c                ó  — |                      ¦   «         s|                      ¦   «         rt                               ||¦  «        S t                               ||¦  «        r+t                               ||¦  «        rt          ||¦  «        S t                               ||¦  «        rt          ||¦  «        S t          |t          ¦  «        r|                     |¦  «        S t          |t          ¦  «        r|                     |¦  «        S t          |t          ¦  «        rQt          |t          ¦  «        r<t          |j        t          j        ¦  «        sJ ‚t"                               ||¦  «        S t&                               ||¦  «        S )z 
        Fuse two nodes
        )rú  re  rz   r4  r:  r  rA  r¯   r  r"  r²   r?  rd  r³   r”   r0   r  rM  rW  rÝ   rð  s      rs   rz   zBaseScheduling.fuse1&  sl  € ð ×ÒÑÔð 	9 ×!1Ò!1Ñ!3Ô!3ð 	9Ý-×2Ò2°5¸%Ñ@Ô@Ð@Ý×9Ò9Ø�5ñ
ô 
ð 	9å×&Ò& u¨eÑ4Ô4ð	9õ )¨°Ñ6Ô6Ð6Ý×7Ò7¸¸uÑEÔEð 	9Ý*¨5°%Ñ8Ô8Ð8Ý˜Õ4Ñ5Ô5ð 
	9Ø—?’? 5Ñ)Ô)Ð)Ý˜Õ6Ñ7Ô7ð 	9Ø—?’? 5Ñ)Ô)Ð)Ý˜Õ8Ñ9Ô9ð 	9½jØ•=ñ?
ô ?
ð 	9õ ˜eœj­"Ô*DÑEÔEÐEÐEÐEÝ7×EÒEÀeÈUÑSÔSÐSå%×*Ò*¨5°%Ñ8Ô8Ð8ru   r^  r!  ú"tuple[tuple[sympy.Expr, ...], ...]c                ó   — t           ‚)z[
        Process the iteration sizes in case a transformation needs to be applied.
        r  )rr   r^  s     rs   r=  zBaseScheduling.group_fnK&  rú  ru   r­  Úepilogue_nodesrx  r
  r–  c                ó   — t           ‚)zã
        Given a template node, generate a kernel.

        This function is only available for triton now. If the third-party backend behaves as a sub-class
        of TritonScheduling, it can override it or reuse it.
        r  )rr   r­  r   r
  s       rs   rÃ  zBaseScheduling.codegen_templateS&  s
   € õ "Ð!ru   Nrw  rÔ  rÕ  rn  rÖ   c                ó   — t           ‚©r×  r  )rr   rw  rÔ  rÕ  s       rs   rØ  z.BaseScheduling.generate_kernel_code_from_nodesa&  s
   € õ "Ð!ru   r”   ú"FusedSchedulerNode | SchedulerNodec                ó   — t           ‚r  r  rM  s     rs   rÉ  zBaseScheduling.codegen_nodel&  ó
   € õ "Ð!ru   r"  c                ó   — t           ‚r   r  rM  s     rs   rÈ  z*BaseScheduling.codegen_mix_order_reductionr&  r  ru   rA  c                ó   — t           ‚r   r  rM  s     rs   rÇ  z'BaseScheduling.codegen_nested_reductionu&  r  ru   c                ó   — t           ‚)zt
        Generate synchronization code for the kernel. This method depends on the hardware characteristics.
        r  rq   s    rs   rË  zBaseScheduling.codegen_syncx&  r  ru   c                ó   — dS )z•
        Check whether the backend is requesting the scheduler to flush the generated kernel.
        If not supported, please return False.
        Fr…   rq   s    rs   rÌ  zBaseScheduling.ready_to_flush~&  s	   € ð
 ˆuru   c                ó   — t           ‚)z]
        Flush the generated kernel and python wrapper code to the source code file.
        r  rq   s    rs   r½
  zBaseScheduling.flush…&  r  ru   rÎ  c                ó   — t           ‚)rÐ  r  r�  s     rs   rÑ  z$BaseScheduling.benchmark_fused_nodes‹&  ó
   € õ "Ð!ru   rÚ  r   c                ó   — t           ‚)rÜ  r  )rr   rÚ  s     rs   rÝ  z)BaseScheduling.benchmark_codegened_module”&  s
   € õ
 "Ð!ru   r‘   c                ó   — dS )zŒ
        Return an unsigned integer which represents the priority of this fusion pair.
        The smaller is with higher priority.
        r   r…   rð  s      rs   r¯
  z'BaseScheduling.get_fusion_pair_priority›&  s	   € ð ˆqru   r  rÑ  c                ó   — t           ‚)z¡
        Benchmark the list of nodes to combine and return the execution time
        and memory copy time in milliseconds on randomly generated inputs.
        r  )rr   r  rÔ  s      rs   rÓ  z%BaseScheduling.benchmark_combo_kernel¤&  r  ru   rš  r  c                ó|   — |r9ddl m}  |||¦  «        }t          j        j                             ||¦  «         d S d S )Nr   )Ú'set_kernel_post_grad_provenance_tracing)rÇ  r  ra   rÂ   r  Úwrite_provenance_debug_handle)rr   rš  r  r  Údebug_handles        rs   Úcodegen_commentzBaseScheduling.codegen_comment­&  sn   € ð
 ð 		ØUÐUÐUÐUÐUÐUàBÐBØØñô ˆLõ ŒGÔ ×>Ò>Ø˜\ñô ð ð ð ð		ð 		ru   )rä  rò  r$  )rì  r  rŠ   rö  r/  r  )r^  r!  rŠ   rþ  )r­  rf   r   rx  r
  rx  rŠ   r–  r   rí  )r”   r  rŠ   r   )r”   r"  rŠ   r   )r”   rA  rŠ   r   r%  rì  )rÚ  r   rŠ   rÎ  r1  rî  )rš  rx  r  r–  rŠ   r   )r€   r�   r‚   rC  rõ  rø  r
  r
  r
  rz   r=  rÃ  rØ  rÉ  rÈ  rÇ  rË  rÌ  r½
  rÑ  rÝ  r¯
  rÓ  r  r(  r)  s   @rs   rÄ
  rÄ
  ú%  sá  ø€ € € € € ð#ð #ð #ð #ð #ð #ð*ð *ð *ð *ðð ð ð ð"ð "ð "ð "ð"ð "ð "ð "ðð ð ð ð49ð 9ð 9ð 9ð4"ð "ð "ð "ð"ð "ð "ð "ð$ %)ð		"ð 	"ð 	"ð 	"ð 	"ð"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ðð ð ð ð"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ðð ð ð ð"ð "ð "ð "ð #'ðð ð ð ð ð ð ð ð ru   rÄ
  r/  )rŠ   r»  )r¿  rf   rŠ   rÖ   )r¿  rf   rŠ   rÐ  )r¿  rf   rŠ   r8  )rø  r   rŠ   rÖ   )r”   rf   rÇ  rÈ  r  r6  rŠ   r   )r»  r¼  rŠ   r   )r»  r¼  rä  rã  rÞ   r¢  rŠ   r   )r…   )râ  rã  r^  ra  rä  rY  rŠ   r¡   )r  r  r�  r  rŠ   r   r¹  )r  r‘   r  r‘   r  r‘   r  r‘   r  rH   rŠ   r  )r)  ry  r*  ry  r  r‘   r  r‘   r  r‘   r  r‘   r  rH   rŠ   rv   )r”   r:  rŠ   r;  )r”   rf   rŠ   r;  )r­  rf   rŠ   rv   )r”   rf   rS  rv   rŠ   rv   )r­  rf   r[  rf   rŠ   rv   )rˆ   rf   r‰   rf   )×Ú
__future__r   ri  rš  r£   rE  rü  rÊ
  rª  r  r  ro  r  r   rð  r  rÌ  r³  rÇ  r   r   Úconcurrent.futuresr   r   r   r	   r
   r   r   r   r   r   Útyping_extensionsr   Útorch.utils._ordered_setr   r0   r   r   Úcollections.abcr   r   r   Útypesr   Útorch._inductor.codegen.wrapperr   r  r   r�  r   r	  rp  Útorch._inductor.async_compileÚtorch.utils._pytreerã  Ú_pytreerÌ  Útorch._dynamo.utilsr   r   Ú torch._inductor.autotune_processr   Útorch._inductor.codecacher    r!   Útorch._inductor.irr"   Útorch._inductor.metricsr#   r$   Útorch._inductor.stream_utilsr%   Ú%torch.fx.experimental.symbolic_shapesr&   Útorch.utils._sympy.functionsr'   Útorch.utils._sympy.symbolr(   r)   r*   Útorch.utils._tritonr+   rh  r,   r-   r.   r/   r1   Úanalyze_preserves_zero_maskr2   Úcodegen.commonr3   r4   r5   Úcomm_analysisr6   r7   r8   r9   r:   r;   Úexcr<   r=   Úfx_utilsr>   r?   r@   rA   rB   rC   rD   r)  rE   rÛ  rF   rG   Úruntime.hintsrH   rI   Úruntime.runtime_utilsrJ   rK   rL   rÃ   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   Úvirtualizedra   Ú	getLoggerr€   rd  Ú_loggingÚgetArtifactLoggerrò  r|  rU  r`  r¥   rg   rƒ   rh   ri   rà  rk   r‡   r�   r˜   r­   r¯   r4  râ  r)  rf   rŒ  rƒ  r‚  rØ  rˆ  rê  r÷  r  rÊ  rd  r  r³   rÇ  rÔ  rÝ   r"  rA  rM  re  rÓ  r  r  r  r(  r/  rT  r¶  rµ  rA  rF  rP  rZ  r_  rc  re  rh  rj  rm  ro  r€  rã  rÄ
  r…   ru   rs   ú<module>r5     sµ  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð (Ð 'Ð 'Ð 'Ð 'Ð 'à /Ð /Ð /Ð /Ð /Ð /à )Ð )Ð )Ð )Ð )Ð )Ð )Ð )ð ð 2Ø<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø Ð Ð Ð Ð Ð àJÐJÐJÐJÐJÐJà5Ð5Ð5Ð5Ð5Ð5Ø1Ð1Ð1Ð1Ð1Ð1à €€€à €€€Ø $Ð $Ð $Ð $Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø EÐ EÐ EÐ EÐ EÐ EØ ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø >Ð >Ð >Ð >Ð >Ð >Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ *Ð *Ð *Ð *Ð *Ð *à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ DÐ DÐ DÐ DÐ DÐ DØ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ Mðð ð ð ð ð ð ð ð ;Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø $Ð $Ð $Ð $Ð $Ð $ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð* Ð Ð Ð Ð Ð ð €gÔ˜Ñ!Ô!€ØŒ^×-Ò-¨h¸ÑAÔA€
Ø”N×4Ò4°X¸ÑOÔOÐ Ø œ>×;Ò;ØÐ$ñô Ð ð ”×1Ò1°(¸LÑIÔI€àÐ 3Ô4€Ð 4Ð 4Ð 4Ñ 4Ø€WˆT�]„]€Ø€Yˆt�_„_€ð ÔðDð Dð Dð Dð Dñ Dô Dñ ÔðDð* Ôð(ð (ð (ð (ð (ñ (ô (ñ Ôð(ð
ð 
ð 
ð 
ð 
�*ñ 
ô 
ð 
ð €Ô˜TÐ"Ñ"Ô"ðNð Nð Nð Nð Nñ Nô Nñ #Ô"ðNð*	ð 	ð 	ð 	ð_ð _ð _ð _ð _ñ _ô _ð _ðD	mð mð mð mð mñ mô mð mð` Ôðh8ð h8ð h8ð h8ð h8ñ h8ô h8ñ Ôðh8ðV Ôð1ð 1ð 1ð 1ð 1˜_ñ 1ô 1ñ Ôð1ðT1ð T1ð T1ð T1ð T1ñ T1ô T1ð T1ðn „ð2ð 2ð 2ñ „ð2ðð ð ð ð,ð ð ð ð,#ð #ð #ð #ðL €Ô˜TÐ"Ñ"Ô"ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ #Ô"ð
ð*ð ð ð ðð ð ð ð ñ ô ð ð *Kð *Kð *Kð *KðZ"*ð "*ð "*ð "*ð "*Ð 1ñ "*ô "*ð "*ðJ5ð 5ð 5ð 5ð 5Ð.ñ 5ô 5ð 5ðA*ð A*ð A*ð A*ð A*Ð%ñ A*ô A*ð A*ðHð ð ð ð$ð ð ð ð8k*ð k*ð k*ð k*ð k*Ð*ñ k*ô k*ð k*ð\hGð hGð hGð hGð hGÐ0ñ hGô hGð hGðV\<ð \<ð \<ð \<ð \<Ð.ñ \<ô \<ð \<ð~<-ð <-ð <-ð <-ð <-Ð+=ñ <-ô <-ð <-ð~L:ð L:ð L:ð L:ð L:Ð!3ñ L:ô L:ð L:ð^bð bð bð bð bÐ,ñ bô bð bðP #%ð+ð +ð +ð +ð +ð\0ð 0ð 0ð 0ð8
1ð 
1ð 
1ð 
1ð(ð (ð (ð (ð6ð ð ð ð@ Ôð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð> +˜9œ?Ñ,Ô,Ð ðð ð ð ð$ð ð ð ð&"ð "ð "ð "ð 6:ðð ð ð ð ð ð4:ð :ð :ð :ð"ð "ð "ð "ðð ð ð ðð ð ð ðPð Pð Pð Pð@ð @ð @ð @ð Ôð/2ð /2ð /2ð /2ð /2ñ /2ô /2ñ Ôð/2ðd Ôð=ð =ð =ð =ð =ñ =ô =ñ Ôð=ð@{X1ð {X1ð {X1ð {X1ð {X1ñ {X1ô {X1ð {X1ð|qAð Að Að Að Añ Aô Að Að Að Aru   