+
    –°³jë¬ ã                  óâ	  a € 0 t $ ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIHtHt ^ RIHtHtHtHtHtHtHtH t  ^ RI!H"t" ^ RI#H$t$ ^RI%H&t&H't' ]'       d+   ^ R	I(H)t)H*t*H+t+H,t, ^ R
I-H.t. ^ RI/H0t0 ^RI1H2t2 ^RI3H4t4 ^RI5H6t6 ^ RI7t7^ RI8t8^ RI9t8^ RI:H;u H<t= ^ RI>H?t?H@t@ ^ RIAHBtB ^ RICHDtDHEtE ^ RIFHGtG ^ RIHHItIHJtJ ^ RIKHLtL ^ RIMHNtN ^ RIOHPtP ^ RIQHRtRHStSHTtT ^ RIUHVtV ^RIWHXtXHYtYHZtZH[t[H%t%H\t\ ^RI]H^t^ ^RI_H`t`HataHbtb ^RIcHdtdHete ^RI[HftfHgtgHhthHiti ^RIjHktkHltl ^RImHntn ^R I%HotoHptpHqtqHrtrHstsHttt ^R!IuHvtv ^R"IwHxtxHyty ^R#IzH{t{H|t| ^R$I}H~t~HtH€t€ ^R%I�H‚t‚ ^R&I;HƒtƒH„t„H…t…H†t†H‡t‡HˆtˆH‰t‰HŠtŠH‹t‹HŒtŒH�t�HŽtŽH�t�H�t�H‘t‘H’t’H“t“H”t”H•t•H–t–H—t— ^R'I˜H™t™ ]
EP4                  ! ]›4      tœR( R) lt�]8EP<                  EP?                  ]›R*4      t ]8EP<                  EP?                  ]›R+4      t¡]8EP<                  EP?                  ]›R,4      t¢]8EP<                  EP?                  ]›R-4      t£]¤R.,          t¥R/]¦R0&   ] ! R14      t§]"! R24      t¨]7EPR                  ! R3R4R4R57      tªR6t«]EPX                   ! R7 R84      4       t­]EPX                   ! R9 R:4      4       t® ! R; R<]4      t¯]EPX                  ! R4R=7       ! R> R?4      4       t°R@ RA lt± ! RB RC4      t² ! RD RE4      t³]EPX                   ! RF RG4      4       t´]EPX                   ! RH RI]´4      4       tµ ! RJ R.4      t¶]EPn                  RK RL l4       t¸RM RN lt¹RO RP ltºRQ RR lt»]EPX                  ! R4R=7       ! RS RT4      4       t¼RU RV lt½ ! RW RX4      t¾RY RZ lt¿ ! R[ R\]¶4      tÀ ! R] R^]¶4      tÁ ! R_ R`]¶4      tÂRa Rb ltÃRc Rd ltÄ ! Re Rf]¶4      tÅ ! Rg Rh]Å4      tÆ ! Ri Rj]Å4      tÇ ! Rk Rl]Å4      tÈ ! Rm Rn]Å4      tÉ ! Ro Rp]¶4      tÊRœRq Rr lltËRs Rt ltÌRu Rv ltÍRw Rx ltÎRy Rz ltÏ]EPX                   ! R{ R|4      4       tÐ]	EP¢                  ! 4       tÒR} R~ ltÓR R€ ltÔR� R‚ ltÕRƒR4/R„ R… lltÖR† R‡ lt×Rˆ R‰ ltØRŠ R‹ ltÙRŒ R� ltÚRŽ R� ltÛR� R‘ ltÜR’ R“ ltÝ]EPX                   ! R” R•4      4       tÞ]EPX                   ! R– R—4      4       tß]à! 4       tá ! R˜ R™4      tâ ! Rš R›4      tãR# )�é    )ÚannotationsN)ÚCounterÚdefaultdict)Úas_completedÚFuture)ÚAnyÚGenericÚLiteralÚ
NamedTupleÚoverloadÚTYPE_CHECKINGÚ	TypeAliasÚTypeVar)Ú	ParamSpec©Ú
OrderedSet)ÚComputedBufferÚ	Pointwise)ÚCallableÚIterableÚIteratorÚSequence)Ú
ModuleType)ÚEnterCudaStreamContextLine)ÚMemoryCoalescing)Ú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Úcache_on_self_and_argsÚcmpÚdecompose_indexÚ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)ÚVc               ó    € V ^8„  d   QhRRRR/# )é   ÚdepsúOrderedSet[Dep]ÚreturnúOrderedSet[str]© )Úformats   "ÚZ/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_inductor/scheduler.pyÚ__annotate__rn   u   s   € ÷ Pñ P˜/ð P¨oñ Pó    c                ó&   € \        R V  4       4      # )zqNames of real reads/writes, excluding WeakDep (ordering-only deps that
do not actually read or write the buffer).c              3  ój   "  € T F)  p\        V\        4      '       d   K  VP                  x € K+  	  R # 5i©N)Ú
isinstancer<   Úname©Ú.0Údeps   & rm   Ú	<genexpr>Ú"_real_dep_names.<locals>.<genexpr>x   s   é € ÐO©$ 3´jÀÄg×6N”h�c—h–h«$ùs   ‚3Ÿ3r   )rg   s   &rm   Ú_real_dep_namesrz   u   s   € ô ÑO©$ÓOÓOÐOro   ÚfusionÚloop_orderingÚcompute_dependenciesÚ
cudagraphsÚBaseSchedulerNoder   ÚPartitionTypeÚ_TÚ_PÚflattened_readT©ÚintegerÚnonnegativeiè  c                  óx   € ] tR t^‰t$ RtR]R&   RtR]R&   RtR]R&   R t]	R	 R
 l4       t
]	RR R ll4       tRtR# )ÚFusionResultNzbool | NoneÚshould_fusezCallable[[], bool] | NoneÚcallable_fnúLambdaFuture | NoneÚfuturec                	ój   € V P                   R JV P                  R J,          '       g   \        R4      hR # )NzLFusion result should contain either fusion decision or callable_fn, not both)r‰   rŠ   ÚAssertionError©Úselfs   &rm   Ú__post_init__ÚFusionResult.__post_init__�   s9   € Ø×!Ñ!¨Ð-°$×2BÑ2BÈ$Ð2N×OÔOÜ Ø^óð ñ Pro   c               ó   € V ^8„  d   QhRR/# )rf   r‰   Úboolrk   )rl   s   "rm   rn   ÚFusionResult.__annotate__–   s   € ÷ 5ñ 5˜tñ 5ro   c                	ó   € \        VR 7      # ))r‰   ©rˆ   )Úclsr‰   s   &&rm   ÚfuseÚFusionResult.fuse•   s   € ä¨Ô4Ð4ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rŠ   úCallable[[], bool]rŒ   r‹   rk   )rl   s   "rm   rn   r•   š   s    € ÷ Dñ DØ,ðDØ6IñDro   c                	ó   € \        WR 7      # )©rŠ   rŒ   r—   )r˜   rŠ   rŒ   s   &&&rm   Úfrom_callableÚFusionResult.from_callable™   s   € ô ¨ÔCÐCro   rk   rr   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r‰   Ú__annotations__rŠ   rŒ   r‘   Úclassmethodr™   rŸ   Ú__static_attributes__rk   ro   rm   rˆ   rˆ   ‰   sQ   ‡ à#€K�Ó#Ø-1€KÐ*Ó1Ø"&€FÐÓ&òð ô5ó ð5ð öDó ôDro   rˆ   c                  óP   € ] tR t^ t$ R]R&   R]R&   R]R&   RtR]R&   R	 R
 ltRtR# )ÚPendingFusionrœ   rŠ   r   Únode1Únode2Nr‹   rŒ   c               ó   € V ^8„  d   QhRR/# )rf   ri   ú+tuple[BaseSchedulerNode, BaseSchedulerNode]rk   )rl   s   "rm   rn   ÚPendingFusion.__annotate__§   s   € ÷ (ñ (Ð"Mñ (ro   c                	ó2   € V P                   V P                  3# rr   ©rª   r«   r�   s   &rm   Úget_fusion_nodesÚPendingFusion.get_fusion_nodes§   s   € Ø—
‘
˜DŸJ™JÐ'Ð'ro   rk   )r¡   r¢   r£   r¤   r¥   rŒ   r±   r§   rk   ro   rm   r©   r©       s)   ‡ à#Ó#ØÓØÓØ"&€FÐÓ&÷(ñ (ro   r©   c                  ó:   € ] tR t^«t$ RtR]R&   R]R&   R]R&   RtR# )	Ú_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Úbaseliner   Únoderk   N)r¡   r¢   r£   r¤   Ú__doc__r¥   r§   rk   ro   rm   r´   r´   «   s   ‡ ñð 
ƒHØƒMØ
×ro   r´   )Úslotsc                  ó|   € ] tR t^¸t$ RtR]R&   R]R&   ^ tR]R&   ^ tR]R&   ]P                  ! ]
R	7      tR
]R&   RtR# )ÚComboKernelMemoryContextzþ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.
rj   Úgraph_outputsúdict[BaseSchedulerNode, int]Únode_to_idxrµ   Úbaseline_peakÚrunning_peak©Údefault_factoryú	list[int]Úbaseline_live_beforerk   N)r¡   r¢   r£   r¤   r¹   r¥   rÀ   rÁ   ÚdataclassesÚfieldÚlistrÅ   r§   rk   ro   rm   r¼   r¼   ¸   sC   ‡ ñð #Ó"Ø-Ó-Ø€M�3Óð €L�#Óð '2×&7Ò&7ÈÔ&MÐ˜)×Mro   r¼   c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   rª   r   r«   ri   r”   rk   )rl   s   "rm   rn   rn   Î   s&   € ÷ 	ñ 	Øð	àð	ð 
ñ	ro   c                óÈ   € V P                  4       '       d   VP                  4       '       g   R # V P                  4       P                  pVR9   ;'       d    \        V4      R8H  # )FÚtriton)ÚcudaÚxpu)r^   Ú
get_deviceÚtyperU   )rª   r«   Údevice_types   && rm   Ú_is_gpu_triton_backendrÒ   Î   sP   € ð �<‰<�>Š> §¡§¢ÙØ×"Ñ"Ó$×)Ñ)€Kà�Ñ&×WÐWÔ+>¸{Ó+KÈxÑ+Wðro   c                  ó"  € ] tR t^ÚtRt]R R l4       t]R R l4       t]R R l4       t	]R R	 l4       t
]R
 R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       tRtR# )ÚMixOrderReductionz�
This class contains utility functions to decide if we should fuse reductions
reducing across different dimensions of the same input tensor.
c               ó    € V ^8„  d   QhRRRR/# ©rf   r¸   r   ri   r”   rk   )rl   s   "rm   rn   ÚMixOrderReduction.__annotate__á   s   € ÷ 
ñ 
Ð!2ð 
°tñ 
ro   c                	óÒ   € V P                  4       ;'       dQ    \        ;QJ d*    R  V P                  4        4       F  '       d   K   R# 	  R# ! R  V P                  4        4       4      # )c              3  óö   "  € T Fo  p\        V\        4      '       g   K  VP                  4       '       g   K3  \        VP                  \        4      '       g   KU  VP                  P
                  R Jx € Kq  	  R # 5irr   )rs   ÚSchedulerNodeÚis_reductionr¸   r   Ú_split_size©rv   Úsubnodes   & rm   rx   Ú7MixOrderReduction.is_split_reduction.<locals>.<genexpr>â   sZ   é € ð +
á+�Ü˜'¤=×1ô 1ð ×$Ñ$×&ô 1ô ˜7Ÿ<™<¬×8ô	 1ˆG�L‰L×$Ñ$¨DÕ0Û+ùs   ‚A9ŸA9·A9Á A9FT)rÛ   ÚallÚ	get_nodes©r¸   s   &rm   Úis_split_reductionÚ$MixOrderReduction.is_split_reductionà   s`   € à× Ñ Ó"÷ 
ð 
§s£sñ +
àŸ>™>Ô+ó+
§s¤sð 	
¢sð 	
 sñ +
àŸ>™>Ô+ó+
ó (
ð 	
ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r   ri   ztuple[sympy.Expr, sympy.Expr]rk   )rl   s   "rm   rn   r×   ë   s   € ÷ (!ñ (!Ð$5ð (!Ð:Wñ (!ro   c                	ó  € V P                  V4      '       EdÙ   R pR pVP                  4        EF­  p\        V\        4      '       d7   VP	                  4       '       d!   \        VP
                  \        4      '       g   KR  VP
                  P                  f   \        R4      h\        P                  P                  P                  \        VP
                  P                  4      4      pVP
                  P                  f   \        R4      h\        P                  P                  P                  \        VP
                  P                  4      4      pVf   TpTpEK/  \        P                  P                  P                  W%4      '       g   \        V RV 24      h\        P                  P                  P                  W64      '       d   EK   \        V RV 24      h	  Vf   \        R4      hW#3# VP                   ^,          # )Nz0expected subnode.node._original_ranges to be setz:expected subnode.node._original_reduction_ranges to be setú v.s. zexpected xnumel to be set)rã   rá   rs   rÚ   rÛ   r¸   r   Ú_original_rangesrŽ   rd   ÚgraphÚsizevarsÚsimplifyrb   Ú_original_reduction_rangesÚstatically_known_equalsÚgroup)r˜   r¸   ÚxnumelÚrnumelrÞ   Ú	curxnumelÚ	currnumels   &&     rm   Úget_numel_rnumelÚ"MixOrderReduction.get_numel_rnumelê   sš  € à×!Ñ! $×'Ó'ØˆFØˆFØŸ>™>×+�ä˜w¬×6Ò6Ø×,Ñ,×.Ò.Ü" 7§<¡<´×@Ò@áà—<‘<×0Ñ0Ò8Ü(ØJóð ô ŸG™G×,Ñ,×5Ñ5Ü! '§,¡,×"?Ñ"?Ó@ó�	ð —<‘<×:Ñ:ÒBÜ(ØTóð ô ŸG™G×,Ñ,×5Ñ5Ü! '§,¡,×"IÑ"IÓJó�	ð ’>Ø&�FØ&“FäŸ7™7×+Ñ+×CÑCÀF×VÒVÜ,°¨x°v¸i¸[Ð-IÓJÐJÜŸ7™7×+Ñ+×CÑCÀF×VÕVÜ,°¨x°v¸i¸[Ð-IÓJÐJñ= ,ð@ Š~Ü$Ð%@ÓAÐAØÐ#Ð#à—:‘:˜a•=Ð ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   r×     s$   € ÷ 	0ñ 	0Ø%ð	0Ø.?ð	0à	ñ	0ro   c                	óÖ   € V P                  V4      pV P                  V4      p\        V4      ^8w  g   \        V4      ^8w  g   W48X  d   R# \        V4      \        \        V4      4      8H  # )rf   F)ró   ÚlenÚtupleÚreversed)r˜   rª   r«   Úg1Úg2s   &&&  rm   Úhas_mix_reduction_ordersÚ*MixOrderReduction.has_mix_reduction_orders  sX   € ð ×!Ñ! %Ó(ˆØ×!Ñ! %Ó(ˆäˆr‹7�aŒ<œ3˜r›7 aœ<¨2¬8Ùä�R‹yœE¤(¨2£,Ó/Ñ/Ð/ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   ÚbufÚstrr¸   r   ri   r”   rk   )rl   s   "rm   rn   r×   "  s"   € ÷ !ñ ! #ð !Ð->ð !À4ñ !ro   c                óâ  € RpVP                   P                   F0  p\        V\        4      '       g   K  VP                  V8X  g   K.  Tp M	  V'       g   R# VP
                  pVP                   P                  pV'       gS   \        V\        4      '       g   \        \        V4       4      hVP                  ^ ,          P                   P                  pV'       g   \        R4      h\        V4      \        VP                  4      ,
          '       g   R# \        P                  P                  P!                  \#        VP$                  4      \#        VP'                  4       4      4      '       d   R# R# )z0
The access to 'buf' is not a broadcast access.
NFz#expected var_ranges to be non-emptyT)Úread_writesÚreadsrs   r:   rt   ÚindexÚ
var_rangesÚFusedSchedulerNoderŽ   rÐ   Úsnodesr   r'   rd   ré   rê   rí   rb   ÚsizeÚvalues)r˜   rÿ   r¸   Ú	found_deprw   r  r  s   &&&    rm   Ú_is_full_accessÚ!MixOrderReduction._is_full_access!  s  € ð
 ˆ	Ø×#Ñ#×)Ô)ˆCÜ˜#œy×)Ô)¨c¯h©h¸#®oØ�	Ùñ *÷
 Ùà—‘ˆØ×%Ñ%×0Ñ0ˆ
çÜ˜dÔ$6×7Ò7Ü$¬¨T«
 |Ó5Ð5ØŸ™ Q�×3Ñ3×>Ñ>ˆJçÜ Ð!FÓGÐGÜ˜:Ó&¬°E×4FÑ4FÓ)G×GÔGÙô
 �7‰7×Ñ×3Ñ3Ü˜)Ÿ.™.Ó)¬=¸×9JÑ9JÓ9LÓ+M÷
ò 
ñ Ùro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rª   r   r«   ri   ú	list[str]rk   )rl   s   "rm   rn   r×   F  s$   € ÷ 	ñ 	Ø%ð	Ø.?ð	à	ñ	ro   c                	óì   € . pVP                  4       VP                  4       ,          pV FF  pV P                  WQ4      '       g   K  V P                  WR4      '       g   K5  VP                  V4       KH  	  V# rr   )Úused_buffer_namesr  Úappend)r˜   rª   r«   ÚoutÚcommon_readsrÿ   s   &&&   rm   Úget_common_readÚ!MixOrderReduction.get_common_readE  sb   € ð ˆØ×.Ñ.Ó0°5×3JÑ3JÓ3LÕLˆÛˆCØ×"Ñ" 3×.Ô.°3×3FÑ3FÀs×3RÔ3RØ—
‘
˜3–ñ  ð ˆ
ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   r×   R  s$   € ÷ :ñ :Ø%ð:Ø.?ð:à	ñ:ro   c                	ó<   € \        V P                  W4      4      ^ 8„  # ©r   )r÷   r  ©r˜   rª   r«   s   &&&rm   Úhas_common_readÚ!MixOrderReduction.has_common_readQ  s   € ô �3×&Ñ& uÓ4Ó5¸Ñ9Ð9ro   c               ó    € V ^8„  d   QhRRRR/# ©rf   r¸   r   ri   rµ   rk   )rl   s   "rm   rn   r×   X  s   € ÷ Mñ MÐ.ð M°3ñ Mro   c                	ó¤   € V P                  V4      p\        P                  P                  P	                  V^ ,          V^,          ,          ^ R7      # ©r   ©Úfallback)ró   rd   ré   rê   Úoptimization_hint)r˜   r¸   rú   s   && rm   Ú	get_numelÚMixOrderReduction.get_numelW  s>   € à×!Ñ! $Ó'ˆÜ�w‰w×Ñ×1Ñ1°"°Qµ%¸"¸Q½%µ-È!Ð1ÓLÐLro   c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   rª   r   r«   ri   rµ   rk   )rl   s   "rm   rn   r×   ]  s$   € ÷ $ñ $Ø%ð$Ø.?ð$à	ñ$ro   c                	ó$   € V P                  V4      # rr   )r#  r  s   &&&rm   Úget_fusion_scoreÚ"MixOrderReduction.get_fusion_score\  s   € ð
 �}‰}˜UÓ#Ð#ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   r×   e  s(   € ÷ pñ pÐ.ð pÐ7Hð pÈTñ pro   c                ó*  € \         P                  P                  '       g   R# \        P                  P
                  '       d   R# \        W4      '       g   R# VP                  4       '       d   VP                  4       '       g   R# VP                  4       '       g   VP                  4       '       d   R# VP                  VP                  4       ,          '       g(   VP                  VP                  4       ,          '       d   R# V P                  W4      '       g   R# \        P                  W4      p\        V4      ^ 8X  d   R# V P                  V4      '       d   YrTMV P                  V4      '       d   Y!rTMR# V P!                  V4      pVw  rx\         P                  P"                  '       gê   Rp	\        P                  P$                  P'                  \(        P*                  ! Wx,          V	4      RRR7      '       g   R# \        P                  P$                  P'                  \(        P*                  ! Wx^,          4      RRR7      '       g   R# \        P                  P$                  P'                  \(        P*                  ! VR4      RRR7      '       g   R# \,        ;QJ d*    R VP/                  4        4       F  '       g   K   RM	  RM! R VP/                  4        4       4      '       d   R# \        P                  P$                  P1                  VR4      '       g   R# \        P3                  V4      '       d   R# \4        ;QJ d.    R VP/                  4        4       F  '       d   K   Rp
V
# 	  Rp
V
# ! R VP/                  4        4       4      p
V
# )	z@
Check whether we can fuse two reductions with mix loop orders.
FT)Úsize_obliviousÚfallback_valuei   c              3  óÔ   "  € T F^  pVP                  4       '       g   K  VP                  P                  P                  \        P
                  \        P                  39  x € K`  	  R # 5irr   )rÛ   r¸   ÚdataÚreduction_hintrJ   ÚINNERÚDEFAULTrÝ   s   & rm   rx   Ú-MixOrderReduction.can_fuse.<locals>.<genexpr>¶  sU   é € ð 
ñ 7�Ø×#Ñ#×%ôˆG�L‰L×Ñ×,Ñ,ä×#Ñ#Ü×%Ñ%ðöó
 7ùs   ‚A(ŸA	A(c              3  óŒ   "  € T F:  pVP                  4       '       g   K  VP                  P                  4       R9   x € K<  	  R# 5i)ÚsumN>   r5  Úprod)rÛ   r¸   Úget_reduction_typerÝ   s   & rm   rx   r3  Ì  s@   é € ð 
ñ 2�Ø×#Ñ#×%ôˆG�L‰L×+Ñ+Ó-ðöó
 2ùs
   ‚AŸ%Ai  P i @  )r.   rÌ   Úmix_order_reductionrd   ré   Úcpp_wrapperrÒ   rÛ   Úhas_strict_sumÚ	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à   )r˜   rª   r«   r  Úcontiguous_nodeÚ
other_noderú   ÚnrowÚncolÚ
size_thresr  s   &&&        rm   Úcan_fuseÚMixOrderReduction.can_fused  sè  € ô
 �}‰}×0×0Ð0Ùô �7‰7××ÐÙä% e×3Ò3ÙØ×!Ñ!×#Ò#¨5×+=Ñ+=×+?Ò+?ÙØ×Ñ×!Ò! U×%9Ñ%9×%;Ò%;Ùà�O‰O˜e×7Ñ7Ó9×9Ô9Ø�O‰O˜e×7Ñ7Ó9×9Ô9ñ ð ×+Ñ+¨E×9Ò9Ùô )×8Ñ8¸ÓFˆÜˆ|Ó Ô!Ùà×!Ñ! %×(Ò(Ø*/™ZØ×#Ñ# E×*Ò*Ø*/™Záà×!Ñ! /Ó2ˆØ‰
ˆô �}‰}×@×@Ð@ð #ˆJô
 —7‘7×#Ñ#×1Ñ1Ü—’˜� jÓ1Ø#Ø$ð 2÷ ò ñ
 ô
 —7‘7×#Ñ#×1Ñ1Ü—’˜ a�xÓ(Ø#Ø$ð 2÷ ò ñ
 ô
 —7‘7×#Ñ#×1Ñ1Ü—’˜˜tÓ$Ø#Ø$ð 2÷ ò ñ
 ÷ ‹3ñ 
ð +×4Ñ4Ô6ó
�3�3Š3ñ 
ð +×4Ñ4Ô6ó
÷ 
ò 
ñ ô
 �w‰w×Ñ×4Ñ4°T¸9×EÒEÙä×/Ñ/°×@Ò@Ù÷ ‹cñ 
ð &×/Ñ/Ô1ó
�cŒcˆð ˆ
ò ˆð ˆ
ð ñ 
ð &×/Ñ/Ô1ó
ó 
ˆð ˆ
ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   r×   Ø  s$   € ÷ *ñ *Ø%ð*Ø.?ð*à	ñ*ro   c                	ó$   € V P                  W4      # rr   )rI  r  s   &&&rm   Úare_mix_order_reductionsÚ*MixOrderReduction.are_mix_order_reductions×  s   € ð �|‰|˜EÓ)Ð)ro   c               ó    € V ^8„  d   QhRRRR/# rÖ   rk   )rl   s   "rm   rn   r×   Þ  s   € ÷ ñ Ð&7ð ¸Dñ ro   c                	óâ   a a€ \         ;QJ d4    V V3R  lSP                  P                   4       F  '       d   K   RM)	  RM%! V V3R  lSP                  P                   4       4      '       g   R# R# )c              3  ó\   <"  € T F!  pSP                  VP                  S4      x € K#  	  R # 5irr   )Úis_contiguous_loadrt   )rv   rw   r˜   r¸   s   & €€rm   rx   Ú7MixOrderReduction.is_contiguous_node.<locals>.<genexpr>ß  s)   øé € ð 
Ù>T°sˆC×"Ñ" 3§8¡8¨T×2Ð2Ó>Tùs   ƒ),FT)rà   r  r  )r˜   r¸   s   ffrm   r=  Ú$MixOrderReduction.is_contiguous_nodeÝ  sR   ù€ ç‹sõ 
Ø>B×>NÑ>N×>TÒ>Tó
�s�sŠsõ 
Ø>B×>NÑ>N×>TÒ>Tó
÷ 
ò 
ñ Ùro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rÿ   r   Úparent_noder   ri   r”   rk   )rl   s   "rm   rn   r×   æ  s"   € ÷ ñ  Sð Ð7Hð ÈTñ ro   c                	ó|  € ^ RI Hp VP                  4        EF  p\        V\        4      '       g   \        R4      hVP                  pVP                  VP                  ,          pV Uu. uF!  qwP                  V8X  g   K  VP                  NK#  	  pp\        V4      ^ 8X  d   K�  V Fˆ  p	VP                  V	,          p
VP                  p\        VP                  4       4      p\         P"                  P$                  P'                  V
VV4      pVR,          ^ 8X  d   Kv  VR,          ^8X  d   K†    R# 	  EK  	  R# u upi )r   ©ÚMemoryUsageTypez#expected node to be a SchedulerNodeFTéÿÿÿÿ)Útorch._inductor.loop_bodyrY  rá   rs   rÚ   rŽ   Ú_bodyÚmemory_usageÚLOADÚbuffer_nameÚ
index_namer÷   Úindexing_exprsr  rÈ   Úkeysrd   ré   rê   Ústride_vars)r˜   rÿ   rV  rY  r¸   Ú	loop_bodyÚentriesÚeÚindex_namesr`  Ú
index_exprr  Úvar_symbolsrc  s   &&&           rm   rR  Ú$MixOrderReduction.is_contiguous_loadå  s  € å=à×)Ñ)×+ˆDÜ˜d¤M×2Ò2Ü$Ð%JÓKÐKØŸ
™
ˆIØ×,Ñ,¨_×-AÑ-AÕBˆGÙ18ÓQ±¨A¿M¹MÈSÑ<Pœ<˜1Ÿ<œ<±ˆKÐQä�;Ó 1Ô$Ùó *�
Ø&×5Ñ5°jÕA�
Ø&×1Ñ1�
ô # :§?¡?Ó#4Ó5�ÜŸg™g×.Ñ.×:Ñ:ØØØó�ð $ B�¨1Ö,°¸BµÀ1Ö0DÛ ô *ñ ,ñ4 ùò+ Rs   Á)D9Â D9rk   N)r¡   r¢   r£   r¤   r¹   Ústaticmethodrã   r¦   ró   rü   r  r  r  r#  r(  rI  rM  r=  rR  r§   rk   ro   rm   rÔ   rÔ   Ú   sþ   † ñð
 ô
ó ð
ð ô(!ó ð(!ðT ô	0ó ð	0ð ô!ó ð!ðF ô	ó ð	ð ô:ó ð:ð
 ôMó ðMð ô$ó ð$ð ôpó ðpðd ô*ó ð*ð
 ôó ðð ôó ôro   rÔ   c                  óò  € ] tR tRtRtRt^€t]R R l4       t]R R l4       t	]
R R	 l4       t ! R
 R]P                  4      t ! R R]P                  4      t]P"                  ! RR7       ! R R4      4       t]
R R l4       t]
R R l4       t]
R R l4       t]
R R l4       t]
R R l4       t]
R R l4       t]
R R l4       t]
R  R! l4       t]
R" R# l4       t]
R$R%/R& R' ll4       t]
R( R) l4       tR*tR%# )+ÚNestedReductioni  aÌ  
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   c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   Ú
outer_noder   Úgrouped_noderi   r”   rk   )rl   s   "rm   rn   ÚNestedReduction.__annotate__  s$   € ÷ 
ñ 
Ø%ð
Ø5Fð
à	ñ
ro   c                ó¶   € V P                  4       ;'       dC    VP                  4       ;'       d+    \        V P                  4       VP                  ,          4      # )zFCheck that the grouped reduction is a consumer of the outer reduction.)rÛ   r”   r<  r;  ©rp  rq  s   &&rm   Ú_is_dependent_reduction_pairÚ,NestedReduction._is_dependent_reduction_pair  sU   € ð ×#Ñ#Ó%÷ Pð PØ×)Ñ)Ó+÷Pð Pä�Z×3Ñ3Ó5¸×8NÑ8NÕNÓOð	
ro   c               ó$   € V ^8„  d   QhRRRRRR/# ro  rk   )rl   s   "rm   rn   rr  '  s$   € ÷ 	
ñ 	
Ø%ð	
Ø5Fð	
à	ñ	
ro   c                	ó  € \         P                  P                  ;'       dm    \        P                  P
                  '       * ;'       dF    \        W4      ;'       d3    V P                  4       '       * ;'       d    VP                  4       '       * # rr   )r.   rÌ   Únested_reductionrd   ré   r9  rÒ   r:  rt  s   &&rm   Ú_is_enabled_forÚNestedReduction._is_enabled_for&  sx   € ô
 �M‰M×*Ñ*÷ 2ð 2Ü—G‘G×'Ñ'Ô'÷2ð 2ä& zÓ@÷2ð 2ð ×-Ñ-Ó/Ô/÷2ð 2ð !×/Ñ/Ó1Ô1ð	
ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rr  3  s)   € ÷ Nñ NÐ!2ð NÐ;Lð NÐQUñ Nro   c                ó  € V P                  W4      '       d   V P                  W4      '       g   R# VP                  w  pw  r4VP                  w  pw  r5\        P                  P
                  P                  WE4      '       * # )zECheap filter for dependent reductions with different reduction sizes.F)rz  ru  rî   rd   ré   rê   rí   )r˜   rª   r«   Ú_Úrnumel1Úrnumel2s   &&&   rm   Úis_candidateÚNestedReduction.is_candidate2  sj   € ð ×"Ñ"Ø÷
ò 
à×1Ñ1°%×?Ò?ÙØŸ+™+‰ˆ‰<ˆAØŸ+™+‰ˆ‰<ˆAÜ—7‘7×#Ñ#×;Ñ;¸GÓMÔMÐMro   c                  ó€   € ] tR tRtRt]P                  ! 4       t]P                  ! 4       t]P                  ! 4       t	Rt
R# )ÚNestedReduction.PointwiseDomaini=  zè
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.
rk   N)r¡   r¢   r£   r¤   r¹   ÚenumÚautoÚREDUCEDÚLOCAL_REDUCTION_INPUTÚPARENT_FULLr§   rk   ro   rm   ÚPointwiseDomainr„  =  s+   † ñ	ð —)’)“+ˆà $§	¢	£Ðà—i’i“kŒro   rŠ  c                  óZ   € ] tR tRt]P
                  ! 4       t]P
                  ! 4       tRtR# )ÚNestedReduction.GroupedAxisiM  rk   N)	r¡   r¢   r£   r¤   r…  r†  ÚRÚXr§   rk   ro   rm   ÚGroupedAxisrŒ  M  s   † Ø�IŠI‹KˆØ�IŠI‹KŒro   r�  T)Úfrozenc                  óJ   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R]R	&   R
tR# )Ú&NestedReduction.PointwiseDomainContextiQ  rÚ   Úgrouped_reductionú
sympy.ExprÚgrouped_numelÚgrouped_rnumelútuple[sympy.Expr, ...]Úlocal_reduction_domainÚparent_full_domainrk   N)r¡   r¢   r£   r¤   r¥   r§   rk   ro   rm   ÚPointwiseDomainContextr’  Q  s    ‡ à(Ó(Ø!Ó!Ø"Ó"Ø 6Ó6Ø2×2ro   rš  c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rq  r   r–  r”  ri   z*tuple[SchedulerNode, sympy.Integer] | Nonerk   )rl   s   "rm   rn   rr  Z  s$   € ÷ &4ñ &4Ø,ð&4Ø>Hð&4à	3ñ&4ro   c                óê  € VP                  4       '       g   R# VP                  4        Uu. uF  q3P                  4       '       g   K  VNK  	  pp\        V4      ^8w  d   R# V^ ,          p\        V\        4      '       d!   \        VP
                  \        4      '       g   R# VP                  4       w  rg\        V4      R9  g   \        V4      ^8w  d   R# VP
                  P                  4       R9  d   R# \        P                  P                  P                  V4      p\        V\        \        P                  34      '       d   \        V4      ^8  d   R# V\        P                  ! V4      3# u upi )z<Validate the candidate as a single simple grouped reduction.N)é   rf   >   rB  ÚmaxÚminr5  r6  Úxor_sum)rÛ   rá   r÷   rs   rÚ   r¸   r   Ú
get_rangesr7  rd   ré   rê   rë   rµ   r@  ÚInteger)	r˜   rq  r–  ÚsnÚ
reductionsÚ	reductionÚiter_rangesÚreduce_rangesÚ
group_sizes	   &&&      rm   Ú_get_grouped_reduction_and_sizeÚ/NestedReduction._get_grouped_reduction_and_sizeY  s'  € ð
 ×(Ñ(×*Ò*ÙØ#/×#9Ñ#9Ô#;ÓQÑ#;˜R¿¹×?P—b�bÑ#;ˆ
ÐQÜˆz‹?˜aÔÙØ˜q•Mˆ	Ü˜)¤]×3Ò3¼:Ø�N‰NœN÷<
ò <
ñ Ø%.×%9Ñ%9Ó%;Ñ"ˆô ˆ{Ó 6Ô)¬S°Ó-?À1Ô-DÙð �>‰>×,Ñ,Ó.ð 7
ô 
ñ ä—W‘W×%Ñ%×.Ñ.¨~Ó>ˆ
Ü˜*¤s¬E¯M©MÐ&:×;Ò;¼sÀ:»ÐQRÔ?RÙØœ%Ÿ-š-¨
Ó3Ð3Ð3ùòA Rs   «E0ÁE0c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rp  r   rq  Údomain_contextrš  ri   r”   rk   )rl   s   "rm   rn   rr  ƒ  s8   € ÷ Xñ Xà%ðXð (ðXð /ð	Xð
 
ñXro   c                óV   € V P                  VVV4      pVf   R# V P                  W44      # )a4  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.
F)Ú _classify_nested_pointwise_nodesÚ!_pointwise_domains_are_compatible)r˜   rp  rq  r¬  Úpointwise_domainss   &&&& rm   Ú%_pointwise_nodes_match_nested_domainsÚ5NestedReduction._pointwise_nodes_match_nested_domains‚  s:   € ð  ×@Ñ@ØØØó
Ðð
 Ò$Ùà×4Ñ4°^ÓWÐWro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rp  r   rq  r¬  rš  ri   ú2list[tuple[SchedulerNode, PointwiseDomain]] | Nonerk   )rl   s   "rm   rn   rr  ›  s8   € ÷ "Fñ "Fà%ð"Fð (ð"Fð /ð	"Fð
 
<ñ"Fro   c                	ó  € . p\        4       pVP                  4        F1  pVP                  4       '       g   K  WVP                  4       ,          pK3  	  VP                  4        Ft  pVP                  4       '       d   K  WVP                  ,          '       g   K5  \        V\        4      '       g    R # VP                  W`P                  P                  34       Kv  	  V P                  VVP                  4       4      pVf   R # . VOVO# rr   )r   rá   rÛ   r<  r;  rs   rÚ   r  rŠ  rˆ  Ú!_classify_grouped_pointwise_nodes)r˜   rp  rq  r¬  Úouter_pointwise_domainsÚouter_reduction_namesr£  Úgrouped_pointwise_domainss   &&&&    rm   r®  Ú0NestedReduction._classify_nested_pointwise_nodesš  sé   € ð ð 	 ô
 2<³ÐØ×&Ñ&Ö(ˆBØ�‰× Ô Ø%×)?Ñ)?Ó)AÕAÒ%ñ )ð ×&Ñ&Ö(ˆBØ�‰× Ò ÙØ$§|¡|×3Ö3Ü! "¤m×4Ò4ÚØ'×.Ñ.Ø×,Ñ,×BÑBÐCöñ )ð %(×$IÑ$IØØ×"Ñ"Ó$ó%
Ð!ð %Ò,ÙØEÐ(ÐEÐ+DÐEÐEro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r¬  rš  ÚnodesúSequence[BaseSchedulerNode]ri   r´  rk   )rl   s   "rm   rn   rr  À  s(   € ÷ 5!ñ 5!à.ð5!ð +ð5!ð 
<ñ	5!ro   c                óÒ  € VP                   pVP                  4       p\        P                  P                  P                  VP                  VP                  ,          4      p. pV EF}  pVP                  4       '       d   K  \        V\        4      '       g    R# VP                  4       p\        WƒP                  ,          4      p	\        WGP                  ,          4      p
V	'       d   V
'       d    R# V	'       g   V
'       g    R# V	'       d   V P                  P                  MV P                  P                  pVP                   w  pw  rÜ\        P                  P                  P#                  WÑP                  4      '       d   V P                  P$                  pM5\        P                  P                  P#                  WÕ4      '       d   TpM R# VP'                  W~34       EK€  	  V# )a.  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)r“  r<  rd   ré   rê   rë   r•  r–  rÛ   rs   rÚ   r”   r;  rŠ  rˆ  r‰  rî   rí   r‡  r  )r˜   r¬  r¼  r“  Úreduction_namesÚ
full_numelr°  r£  Úsn_namesÚis_producerÚis_consumerÚfull_domainr~  Úsn_numelÚdomains   &&&            rm   r¶  Ú1NestedReduction._classify_grouped_pointwise_nodes¿  sz  € ð +×<Ñ<ÐØ+×?Ñ?ÓAˆÜ—W‘W×%Ñ%×.Ñ.Ø×(Ñ(¨>×+HÑ+HÕHó
ˆ
ð
 ð 	ô ˆBØ�‰× Ò ÙÜ˜b¤-×0Ò0Úà×-Ñ-Ó/ˆHÜ˜x×*EÑ*EÕEÓFˆKÜ˜·±Õ=Ó>ˆKßŸ{ò ß§{ò ÷ ð ×#Ñ#×9Ò9à×(Ñ(×4Ñ4ð ð
  "Ÿx™xÑˆA‰}�Ü�w‰w×Ñ×7Ñ7Ø×6Ñ6÷ò ð ×,Ñ,×4Ñ4‘Ü—‘×!Ñ!×9Ñ9¸(×OÒOØ$‘âØ×$Ñ$ b \×2ñA ðB !Ð ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r¬  rš  r°  z/Sequence[tuple[SchedulerNode, PointwiseDomain]]ri   r”   rk   )rl   s   "rm   rn   rr  ø  s)   € ÷ 
ñ 
à.ð
ð Kð
ð 
ñ	
ro   c                	ó~   a a€ \         ;QJ d     V V3R  lV 4       F  '       d   K   R# 	  R# ! V V3R  lV 4       4      # )c              3  óL   <"  € T F  w  rSP                  WS4      x € K  	  R # 5irr   )Ú_pointwise_domain_is_compatible)rv   r£  rÆ  r˜   r¬  s   &  €€rm   rx   ÚDNestedReduction._pointwise_domains_are_compatible.<locals>.<genexpr>ý  s*   øé € ð 
á/‘
�ð ×/Ñ/°¸N×KÐKÛ/ùó   ƒ!$FT)rà   )r˜   r¬  r°  s   ff&rm   r¯  Ú1NestedReduction._pointwise_domains_are_compatible÷  s@   ù€ ÷ ‹sõ 
á/ó
�sŒsð 	
Šsð 	
ˆsõ 
á/ó
ó 
ð 	
ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   r£  rÚ   rÆ  rŠ  r¬  rš  ri   r”   rk   )rl   s   "rm   rn   rr    s8   € ÷ Iñ IàðIð  ðIð /ð	Ið
 
ñIro   c                	ó,  € ^RI Hp VP                  P                  4       w  rVVP                  w  pw  rvW P
                  P                  J d   VP                  p\        V4      p	MáW P
                  P                  J dR   \        P                  P                  P                  VP                  VP                  ,          4      pVP                  p	MwW P
                  P                   Jd   \#        RV 24      h\        P                  P                  P                  VP                  VP                  ,          4      pVP$                  p	\        P                  P                  P'                  Wx4      ;'       d     VP)                  W‘P                  4       4      # )r�  ©Ú
SIMDKernelz!expected PARENT_FULL domain, got )Úcodegen.simdrÒ  r“  r¡  rî   rŠ  r‡  r•  rø   rˆ  rd   ré   rê   rë   r–  r˜  r‰  rŽ   r™  rí   Úis_compatible)
r˜   r£  rÆ  r¬  rÒ  r¦  r~  rÅ  Úexpected_numelÚexpected_groupss
   &&&&      rm   rË  Ú/NestedReduction._pointwise_domain_is_compatible  sB  € õ 	-à'×9Ñ9×DÑDÓF‰ˆØŸ8™8Ñˆ‰=ˆHØ×(Ñ(×0Ñ0Ó0Ø+×9Ñ9ˆNÜ49¸+Ó4F‰OØ×*Ñ*×@Ñ@Ó@ÜŸW™W×-Ñ-×6Ñ6Ø×,Ñ,¨~×/LÑ/LÕLóˆNð -×CÑC‰Oà×0Ñ0×<Ñ<Ó<Ü$Ð'HÈÈÐ%QÓRÐRÜŸW™W×-Ñ-×6Ñ6Ø×,Ñ,¨~×/LÑ/LÕLóˆNð -×?Ñ?ˆOÜ�w‰w×Ñ×7Ñ7Øó
÷ Ið Ià×&Ñ& ¿¹»ÓHð	Iro   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )rf   rp  r   Úouter_numelr”  Úouter_rnumelÚgrouped_axisr�  r¨  rµ   ri   r”   rk   )rl   s   "rm   rn   rr  !  sN   € ÷ %Wñ %Wà%ð%Wð  ð%Wð !ð	%Wð "ð%Wð ð%Wð 
ñ%Wro   c               	óD  € ^RI Hp \        V\        \        34      '       g   R# \
        P                  P                  '       d   VP                  4       MRp\        VP                  4       4      pVP                  VVVV4      p	\        V	4      \        R4      8w  d   R# \        P                  P                  P!                  V	R,          V4      '       d8   \        P                  P                  P!                  V	R,          V4      '       g   R# WPP#                  W„4      8„  # )r�  ©ÚSIMDSchedulingTNÚxÚr0_)rß  rà  )rÓ  rÞ  rs   rÚ   r  r.   rÌ   Úcoalesce_tiling_analysisÚget_coalesce_analysisrÈ   rá   Úselect_tilingr   rd   ré   rê   rí   Ú_max_min_block_group_size)
r˜   rp  rÙ  rÚ  rÛ  r¨  rÞ  Úcoalesce_analysisÚnode_scheduleÚtilings
   &&&&$$    rm   Ú"_min_block_unprofitable_for_kernelÚ2NestedReduction._min_block_unprofitable_for_kernel   sæ   € õ 	1ä˜*¤}Ô6HÐ&I×JÒJÙô �}‰}×5×5Ð5ð ×,Ñ,Ô.àð 	ô
 ˜Z×1Ñ1Ó3Ó4ˆØ×-Ñ-ØØØØó	
ˆô �fÓ¤¨LÓ!9Ô9Ùä�G‰G×Ñ×4Ñ4°V¸Cµ[À+×NÒNÜ—‘× Ñ ×8Ñ8¸À½È×UÒUáØ×9Ñ9¸-ÓVÑVÐVro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   ræ  r½  rÛ  r�  ri   rµ   rk   )rl   s   "rm   rn   rr  I  s(   € ÷ ,ñ ,à2ð,ð "ð,ð 
ñ	,ro   c                	óâ  € ^RI Hp V Uu. uFf  p\        V\        4      '       g   K  VP	                  4       '       g   K3  \        VP
                  \        4      '       g   KU  VP                  V4      NKh  	  ppW P                  P                  J dO   V'       dG   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   V P                  # V P                  # u upi )r�  ©ÚSIMDKernelFeaturesc              3  óD   "  € T F  q\         P                  J x € K  	  R # 5irr   )rJ   r1  )rv   Úhints   & rm   rx   Ú<NestedReduction._max_min_block_group_size.<locals>.<genexpr>Z  s   é € ÐL¹O°DœM×/Ñ/Õ/»Oùó   ‚ FT)Úcodegen.simd_kernel_featuresrí  rs   rÚ   rÛ   r¸   r   r0  r�  r�  rà   ÚMAX_INNER_R_GROUP_SIZEÚMAX_NON_INNER_GROUP_SIZE)r˜   ræ  rÛ  rí  r£  Úreduction_hintss   &&&   rm   rä  Ú)NestedReduction._max_min_block_group_sizeH  s»   € õ 	Eñ $ó
á#�Ü˜"œm×,ô 2ð —‘×!ô 2ô ˜2Ÿ7™7¤N×3ô	 2Ð×-Ñ-¨bÖ1Ù#ð 	ð 
ð ŸO™O×-Ñ-Ó-ßß“ÑL¹OÓL——’ÑL¹OÓL×LÒLà×-Ñ-Ð-Ø×+Ñ+Ð+ùò
s   ‹C,¨C,Á C,Á"C,c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rr  `  s(   € ÷ bñ bÐ.ð bÐ7Hð bÈTñ bro   c                ó¸  € V P                  W4      '       g   R# V P                  W4      '       g   \        R4      hTpTpVP                  w  rVVP                  w  rWVw  r‰Vw  r«\        P
                  P                  P                  W›4      '       d   R# V P                  WK4      pVf   R# \        P
                  P                  P                  W‰,          4      p\        P
                  P                  P                  W«,          4      p\        P
                  P                  P                  WÞ4      '       g   R# Vw  ppV P                  VVV	VVR7      pVf   R# VV P                  P                  J d   T	MTpVP                  4       w  pp\        V4      ^8X  dj   VV P                  P                  J d
   V^,          MV^ ,          p\        P
                  P                  P                  \        VV4      V4      '       g   R# MG\        P
                  P                  P                  \         P"                  ! VV4      ^ 4      '       g   R# \%        V4      p^V8:  d   \'        V4      '       g   R# V P)                  VVV	VVR7      '       d   R# VP                  4       w  ppV P+                  VV
V. VOVO5W‰3R7      pV P-                  VVV4      '       g   R# R# )zACheck whether a dependent cross-axis reduction pair can be fused.Fz9expected node1 and node2 to be a dependent reduction pair©rp  )rÛ  r¨  ©r“  r•  r–  r˜  r™  T)rz  ru  rŽ   rî   rd   ré   rê   rí   r©  rë   Úget_grouped_axisr�  r�  r¡  r÷   r(   r@  ÚModrµ   rL   rè  rš  r±  )r˜   rª   r«   rp  rq  r~  Úouter_groupÚgrouped_grouprÙ  rÚ  r•  r–  Úgrouped_reduction_infoÚouter_totalÚgrouped_totalr“  r¨  rÛ  Úparent_grouped_axisr¦  Úgrouped_axis_groupsÚgroup_size_intr§  r¬  s   &&&                     rm   rI  ÚNestedReduction.can_fuse_  sÅ  € ð
 ×"Ñ" 5×0Ò0Ùà×/Ñ/°×=Ò=Ü ØKóð ð ˆ
Øˆð $×)Ñ)‰ˆØ'×-Ñ-ÑˆØ$/Ñ!ˆØ(5Ñ%ˆÜ�7‰7×Ñ×3Ñ3°L×QÒQÙð "%×!DÑ!DØó"
Ðð "Ò)Ùô —g‘g×&Ñ&×/Ñ/°Õ0JÓKˆÜŸ™×(Ñ(×1Ñ1°-Õ2PÓQˆÜ�w‰w×Ñ×7Ñ7¸×SÒSÙà(>Ñ%Ð˜:à×+Ñ+ØØØØØ!ð ,ó 
ˆð ÒÙà(¨C¯O©O×,=Ñ,=Ó=‰LÀ;ð 	ð +×5Ñ5Ó7‰ˆ�QÜˆ{Ó˜qÔ à".°#·/±/×2CÑ2CÓ"C�˜A–ÈÐUVÍð  ô —7‘7×#Ñ#×;Ñ;ÜÐ,¨jÓ9Ð;N÷ò ñ ðô —‘×!Ñ!×9Ñ9Ü�IŠIÐ)¨:Ó6¸÷
ò 
ñ Ü˜Z›ˆØ�^Ô#¬°n×(EÒ(EÙØ×1Ñ1ØØØØ%Ø%ð 2÷ 
ò 
ñ Ø%6×%AÑ%AÓ%CÑ"ˆ�]Ø×3Ñ3Ø/Ø'Ø)Ø#A [Ð#A°=Ñ#AØ +Ð:ð 4ó 
ˆð ×8Ñ8ØØØ÷
ò 
ñ
 áro   rp  Nc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rf   r“  rÚ   rÙ  r”  rÚ  r¨  rp  úBaseSchedulerNode | Noneri   úGroupedAxis | Nonerk   )rl   s   "rm   rn   rr  Å  sF   € ÷ 1ñ 1à(ð1ð  ð1ð !ð	1ð
 ð1ð -ð1ð 
ñ1ro   c               ó\  € \         P                  P                  pVP                  4       w  rx\	        V4      ^8w  g   \	        V4      ^8w  dð   \	        V4      ^8X  dÞ   \	        V4      ^8X  dÎ   VP                  V^ ,          V4      '       g   R# VP                  \        W44      V^ ,          4      '       d/   VP                  V^4      '       d   V P                  P                  # VP                  \        W$4      ^4      '       d6   VP                  V^ ,          V4      '       d   V P                  P                  # R# VP                  V^ ,          V4      '       g   R# VP                  V^ ,          V4      '       d?   VP                  \        W44      V^,          4      '       d   V P                  P                  # VP                  V^,          V4      '       d?   VP                  \        W$4      V^ ,          4      '       d   V P                  P                  # Ve   V P                  WQ4      # R# )zAReturn which parent axis is split by the grouped local reduction.N)rd   ré   rê   r¡  r÷   rí   r(   r�  r�  rŽ  Ú _get_grouped_axis_from_loop_body)	r˜   r“  rÙ  rÚ  r¨  rp  rê   r¦  r§  s	   &&&&&$   rm   rû  Ú NestedReduction.get_grouped_axisÄ  sÕ  € ô —7‘7×#Ñ#ˆØ%6×%AÑ%AÓ%CÑ"ˆÜˆ{Ó˜qÔ ¤C¨Ó$6¸!Ô$;Ü�;Ó 1Ô$¬¨]Ó);¸qÔ)@Ø×7Ñ7¸ÀaÕ8HÈ*×UÒUÙð ×3Ñ3Ü˜\Ó6¸ÀA½÷ò à×6Ñ6°{ÀA×FÒFØŸ?™?×,Ñ,Ð,ð ×3Ñ3Ü˜[Ó5°q÷ò à×6Ñ6°{À1µ~À|×TÒTØŸ?™?×,Ñ,Ð,ÙØ×/Ñ/°¸aÕ0@À*×MÒMÙð ×+Ñ+Ø˜�N˜K÷
ò 
à×.Ñ.Ü�\Ó.°¸Aµ÷
ò 
ð —?‘?×$Ñ$Ð$à×+Ñ+Ø˜�N˜L÷
ò 
à×.Ñ.Ü�[Ó-¨{¸1­~÷
ò 
ð —?‘?×$Ñ$Ð$ØÒ!Ø×7Ñ7¸
ÓVÐVÙro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rp  r   r“  rÚ   ri   r  rk   )rl   s   "rm   rn   rr  ù  s)   € ÷ @ñ @Ø*ð@Ø?Lð@à	ñ@ro   c                ót  aaa€ ^ RI Ho VP                  4        Uu. uF  q3P                  4       '       g   K  VNK  	  pp\	        V4      ^8w  d   R# \
        P                  ! \        V^ ,          4      p\        VRR4      p\        VRR4      pVe   Vf   R# VP                  4       w  r‰VP                  4       w  r«\	        V	4      ^8w  g   \	        V4      ^8w  d   R# R V3R llp\	        VP                  4      ^8w  g   \	        VP                  4      ^8w  d   R# \	        VP                  4      \	        V4      8w  g$   \	        VP                  4      \	        V
4      8w  d   R# V! V4      pRpVP                  R	,          pV! V4      P                  4        EF  w  ppVP                  V4      pV'       g   K"  V Fî  pVP                  V4      oS^ 8X  d   K  V FË  oVP                  R	,          pSP                  V4      pSV8H  p\        ;QJ d*    VV3R lVP                   4       F  '       g   K   RM	  RM! VV3R lVP                   4       4      pVV8X  d   K…  V'       d   V P                   P"                  MV P                   P$                  pVe   VV8w  d      R# TpKÍ  	  Kð  	  EK  	  V# u upi )
z>Use LoopBody iter/reduce vars to disambiguate equal-size axes.rX  Nr\  c               ó    € V ^8„  d   QhRRRR/# )rf   ÚbodyrF   ri   zdict[str, list[sympy.Expr]]rk   )rl   s   "rm   rn   ÚFNestedReduction._get_grouped_axis_from_loop_body.<locals>.__annotate__  s   € ÷ 	ñ 	 Xð 	Ð2Mñ 	ro   c                ó  <€ \        \        4      pV P                  P                  SP                  R4       FO  pVP
                  f   K  WP
                  ,          P                  V P                  VP                  ,          4       KQ  	  V# ©Nrk   )	r   rÈ   r]  Úgetr^  r_  r  ra  r`  )r  ÚresultÚentryrY  s   &  €rm   Úload_exprs_by_nameÚLNestedReduction._get_grouped_axis_from_loop_body.<locals>.load_exprs_by_name  so   ø€ Ü2=¼dÓ2CˆFØ×*Ñ*×.Ñ.¨×/CÑ/CÀRÖH�Ø×$Ñ$Ô0Ø×,Ñ,Õ-×4Ñ4Ø×+Ñ+¨E×,<Ñ,<Õ=öñ Ið
 ˆMro   c              3  óL   <"  € T F  pSSP                  V4      8H  x € K  	  R # 5irr   )Úcoeff)rv   ÚvarÚgrouped_coeffÚouter_read_exprs   & €€rm   rx   ÚCNestedReduction._get_grouped_axis_from_loop_body.<locals>.<genexpr>,  s(   øé € ð 'á#7˜Cð &¨×)>Ñ)>¸sÓ)CÖCÛ#7ùrÍ  TFrZ  )r[  rY  rá   rÛ   r÷   ÚtypingÚcastrÚ   Úgetattrr¡  Úreduce_varsÚ	iter_varsÚitemsr  r  rB  r�  r�  rŽ  )r˜   rp  r“  r£  Ú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_varrt   Úgrouped_read_exprsÚouter_read_exprsÚgrouped_read_exprÚouter_reduce_varÚouter_reduce_coeffÚmatches_reductionÚmatches_iterÚ	candidaterY  r  r  s   &&&                      @@@rm   r
  Ú0NestedReduction._get_grouped_axis_from_loop_bodyø  sy  ú€ õ
 	>à)3×)=Ñ)=Ô)?ÓUÑ)? 2Ç?Á?×CTŸB˜BÑ)?ÐÐUÜÐÓ  AÔ%ÙÜ Ÿ+š+¤mÐ5EÀaÕ5HÓIˆÜ˜_¨g°tÓ<ˆ
ÜÐ0°'¸4Ó@ˆØÒ Ò!5Ùà1@×1KÑ1KÓ1MÑ.ÐØ5F×5QÑ5QÓ5SÑ2ÐÜÐ"Ó# qÔ(¬CÐ0EÓ,FÈ!Ô,KÙ÷	ð 	ô ˆz×%Ñ%Ó&¨!Ô+¬s°<×3KÑ3KÓ/LÐPQÔ/QÙÜˆz×#Ñ#Ó$¬Ð,=Ó(>Ô>Ä#Ø×"Ñ"óC
äÐ$Ó%ôC&ñ á0°Ó<ÐØ59ˆØ)×5Ñ5°bÕ9ÐÙ(:¸<Ó(H×(NÑ(N×(PÑ$ˆDÐ$Ø2×6Ñ6°tÓ<Ðß#ÙÛ%7Ð!Ø 1× 7Ñ 7Ð8JÓ K�Ø  AÔ%ÙÛ'7�OØ'1×'=Ñ'=¸bÕ'AÐ$Ø)8×)>Ñ)>Ð?OÓ)PÐ&Ø(5Ð9KÑ(KÐ%ß#&£3õ 'à#-×#7Ò#7ó'§3§3¢3õ 'à#-×#7Ò#7ó'ó $�Lð )¨LÔ8Ù ç->˜Ÿ™×)Ò)ÀCÇOÁO×DUÑDUð ð Ò)¨f¸	Ô.AÜ#Ø&’Fó! (8ô	 &8ñ	 )Qð2 ˆùòu Vs
   œJ5¸J5rk   )r¡   r¢   r£   r¤   r¹   ró  rô  rk  ru  rz  r¦   r�  r…  ÚEnumrŠ  r�  rÆ   Ú	dataclassrš  r©  r±  r®  r¶  r¯  rË  rè  rä  rI  rû  r
  r§   rk   ro   rm   rm  rm    s�  † ñð" !ÐØ"Ðàô
ó ð
ð ô	
ó ð	
ð ôNó ðNô"˜$Ÿ)™)ô "ô �d—i‘iô ð ×Ò $Ô'÷3ð 3ó (ð3ð ô&4ó ð&4ðP ôXó ðXð. ô"Fó ð"FðH ô5!ó ð5!ðn ô
ó ð
ð ôIó ðIð: ô%Wó ð%WðN ô,ó ð,ð, ôbó ðbðH ð1ð 04ö1ó ð1ðf ô@ó ô@ro   rm  c                  ó  € ] tR tRt$ R]R&   R]R&   R]R&   ]P                  ! ]R7      tR	]R
&   ]P                  ! ]	R7      t
R]R&   R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR#tR$# )%ÚSchedulerBufferi<  Ú	SchedulerÚ	schedulerz	ir.Bufferr¸   r  Údefining_oprÂ   úlist[NodeUser]ÚusersrG   Ú
mpi_bufferc               ó   € V ^8„  d   QhRR/# ©rf   ri   r   rk   )rl   s   "rm   rn   ÚSchedulerBuffer.__annotate__F  s   € ÷ ñ  #ñ ro   c                	óX   € V P                   pVf   \        R4      hVP                  4       # )Nzexpected op to be set)r=  rŽ   Úget_name)r�   Úops   & rm   Údefining_op_nameÚ SchedulerBuffer.defining_op_nameF  s*   € Ø×ÑˆØŠ:Ü Ð!8Ó9Ð9Ø�{‰{‹}Ðro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   r”   rk   )rl   s   "rm   rn   rC  L  s   € ÷ 'ñ ' $ñ 'ro   c                	ó.   € V P                   P                  # rr   )r¸   Úordering_onlyr�   s   &rm   Úis_ordering_onlyÚ SchedulerBuffer.is_ordering_onlyL  s   € Ø�y‰y×&Ñ&Ð&ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   rµ   rk   )rl   s   "rm   rn   rC  O  ó   € ÷ $ñ $˜#ñ $ro   c                	ó@   € \        V P                  P                  4      # rr   )Úhashr¸   rt   r�   s   &rm   Ú__hash__ÚSchedulerBuffer.__hash__O  s   € Ü�D—I‘I—N‘NÓ#Ð#ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rC  R  s   € ÷ $ñ $˜3ñ $ro   c                	ó²  € \        4       pV P                  4       pVP                  V R \        V P                  4      P
                   24       VP                  V RV P                  P                   24       V P                  4       '       d.   VP                  V R\        V P                  4       4       24       V P                  4       '       d.   VP                  V R\        V P                  4       4       24       \        V P                  4      ^8:  d1   VP                  V RV P                   24       VP                  4       # VP                  V R24       VP                  ^4      ;_uu_ 4        V P                   F  pVP                  V R24       K  	  RRR4       VP                  R4       VP                  4       #   + '       g   i     L1; i)	ú: z
.layout = z.aliases = z.mutations = z	.users = z
.users = [Ú,NÚ])r[   rE  Ú	writelinerÐ   r¸   r¡   ÚlayoutÚget_aliasesÚpformatÚget_mutationsr÷   r?  ÚindentÚgetrawvalue)r�   r  rt   Úusers   &   rm   Ú	debug_strÚSchedulerBuffer.debug_strR  s‚  € ÜÓ!ˆØ�}‰}‹ˆØ×Ñ˜D˜6 ¤D¨¯©£O×$<Ñ$<Ð#=Ð>Ô?Ø×Ñ˜D˜6 ¨D¯I©I×,<Ñ,<Ð+=Ð>Ô?Ø×Ñ×ÒØ×Ñ ˜v [´¸×9IÑ9IÓ9KÓ1LÐ0MÐNÔOØ×Ñ×ÒØ×Ñ ˜v ]´7¸4×;MÑ;MÓ;OÓ3PÐ2QÐRÔSäˆt�z‰z‹?˜aÔØ×Ñ ˜v Y¨t¯z©z¨lÐ;Ô<ð ×!Ñ!Ó#Ð#ð ×Ñ ˜v ZÐ0Ô1Ø—‘˜q×!Õ!Ø ŸJœJ�DØ×$Ñ$¨ v¨Q ZÖ0ñ '÷ "ð ×Ñ˜SÔ!Ø×!Ñ!Ó#Ð#÷	 "×!ús   Å5(GÇG	c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rC  f  rQ  ro   c                	ó6   € V P                   P                  4       # rr   ©r¸   rE  r�   s   &rm   rE  ÚSchedulerBuffer.get_namef  ó   € Ø�y‰y×!Ñ!Ó#Ð#ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   ÚNonerk   )rl   s   "rm   rn   rC  i  s   € ÷  ?ñ  ?˜$ñ  ?ro   c                	ór  € V P                   f   \        R4      hV P                   P                  4       '       g   R # V P                   P                  4       '       gY   V P                   P	                  4       '       g9   \        V P                   P                  4       \        P                  4      '       d6   \        P                  P                  P                  V P                   4       R # \        \        P                  R4      '       dü   V P                  4       \        P                  P                   9   dÏ   \        P                  P                   V P                  4       ,          pWP"                  P$                  9   d)   V P"                  P$                  V,          P                   pM'V P"                  P&                  V,          P                   p\        P                  P                  P)                  VV P                   4       R # \        P                  P                  P                  V P                   4       R # )Núexpected self.node to be setÚargs)r¸   rŽ   Úshould_allocateÚget_inputs_that_alias_outputÚget_mutation_namesrs   Úget_output_specr1   ÚCommBufferLayoutrd   ré   Úwrapper_codeÚcodegen_allocationÚhasattrÚkernelrE  Úinplace_update_buffersr<  Úname_to_donated_bufferÚname_to_bufÚcodegen_inplace_reuse)r�   Úinput_buffer_nameÚinput_buffers   &  rm   ÚallocateÚSchedulerBuffer.allocatei  si  € Ø�9‰9ÒÜ Ð!?Ó@Ð@Ø�y‰y×(Ñ(×*Ò*Ùð �I‰I×2Ñ2×4Ò4Ø�y‰y×+Ñ+×-Ò-Ü˜$Ÿ)™)×3Ñ3Ó5´r×7JÑ7J×KÒKä�G‰G× Ñ ×3Ñ3°D·I±IÔ>Ùô ”A—H‘H˜f×%Ò%Ø—‘“¤1§8¡8×#BÑ#BÔBô !"§¡× ?Ñ ?ÀÇÁÃÕ PÐØ §N¡N×$IÑ$IÔIØ#Ÿ~™~×DÑDØ%õ ç‘$ñ ð  $Ÿ~™~×9Ñ9Ð:KÕL×QÑQ�Ü�G‰G× Ñ ×6Ñ6ØØ—	‘	öô
 �G‰G× Ñ ×3Ñ3°D·I±IÖ>ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rC  ‹  s   € ÷ ñ ˜$ñ ro   c                	óF  € V P                   f   \        R4      h\        V P                   P                  \        P
                  4      '       g   \        V P                   4      '       d   R# V P                   F&  p\        VP                   \        4      '       g   K%   R# 	  R# )Nrn  FT)	r¸   rŽ   rs   r\  r1   rE   r_   r?  Ú
OutputNode)r�   Úuses   & rm   Úcan_freeÚSchedulerBuffer.can_free‹  ss   € à�9‰9ÒÜ Ð!?Ó@Ð@Ü�d—i‘i×&Ñ&¬¯©×6Ò6Ô:SØ�I‰I÷;
ò ;
ñ Ø—:”:ˆCÜ˜#Ÿ(™(¤J×/Ô/Úñ ñ ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r?  r>  ri   rl  rk   )rl   s   "rm   rn   rC  ˜  s   € ÷ +ñ +˜~ð +°$ñ +ro   c                	ó@  € / pV Fw  p\        VP                  4      V9   dD   VP                  V\        VP                  4      ,          4      V\        VP                  4      &   K`  W2\        VP                  4      &   Ky  	  \        VP	                  4       4      V n        R # rr   )Úidr¸   ÚmergerÈ   r	  r?  )r�   r?  r  r„  s   &&  rm   Ú	set_usersÚSchedulerBuffer.set_users˜  sm   € à&(ˆÛˆCÜ�#—(‘(‹|˜vÔ%Ø'*§y¡y°¼¸3¿8¹8»Õ1EÓ'F�”r˜#Ÿ(™(“|Ó$à'*”r˜#Ÿ(™(“|Ó$ñ	 ô
 ˜&Ÿ-™-›/Ó*ˆŽ
ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   zSequence[str]rk   )rl   s   "rm   rn   rC  ¢  s   € ÷ 8ñ 8˜]ñ 8ro   c                	óh   € V P                   f   \        R4      hV P                   P                  4       # ©Nrn  )r¸   rŽ   rq  r�   s   &rm   r]  ÚSchedulerBuffer.get_aliases¢  s+   € Ø�9‰9ÒÜ Ð!?Ó@Ð@Ø�y‰y×5Ñ5Ó7Ð7ro   c               ó   € V ^8„  d   QhRR/# rŽ  rk   )rl   s   "rm   rn   rC  §  s   € ÷ .ñ .˜}ñ .ro   c                	óh   € V P                   f   \        R4      hV P                   P                  4       # r�  )r¸   rŽ   rr  r�   s   &rm   r_  ÚSchedulerBuffer.get_mutations§  ó+   € Ø�9‰9ÒÜ Ð!?Ó@Ð@Ø�y‰y×+Ñ+Ó-Ð-ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   útorch.device | Nonerk   )rl   s   "rm   rn   rC  ¬  s   € ÷ 8ñ 8Ð/ñ 8ro   c                	óR   € V P                   P                  4       P                  4       # rr   )r¸   rs  rÏ   r�   s   &rm   rÏ   ÚSchedulerBuffer.get_device¬  s   € Ø�y‰y×(Ñ(Ó*×5Ñ5Ó7Ð7ro   )r?  N)r¡   r¢   r£   r¤   r¥   rÆ   rÇ   rÈ   r?  rG   r@  rG  rM  rT  rc  rE  r  r…  r‹  r]  r_  rÏ   r§   rk   ro   rm   r:  r:  <  s€   ‡ àÓØ
ƒOØ)Ó)Ø'×-Ò-¸dÔC€Eˆ>ÓCØ.9×.?Ò.?Ø3ô/€JÐ+ó õõ'õ$õ$õ($õ ?õDõ+õ8õ
.÷
8ñ 8ro   r:  c                  ó&   € ] tR tRt$ RtR]R&   RtR# )ÚSchedulerDonatedBufferi°  Nr  r=  rk   )r¡   r¢   r£   r¤   r=  r¥   r§   rk   ro   rm   rœ  rœ  °  s   ‡ à,0€KÐ)×0ro   rœ  c                  ó  € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   R]R&   R]R&   RtR]R&   R]R&   R]R&   RtR]R&   R]R&   R]R&   RtR]R&   R  R! ltR" R# lt	R$ R% lt
R& R' ltR( R) ltR* R+ ltR, R- ltR. R/ ltR0 R1 ltR2 R3 ltR4 R5 ltR6 R7 ltR8 R9 ltR: R; lt]R< R= l4       t]! R 4      R> R? l4       tR@ RA ltRB RC ltRD RE ltRF RG ltRH RI ltRJ RK ltRL RM lt RN RO lt!RP RQ lt"]RR RS l4       t#]RT RU l4       t$]RV RW l4       t%]RX RY l4       t&RZ R[ lt']R\ R] l4       t(R^ R_ lt)R` Ra lt*Rb Rc lt+Rd Re lt,Rf Rg lt-Rh Ri lt.Rj Rk lt/Rl Rm lt0Rn Ro lt1Rp Rq lt2Rr Rs lt3Rt Ru lt4Rv Rw lt5Rx Ry lt6R“Rz R{ llt7]R| R} l4       t8]R~ R l4       t9]R€ R� l4       t:R‚ Rƒ lt;R„ R… lt<]R† R‡ l4       t=Rˆ R‰ lt>]RŠ R‹ l4       t?RŒ R� lt@RŽ R� ltA]BR� R‘ l4       tCR’tDR# )”r   iµ  rj   r;  z7tuple[torch.device, tuple[tuple[sympy.Expr, ...], ...]]rî   Ú
last_usagerµ   Úmin_input_distanceÚmax_input_distanceÚ	min_orderÚ	max_orderrH   Ú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  rh   Úunmet_dependenciesFr”   Úwrittenc               ó    € V ^8„  d   QhRRRR/# )rf   r<  r;  ri   rl  rk   )rl   s   "rm   rn   ÚBaseSchedulerNode.__annotate__Ì  s   € ÷ 
ñ 
 )ð 
°ñ 
ro   c                	ó"   € Wn         R  V n        R# )c                 ó   € . # rr   rk   )ro  Úkwargss   *,rm   Ú<lambda>Ú,BaseSchedulerNode.__init__.<locals>.<lambda>Ï  s   € ¡Bro   N)r<  Údebug_device_str)r�   r<  s   &&rm   Ú__init__ÚBaseSchedulerNode.__init__Ì  s   € Ø$-Œá&ð 	Öro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   úir.Operationri   rl  rk   )rl   s   "rm   rn   r±  Ò  s   € ÷ #ñ # Lð #°Tñ #ro   c           	     	ó†  € Wn         \        4       V n        ^ V n        ^ V n        \        \
        ,          ! 4       V n        RV n        VP                  4        Uu. uF  p\        V P                  VV R7      NK  	  upV n        V P                   Uu/ uF  q3P                  4       VbK  	  upV n        / V n        R# u upi u upi )r   F)r<  r¸   r=  N)r¸   r   r;  rŸ  r   r   rž  r¯  Úget_outputsr:  r<  r¨  rE  rª  r¥  )r�   r¸   Úoutputrÿ   s   &&  rm   Ú_init_from_nodeÚ!BaseSchedulerNode._init_from_nodeÒ  sº   € ØŒ	Ü#›ˆŒØ"#ˆÔØ"#ˆÔÜ$Üö
ó ˆŒð ˆŒð ×*Ñ*Ô,ó
ñ -�ô ØŸ.™.ØØ ÷ñ
 -ñ
ˆŒð @D¿|º|ÓL¹|¸§¡£°Ò 3¹|ÑLˆÔð !#ˆÖùò
ùò  Ms   Á!B9ÂB>c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r±  ì  s   € ÷ Bñ B˜#ñ Bro   c                	óV   € \        V 4      P                   R V P                  4       : R2# )z(name=Ú)©rÐ   r¡   rE  r�   s   &rm   Ú__repr__ÚBaseSchedulerNode.__repr__ì  s'   € Ü�t“*×%Ñ%Ð& f¨T¯]©]«_Ñ,?¸qÐAÐAro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r±  ï  s   € ÷ *ñ *˜3ñ *ro   c                ó´  € V P                  4       p\        4       pVP                  V R\        V 4      P                   R\        \        V RR4      4      P                   RV R\        V P                  P                  4       RV R\        V P                  4       RV R	\        V P                  P                  V P                  ,
          4       RV R
V P                   RV RV P                   RV R24       VP                  4       ;_uu_ 4        V P                  4        F"  pVP                  VP                  4       4       K$  	  RRR4       VP!                  R4        VP                  V P#                  4       4       VP+                  4       P-                  4       #   + '       g   i     L_; i  \$         d    \&        P)                  RRR7        LUi ; i)ú#Longer form printout for trace logsrX  Ú(r¸   Nú)
ú
.writes = Ú
ú.unmet_dependencies = ú.met_dependencies = ú.min_input_distance = ú.max_input_distance = z.outputs = [
        rZ  úIgnoring error in debug_str()T©Úexc_info)rE  r[   ÚsplicerÐ   r¡   r   r^  r  Úwritesr®  r  rŸ  r   r`  r½  rc  r[  Údebug_str_extraÚ	ExceptionÚlogÚwarningra  Úrstrip)r�   rt   rÿ   r  s   &   rm   rc  ÚBaseSchedulerNode.debug_strï  s¨  € à�}‰}‹ˆÜÓˆØ�
‰
à€€bŒˆd‹×	Ñ	Ð˜Qœt¤G¨D°&¸$Ó$?Ó@×IÑIÐJð KØ€€j”˜×)Ñ)×0Ñ0Ó1Ð2ð 3Ø€ÐœW T×%<Ñ%<Ó=Ð>ð ?Ø€Ðœ7 4×#3Ñ#3×#9Ñ#9¸D×<SÑ<SÕ#SÓTÐUð VØ€Ð˜T×4Ñ4Ð5ð 6Ø€Ð˜T×4Ñ4Ð5ð 6Ø€ð 	ðô
	
ð �Z‰Z�\�\Ø×'Ñ'Ö)�Ø—
‘
˜3Ÿ=™=›?Ö+ñ *÷ ð 	�‰�cÔð	HØ�J‰J�t×+Ñ+Ó-Ô.ð �‰Ó ×'Ñ'Ó)Ð)÷ �\ûô ô 	HÜ�K‰KÐ7À$ˆKÖGð	Hús   Ä7FÅ"F2 ÆF/	Æ2"GÇGc               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r±  
  s   € ÷ ñ  ñ ro   c                	ó   € R # )Ú rk   r�   s   &rm   r×  Ú!BaseSchedulerNode.debug_str_extra
  s   € Ùro   c               ó   € V ^8„  d   QhRR/# )rf   ri   r  rk   )rl   s   "rm   rn   r±    s   € ÷ +ñ + yñ +ro   c                	ó$   € V P                  V 4      # rr   )r·  r�   s   &rm   Ú_debug_str_for_deviceÚ'BaseSchedulerNode._debug_str_for_device  s   € Ø×$Ñ$ TÓ*Ð*ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r±    s   € ÷ #ñ # ñ #ro   c                	óØ  € \        V P                  R R4      pRp\        V\        P                  P
                  P                  4      '       d,   RVP                  VP                  4       .RRR7      ,           pMm\        V\        P                  P
                  P                  4      '       d:   RVP                  VP                  4       VP                  4       .RRR7      ,           pV  V 2# )r/  Nrß  ú, F)ÚshortenÚ	multiline)r   r¸   rs   ÚtorchÚ	_inductorr1   r   Ú
str_helperÚget_sizeÚ	ReductionÚget_reduction_sizer7  )r�   Ú
maybe_dataÚdata_strs   &  rm   Údebug_str_shortÚ!BaseSchedulerNode.debug_str_short  sÑ   € Ü˜TŸY™Y¨°Ó5ˆ
ØˆÜ�j¤%§/¡/×"4Ñ"4×">Ñ">×?Ò?Ø˜j×3Ñ3Ø×$Ñ$Ó&Ð'°À%ð 4ó õ ‰Hô ˜
¤E§O¡O×$6Ñ$6×$@Ñ$@×AÒAØ˜j×3Ñ3Ø×.Ñ.Ó0°*×2OÑ2OÓ2QÐRØØð 4ó õ ˆHð
 �˜�zÐ"Ð"ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   r±    s   € ÷ 
ñ 
˜Tñ 
ro   c                	ór   € \         P                  R V V P                  V P                  P                  4       R# )z(%s: unmet_dependencies = %s, writes = %sN)rÙ  Úinfor®  r  rÖ  r�   s   &rm   Úlog_detailsÚBaseSchedulerNode.log_details  s,   € Ü�‰Ø6ØØ×#Ñ#Ø×Ñ×#Ñ#ö		
ro   c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   Úself_depr:   Ú	other_depri   r”   rk   )rl   s   "rm   rn   r±  '  s$   € ÷ ñ Ø!ðØ.7ðà	ñro   c                	ó   € R # ©Frk   )r�   rû  rü  s   &&&rm   Úreorder_loops_by_dep_pairÚ+BaseSchedulerNode.reorder_loops_by_dep_pair'  ó   € ñ ro   c               ó    € V ^8„  d   QhRRRR/# ©rf   Úrenamesr¤  ri   rl  rk   )rl   s   "rm   rn   r±  ,  s   € ÷ Mñ M¨Nð M¸tñ Mro   c                	ó  € R  V P                   P                  4        4        Uu/ uF  pW!9   g   K  W!V,          bK  	  upV n        V P                  V P                   P	                  V P                  4      4       R# u upi )c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   ©rt   ru   s   & rm   rx   Ú9BaseSchedulerNode.update_mutated_names.<locals>.<genexpr>/  s   é € ÐQÑ-P cŸžÓ-Pùó   ‚N)r  Úreads_and_writesr¥  Úset_read_writesÚrename)r�   r  rt   s   && rm   Úupdate_mutated_namesÚ&BaseSchedulerNode.update_mutated_names,  ss   € ñ R¨T×-=Ñ-=×-NÑ-NÔ-PÔQó!
áQ�Ø‰ô  ˆD˜$•-ÒÙQñ!
ˆÔð
 	×Ñ˜T×-Ñ-×4Ñ4°T×5JÑ5JÓKÖLùò!
s
   ¤A<±A<c               ó    € V ^8„  d   QhRRRR/# )rf   rw   r9   ri   rl  rk   )rl   s   "rm   rn   r±  4  s   € ÷ >ñ > ð >¨ñ >ro   c                	óZ   € V P                  V P                  P                  V4      4       R # rr   )r  r  Ú	with_read©r�   rw   s   &&rm   Úadd_fake_depÚBaseSchedulerNode.add_fake_dep4  s!   € Ø×Ñ˜T×-Ñ-×7Ñ7¸Ó<Ö=ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  7  s   € ÷ 
ñ 
¨$ñ 
ro   c                	ó¢   € \         ;QJ d*    R  V P                  4        4       F  '       g   K   R# 	  R# ! R  V P                  4        4       4      # )c              3  óp   "  € T F,  qP                  4       ;'       g    VP                  4       x € K.  	  R # 5irr   )r]  r_  ©rv   rÿ   s   & rm   rx   Ú=BaseSchedulerNode.has_aliasing_or_mutation.<locals>.<genexpr>8  s-   é € ð 
Ù@R¸�O‰OÓ×4Ð4 ×!2Ñ!2Ó!4Ô4Ó@Rùs   ‚6�6TF)rB  r½  r�   s   &rm   Úhas_aliasing_or_mutationÚ*BaseSchedulerNode.has_aliasing_or_mutation7  sO   € ß‹sñ 
Ø@D×@PÑ@PÔ@Ró
�sŒsð 	
Šsð 	
ˆsñ 
Ø@D×@PÑ@PÔ@Ró
ó 
ð 	
ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úrwr­  ri   rl  rk   )rl   s   "rm   rn   r±  <  s   € ÷ ñ Ð"9ð ¸dñ ro   c                	óˆ   € Wn         V P                   P                  V n        V P                  4        V P	                  4        R # rr   )r  r  r®  Ú"clear_read_writes_dependent_cachesÚ
prune_deps)r�   r  s   &&rm   r  Ú!BaseSchedulerNode.set_read_writes<  s2   € ØÔØ"&×"2Ñ"2×"8Ñ"8ˆÔØ×/Ñ/Ô1Ø�‰Öro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   r±  B  s   € ÷ <ñ <°Dñ <ro   c                	ó¤   € V P                   P                  V 4       \        P                  ! \        V P
                  4      P                  V 4       R # rr   )râ  Úclear_cacher  r  r   Ú
get_tilingr�   s   &rm   r  Ú4BaseSchedulerNode.clear_read_writes_dependent_cachesB  s3   € Ø×"Ñ"×.Ñ.¨tÔ4Ü�Š”C˜Ÿ™Ó)×5Ñ5°dÖ;ro   c               ó   € V ^8„  d   QhRR/# )rf   ri   zCoalesceVarAnalysis | Nonerk   )rl   s   "rm   rn   r±  G  s   € ÷ 0ñ 0Ð'Añ 0ro   c                	óZ   € ^RI Hp \        V \        \        34      '       g   R# V! V 4      # )r�  )Ú_analyze_memory_coalescingN)Útiling_utilsr)  rs   rÚ   r  )r�   r)  s   & rm   râ  Ú'BaseSchedulerNode.get_coalesce_analysisF  s&   € å<ä˜$¤Ô0BÐ C×DÒDÙÙ)¨$Ó/Ð/ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Únumelr”  rð   ri   údict[str, sympy.Expr]rk   )rl   s   "rm   rn   r±  O  s)   € ÷ Mñ MØðMØ)3ðMà	ñMro   c                	óN   € ^RI Hp VP                  V P                  4       W4      # )r�  rÝ  )rÓ  rÞ  rã  rá   )r�   r-  rð   rÞ  s   &&& rm   r%  ÚBaseSchedulerNode.get_tilingN  s!   € õ 	1à×+Ñ+¨D¯N©NÓ,<¸eÓLÐLro   c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   Úfuture_used_buffersrj   Úmutation_real_namer¤  ri   rl  rk   )rl   s   "rm   rn   r±  V  s$   € ÷ =ñ =Ø#2ð=ØHVð=à	ñ=ro   c                	ól   a€ V P                  4       p\        V3R  lV 4       4      pW1,
          V n        R# )c              3  óF   <"  € T F  pSP                  W4      x € K  	  R # 5irr   )r  )rv   Úkr4  s   & €rm   rx   Ú3BaseSchedulerNode.set_last_usage.<locals>.<genexpr>Z  s    øé € Ð!UÉÀ1Ð"4×"8Ñ"8¸×">Ð">Ëùó   ƒ!N)Úused_or_aliased_buffer_namesr   rž  )r�   r3  r4  Úused_bufferss   &&f rm   Úset_last_usageÚ BaseSchedulerNode.set_last_usageV  s-   ø€ ð ×8Ñ8Ó:ˆÜ!Ô!UÉÓ!UÓUˆØ&Õ<ˆŽro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   r±  ]  s   € ÷ ñ ˜$ñ ro   c                	óL   € V P                    F  pVP                  4        K  	  R # rr   )r¨  r  )r�   rÿ   s   & rm   Úmark_runÚBaseSchedulerNode.mark_run]  s   € Ø—<”<ˆCØ�L‰LŽNó  ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   rj   rk   )rl   s   "rm   rn   r±  a  s   € ÷ 
ñ 
 ?ñ 
ro   c                	ó    € \        R  \        P                  ! V P                  P                  V P                  P
                  4       4       4      # )c              3  ó:   "  € T F  pVP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   Ú6BaseSchedulerNode.used_buffer_names.<locals>.<genexpr>b  s   é € ð 
áW�ð �HŽHÛWùó   ‚)r   Ú	itertoolsÚchainr  r  rÖ  r�   s   &rm   r  Ú#BaseSchedulerNode.used_buffer_namesa  s?   € Üñ 
ä —’ t×'7Ñ'7×'=Ñ'=¸t×?OÑ?O×?VÑ?VÔWó
ó 
ð 	
ro   c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   r±  g  s   € ÷ ñ ¨oñ ro   c                ó‚  a€ \        4       o\        P                  ! V P                  P                  V P                  P
                  4       Uu. uF9  p\        V\        4      '       d   VP                  '       d   K-  VP                  NK;  	  pp\        V4      ^ 8”  d�   VP                  4       pSP                  V4       \        P                  P                  P!                  V4      '       g   Kb  VP#                  V3R l\        P                  P                  V,          P%                  4        4       4       K¬  S# u upi )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              3  ó:   <"  € T F  pVS9  g   K  Vx € K  	  R # 5irr   rk   )rv   ÚaliasÚ
used_namess   & €rm   rx   ÚABaseSchedulerNode.used_or_aliased_buffer_names.<locals>.<genexpr>y  s(   øé € ð ñ"5˜ð  JÑ.÷	 ’Eó"5ùs   ƒ	‘
)r   rH  rI  r  r  rÖ  rs   r<   Úis_fakert   r÷   ÚpopÚaddrd   ré   Úname_to_bufferr  Úextendrq  )r�   rw   rg   rO  s   &  @rm   r:  Ú.BaseSchedulerNode.used_or_aliased_buffer_namesg  sï   ø€ ô '1£lˆ
ô !—’ t×'7Ñ'7×'=Ñ'=¸t×?OÑ?O×?VÑ?VÔWó
áW�Ü˜s¤G×,Ò,°·µô ˆC�HŒHÙWð 	ð 
ô
 �$‹i˜!ŒmØ—(‘(“*ˆCØ�N‰N˜3ÔÜ�w‰w×%Ñ%×)Ñ)¨#×.Ô.Ø—‘ô ä!"§¡×!7Ñ!7Øõ"ç2Ñ2Ó4ð"5óö ð Ðùò!
s   Á*D<Á<D<c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   r±  ‚  s   € ÷ 
ñ 
˜Dñ 
ro   c                	óP   a € \        V 3R  lS P                   4       4      S n        R# )c              3  óv   <"  € T F.  pVP                   SP                  P                  9  g   K*  Vx € K0  	  R # 5irr   )rt   r<  Úavailable_buffer_names©rv   rw   r�   s   & €rm   rx   Ú/BaseSchedulerNode.prune_deps.<locals>.<genexpr>ƒ  s0   øé € ð -
á.�Ø�x‰x˜tŸ~™~×DÑDÑD÷ ŠCÛ.ùs   ƒ'9¯
9N©r   r®  r�   s   frm   r   ÚBaseSchedulerNode.prune_deps‚  s#   ø€ Ü",ô -
à×.Ò.ó-
ó #
ˆÖro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   r±  ‰  s   € ÷ Gñ G ñ Gro   c                	óÂ   a a€ R  V 3R llo\        V3R lS P                  P                   4       4      pS P                  S P                  P	                  V4      4       R# )c               ó    € V ^8„  d   QhRRRR/# ©rf   rw   r9   ri   r”   rk   )rl   s   "rm   rn   Ú7BaseSchedulerNode.prune_weak_deps.<locals>.__annotate__‹  s   € ÷ 	9ñ 	9˜cð 	9 dñ 	9ro   c                ó&  <€ \        V \        4      '       g   R # V P                  SP                  P                  9  d   R # SP                  P                  V P                  ,          P                  4       pV\        P                  P                  9   # rþ  )	rs   r<   rt   r<  r{  rG  rd   ré   Úremoved_operations)rw   Úop_namer�   s   & €rm   Úshould_pruneÚ7BaseSchedulerNode.prune_weak_deps.<locals>.should_prune‹  sb   ø€ Ü˜c¤7×+Ò+ÙØ�x‰x˜tŸ~™~×9Ñ9Ô9Ùà—n‘n×0Ñ0°·±Õ:×KÑKÓMˆGØœaŸg™g×8Ñ8Ñ8Ð8ro   c              3  óH   <"  € T F  pS! V4      '       g   K  Vx € K  	  R # 5irr   rk   ©rv   rw   rg  s   & €rm   rx   Ú4BaseSchedulerNode.prune_weak_deps.<locals>.<genexpr>”  s   øé € ð 
Ù1�C±\À#×5F�CŠCÓ1ùó   ƒ"˜
"N)r   r  r  r  Úremove_reads)r�   Ú	to_removerg  s   f @rm   Úprune_weak_depsÚ!BaseSchedulerNode.prune_weak_deps‰  sS   ù€ ÷	9ð 	9ô ô 
Ø×+Ñ+×1Ò1ó
ó 
ˆ	ð 	×Ñ˜T×-Ñ-×:Ñ:¸9ÓEÖFro   c               ó    € V ^8„  d   QhRRRR/# ©rf   Úname_to_fused_nodeúdict[str, BaseSchedulerNode]ri   rl  rk   )rl   s   "rm   rn   r±  ™  s    € ÷ Tñ TØ">ðTà	ñTro   c                	óF   € \        WV P                  P                  4       R # rr   )Ú_prune_redundant_depsr<  r{  )r�   rs  s   &&rm   Úprune_redundant_depsÚ&BaseSchedulerNode.prune_redundant_deps™  s   € ô 	˜d¸¿¹×8RÑ8RÖSro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r±  ž  s   € ÷ .ñ .˜#ñ .ro   c                	óh   € V P                   f   \        R4      hV P                   P                  4       # r�  )r¸   rŽ   Úget_operation_namer�   s   &rm   rE  ÚBaseSchedulerNode.get_namež  r•  ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r±  £  s   € ÷ ñ  ñ ro   c                	ó"   € V P                  4       # rr   ©rE  r�   s   &rm   Úget_first_nameÚ BaseSchedulerNode.get_first_name£  s   € Ø�}‰}‹Ðro   c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   r±  §  s   € ÷ Hñ H _ñ Hro   c                	óB   € \        R  V P                  4        4       4      # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r  ©rv   r¸   s   & rm   rx   Ú8BaseSchedulerNode.get_operation_names.<locals>.<genexpr>¨  s   é € ÐGÑ6F¨dŸ-™-Ÿ/˜/Ó6Fùó   ‚)r   rá   r�   s   &rm   r<  Ú%BaseSchedulerNode.get_operation_names¦  s   € äÑG°d·n±nÔ6FÓGÓGÐGro   c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   r±  «  s   € ÷ Bñ B /ñ Bro   c                	ó:   € \        R  V P                   4       4      # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r  ©rv   r  s   & rm   rx   Ú5BaseSchedulerNode.get_buffer_names.<locals>.<genexpr>¬  s   é € ÐA±L¨SŸ,™,Ÿ.˜.³Lùr‡  )r   r¨  r�   s   &rm   Úget_buffer_namesÚ"BaseSchedulerNode.get_buffer_namesª  s   € äÑA°D·L²LÓAÓAÐAro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  ¯  s   € ÷ 
ñ 
¨dñ 
ro   c                	ó¢   € \         ;QJ d*    R  V P                  4        4       F  '       d   K   R# 	  R# ! R  V P                  4        4       4      # )c              3  ól   "  € T F*  p\        V\        4      ;'       d    \        VR R7      x € K,  	  R# 5i)T)Údisallow_fp32_opsN©rs   rÚ   r3   ©rv   Úns   & rm   rx   ÚABaseSchedulerNode.can_codegen_in_low_precision.<locals>.<genexpr>°  s<   é € ð 
ñ &�ô �qœ-Ó(÷ Gð GÜ+¨AÀÔFôGã%ùs   ‚4ž4FT©rà   rá   r�   s   &rm   Úcan_codegen_in_low_precisionÚ.BaseSchedulerNode.can_codegen_in_low_precision®  sO   € ç‹sñ 
ð —^‘^Ô%ó
�sŒsð 	
Šsð 	
ˆsñ 
ð —^‘^Ô%ó
ó 
ð 	
ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  ·  s   € ÷ 
ñ 
¨Tñ 
ro   c                	ó¢   € \         ;QJ d*    R  V P                  4        4       F  '       d   K   R# 	  R# ! R  V P                  4        4       4      # )c              3  óh   "  € T F(  p\        V\        4      ;'       d    \        V4      x € K*  	  R # 5irr   r”  r•  s   & rm   rx   Ú@BaseSchedulerNode.can_codegen_without_upcasts.<locals>.<genexpr>¸  s/   é € ð 
á%�ô �qœ-Ó(×KÐKÔ-HÈÓ-KÔKÛ%ùs   ‚2ž2FTr˜  r�   s   &rm   r3   Ú-BaseSchedulerNode.can_codegen_without_upcasts¶  sK   € ç‹sñ 
à—^‘^Ô%ó
�sŒsð 	
Šsð 	
ˆsñ 
à—^‘^Ô%ó
ó 
ð 	
ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   r½  rk   )rl   s   "rm   rn   r±  ½  s   € ÷ ñ Ð6ñ ro   c                	ó   € V .# rr   rk   r�   s   &rm   rá   ÚBaseSchedulerNode.get_nodes½  s	   € Øˆvˆro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  Á  s   € ÷ 
ñ 
 ñ 
ro   c                	ó¢   € \         ;QJ d*    R  V P                  4        4       F  '       g   K   R# 	  R# ! R  V P                  4        4       4      # )c              3  óF  "  € T F—  p\        V\        4      ;'       d{    \        VP                  \        4      ;'       dY    \        VP                  P                  \
        P                  4      ;'       d#    VP                  P                  P                  R Jx € K™  	  R # 5irr   )rs   rÚ   r¸   r   r/  r1   rî  Ústrict_sum_rblockr…  s   & rm   rx   Ú3BaseSchedulerNode.has_strict_sum.<locals>.<genexpr>Â  s�   é € ð 
ñ
 )�ô	 �tœ]Ó+÷ =ð =Ü˜4Ÿ9™9¤nÓ5÷=ð =ä˜4Ÿ9™9Ÿ>™>¬2¯<©<Ó8÷=ð =ð —	‘	—‘×0Ñ0¸Ð<ô=ó )ùs   ‚B!ž!B!Á 5B!Á6+B!TF)rB  rá   r�   s   &rm   r:  Ú BaseSchedulerNode.has_strict_sumÀ  sO   € ç‹sñ 
ð
 Ÿ™Ô(ó
�sŒsð 	
Šsð 	
ˆsñ 
ð
 Ÿ™Ô(ó
ó 
ð 	
ro   c               ó   € V ^8„  d   QhRR/# )rf   ri   zSequence[SchedulerBuffer]rk   )rl   s   "rm   rn   r±  Ê  s   € ÷ ñ Ð6ñ ro   c                	ó   € V P                   # rr   )r¨  r�   s   &rm   r½  ÚBaseSchedulerNode.get_outputsÊ  s   € Ø�|‰|Ðro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úbuf_namer   ri   r:  rk   )rl   s   "rm   rn   r±  Í  s   € ÷ .ñ . 3ð .¨?ñ .ro   c                	ó(   € V P                   V,          # rr   )rª  )r�   r®  s   &&rm   Ú
get_outputÚBaseSchedulerNode.get_outputÍ  s   € Ø×#Ñ# HÕ-Ð-ro   c               ó   € V ^8„  d   QhRR/# r—  rk   )rl   s   "rm   rn   r±  Ð  s   € ÷ &ñ &Ð/ñ &ro   c                	óh   € V P                   f   \        R4      hV P                   P                  4       # r�  )r¸   rŽ   rÏ   r�   s   &rm   rÏ   ÚBaseSchedulerNode.get_deviceÐ  s+   € Ø�9‰9ÒÜ Ð!?Ó@Ð@Ø�y‰y×#Ñ#Ó%Ð%ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  Õ  s   € ÷ ;ñ ;˜ñ ;ro   c                	óX   € V P                  4       pVR J;'       d    VP                  R8H  # )NÚcpu)rÏ   rÐ   ©r�   Údevices   & rm   Úis_cpuÚBaseSchedulerNode.is_cpuÕ  s*   € Ø—‘Ó"ˆØ˜TÐ!×:Ð: f§k¡k°UÑ&:Ð:ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  Ù  s   € ÷ :ñ :˜ñ :ro   c                	ód   € V P                  4       pVR J;'       d    \        VP                  4      # rr   )rÏ   r^   rÐ   r¸  s   & rm   r^   ÚBaseSchedulerNode.is_gpuÙ  s*   € Ø—‘Ó"ˆØ˜TÐ!×9Ð9¤f¨V¯[©[Ó&9Ð9ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  Ý  ó   € ÷ ñ ˜dñ ro   c                	ó   € R # rþ  rk   r�   s   &rm   rÛ   ÚBaseSchedulerNode.is_reductionÝ  ó   € Ùro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  à  ó   € ÷ ñ  $ñ ro   c                	ó   € R # rþ  rk   r�   s   &rm   Úis_native_matmulÚ"BaseSchedulerNode.is_native_matmulà  rÃ  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  ã  s   € ÷ ñ ˜tñ ro   c                	ó   € R # rþ  rk   r�   s   &rm   Úis_split_scanÚBaseSchedulerNode.is_split_scanã  rÃ  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  æ  s   € ÷ ñ ˜Tñ ro   c                	ó   € R # rþ  rk   r�   s   &rm   Úis_templateÚBaseSchedulerNode.is_templateæ  rÃ  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  é  s   € ÷ ñ ˜4ñ ro   c                	ó   € R # rþ  rk   r�   s   &rm   Ú	is_externÚBaseSchedulerNode.is_externé  rÃ  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  ì  s   € ÷ ñ ˜Dñ ro   c                	ó   € R # rþ  rk   r�   s   &rm   Ú
is_foreachÚBaseSchedulerNode.is_foreachì  rÃ  ro   c               ó    € V ^8„  d   QhRRRR/# ©rf   Úread_depzdependencies.Depri   r”   rk   )rl   s   "rm   rn   r±  ï  s   € ÷ ñ Ð$4ð ¸ñ ro   c                	ó   € R # rþ  rk   ©r�   rÛ  s   &&rm   Úcan_inplaceÚBaseSchedulerNode.can_inplaceï  rÃ  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r±  ò  rÅ  ro   c                	ó   € R # rþ  rk   r�   s   &rm   Úhas_side_effectsÚ"BaseSchedulerNode.has_side_effectsò  rÃ  ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   r±  õ  s   € ÷ Oñ O tñ Oro   c           	     óh  a € ^RI Hp \        S \        4      '       dâ   \        P
                  '       dÌ   \        P                  P                  S P                  4       \        P                  4      '       dŠ   \        \        P                  \        P                  P                  P                   P"                  4      '       d   \%        \        P                  RR4      e!   \'        \        P                  R4      '       g   R# S P(                  \        P                  P*                  ,          S P,                  P.                  ,          pR V 3R llpS P1                  4        EFH  pVP2                  pVf   \5        R4      hVP7                  4       '       dˆ   VP9                  4       '       gr   VP;                  4       '       g\   VP=                  4       \        P                  P>                  9   g/   \        VPA                  4       \B        PD                  4      '       d   K¾  S PF                  PH                   EFo  pVPJ                  S P,                  PL                  9   d)   S P,                  PL                  VPJ                  ,          pM/S P,                  PN                  PQ                  VPJ                  4      pV'       g   KŠ  \        P                  PR                  PU                  VS 4      '       g   K¼  \        VPV                  \X        4      '       d   KÞ  VPZ                  f   \5        R4      hVPZ                   Uu. uF&  pVP2                  P=                  4       V9  g   K$  VNK(  	  p	pS P,                  P]                  VPJ                  S 4      p
S P,                  P_                  VPJ                  4      S P,                  P`                  PQ                  S 4      8g  pV
'       d   EK¯  V'       d   EKº  \c        V	4      ^8X  g   EKÍ  V	^ ,          Pd                  '       g   EKé  V	^ ,          P2                  S J g   EK  VP2                  f   EK  \        VP2                  PA                  4       \B        Pf                  \B        Ph                  \B        Pj                  \B        PD                  34      '       d   EK}  VPV                  '       dp   \        VPV                  P2                  \B        Pl                  \B        Pn                  34      '       d,   \c        VP2                  P9                  4       4      ^ 8”  d   EKþ  V! VP2                  VP2                  4      '       g   EK$  V! V4      '       g   EK5  \        P                  Pp                  Ps                  VP=                  4       VP=                  4       4       \        \        P                  \        P                  P                  P                   P"                  4      '       do   \        P                  Pt                  Pw                  VP=                  4       4       \        P                  Pt                  Pw                  VP=                  4       4       VP=                  4       \        P                  Px                  VP=                  4       &    EKF  	  EKK  	  R# u upi )	zf
Decide if there should be inplace updates for the node
and record the decision in the active kernel.
)Úcan_match_buffer_sizeÚ	mutationsNro  c               ó    € V ^8„  d   QhRRRR/# )rf   Úbuf_to_be_inplacedr:  ri   r”   rk   )rl   s   "rm   rn   Ú=BaseSchedulerNode.decide_inplace_update.<locals>.__annotate__  s   € ÷  	ñ  	¸?ð  	Ètñ  	ro   c                óò  <a€ V P                   P                  S4      pV P                  4       o\        4       pV P                   F¯  pVP
                  p\        V\        4      '       g   K'  VP                  4       V P                   P                  9  g    V P                   P                  V4      VJd   Kq  VV3R  lVP                  P                  4        4       ,          p\        V4      ^8”  g   K®   R# 	  R# )c              3  óN   <"  € T F  pVP                   S8X  g   K  Vx € K  	  R # 5irr   r  )rv   Úor®  s   & €rm   rx   Ú^BaseSchedulerNode.decide_inplace_update.<locals>.single_index_in_fused_node.<locals>.<genexpr>(  s&   øé € ð áE˜Ø—v‘v Ñ)÷ ’AÛEùs   ƒ%›
%FT)r<  Úget_fused_noderE  r   r?  r¸   rs   r   r€  rs  r  r
  r÷   )ré  Ú
fused_noderg   rb  Ú	user_noder®  r�   s   &    @€rm   Úsingle_index_in_fused_nodeÚKBaseSchedulerNode.decide_inplace_update.<locals>.single_index_in_fused_node  sÛ   ù€ ð
 ,×5Ñ5×DÑDÀTÓJˆJØ)×2Ñ2Ó4ˆHô %/£LˆDØ*×0Ô0�Ø ŸI™I�	Ü! )Ô->×?Ò?Ùð ×,Ñ,Ó.Ø-×7Ñ7×JÑJôKà)×3Ñ3×BÑBÀ9ÓMØ%ó&ñ àô à&×2Ñ2×CÑCÔEóõ �ô
 �t“9˜q–=Ú ñ' 1ñ* ro   zexpected buf_node to be setz"expected input_buf.users to be set)=Úcodegen.wrapperræ  rs   rÚ   r.   Úinplace_buffersrd   ré   Úhas_featurerÏ   r4   ÚINPLACE_BUFFERSrx  rê  rë  ÚcodegenÚsimdrÒ  r   rw  r;  re  r<  Úcompleted_operationsr½  r¸   rŽ   rp  rq  rr  rE  Úremoved_buffersrs  r1   rt  r  r  rt   rz  r{  r  ru  Ú	can_reuser=  ÚNopKernelSchedulerNoder?  Úhas_cross_stream_hazardÚget_buf_mempoolÚnode_to_mempoolr÷   rÞ  rE   rD   ÚMutationLayoutSHOULDREMOVEÚFallbackKernelrC   ro  Úmake_inplacerç  rS  ry  )r�   ræ  Úinconsequential_nodesrò  rÿ   Úbuf_nodeÚreadÚ	input_bufrß  Úremaining_usesrþ  Úhas_cross_mempool_hazards   f           rm   Údecide_inplace_updateÚ'BaseSchedulerNode.decide_inplace_updateõ  s�  ø€ õ
 	;ô �tœ]×+Ò+Ü×&×&Ð&Ü—‘×#Ñ# D§O¡OÓ$5´~×7UÑ7U×VÒVäœqŸx™x¬¯©×)@Ñ)@×)EÑ)E×)PÑ)P×QÒQÜœ1Ÿ8™8 [°$Ó7ÒCô œŸ™ &×)Ò)áð �N‰NÜ�g‰g×(Ñ(õ)à�n‰n×1Ñ1õ2ð 	÷ 	ð  	ðD ×#Ñ#×%ˆCØ—x‘xˆHØÒÜ$Ð%BÓCÐCà×,Ñ,×.Ò.Ø×8Ñ8×:Ò:Ø×.Ñ.×0Ò0Ø—<‘<“>¤Q§W¡W×%<Ñ%<Ô<ô ˜h×6Ñ6Ó8¼"×:MÑ:M×NÒNáà×(Ñ(×.Õ.�à—9‘9 §¡× EÑ EÔEØ $§¡× EÑ EÀdÇiÁiÕ P‘Ià $§¡× :Ñ :× >Ñ >¸t¿y¹yÓ I�I÷ ‘IÜŸ™×,Ñ,×6Ñ6°yÀ$×GÔGÜ& y×'<Ñ'<Ô>T×UÔUà —‘Ò.Ü,Ð-QÓRÐRð "+§¢ó&á!0˜AØŸ6™6Ÿ?™?Ó,Ð4IÑI÷ ˜Ù!0ð #ð &ð
 /3¯n©n×.TÑ.TØŸ	™	 4ó/Ð+ð 04¯~©~×/MÑ/MØŸ	™	ó0àŸ™×7Ñ7×;Ñ;¸DÓAñ0BÐ,÷
 4Ò3ß 8Ò 8Ü Ó/°1×4Ø*¨1Õ-×9×9Ó9Ø*¨1Õ-×2Ñ2°dÖ:Ø%ŸN™NÕ6Ü *Ø%ŸN™N×:Ñ:Ó<ä "§¡Ü "× 4Ñ 4Ü "× =Ñ =Ü "× 3Ñ 3ð	÷!õ !ð &×1×1Ð1Ü *Ø )× 5Ñ 5× :Ñ :Ü!#×!2Ñ!2´B·N±NÐ C÷!ò !ô !$ I§N¡N×$OÑ$OÓ$QÓ RÐUV× Vá1°)·.±.À#Ç(Á(×KÕKÙ6°y×AÕAô
 Ÿ™Ÿ™×2Ñ2°9×3EÑ3EÓ3GÈÏÉËÔXä%ÜŸH™H¤e§o¡o×&=Ñ&=×&BÑ&B×&MÑ&M÷ò ô ŸH™H×.Ñ.×2Ñ2°9×3EÑ3EÓ3GÔHÜŸH™H×.Ñ.×2Ñ2°3·<±<³>ÔBð &×.Ñ.Ó0ô Ÿ™×7Ñ7¸¿¹»ÑGó ôG /ó &ùò:&s   Ì9!Z/ÍZ/c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Úbufferr[   Ú	only_oncer”   ri   rl  rk   )rl   s   "rm   rn   r±  †  s$   € ÷ .ñ .Ø$ð.Ø15ð.à	ñ.ro   c                	óØ  € \         P                  '       g   R # V'       d   V P                  '       d   R # V P                  f   \	        R4      hV P                  P                  4       p. pV EFO  pVP                  R8X  d   K  VP                  R4       VP                  R4       RVP                   RVP                   2pRVP                  9   d   VRVP                  R,           2,           pVP                  V4       R	VP                  9   g   K§  VP                  R	,           pVP                  R
^R7      R,          pVP                  RVP                  RR4      P                  RR4      P                  RR4      P                  RR4      ,           4       VP                  R4       VP                  R4       EKR  	  \        V4      ^ 8X  d   R # VP                  V4       RV n        R # )Nrn  r¾  rß  z#pragma CMT ORIGIN:z#pragma CMT Ú Úseq_nrz seq_nr:Ústack_traceÚ|)ÚmaxsplitÚ{z{{Ú}z}}rÍ  Ú\z\\z#pragma CMT END ORIGINTrZ  )r.   Úcomment_originr¯  r¸   rŽ   Úget_originsrF  r  ÚtargetÚmetaÚrsplitÚreplacer÷   Ú
writelines)	r�   r  r  ÚoriginsÚ	out_linesrí  Úop_info_strr  Ústack_trace_last_lines	   &&&      rm   Úcodegen_originating_infoÚ*BaseSchedulerNode.codegen_originating_info†  sŸ  € ô ×$×$Ð$Ùç˜ŸŸ˜ÙØ�9‰9ÒÜ Ð!?Ó@Ð@Ø—)‘)×'Ñ'Ó)ˆØˆ	äˆAØ�t‰t�xÔáà×Ñ˜RÔ à×ÑÐ2Ô3Ø(¨¯©¨¨a°·±¨zÐ:ˆKØ˜1Ÿ6™6Ô!Ø)¨h°q·v±v¸hÕ7GÐ6HÐ,IÕI�Ø×Ñ˜[Ô)Ø §¡Ö&Ø!"§¡¨Õ!6Ð 7�Ø(3×(:Ñ(:¸3ÈÐ(:Ó(KÈBÕ(OÐ%Ø× Ñ Ø"Ø+×3Ñ3°C¸Ó>ß‘W˜S $Ó'ß‘W˜T 4Ó(ß‘WØ˜fóõ	ôð × Ñ Ð!9Ô:Ø× Ñ  ×$ñ3 ô6 ˆy‹>˜QÔÙð 	×Ñ˜)Ô$ØˆŽro   c               ó   € V ^8„  d   QhRR/# rP  rk   )rl   s   "rm   rn   r±  ·  s   € ÷ 
ñ 
¨cñ 
ro   c                	ó(   € V P                  R R R7      # )T©Úinclude_readsÚinclude_writes©Ú!get_read_write_buffers_sizes_implr�   s   &rm   Úget_read_write_buffers_sizesÚ.BaseSchedulerNode.get_read_write_buffers_sizes¶  s   € à×5Ñ5Ø¨tð 6ó 
ð 	
ro   c               ó   € V ^8„  d   QhRR/# rP  rk   )rl   s   "rm   rn   r±  ½  s   € ÷ 
ñ 
 sñ 
ro   c                	ó(   € V P                  R RR7      # )TFr'  r*  r�   s   &rm   Úget_read_buffer_sizesÚ'BaseSchedulerNode.get_read_buffer_sizes¼  s   € à×5Ñ5Ø¨uð 6ó 
ð 	
ro   c               ó   € V ^8„  d   QhRR/# rP  rk   )rl   s   "rm   rn   r±  Ã  s   € ÷ 
ñ 
¨ñ 
ro   c                	ó(   € V P                  R RR7      # )FTr'  r*  r�   s   &rm   Úget_write_buffer_sizesÚ(BaseSchedulerNode.get_write_buffer_sizesÂ  s   € à×5Ñ5Ø°ð 6ó 
ð 	
ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r(  r”   r)  ri   rµ   rk   )rl   s   "rm   rn   r±  È  s$   € ÷ 
ñ 
Ø!ð
Ø37ð
à	ñ
ro   c                	óX   € \        V P                  WR 7      P                  4       ^ R7      # )r'  )Ústart)r5  Úget_read_write_buffer_accessesr	  )r�   r(  r)  s   &&&rm   r+  Ú3BaseSchedulerNode.get_read_write_buffers_sizes_implÈ  s1   € ô Ø×/Ñ/Ø+ð 0ó ç‰f‹hØô	
ð 	
ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r(  r”   r)  ri   zdict[str, int]rk   )rl   s   "rm   rn   r±  Ò  s)   € ÷ O!ñ O!Ø!ðO!Ø37ðO!à	ñO!ro   c                ó  a aaaaa€ \        S \        4      '       d   / # \        S \        4      '       d#   \        S P                  \        4      '       d   / # \        S \        4      '       di   \        S P                  \
        P                  4      '       d?   S P                  P                  \        P                  P                  P                  J d   / # R R lo\        S \        4      '       dM   S! \        S P                  4       ^ ,          4      \        S P                  4       ^,          4      ,          4      oM\        R4      o\         P"                  ! \$        4      pV'       d?   S P&                  P(                   F$  pW4P*                  ,          P-                  V4       K&  	  V'       d?   S P&                  P.                   F$  pW4P*                  ,          P-                  V4       K&  	  V'       d'   \1        R S P&                  P(                   4       4      M	\1        4       pV'       d'   \1        R S P&                  P.                   4       4      M	\1        4       pR V 3R llo\        S \2        4      '       d'   \1        VV 3R lV 4       4      pWg,
          pWW,
          p/ pWV,           FÖ  p	\5        V3R	 lW9,           4       4      oV	\6        P8                  P:                  9   d#   \6        P8                  P:                  V	,          p
MCV	\6        P8                  P<                  9   d#   \6        P8                  P<                  V	,          p
MK¢  R
 VVV V3R lloS! V
4      pW˜9  d   W¸V	&   KÂ  W‰;;,          V,          uu&   KØ  	  V# )aâ  
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.
c               ó    € V ^8„  d   QhRRRR/# )rf   Úsr”  ri   rµ   rk   )rl   s   "rm   rn   ÚFBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.__annotate__ü  s   € ÷ 	Eñ 	E˜Zð 	E¨Cñ 	Ero   c                óX   € \         P                  P                  P                  V ^ R7      # r  )rd   ré   rê   r"  )r>  s   &rm   Útry_size_hintÚGBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.try_size_hintü  s"   € Ü—7‘7×#Ñ#×5Ñ5°aÀ!Ð5ÓDÐDro   ç    eÍÍAc              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   ÚCBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.<genexpr>  s   é € ÐBÑ+A C—x–xÓ+Aùr	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   rE    ó   é € ÐCÑ+B C—x–xÓ+Bùr	  c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rÿ   r   r  r½  ri   r”   rk   )rl   s   "rm   rn   r?    s"   € ÷ 	:ñ 	: ð 	:Ð.Ið 	:Èdñ 	:ro   c                ó²   <€ SP                   P                  V ,          P                  p\        R  V 4       4      p\	        V\        V4      ,
          4      ^ 8„  # )c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   râ   )rv   rb  s   & rm   rx   Ú\BaseSchedulerNode.get_read_write_buffer_accesses.<locals>.is_materialized.<locals>.<genexpr>  s   é € Ð!>¹°§)¦)»ùr	  )r<  r{  r?  r   r÷   )rÿ   r  r?  Úbuf_usesr�   s   &&  €rm   Úis_materializedÚIBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.is_materialized  sG   ø€ Ø—N‘N×.Ñ.¨sÕ3×9Ñ9ˆEÜ!Ñ!>¹Ó!>Ó>ˆHÜ�x¤*¨VÓ"4Õ4Ó5¸Ñ9Ð9ro   c              3  ó^   <"  € T F"  pS! VSP                   4      '       d   K  Vx € K$  	  R # 5irr   ©r  )rv   rw   rM  r�   s   & €€rm   rx   rE  !  s#   øé € ð )Ù%˜©_¸SÀ$Ç+Á+×-N—’›vùs   ƒ-£
-c              3  ó(   <"  € T F  pSx € K	  	  R # 5irr   rk   )rv   rw   Ú
node_numels   & €rm   rx   rE  *  s   øé € Ð$RÑ;Q°C¥ZÓ;Qùs   ƒc               ó    € V ^8„  d   QhRRRR/# )rf   rÿ   z4ir.Buffer | ir.TensorBox | ir.TorchBindObject | Noneri   rµ   rk   )rl   s   "rm   rn   r?  3  s   € ÷ &ñ &ØIð&àñ&ro   c                óÐ  <€ V '       g   ^ # \        V \        P                  4      '       d   V P                  4       # \        V P                  \
        4      '       d÷   SP                  P                  V P                  4       ,          P                  p^ pV F·  p\        VP                  \        4      '       d   K%  \        VP                  \        4      '       g   \        R4      h\        VP                  P                  \        4      '       d=   VP                  P                  4        F  pVS! VP                  4      ,          pK  	  K¶   ^ # 	  V# \        V P                  \        P                   4      '       d$   \#        V3R lV P%                  4        4       4      # S	! \'        V P)                  4       4      4      p\+        V P-                  4       4      \/        SV4      ,          # )r   ú,expected user.node to be a BaseSchedulerNodec              3  ón   <"  € T F*  pS! \         P                  P                  V4      4      x € K,  	  R # 5irr   )rd   ré   Ú
get_buffer)rv   Úmut_nameÚget_buf_bytess   & €rm   rx   ÚZBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.get_buf_bytes.<locals>.<genexpr>Q  s/   øé € ð á(@˜Hñ &¤a§g¡g×&8Ñ&8¸Ó&B×CÐCÛ(@ùs   ƒ25)rs   r1   ÚTorchBindObjectrY  r\  rD   r<  r{  rE  r?  r¸   rƒ  r   rŽ   rC   r½  rE   r5  rr  rb   rí  rW   Ú	get_dtyperŸ  )
rÿ   r?  Útotrb  Ú	sched_bufÚ	buf_elemsÚbuf_accessed_elemsrY  r�   rA  s
   &     €€€€rm   rY  ÚGBaseSchedulerNode.get_read_write_buffer_accesses.<locals>.get_buf_bytes3  sg  ø€ ÷ Ùä˜c¤2×#5Ñ#5×6Ò6Ø×,Ñ,Ó.Ð.Ü §
¡
Ô,=×>Ò>ð !ŸN™N×6Ñ6°s·|±|³~ÕF×LÑL�EØ�CÛ %˜Ü% d§i¡i´×<Ò<Ù$Ü)¨$¯)©)Ô5F×GÒGÜ"0Ø Nó#ð ô & d§i¡i§n¡n´k×BÒBØ-1¯Y©Y×-BÑ-BÖ-D 	Ø #¡}°Y·^±^Ó'DÕ D¢ó .Eò $%ñ !&ð �JÜ §
¡
¬B¯M©M×:Ò:Üô à(+×(>Ñ(>Ô(@óó ð ñ
 !.¬m¸C¿L¹L»NÓ.KÓ L�IÜ)¨#¯-©-«/Ó:¼SØ*¨Ió>õ ð ro   )rs   rý  ÚExternKernelSchedulerNoder¸   rC   r1   r  Úop_overloadrê  Ú_primsÚ	rng_primsÚgraphsafe_run_with_rng_staterÚ   rb   r¡  rµ   Úcollectionsr   rÈ   r  r  rt   r  rÖ  r   r  r5  rd   ré   rT  Úgraph_inputs)r�   r(  r)  Úbuf_accessesrw   r  rÖ  rû  Úbuf_byte_accessesr®  rÿ   Ú	buf_bytesr`  rY  rM  rR  rA  s   f&&         @@@@@rm   r9  Ú0BaseSchedulerNode.get_read_write_buffer_accessesÒ  s¦  ý€ ô6 �dÔ2×3Ò3ØˆIÜ�dÔ5×6Ò6¼:Ø�I‰I”{÷<
ò <
ð ˆIä�tÔ6×7Ò7Ü˜4Ÿ9™9¤b×&7Ñ&7×8Ò8Ø—	‘	×%Ñ%Ü�|‰|×%Ñ%×BÑBóCð ˆIõ	Eô �dœM×*Ò*Ù&Ü˜dŸo™oÓ/°Õ2Ó3Ü §¡Ó 1°!Õ 4Ó5õ6ó‰Jô
 ˜S›ˆJÜ"×.Ò.¬tÓ4ˆçØ×'Ñ'×-Ô-�ØŸX™XÕ&×-Ñ-¨cÖ2ñ .÷ Ø×'Ñ'×.Ô.�ØŸX™XÕ&×-Ñ-¨cÖ2ñ /÷
 ô ÑB¨4×+;Ñ+;×+AÒ+AÓBÔBä“ð 	÷ ô ÑC¨4×+;Ñ+;×+BÒ+BÓCÔCä“ð 	÷	:ð 	:ô
 �dÔ.×/Ò/Ü(õ )Ù%ó)ó ˆOð Õ-ˆFØÕ+ˆEà,.ÐàŸ˜ˆHÜ!$Ô$R¸<Ö;QÓ$RÓ!RÐàœ1Ÿ7™7×1Ñ1Ô1Ü—g‘g×,Ñ,¨XÕ6‘ØœQŸW™W×1Ñ1Ô1Ü—g‘g×*Ñ*¨8Õ4‘á÷&ó &ñP & cÓ*ˆIØÔ0Ø.7 (Ó+à!×+¨yÕ8Õ+ñm 'ðp !Ð ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   ú
int | Nonerk   )rl   s   "rm   rn   r±  d  s   € ÷ ñ  
ñ ro   c                	óŠ  € V P                   f   R # V P                   P                  4       pVf   R # \        V4      pVf   R # \        V\        P
                  4      '       d   VP                   P                  p\        P                  P                  P                  V^ R7      p\        R,          R;;,          V,          uu&   V# )Nr   ÚinductorÚ
flop_count)r¸   Úget_origin_noder?   rs   rê  ÚSymIntÚexprrd   ré   rê   r"  r   )r�   Úfx_nodeÚflopsÚresolved_flopss   &   rm   Úestimate_flopsÚ BaseSchedulerNode.estimate_flopsc  s“   € à�9‰9ÒÙØ—)‘)×+Ñ+Ó-ˆØŠ?Ùä˜wÓ'ˆØŠ=Ùä�eœUŸ\™\×*Ò*Ø—J‘J—O‘OˆEäŸ™×)Ñ)×;Ñ;¸EÈAÐ;ÓNˆÜ�Õ˜\×*¨nÕ<Ó*ØÐro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   Úfloatrk   )rl   s   "rm   rn   r±  v  s   € ÷ -ñ - uñ -ro   c                	óV   € V P                   e   V P                   # V P                  4       # rr   )r¬  Ú_get_estimated_runtimer�   s   &rm   Úget_estimated_runtimeÚ'BaseSchedulerNode.get_estimated_runtimev  s)   € Ø×*Ñ*Ò6Ø×2Ñ2Ð2à×*Ñ*Ó,Ð,ro   c               ó   € V ^8„  d   QhRR/# r|  rk   )rl   s   "rm   rn   r±  }  s   € ÷ Wñ W¨ñ Wro   c                óÒ  € V P                  4       ^ ,          P                  4       ^ ,          pVP                  P                  4       p\	        \        V4      4      '       g   ^ # \        V P                  4      '       dç   \        V P                  \        P                  4      '       g   \        R4      h \        P                  '       d†   \        V 4      p\        4       pVP                  V4      pVe$   \        V\         4      '       g   \        R4      hV# \#        V 4      pVf   \%        V P                  4      pVP'                  W6R7       V# \%        V P                  4      # \1        V P                  4      '       d   ^ # \3        V 4      pVe   V# VP                  P5                  4       p	 \7        4       p
\9        V	4      R
,          pV
^ 8:  d   \        RV
 24      hV^ 8:  d   \        RV 24      h T P=                  4       pT^ 8X  g   Tf#   T P?                  4       T
,          pTR,          pT# RpT P?                  4       pTf   ^ MTpYì,          T,          R	,          pYú,          p\A        TT4      pTR,          pT#   \(         d!   p\*        P-                  T4        Rp?^ # Rp?i\.         d!   p\*        P-                  T4        Rp?^ # Rp?ii ; i  \:         d     ^ # i ; i)z3
Returns estimated op runtime in milliseconds (ms)
z%expected self.node to be an ir.IRNodeNú expected cache_val to be a float©Úvaluez-gpu_memory_bandwidth cannot be <= 0, but got z"gpu_flops cannot be <= 0, but got g    €„.Ag      ð?rC  l    J)£)!rá   r½  r¸   rs  r^   rA   r\   rs   r1   ÚIRNoderŽ   r/   Ú,runtime_estimations_use_nccl_lib_estimationsÚ)get_estimate_runtime_cache_key_from_snodeÚget_estimate_runtime_cacheÚlookupr}  r8   r7   Ú	set_valueÚ
ValueErrorrÙ  rö  Ú	TypeErrorra   Ú maybe_estimate_runtime_benchmarkÚmaybe_get_dtyperX   rV   rØ  ry  r,  rž  )r�   rÿ   r\  Ú	cache_keyÚcacheÚ	cache_valÚmsrf  ÚretÚdtypeÚgpu_memory_bandwidthÚ	gpu_flopsÚ	flops_estÚnsÚfactorÚcounted_bytesÚcompute_timeÚtransfer_times   &                 rm   r  Ú(BaseSchedulerNode._get_estimated_runtime|  sŽ  € ð
 �n‰nÓ˜qÕ!×-Ñ-Ó/°Õ2ˆØ—‘×)Ñ)Ó+ˆÜ”o fÓ-×.Ò.áô ˜Ÿ™×#Ò#Ü˜dŸi™i¬¯©×3Ò3Ü$Ð%LÓMÐMðÜ×L×LÐLÜ IÈ$Ó O�IÜ6Ó8�EØ %§¡¨YÓ 7�IØ Ò,Ü)¨)´U×;Ò;Ü"0Ð1SÓ"TÐTØ(Ð(äHÈÓN�BØ’zä=¸d¿i¹iÓH˜à—O‘O I�OÔ8Ø�IÜ7¸¿	¹	ÓBÐBô �T—Y‘Y×Òñ
 ä.¨tÓ4ˆØŠ?ØˆJà—‘×(Ñ(Ó*ˆð	Ü#4Ó#6Ð Ü)¨%Ó0°6Õ9ˆIð $ qÔ(Ü$ØCÐDXÐCYÐZóð ð ˜AŒ~Ü$Ð'IÈ)ÈÐ%UÓVÐVð ð
 ×'Ñ'Ó)ˆ	à˜Œ>˜YÒ.à×2Ñ2Ó4Ð7KÕKˆBØ�c•ˆBØˆIð ˆØ×9Ñ9Ó;ˆØ*Ò2™¸ˆØÕ*¨YÕ6¸#Õ=ˆØ%Õ<ˆô �˜}Ó-ˆØ�#�XˆØˆ	øôo ô ô —‘˜”ÝûÜô ä—‘˜”Ýûðûô: ô 	Úð	úsP   Â4J  Ã
AJ  Ä7J  ÅJ  Æ-AK Ê KÊJ&Ê&KÊ3KÊ4KËKËK&Ë%K&c               ó   € V ^8„  d   QhRR/# ©rf   ri   zir.TemplateBuffer | Nonerk   )rl   s   "rm   rn   r±  Ö  s   € ÷ ñ Ð#;ñ ro   c                	ó   € R # rr   rk   r�   s   &rm   Úget_template_nodeÚ#BaseSchedulerNode.get_template_nodeÖ  ó   € Ùro   c               ó   € V ^8„  d   QhRR/# )rf   ri   zir.TemplateBufferrk   )rl   s   "rm   rn   r±  Ù  s   € ÷ ñ Ð,=ñ ro   c                	óD   € V P                  4       pVf   \        R4      hV# )Nzexpected template to be set)r£  rŽ   )r�   Útemplates   & rm   Úget_template_node_or_throwÚ,BaseSchedulerNode.get_template_node_or_throwÙ  s'   € Ø×)Ñ)Ó+ˆØÒÜ Ð!>Ó?Ð?Øˆro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¼  úlist[BaseSchedulerNode]ri   zJtuple[list[BaseSchedulerNode], BaseSchedulerNode, list[BaseSchedulerNode]]rk   )rl   s   "rm   rn   r±  à  s   € ÷ 1ñ 1Ø&ð1à	Sñ1ro   c                óp   € \        R \        V 4       4       4      pV RV pW,          pW^,           R pW#V3# )zA
For the list of nodes, get the prologue, template, and epilogue
c              3  óZ   "  € T F!  w  rVP                  4       '       g   K  Vx € K#  	  R # 5irr   ©rÏ  )rv   Úir–  s   &  rm   rx   ÚCBaseSchedulerNode.get_prologue_template_epilogue.<locals>.<genexpr>æ  s   é € ÐPÑ,<¡D AÀÇÁÇŸašaÓ,<ùs   ‚+¡
+N)ÚnextÚ	enumerate)r¼  Útemplate_indexÚprologueÚtemplate_nodeÚepilogues   &    rm   Úget_prologue_template_epilogueÚ0BaseSchedulerNode.get_prologue_template_epilogueß  sH   € ô ÑP¬I°eÔ,<ÓPÓPˆà˜˜.Ð)ˆØÕ-ˆØ¨!Õ+Ð-Ð.ˆØ¨Ð0Ð0ro   )r;  r·  rž  r   rŸ  r¥  r¸   r¨  rª  r  r<  r®  r¯  ©T)Er¡   r¢   r£   r¤   r¥   r¸   r¬  r¯  r¸  r¿  rÅ  rc  r×  rã  rò  r÷  rÿ  r  r  r  r  r  rP   râ  rQ   r%  r<  r@  r  r:  r   ro  rw  rE  r€  r<  rŽ  r™  r3   rá   r:  r½  r°  rÏ   rº  r^   rÛ   rÇ  rË  rÏ  rÓ  r×  rÞ  râ  r
  r#  r,  r0  r4  r+  r9  ry  r€  r  r£  r©  rk  r¸  r§   rk   ro   rm   r   r   µ  sh  ‡ ØÓØBÓBØÓð ÓØÓØƒNØƒNØ'Ó'Ø$Ó$Ø $€DÐ
Ó$Ø"Ó"Ø/Ó/Ø/3Ð Ó3Ø(Ó(Ø'Ó'Ø€GˆTÓõ
õ#õ4Bõ*õ6õ+õ#õ
õõ
Mõ>õ
õ
õ<ð ô0ó ð0ñ Ð/Ó0ôMó 1ðMõ=õõ
õõ6
õGõ Tõ
.õ
ð ôHó ðHð ôBó ðBð ô
ó ð
ð ô
ó ð
õð ô
ó ð
õõ.õ&õ
;õ:õõõõõõõõõO÷b.ð` ô
ó ð
ð
 ô
ó ð
ð
 ô
ó ð
õ

õO!ðb ôó ðõ$-ð ôWó ðWõrõð ô1ó ô1ro   c               ó   € V ^8„  d   QhRR/# )rf   ri   z$torch._inductor.codecache.LocalCacherk   )rl   s   "rm   rn   rn   ï  s   € ÷ 2ñ 2Ð$Hñ 2ro   c                 óR   € \         P                  P                  P                  4       # rr   )rê  rë  Ú	codecacheÚ
LocalCacherk   ro   rm   rŠ  rŠ  î  s   € ä�?‰?×$Ñ$×/Ñ/Ó1Ð1ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úsnoder   ri   r   rk   )rl   s   "rm   rn   rn   ó  s   € ÷ ñ Ð5Fð È3ñ ro   c                óâ  a€ \        V P                  R R4      pV P                  P                  pV P                  P                  . VOV P                  P                  OV P                  P
                  4      pV P                  P
                  p\        P                  ! W#34      w  rER R lo\        V3\        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      ,           4      pV# )Úpython_kernel_namerß  c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   Ú?get_estimate_runtime_cache_key_from_snode.<locals>.__annotate__ý  s   € ÷ 
ñ 
˜Dñ 
ro   c                ó¤   € \        V \        P                  4      ;'       d0    \        V \        P                  \        P                  34      '       * # rr   )rs   r1   r‡  ÚGeneratorStateÚOpaqueObjectState©rß  s   &rm   Ú_is_tensor_irÚ@get_estimate_runtime_cache_key_from_snode.<locals>._is_tensor_irý  sA   € Ü˜!œRŸY™YÓ'÷ 
ð 
´
Ø”×!Ñ!¤2×#7Ñ#7Ð8ó1
ô -
ð 	
ro   c              3  óv   <"  € T F.  pS! V4      '       d   \        VP                  4       4      MR x € K0  	  R # 5irr   )rø   rí  )rv   ÚarÉ  s   & €rm   rx   Ú<get_estimate_runtime_cache_key_from_snode.<locals>.<genexpr>  s+   øé € ÐUÉ9Àa¡}°Q×'7Ò'7”�a—j‘j“lÔ#¸TÔAË9ùs   ƒ9–#9)
r   r¸   ÚinputsÚfill_non_provided_argsÚconstant_argsr´  ÚpytreeÚtree_flattenr   rø   )rÀ  rÂ  ro  r´  Ú	flat_argsÚflat_args_pytree_specr‘  rÉ  s   &      @rm   r‰  r‰  ó  sÅ   ø€ Ü  §¡Ð-AÀ2ÓFÐØ�:‰:×Ñ€DØ�:‰:×,Ñ,Ø*ˆ$Ð*�—‘×)Ñ)Ð*Ø�
‰
×Ñó€Dð �Z‰Z×Ñ€FÜ'-×':Ò':¸D¸>Ó'JÑ$€Iõ
ô
 Ø	Ðß
Œ%ÔUÉ9ÓU�%‰%ÔUÉ9ÓUÓ
Uõ	Vó€Ið Ðro   c               ó    € V ^8„  d   QhRRRR/# )rf   rÀ  r   ri   zCallable[[Any], Any] | Nonerk   )rl   s   "rm   rn   rn   	  s   € ÷ ñ Øðà ñro   c                óF  € \        V \        4      '       g   R # \        V P                  \        P                  4      '       g   R # V P                  P
                  p\        V\        P                  P                  4      '       g   R # TP                  p^ RI
Hp W#9  d   R # V# )N)Úflop_registry)rs   rb  r¸   r1   ÚExternKernelrc  rê  Ú_opsÚ
OpOverloadÚoverloadpacketÚtorch.utils.flop_counterr×  )rÀ  rc  rF  r×  s   &   rm   Ú_get_benchmarkable_extern_fnrÝ  	  sr   € ô �eÔ6×7Ò7ÙÜ�e—j‘j¤"§/¡/×2Ò2Ùà—*‘*×(Ñ(€KÜ�k¤5§:¡:×#8Ñ#8×9Ò9Ùà	×	#Ñ	#€Bå6à	ÔÙà€Iro   c               ó    € V ^8„  d   QhRRRR/# )rf   rÀ  r   ri   r«  rk   )rl   s   "rm   rn   rn     s   € ÷ $ñ $Ð,=ð $À,ñ $ro   c           	     óŽ  a a€ R pR p\         P                  '       d   \        S 4      pVf   R # TpV V3R lpMR # \        S 4      p\	        4       pVP                  V4      pVe$   \        V\        4      '       g   \        R4      hV# ^RI	H
o V! 4       w  rx^ RIHp	 V	P                  VVV^^
^
R7      p
VP                  WJR7       V
# )Nc                 ó   <€ S! S 4      # rr   rk   )rÀ  Úsnode_args_kwargss   €€rm   rµ  Ú2maybe_estimate_runtime_benchmark.<locals>.<lambda>(  s   ø€ Ñ!2°5Ô!9ro   r„  )rá  )Úbenchmarker)Úmemory_warmup_itersÚbenchmark_itersÚmax_benchmark_durationr…  )r.   Ú!runtime_estimations_mms_benchmarkrÝ  r‰  rŠ  r‹  rs   r}  rŽ   Úutilsrá  Ú$torch._inductor.runtime.benchmarkingrã  Ú	benchmarkrŒ  )rÀ  Úbench_fnÚargs_kwargs_fnÚmm_fnr‘  r’  r“  ro  r´  rã  r”  rá  s   f          @rm   r�  r�    sÉ   ù€ Ø€HØ€NÜ×/×/Ð/Ü,¨UÓ3ˆØŠ=ÙØˆå9‰áä9¸%Ó@€IÜ&Ó(€EØ—‘˜YÓ'€IØÒÜ˜)¤U×+Ò+Ü Ð!CÓDÐDØÐå(á!Ó#�L€DÝ@à	×	Ñ	ØØØØØØ!ð 
ó 
€Bð 
‡O�O�I€OÔ(Ø€Iro   c                  ód   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R R	 ltR
 R ltR R ltRtR# )Ú	WhyNoFuseiF  r   Úname1Úname2Úreasonútuple[Any, ...]ro  c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   rª   r   r«   ri   rl  rk   )rl   s   "rm   rn   ÚWhyNoFuse.__annotate__M  s#   € ÷ &ñ &Ð/ð &Ð8Ið &Èdñ &ro   c                	óZ   € VP                  4       V n        VP                  4       V n        R # rr   )rE  rð  rñ  ©r�   rª   r«   s   &&&rm   r¸  ÚWhyNoFuse.__init__M  s   € Ø—^‘^Ó%ˆŒ
Ø—^‘^Ó%ˆŽ
ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rò  r   ro  r   ri   rl  rk   )rl   s   "rm   rn   rö  Q  s!   € ÷ ñ ˜sð ¨3ð °4ñ ro   c                	óH   € Wn         W n        \        P                  V 4       R # rr   )rò  ro  Ú
fusion_logÚdebug)r�   rò  ro  s   &&*rm   Ú__call__ÚWhyNoFuse.__call__Q  s   € ØŒØŒ	Ü×Ñ˜Öro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rö  V  s   € ÷ 
ñ 
˜ñ 
ro   c                	ó€   € R V P                    RV P                   R2V P                  V P                  ,          ,           # )zcannot fuse z with rX  )rð  rñ  rò  ro  r�   s   &rm   Ú__str__ÚWhyNoFuse.__str__V  s6   € Ø˜dŸj™j˜\¨°·
±
¨|¸2Ð>Ø�K‰K˜$Ÿ)™)Õ#õ
ð 	
ro   )ro  rð  rñ  rò  N)	r¡   r¢   r£   r¤   r¥   r¸  rþ  r  r§   rk   ro   rm   rï  rï  F  s+   ‡ àƒJØƒJØƒKØ
Óõ&õ÷

ñ 
ro   rï  c               ó    € V ^8„  d   QhRRRR/# )rf   Úobjr   ri   r   rk   )rl   s   "rm   rn   rn   \  s   € ÷ ñ �ð ˜ñ ro   c                óÒ   € \        V \        \        34      '       d   \        V \        R 7      p \
        P                  ! V ^R7      pRV9   d   R\        P                  ! VR4       2# V# )©Úkey)r`  rÍ  ú    )	rs   r   ÚsetÚsortedr   Úpprintr^  Útextwrapr`  )r  r  s   & rm   r^  r^  \  sU   € Ü�#œ
¤CÐ(×)Ò)ä�SœcÔ"ˆÜ�^Š^˜C¨Ô*€FØˆv„~Ø”H—O’O F¨GÓ4Ð5Ð6Ð6Ø€Mro   c                  óJ   € ] tR tRtR R ltR R ltR R ltR R	 lt]tR
t	R# )rƒ  if  c               ó    € V ^8„  d   QhRRRR/# )rf   rw   r;   ri   rl  rk   )rl   s   "rm   rn   ÚOutputNode.__annotate__g  s   € ÷ 4ñ 4˜Gð 4¨ñ 4ro   c                	ó(   € \        V.4      V n        R # rr   r]  r  s   &&rm   r¸  ÚOutputNode.__init__g  s   € Ü",¨c¨UÓ"3ˆÖro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r  j  rÀ  ro   c                	ó   € R # rþ  rk   r�   s   &rm   rÛ   ÚOutputNode.is_reductionj  rÃ  ro   c               ó   € V ^8„  d   QhRR/# rŽ  rk   )rl   s   "rm   rn   r  m  s   € ÷ ñ ¨mñ ro   c                	ó   € R# r  rk   r�   s   &rm   rq  Ú'OutputNode.get_inputs_that_alias_outputm  s   € Øˆ	ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r  p  s   € ÷ ñ ˜#ñ ro   c                	ó   € R # )ÚOUTPUTrk   r�   s   &rm   rE  ÚOutputNode.get_namep  s   € Ùro   )r®  N)
r¡   r¢   r£   r¤   r¸  rÛ   rq  rE  rÅ  r§   rk   ro   rm   rƒ  rƒ  f  s   † õ4õõõð „Hro   rƒ  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   r¸   r   rs  rt  r{  r©  ri   rl  rk   )rl   s   "rm   rn   rn   v  s6   € ÷ *Kñ *KØ
ð*Kà4ð*Kð ,ð*Kð 
ñ	*Kro   c                ó  a aaaa€ \         P                  ! 4       oS P                   Ff  p\        V\        4      '       d   K  SVP
                  ,          P                  4       pSSV,          P                  4       ;;,          ^,          uu&   Kh  	  R VVVV 3R llo\        V3R lS P                   4       4      pV'       dE   S P                  V,
          S n        S P                  S P                  P                  V4      4       R# R# )aU  
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.
c               ó    € V ^8„  d   QhRRRR/# rb  rk   )rl   s   "rm   rn   Ú+_prune_redundant_deps.<locals>.__annotate__Š  s   € ÷ ñ ˜#ð  $ñ ro   c                ó@  <€ \        V \        4      '       d‡   SV P                  ,          P                  4       pSSV,          P	                  4       ,          ^ 8„  ;'       d%    SP
                  P                  V SV,          S4      pSV,          S8H  pT;'       g    T# R# )r   F)rs   r<   rt   rG  rE  r<  Úfusable_weak_dep)rw   rf  Úis_redundantÚis_self_depr{  Úname_to_dep_countrs  r¸   s   &   €€€€rm   rg  Ú+_prune_redundant_deps.<locals>.should_pruneŠ  s˜   ø€ Ü�cœ7×#Ò#Ø! #§(¡(Õ+×<Ñ<Ó>ˆGØ,Ø" 7Õ+×4Ñ4Ó6õàñ÷ ð à—n‘n×5Ñ5ØÐ'¨Õ0°$óð ð -¨WÕ5¸Ñ=ˆKØ×.Ð. ;Ð.áro   c              3  óH   <"  € T F  pS! V4      '       g   K  Vx € K  	  R # 5irr   rk   rj  s   & €rm   rx   Ú(_prune_redundant_deps.<locals>.<genexpr>š  s   øé € ð Ù.�±,¸s×2C�ŠÓ.ùrl  N)rg  r   r®  rs   r<   rt   rG  rE  r   r  r  rm  )r¸   rs  r{  rw   rf  Údeps_to_pruner%  rg  s   fff   @@rm   rv  rv  v  sÌ   ü€ ô '2×&9Ò&9Ó&;Ðà×&Ô&ˆÜ˜#œw×'Ô'Ø! #§(¡(Õ+×<Ñ<Ó>ˆGØÐ0°Õ9×BÑBÓD×EÈÕJÕEñ '÷
ó ô  ô Ø×.Ò.óó €M÷ Ø"&×"9Ñ"9¸MÕ"IˆÔØ×Ñ˜T×-Ñ-×:Ñ:¸=ÓIÖJñ ro   c                  ój   a € ] tR tRtR V 3R lltR R ltR R ltR R	 ltR
 R ltR R lt	Rt
V ;t# )rb  i£  c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   r<  r;  r¸   r»  ri   rl  rk   )rl   s   "rm   rn   Ú&ExternKernelSchedulerNode.__annotate__¤  s!   € ÷ 
3ñ 
3 )ð 
3°<ð 
3ÀDñ 
3ro   c                	ó”  <€ \         SV `  V4       V P                  V4       V P                  VP	                  4       4       \        V\        P                  4      '       dh   VP                  4       '       dP   \        P                  ! VP                  ^ ,          P                  4      p^pVP                  4       pWSV33V n        R# R# R# ©r   N)Úsuperr¸  r¿  r  Úget_read_writesrs   r1   ÚUserDefinedTritonKernelÚcan_fuse_epilogueÚmathr6  Úmutable_argsÚshapeÚget_device_or_errorrî   )r�   r<  r¸   r-  rð   r¹  Ú	__class__s   &&&   €rm   r¸  Ú"ExternKernelSchedulerNode.__init__¤  sŸ   ø€ Ü‰Ñ˜Ô#Ø×Ñ˜TÔ"Ø×Ñ˜T×1Ñ1Ó3Ô4ä�dœB×6Ñ6×7Ò7¸D×<RÑ<R×<TÒ<TÜ—I’I˜d×/Ñ/°Õ2×8Ñ8Ó9ˆEØˆFØ×-Ñ-Ó/ˆFà ¨& /Ð2ˆDŽJñ =UÑ7ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   r-  °  s   € ÷ cñ c ñ cro   c                	óV   € V P                  4        R \        V P                  RR4       2# )z.node.kernel = rÂ  N)rE  r   r¸   r�   s   &rm   r×  Ú)ExternKernelSchedulerNode.debug_str_extra°  s*   € Ø—-‘-“/Ð" /´'¸$¿)¹)ÐEYÐ[_Ó2`Ð1aÐbÐbro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r-  ³  ó   € ÷ ñ ˜4ñ ro   c                	ó   € R # rº  rk   r�   s   &rm   rÓ  Ú#ExternKernelSchedulerNode.is_extern³  r¥  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r-  ¶  s   € ÷ Wñ W $ñ Wro   c                	ó¤   € V P                   f   \        R4      h\        V P                   R4      ;'       d    V P                   P                  4       # )Nrn  râ  )r¸   rŽ   rw  râ  r�   s   &rm   râ  Ú*ExternKernelSchedulerNode.has_side_effects¶  s?   € Ø�9‰9ÒÜ Ð!?Ó@Ð@Ü�t—y‘yÐ"4Ó5×VÐV¸$¿)¹)×:TÑ:TÓ:VÐVro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   úSequence[Sequence[sympy.Expr]]rk   )rl   s   "rm   rn   r-  »  s   € ÷ ñ Ð:ñ ro   c                	ó  € \        V P                  \        P                  4      '       da   V P                  P	                  4       '       dA   \
        P                  ! V P                  P                  ^ ,          P                  4      pV.. 3# . . 3# r  )	rs   r¸   r1   r2  r3  r4  r6  r5  r6  )r�   r-  s   & rm   r¡  Ú$ExternKernelSchedulerNode.get_ranges»  sd   € ä�t—y‘y¤"×"<Ñ"<×=Ò=Ø—	‘	×+Ñ+×-Ò-ä—I’I˜dŸi™i×4Ñ4°QÕ7×=Ñ=Ó>ˆEØ�G˜R�=Ð Ø�Bˆxˆro   c               ó    € V ^8„  d   QhRRRR/# ©rf   Úwrapperr   ri   rl  rk   )rl   s   "rm   rn   r-  Ä  s   € ÷ *ñ *Ð3ð *¸ñ *ro   c                	ó¢   € \        V P                  \        P                  4      '       g   \	        R 4      hV P                  P                  V4      # )z+expected self.node to be an ir.ExternKernel)rs   r¸   r1   rØ  rŽ   rø  )r�   rK  s   &&rm   rø  Ú!ExternKernelSchedulerNode.codegenÄ  s8   € Ü˜$Ÿ)™)¤R§_¡_×5Ò5Ü Ð!NÓOÐOØ�y‰y× Ñ  Ó)Ð)ro   ©rî   )r¡   r¢   r£   r¤   r¸  r×  rÓ  râ  r¡  rø  r§   Ú__classcell__©r8  s   @rm   rb  rb  £  s-   ø† ÷
3ð 
3õcõõWõ
÷*ó *ro   rb  c                  ó.   a € ] tR tRtR V 3R lltRtV ;t# )rý  iÊ  c               ó$   € V ^8„  d   QhRRRRRR/# r,  rk   )rl   s   "rm   rn   Ú#NopKernelSchedulerNode.__annotate__Ë  s!   € ÷ 5ñ 5 )ð 5°<ð 5ÀDñ 5ro   c                	ó†   <€ \         SV `  V4       V P                  V4       V P                  VP	                  4       4       R # rr   )r0  r¸  r¿  r  r1  ©r�   r<  r¸   r8  s   &&&€rm   r¸  ÚNopKernelSchedulerNode.__init__Ë  s5   ø€ Ü‰Ñ˜Ô#Ø×Ñ˜TÔ"Ø×Ñ˜T×1Ñ1Ó3Ö4ro   rk   )r¡   r¢   r£   r¤   r¸  r§   rO  rP  s   @rm   rý  rý  Ê  s   ø† ÷5ö 5ro   rý  c                  ó  a € ] tR tRt$ RtR]R&   R]R&   R V 3R lltRJR	 R
 lltRJR R lltR R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR% R& ltR' R( ltR) R* ltR+ R, ltR- R. ltR/ R0 ltR1 R2 ltR3 R4 ltR5 R6 ltR7 R8 ltR9 R: ltR; R< lt RKR= R> llt!]"R? R@ l4       t#]"RA RB l4       t$RC RD lt%]"RE RF l4       t&]"RG V 3RH ll4       t'RIt(V ;t)# )LrÚ   iÑ  zi
A SchedulerNode is a node for scheduling that encapsulates either
a ComputedBuffer or a TemplateBuffer.
z tuple[Sequence[sympy.Expr], ...]Ú_sizesrF   r\  c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r<  r;  r¸   z%ir.ComputedBuffer | ir.TemplateBufferri   rl  rk   )rl   s   "rm   rn   ÚSchedulerNode.__annotate__Ú  s(   € ÷ 	ñ 	àð	ð 4ð	ð 
ñ		ro   c                	ó„   <€ \         SV `  V4       R V n        ^ V n        V P	                  V4       V P                  4        R # rr   )r0  r¸  Ú_loop_mutation_listenerÚ_loop_state_genr¿  Ú_compute_attrsrU  s   &&&€rm   r¸  ÚSchedulerNode.__init__Ú  s<   ø€ ô
 	‰Ñ˜Ô#ØOSˆÔ$Ø ˆÔØ×Ñ˜TÔ"Ø×ÑÖro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Úextra_indexing_constraintsú"ir.ExtraIndexingConstraints | NoneÚrecompute_sizes_body_funczCallable[_P, _T] | Noneri   rl  rk   )rl   s   "rm   rn   rZ  å  s(   € ÷ "ñ "à$Fð"ð $;ð"ð 
ñ	"ro   c                	ó*  € \        V P                  \        P                  \        P                  34      '       g   \        R 4      hV P                  P                  VVR7      w  V n        pW0n        V P                  P                  4       pV P                  P                  V4      P                  pWE! V P                  4      3V n        \        P                  '       * ;'       g    \!        VP"                  4      '       * p\        V P                  \        P                  4      '       d.   V P%                  V P                  P'                  VR7      4       R# V P%                  \(        P&                  ! V P                  .V P                  O5RV/ 4       R# )ú;expected self.node to be a ComputedBuffer or TemplateBuffer©ra  rc  )Ú	normalizerg  N)rs   r¸   r1   r   ÚTemplateBufferrŽ   Úsimplify_and_reorderrX  r\  r7  r<  Úget_backendÚgroup_fnrî   r.   Úloop_ordering_after_fusionr^   rÐ   r  Úextract_read_writesr0   )r�   ra  rc  r  r¹  rk  Úshould_normalizes   &&&    rm   r^  ÚSchedulerNode._compute_attrså  sL  € ô
 ˜$Ÿ)™)¤b×&7Ñ&7¼×9JÑ9JÐ%K×LÒLÜ ØMóð ð !ŸI™I×:Ñ:Ø'AØ&?ð ;ó 
ÑˆŒ�Tð Œ
à—‘×.Ñ.Ó0ˆØ—>‘>×-Ñ-¨fÓ5×>Ñ>ˆØ˜h t§{¡{Ó3Ð4ˆŒ
ô  &×@Ñ@Ô@÷ 
ð 
ÌØ�K‰KóI
ô E
Ðô �d—i‘i¤×!2Ñ!2×3Ò3Ø× Ñ Ø—	‘	×-Ñ-Ð8HÐ-ÓIöð × Ñ Ü×0Ò0Ø—J‘JðØ!%§¡òØ8Hñöro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   ra  rb  rc  zCallable[..., Any] | Noneri   rl  rk   )rl   s   "rm   rn   rZ  		  s-   € ÷ Lñ Là$FðLð $=ðLð 
ñ	Lro   c                	óN  € \        R  V P                  P                   4       4      pV P                  VVR7       V'       g   V P                  '       dR   V P                  pV'       d   VP                  V4      pV P                  VP                  V P                  4      4       R# R# )c              3  ób   "  € T F%  p\        V\        \        34      '       g   K!  Vx € K'  	  R # 5irr   ©rs   r<   r;   ru   s   & rm   rx   Ú8SchedulerNode.recompute_size_and_body.<locals>.<genexpr>	  ó$   é € ð 0
Ù1�C´ZÀÄgÌwÐEW×5X�CŠCÓ1ùó   ‚/¥
/rf  N)r   r  r  r^  r¥  r  r  r  )r�   ra  rc  Ú	fake_depsr  s   &&&  rm   Úrecompute_size_and_bodyÚ%SchedulerNode.recompute_size_and_body		  s”   € ô
 &0ñ 0
Ø×+Ñ+×1Ò1ó0
ó &
ˆ	ð 	×ÑØ'AØ&?ð 	ô 	
÷ ˜×-×-Ð-Ø×*Ñ*ˆKßØ)×3Ñ3°IÓ>�Ø× Ñ  ×!3Ñ!3°D×4IÑ4IÓ!JÖKñ	 .ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rg  r”   Úneed_clear_tiling_cacheri   rl  rk   )rl   s   "rm   rn   rZ  	  s)   € ÷ Gñ GØðGØ8<ðGà	ñGro   c                	ó>  € \        R  V P                  P                   4       4      pV P                  \        P
                  ! V P                  .V P                  O5RV/ P                  V4      P                  V P                  4      4       V P                  V4       R# )c              3  ób   "  € T F%  p\        V\        \        34      '       g   K!  Vx € K'  	  R # 5irr   rs  ru   s   & rm   rx   Ú5SchedulerNode.refresh_dependencies.<locals>.<genexpr> 	  ru  rv  rg  N)r   r  r  r  r0   rm  r\  rX  r  r  r¥  Ú clear_loop_body_dependent_caches)r�   rg  r{  rw  s   &&& rm   Úrefresh_dependenciesÚ"SchedulerNode.refresh_dependencies	  s�   € ô
 &0ñ 0
Ø×+Ñ+×1Ò1ó0
ó &
ˆ	ð 	×ÑÜ×,Ò,Ø—
‘
ðØ!Ÿ[™[òØ4=ñ÷ ‰Y�yÓ!ß‰V�D×)Ñ)Ó*ô	
ð 	×-Ñ-Ð.EÖFro   c               ó    € V ^8„  d   QhRRRR/# )rf   r{  r”   ri   rl  rk   )rl   s   "rm   rn   rZ  0	  s   € ÷ ;ñ ;Èð ;ÐQUñ ;ro   c                	ó°   € V P                  4        V P                  P                  V 4       V'       d#   ^RIHp VP
                  P                  4        R# R# )r�  rÝ  N)r  Úpointwise_read_writesr$  rÓ  rÞ  Úcandidate_tilingsÚcache_clear)r�   r{  rÞ  s   && rm   r  Ú.SchedulerNode.clear_loop_body_dependent_caches0	  sA   € Ø×/Ñ/Ô1Ø×"Ñ"×.Ñ.¨tÔ4ç"Ý4ð ×,Ñ,×8Ñ8Ö:ñ #ro   c               ó   € V ^8„  d   QhRR/# )rf   ri   ró  rk   )rl   s   "rm   rn   rZ  =	  s   € ÷ 
ñ 
 _ñ 
ro   c                óŠ   € V P                   V P                  V P                  V P                  V P                  V P
                  3# )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\  rX  rî   r  r®  r]  r�   s   &rm   Úsnapshot_loop_stateÚ!SchedulerNode.snapshot_loop_state=	  s>   € ð
 �J‰JØ�K‰KØ�J‰JØ×ÑØ×#Ñ#Ø× Ñ ð
ð 	
ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Ústateró  ri   rl  rk   )rl   s   "rm   rn   rZ  J	  s   € ÷ 
Lñ 
L¨ð 
L¸Dñ 
Lro   c                óx   € Vw  V n         V n        V n        V n        V n        V n        V P                  RR7       R# )z'Restore state from snapshot_loop_state.T)r{  N)r\  rX  rî   r  r®  r]  r  )r�   r�  s   &&rm   Úrestore_loop_stateÚ SchedulerNode.restore_loop_stateJ	  s>   € ð ñ	
ØŒJØŒKØŒJØÔØÔ#ØÔ à×-Ñ-ÀdÐ-ÖKro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rZ  V	  s   € ÷ "ñ "¨Tñ "ro   c                	óv   € V P                   e   V P                  V 4       V ;P                  ^,          un        R # rr   )r\  r]  r�   s   &rm   Ú_before_loop_state_mutationÚ)SchedulerNode._before_loop_state_mutationV	  s/   € Ø×'Ñ'Ò3Ø×(Ñ(¨Ô.ð 	×Ò Õ!×ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úreplacementsr.  ri   rl  rk   )rl   s   "rm   rn   rZ  `	  s   € ÷ Pñ PÐ1Fð PÈ4ñ Pro   c                	ó¾   € V P                   f   \        R4      hV P                  4        V P                   P                  V4      V n         V P	                  RRR7       R # )Nzexpected a loop bodyT©rg  r{  )r\  rŽ   r“  Úwith_indexing_exprsr€  )r�   r–  s   &&rm   Úapply_indexing_exprsÚ"SchedulerNode.apply_indexing_exprs`	  sM   € Ø�:‰:ÒÜ Ð!7Ó8Ð8Ø×(Ñ(Ô*Ø—Z‘Z×3Ñ3°LÓAˆŒ
Ø×!Ñ!¨DÈ$Ð!ÖOro   c               ó    € V ^8„  d   QhRRRR/# )rf   Ú	new_orderúSequence[int]ri   rl  rk   )rl   s   "rm   rn   rZ  g	  s   € ÷ Qñ Q¨mð QÀñ Qro   c                	óÂ   € V P                  4        V P                  P                  V4      V n        V P                  P                  V n        V P                  R RR7       R# )FTr˜  N)r“  r\  Úreorder_iter_loopsÚsizesrX  r€  )r�   r�  s   &&rm   Úapply_new_loop_orderÚ"SchedulerNode.apply_new_loop_orderg	  sM   € Ø×(Ñ(Ô*Ø—Z‘Z×2Ñ2Øó
ˆŒ
ð —j‘j×&Ñ&ˆŒà×!Ñ!¨EÈ4Ð!ÖPro   c               ó    € V ^8„  d   QhRRRR/# )rf   Únew_iter_sizesúSequence[sympy.Expr]ri   rl  rk   )rl   s   "rm   rn   rZ  p	  s   € ÷ Qñ QÐ4Hð QÈTñ Qro   c                	óú  € \        V P                  \        P                  \        P                  34      '       g   \        R 4      hV P                  4        V P                  P                  V4      V n        V P                  P                  V n
        V P                  P                  4       pV P                  P                  V4      P                  pW#! V P                  4      3V n        V P!                  RRR7       R# )re  FTr˜  N)rs   r¸   r1   r   rh  rŽ   r“  r\  Úreindex_iter_loopsr¡  rX  r7  r<  rj  rk  rî   r€  )r�   r¥  r¹  rk  s   &&  rm   Úapply_loop_reindexingÚ#SchedulerNode.apply_loop_reindexingp	  s½   € Ü˜$Ÿ)™)¤b×&7Ñ&7¼×9JÑ9JÐ%K×LÒLÜ ØMóð ð 	×(Ñ(Ô*Ø—Z‘Z×2Ñ2°>ÓBˆŒ
Ø—j‘j×&Ñ&ˆŒà—‘×.Ñ.Ó0ˆØ—>‘>×-Ñ-¨fÓ5×>Ñ>ˆØ˜h t§{¡{Ó3Ð4ˆŒ
à×!Ñ!¨EÈ4Ð!ÖPro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rZ  €	  s   € ÷ Iñ I tñ Iro   c                	ó<  € V P                   P                  4       p\        V P                   P                  4      V,
          p\	        \        V4      4      p\	        \        W"V,           4      4      pV P                  WC,           4       \        V P                  ^,          4      ^8w  d)   \        R\        V P                  ^,          4       24      hV P                  ^ ,          V P                  ^,          ^,          V P                  ^,          ^ ,          33V n        R# )r�  z(expected group[1] to have length 2, got N)	r\  Úget_original_num_rdimsr÷   r"  rø   Úranger¢  rî   rŽ   )r�   Ú	num_rdimsÚ
num_pwdimsÚpwdimsÚrdimss   &    rm   Úswap_pw_red_dimensionÚ#SchedulerNode.swap_pw_red_dimension€	  sÏ   € Ø—J‘J×5Ñ5Ó7ˆ	Ü˜Ÿ™×-Ñ-Ó.°Õ:ˆ
Ü”u˜ZÓ(Ó)ˆÜ”e˜J°YÕ(>Ó?Ó@ˆà×!Ñ! %¥.Ô1Üˆt�z‰z˜!�}Ó Ô"Ü Ø:¼3¸t¿z¹zÈ!½}Ó;MÐ:NÐOóð ð —Z‘Z •] T§Z¡Z°¥]°1Õ%5°t·z±zÀ!µ}ÀQÕ7GÐ$HÐHˆŽ
ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   r   rk   )rl   s   "rm   rn   rZ  �	  s   € ÷ ñ Ð+<ñ ro   c                	óD   € V P                   P                  4       V n         V # rr   )r\  Úextract_pw_from_reductionr�   s   &rm   r¸  Ú'SchedulerNode.extract_pw_from_reduction�	  s   € Ø—Z‘Z×9Ñ9Ó;ˆŒ
Øˆro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rZ  ‘	  s   € ÷ "ñ "¨ñ "ro   c                	óH  € \         P                  V 4      '       g   R # \        V P                  \        P
                  4      '       g   \        R4      hV P                  P                  4       ;_uu_ 4        V P                  4        R R R 4       R #   + '       g   i     R # ; i)Nz-expected self.node to be an ir.ComputedBuffer)	rÔ   rã   rs   r¸   r1   r   rŽ   Úwith_original_inner_fnr^  r�   s   &rm   Úcancel_reduction_splitÚ$SchedulerNode.cancel_reduction_split‘	  sg   € Ü ×3Ñ3°D×9Ò9ÙÜ˜$Ÿ)™)¤R×%6Ñ%6×7Ò7Ü Ð!PÓQÐQØ�Y‰Y×-Ñ-×/Õ/Ø×ÑÔ!÷ 0×/×/Ò/ús   Á5BÂB!	c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Ú	dimensionrµ   Ú	new_rangeri   rl  rk   )rl   s   "rm   rn   rZ  ™	  s)   € ÷ Pñ PØðPØ),ðPà	ñPro   c                	óú  € \        V P                  \        P                  \        P                  34      '       g   \        R 4      hV P                  4        V P                  P                  W4      V n        V P                  P                  V n
        V P                  P                  4       pV P                  P                  V4      P                  pW4! V P                  4      3V n        V P!                  RRR7       R# )re  Tr˜  N)rs   r¸   r1   r   rh  rŽ   r“  r\  Ú#expand_dimension_for_pointwise_noder¡  rX  r7  r<  rj  rk  rî   r€  )r�   rÀ  rÁ  r¹  rk  s   &&&  rm   rÃ  Ú1SchedulerNode.expand_dimension_for_pointwise_node™	  sÆ   € ô ˜$Ÿ)™)¤b×&7Ñ&7¼×9JÑ9JÐ%K×LÒLÜ ØMóð ð 	×(Ñ(Ô*Ø—Z‘Z×CÑCØó
ˆŒ
ð —j‘j×&Ñ&ˆŒà—‘×.Ñ.Ó0ˆØ—>‘>×-Ñ-¨fÓ5×>Ñ>ˆØ˜h t§{¡{Ó3Ð4ˆŒ
ð 	×!Ñ!¨DÈ$Ð!ÖOro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rZ  ®	  s   € ÷ 
Qñ 
Q˜Tñ 
Qro   c                	ó    € V P                   P                  4       V n         V P                   P                  V n        V P	                  R RR7       R# )TFr˜  N)r\  Úmerge_loopsr¡  rX  r€  r�   s   &rm   rÇ  ÚSchedulerNode.merge_loops®	  s<   € Ø—Z‘Z×+Ñ+Ó-ˆŒ
Ø—j‘j×&Ñ&ˆŒð 	×!Ñ!¨DÈ%Ð!ÖPro   c               ó$   € V ^8„  d   QhRRRRRR/# rú  rk   )rl   s   "rm   rn   rZ  º	  s$   € ÷ ñ Ø!ðØ.7ðà	ñro   c                	ó²  € R pV P                   ^ ,          p\        V4      VP                  u;8X  d   VP                  8X  d   M MVP                  V4      pV'       dV   \        ;P
                  ^,          un        \        P                  RV P                  4       V4       V P                  V4       R# \        P                  RV P                  4       4       R# )Nz"Reorder loops for %s with order %sTzEDon't reordering %s because we can not decide the suitable loop orderF)
rX  r÷   Únum_varsÚdecide_loop_order_to_matchr2   Únum_loop_reorderingÚloop_ordering_logrý  rE  r¢  )r�   rû  rü  r�  Ú
self_sizess   &&&  rm   rÿ  Ú'SchedulerNode.reorder_loops_by_dep_pairº	  s¤   € ð ˆ	Ø—[‘[ •^ˆ
Üˆz‹?˜h×/Ñ/ÖE°9×3EÑ3E×EØ ×;Ñ;¸IÓFˆIçä×'Ò'¨1Õ,Õ'Ü×#Ñ#Ø4°d·m±m³oÀyôð ×%Ñ% iÔ0Ùä×#Ñ#ØWØ—‘“ôñ ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rZ  Ñ	  s   € ÷  ñ   ñ  ro   c                	óx  € V P                  4       pV R V P                  ^ ,           2V RV P                  ^,           2V RV P                   2.pV P                  P	                  4        F‘  p\        V\        4      '       d   K  VP                  p\        P                  P                  V4      p\        V\        P                  4      '       d   Kh  VP                  V R\        VP                  4       24       K“  	  \        V P                   \"        4      '       dT   VP                  RV R24       VP                  \$        P&                  ! V P                   P)                  4       R4      4       V P*                  f   \-        R4      hVP/                  V P1                  4       4       RP3                  V4      # )	z.group.device = z.group.iteration = z	.sizes = z
_layout = zclass z_loop_body:r	  rn  rÍ  )rE  rî   rX  r  r
  rs   r<   rt   rd   ré   rW  r1   r[  r  r^  r\  r\  rF   r  r`  rc  r¸   rŽ   rU  rã  Újoin)r�   rt   Úlinesrw   r®  rÿ   s   &     rm   r×  ÚSchedulerNode.debug_str_extraÑ	  sS  € Ø�}‰}‹ˆàˆfÐ$ T§Z¡Z°¥] OÐ4ØˆfÐ'¨¯
©
°1­ Ð7Øˆf�I˜dŸk™k˜]Ð+ð
ˆð
 ×#Ñ#×4Ñ4Ö6ˆCÜ˜c¤7×+Ô+ØŸ8™8�Ü—g‘g×(Ñ(¨Ó2�Ü! #¤r×'9Ñ'9×:Ô:Ø—L‘L H :¨Z¼ÀÇ
Á
Ó8KÐ7LÐ!MÖNñ 7ô �d—j‘j¤(×+Ò+Ø�L‰L˜6 $  {Ð3Ô4Ø�L‰LœŸš¨¯©×)=Ñ)=Ó)?ÀÓHÔIà�9‰9ÒÜ Ð!?Ó@Ð@Ø�‰�T×/Ñ/Ó1Ô2à�y‰y˜ÓÐro   c               ó   € V ^8„  d   QhRR/# rE  rk   )rl   s   "rm   rn   rZ  è	  s   € ÷ ñ Ð:ñ ro   c                	ó   € V P                   # rr   )rX  r�   s   &rm   r¡  ÚSchedulerNode.get_rangesè	  ó   € Ø�{‰{Ðro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rZ  ë	  s   € ÷ 

ñ 

˜dñ 

ro   c                	ór  € \        V P                  \        P                  \        P                  34      '       g#   \        R \        V P                  4      : 24      h\        V P                  P                  4       4      ;'       d2    V P                  RJ ;'       g    V P                  P                  '       * # )útype(self.node)=N)rs   r¸   r1   r   rh  rŽ   rÐ   r”   r7  r\  Úhas_partial_accumulater�   s   &rm   rÛ   ÚSchedulerNode.is_reductionë	  s‡   € Ü˜$Ÿ)™)¤b×&7Ñ&7¼×9JÑ9JÐ%K×LÒLÜ Ð$4¤D¨¯©£OÑ#5Ð!6Ó7Ð7ô �D—I‘I×0Ñ0Ó2Ó3÷ 
ð 
Ø�J‰J˜$Ð×GÐG d§j¡j×&GÑ&GÔ"Gð	
ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rZ  ÷	  s   € ÷ 7ñ 7 $ñ 7ro   c                	óÔ   € \        V P                  \        P                  4      '       g#   \	        R \        V P                  4      : 24      hV P                  P                  4       R8H  # )rÜ  Údot)rs   r¸   r1   r   rŽ   rÐ   r7  r�   s   &rm   rÇ  ÚSchedulerNode.is_native_matmul÷	  sM   € Ü˜$Ÿ)™)¤R×%6Ñ%6×7Ò7Ü Ð$4¤D¨¯©£OÑ#5Ð!6Ó7Ð7Ø�y‰y×+Ñ+Ó-°Ñ6Ð6ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rZ  ü	  s   € ÷ 
ñ 
˜tñ 
ro   c                	ón  € \        V P                  \        P                  \        P                  34      '       g#   \        R \        V P                  4      : 24      h\        V P                  \        P                  4      ;'       d/    \        V P                  P                  \        P                  4      # )rÜ  )	rs   r¸   r1   r   rh  rŽ   rÐ   r/  Ú	SplitScanr�   s   &rm   rË  ÚSchedulerNode.is_split_scanü	  s{   € Ü˜$Ÿ)™)¤b×&7Ñ&7¼×9JÑ9JÐ%K×LÒLÜ Ð$4¤D¨¯©£OÑ#5Ð!6Ó7Ð7Ü˜$Ÿ)™)¤R×%6Ñ%6Ó7÷ 
ð 
¼JØ�I‰I�N‰NœBŸL™Ló=
ð 	
ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rZ  
  s   € ÷ 8ñ 8˜Tñ 8ro   c                	óJ   € \        V P                  \        P                  4      # rr   ©rs   r¸   r1   rh  r�   s   &rm   rÏ  ÚSchedulerNode.is_template
  s   € Ü˜$Ÿ)™)¤R×%6Ñ%6Ó7Ð7ro   c               ó   € V ^8„  d   QhRR/# r¡  rk   )rl   s   "rm   rn   rZ  
  s   € ÷ Oñ OÐ#;ñ Oro   c                	ór   € \        V P                  \        P                  4      '       d   V P                  # R # rr   ré  r�   s   &rm   r£  ÚSchedulerNode.get_template_node
  s'   € Ü& t§y¡y´"×2CÑ2C×DÒDˆt�y‰yÐNÈ$ÐNro   c               ó    € V ^8„  d   QhRRRR/# )rf   Ú
index_varsr¦  ri   rl  rk   )rl   s   "rm   rn   rZ  	
  s   € ÷ !ñ !Ð3ð !¸ñ !ro   c                	óh   € V P                  4        V P                  4        V P                  V4       R # rr   )r
  r@  rø  )r�   rï  s   &*rm   ÚrunÚSchedulerNode.run	
  s#   € Ø×"Ñ"Ô$Ø�‰ŒØ�‰�ZÖ ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rï  rF  ri   zdict[sympy.Expr, sympy.Expr]rk   )rl   s   "rm   rn   rZ  
  s   € ÷ ñ Ø8ðà	%ñro   c                	ó<  € V P                   p\        \        \        V4      4      \        \        \        V4      4      8w  d   \	        R 4      h\        \        \        P                  P                  V4      \        P                  P                  V4      4      4      pV# )z0expected sum of sizes to equal sum of index_vars)
rX  r5  Úmapr÷   rŽ   ÚdictÚziprH  rI  Úfrom_iterable)r�   rï  r¡  r  s   &&  rm   Úranges_from_index_varsÚ$SchedulerNode.ranges_from_index_vars
  sv   € ð —‘ˆÜŒs”3˜‹Ó¤3¤s¬3°
Ó';Ó#<Ô<Ü Ð!SÓTÐTÜÜÜ—‘×-Ñ-¨jÓ9Ü—‘×-Ñ-¨eÓ4óó
ˆ
ð Ðro   c               ó    € V ^8„  d   QhRRRR/# )rf   rï  rF  ri   rl  rk   )rl   s   "rm   rn   rZ  
  s   € ÷ ñ Ð"@ð ÀTñ ro   c           	     óà  € V P                  V4      p \        P                  ! \        \        P                  ! 4       V4      4      ;_uu_ 4        \        P
                  P                  V 4      ;_uu_ 4        V P                  ! V!   RRR4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i  \         d#    \        P                  RT P                  4       h i ; i)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ù  rd   Úset_ops_handlerrN   Úget_ops_handlerrx  Úset_current_noder\  rØ  rÙ  Úfatalr¸   )r�   rï  r  s   && rm   rø  ÚSchedulerNode.codegen
  s¤   € ð ×0Ñ0°Ó<ˆ
ð	ä×!Ò!Ô"2´1×3DÒ3DÓ3FÈ
Ó"S×TÕTÜ—‘×)Ñ)¨$×/Õ/à—
’
˜JÒ'÷ 0÷ UÑTß/×/ú÷ U×TÐTûô ô 	Ü�I‰IÐ/°·±Ô;Øð	úsA   “;C  Á(B,Á6B	ÂB,ÂC  ÂB)Â$B,Â,B=	Â7C  Â=C  Ã -C-c               ó    € V ^8„  d   QhRRRR/# )rf   Ú	pointwiser”   ri   r­  rk   )rl   s   "rm   rn   rZ  3
  s   € ÷ 	
ñ 	
Øð	
à	 ñ	
ro   c                óò   € V'       d   V P                   M\        V P                   4      w  r#\        P                  ! V P                  V\
        P                  P                  .\        V4      ,          .R7      # )zL
Get the memory dependencies in either the pointwise or the reduction axes.
)Úhidden_args)	rX  rù   r0   rm  r\  r@  ÚSÚZeror÷   )r�   r  Ú
keep_sizesÚignore_sizess   &&  rm   Ú"pointwise_or_reduction_read_writesÚ0SchedulerNode.pointwise_or_reduction_read_writes3
  sR   € ÷ 3< 4§;¢;ÄÈ$Ï+É+ÓAVÑ ˆ
Ü×/Ò/Ø�J‰J˜
´%·'±'·,±,°Ä#ÀlÓBSÕ1SÐ0Tô
ð 	
ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   r­  rk   )rl   s   "rm   rn   rZ  ?
  s   € ÷ Gñ GÐ'>ñ Gro   c                ó&   € V P                  RR7      # )z8
Get the memory dependencies in the non-reduction axes.
T©r  ©r
  r�   s   &rm   r„  Ú#SchedulerNode.pointwise_read_writes>
  s   € ð
 ×6Ñ6ÀÐ6ÓFÐFro   c               ó   € V ^8„  d   QhRR/# r  rk   )rl   s   "rm   rn   rZ  F
  s   € ÷ Hñ HÐ'>ñ Hro   c                ó&   € V P                  RR7      # )z4
Get the memory dependencies in the reduction axes.
Fr  r  r�   s   &rm   Úreduction_read_writesÚ#SchedulerNode.reduction_read_writesE
  s   € ð
 ×6Ñ6ÀÐ6ÓGÐGro   c               ó    € V ^8„  d   QhRRRR/# rÚ  rk   )rl   s   "rm   rn   rZ  L
  s   € ÷ ñ Ð$4ð ¸ñ ro   c                	ó¢  € V P                  4       '       d   R # \        ;QJ d*    R V P                  4        4       F  '       g   K   RM	  R M! R V P                  4        4       4      '       d   R # \        V P                  P
                  4      ^8X  d»   \        V\        P                  4      '       d›   \        \        V P                  P
                  4      4      p\        V\        P                  4      '       g   \        R\        V4      : 24      hVP                  VP                  8H  ;'       d    VP                  VP                  8H  # R # )Fc              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )r]  rŒ  s   & rm   rx   Ú,SchedulerNode.can_inplace.<locals>.<genexpr>O
  s   é € Ð?Ñ,> S�‰× Ð Ó,>ùr‡  Tztype(write_dep)=)rÏ  rB  r½  r÷   r  rÖ  rs   r0   r:   r²  ÚiterrŽ   rÐ   r  r  )r�   rÛ  Ú	write_deps   && rm   rÞ  ÚSchedulerNode.can_inplaceL
  sí   € Ø×Ñ×ÒÙß‹3Ñ?¨D×,<Ñ,<Ô,>Ó?�3�3Š3Ñ?¨D×,<Ñ,<Ô,>Ó?×?Ò?ÙÜˆt×Ñ×&Ñ&Ó'¨1Ô,´Ø”l×,Ñ,÷2
ò 2
ô œT $×"2Ñ"2×"9Ñ"9Ó:Ó;ˆIÜ˜i¬×)?Ñ)?×@Ò@Ü$Ð(8¬¨Y«Ñ'9Ð%:Ó;Ð;Ø—>‘> Y§_¡_Ñ4×XÐX¸¿¹È)Ï.É.Ñ9XÐXÙro   c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   rZ  [
  s   € ÷ +ñ +¨ñ +ro   c                	ól  € \        4       p\        V P                  \        4      '       Ed	   V P                  P	                  4        Fê  pVP
                  R 8X  g   K  VP                  R8X  g   K)  RVP                  9   d   VP                  R,          R8X  g7   \        VP                  4      ^8X  g   Kn  VP                  ^,          R8X  g   Kˆ  TP                  RVP                  9   d   VP                  R,          M.\        VP                  4      ^8¼  d   VP                  ^,          MR4       Kì  	  V# )Úcall_methodÚstoreÚmodeÚ
atomic_addrt   rß  )r   rs   r\  rF   rá   rF  r  r´  r÷   ro  rS  )r�   Úbuffers_store_as_atomic_addr¸   s   &  rm   Ú_get_atomic_add_buffersÚ%SchedulerNode._get_atomic_add_buffersZ
  sÓ   € ä7A³|Ð#Ü�d—j‘j¤(×+Ó+ØŸ
™
×,Ñ,Ö.�à—G‘G˜}Ö,ØŸ™ wÖ.à 4§;¡;Ô.°4·;±;¸vÕ3FÈ,Ô3VÜ §	¡	›N¨aÖ/°D·I±I¸aµLÀLÖ4Pð 0×3Ñ3à! T§[¡[Ô0ð Ÿ™ FÖ+ä.1°$·)±)«nÀÔ.A˜dŸi™i¨žlÀröñ /ð +Ð*ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rZ  o
  s   € ÷ *ñ * $ñ *ro   c                	ó‚   <€ V P                   e$   V P                   P                  R4      '       d   R# \        SV `  4       # )NÚdevice_assert_asyncT)r\  Úhas_opr0  râ  ©r�   r8  s   &€rm   râ  ÚSchedulerNode.has_side_effectsn
  s5   ø€ ð �:‰:Ò! d§j¡j×&7Ñ&7Ð8M×&NÒ&NÙÜ‰wÑ'Ó)Ð)ro   )r\  r\  r]  rX  rî   r  r®  ©NNrº  )*r¡   r¢   r£   r¤   r¹   r¥   r¸  r^  rx  r€  r  rŠ  r�  r“  rš  r¢  r©  r³  r¸  r½  rÃ  rÇ  rÿ  r×  r¡  rÛ   rÇ  rË  rÏ  r£  rñ  rù  rø  r
  rP   r„  r  rÞ  r$  râ  r§   rO  rP  s   @rm   rÚ   rÚ   Ñ  s
  ø‡ ñð
 -Ó,ØƒO÷	ð 	÷"÷HLõ$Gõ*;õ
õ
Lõ"õPõQõQõ Iõõ"õPõ*
Qõõ. õ.õ

õ7õ

õ8õOõ!õ
õ÷.	
ð ôGó ðGð ôHó ðHõð ô+ó ð+ð& ÷*ó ö*ro   rÚ   c               ó    € V ^8„  d   QhRRRR/# )rf   Úgroup_snodeú)FusedSchedulerNode | GroupedSchedulerNoderi   rl  rk   )rl   s   "rm   rn   rn   v
  s   € ÷ ñ Ø:ðà	ñro   c           	     ó‚  a € S P                   pS P                  \        P                  P	                  V Uu. uF  q"P
                  NK  	  up4      4       \        V 3R  l\        P                  ! V Uu. uF  q"P                  NK  	  up!   4       4      S P
                  P                  ,
          S n        R# u upi u upi )c              3  ój   <"  € T F(  pVP                   SP                  4       9  g   K$  Vx € K*  	  R # 5irr   ©rt   rŽ  )rv   rw   r.  s   & €rm   rx   Ú2refresh_group_node_dependencies.<locals>.<genexpr>
  s/   øé € ð 
áP�Ø�x‰x˜{×;Ñ;Ó=Ñ=÷ ŠCÛPùó   ƒ!3©
3N)
r  r  r0   Ú
ReadWritesÚ
merge_listr  r   Úunionr®  rÖ  )r.  r  rß  s   f  rm   Úrefresh_group_node_dependenciesr8  v
  s¢   ø€ ð ×Ñ€FØ×ÑÜ×Ñ×*Ñ*Á6Ó+JÁ6¸a¯M¬MÁ6Ñ+JÓKôô
 	ô 
ä!×'Ò'ÉÓ)OÉÀ1×*>Ô*>ÉÑ)OÒPó
ó 	
ð
 ×
!Ñ
!×
(Ñ
(õ	)ð Ö"ùò ,Kùò *Ps   ¶B7Á3B<c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   r.  r/  r<  r;  r  r¬  ri   rl  rk   )rl   s   "rm   rn   rn   ˆ
  s0   € ÷ ñ Ø:ðàðð $ðð 
ñ	ro   c                ó–  € \        V \        \        34      '       g   \        R 4      hW n        Wn        RV n        \        P                  ! V Uu. uF  q3P                  f   K  VP                  NK   	  up!  V n	        \        V 4       \        R V P                   4       4      V n        \        R V P                   4       4      V n        \        R V P                   4       4      V n        \        R V P                   4       4      V n        V P#                  4        Uu/ uF  qDP%                  4       VbK  	  upV n        R# u upi u upi )z3expected FusedSchedulerNode or GroupedSchedulerNodeNc              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   ©r¡  ©rv   rß  s   & rm   rx   Ú"init_group_node.<locals>.<genexpr>˜
  ó   é € ÐHÑ5G°§¦Ó5Gùr	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   )r¢  r=  s   & rm   rx   r>  ™
  r?  r	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   )rŸ  r=  s   & rm   rx   r>  š
  ó   é € ð )Ù&8 ×ÖÓ&8ùr	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   )r   r=  s   & rm   rx   r>  �
  rB  r	  )rs   r  ÚGroupedSchedulerNoderŽ   r  r<  r¸   r   r7  r;  r8  rŸ  r¡  rž  r¢  rŸ  r   r½  rE  rª  )r.  r<  r  rß  rÿ   s   &&&  rm   Úinit_group_noderE  ˆ
  s!  € ô
 �kÔ$6Ô8LÐ#M×NÒNÜÐRÓSÐSØÔØ%ÔØ€KÔÜ&×,Ò,Ù%Ó	A™v˜!¯©Œ+ˆ!�+Œ+™vÑ	Añ€KÔô $ KÔ0äÑH°[×5GÒ5GÓHÓH€KÔÜÑH°[×5GÒ5GÓHÓH€KÔÜ%(ñ )Ø&1×&8Ò&8ó)ó &€KÔ"ô &)ñ )Ø&1×&8Ò&8ó)ó &€KÔ"ð (3×'>Ñ'>Ô'@ó#Ù'@ �‰‹˜ÒÑ'@ñ#€KÖùò 
Bùò#s   ÁEÁ#EÄEc                  ó  a € ] tR tRt$ RtR]R&   ]R R l4       tR R ltR	 R
 lt	]
R R l4       tR R ltR V 3R llt]
R R l4       tR R lt]
R R l4       tR R ltR R ltR R ltR V 3R llt]
R R  l4       t]
R! R" l4       tR# R$ ltR% R& lt]
R' R( l4       t]
R) R* l4       t]
R+ R, l4       t]
R- R. l4       t]
R/ R0 l4       tR1 R2 lt]
R3 R4 l4       tR5 R6 lt R7 R8 lt!R9 R: lt"R; R< lt#]
R= V 3R> ll4       t$R?t%V ;t&# )@r  i¥
  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  c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   rª   r   r«   ri   r  rk   )rl   s   "rm   rn   ÚFusedSchedulerNode.__annotate__¯
  s$   € ÷ +ñ +Ø%ð+Ø.?ð+à	ñ+ro   c                	óJ  € VP                   VP                   Jd   \        R 4      h\        V\        \        34      '       g   \        R4      hVP                  4       '       dM   \        V\        4      '       d7   \        VP                  \        P                  4      '       g   \        R4      hM'\        V\        \        34      '       g   \        R4      h\        \        P                  ! VP                  4       VP                  4       4      4      pV ! VP                   V4      # )z4expected node1 and node2 to share the same schedulerz:expected node1 to be a SchedulerNode or FusedSchedulerNodez+expected node2.node to be an ir.MultiOutputz:expected node2 to be a SchedulerNode or FusedSchedulerNode)r<  rŽ   rs   rÚ   r  rÏ  rb  r¸   r1   rC   rÈ   rH  rI  rá   )r˜   rª   r«   r¼  s   &&& rm   r™   ÚFusedSchedulerNode.fuse®
  sâ   € ð �?‰? %§/¡/Ó1Ü Ð!WÓXÐXÜ˜%¤-Ô1CÐ!D×EÒEÜ ØLóð ð ×Ñ×Ò¤:¨eÔ5N×#OÒ#OÜ˜eŸj™j¬"¯.©.×9Ò9Ü$Ð%RÓSÐSð :ô ˜e¤mÔ5GÐ%H×IÒIÜ$ØPóð ô ”Y—_’_ U§_¡_Ó%6¸¿¹Ó8IÓJÓKˆÙ�5—?‘? EÓ*Ð*ro   c               ó   € V ^8„  d   QhRR/# r¶  rk   )rl   s   "rm   rn   rI  Ã
  s   € ÷ ñ Ð+<ñ ro   c                	óÐ   € V P                    FU  p\        V\        4      '       g   \        R 4      hVP	                  4       '       g   \        R4      hVP                  4        KW  	  V # )ú&expected subnode to be a SchedulerNodez"expected subnode to be a reduction)r  rs   rÚ   rŽ   rÛ   r¸  ©r�   rÞ   s   & rm   r¸  Ú,FusedSchedulerNode.extract_pw_from_reductionÃ
  sW   € Ø—{”{ˆGÜ˜g¤}×5Ò5Ü$Ð%MÓNÐNØ×'Ñ'×)Ò)Ü$Ð%IÓJÐJØ×-Ñ-Ö/ñ #ð ˆro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rI  Ì
  s   € ÷ ,ñ , tñ ,ro   c                	óŽ   € V P                    F4  p\        V\        4      '       g   \        R 4      hVP	                  4        K6  	  R# )rN  N)r  rs   rÚ   rŽ   r³  rO  s   & rm   r³  Ú(FusedSchedulerNode.swap_pw_red_dimensionÌ
  s5   € Ø—{”{ˆGÜ˜g¤}×5Ò5Ü$Ð%MÓNÐNØ×)Ñ)Ö+ó #ro   c               ó   € V ^8„  d   QhRR/# rn  rk   )rl   s   "rm   rn   rI  Ó
  ó   € ÷ ñ  
ñ ro   c                	ó”   € \        \        R R V P                  4        4       4      4      p\        V4      ^ 8X  d   R # \	        V4      pV# )Nc              3  óž   "  € T FC  pVP                  4       '       g   VP                  4       '       g   K1  VP                  4       x € KE  	  R # 5irr   ©rÏ  rÓ  ry  r…  s   & rm   rx   Ú4FusedSchedulerNode.estimate_flops.<locals>.<genexpr>Ø
  ó=   é € ð á 0˜Ø×'Ñ'×)Ò)¨T¯^©^×-=ô *�D×'Ñ'×)Ð)Û 0ùó   ‚A�AµA©rÈ   Úfilterrá   r÷   r5  ©r�   Úfpsr•  s   &  rm   ry  Ú!FusedSchedulerNode.estimate_flopsÒ
  óK   € ô ÜØñà $§¡Ô 0óóó	
ˆô ˆs‹8�qŒ=ÙÜ�#‹hˆØˆ
ro   c               ó$   € V ^8„  d   QhRRRRRR/# rú  rk   )rl   s   "rm   rn   rI  ä
  s$   € ÷ +ñ +Ø!ð+Ø.7ð+à	ñ+ro   c                óf  € V P                  4       '       d   R# RpV P                   Fu  p\        V\        4      '       g    R# VeC   \	        V4      \	        VP
                  ^ ,          4      8w  d   \        P                  R4        R# VP
                  ^ ,          pKw  	  RpVf   \        R4      h\        V4      VP                  u;8X  d   VP                  8X  d   M MVP                  V4      pV'       g'   \        P                  RV P                  4       4       R# \        ;P                  ^,          un        \        P                  RV P                  4       V4       V P                   F5  p\        V\        4      '       g   \        R4      hVP                  V4       K7  	  \!        V 4       R# )	z0
Return true if a loop reordering is performed.
FNz1Can not reorder fused node due to different sizeszexpected self_sizes to be setzPDon't reordering fused node %s because we can not decide the suitable loop orderz-Reorder loops for fused node %s with order %sz$expected snode to be a SchedulerNodeT)rÏ  r  rs   rÚ   rø   rX  rÎ  rý  rŽ   r÷   rË  rÌ  rE  r2   rÍ  r¢  r8  )r�   rû  rü  rÏ  rÀ  r�  s   &&&   rm   rÿ  Ú,FusedSchedulerNode.reorder_loops_by_dep_pairä
  sT  € ð ×Ñ×ÒáØˆ
Ø—[”[ˆEÜ˜e¤]×3Ò3ÚØÒ%¬%°
Ó*;¼uÀUÇ\Á\ÐRSÅ_Ó?UÔ*UÜ!×'Ñ'ØGôò ØŸ™ a�ŠJñ !ð ˆ	àÒÜ Ð!@ÓAÐAÜˆz‹?˜h×/Ñ/ÖE°9×3EÑ3E×EØ ×;Ñ;¸IÓFˆIçÜ×#Ñ#ØbØ—‘“ôñ ä×#Ò# qÕ(Õ#Ü×ÑØ;¸T¿]¹]»_Èiô	
ð —[”[ˆEÜ˜e¤]×3Ò3Ü$Ð%KÓLÐLØ×&Ñ& yÖ1ñ !ô
 	(¨Ô-Ùro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r<  r;  r  r¬  ri   rl  rk   )rl   s   "rm   rn   rI    s(   € ÷ Lñ L )ð LÐ5Lð LÐQUñ Lro   c                	ó†   <€ \         SV `  V4       \        WV4       . V n        \	        VR  R7      P
                  V n        R# )c                ó4   € \        V P                  4       4      # rr   ©rµ   rÛ   rÈ  s   &rm   rµ  Ú-FusedSchedulerNode.__init__.<locals>.<lambda>  s   € ¬s°1·>±>Ó3CÔ/Dro   r  N)r0  r¸  rE  r?  rž  rî   )r�   r<  r  r8  s   &&&€rm   r¸  ÚFusedSchedulerNode.__init__  s6   ø€ Ü‰Ñ˜Ô#Ü˜¨Ô0Ø%'ˆŒ
Ü˜Ñ%DÔE×KÑKˆŽ
ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rI    ó   € ÷ =ñ =˜#ñ =ro   c                	ó|   € R P                  V P                   Uu. uF  qP                  4       NK  	  up4      # u upi ©r~  ©rÓ  r  rE  ©r�   rß  s   & rm   rE  ÚFusedSchedulerNode.get_name  ó+   € à�x‰x¨t¯{ª{Ó;©{¨!Ÿ™ž©{Ñ;Ó<Ð<ùÒ;ó   š9c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rI    ó   € ÷ )ñ ) ñ )ro   c                	óD   € V P                   ^ ,          P                  4       # r  ©r  rE  r�   s   &rm   r€  Ú!FusedSchedulerNode.get_first_name  ó   € Ø�{‰{˜1�~×&Ñ&Ó(Ð(ro   c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   rI    ó   € ÷ Nñ N /ñ Nro   c                	ó‚   € \         P                  ! V P                   Uu. uF  qP                  4       NK  	  up!  # u upi rr   ©r   r7  r  rŽ  rp  s   & rm   rŽ  Ú#FusedSchedulerNode.get_buffer_names  ó0   € ä×ÒÀÇÂÓ!LÁ¸1×"4Ñ"4Ö"6ÁÑ!LÑMÐMùÒ!Ló   Ÿ<c               ó   € V ^8„  d   QhRR/# ©rf   ri   r§  rk   )rl   s   "rm   rn   rI  "  ó   € ÷ ñ Ð2ñ ro   c                	ón   € . pV P                    F"  pVP                  VP                  4       4       K$  	  V# rr   ©r  rU  r½  ©r�   r  r¸   s   &  rm   r½  ÚFusedSchedulerNode.get_outputs"  ó/   € Ø(*ˆØ—K”KˆDØ�M‰M˜$×*Ñ*Ó,Ö-ñ  àˆro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rI  (  s   € ÷ 	Bñ 	B ñ 	Bro   c           
     	óŽ  € \        V P                  4       UUu. uF+  w  rV P                  4        R V RVP                  4        2NK-  	  pppV P                  ^ ,          P                  pVe    VP                  V P                  4       4       \        P                  ! RP                  V4      P                  4       R4      # u uppi )z.snodes[z] =
rÍ  r	  )r³  r  rE  rc  r¸   rU  rã  r  r`  rÓ  rÛ  )r�   r°  r¸   rÔ  s   &   rm   r×  Ú"FusedSchedulerNode.debug_str_extra(  s§   € ô % T§[¡[Ô1ô
á1‘�ð �}‰}‹Ð˜x¨ s¨%°·±Ó0@Ð/AÓBÙ1ð 	ñ 
ð �{‰{˜1�~×"Ñ"ˆØÒØ�L‰L˜×3Ñ3Ó5Ô6ä�Š˜tŸy™y¨Ó/×6Ñ6Ó8¸&ÓAÐAùó
s   ™1Cc               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rI  3  s   € ÷ /ñ / ñ /ro   c                	ój   € V P                    Uu. uF  qP                  4       NK  	  ppV  R V 2# u upi )z
, snodes: )r  rò  )r�   r¸   Ú
snodes_strs   &  rm   rò  Ú"FusedSchedulerNode.debug_str_short3  s8   € Ø9=¿ºÓE¹°×*Ñ*Ö,¹ˆ
ÐEØ��z * Ð.Ð.ùò Fs   �0c               ó$   € V ^8„  d   QhRRRRRR/# r2  rk   )rl   s   "rm   rn   rI  7  s$   € ÷ 8ñ 8Ø#2ð8ØHVð8à	ñ8ro   c                	óÊ   <€ \         SV `  W4       \        4       p\        V P                  4       F/  pVP                  W4       VP                  VP                  4       K1  	  R # rr   )r0  r<  r   rù   r  Úupdaterž  )r�   r3  r4  r¸   r8  s   &&& €rm   r<  Ú!FusedSchedulerNode.set_last_usage7  sQ   ø€ ô
 	‰ÑÐ2ÔGô 0:«|ÐÜ˜TŸ[™[Ö)ˆDØ×ÑÐ 3ÔHØ×&Ñ& t§¡Ö7ó *ro   c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   rI  E  s   € ÷ Oñ O ?ñ Oro   c                	ó‚   € \         P                  ! V P                   Uu. uF  qP                  4       NK  	  up!  # u upi rr   )r   r7  r  r  rp  s   & rm   r  Ú$FusedSchedulerNode.used_buffer_namesD  s0   € ä×ÒÀÇÂÓ!MÁ¸A×"5Ñ"5Ö"7ÁÑ!MÑNÐNùÒ!Mr€  c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   rI  I  s   € ÷ 
ñ 
¨oñ 
ro   c                	ó‚   € \         P                  ! V P                   Uu. uF  qP                  4       NK  	  up!  # u upi rr   )r   r7  r  r:  rp  s   & rm   r:  Ú/FusedSchedulerNode.used_or_aliased_buffer_namesH  s5   € ä×ÒØ8<¿ºÓD¹°1×,Ñ,Ö.¹ÑDñ
ð 	
ùÚDr€  c               ó   € V ^8„  d   QhRR/# r¡  rk   )rl   s   "rm   rn   rI  N  ó   € ÷ ñ Ð6ñ ro   c                	ó   € V P                   # rr   rP  r�   s   &rm   rá   ÚFusedSchedulerNode.get_nodesN  rÙ  ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rI  Q  s   € ÷ Añ A˜#ñ Aro   c                	óT   € \        V 4      P                   R V P                  4        R2# )z(nodes=rÃ  rÄ  r�   s   &rm   rÅ  ÚFusedSchedulerNode.__repr__Q  s'   € Ü�t“*×%Ñ%Ð& g¨d¯m©m«oÐ->¸aÐ@Ð@ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rI  U  s   € ÷ :ñ :˜dñ :ro   c                	ó’   € \         ;QJ d&    R  V P                   4       F  '       g   K   R# 	  R# ! R  V P                   4       4      # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )rÛ   r=  s   & rm   rx   Ú2FusedSchedulerNode.is_reduction.<locals>.<genexpr>V  s   é € Ð9©[¨—>‘>×#Ð#«[ùr‡  TF©rB  r  r�   s   &rm   rÛ   ÚFusedSchedulerNode.is_reductionT  s3   € ç‹sÑ9¨T¯[ª[Ó9�sŒsÐ9ŠsÐ9ˆsÑ9¨T¯[ª[Ó9Ó9Ð9ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rI  Y  s   € ÷ >ñ > $ñ >ro   c                	ó’   € \         ;QJ d&    R  V P                   4       F  '       g   K   R# 	  R# ! R  V P                   4       4      # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )rÇ  r=  s   & rm   rx   Ú6FusedSchedulerNode.is_native_matmul.<locals>.<genexpr>Z  s   é € Ð=±¨A×%Ñ%×'Ð'³ùr‡  TFr¥  r�   s   &rm   rÇ  Ú#FusedSchedulerNode.is_native_matmulX  s3   € ç‹sÑ=°·²Ó=�sŒsÐ=ŠsÐ=ˆsÑ=°·²Ó=Ó=Ð=ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rI  ]  s   € ÷ ;ñ ;˜tñ ;ro   c                	ó’   € \         ;QJ d&    R  V P                   4       F  '       g   K   R# 	  R# ! R  V P                   4       4      # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )rË  r=  s   & rm   rx   Ú3FusedSchedulerNode.is_split_scan.<locals>.<genexpr>^  s   é € Ð:©k¨—?‘?×$Ð$«kùr‡  TFr¥  r�   s   &rm   rË  Ú FusedSchedulerNode.is_split_scan\  s3   € ç‹sÑ:¨d¯kªkÓ:�sŒsÐ:ŠsÐ:ˆsÑ:¨d¯kªkÓ:Ó:Ð:ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rI  a  s   € ÷ 9ñ 9˜Tñ 9ro   c                	ó’   € \         ;QJ d&    R  V P                   4       F  '       g   K   R# 	  R# ! R  V P                   4       4      # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r¯  r=  s   & rm   rx   Ú1FusedSchedulerNode.is_template.<locals>.<genexpr>b  s   é € Ð8©K q—=‘=—?�?«Kùr‡  TFr¥  r�   s   &rm   rÏ  ÚFusedSchedulerNode.is_template`  s3   € ç‹sÑ8¨D¯KªKÓ8�sŒsÐ8ŠsÐ8ˆsÑ8¨D¯KªKÓ8Ó8Ð8ro   c               ó   € V ^8„  d   QhRR/# r¡  rk   )rl   s   "rm   rn   rI  e  s   € ÷ ñ Ð#;ñ ro   c                	ó|   € V P                    F+  pVP                  4       '       g   K  VP                  4       u # 	  R # rr   )r  rÏ  r£  ©r�   r¸   s   & rm   r£  Ú$FusedSchedulerNode.get_template_noded  s3   € à—K”KˆDØ×Ñ×!Ô!Ø×-Ñ-Ó/Ò/ñ  ñ ro   c               ó   € V ^8„  d   QhRR/# )rf   ri   útorch.devicerk   )rl   s   "rm   rn   rI  k  s   € ÷ ñ ˜Lñ ro   c                	ó(   € V P                   ^ ,          # r  rN  r�   s   &rm   rÏ   ÚFusedSchedulerNode.get_devicek  s   € Ø�z‰z˜!�}Ðro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rI  o  s   € ÷ Fñ F¨$ñ Fro   c                	ó’   € \         ;QJ d&    R  V P                   4       F  '       g   K   R# 	  R# ! R  V P                   4       4      # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )r  r=  s   & rm   rx   Ú>FusedSchedulerNode.has_aliasing_or_mutation.<locals>.<genexpr>p  s   é € ÐE¹°A×-Ñ-×/Ð/»ùr‡  TFr¥  r�   s   &rm   r  Ú+FusedSchedulerNode.has_aliasing_or_mutationn  s3   € ç‹sÑE¸¿ºÓE�sŒsÐEŠsÐEˆsÑE¸¿ºÓEÓEÐEro   c               ó    € V ^8„  d   QhRRRR/# r  rk   )rl   s   "rm   rn   rI  t  s   € ÷ "ñ "¨Nð "¸tñ "ro   c                	ó   € \         hrr   ©ÚNotImplementedError)r�   r  s   &&rm   r  Ú'FusedSchedulerNode.update_mutated_namest  ó   € Ü!Ð!ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rt   r9   ri   rl  rk   )rl   s   "rm   rn   rI  w  s   € ÷ "ñ " ð "¨ñ "ro   c                	ó   € \         hrr   rÅ  )r�   rt   s   &&rm   r  ÚFusedSchedulerNode.add_fake_depw  rÈ  ro   c               ó    € V ^8„  d   QhRRRR/# rÚ  rk   )rl   s   "rm   rn   rI  z  s   € ÷ "ñ "Ð$4ð "¸ñ "ro   c                	ó   € \         hrr   rÅ  rÝ  s   &&rm   rÞ  ÚFusedSchedulerNode.can_inplacez  rÈ  ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rI  }  s   € ÷ *ñ *˜3ñ *ro   c                ó¼  € V P                  4       pRP                  R V P                   4       4      p\        4       pVP	                  V R\        V 4      P                   RV RV R\        V P                  P                  4       RV R\        V P                  4       RV R	\        V P                  P                  V P                  ,
          4       RV R
V P                   RV RV P                   RV R24       VP                  4       ;_uu_ 4        V P                  4        F"  pVP	                  VP!                  4       4       K$  	  RRR4       VP#                  R4        VP	                  V P%                  4       4       VP-                  4       P/                  4       #   + '       g   i     L_; i  \&         d    \(        P+                  RRR7        LUi ; i)rÉ  rY  c              3  óL   "  € T F  p\        V4      P                  x € K  	  R # 5irr   )rÐ   r¡   r•  s   & rm   rx   Ú/FusedSchedulerNode.debug_str.<locals>.<genexpr>€  s   é € ÐF¹+°Q¤ Q£× 0Ö 0»+ùs   ‚"$rX  rÊ  rË  rÌ  rÍ  rÎ  rÏ  rÐ  rÑ  z.outputs = [
            NrZ  rÒ  TrÓ  )rE  rÓ  r  r[   rÕ  rÐ   r¡   r^  r  rÖ  r®  r  rŸ  r   r`  r½  rc  r[  r×  rØ  rÙ  rÚ  ra  rÛ  )r�   rt   Únode_typestrrÿ   r  s   &    rm   rc  ÚFusedSchedulerNode.debug_str}  sª  € à�}‰}‹ˆØ—x‘xÑF¸$¿+º+ÓFÓFˆÜÓˆØ�
‰
à€€bŒˆd‹×	Ñ	Ð˜Q˜|˜nð -Ø€€j”˜×)Ñ)×0Ñ0Ó1Ð2ð 3Ø€ÐœW T×%<Ñ%<Ó=Ð>ð ?Ø€Ðœ7 4×#3Ñ#3×#9Ñ#9¸D×<SÑ<SÕ#SÓTÐUð VØ€Ð˜T×4Ñ4Ð5ð 6Ø€Ð˜T×4Ñ4Ð5ð 6Ø€ð ðô
	
ð �Z‰Z�\�\Ø×'Ñ'Ö)�Ø—
‘
˜3Ÿ=™=›?Ö+ñ *÷ ð 	�‰�cÔð	HØ�J‰J�t×+Ñ+Ó-Ô.ð �‰Ó ×'Ñ'Ó)Ð)÷ �\ûô ô 	HÜ�K‰KÐ7À$ˆKÖGð	Hús   Ä7F#Å&F6 Æ#F3	Æ6"GÇGc               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rI  š  s   € ÷ *ñ * $ñ *ro   c                	óÌ   <€ V P                   eI   \        ;QJ d&    R V P                    4       F  '       g   K   R# 	  R# ! R V P                    4       4      # \        SV `  4       # )Nc              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )râ  r…  s   & rm   rx   Ú6FusedSchedulerNode.has_side_effects.<locals>.<genexpr>œ  s   é € ÐG¹;°4×,Ñ,×.Ð.»;ùr‡  TF)r  rB  r0  râ  r*  s   &€rm   râ  Ú#FusedSchedulerNode.has_side_effects™  sL   ø€ à�;‰;Ò"ß“3ÑG¸4¿;º;ÓG—3”3ÐG’3ÐG�3ÑG¸4¿;º;ÓGÓGÐGÜ‰wÑ'Ó)Ð)ro   )rî   r?  )'r¡   r¢   r£   r¤   r¹   r¥   r¦   r™   r¸  r³  rP   ry  rÿ  r¸  rE  r€  rŽ  r½  r×  rò  r<  r  r:  rá   rÅ  rÛ   rÇ  rË  rÏ  r£  rÏ   r  r  r  rÞ  rc  râ  r§   rO  rP  s   @rm   r  r  ¥
  sw  ø‡ ñð $Ó#àô+ó ð+õ(õ,ð ôó ðõ"+÷ZLð Lð ô=ó ð=õ)ð ôNó ðNõõ	Bõ/÷8ð 8ð ôOó ðOð ô
ó ð
õ
õAð ô:ó ð:ð ô>ó ð>ð ô;ó ð;ð ô9ó ð9ð ôó ðõð ôFó ðFõ
"õ"õ"õ*ð8 ÷*ó ö*ro   r  c                  óV   a € ] tR tRtRtR V 3R lltR R ltR R ltR	 R
 ltRt	V ;t
# )ÚFusedMixOrderReductionsi   zNFused node for two reductions with different iteration orders (inner + outer).c               ó$   € V ^8„  d   QhRRRRRR/# rõ  rk   )rl   s   "rm   rn   Ú$FusedMixOrderReductions.__annotate__£  s#   € ÷ =ñ =Ð/ð =Ð8Ið =Èdñ =ro   c                	óŒ  <€ \         P                  V4      '       g)   \         P                  V4      '       g   \        R 4      hY!r!Wn        W n        \
        SV `  VP                  \        VP                  4       4      \        VP                  4       4      ,           4       \         P                  V P                  4      V n        R# )z&expected node2 to be a contiguous nodeN)rÔ   r=  rŽ   rª   r«   r0  r¸  r<  rÈ   rá   r#  r-  )r�   rª   r«   r8  s   &&&€rm   r¸  Ú FusedMixOrderReductions.__init__£  s‹   ø€ Ü ×3Ñ3°E×:Ò:Ü$×7Ñ7¸×>Ò>Ü$Ð%MÓNÐNØ �5àŒ
ØŒ
Ü‰ÑØ�O‰OœT %§/¡/Ó"3Ó4´t¸E¿O¹OÓ<MÓ7NÕNô	
ô '×0Ñ0°·±Ó<ˆŽ
ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rª   r   r«   Úother_nodesútuple[BaseSchedulerNode, ...]rk   )rl   s   "rm   rn   rÝ  °  s(   € ÷ 2
ñ 2
à ð2
ð !ð2
ð 3ñ	2
ro   c                ój  € \        V\        4      '       d   \        R4      h\        V\        4      '       d   \        R4      hV P                  P	                  WRR7      '       g   R# \
        P                  V4      '       d   \
        P                  V4      '       g   R# R R lpR R lpV'       d;   V! W34      V! V4      ,          '       g   V! V4      V! W34      ,          '       d   R# VP                  4       '       * ;'       g+    V P                  P                  WRR	7      V P                  8¬  # )
zô
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.
z2expected node1 to not be a FusedMixOrderReductionsz2expected node2 to not be a FusedMixOrderReductionsF©Úallow_mix_order_reductionc               ó    € V ^8„  d   QhRRRR/# ©rf   r¼  râ  ri   rj   rk   )rl   s   "rm   rn   Ú?FusedMixOrderReductions.sub_node_can_fuse.<locals>.__annotate__Î  s   € ÷ 	<ñ 	<Ð"?ð 	<ÀOñ 	<ro   c                óD   € \        4       pVP                  ! R  V  4       !  # )c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   )r;  r•  s   & rm   rx   ÚTFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_ancestors.<locals>.<genexpr>Ð  s   é € Ð:±E¨qŸ{ž{³Eùr	  ©r   r7  ©r¼  r  s   & rm   Ú_get_ancestorsÚAFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_ancestorsÎ  s   € Ü“,ˆCØ—9’9Ñ:±EÓ:Ñ;Ð;ro   c               ó    € V ^8„  d   QhRRRR/# rç  rk   )rl   s   "rm   rn   rè  Ò  s    € ÷ 	Hñ 	HØ0ð	Hàñ	Hro   c                óD   € \        4       pVP                  ! R  V  4       !  # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )r<  r•  s   & rm   rx   ÚZFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_operation_names.<locals>.<genexpr>Ö  s   é € ÐFÁ¸1×4Ñ4×6Ð6Ãùr‡  rì  rí  s   & rm   Ú_get_operation_namesÚGFusedMixOrderReductions.sub_node_can_fuse.<locals>._get_operation_namesÒ  s    € ô “,ˆCØ—9’9ÑFÁÓFÑGÐGro   )Úcount_bytes)
rs   rÛ  rŽ   r<  rI  rÔ   r=  rÛ   Úscore_fusion_memoryr-  )r�   rª   r«   rá  rî  rô  s   &&&&  rm   Úsub_node_can_fuseÚ)FusedMixOrderReductions.sub_node_can_fuse°  s	  € ô �eÔ4×5Ò5Ü Ð!UÓVÐVÜ�eÔ4×5Ò5Ü Ð!UÓVÐVð
 �~‰~×&Ñ& uÈuÐ&×UÒUÙô ×/Ñ/Ø÷
ò 
ä#×6Ñ6°u×=Ò=Ùõ	<õ	H÷ Ù ˜~Ó.Ñ1EÀkÓ1R×RÔRÙ˜{Ó+Ñ.BÀEÀ>Ó.R×RÔRáð ×"Ñ"Ó$Ô$÷ ð Ø�~‰~×1Ñ1°%ÈEÐ1ÓRØ�z‰zñð	
ro   c               ó   € V ^8„  d   QhRR/# ©rf   Úotherr   rk   )rl   s   "rm   rn   rÝ  ä  s   € ÷ Kñ KÐ#4ñ Kro   c                	óæ  € V P                  4       '       g   VP                  4       '       d   R # \        P                  P                  pV^ 8”  dÄ   \	        4       p\
        P                  ! V P                  4       VP                  4       4       FS  pVP                  P                   F6  p\        V\        4      '       g   K  VP                  VP                  4       K8  	  KU  	  \        V4      V8”  d    \        ;P                   ^,          un        R # \        V\"        4      '       gW   V P%                  V P&                  WP(                  34      ;'       g(    V P%                  V P(                  WP&                  34      # V P%                  V P&                  VP&                  V P(                  VP(                  34      ;'       d0    V P%                  V P(                  VP(                  \+        4       4      # rþ  )r:  r.   rÌ   Úmix_order_reduction_max_readsr   rH  rI  rá   r  r  rs   r:   rS  rt   r÷   r2   Ú#rejected_mix_order_reduction_fusionrÛ  rø  rª   r«   rø   )r�   rü  Ú	max_readsÚ	all_readsr£  rw   s   &&    rm   Úcan_fuse_withÚ%FusedMixOrderReductions.can_fuse_withä  si  € Ø×Ñ× Ò  E×$8Ñ$8×$:Ò$:Ùô —M‘M×?Ñ?ˆ	Ø�qŒ=Ü)3«ˆIÜ—o’o d§n¡nÓ&6¸¿¹Ó8IÖJ�ØŸ>™>×/Ô/�CÜ! #¤y×1Ô1Ø!Ÿ™ c§h¡hÖ/ó 0ñ Kô �9‹~ 	Ô)ä×;Ò;¸qÕ@Õ;ÙÜ˜%Ô!8×9Ò9Ø×)Ñ)Ø—
‘
˜E§J¡J =ó÷ Jð Jà×'Ñ'¨¯
©
°E¿J¹J¸=ÓIðJð ×)Ñ)Ø—
‘
˜EŸK™K¨$¯*©*°e·k±kÐ)Bó÷ Kð Kà×(Ñ(¨¯©°U·[±[Ä%Ã'ÓJðKro   c               ó   € V ^8„  d   QhRR/# rû  rk   )rl   s   "rm   rn   rÝ  ÿ  s   € ÷ Gñ GÐ0ñ Gro   c                	óf  € V P                   P                  4       pV P                  P                  V4      p\	        V\
        4      '       dX   VP                  V P                   VP                   4      pVP                  V P                  VP                  4      p\        WE4      # V P                  V P                   WP                  34      '       d2   VP                  V P                   V4      p\        W`P                  4      # VP                  V P                  V4      p\        V P                   V4      # rr   )	rª   rÏ   r<  rj  rs   rÛ  r™   r«   rø  )r�   rü  r¹  ÚbackendÚfused_node1Úfused_node2rð  s   &&     rm   Ú	fuse_withÚ!FusedMixOrderReductions.fuse_withÿ  sÖ   € Ø—‘×&Ñ&Ó(ˆØ—.‘.×,Ñ,¨VÓ4ˆä�eÔ4×5Ò5Ø!Ÿ,™, t§z¡z°5·;±;Ó?ˆKØ!Ÿ,™, t§z¡z°5·;±;Ó?ˆKÜ*¨;ÓDÐDà×%Ñ% d§j¡j°%¿*¹*¸×GÒGØ$Ÿ\™\¨$¯*©*°eÓ<�
Ü.¨z¿:¹:ÓFÐFà$Ÿ\™\¨$¯*©*°eÓ<�
Ü.¨t¯z©z¸:ÓFÐFro   )rª   r«   r-  )r¡   r¢   r£   r¤   r¹   r¸  rø  r  r	  r§   rO  rP  s   @rm   rÛ  rÛ     s(   ø† ÙX÷=ð =õ2
õhK÷6Gó Gro   rÛ  c                  óJ   a € ] tR tRtRtR V 3R lltR R ltR R ltR	tV ;t	# )
ÚFusedNestedReductionsi  z¦
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.
c               ó$   € V ^8„  d   QhRRRRRR/# rõ  rk   )rl   s   "rm   rn   Ú"FusedNestedReductions.__annotate__  s#   € ÷ *
ñ *
Ð/ð *
Ð8Ið *
Èdñ *
ro   c                	óÞ  <€ Wn         W n        \        SV `  VP                  \        VP                  4       4      \        VP                  4       4      ,           4       V ;P                  V P                  4       ,          un        TpVP                  w  pw  rV\        P                  W64      pVf   \        R4      hVw  r‰W€n        W�n        VP                  w  pw  r«\        P                  VV
VV	VR7      pVf   \        R4      hWÀn        V P                   \        P"                  P$                  J V n        VP)                  4       w  rÞ\        P+                  VVV. VOVO5W«3R7      V n        R # )Nz.expected grouped_reduction_info to be non-Nonerù  z$expected grouped_axis to be non-Nonerú  )rª   r«   r0  r¸  r<  rÈ   rá   r;  r<  rî   rm  r©  rŽ   r“  r¨  rû  rÛ  r�  r�  Úgroup_size_in_rr¡  rš  r¬  )r�   rª   r«   rq  r~  r•  r–  rÿ  r“  Úexact_group_sizerÙ  rÚ  rÛ  r¦  r§  r8  s   &&&            €rm   r¸  ÚFusedNestedReductions.__init__  sc  ø€ ØŒ
ØŒ
Ü‰ÑØ�O‰OœT %§/¡/Ó"3Ó4´t¸E¿O¹OÓ<MÓ7NÕNô	
ð 	�Š˜$×2Ñ2Ó4Õ4�ØˆØ-9×-?Ñ-?Ñ*ˆÑ*ˆMÜ!0×!PÑ!PØó"
Ðð "Ò)Ü Ð!QÓRÐRØ.DÑ+ÐØ0AÔØ)9ŒØ).¯©Ñ&ˆÑ&ˆKÜ&×7Ñ7ØØØØØð 8ó 
ˆð ÒÜ Ð!GÓHÐHØ9EÔØ%)×%6Ñ%6¼/×:UÑ:U×:WÑ:WÐ%WˆÔØ%6×%AÑ%AÓ%CÑ"ˆä×2Ñ2Ø"3Ø+Ø-Ø'E¨Ð'E°}Ñ'EØ$/Ð#>ð 3ó ð 	Öro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rü  r   Úcan_reorderr”   ri   rk   )rl   s   "rm   rn   r  C  s"   € ÷ %
ñ %
Ð#4ð %
Àdð %
Ètñ %
ro   c               ó  € VP                  4       '       d   R# V P                  P                  4       VP                  ,          '       g   R# \        P                  V P                  VP                  4       4      pVf   R# \        P                  V P                  V4      '       g   R# \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# V P                  P                  V P                  VVVR7      # )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.
Fc              3  ó^   "  € T F#  w  rV\         P                  P                  J x € K%  	  R # 5irr   )rm  rŠ  rˆ  )rv   r~  rÆ  s   &  rm   rx   Ú6FusedNestedReductions.can_fuse_with.<locals>.<genexpr>^  s*   é € ð 
á.‘	�ð ”o×5Ñ5×KÑKÕKÛ.ùs   ‚+-T©r  )rÛ   r«   r<  r;  rm  r¶  r¬  rá   r¯  rB  r<  Ú!_can_fuse_nested_reduction_append)r�   rü  r  r°  s   &&$ rm   r  Ú#FusedNestedReductions.can_fuse_withC  sñ   € ð ×Ñ×ÒÙð —
‘
×.Ñ.Ó0°5·?±?×BÔBÙô ×=Ñ=Ø×ÑØ�O‰OÓó
ð 	ð Ò$ÙÜ×@Ñ@Ø×ÑÐ!2÷
ò 
ñ ÷ ‹3ñ 
á.ó
�3�3Š3ñ 
á.ó
÷ 
ò 
ñ Ø�~‰~×?Ñ?Ø�J‰JØØØ#ð	 @ó 
ð 	
ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rü  r   ri   r  rk   )rl   s   "rm   rn   r  j  s   € ÷ <ñ <Ð0ð <Ð5Jñ <ro   c                	óÐ   € V P                   P                  4       pV P                  P                  V4      pVP	                  V P                   V4      p\        V P                  V4      # rr   )r«   rÏ   r<  rj  r™   r  rª   )r�   rü  r¹  r  Ú	new_node2s   &&   rm   r	  ÚFusedNestedReductions.fuse_withj  sM   € Ø—‘×&Ñ&Ó(ˆØ—.‘.×,Ñ,¨VÓ4ˆØ—L‘L §¡¨UÓ3ˆ	Ü$ T§Z¡Z°Ó;Ð;ro   )r¬  r¨  r  rÛ  r“  rª   r«   )
r¡   r¢   r£   r¤   r¹   r¸  r  r	  r§   rO  rP  s   @rm   r  r    s#   ø† ñ÷*
ð *
õX%
÷N<ó <ro   r  c                  óh   a € ] tR tRtR V 3R llt]R R l4       tR R ltR R	 ltR
 R lt	Rt
V ;t# )Ú$FusedExternTritonKernelSchedulerNodeiq  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   r<  r;  Úkernel_noderb  Úfused_epiloguerÚ   ri   rl  rk   )rl   s   "rm   rn   Ú1FusedExternTritonKernelSchedulerNode.__annotate__r  s2   € ÷ .ñ .àð.ð /ð.ð &ð	.ð
 
ñ.ro   c                	óN  <€ \        VP                  \        P                  4      '       g   \	        R 4      h\
        P                  ! \        \        ,          W#.4      p\        SV `)  W4       W n        W0n        V P                  P                  V n        VP                  V n        R# )ú=expected kernel_node.node to be an ir.UserDefinedTritonKernelN)rs   r¸   r1   r2  rŽ   r  r  rÈ   r   r0  r¸  r"  r#  r¡  r¨  )r�   r<  r"  r#  r  r8  s   &&&& €rm   r¸  Ú-FusedExternTritonKernelSchedulerNode.__init__r  s‚   ø€ ô ˜+×*Ñ*¬B×,FÑ,F×GÒGÜ ØOóð ô —’œTÔ"3Õ4°{Ð6SÓTˆÜ‰Ñ˜Ô+Ø&ÔØ,ÔØ×)Ñ)×3Ñ3ˆŒØ%×-Ñ-ˆŽro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rª   rb  r«   rÚ   ri   r  rk   )rl   s   "rm   rn   r$  „  s(   € ÷ ,ñ ,à(ð,ð ð,ð 
ñ	,ro   c                	ó"  € \        VP                  \        P                  4      '       g   \	        R 4      hVP
                  p\        VP                  P                  4      ^8w  d,   \	        R\        VP                  P                  4       24      hVP                  P                  ^ ,          P                  pVP                  P                  WD4      pVP                  V,          P                  P                  \        V4      4       V ! W1V4      # )ú7expected node1.node to be an ir.UserDefinedTritonKernelú"expected one mutation output, got )rs   r¸   r1   r2  rŽ   r<  r÷   Úmutation_outputsrt   r4  r  r{  r?  ÚremoveÚNodeUser)r˜   rª   r«   r<  Úmutated_nameÚ	real_names   &&&   rm   Úepilogue_fuseÚ2FusedExternTritonKernelSchedulerNode.epilogue_fuseƒ  sØ   € ô ˜%Ÿ*™*¤b×&@Ñ&@×AÒAÜ ØIóð ð —O‘Oˆ	äˆu�z‰z×*Ñ*Ó+¨qÔ0Ü Ø4´S¸¿¹×9TÑ9TÓ5UÐ4VÐWóð ð "ŸJ™J×7Ñ7¸Õ:×?Ñ?ˆð ×0Ñ0×4Ñ4°\ÓPˆ	Ø×Ñ˜iÕ(×.Ñ.×5Ñ5´h¸u³oÔFÙ�9 UÓ+Ð+ro   c               ó    € V ^8„  d   QhRRRR/# rJ  rk   )rl   s   "rm   rn   r$  œ  s   € ÷ 
ñ 
Ð3ð 
¸ñ 
ro   c                	ó$  € \        V P                  P                  \        P                  4      '       g   \        R 4      h\        V P                  P                  \        P                  4      '       g   \        R4      hV P                  P                  P                  4       '       g   \        R4      h\        P                  ! V P                  P                  P                  ^ ,          P                  4      p^ RIHp VP                  V P                  .V4      w  rE^ RIHp V! V P                  .V4      p^ RIHp V! WGV 4      p	V	P)                  4       p
V P                  P                  P+                  WP                  P                  V
34      # )z7expected fused_epilogue.node to be an ir.ComputedBufferr&  z2expected kernel_node.node to allow epilogue fusionrÝ  rì  )ÚFusedUserDefinedTritonKernel)rs   r#  r¸   r1   r   rŽ   r"  r2  r3  r4  r6  r5  r6  Útorch._inductor.codegen.simdrÞ  Úget_tiling_and_scoresÚ,torch._inductor.codegen.simd_kernel_featuresrí  Útorch._inductor.codegen.tritonr5  rø  Úcodegen_with_epilogue_fusion)r�   rK  r-  rÞ  rç  r~  rí  Úkernel_featuresr5  Úfused_user_kernelÚnew_kernel_srcs   &&         rm   rø  Ú,FusedExternTritonKernelSchedulerNode.codegenœ  sA  € Ü˜$×-Ñ-×2Ñ2´B×4EÑ4E×FÒFÜ ØIóð ô ˜$×*Ñ*×/Ñ/´×1KÑ1K×LÒLÜ ØOóð ð ×Ñ×$Ñ$×6Ñ6×8Ò8Ü Ð!UÓVÐVÜ—	’	˜$×*Ñ*×/Ñ/×<Ñ<¸QÕ?×EÑEÓFˆÝ?à"×8Ñ8¸$×:MÑ:MÐ9NÐPUÓV‰	ˆåSá,¨d×.AÑ.AÐ-BÀEÓJˆåOá8¸ÐRVÓWÐØ*×2Ñ2Ó4ˆà×Ñ×$Ñ$×AÑAØ×)Ñ)×.Ñ.°Ð?ó
ð 	
ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   r$  ¹  r>  ro   c                	ó   € R # rº  rk   r�   s   &rm   rÓ  Ú.FusedExternTritonKernelSchedulerNode.is_extern¹  r¥  ro   c               ó   € V ^8„  d   QhRR/# rE  rk   )rl   s   "rm   rn   r$  ¼  s   € ÷ -ñ -Ð:ñ -ro   c                	ó6   € V P                   P                  4       # rr   )r"  r¡  r�   s   &rm   r¡  Ú/FusedExternTritonKernelSchedulerNode.get_ranges¼  s   € Ø×Ñ×*Ñ*Ó,Ð,ro   )r#  r"  r¡  r¨  )r¡   r¢   r£   r¤   r¸  r¦   r1  rø  rÓ  r¡  r§   rO  rP  s   @rm   r   r   q  s5   ø† ÷.ð .ð" ô,ó ð,õ0
õ:÷-ó -ro   r   c                  ó6  a € ] tR tRt$ RtR R ltR R lt]R R l4       t]R	 R
 l4       t	R&R V 3R lllt
]R R l4       t]R R l4       t]tR]R&   ]R R l4       t]R R l4       tR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR%tV ;t# )'ÚForeachKernelSchedulerNodeiÀ  zŽ
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.
c               ó    € V ^8„  d   QhRRRR/# )rf   Úproducerr   ri   r  rk   )rl   s   "rm   rn   Ú'ForeachKernelSchedulerNode.__annotate__Æ  s   € ÷ ñ Ø)ðà	!ñro   c                	ó¸   € VP                  4        FE  pVP                  4       V P                  9   g   K$  V P                  VP                  4       ,          u # 	  R # rr   )r½  rE  Úread_to_node)r�   rH  rÿ   s   && rm   Úget_consumer_subnode_forÚ3ForeachKernelSchedulerNode.get_consumer_subnode_forÆ  sG   € ð ×'Ñ'Ö)ˆCØ�|‰|‹~ ×!2Ñ!2Ö2Ø×(Ñ(¨¯©«Õ8Ò8ñ *ñ ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úconsumerr   ri   r  rk   )rl   s   "rm   rn   rI  Ï  s   € ÷ ñ Ø)ðà	!ñro   c                	óÔ  € \         \        ,          ! 4       pVP                  P                   F“  pVP                  V P
                  P                  9  d   K*  V P
                  P                  VP                  ,          P                  4       pW@P                  9   g   Kq  VP                  V P                  V,          4       K•  	  \        V4      ^8X  d   \        \        V4      4      # R# ©r�  N)r   r   r  r  rt   r<  r{  rG  Úname_to_noderS  r÷   r²  r  )r�   rO  Ú	producersÚrdÚ	node_names   &&   rm   Úget_producer_subnode_forÚ3ForeachKernelSchedulerNode.get_producer_subnode_forÏ  s¥   € ô Ô0Ö1Ó3ˆ	Ø×&Ñ&×,Ô,ˆBØ�w‰w˜dŸn™n×8Ñ8Ô8ÙàŸ™×2Ñ2°2·7±7Õ;×LÑLÓNˆIØ×-Ñ-Ö-Ø—‘˜d×/Ñ/°	Õ:Ö;ñ -ô ˆy‹>˜QÔÜœ˜Y›Ó(Ð(áro   c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   rH  r   rO  ri   r”   rk   )rl   s   "rm   rn   rI  ã  s$   € ÷ ,
ñ ,
Ð 1ð ,
Ð=Nð ,
ÐSWñ ,
ro   c                	óœ  a€ \        SV4      pSP                  4       '       Ed   VP                  4       '       dò   \        P                  ! \        S4      o\        P                  ! \        V4      p\        SP                  4      \        VP                  4      8H  pV'       g	   V! R 4       T;'       dw    \        ;QJ d=    V3R l\        SP                  VP                  4       4       F  '       d   K   R# 	  R# ! V3R l\        SP                  VP                  4       4       4      # VP                  4       '       dw   SP                  4       '       d   V! R4       R# \        P                  ! \        V4      pVP                  S4      pVe   VP                  P                  SV4      # V! R4       R# SP                  4       '       dv   VP                  4       '       d   V! R4       R# \        P                  ! \        S4      oSP                  V4      pVe   SP                  P                  Wb4      # V! R4       R# \        R4      h)	zforeach do not have same lengthc              3  ó^   <"  € T F"  w  rSP                   P                  W4      x € K$  	  R # 5irr   )r<  rI  )rv   ÚlÚrrH  s   &  €rm   rx   Ú6ForeachKernelSchedulerNode.can_fuse.<locals>.<genexpr>ë  s.   øé € ð )áA‘D�Að ×"Ñ"×+Ñ+¨A×1Ð1ÛAùs   ƒ*-FTzXcandidate producer is a reduction, foreach ops cannot be fused with reductions currentlyz5candidate 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  rF  r÷   r  rà   r÷  rÛ   rL  r<  rI  rV  rŽ   )r˜   rH  rO  ÚwhyÚforeach_matchÚconsumer_subnodeÚproducer_subnodes   &f&    rm   rI  Ú#ForeachKernelSchedulerNode.can_fuseâ  sã  ø€ ä˜ (Ó+ˆØ×Ñ× Ó  X×%8Ñ%8×%:Ò%:Ü—{’{Ô#=¸xÓHˆHÜ—{’{Ô#=¸xÓHˆHÜ §¡Ó0´C¸¿¹Ó4HÑHˆMß ÙÐ5Ô6Ø ÷ ð §S£Sô )ä §¡°·±ÔAó)§S¤Sð ¢Sð  Sô )ä §¡°·±ÔAó)ó &ð ð × Ñ ×"Ò"Ø×$Ñ$×&Ò&ÙØnôñ ä—{’{Ô#=¸xÓHˆHØ'×@Ñ@ÀÓJÐØÒ+Ø×)Ñ)×2Ñ2°8Ð=MÓNÐNáÐGÔHÙà× Ñ ×"Ò"Ø×$Ñ$×&Ò&ÙØnôñ ä—{’{Ô#=¸xÓHˆHØ'×@Ñ@ÀÓJÐØÒ+Ø×)Ñ)×2Ñ2Ð3CÓNÐNáÐGÔHÙäØfó
ð 	
ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rH  r   rO  ri   rF  rk   )rl   s   "rm   rn   rI    s$   € ÷ ?
ñ ?
Ø(ð?
Ø4Eð?
à	#ñ?
ro   c           	     	óˆ  € VP                  4       '       g"   VP                  4       '       g   \        R 4      hVP                  4       '       d5   \        P                  ! \        V4      pVP
                  pVP                  pM3\        P                  ! \        V4      pVP
                  pVP                  pRpRpVP                  4       '       d•   VP                  4       '       d   \        P                  ! \        V4      p\        P                  ! \        V4      p\        VP                  VP                  4       UUu. uF  w  rx\        P                  Wx4      NK  	  p	ppEMCVP                  4       '       d‡   \        P                  ! \        V4      pVP                  V4      p
. p	TpRpVP                   FC  pWºJ d+   \        P                  W²4      pTpV	P                  V4       K2  V	P                  V4       KE  	  M§VP                  4       '       d‡   \        P                  ! \        V4      pVP                  V4      p. p	TpRpVP                   FC  pW½J d+   \        P                  W4      pTpV	P                  V4       K2  V	P                  V4       KE  	  M\        R4      hV ! VP                  V	VVVVR7      # u uppi )z+expected producer or consumer to be foreachNzTAt 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  r  rF  rf  ri  r÷  r  r  r™   rV  r  rL  r<  )r˜   rH  rO  rf  ri  rg  rh  r\  r]  Úfused_nodesrb  r¸   Únew_nodera  s   &&&           rm   r™   ÚForeachKernelSchedulerNode.fuse  sb  € ð ×#Ñ#×%Ò%¨×)<Ñ)<×)>Ò)>Ü Ð!NÓOÐOØ×Ñ× Ò Ü—{’{Ô#=¸xÓHˆHØ(0×(JÑ(JÐ%Ø&×6Ñ6‰Oä—{’{Ô#=¸xÓHˆHØ(0×(JÑ(JÐ%Ø&×6Ñ6ˆOØˆØˆà×Ñ× Ò  X×%8Ñ%8×%:Ò%:Ü—{’{Ô#=¸xÓHˆHÜ—{’{Ô#=¸xÓHˆHô   §¡°·±ÔAôáA‘D�Aô #×'Ñ'¨Ö-ÙAð ñ ‰Kð × Ñ ×"Ò"Ü—{’{Ô#=¸xÓHˆHØ'×@Ñ@ÀÓJÐØˆKØ"ˆKØˆKØ Ÿœ�ØÓ+Ü1×6Ñ6°tÓF�HØ"*�KØ×&Ñ& xÖ0à×&Ñ& tÖ,ò (ð × Ñ ×"Ò"Ü—{’{Ô#=¸xÓHˆHØ'×@Ñ@ÀÓJÐØˆKØ"ˆKØˆKà Ÿœ�ØÓ+Ü1×6Ñ6°xÓF�HØ"*�KØ×&Ñ& xÖ0à×&Ñ& tÖ,ò (ô !Øfóð ñ Ø×ÑØØ&?Ø#Ø#Ø+ô
ð 	
ùóKs   Ä> J>c               ó8   € V ^8„  d   QhRRRRRRRRR	RR
RRRRR/# )rf   r<  r;  r  r¬  rf  r”   rg  r  rh  ri  Úper_subkernel_blocksri   rl  rk   )rl   s   "rm   rn   rI  S  sd   € ÷ U9ñ U9àðU9ð (ðU9ð $(ð	U9ð
 .ðU9ð .ðU9ð ðU9ð #ðU9ð 
ñU9ro   c                	ó  <a € / S n         / S n        Ve   Vfw   \        SS `  W4       V F_  pVP                  P
                   F  p	VS P                   V	P                  &   K  	  VP                  4        F  p
VS P                  V
&   K  	  Ka  	  EMeVS n        VS n	        R S n
        . S n        S P                  \        P                  P                  VP                  VP                  .4      4       \!        V 3R l\         P"                  ! VP$                  VP$                  4       4       4      S P                  P&                  ,
          S n        \)        VP*                  VP*                  .4      S n        \-        VP.                  VP.                  .4      S n        \)        VP0                  VP0                  4      S n        \-        VP2                  VP2                  4      S n        VP5                  4       '       d%   \7        V\8        4      '       g   \;        R4      hYErËM#\7        V\8        4      '       g   \;        R4      hYTrËVP<                  S n        S P<                  P?                  VP<                  4       VP                  S n        VP                  4        F  p
VS P                  V
&   K  	  S P                   UUUu/ uF'  qÝP@                  PC                  4        F  w  rïWïbK	  	  K)  	  upppS n         VS n"        V^ ,          PG                  4       pV'       g   \;        R4      hV\H        PJ                  ! R4      333S n&        \         \N        PP                  PR                  ,          ! 4       S n*        VS n+        VS n,        R # u upppi )Nc              3  ój   <"  € T F(  pVP                   SP                  4       9  g   K$  Vx € K*  	  R # 5irr   r2  r[  s   & €rm   rx   Ú6ForeachKernelSchedulerNode.__init__.<locals>.<genexpr>v  s5   øé € ð ñ ˜ð —x‘x t×'<Ñ'<Ó'>Ñ>÷	 ’Có ùr4  z7expected prev_node_1 to be a ForeachKernelSchedulerNodez7expected prev_node_2 to be a ForeachKernelSchedulerNodeúexpected device to be setÚcombo_kernel)-rK  rR  r0  r¸  r  r  rt   r<  r<  r  r¸   r?  r  r0   r5  r6  r   r7  r®  rÖ  rŸ  r¡  rž  r¢  rŸ  r   r×  rs   rF  rŽ   r;  r’  rª  r#  rf  rÏ   r@  ÚExprrî   rê  ÚfxÚNoder  ri  rn  )r�   r<  r  rf  rg  rh  ri  rn  r¸   r  rt   Úforeach_noderE  rÀ  r7  Úvr¹  r8  s   f&&&&&&&         €rm   r¸  Ú#ForeachKernelSchedulerNode.__init__S  s  ù€ ð ˆÔØˆÔàÒ +Ò"5Ü‰GÑ˜YÔ/ã�Ø ×,Ñ,×2Ô2�DØ37�D×%Ñ% d§i¡iÓ0ñ 3ð !×4Ñ4Ö6�DØ.2�D×%Ñ% dÓ+ó 7ó	 ð 'ˆDŒNØ ˆDŒKØˆDŒIØ)+ˆDŒJà× Ñ Ü×'Ñ'×2Ñ2Ø ×,Ñ,¨k×.EÑ.EÐFóôô ô ä)×/Ò/Ø#×6Ñ6¸×8VÑ8Vô óó ð ×"Ñ"×)Ñ)õ*ð Ô#ô ! +×"7Ñ"7¸×9NÑ9NÐ!OÓPˆDŒNÜ  +×"7Ñ"7¸×9NÑ9NÐ!OÓPˆDŒNÜ&)Ø×.Ñ.°×0NÑ0Nó'ˆDÔ#ô '*Ø×.Ñ.°×0NÑ0Nó'ˆDÔ#ð ×%Ñ%×'Ò'Ü! +Ô/I×JÒJÜ(ØQóð ð ,7™jä! +Ô/I×JÒJÜ(ØQóð ð ,7˜jà)×3Ñ3ˆDŒNØ�N‰N×!Ñ! *×"6Ñ"6Ô7à ,× 9Ñ 9ˆDÔØ"×6Ñ6Ö8�Ø*4�×!Ñ! $Ó'ñ 9ð #'§+¢+õ@Ù"-˜×:OÑ:O×:UÑ:UÖ:W±$°!�’Ñ:W‘¡+ó@ˆDÔ ð *CˆÔ&Ø˜•×%Ñ%Ó'ˆßÜ Ð!<Ó=Ð=Ø¤§
¢
¨>Ó :Ð<Ð>Ð?ˆŒ
Ü!¤%§(¡(§-¡-Ö0Ó2ˆŒØ.ˆÔØ$8ˆÖ!ùô@s   Ê=-Nc               ó    € V ^8„  d   QhRRRR/# ©rf   r¼  r¬  ri   rk   )rl   s   "rm   rn   rI  «  s    € ÷ eñ eØ+ðeà	 ñero   c                ó^	  € V Uu. uF  p\        V\        4      '       g   K  VNK  	  ppV'       dX   \        P                  R\	        V4      V Uu. uF,  qDP
                  f   K  VP
                  P                  4       NK.  	  up4       V Uu. uF  p\        V\        4      '       g   K  VNK  	  ppV'       d    \        P                  R\	        V4      4       V Uu. uF  p\        V\        4      '       g   K  VNK  	  ppV'       d    \        P                  R\	        V4      4       V Uu. uF  p\        V\        4      '       g   K  VNK  	  ppV'       d    \        P                  R\	        V4      4       V Uu. uF2  p\        V\        \        \        \        \        34      '       d   K0  VNK4  	  ppV Uu. uF  p\        V\        4      '       g   K  VNK  	  p	pV	'       d    \        P                  R\	        V	4      4       V Uu. uF  p\        V\        4      '       d   K  VNK  	  ppV Uu. uF  q"P                  4       '       g   K  VNK  	  p
pV
'       d!   \        P                  R\	        V
4      V
4       V Uu. uF  q"V
9  g   K  VNK  	  ppV Uu. uF  qDP                  4       '       d   K  VNK  	  pp\        P                  '       dx   V Uu. uF  q"P!                  4       '       g   K  VNK  	  ppV'       d    \        P                  R\	        V4      4       V Uu. uF  q"P!                  4       '       d   K  VNK  	  pp\        P"                  '       gB   \        P$                  ^ 8”  dê   \        P&                  '       dÔ   \        P(                  '       d¾   V Uu. uFq  p\*        ;QJ d4    R VP,                  P/                  4        4       F  '       g   K   R	M)	  R
M%! R VP,                  P/                  4        4       4      '       g   Ko  VNKs  	  ppV'       d9   \        P                  R\	        V4      4       V Uu. uF  qÌV9  g   K  VNK  	  ppV# u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi )zÂFilter a node list down to combo-kernel candidates.

Drops node kinds that can't or shouldn't share a combo kernel:
extern, grouped, mixed-order reduction, existing foreach, and
template nodes.
z/ComboKernels: %d external nodes are filtered %sz+ComboKernels: %d grouped nodes are filteredz;ComboKernels: %d FusedMixOrderReductions nodes are filteredz9ComboKernels: %d FusedNestedReductions nodes are filteredz+ComboKernels: %d foreach nodes are filteredz0ComboKernels: %d template nodes are filtered: %szCComboKernels: %d reduction nodes are filtered (pointwise_only mode)c              3  ór   "  € T F-  p\        V\        4      ;'       d    VP                  4       x € K/  	  R # 5irr   )rs   r:   Úis_indirectru   s   & rm   rx   Ú>ForeachKernelSchedulerNode.combinable_nodes.<locals>.<genexpr>  s0   é € ð á?˜ô ˜s¤IÓ.×DÐD°3·?±?Ó3DÔDÛ?ùs   ‚7ž7TFz5ComboKernels: %d indirect-indexing nodes are filtered)rs   rb  rÙ  rý  r÷   r¸   r  rD  rÛ  r  rý  rF  rÏ  r:  r.   Úcombo_kernels_pointwise_onlyrÛ   Úbenchmark_combo_kernelÚcombo_kernels_autotuneÚ!combo_kernel_per_subkernel_blocksÚ"combo_kernel_compile_time_autotunerB  r  r
  )r˜   r¼  rß  Úexternr¸   ÚgroupedÚ	mix_orderÚnested_reductionsÚfiltered_nodesÚforeach_nodesÚtemplate_nodesÚreduction_nodesr–  Úindirect_nodess   &&            rm   Úcombinable_nodesÚ+ForeachKernelSchedulerNode.combinable_nodesª  sÑ  € ñ #ÓO™U˜¤j°Ô4M×&N—!�!™UˆÐOßÜ�I‰IØAÜ�F“Ù5;ÓU±V¨T¿y¹yÔ(�—‘×&Ñ&Ö(±VÑUôñ
 $ÓK™e˜¤z°!Ô5I×'J—1�1™eˆÐKßÜ�I‰IØ=Ü�G“ôñ !&ÓP¡˜1¬°AÔ7N×)O—Q�Q¡ˆ	ÐPßÜ�I‰IØMÜ�I“ôñ ).ÓV© 1´¸AÔ?T×1UŸQ˜Q©ÐÐVßÜ�I‰IØKÜÐ%Ó&ôñ ó
á�ÜØä*Ü-Ü(Ü+Ü)ð÷	÷ ˆAÙð 	ð 
ñ &ó
Ù%�!¬°AÔ7Q×)R�AˆA‘~ð 	ð 
÷ Ü�I‰IÐCÄSÈÓEWÔXá%ó
Ù%�!¬Z¸Ô;U×-V�AˆA‘~ð 	ð 
ñ &4ÓG¡^ ·}±}·Ÿ!˜!¡^ˆÐGßÜ�I‰IØBÜ�NÓ#Øôñ
 &4ÓO¡^ ÀÑ7NŸ!˜!¡^ˆÐOñ ,:ÓW©> 4×ATÑAT×AVŸ$˜$©>ˆÐWô ×.×.Ð.Ù*8ÓM©. Q¿N¹N×<LŸq˜q©.ˆOÐMßÜ—	‘	ØYÜ˜Ó(ôñ *8ÓP© A¿~¹~×?OŸa˜a©ˆNÐPô ×(×(Ð(Ü×)Ñ)¨AÔ-Ü×8×8Ð8Ü×9×9Ð9ñ (óá'�Aß“3ñ à Ÿ}™}×=Ñ=Ô?ó—3—3’3ñ à Ÿ}™}×=Ñ=Ô?ó÷ ÷ �Ù'ð ð ÷ Ü—	‘	ØKÜ˜Ó'ôñ .<Ó!W©^¨ÈÑ?V§! !©^�Ð!WàÐùòy Pùò
 VùâKùò Qùò Wùò
ùò
ùò

ùò Hùò Pùò Xùò Nùò Qùòùò "Xs¾   …Q$¢Q$ÁQ)Á$Q)ÂQ.Â*Q.ÃQ3Ã:Q3Ä-Q8Å
Q8Å=-Q=Æ/Q=Æ;RÇRÈRÈ(RÈ4RÉRÊRÊRÊRÊ9RËRË7RÌ*R ÍR Î)R%Î9)R%Ï%0R%ÐR%ÑR*ÑR*c               ó    € V ^8„  d   QhRRRR/# ©rf   r<  r;  ri   úlist[list[BaseSchedulerNode]]rk   )rl   s   "rm   rn   rI    s   € ÷ 7ñ 7Øð7à	&ñ7ro   c                óÄ  € V P                  4       p. p\        P                  p\        V UUUu. uF=  pV F4  p\	        V\
        4      '       g   K  VP                  4        F  pVNK  	  K6  	  K?  	  uppp4      pV EFS  p\        \        4      p	V Fu  pVP                  4       p
V
'       d%   V
P                  R8X  g   V
P                  R8X  d   K?  VP                  4       V,          '       d   K^  Wš,          P                  V4       Kw  	  V	P                  4        F±  p\        \        4      pV FE  pVV P                  V4      V P                  P!                  V4      3,          P                  V4       KG  	  VP                  4        F@  pTP#                  \%        ^ \'        V4      V4       Uu. uF  pWÞWã,            NK  	  up4       KB  	  K³  	  EKV  	  V# u upppi u upi )zC
Returns a list of lists of nodes that are to be grouped together.
Úmpsr·  )Ú_topological_sort_nodesr.   Úcombo_kernel_max_num_nodesr   rs   rÛ  rŽ  r   rÈ   rÏ   rÐ   r  r  r	  Úget_node_streamr   r  rU  r®  r÷   )r<  Úsorted_nodesÚgrouped_nodesÚmax_num_nodesrî   r¸   r®  Úexcluded_buffer_namesr¼  Údevice_groupsr¹  Údevice_nodesÚcontext_groupsÚcontext_nodesr°  s   &              rm   Ú&_default_group_nodes_for_combo_kernelsÚAForeachKernelSchedulerNode._default_group_nodes_for_combo_kernels  sÐ  € ð !×8Ñ8Ó:ˆØˆÜ×9Ñ9ˆä1;ñ *õá)�EÛ!�DÜ˜dÔ$;×<ô ð !%× 5Ñ 5Ö 7�Hó	 ñ !8ñ	 á!ñ Ù)óó2
Ðô "ˆEô œDÓ!ð ó �ØŸ™Ó*�ß˜vŸ{™{¨eÔ3°v·{±{ÀeÔ7KÙð ×)Ñ)Ó+Ð.C×CÔCÙØÕ%×,Ñ,¨TÖ2ñ ð !.× 4Ñ 4Ö 6�ô  ¤Ó%ð ó )�DØ"à%×5Ñ5°dÓ;Ø%×5Ñ5×9Ñ9¸$Ó?ðõ÷
 ‘f˜T–lñ )ð &4×%:Ñ%:Ö%<�MØ!×(Ñ(ô &+¨1¬c°-Ó.@À-Ô%Póá%P ð *¨aÕ.?Ó@Ù%Pñöó &=ô !7ñ% "ðH ÐùôYùòNs   ®GÁ!GÆ-Gú4Callable[[Scheduler], list[list[BaseSchedulerNode]]]Ú!group_algorithm_for_combo_kernelsc               ó    € V ^8„  d   QhRRRR/# )rf   Úcustom_group_algorithmr¢  ri   rl  rk   )rl   s   "rm   rn   rI  Q  s   € ÷ 
ñ 
Ø Tð
à	ñ
ro   c                	ó   € V \         n        R # rr   ©rF  r£  )r¥  s   &rm   Ú%set_group_algorithm_for_combo_kernelsÚ@ForeachKernelSchedulerNode.set_group_algorithm_for_combo_kernelsP  s   € ð
 #ô 	#ÖDro   c               ó    € V ^8„  d   QhRRRR/# r‘  rk   )rl   s   "rm   rn   rI  Y  s    € ÷ Wñ WØðWà	&ñWro   c                	ó,   € \         P                  V 4      # rr   r§  ©r<  s   &rm   Úgroup_nodes_for_combo_kernelsÚ8ForeachKernelSchedulerNode.group_nodes_for_combo_kernelsX  s   € ô *×KÑKÈIÓVÐVro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rI  ^  s   € ÷ "ñ "˜$ñ "ro   c                	ó   € \         hrr   rÅ  r�   s   &rm   r@  Ú#ForeachKernelSchedulerNode.mark_run^  rÈ  ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rI  a  s   € ÷ "ñ "˜ñ "ro   c                	ó   € \         hrr   rÅ  r�   s   &rm   rø  Ú"ForeachKernelSchedulerNode.codegena  rÈ  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rI  d  s   € ÷ ñ ˜Dñ ro   c                	ó   € R # rº  rk   r�   s   &rm   r×  Ú%ForeachKernelSchedulerNode.is_foreachd  r¥  ro   c               ó   € V ^8„  d   QhRR/# ©rf   ri   r¬  rk   )rl   s   "rm   rn   rI  g  s   € ÷ !ñ !Ð%<ñ !ro   c                ó,   € \        V P                  4      # )z]Returns a list of nodes which comprise the combo kernel.
These nodes may be vertically fused.)rÈ   r  r�   s   &rm   Úget_subkernel_nodesÚ.ForeachKernelSchedulerNode.get_subkernel_nodesg  s   € ô �D—K‘KÓ Ð ro   c               ó   € V ^8„  d   QhRR/# r¡  rk   )rl   s   "rm   rn   rI  l  s   € ÷ Wñ WÐ6ñ Wro   c                ót   € \        \        P                  P                  R V P                   4       4      4      # )ziReturns all nodes contained in this kernel, unpacking fused nodes
into their constituent scheduler nodes.c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )rá   r=  s   & rm   rx   Ú7ForeachKernelSchedulerNode.get_nodes.<locals>.<genexpr>o  s   é € Ð1UÉÀA·+±+·-°-Ëùr‡  )rÈ   rH  rI  rø  r  r�   s   &rm   rá   Ú$ForeachKernelSchedulerNode.get_nodesl  s(   € ô ”I—O‘O×1Ñ1Ñ1UÈÏÊÓ1UÓUÓVÐVro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rI  q  s   € ÷ /ñ / ñ /ro   c                	óD   € V P                   ^ ,          P                  4       # r  )r  r€  r�   s   &rm   r€  Ú)ForeachKernelSchedulerNode.get_first_nameq  s   € Ø�{‰{˜1�~×,Ñ,Ó.Ð.ro   c               ó    € V ^8„  d   QhRRRR/# rr  rk   )rl   s   "rm   rn   rI  t  s   € ÷ :ñ :Ø">ð:à	ñ:ro   c                	óŽ   € \        WV P                  P                  4       V P                   F  pVP	                  V4       K  	  R # rr   )rv  r<  r{  r  rw  )r�   rs  r¸   s   && rm   rw  Ú/ForeachKernelSchedulerNode.prune_redundant_depst  s5   € ô 	˜d¸¿¹×8RÑ8RÔSà—K”KˆDØ×%Ñ%Ð&8Ö9ó  ro   )r;  ri  rî   r   r¢  rŸ  r¡  rR  r¸   r  rª  rn  rK  r<  r  r®  rf  r?  )NNFF)r¡   r¢   r£   r¤   r¹   rL  rV  r¦   rI  r™   r¸  rŽ  rk  r   r£  r¥   r¨  r­  r@  rø  r×  r»  rá   r€  rw  r§   rO  rP  s   @rm   rF  rF  À  sÜ   ø‡ ñõ
õð& ô,
ó ð,
ð\ ô?
ó ð?
÷BU9ò U9ðn ôeó ðeðN ô7ó ð7ðv 	/ð &ð (ó /ð ô
ó ð
ð ôWó ðWõ
"õ"õõ!õ
Wõ
/÷:ó :ro   rF  c                  óø   a € ] tR tRt$ RtR]R&   ]R R l4       tRR V 3R llltR	 R
 lt	R R lt
]R R l4       tR R lt]R R l4       tR R lt]R R l4       tR R ltR R lt]R R l4       tRtV ;t# )rD  i}  a'  
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  c               ó    € V ^8„  d   QhRRRR/# )rf   r  r¬  ri   rD  rk   )rl   s   "rm   rn   Ú!GroupedSchedulerNode.__annotate__Š  s   € ÷ ñ Ð3ð Ð8Lñ ro   c                	ó\  a€ V^ ,          P                   o\        ;QJ d    V3R lV 4       F  '       d   K   RM	  RM! V3R lV 4       4      '       g   \        R4      hV ! SV4      pV F   pVSP                  VP	                  4       &   K"  	  VSP                  VP	                  4       &   V# )r   c              3  ó>   <"  € T F  qP                   SJ x € K  	  R # 5irr   r¬  )rv   r¸   r<  s   & €rm   rx   Ú.GroupedSchedulerNode.create.<locals>.<genexpr>Œ  s   øé € ÐB¹6°4—>‘> YÕ.»6ùs   ƒFTz.expected all nodes to share the same scheduler)r<  rà   rŽ   rs  rE  )r˜   r  Úgrouped_snoderÀ  r<  s   &&  @rm   ÚcreateÚGroupedSchedulerNode.create‰  s‹   ø€ à˜1•I×'Ñ'ˆ	ß‹sÔB¹6ÓB�s�sŠsÔB¹6ÓB×BÒBÜ Ð!QÓRÐRÙ˜I vÓ.ˆÛˆEØ=JˆI×(Ñ(¨¯©Ó)9Ó:ñ àANˆ	×$Ñ$ ]×%;Ñ%;Ó%=Ñ>ØÐro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   r<  r;  r  r¬  Útemp_groupingr”   ri   rl  rk   )rl   s   "rm   rn   rÊ  ”  s2   € ÷ +ñ +àð+ð (ð+ð ð	+ð
 
ñ+ro   c                	óJ   <€ \         SV `  V4       \        WV4       W0n        R # rr   )r0  r¸  rE  rÒ  )r�   r<  r  rÒ  r8  s   &&&&€rm   r¸  ÚGroupedSchedulerNode.__init__”  s$   ø€ ô 	‰Ñ˜Ô#Ü˜¨Ô0ð +Öro   c               ó   € V ^8„  d   QhRR/# r¹  rk   )rl   s   "rm   rn   rÊ  £  s   € ÷ 6ñ 6Ð/ñ 6ro   c                óD  € V P                   '       d   V P                  # V P                   F)  pWP                  P                  VP	                  4       &   K+  	  V P                  P                  V P	                  4        V P                  P                  V P                  4      # )zw
Do fusion among nodes within this GroupedSchedulerNode,
and then unpack this GroupedSchedulerNode into regular nodes.
)rÒ  r  r<  rs  rE  Ú
fuse_nodes)r�   rÀ  s   & rm   ÚunpackÚGroupedSchedulerNode.unpack£  sr   € ð
 ××ÐØ—;‘;Ðà—[”[ˆEØBG�N‰N×-Ñ-¨e¯n©nÓ.>Ó?ñ !à�N‰N×-Ñ-¨d¯m©m«oÐ>Ø�~‰~×(Ñ(¨¯©Ó5Ð5ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úfake_depr9   ri   rl  rk   )rl   s   "rm   rn   rÊ  °  s   € ÷ .ñ . Sð .¨Tñ .ro   c                	ó�   € V P                  V P                  P                  V4      4       V P                  P	                  V4       R # rr   )r  r  r  r®  rS  )r�   rÛ  s   &&rm   r  Ú!GroupedSchedulerNode.add_fake_dep°  s5   € Ø×Ñ˜T×-Ñ-×7Ñ7¸ÓAÔBØ×Ñ×#Ñ# HÖ-ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rÊ  µ  rl  ro   c                	ó|   € R P                  V P                   Uu. uF  qP                  4       NK  	  up4      # u upi rn  ro  rp  s   & rm   rE  ÚGroupedSchedulerNode.get_name´  rr  rs  c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rÊ  ¸  ru  ro   c                	óD   € V P                   ^ ,          P                  4       # r  rw  r�   s   &rm   r€  Ú#GroupedSchedulerNode.get_first_name¸  ry  ro   c               ó   € V ^8„  d   QhRR/# rC  rk   )rl   s   "rm   rn   rÊ  ¼  r{  ro   c                	ó‚   € \         P                  ! V P                   Uu. uF  qP                  4       NK  	  up!  # u upi rr   r}  rp  s   & rm   rŽ  Ú%GroupedSchedulerNode.get_buffer_names»  r  r€  c               ó   € V ^8„  d   QhRR/# r‚  rk   )rl   s   "rm   rn   rÊ  ¿  rƒ  ro   c                	ón   € . pV P                    F"  pVP                  VP                  4       4       K$  	  V# rr   r…  r†  s   &  rm   r½  Ú GroupedSchedulerNode.get_outputs¿  rˆ  ro   c               ó   € V ^8„  d   QhRR/# rn  rk   )rl   s   "rm   rn   rÊ  Æ  rU  ro   c                	ó”   € \        \        R R V P                  4        4       4      4      p\        V4      ^ 8X  d   R # \	        V4      pV# )Nc              3  óž   "  € T FC  pVP                  4       '       g   VP                  4       '       g   K1  VP                  4       x € KE  	  R # 5irr   rX  r…  s   & rm   rx   Ú6GroupedSchedulerNode.estimate_flops.<locals>.<genexpr>Ë  rZ  r[  r\  r^  s   &  rm   ry  Ú#GroupedSchedulerNode.estimate_flopsÅ  ra  ro   c               ó   € V ^8„  d   QhRR/# r¡  rk   )rl   s   "rm   rn   rÊ  ×  r›  ro   c                	ó   € V P                   # rr   rP  r�   s   &rm   rá   ÚGroupedSchedulerNode.get_nodes×  rÙ  ro   c               ó   € V ^8„  d   QhRR/# r—  rk   )rl   s   "rm   rn   rÊ  Ú  s   € ÷ Dñ DÐ/ñ Dro   c                	ól   € V P                   '       d"   V P                   ^ ,          P                  4       # R# r/  )r  rÏ   r�   s   &rm   rÏ   ÚGroupedSchedulerNode.get_deviceÚ  s&   € Ø.2¯k¯k¨kˆt�{‰{˜1�~×(Ñ(Ó*ÐC¸tÐCro   c               ó$   € V ^8„  d   QhRRRRRR/# rY  rk   )rl   s   "rm   rn   rÊ  Þ  s$   € ÷ ñ Ð 1ð Ð=Nð ÐSWñ ro   c                	ó   € R # rþ  rk   )r˜   rH  rO  s   &&&rm   rI  ÚGroupedSchedulerNode.can_fuseÝ  r  ro   )rÒ  rþ  )r¡   r¢   r£   r¤   r¹   r¥   r¦   rÏ  r¸  rØ  r  rP   rE  r€  rŽ  r½  ry  rá   rÏ   rI  r§   rO  rP  s   @rm   rD  rD  }  s�   ø‡ ñð $Ó#àôó ð÷+ò +õ6õ.ð ô=ó ð=õ)ð ôNó ðNõð ôó ðõ"õDð ôó öro   rD  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   Ústride_lengthszlist[list[int]]r¡  r¦  Úpriority_idxrž  ri   rÄ   rk   )rl   s   "rm   rn   rn   ã  s0   € ÷ +ñ +Ø#ð+àð+ð  ð+ð ñ	+ro   c           
     óJ  a a€ \         P                  R VV 3R ll4       p\        \        \	        \        S ^ ,          4      4      4      4      p\        V4      ^ 8”  d   V Uu. uF  pS V,          NK  	  upo \        P                  '       d   VP                  VR7       V# u upi )zu
A heuristic to decide loop iteration orders.  This has not been well
tuned and may be something we should autotune.
c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rÌ  rµ   Úbri   rk   )rl   s   "rm   rn   Ú%pick_loop_order.<locals>.__annotate__î  s!   € ÷ ñ �Sð ˜Sð  Sñ ro   c                ó²  <€ SV ,          ^8X  g   SV,          ^8X  d!   \        SV ,          ^8H  SV,          ^8H  4      # S Uu. uF  p\        W ,          4      NK  	  ppS Uu. uF  p\        W!,          4      NK  	  pp\        R \        W44       4       4      p\        R \        W44       4       4      pWV8”  d   R# We8”  d   ^# \        W4      # u upi u upi )r�  c              3  óH   "  € T F  w  rV^ 8H  ;'       g    W8  x € K  	  R# 5ir/  rk   ©rv   Úsl_aÚsl_bs   &  rm   rx   Ú5pick_loop_order.<locals>.index_cmp.<locals>.<genexpr>ú  ó'   é € ð 
Ù7V©¨ˆD�A‰I×$Ð$˜™Ô$Ó7Vùó   ‚"•"c              3  óH   "  € T F  w  rV^ 8H  ;'       g    W!8  x € K  	  R# 5ir/  rk   r  s   &  rm   rx   r  ý  r  r  rZ  )rR   Úabsr5  r÷  )	rÌ  rý  ÚslÚstride_len_aÚstride_len_bÚa_firstÚb_firstr¡  rù  s	   &&     €€rm   Ú	index_cmpÚ"pick_loop_order.<locals>.index_cmpí  sÑ   ø€ à��8�qŒ=˜E !�H¨œMä�u˜Q•x 1‘} e¨A¥h°!¡mÓ4Ð4ñ .<Ó<©^ rœ˜B�Ež
©^ˆÐ<Ù-;Ó<©^ rœ˜B�Ež
©^ˆÐ<ô ñ 
Ü7:¸<Ô7Vó
ó 
ˆô ñ 
Ü7:¸<Ô7Vó
ó 
ˆð ÔØˆIØÔÙô �1‹yÐùò# =ùÚ<s   ÁCÁ"Cr  )	Ú	functoolsÚ
cmp_to_keyrÈ   rù   r®  r÷   r.   Úpick_loop_ordersÚsort)rù  r¡  rú  r  ÚorderÚpis   ff&   rm   Úpick_loop_orderr  ã  s�   ù€ ô ×Ñ÷ð ó ðô4 ”œ%¤ N°1Õ$5Ó 6Ó7Ó8Ó9€EÜ
ˆ<Ó˜1Ôá7CÓD±|°˜.¨×,Ð,±|ÑDˆÜ××ÐØ�
‰
�yˆ
Ô!Ø€Lùò Es   Á!B c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Ú	orig_nodeúir.MultiTemplateBufferrk  úir.OperationBufferri   rl  rk   )rl   s   "rm   rn   rn     s$   € ÷ 0ñ 0Ø%ð0Ø1Cð0à	ñ0ro   c                ó  € VP                  4       pV P                  4       p\        V\        4      '       d   \        V\        4      '       g   \        R 4      hVP	                  4       pV P	                  4       p\        V\        4      '       d   \        V\        4      '       g   \        R4      h\
        P                  P                  V W1n        \
        P                  P                  V WQn
        \
        P                  P                  P                  V 4      p\
        P                  P                  P                  V4       V\
        P                  P                  V&   V\
        P                  P                  V&   \
        P                  P                  P                  V 4      p\
        P                  P                  P                  V4       V\
        P                  P                  V&   V\
        P                  P                  V&   R# )z6expected orig_buf_name and replaced_buf_name to be strz4expected orig_op_name and replaced_op_name to be strN)rE  rs   r   rŽ   r{  rd   ré   rT  rt   Ú
name_to_opÚoperation_nameÚbuffersr  r-  Ú
operations)r  rk  Úreplaced_buf_nameÚorig_buf_nameÚreplaced_op_nameÚorig_op_nameÚorigs   &&     rm   Ú_replace_operation_bufferr%    si  € ð !×)Ñ)Ó+ÐØ×&Ñ&Ó(€MÜ�}¤c×*Ò*¬zÐ:KÌS×/QÒ/QÜÐUÓVÐVà×2Ñ2Ó4ÐØ×/Ñ/Ó1€LÜ�|¤S×)Ò)¬jÐ9IÌ3×.OÒ.OÜÐSÓTÐTä	�‰×ÑÐ0Ð1Ø!„Mä	�‰×ÑÐ+Ð,Ø*Ôä�7‰7�?‰?× Ñ  Ó+€DÜ‡G�G‡O�O×Ñ˜8Ô$Ø$„A‡G�G‡O�O�DÑØ,4„A‡G�G×Ñ˜=Ñ)ä�7‰7×Ñ×#Ñ# IÓ.€DÜ‡G�G×Ñ×Ñ˜hÔ'Ø'„A‡G�G×Ñ�tÑØ'/„A‡G�G×Ñ�|Ó$ro   c               ó   € V ^8„  d   QhRR/# r|  rk   )rl   s   "rm   rn   rn   /  s   € ÷ 
1ñ 
1Èñ 
1ro   c                ó’   € V P                  4       pVP                  4       pWC,
          pWS,          pV^V,           ,          pWr,          # ©r�  )r4  r0  )rª   r«   Úepilogue_runtimeÚtemplate_write_bytesÚepilogue_read_bytesÚextra_bytesÚextra_bytes_ratioÚextra_memory_ratios   &&&     rm   Ú _estimate_fused_epilogue_runtimer/  /  sO   € Ø ×7Ñ7Ó9ÐØ×5Ñ5Ó7ÐØ%Õ<€Kð $Õ:Ðð +¨aÐ2CÕ.CÕDÐØÕ0Ð0ro   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
rf   Úunfused_n_regsrµ   Úfused_n_regsÚfused_n_spillsÚ	num_warpsÚdevice_propsrI   ri   ztuple[int, int]rk   )rl   s   "rm   rn   rn   <  sD   € ÷ (ñ (Øð(àð(ð ð(ð ð	(ð
 #ð(ð ñ(ro   c                óÔ   € V^8¼  d   R# VP                   pVP                  pVe   Vf   R# V'       g   \        R4      hW6,          pW,          pW,          p	WX,          p
WY,          pW«3# )é   zexpected num_warps to be truthy)r   rZ  )r�  r�  )Úregs_per_multiprocessorÚ	warp_sizerŽ   )r1  r2  r3  r4  r5  Úregs_per_smr9  Úthreads_per_blockÚregs_per_block_unfusedÚregs_per_block_fusedÚblocks_unfusedÚblocks_fuseds   &&&&&       rm   Ú"_occupancy_before_and_after_fusionr@  <  s|   € ð ˜ÔØˆð ×6Ñ6€KØ×&Ñ&€IØÒ˜iÒ/ØˆçÜÐ>Ó?Ð?Ø!Õ-Ðà+Õ?ÐØ'Õ;Ðà Õ:€NØÕ6€LàÐ'Ð'ro   c               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	R
RR/# )rf   Úms1r}  Úms2r1  rµ   r2  r3  r4  r5  rI   ri   r”   rk   )rl   s   "rm   rn   rn   Y  sX   € ÷ ñ Ø	ðà	ðð ðð ð	ð
 ðð ðð #ðð 
ñro   c                ó¶   € ^pRp\        W#WEV4      w  ršV^V ,          8„  ;'       d    V
^8„  pV
R8g  ;'       d"    W§8¬  ;'       g    W©,          V8„  ;'       g    T# )z=
Determine whether to fuse an epilogue into a GEMM template.
g      à?rZ  )r@  )rB  rC  r1  r2  r3  r4  r5  ÚMIN_ACCEPTED_OCCUPANCYÚREGRESSED_OCCUPANCY_RATIOr>  r?  Ú,epilogue_dominated_with_sufficient_occupancys   &&&&&&&     rm   Ú_fuse_epiloguerH  Y  s‡   € ð ÐØ #Ðô $FØ nÀó$Ñ €Nð 47¸¸S½±=×3UÐ3UÀ\ÐTUÑEUÐ0ð
 ˜2Ñ÷ ð ØÑ.÷ 	8ð 	8ØÕ(Ð+DÑD÷	8ð 	8à7ðro   c                  ón   € ] tR tRt$ R]R&   RtR]R&   RtR]R&   R R	 ltR
 R ltR R lt	R R lt
RtR# )r.  iy  úBaseSchedulerNode | OutputNoder¸   Fr”   rÞ  Úis_weakc               ó   € V ^8„  d   QhRR/# rP  rk   )rl   s   "rm   rn   ÚNodeUser.__annotate__‚  s   € ÷ Lñ L˜#ñ Lro   c                	óv   € \        V P                  P                  4       V P                  V P                  34      # rr   )rS  r¸   rE  rÞ  rK  r�   s   &rm   rT  ÚNodeUser.__hash__‚  s+   € Ü�T—Y‘Y×'Ñ'Ó)¨4×+;Ñ+;¸T¿\¹\ÐJÓKÐKro   c               ó    € V ^8„  d   QhRRRR/# )rf   rü  Úobjectri   r”   rk   )rl   s   "rm   rn   rM  …  s   € ÷ 
ñ 
˜Fð 
 tñ 
ro   c                	óø   € \        V\        4      ;'       dd    V P                  4       VP                  4       8H  ;'       d;    V P                  VP                  8H  ;'       d    V P                  VP                  8H  # rr   )rs   r.  rE  rÞ  rK  ©r�   rü  s   &&rm   Ú__eq__ÚNodeUser.__eq__…  sj   € ä�uœhÓ'÷ .ð .Ø—‘“ 5§>¡>Ó#3Ñ3÷.ð .à× Ñ  E×$5Ñ$5Ñ5÷.ð .ð —‘ §¡Ñ-ð		
ro   c               ó   € V ^8„  d   QhRR/# rB  rk   )rl   s   "rm   rn   rM  �  rQ  ro   c                	ó6   € V P                   P                  4       # rr   rg  r�   s   &rm   rE  ÚNodeUser.get_name�  ri  ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rü  r.  ri   rk   )rl   s   "rm   rn   rM  �  s   € ÷ 
ñ 
˜8ð 
¨ñ 
ro   c                	óò   € V P                   VP                   Jd   \        R 4      h\        V P                   V P                  ;'       d    VP                  V P                  ;'       d    VP                  4      # )z#expected self.node to be other.node)r¸   rŽ   r.  rÞ  rK  rS  s   &&rm   rŠ  ÚNodeUser.merge�  s\   € Ø�9‰9˜EŸJ™JÓ&Ü Ð!FÓGÐGÜØ�I‰IØ×Ñ×2Ð2 ×!2Ñ!2Ø�L‰L×*Ð*˜UŸ]™]ó
ð 	
ro   rk   N)r¡   r¢   r£   r¤   r¥   rÞ  rK  rT  rT  rE  rŠ  r§   rk   ro   rm   r.  r.  y  s8   ‡ à
(Ó(Ø€K�Óð €GˆTÓõLõ
õ$÷
ñ 
ro   r.  c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   z	ir.IRNoderi   úOrderedSet[sympy.Symbol]rk   )rl   s   "rm   rn   rn   �  s   € ÷ ñ ˜Yð Ð+Cñ ro   c                óÚ  € \        4       pV P                  4       p\        V\        P                  4      '       dŸ   VP                  \        VP                  4      \        VP                  4      ,          \        VP                  4      ,          4       \        V\        P                  4      '       d%   VP                  \        VP                  4      4       V# Ve   \        RV 24      hV# )z=Get free symbols from a node's layout (size, stride, offset).z*Expect layout to be None but found layout=)r   Úmaybe_get_layoutrs   r1   ÚLayoutr’  r'   r  ÚstrideÚoffsetr  Úget_layout_symintsr  rŽ   )r¸   Úfree_symbol_usesr\  s   &  rm   rc  rc  �  s»   € ä1;³ÐØ×"Ñ"Ó$€FÜ�&œ"Ÿ)™)×$Ò$Ø×ÑÜ˜Ÿ™Ó%Ü˜6Ÿ=™=Ó)õ*ä˜6Ÿ=™=Ó)õ*ô	
ô
 �fœb×;Ñ;×<Ò<à×#Ñ#Ô$6°v·}±}Ó$EÔFð Ðð ÒÜ Ð#MÈfÈXÐ!VÓWÐWØÐro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r   ri   r]  rk   )rl   s   "rm   rn   rn   °  s   € ÷ ñ Ø
ðàñro   c                óH  € \        V \        4      '       d*   \        4       P                  ! R V P                   4       !  # V P
                  f   \        R4      hV P
                  P                  4       pVP                  ! R V P
                  P                  4        4       !   V# )z{
Gets symbols used in a scheduler node, including free symbols from
the node's operations and layout symints from outputs.
c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irr   ©Úget_scheduler_node_symbol_uses)rv   rÀ  s   & rm   rx   Ú1get_scheduler_node_symbol_uses.<locals>.<genexpr>¹  s   é € ÐMÁ¸Ô,¨U×3Ð3Ãùr	  úexpected node.node to be setc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irr   )rc  )rv   Úir_nodes   & rm   rx   rj  ¿  s   é € Ð	MÑ5L¨'Ô
˜W×
%Ð
%Ó5Lùr	  )
rs   r  r   r7  r  r¸   rŽ   Úget_free_symbol_usesr’  r½  )r¸   rd  s   & rm   ri  ri  °  s‰   € ô �$Ô*×+Ò+Ü‹|×!Ò!ÙMÀÇÂÓMñ
ð 	
ð ‡y�yÒÜÐ;Ó<Ð<Ø—y‘y×5Ñ5Ó7ÐØ×ÒÙ	M°T·Y±Y×5JÑ5JÔ5LÓ	Mòð Ðro   c               ó    € V ^8„  d   QhRRRR/# ©rf   r¶  r   ri   r”   rk   )rl   s   "rm   rn   rn   Ä  ó   € ÷ "ñ "Ð/@ð "ÀTñ "ro   c                ó~   € V P                  4       pVe   VP                  e   VP                  # \        P                  # ©z4Check per-template flag, fall back to global config.)r£  Úallow_epilogue_fusionr.   Úepilogue_fusion©r¶  Útbs   & rm   Ú_is_epilogue_fusion_enabledrx  Ä  ó8   € à	×	(Ñ	(Ó	*€BØ	‚~˜"×2Ñ2Ò>Ø×'Ñ'Ð'Ü×!Ñ!Ð!ro   Úcheck_configc               ó$   € V ^8„  d   QhRRRRRR/# )rf   r¸   r   rz  r”   ri   rk   )rl   s   "rm   rn   rn   Ì  s$   € ÷ ñ Ø
ðØ.2ðà	ñro   c               ó
  € V'       d   \         P                  '       g   R # \        V \        4      '       g   R # \        V P                  \
        P                  4      '       g   R # \        V P                  P                  \
        P                  4      '       g   R # V P                  P                  P                  R8w  d   R # V P                  4       p\        V4      ^8w  d   R # V^ ,          P                  4       '       g&   \        V^ ,          P                  4       4      ^8w  d   R # V P                  P                  p\!        V4      ;'       d5    \"        ;QJ d    R V 4       F  '       d   K   R # 	  R# ! R V 4       4      # )Fr"  c              3  óp   "  € T F,  p\        V\        4      ;'       d    VP                  R 8H  x € K.  	  R# 5i)r"  N)rs   r:   r!  )rv   Úwrites   & rm   rx   Ú3_is_atomic_add_mutation_epilogue.<locals>.<genexpr>á  s/   é € ð  ÙQWÈŒ
�5œ)Ó$×CÐC¨¯©°|Ñ)CÔCÓQWùs   ‚6ž6T)r.   Úepilogue_fusion_with_atomic_addrs   rÚ   r¸   r1   r   r/  ÚScatterÚscatter_moder½  r÷   r]  r_  r  rÖ  r”   rà   )r¸   rz  r¨  rÖ  s   &$  rm   Ú _is_atomic_add_mutation_epiloguerƒ  Ì  s  € ÷ œF×B×BÐBÙÜ�dœM×*Ò*ÙÜ�d—i‘i¤×!2Ñ!2×3Ò3ÙÜ�d—i‘i—n‘n¤b§j¡j×1Ò1ÙØ‡y�y‡~�~×"Ñ" lÔ2Ùà×ÑÓ €GÜ
ˆ7ƒ|�qÔÙØˆq…z×Ñ×Ò¤3 w¨q¥z×'?Ñ'?Ó'AÓ#BÀaÔ#GÙà×Ñ×$Ñ$€FÜ�‹<÷ ð ŸC›Cñ  ÙQWó ŸCœCð šCð ˜Cñ  ÙQWó ó ð ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r¶  r   Úepilogue_noderi   r”   rk   )rl   s   "rm   rn   rn   æ  s$   € ÷ :ñ :Ø$ð:Ø5Fð:à	ñ:ro   c                ó|   € V P                  4       p\        V\        P                  4      ;'       d    \	        V4      # rr   )r£  rs   r1   ÚTritonTemplateBufferrƒ  )r¶  r…  Útemplate_bufs   && rm   Ú&_can_fuse_atomic_add_template_epiloguer‰  æ  s<   € ð !×2Ñ2Ó4€LÜØ”b×-Ñ-ó÷ :ð :ä
*¨=Ó
9ð:ro   c               ó    € V ^8„  d   QhRRRR/# rp  rk   )rl   s   "rm   rn   rn   ï  rq  ro   c                ó~   € V P                  4       pVe   VP                  e   VP                  # \        P                  # rs  )r£  Úallow_prologue_fusionr.   Úprologue_fusionrv  s   & rm   Ú_is_prologue_fusion_enabledrŽ  ï  ry  ro   c               ó    € V ^8„  d   QhRRRR/# ©rf   rª   r   r«   rk   )rl   s   "rm   rn   rn   ÷  ó   € ÷ ñ Ð/ð Ð8Iñ ro   c                ó‚   € V P                  4       ;'       d)    VP                  4       '       * ;'       d    \        V 4      # rr   )rÏ  rx  r°   s   &&rm   Úis_epilogue_fusionr“  ÷  ó>   € à×ÑÓ÷ 	/ð 	/Ø×!Ñ!Ó#Ô#÷	/ð 	/ä'¨Ó.ðro   c               ó    € V ^8„  d   QhRRRR/# r�  rk   )rl   s   "rm   rn   rn   ÿ  r‘  ro   c                ó‚   € VP                  4       ;'       d)    V P                  4       '       * ;'       d    \        V4      # rr   )rÏ  rŽ  r°   s   &&rm   Úis_prologue_fusionr—  ÿ  r”  ro   c               ó    € V ^8„  d   QhRRRR/# r�  rk   )rl   s   "rm   rn   rn     s    € ÷ Pñ PÐ/ð PÐ8Iñ Pro   c                ó>   € \        W4      ;'       g    \        W4      # rr   )r“  r—  r°   s   &&rm   Úis_template_fusionrš    s   € Ü˜eÓ+×OÐOÔ/AÀ%Ó/OÐOro   c               ó    € V ^8„  d   QhRRRR/# r�  rk   )rl   s   "rm   rn   rn     s    € ÷ @ñ @Ð#4ð @Ð=Nñ @ro   c                ó,   € \        W4      '       d   V# T # rr   )r“  r°   s   &&rm   Útemplate_fusion_pw_noder�    s   € Ü& u×4Ò4ˆ5Ð?¸%Ð?ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¼  zIterable[BaseSchedulerNode]ri   z,Iterator[SchedulerNode | FusedSchedulerNode]rk   )rl   s   "rm   rn   rn     s   € ÷ ñ Ø&ðà1ñro   c              #  óÎ   "  € V  FX  p\        V\        4      '       d$   \        VP                  4       R j  x€L
  Vx € K<  \        V\        4      '       g   KT  Vx € KZ  	  R #  L,5irr   )rs   r  Ú_iter_loop_state_nodesr  rÚ   )r¼  r¸   s   & rm   r   r     sK   é € ó ˆÜ�dÔ.×/Ò/Ü-¨d¯k©kÓ:×:Ð:ØŒJÜ˜œm×,Ô,ØŒJó á:ùs   ‚4A%¶A#·A%ÁA%c                  ó¶   € ] tR tRt$ Rt]P                  ! ]R7      tR]	R&   ]P                  ! ]R7      t
R]	R&   ]R R	 l4       tR
 R ltR R ltR R ltRtR# )Ú_LoopStateSnapshoti  a  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_groupsc               ó    € V ^8„  d   QhRRRR/# )rf   r¼  râ  ri   r¢  rk   )rl   s   "rm   rn   Ú_LoopStateSnapshot.__annotate__+  s   € ÷ ñ Ð8ð Ð=Oñ ro   c                ó¬   € V ! 4       p\        V4       F=  p\        V\        4      '       d   VP                  V4       K,  VP	                  V4       K?  	  V# )zDCapture scheduler-node boundaries and their mutable leaf loop state.)r   rs   r  Ú_snapshot_fused_nodeÚ_snapshot_scheduler_node)r˜   r¼  Úsnapshotr¸   s   &&  rm   rÏ  Ú_LoopStateSnapshot.create*  sK   € ñ “5ˆÜ*¨5Ö1ˆDÜ˜$Ô 2×3Ò3Ø×-Ñ-¨dÖ3à×1Ñ1°$Ö7ñ	 2ð
 ˆro   c               ó    € V ^8„  d   QhRRRR/# ©rf   r£  rÚ   ri   rl  rk   )rl   s   "rm   rn   r¦  5  s   € ÷ Bñ B¨=ð B¸Tñ Bro   c                ó~   € WP                   9   d   \        RV R24      hVP                  4       V P                   V&   R# )z?Capture one leaf scheduler node before its first loop mutation.úscheduler node ú already snapshottedN)r£  rŽ   rŠ  ©r�   r£  s   &&rm   r©  Ú+_LoopStateSnapshot._snapshot_scheduler_node5  s<   € à×+Ñ+Ô+Ü  ?°2°$Ð6JÐ!KÓLÐLØ)+×)?Ñ)?Ó)Aˆ×"Ñ" 2Ó&ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r  ri   rl  rk   )rl   s   "rm   rn   r¦  ;  s   € ÷ 2ñ 2Ð);ð 2Àñ 2ro   c                óv   € WP                   9   d   \        RV R24      hVP                  V P                   V&   R# )zACapture fused-node group metadata changed outside leaf listeners.zfused node r°  N)r¤  rŽ   rî   r¸  s   &&rm   r¨  Ú'_LoopStateSnapshot._snapshot_fused_node;  s7   € à×)Ñ)Ô)Ü  ;¨t¨fÐ4HÐ!IÓJÐJØ'+§z¡zˆ×Ñ˜tÓ$ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   r¦  A  s   € ÷ 2ñ 2˜ñ 2ro   c                óÖ   € V P                   P                  4        F  w  rVP                  V4       K  	  V P                  P                  4        F  w  r4WCn        \        V4       K  	  R# )z>Restore all captured loop state and fused-node group metadata.N)r£  r#  r�  r¤  rî   r8  )r�   r£  r�  r¸   rî   s   &    rm   ÚrestoreÚ_LoopStateSnapshot.restoreA  sS   € à×3Ñ3×9Ñ9Ö;‰IˆBØ×!Ñ! %Ö(ñ <à×1Ñ1×7Ñ7Ö9‰KˆDØŒJÜ+¨DÖ1ó :ro   rk   N)r¡   r¢   r£   r¤   r¹   rÆ   rÇ   rö  r£  r¥   r¤  r¦   rÏ  r©  r¨  r¸  r§   rk   ro   rm   r¢  r¢    sp   ‡ ñð CN×BSÒBSØôCÐÐ?ó ð 8C×7HÒ7HØô8ÐÐ4ó ð ôó ðõBõ2÷2ñ 2ro   r¢  c                  óÎ   € ] tR tRt$ RtR]R&   ]P                  ! ]R7      t	R]R&   ]P                  ! ]
R7      tR]R	&   R
tR]R&   ]R R l4       tR R ltR R ltR R ltRtR
# )Ú_LoopMutationTrackeriJ  a’  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.

Recursive can_fuse() calls chain their listeners so each scope captures its
own decision boundary while the outer scope still sees nested mutations.

Use finish(rollback=False) to keep mutations or finish(rollback=True) to
restore the original state. If no mutation occurred, finish() is a no-op.
râ  r¼  rÂ   zOrderedSet[SchedulerNode]Úwatched_nodesz;dict[SchedulerNode, Callable[[SchedulerNode], None] | None]Úprevious_listenersNz_LoopStateSnapshot | Noner�  c               ó    € V ^8„  d   QhRRRR/# )rf   r¼  râ  ri   r»  rk   )rl   s   "rm   rn   Ú!_LoopMutationTracker.__annotate__e  s   € ÷ ñ Ð8ð Ð=Qñ ro   c                ó¶   € \        V4      pV ! \        V4      R7      p\        V4       F,  p\        V\        4      '       g   K  VP                  V4       K.  	  V# )z?Create a rollback scope and watch mutable leaf scheduler nodes.©r¼  )r   rø   r   rs   rÚ   Úwatch)r˜   r¼  ÚseenÚtrackerr¸   s   &&   rm   rÏ  Ú_LoopMutationTracker.created  sK   € ô ˜%Ó ˆÙœE $›KÔ(ˆÜ*¨4Ö0ˆDÜ˜$¤×.Ô.Ø—‘˜dÖ#ñ 1ð ˆro   c               ó    € V ^8„  d   QhRRRR/# r­  rk   )rl   s   "rm   rn   r¿  n  s   € ÷ 0ñ 0˜ð 0¨$ñ 0ro   c                ó´   € WP                   9   d   R# VP                  V P                  V&   V P                   P                  V4       V P                  Vn        R# )z<Install this scope as the mutation listener for a leaf node.N)r¼  r\  r½  rS  Útrackr±  s   &&rm   rÂ  Ú_LoopMutationTracker.watchn  sG   € à×#Ñ#Ô#ÙØ&(×&@Ñ&@ˆ×Ñ Ñ#Ø×Ñ×Ñ˜rÔ"Ø%)§Z¡ZˆÖ"ro   c               ó    € V ^8„  d   QhRRRR/# r­  rk   )rl   s   "rm   rn   r¿  v  s   € ÷ ;ñ ;˜ð ;¨$ñ ;ro   c                óò   € WP                   9  d   \        RV R24      hV P                  V,          ;p'       d	   V! V4       V P                  e   R# \        P                  V P                  4      V n        R# )z?Lazily snapshot candidate roots when the first mutation occurs.r¯  z is not being watchedN)r¼  rŽ   r½  r�  r¢  rÏ  r¼  )r�   r£  Úpreviouss   && rm   rÈ  Ú_LoopMutationTracker.trackv  se   € à×'Ñ'Ô'Ü  ?°2°$Ð6KÐ!LÓMÐMØ×.Ñ.¨rÕ2Ð2ˆ8Ö2Ù�RŒLØ�:‰:Ò!áô
 (×.Ñ.¨t¯z©zÓ:ˆŽ
ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úrollbackr”   ri   rl  rk   )rl   s   "rm   rn   r¿  …  s   € ÷ ñ  $ð ¨4ñ ro   c               óÀ   € V P                    F  pV P                  V,          Vn        K  	  V'       d   V P                  f   R# V P                  P	                  4        R# )z<Detach listeners and restore captured state if rolling back.N)r¼  r½  r\  r�  r¸  )r�   rÏ  r£  s   &$ rm   ÚfinishÚ_LoopMutationTracker.finish…  sD   € à×$Ô$ˆBØ)-×)@Ñ)@ÀÕ)DˆBÖ&ñ %ç˜4Ÿ:™:Ò-ÙØ�
‰
×ÑÖro   )r�  )r¡   r¢   r£   r¤   r¹   r¥   rÆ   rÇ   r   r¼  rö  r½  r�  r¦   rÏ  rÂ  rÈ  rÑ  r§   rk   ro   rm   r»  r»  J  sz   ‡ ñð )Ó(Ø/:×/@Ò/@Ø"ô0€MÐ,ó ð 	×Ò¨$Ô/ð ÐSó ð (,€EÐ$Ó+àôó ðõ0õ;÷ñ ro   r»  c                  ó°  a € ] tR tRtRtR R lt]R R l4       tR V 3R lltR	 R
 lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R lt]R R  l4       t]P,                  R! R" l4       tR# R$ ltR% R& ltR' R( ltR) R* ltR+ R, ltR- R. ltR/ R0 ltR1 R2 ltR3 R4 ltR5 R6 lt R7 R8 lt!R9 R: lt"R; R< lt#R= R> lt$R? R@ lt%RA RB lt&RC RD lt'RE RF lt(ERRH RI llt)RJ RK lt*RL RM lt+RN RO lt,RP RQ lt-RR RS lt.ERRT RU llt/RV RW lt0RX RY lt1RZ R[ lt2R\ R] lt3R^ R_ lt4R` Ra lt5Rb Rc lt6Rd Re lt7Rf Rg lt8]Rh Ri l4       t9ERRj Rk llt:Rl Rm lt;Rn Ro lt<Rp Rq lt=Rr Rs lt>Rt Ru lt?Rv Rw lt@Rx Ry ltARz R{ ltBR| R} ltCR~ R ltDR€ R� ltER‚ Rƒ ltFR„ R… ltG]H! R 4      R† R‡ l4       tIRˆ R‰ ltJRŠ R‹ ltKRŒ R� ltLRŽ R� ltMR� R‘ ltNR’ R“ ltOR” R• ltPR– R— ltQR˜ R™ ltRRš R› ltSRœ R� ltTRž RŸ ltUERR¡ R¢ lltVERR£ R¤ lltWERR¥ R¦ lltXR§RG/R¨ R© lltYRª R« ltZ]R¬ R­ l4       t[R®R /R¯ R° llt\R± R² lt]]R³ R´ l4       t^Rµ R¶ lt_]R· R¸ l4       t`ERR¹ Rº lltaERR» R¼ lltbERR½ R¾ lltc]dERR¿ RÀ ll4       te]dERRÁ RÂ ll4       teERRÃ RÄ llteRÅ RÆ ltfRÇ RÈ ltgRÉ RÊ lthRË RÌ ltiRÍ RÎ ltjRÏ RÐ ltkRÑ RÒ ltlRÓ RÔ ltmRÕ RÖ ltnR× RØ ltoRÙ RÚ ltpRÛ RÜ ltqRÝ RÞ ltr]sRß Rà l4       ttRá Râ ltuRã Rä ltvRå Ræ ltwRç Rè ltxRé Rê ltyRë Rì ltzRí Rî lt{Rï Rð lt|Rñ Rò lt}Ró Rô lt~Rõ Rö ltR÷ Rø lt€Rù Rú lt�Rû Rü lt‚Rý Rþ ltƒRÿ ER  lt„ER ER lt…ER ER lt†ER ER lt‡ER ER ltˆER	 ER
 lt‰ER ER ltŠ]ER ER l4       t‹]ER ER l4       tŒER ER lt�ER ER ltŽER ER lt�ERt�V ;t‘# (  r;  i’  z�
A Scheduler is a graph of BaseSchedulerNodes. It is responsible for
optimizations such as fusion, reorder, and graph partition.
c               ó    € V ^8„  d   QhRRRR/# ©rf   r¼  zlist[ir.Operation]ri   rl  rk   )rl   s   "rm   rn   ÚScheduler.__annotate__˜  s   € ÷ ñ Ð0ð °Tñ ro   c                	óˆ   € \        R 4      ;_uu_ 4        V P                  V4       RRR4       R#   + '       g   i     R# ; i)zScheduler.__init__N)r   Ú_init©r�   r¼  s   &&rm   r¸  ÚScheduler.__init__˜  s)   € ÜÐ.×/Õ/Ø�J‰J�uÔ÷ 0×/×/Ò/ús	   ”0°A	c               ó    € V ^8„  d   QhRRRR/# )rf   r¼  r½  ri   rµ   rk   )rl   s   "rm   rn   rÖ  �  s   € ÷ Xñ XÐ"=ð XÀ#ñ Xro   c                	ó&   € \        R  V  4       4      # )c              3  óV   "  € T F  p\        V\        4      '       d   K  ^x € K!  	  R# 5irQ  )rs   rý  r…  s   & rm   rx   Ú/Scheduler.count_kernel_nodes.<locals>.<genexpr>ž  s   é € ÐW¡˜¬j¸Ô?U×.V—1’1£ùs   ‚)Ÿ
))r5  rÁ  s   &rm   Úcount_kernel_nodesÚScheduler.count_kernel_nodesœ  s   € äÑW¡ÓWÓWÐWro   c               ó    € V ^8„  d   QhRRRR/# rÕ  rk   )rl   s   "rm   rn   rÖ     s   € ÷ H9ñ H9Ð-ð H9°$ñ H9ro   c           
     	ó†  <a € / S n         \        SS `	  4        S \        P                  n        / S n        \        \        4      S n	        \        P                  ! 4       S n        \        4       S n        \        . \        P                  P                  P!                  4       O\        P                  P"                  P!                  4       O\        P                  P$                  P!                  4       O4      S n        V Uu. uF  pS P)                  V4      NK  	  upS n        R S n        R S n        S P1                  4        S P&                  P3                  \        P                  P"                  P!                  4       4       S P*                   F  pVP5                  4        K  	  R S n        S P9                  4       S n        S P*                   Uu/ uF  q"P=                  4       VbK  	  upS n        S P*                   UUu/ uF)  q3PA                  4        F  qDP=                  4       VbK  	  K+  	  uppS n!        S P>                  PE                  4       S n#        / S n$        / S n%        \        4       S n&        \N        PP                  ! S P*                  S PB                  S PF                  4      S n        S PS                  4        S PU                  S P*                  4      S n        S PW                  4        S P*                   Uu/ uF  q"P=                  4       VbK  	  upS n#        S PY                  4        S P[                  4        \\        ;P^                  \a        S P*                  4      ,          un/        ^ RI1H2pH3p V! S P*                  4       \a        S P*                  4      S n4        S Pk                  4        S PU                  S P*                  4      S n        \        \l        \n        \n        3,          ,          ! 4       S n8        \r        Pt                  e&   \r        Pt                  ! S P*                  4      S n        / S n;        / S n<        RS n=        \r        P|                  '       d(   ^RI?H@p VPƒ                  S 4       S PY                  4        / S nB        / S nC        RS nD        / S nE        / S nF        S P�                  4        S P‘                  4        S P“                  S P*                  4      S n        \r        P”                  e&   \r        P”                  ! S P*                  4      S n        \–        ;QJ d&    R S P*                   4       F  '       g   K   RM	  RM! R S P*                   4       4      '       d   S PW                  4        S P™                  4        S P›                  4        \r        Pœ                  '       g   \r        Pž                  '       dC   \¡        4       '       d3   \¢        P¤                  P¦                  P¨                  P«                  4        S P­                  4        \r        P®                  '       dŠ   ^RIXHWp V! S P*                  S PB                  S PF                  \        \        P                  P                  P!                  4       4      \        \        P                  P³                  4       4      4      S n        \r        P´                  '       dU   \·        RRRR7      ;_uu_ 4        S P¹                  R R	7       R R R 4       ^R
IXH]p	 V	! S P*                  S PB                  4       \r        P¼                  '       Eg   \r        P¾                  '       dõ   \r        P®                  '       g$   ^R
IXH]p	 V	! S P*                  S PB                  4       \À        PÂ                  '       dU   Rp
S P*                   F"  p\Å        VPÆ                  4      '       g   K   Rp
 M	  V
'       d   ^RI'Hdp V! S P*                  4       \À        PÊ                  '       d   ^ RIfHgp V! RR V 3R lR7       \N        PÐ                  ! S P*                  4      S n        \r        PÒ                  PÔ                  '       d”   \r        P®                  '       g:   \r        P¾                  '       g$   ^R
IXH]p	 V	! S P*                  S PB                  4       \·        RRRR7      ;_uu_ 4        \N        PÖ                  ! S P*                  4      S n        R R R 4       S PÙ                  4        \r        PÚ                  '       d�   \r        PÜ                  PÞ                  '       da   \r        PÜ                  Pà                  '       dA   S Pã                  S P*                  4      S n        S På                  S P*                  4      S n        S Pç                  4        \¢        P¤                  Pr                  Pè                  Pê                  '       d   S Pí                  4        V! S P*                  4       \        Pî                  Pñ                  S P*                  4       S Pó                  4        \        4       S nz        / S n{        R S n|        \û        R4      Pý                  V 3R l4       \        4       S n        R # u upi u upi u uppi u upi   + '       g   i     EL®; i  + '       g   i     ELË; i)N)Úlog_ir_post_fusionÚlog_ir_pre_fusionF)Údistributed_autotunec              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5irr   )rs   r   r…  s   & rm   rx   Ú"Scheduler._init.<locals>.<genexpr>  s"   é € ð 
á"�ô �tÔA×BÐBÛ"ùó   ‚T)Úreorder_for_peak_memoryz#Scheduler.create_combo_kernel_nodes©Úlog_pt2_compile_eventÚlog_waitcounter)Únum_ck_nodes)Ú1assign_memory_planning_info_for_scheduler_buffers)Ú6align_runtime_estimations_across_all_distributed_ranks)Útrace_structuredÚartifactc                 ó   € R RRR/# )rt   Ú#scheduler_nodes_before_comm_overlapÚencodingÚstringrk   rk   ro   rm   rµ  Ú!Scheduler._init.<locals>.<lambda>]  s   € ØÐ EØ" Hñ)ro   c            
     óâ   <€ R P                  \        SP                  4       U Uu. uF8  w  rRV  R2VP                  4       ,           RVP	                  4        2,           NK:  	  upp 4      # u upp i )z

zsnode[rZ  z buffer_names:)rÓ  r³  r¼  rc  rŽ  )r°  r–  r�   s     €rm   rµ  rö  a  su   ø€  v§{¡{ô
 )2°$·*±*Ô(=ô	ñ )>¡ ð % Q C q˜MØŸk™k›mõ,à .¨q×/AÑ/AÓ/CÐ.DÐE÷Fð Fñ )>ò	ô(ùós   ¥>A+
)Úmetadata_fnÚ
payload_fnzScheduler.simple_overlapÚgraph_statsc                 ób   <€ R S P                   RS P                  R\        S P                  4      /# )Úgraph_idÚnum_nodes_before_fusionÚnum_nodes_after_fusion)Úpost_grad_graph_idÚnum_orig_nodesr÷   r¼  r�   s   €rm   rµ  rö  Ÿ  s+   ø€ Ø˜D×3Ñ3Ø)¨4×+>Ñ+>Ø(¬#¨d¯j©j«/ñro   )€Ú_tiling_memory_cacher0  r¸  rd   ré   r<  Úbackendsr²  Ú_post_grad_graph_counterrÿ  rH  ÚcountÚ_graph_partition_counterr   rú  rh  rb  Ú	constantsÚtorchbind_constantsrZ  Úcreate_scheduler_noder¼  Úprevious_nodeÚcurrent_nodeÚupdate_zero_dim_cpu_tensorr’  r   Údefault_device_contextÚget_donated_buffersrz  rE  rR  r½  r{  Úcopyrs  r4  r¥  Úseen_template_fusionsr-   Údecide_global_ordering_of_commsr}   Útopological_sort_scheduleÚdead_node_eliminationÚcompute_ancestorsÚcompute_input_distancesr2   Úir_nodes_pre_fusionr÷   Útorch._inductor.debugrã  rä  r 	  Úcreate_foreach_nodesrø   r   Úlogged_slow_fusionr.   Ú_pre_fusion_custom_passr   Úbuff_to_mempoolÚ_mempool_nodesÚdistributed_max_autotune_gemmrß  rå  ÚscheduleÚnode_to_streamÚbuff_to_streamÚ_multi_stream_nodesÚstream_idx_to_user_obj_idxÚuser_obj_idx_to_stream_idxÚ_populate_stream_assignmentsÚ_populate_mempool_assignmentsr×  Ú_post_fusion_custom_passrB  rÇ  Úfinalize_multi_template_buffersÚmax_autotune_gemmÚmax_autotuner    rê  rë  Úselect_algorithmÚPrecompileThreadPoolÚshutdown_instanceÚ_enforce_switch_orderingré  ÚmemoryÚget_output_namesÚcombo_kernelsr   Úcreate_combo_kernel_nodesrî  ÚdeterministicÚ reorder_for_compute_comm_overlapr/   Ú6runtime_estimations_align_across_all_distributed_ranksr\   r¸   rï  Úreorder_sink_verbose_loggingÚtorch._loggingrð  Ú$reorder_compute_and_comm_for_overlapÚaten_distributed_optimizationsÚenable_simple_overlapÚsimple_overlapÚprocess_grouped_nodesÚgraph_partitionrÌ   r~   Ú%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)r�   r¼  r–  r¸   rÿ   rã  rä  rå  ré  rî  Úhas_collectivesrï  rð  r8  s   f&           €rm   rØ  ÚScheduler._init   sÛ  ù€ Ø@BˆÔ!Ü‰ÑÔØ Œ�‰ÔØ<>ˆŒÜ"&Ô'?Ó"@ˆÔÜ(1¯ªÓ(9ˆÔ%Ü5?³\ˆÔ!Ü&0ðÜ—‘×%Ñ%×*Ñ*Ó,ðä—‘×"Ñ"×'Ñ'Ó)ðô —‘×,Ñ,×1Ñ1Ó3ðó'
ˆÔ#ñ >CÓC¹U¸�d×0Ñ0°Ö3¹UÑCˆŒ
Ø7;ˆÔØ6:ˆÔØ×'Ñ'Ô)à×#Ñ#×*Ñ*¬1¯7©7×+<Ñ+<×+AÑ+AÓ+CÔDØ—J”JˆDØ�O‰OÖñ ð <@ˆÔ#ð ×$Ñ$Ó&ð 	Ô#ð &*§Z¢Zó;
Ù%/ �J‰J‹L˜!ŠO¡Zñ;
ˆÔð
 -1¯JªJô8
Ù,6 D×BRÑBRÖBT¸3�L‰L‹N˜CÒÑBT‰N©Jò8
ˆÔð AE×@QÑ@Q×@VÑ@VÓ@XˆÔð 35ˆÔð 13ˆÔô ‹Lð 	Ô"ô
 ×:Ò:Ø�J‰JØ×ÑØ×#Ñ#ó
ˆŒ
ð 	×!Ñ!Ô#Ø×3Ñ3°D·J±JÓ?ˆŒ
Ø×"Ñ"Ô$Ø<@¿JºJÓ"G¹J°q§:¡:£<°¢?¹JÑ"GˆÔØ×ÑÔ Ø×$Ñ$Ô&ô 	×#Ò#¤s¨4¯:©:£Õ6Õ#ßOá˜$Ÿ*™*Ô%Ü! $§*¡*›oˆÔØ×!Ñ!Ô#Ø×3Ñ3°D·J±JÓ?ˆŒ
Ü",¬U´3¼°8­_Ö"=Ó"?ˆÔÜ×)Ñ)Ò5Ü×7Ò7¸¿
¹
ÓCˆDŒJð
 QSˆÔØBDˆÔØ$)ˆÔä×/×/Ð/Ý.à ×)Ñ)¨$Ô/Ø×"Ñ"Ô$ð =?ˆÔØ.0ˆÔØ).ˆÔ à:<ˆÔ'Ø:<ˆÔ'Ø×)Ñ)Ô+Ø×*Ñ*Ô,à—_‘_ T§Z¡ZÓ0ˆŒ
Ü×*Ñ*Ò6Ü×8Ò8¸¿¹ÓDˆDŒJç‹3ñ 
àŸ
š
ó
�3�3Š3ñ 
àŸ
š
ó
÷ 
ò 
ð ×&Ñ&Ô(à×ÑÔØ×,Ñ,Ô.ä×$×$Ð$¬×(;×(;Ð(;Ü&×(Ò(Ü�O‰O×,Ñ,×AÑA×SÑSÔUð 	×%Ñ%Ô'ô ×)×)Ð)Ý7á0Ø—
‘
Ø× Ñ Ø×'Ñ'Üœ1Ÿ7™7×/Ñ/×4Ñ4Ó6Ó7Üœ1Ÿ7™7×3Ñ3Ó5Ó6óˆDŒJô ××ÐÜØ5Ø&*Ø $÷ö ð
 ×.Ñ.¸DÐ.ÔA÷õ Rá=Ø—
‘
˜D×,Ñ,ôô ×#×#Ñ#¬×(O×(OÐ(OÜ×1×1Ð1ÝUáAØ—J‘J × 0Ñ 0ôô ×R×RÐRØ"'�Ø ŸJœJ�DÜ$ T§Y¡Y×/Ô/Ø*.˜Ùñ '÷ #õñ KÈ4Ï:É:ÔVô ×8×8Ð8Ý;á Øñ!ô õô ×CÒCÀDÇJÁJÓOˆDŒJä×0Ñ0×F×FÐFä×2×2Ð2Ü×?×?Ð?åUáAØ—J‘J × 0Ñ 0ôô Ø*Ø&*Ø $÷ö ô
 #×1Ò1°$·*±*Ó=�”
÷ð 	×"Ñ"Ô$ô ×"×"Ð"ä—‘×(×(Ð(ä—‘×C×CÐCà×DÑDÀTÇZÁZÓPˆDŒJØ×JÑJÈ4Ï:É:ÓVˆDŒJà×ÑÔ!ä�?‰?×!Ñ!×.Ñ.×E×EÐEØ×*Ñ*Ô,á˜4Ÿ:™:Ô&ä	�‰×Ñ˜dŸj™jÔ)Ø×ÑÔô 6@³\ˆÔ!ð :<ˆÔð GKˆÔ ä˜Ó'×/Ñ/ôô	
ô -7«LˆÖùòs Dùò;
ùó8
ùòH #H÷\÷ ð ú÷D÷ ð ús0   Ã=jÇjÇ;/jË8jÛ#jã&j/êj,	ê/k 	c               ó   € V ^8„  d   QhRR/# )rf   ri   z!dict[str, SchedulerDonatedBuffer]rk   )rl   s   "rm   rn   rÖ  ª  s   € ÷ 	#ñ 	#Ð%Fñ 	#ro   c                	ó,  € / p\         P                  P                   Fs  p\        \         P                  P                  V,          \        P
                  4      '       g   KD  \        V \         P                  P                  V,          R R7      W&   Ku  	  V# )N)r=  )rd   ré   Úgraph_inputs_originalrs   r1   ÚDonatedBufferrœ  )r�   Úname_to_donated_bufrt   s   &  rm   r	  ÚScheduler.get_donated_buffersª  sl   € Ø ÐÜ—G‘G×1Ô1ˆDÜœ!Ÿ'™'×7Ñ7¸Õ=¼r×?OÑ?O×PÔPÜ,BØÜ—G‘G×1Ñ1°$Õ7Ø $ô-Ð#Ó)ñ 2ð #Ð"ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  µ  s   € ÷ 0
ñ 0
¨dñ 0
ro   c                ót  a€ ^RI Ho V P                   Fu  pSpVP                  e0   VP                  P	                  4       pVe   V P                  V4      pW P                  V&   VP                  4        F  pW P                  V&   K  	  Kw  	  \        ;QJ d7    V3R lV P                  P                  4        4       F  '       g   K   RM,	  RM(! V3R lV P                  P                  4        4       4      '       d¿   \        R V P                   4       R4      pVež   V P                   F�  pVP                  pVP                  4       e   K#  \        V\        P                  4      '       g   KE  \        VP                   \        P"                  4      '       g   Kq  \        P"                  ! VR7      Vn        K�  	  \        ;QJ dE    V3R lV P                  P                  4        4       F  '       g   K   RV n        R# 	  RV n        R# ! V3R lV P                  P                  4        4       4      V n        R# )	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().
©ÚDEFAULT_STREAM_IDXNc              3  ó,   <"  € T F	  qS8g  x € K  	  R # 5irr   rk   )rv   r>  rU	  s   & €rm   rx   Ú9Scheduler._populate_stream_assignments.<locals>.<genexpr>Ò  s   øé € ÐMÑ0L¨1Ð&Ö&Ó0Lùs   ƒTFc              3  óh   "  € T F(  qP                  4       f   K  VP                  4       x € K*  	  R # 5irr   ©rÏ   r•  s   & rm   rx   rW	  Ô  s    é € ÐR© A·|±|³~”�—‘—�«ùs   ‚2š2©r¹  c              3  ó.   <"  € T F
  pVS8g  x € K  	  R # 5irr   rk   )rv   Ú
stream_idxrU	  s   & €rm   rx   rW	  â  s   øé € ð '
á:�
ð Ð,Ö,Û:ùs   ƒ)Ústream_constantsrU	  r¼  r¸   Úget_stream_idxÚ&_get_or_create_stream_idx_for_user_objr	  rŽ  r	  rB  r	  r²  rÏ   rs   r1   ÚBufferr\  rE   r 	  )r�   r¸   r\	  Úuser_obj_idxrÿ   r¹  rm  rU	  s   &      @rm   r#	  Ú&Scheduler._populate_stream_assignmentsµ  sœ  ø€ õ 	9à—J”JˆDØ+ˆJà�y‰yÒ$Ø#Ÿy™y×7Ñ7Ó9�ØÒ+Ø!%×!LÑ!LØ$ó"�Jð )3×Ñ Ñ%ð ×,Ñ,Ö.�Ø+5×#Ñ# CÓ(ó /ñ ÷( ‹3ÔM°×0CÑ0C×0JÑ0JÔ0LÓM�3�3Š3ÔM°×0CÑ0C×0JÑ0JÔ0LÓM×MÒMÜÙR¨¯ªÓRÐTXóˆFð Ò!Ø ŸJœJ�DØ"Ÿi™i�GàŸ™Ó)Ô1Ü& w´·	±	×:Ô:Ü& w§~¡~´r·}±}×EÔEô *,¯ª¸fÔ)E˜žñ '÷ $'£3ô '
à"×1Ñ1×8Ñ8Ô:ó'
§3¤3ˆÖ ¢3ˆÖ  3ô '
à"×1Ñ1×8Ñ8Ô:ó'
ó $
ˆÖ ro   c               ó    € V ^8„  d   QhRRRR/# )rf   ra	  rµ   ri   rk   )rl   s   "rm   rn   rÖ  ç  s   € ÷ ñ À3ð È3ñ ro   c                	ó´   € V P                   P                  V4      pVf9   \        V P                   4      ^,           pW P                   V&   WP                  V&   V# rr   )r"	  r  r÷   r!	  )r�   ra	  r\	  s   && rm   r_	  Ú0Scheduler._get_or_create_stream_idx_for_user_objç  sU   € Ø×4Ñ4×8Ñ8¸ÓFˆ
ØÒä˜T×<Ñ<Ó=ÀÕAˆJØ<F×+Ñ+¨LÑ9Ø:F×+Ñ+¨JÑ7ØÐro   c               ó    € V ^8„  d   QhRRRR/# r  rk   )rl   s   "rm   rn   rÖ  ð  s   € ÷ +ñ +Ð$5ð +¸#ñ +ro   c                	ój  a a€ ^RI Hp SS P                  9   d   S P                  S,          # \        VV 3R lSP	                  4        4       4      p\        V4      ^8X  d   \        \        V4      4      pMï\        V4      ^8”  d)   \        RSP                  4        R\        V4       24      hSP                  e1   SP                  P                  4       ;pe   S P                  V4      pMy\        V 3R lSP                  4        4       4      p\        V4      ^8”  d)   \        RSP                  4        R\        V4       24      hV'       d   \        \        V4      4      MTpVS P                  S&   WB8w  d   RS n        SP                  4        F  pS P                   P#                  Wt4       K   	  V# )r�  rT	  c              3  óV   <"  € T F  pVSJg   K  SP                  V4      x € K   	  R # 5irr   ©r—  )rv   Úchildr¸   r�   s   & €€rm   rx   Ú,Scheduler.get_node_stream.<locals>.<genexpr>ö  s0   øé € ð #
á)�Ø˜DÐ ô (ˆD× Ñ  ×'Ð'Û)ùó   ƒ)�)úScheduler node z combines multiple streams: c              3  óp   <"  € T F+  pVSP                   9   g   K  SP                   V,          x € K-  	  R # 5irr   )r	  )rv   r®  r�   s   & €rm   rx   rk	    s6   øé € ð (á 7�HØ˜t×2Ñ2Ñ2ô .�×#Ñ# H×-Ò-Û 7ùs   ƒ6›6z" has outputs on multiple streams: T)r]	  rU	  r	  r   rá   r÷   r²  r  rŽ   rE  rÈ   r¸   r^	  r_	  rŽ  r 	  r	  Ú
setdefault)r�   r¸   rU	  Úchild_streamsr\	  ra	  Úbuffer_streamsr®  s   ff      rm   r—  ÚScheduler.get_node_streamð  s•  ù€ Ý8à�4×&Ñ&Ô&Ø×&Ñ& tÕ,Ð,ä"õ #
àŸ™Ô)ó#
ó 
ˆô
 ˆ}Ó Ô"Üœd =Ó1Ó2‰JÜ�Ó !Ô#Ü Ø! $§-¡-£/Ð!2Ð2NÜ˜Ó&Ð'ð)óð ð
 �I‰IÒ!Ø!%§¡×!9Ñ!9Ó!;Ð;�ÒHà×DÑDÀ\ÓR‰Jä'ô (à $× 5Ñ 5Ô 7ó(ó ˆNô
 �>Ó" QÔ&Ü$Ø% d§m¡m£oÐ%6ð 7 Ü $ ^Ó 4Ð5ð7óð ÷
 /=””T˜.Ó)Ô*ÐBTð ð %/ˆ×Ñ˜DÑ!ØÔ+Ø'+ˆDÔ$Ø×-Ñ-Ö/ˆHØ×Ñ×*Ñ*¨8Ö@ñ 0àÐro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rÖ    s   € ÷ (ñ (¨ñ (ro   c                ó   € V P                   # )z7Check if any nodes are assigned to non-default streams.)r 	  r�   s   &rm   Ú_has_multi_stream_nodesÚ!Scheduler._has_multi_stream_nodes  s   € à×'Ñ'Ð'ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  !  s   € ÷ 
ñ 
¨tñ 
ro   c                ó
  € V P                   P                  4        V P                  P                  4        V P                   FG  pV P	                  V4      pW P                   V&   VP                  4        F  pW P                  V&   K  	  KI  	  \        ;QJ dB    R V P                   P                  4        4       F  '       g   K   RV n        R# 	  RV n        R# ! R V P                   P                  4        4       4      V n        R# )zCPopulate node_to_mempool and buff_to_mempool from IR node metadata.c              3  ó(   "  € T F  qR Jx € K
  	  R # 5irr   rk   )rv   Úmempools   & rm   rx   Ú:Scheduler._populate_mempool_assignments.<locals>.<genexpr>.  s   é € ð "
Ù/L G˜4ÕÓ/Lùó   ‚TFN)	r   Úclearr	  r¼  Ú_get_node_mempoolrŽ  rB  r	  r	  )r�   r¸   rz	  rÿ   s   &   rm   r$	  Ú'Scheduler._populate_mempool_assignments!  sÐ   € à×Ñ×"Ñ"Ô$Ø×Ñ×"Ñ"Ô$Ø—J”JˆDØ×,Ñ,¨TÓ2ˆGØ)0× Ñ  Ñ&ð ×,Ñ,Ö.�Ø,3×$Ñ$ SÓ)ó /ñ ÷ "›cñ "
Ø/3×/CÑ/C×/JÑ/JÔ/Ló"
ŸcœcˆÖšcˆÖ˜cñ "
Ø/3×/CÑ/C×/JÑ/JÔ/Ló"
ó 
ˆÖro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rÖ  2  s   € ÷ #ñ # Dñ #ro   c                ó   € V P                   # )z7Check if any nodes are assigned to a user CUDA MemPool.)r	  r�   s   &rm   Ú_has_mempool_nodesÚScheduler._has_mempool_nodes2  s   € à×"Ñ"Ð"ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r   ri   útuple[int, int] | Nonerk   )rl   s   "rm   rn   rÖ  6  s   € ÷ $ñ $Ð&7ð $Ð<Rñ $ro   c                óJ  a a€ SP                   e   SP                   P                  4       # \        VV 3R lSP                  4        4       4      pV'       g   R# \	        V4      ^8w  d)   \        RSP                  4        R\        V4       24      h\        \        V4      4      # )z½Return the CUDA MemPool assigned to a scheduler node.

Grouped scheduler nodes such as ForeachKernelSchedulerNode have
node.node == None, so derive their context from the underlying nodes.
Nc              3  óV   <"  € T F  pVSJg   K  SP                  V4      x € K   	  R # 5irr   )r~	  )rv   rÞ   r¸   r�   s   & €€rm   rx   Ú.Scheduler._get_node_mempool.<locals>.<genexpr>?  s0   øé € ð 
á+�Ø˜dÐ"ô ,ˆD×"Ñ" 7×+Ð+Û+ùrl	  rm	  z' contains mixed CUDA MemPool contexts: )
r¸   Úget_mempoolr   rá   r÷   rŽ   rE  rÈ   r²  r  )r�   r¸   Úmempoolss   ff rm   r~	  ÚScheduler._get_node_mempool6  s”   ù€ ð �9‰9Ò Ø—9‘9×(Ñ(Ó*Ð*äõ 
àŸ>™>Ô+ó
ó 
ˆ÷
 ÙÜˆx‹=˜AÔÜ Ø! $§-¡-£/Ð!2ð 3Ü! (›^Ð,ð.óð ô ”D˜“NÓ#Ð#ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r®  r   ri   rµ   rk   )rl   s   "rm   rn   rÖ  M  s   € ÷ Sñ S sð S¨sñ Sro   c                ó¢   € V P                   P                  W4      pV P                  P                  W P                  P                  V^ 4      4      # )zAReturn the stream index for a buffer, resolving mutation renames.)r¥  r  r	  ©r�   r®  Úreals   && rm   Úget_buf_streamÚScheduler.get_buf_streamM  sB   € à×$Ñ$×(Ñ(¨Ó<ˆØ×"Ñ"×&Ñ& t×-@Ñ-@×-DÑ-DÀXÈqÓ-QÓRÐRro   c               ó    € V ^8„  d   QhRRRR/# )rf   r®  r   ri   r…	  rk   )rl   s   "rm   rn   rÖ  R  s   € ÷ Xñ X¨ð XÐ0Fñ Xro   c                ó¢   € V P                   P                  W4      pV P                  P                  W P                  P                  VR4      4      # )zAReturn the CUDA MemPool for a buffer, resolving mutation renames.N)r¥  r  r	  rŽ	  s   && rm   rÿ  ÚScheduler.get_buf_mempoolR  sC   € à×$Ñ$×(Ñ(¨Ó<ˆØ×#Ñ#×'Ñ'¨×.BÑ.B×.FÑ.FÀxÐQUÓ.VÓWÐWro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r®  r   r¸   r   ri   r”   rk   )rl   s   "rm   rn   rÖ  W  s(   € ÷ Kñ K°ð KÐ;Lð KÐQUñ Kro   c                óx   € V P                  4       '       g   R# V P                  V4      V P                  V4      8g  # )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.
F)ru	  r�	  r—  )r�   r®  r¸   s   &&&rm   rþ  Ú!Scheduler.has_cross_stream_hazardW  s7   € ð ×+Ñ+×-Ò-ÙØ×"Ñ" 8Ó,°×0DÑ0DÀTÓ0JÑJÐJro   c               ó   € V ^8„  d   QhRR/# r—  rk   )rl   s   "rm   rn   rÖ  b  s   € ÷ &ñ &Ð 3ñ &ro   c                	ó6   € \         P                  P                  # rr   ©rd   ré   Úcurrent_devicer�   s   &rm   r›	  ÚScheduler.current_devicea  s   € ä�w‰w×%Ñ%Ð%ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¹  r˜  ri   rl  rk   )rl   s   "rm   rn   rÖ  f  s   € ÷ (ñ (Ð%8ð (¸Tñ (ro   c                	ó0   € V\         P                  n        R # rr   rš	  r¸  s   &&rm   r›	  rœ	  e  s   € à!'Œ�‰Öro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  i  s   € ÷ 7ñ 7 $ñ 7ro   c                óˆ   € \         P                  P                  RR4      R8X  d   ^RIHp V! V P
                  RR7       R# R# )z,Generate an image of the graph for debuggingÚINDUCTOR_WRITE_SCHEDULER_GRAPHNÚ1)Údraw_buffersT)Úprint_graph)ÚosÚenvironr  rý  r£	  r¼  )r�   r£	  s   & rm   rD	  ÚScheduler.debug_draw_graphi  s1   € ä�:‰:�>‰>Ð:¸DÓAÀSÔHÝ+á˜Ÿ™°×6ñ Iro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úlabelr   ri   rl  rk   )rl   s   "rm   rn   rÖ  p  s   € ÷ #ñ # sð #¨tñ #ro   c                	óÎ   € \         P                  \        P                  4      '       d<   \         P	                  R V4       V P
                   F  pVP                  4        K  	  R# R# )z%s:N)rÙ  ÚisEnabledForÚloggingÚINFOrö  r¼  r÷  )r�   r©	  r¸   s   && rm   Údebug_print_nodesÚScheduler.debug_print_nodesp  sD   € Ü×ÑœGŸL™L×)Ò)Ü�H‰H�U˜EÔ"ØŸ
œ
�Ø× Ñ Ö"ó #ñ *ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r»  ri   r   rk   )rl   s   "rm   rn   rÖ  v  s   € ÷ 
,ñ 
,¨,ð 
,Ð;Lñ 
,ro   c                	ó`  € VP                  4       f   \        R4      hVP                  4       '       d   \        W4      # \	        V\
        P                  \
        P                  34      '       d   \        W4      # \	        V\
        P                  4      '       d   \        W4      # \        V4      h)Nz2All nodes passed to scheduling must have an origin)r  rŽ   Úis_no_oprý  rs   r1   r   rh  rÚ   rØ  rb  rÆ  r¸  s   &&rm   r	  ÚScheduler.create_scheduler_nodev  sƒ   € Ø×ÑÓÒ%Ü Ð!UÓVÐVØ�=‰=�?Š?Ü)¨$Ó5Ð5Ü˜œr×0Ñ0´"×2CÑ2CÐD×EÒEÜ  Ó,Ð,Ü˜œbŸo™o×.Ò.Ü,¨TÓ8Ð8ä% dÓ+Ð+ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  ‚  s   € ÷ "ñ " dñ "ro   c                	óì  € \        4       p. pV P                  P                  4       p\        P                  P
                  P                  4        FË  pV Uu. uF6  pWS9   g   K  \        V P                  V,          \        4      '       d   K4  VNK8  	  ppV'       g   KO  VP                  V4       V Uu. uF  qPP                  V,          NK  	  pp\        P                  ^8„  p\        V VRVR7      pVP                  V4       V F  pW€P                  V&   K  	  KÍ  	  V P                   U	u. uF  q™P!                  4       V9  g   K  V	NK  	  up	\#        V4      ,           V n        R# u upi u upi u up	i )r�  F)rf  ri  N)r   rs  rb  rd   ré   Úlistsr	  rs   rR  rý  r’  r.   r‚  rF  r  r¼  rE  rÈ   )
r�   Úremoved_node_namesÚfe_nodesÚkept_node_namesÚnamesrt   r  ri  Úfe_noder¸   s
   &         rm   r	  ÚScheduler.create_foreach_nodes‚  sR  € Ü.8«lÐØˆØ×1Ñ1×6Ñ6Ó8ˆä—W‘W—]‘]×)Ñ)Ö+ˆEñ "óá!�DØÑ*ô ô # 4×#4Ñ#4°TÕ#:Ô<R×S÷ �Ù!ð ð ÷ áà×%Ñ% eÔ,Ù:?Ó@¹%°$×'Ñ'¨×-Ð-¹%ˆFÐ@ä$×;Ñ;¸aÑ?ˆOÜ0ØØØ*/Ø /ô	ˆGð �O‰O˜GÔ$ã�Ø07×'Ñ'¨Ó-ó ñ1 ,ð8 "ŸZšZó
Ù'�T¯=©=«?ÐBTÑ+T�DˆD™Zñ
ä�‹NõˆŽ
ùò5ùò Aùò
s$   ÁE'Á#$E'ÂE'Â3E,Ä,E1ÅE1c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  ¦  s   € ÷ _Pñ _P dñ _Pro   c                ó¤  a a(a)a*€  ! V(3R lR\         \        ,          4      o(\        P                  ! S(4      o)S P                   EF  pVP                  4        Fó  pVP                  4       p\        VP                  P                  \        P                  4      '       d!   \        VP                  4       4      ^8”  d   Kg  VP                  4        Fx  pVS)9   dN   VS)9   dG   S)V,          pS)V,          pWV,           pS) F$  pS)V,          VJ g   S)V,          VJ g   K  VS)V&   K&  	  KW  VS)9   d   S)V,          S)V&   Kl  S)V,          S)V&   Kz  	  Kõ  	  EK  	  R V*V 3R llo*R!R V)V*3R lllp	/ p
\        P                  P                   P#                  4        F¿  p\        V\$        P&                  4      '       d   VP(                   F  pRW¬&   K	  	  K<  \        V\        P*                  4      '       g   K^  VP-                  4        Uu. uF'  p\        V\$        P&                  4      '       g   K%  VNK)  	  ppV F  pVP(                   F  pRW¬&   K	  	  K  	  KÁ  	  RpS P                   F’  pVP                  f   \/        R	4      h\1        VP                  P3                  4       R
 R7      pV FJ  p\        V\$        P4                  4      '       g   \/        R4      hRpWÚ9  g   K8  VP                  4       W­&   KL  	  K”  	  S P                   EF$  p\6        P9                  RVP                  4       V'       d¿   VP                  f   \/        R	4      h\1        VP                  P;                  RR7      R R7      pV Fw  pWÚ9  d   \/        V RV
 24      hW­,          ;pf   K'  S P<                  V,          P                  4        F+  pVP?                  \A        VP                  4       4      4       K-  	  Ky  	  \        VPB                  PD                  4      ^8X  dT   \G        \I        VPB                  PD                  4      4      ;p'       d$   \        V\J        4      '       d   VPL                  pMRpVP                  4        EFÎ  p\        VPO                  4       4      ^8”  d&   \/        R\        VPO                  4       4       24      hVPO                  4        EFr  pS*! V4      pVPQ                  4       pV'       d9   V	! VVRR7       VP?                  \S        VVP                  4       RR7      4       K\  V	! VV4       VP?                  \A        VVR7      4       S)V,          PT                   FÚ  pVP                  4       VP                  4       8X  d   K(  \        VP                  \V        4      '       g   \/        R4      hVP                  P                  4        Fi  pVP                  4       pS*! V4      pVVP                  4       9   pVP?                  \S        VVP                  4       V'       * R7      4       V	! VVRR7       Kk  	  KÜ  	  EKu  	  EKÑ  	  \        P                  PX                  VP                  4       ,           F9  pV	! VVRR7       VP?                  \S        VVP                  4       RR7      4       K;  	  \        P                  PZ                  VP                  4       ,           F(  pV	! VVRR7       VP?                  \A        V4      4       K*  	  VPB                  P\                   F=  p\        V\R        4      '       d   K  V	! VP^                  WPa                  V4      4       K?  	  VPc                  S Pd                  4       VP                  4        F‘  pVPO                  4        Fz  pVP                  4       S Pd                  S*! V4      &   VP                  4       S Pd                  V&   S Pf                  Pi                  VV4      S Pf                  VP                  4       &   K|  	  K“  	  EK'  	  \        P                  Pk                  4        F4  p\6        P9                  RV4       V	! V\m        \A        V4      4      4       K6  	  V'       dË   \        P                  Pn                   F¬  pVP;                  RR7       F“  pWÚ9  d   \/        V RV
Pq                  4        24      hW­,          ;p'       g   K9  S P<                  V,          Ps                  4        F5  p\6        P9                  RVV4       V	! V\m        \A        V4      4      4       K7  	  K•  	  K®  	  S Pd                   F¤  p V \        P                  P                   9   dG   V	! V \m        \A        V 4      4      4       \        P                  Pt                  Pw                  V 4       Kh  V \        P                  Px                  9   g   K‰  V	! V \m        \A        V 4      4      4       K¦  	  \{        \        P                  P                   Pq                  4       4       U!U u/ uF	  w  p!p V V!bK  	  p"p!p \        P                  Pt                   U u. uF  p V"V ,          NK  	  up \        P                  n>        S P                   FJ  pVP                  4        F3  pVP                  S)VP                  4       ,          PT                  4       K5  	  KL  	  S P€                   F6  p S P€                  V ,          P                  S)V ,          PT                  4       K8  	  \ƒ        4       p#V#P…                  R4       S)PU                  4        Fh  w  pp$V#P‡                  4       ;_uu_ 4        V$PT                   U%u. uF  p%V%P                  4       NK  	  p&p%V#P…                  RV RV& R24       RRR4       Kj  	  V#P…                  R4       V#P‰                  4       P‹                  4       p'\Œ        P9                  R4       \Œ        P9                  R V'4       R# u upi u up p!i u up i u up%i   + '       g   i     Kî  ; i)"zQ
Create dependency edges between nodes, handling aliasing and
mutation properly.
c                  óJ   <€ ] tR tRtRtRR R lltR R ltR V 3R	 lltR
tR# )Ú1Scheduler.compute_dependencies.<locals>.DedupListi¬  a  
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.
Nc               ó$   € V ^8„  d   QhRRRRRR/# )rf   r#  zlist[_T] | NoneÚ
membershipzOrderedSet[_T] | Noneri   rl  rk   )rl   s   "rm   rn   Ú>Scheduler.compute_dependencies.<locals>.DedupList.__annotate__¶  s(   € ÷ =ñ =à&ð=ð 2ð=ð ñ	=ro   c                	óZ   € T;'       g    . V n         T;'       g    \        4       V n        R # rr   )r#  r   rÂ	  )r�   r#  rÂ	  s   &&&rm   r¸  Ú:Scheduler.compute_dependencies.<locals>.DedupList.__init__¶  s"   € ð
 #Ÿ[˜[ b�”
Ø",×"<Ð"<´
³�–ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Ú	node_userr�   ri   rl  rk   )rl   s   "rm   rn   rÃ	  ¾  s   € ÷ /ñ /¨ð /¨tñ /ro   c                	ó–   € WP                   9   d   R # V P                  P                  V4       V P                   P                  V4       R # rr   )rÂ	  r#  r  rS  )r�   rÇ	  s   &&rm   r  Ú8Scheduler.compute_dependencies.<locals>.DedupList.append¾  s3   € Ø§¡Ô/ÙØ—
‘
×!Ñ! )Ô,Ø—‘×#Ñ# IÖ.ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rü  zDedupList[_T]ri   rk   )rl   s   "rm   rn   rÃ	  Ä  s   € ÷ <ñ < ]ð <°}ñ <ro   c                	óò   <€ \         P                  ! V P                  VP                  4      pV P                  VP                   Uu. uF  q3V P                  9  g   K  VNK  	  up,           pS! WB4      # u upi rr   )r   r7  rÂ	  r#  )r�   rü  Únew_membershiprß  Ú	new_itemsÚ	DedupLists   &&   €rm   Ú__add__Ú9Scheduler.compute_dependencies.<locals>.DedupList.__add__Ä  se   ø€ Ü!+×!1Ò!1°$·/±/À5×CSÑCSÓ!T�Ø ŸJ™JØ$Ÿ{š{ó*Ù*˜!°t·±Ñ.F—A�A™{ñ*õ �	ñ ! Ó;Ð;ùò*s   ÁA4ÁA4)r#  rÂ	  r,  )	r¡   r¢   r£   r¤   r¹   r¸  r  rÏ	  r§   )rÎ	  s   €rm   rÎ	  rÀ	  ¬  s   ø† ñ÷=õ/÷<ô <ro   rÎ	  c               ó    € V ^8„  d   QhRRRR/# )rf   r–  r   ri   rk   )rl   s   "rm   rn   Ú4Scheduler.compute_dependencies.<locals>.__annotate__ñ  s   € ÷ 	ñ 	�cð 	˜cñ 	ro   c                ó\   <€ V SP                   9   d   S! SP                   V ,          4      # V # rr   )r¥  )r–  r  r�   s   &€€rm   r  Ú.Scheduler.compute_dependencies.<locals>.renameñ  s,   ø€ Ø�D×)Ñ)Ô)Ù˜d×3Ñ3°AÕ6Ó7Ð7ØˆHro   Fc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rf   Úused_by_namer   rñ  rJ  rÞ  r”   rK  ri   rl  rk   )rl   s   "rm   rn   rÒ	  ö  s<   € ÷ 		ñ 		àð		ð 6ð		ð ð			ð
 ð		ð ñ		ro   c                óX   <€ SS! V 4      ,          P                  \        WV4      4       R # rr   )r  r.  )rÖ	  rñ  rÞ  rK  Úname_to_usersr  s   &&&&€€rm   Úadd_userÚ0Scheduler.compute_dependencies.<locals>.add_userö  s'   ø€ ð ™& Ó.Õ/×6Ñ6Ü˜°Ó9öro   Nrk  c                ó   € V P                   # rr   r  rÈ  s   &rm   rµ  Ú0Scheduler.compute_dependencies.<locals>.<lambda>  s   € ÀAÇFÂFro   r  zexpected s to be a sympy.SymbolTzscheduling %s)Úunbacked_onlyc                ó   € V P                   # rr   r  rÈ  s   &rm   rµ  rÜ	  /  s   €  !§&¢&ro   z not in z#expected at most one mutation, got )rK  ©Úmutating_bufrQ  )r!  rU  )rQ  zscheduling output %sz+scheduling output %s for unbacked symint %sr  Ú'z': rY  r  zBUFFER USER LIST
z===== AFTER SCHEDULING =====
%s)FF)Gr	   r�   rg  r   r¼  r½  rE  rs   r¸   r\  r1   rE   r÷   r]  rd   ré   rh  r	  r@  rt  r'   Ú	TensorBoxrí  rŽ   r  Úget_unbacked_symbol_defsÚSymbolrÙ  rý  rn  rR  r  r;   r  rÖ  r²  r  r:   r!  r_  rM  r<   r#  r   Úadditional_buffer_depsÚadditional_star_depsr  rt   rÞ  r  r¥  r4  r  r.	  rƒ  r½   rb  rŽ  Úmutated_inputsrS  r	  r³  Úmutated_input_idxsr‹  rz  r[   rÕ  r`  ra  rÛ  Úcompute_dependencies_log)+r�   r¸   Úbuf1Ú	buf1_nameÚ	buf2_nameÚlist1Úlist2Úcombinedr  rÙ	  Úunbacked_symbol_to_origin_nodeÚvalÚfsr>  Úsym_sizeÚhas_non_input_unbacked_defsÚunbacked_symbol_defsÚunbacked_symbol_usesr]  rÿ   rw   Ú	node_modeÚalt_namerM  rb  Úout_bufÚ
other_nameÚis_aliasÚadd_depr  r®  r  rt   r  Ú	inp_namesÚlogbufr†  rx  r?  r   rÎ	  rØ	  r  s+   f                                       @@@rm   r}   ÚScheduler.compute_dependencies¦  sâ	  û€ ÷	<œ¤�ô 	<ô@ @K×?VÒ?VØó@
ˆð —J•JˆDØ×(Ñ(Ö*�Ø ŸM™M›O�	ô ˜tŸy™y×/Ñ/´·±×?Ò?Ü˜D×,Ñ,Ó.Ó/°!Ô3áØ!%×!1Ñ!1Ö!3�IØ  MÔ1°iÀ=Ô6Pà -¨iÕ 8˜Ø -¨iÕ 8˜Ø#(¥=˜Û#0˜Cà -¨cÕ 2°eÓ ;Ø#0°Õ#5¸Õ#>à5= ¨cÓ 2ó $1ð # mÔ3Ø3@ÀÕ3K˜ iÓ0à3@ÀÕ3K˜ iÓ0ó "4ô +ñ ÷<	ñ 	÷
		ó 		ð JLÐ&ô
 —7‘7×'Ñ'×.Ñ.Ö0ˆCÜ˜#œuŸz™z×*Ò*Ø×*Ô*�BØ9=Ð2Ó6ó +ä˜C¤§¡×.Ô.ð (+§|¡|¤~ÓS¡~ !¼ÀAÄuÇzÁz×9RŸA˜A¡~�ÐSÛ!�AØŸnœn˜Ø=AÐ6Ó:ó -ó "ñ 1ð ',Ð#Ø—J”JˆDØ�y‰yÒ Ü$Ð%CÓDÐDô $*Ø—	‘	×2Ñ2Ó4Ñ:Jô$Ð ó *�Ü! !¤U§\¡\×2Ò2Ü(Ð)JÓKÐKð /3Ð+ØÖ:Ø8<¿¹»Ð2Ó5ó *ñ ð$ —J•JˆDÜ�I‰I�o t§y¡yÔ1ç*Ø—9‘9Ò$Ü(Ð)GÓHÐHä'-Ø—I‘I×2Ñ2ÀÐ2ÓFÙ(ô(Ð$ó
 .�AØÔ>Ü,Ø ˜c Ð*HÐ)IÐJóð ð <Õ>Ð>˜ÔKØ#'×#4Ñ#4°QÕ#7×#CÑ#CÖ#E˜CØ ×-Ñ-¬g°c·l±l³nÓ.EÖFó $Fñ .ô �D×$Ñ$×+Ñ+Ó,°Ô1Ü ¤ d×&6Ñ&6×&=Ñ&=Ó!>Ó?Ð?�SÖ?Ü˜s¤I×.Ò.àŸH™H‘	à �	ð ×'Ñ'×)�ä�s×(Ñ(Ó*Ó+¨aÔ/Ü(Ø=¼cÀ#×BSÑBSÓBUÓ>VÐ=WÐXóð ð !$× 1Ñ 1× 3�HÙ% hÓ/�HØ'*×';Ñ';Ó'=Ð$ß'Ù  ¨4¸Õ>Ø×)Ñ)Ü# H¸3¿<¹<»>ÐSWÔXôñ !á˜X tÔ,Ø×%Ñ%¤g¨h¸YÔ&GÔHØ -¨hÕ 7× =Ô =˜ØŸ=™=›?¨d¯m©m«oÔ=Ù$ä)¨$¯)©)Ô5F×GÒGÜ"0Ø Nó#ð ð (,§y¡y×'<Ñ'<Ö'>˜GØ)0×)9Ñ)9Ó);˜Já)/°
Ó);˜Jð (0°7×3FÑ3FÓ3HÑ'H˜HØ ×-Ñ-Ü 'Ø$.Ø14·±³Ø08¬Lô!"ôñ % Z°¸t×Dó% (?ô !>ô !4ñ *ô\ Ÿ7™7×9Ñ9¸$¿-¹-»/×JÐJ�Ù˜ $°Õ5ð ×!Ñ!¤'¨'°4·=±=³?ÈDÔ"QÖRñ	 Kô Ÿ7™7×7Ñ7¸¿¹»×HÐH�Ù˜ $°Õ6Ø×!Ñ!¤'¨'Ó"2Ö3ñ Ið
 ×(Ñ(×.Ô.�Ü! $¬×0Ô0Ù˜TŸY™Y¨×.>Ñ.>¸tÓ.DÖEñ /ð ×%Ñ% d×&;Ñ&;Ô<ð ×'Ñ'Ö)�Ø #× 1Ñ 1Ö 3�HØ>A¿l¹l»n�D×)Ñ)©&°Ó*:Ñ;Ø69·l±l³n�D×)Ñ)¨(Ñ3à×/Ñ/×3Ñ3°H¸hÓGð ×+Ñ+¨C¯L©L«NÓ;ó !4ô *ñ ôP Ÿ™×0Ñ0Ö2ˆHÜ�I‰IÐ,¨hÔ7Ù�Xœz¬'°(Ó*;Ó<Ö=ñ 3÷
 'Ü—w‘w×,Ô,�Ø×1Ñ1ÀÐ1ÖE�AØÔ>Ü,Ø ˜c Ð*H×*MÑ*MÓ*OÐ)PÐQóð ð ;Õ=Ð=�q×=Ð=Ø(,×(9Ñ(9¸!Õ(<×(MÑ(MÖ(O˜HÜŸI™IØ MØ (Ø !ôñ
 % X¬z¼'À(Ó:KÓ/LÖMó )Pó Fñ -ð  ×)Ô)ˆDØ”q—w‘w×+Ñ+Ô+Ù˜œz¬'°$«-Ó8Ô9Ü—‘×&Ñ&×*Ñ*¨4Ö0ØœŸ™×*Ñ*Ö*á˜œz¬'°$«-Ó8Ö9ñ *ô ,5´Q·W±W×5IÑ5I×5NÑ5NÓ5PÔ+Qô
Ù+Q™K˜E 4ˆD�%ŠKÑ+Qð 	ñ 
ô )*¯©×(>Ò(>ó&
Ù(> ˆI�d�OˆOÑ(>ñ&
Œ�‰Ô"ð
 —J”JˆDØ×'Ñ'Ö)�Ø—‘˜m¨C¯L©L«NÕ;×AÑAÖBó *ñ ð ×/Ô/ˆDØ×'Ñ'¨Õ-×7Ñ7¸ÀdÕ8K×8QÑ8QÖRñ 0ô  Ó!ˆØ�‰�cÔØ'×-Ñ-Ö/‰JˆC�Ø—‘—•Ø/4¯{ª{Ó;©{¨!˜Ÿ™ž©{�Ð;Ø—‘  #  c¨%¨°Ð2Ô3÷ !‘ñ 0ð 	�‰�cÔØ× Ñ Ó"×)Ñ)Ó+ˆÜ ×&Ñ&Ð';Ô<Ü ×&Ñ&Ð'IÈ3ÖOùòo Tùó|
ùò&
ùò" <÷ !—�ús6   È"p)È+p)é p.é.p4í?p>îp9
î'p>ð9p>ð>qc               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  Ç  s   € ÷ Kñ K¨4ñ Kro   c           
     	ó\  a a€ ^RI HpHpHpHp \        \        P                  P                  P                  4       4      pV! S P                  V4      p\        P                  P                  P                  '       g   V! S P                  S P                  4       \        \        P                  P!                  4       4      pV! S P                  VV4      w  p p	\#        \%        S P                  4      4       U	u. uF  p	. . 3NK	  	  up	oV F“  p
V
P&                  ^ 8X  d   V
P(                  ^ 8X  d   K'  V
P*                  P-                  4       pSV
P.                  ,          ^ ,          P1                  V4       SV
P2                  ,          ^,          P1                  V4       K•  	  ^ RIHp V! 4        R V V3R llp. p\9        S P                  4       FL  w  ppVP1                  V4       VP1                  V! Wÿ\%        S P                  4      ^,
          8H  R7      4       KN  	  VS n
        R# u up	i )r�  )rî  Úcompute_memory_timelineÚFreeableInputBufferÚget_freeable_input_buf)Úregister_check_mem_opc               ó$   € V ^8„  d   QhRRRRRR/# )rf   Ústep_idxrµ   Úis_final_stepr”   ri   rb  rk   )rl   s   "rm   rn   Ú9Scheduler.insert_memory_check_nodes.<locals>.__annotate__ñ  s$   € ÷ 	9ñ 	9Øð	9Ø*.ð	9à&ñ	9ro   c                ó‚  <€ SV ,          ^ ,          pSV ,          ^,          pW#V.p\         P                  ! \        \        P                  ! R4      R7      \        P
                  P                  P                  P                  . VR R7      pRSP                  V ,          P                  4        2Vn        \        SV4      # )r   r·  rZ	  c                ó@   € V R V^ ,          RV^,          RV^,          /3# )ÚaliveÚdeadr
  rk   )Útensor_argsrÐ  s   &&rm   rµ  ÚWScheduler.insert_memory_check_nodes.<locals>.construct_mem_check_node.<locals>.<lambda>þ  s.   € Øà ¨qÕ!1Ø ¨aÕ 0Ø'¨°qÕ)9ðñCro   )r\  rx  r
  Únontensor_argsÚunflatten_argsÚ
mem_check_)r1   ÚMemoryCheckKernelrE   rê  r¹  ÚopsÚ_inductor_debugÚcheck_memory_stepÚdefaultr¼  rE  r  rb  )r
  r
  Úexpected_newly_aliveÚexpected_newly_deadr
  r¸   r�   Ústep_allocs_deallocss   &&    €€rm   Úconstruct_mem_check_nodeÚEScheduler.insert_memory_check_nodes.<locals>.construct_mem_check_nodeñ  s¥   ø€ ð $8¸Õ#AÀ!Õ#DÐ Ø"6°xÕ"@ÀÕ"CÐà2ÈÐWˆNä×'Ò'Ü!¬¯ª°eÓ)<Ô=Ü—y‘y×0Ñ0×BÑB×JÑJØØ-ñ ôˆDð %/¨t¯z©z¸(Õ/C×/LÑ/LÓ/NÐ.OÐ"PˆDÔÜ,¨T°4Ó8Ð8ro   )r
  N)r-	  rî  r
  r
  r
  r   rd   ré   rh  rb  r¼  rê  rë  r.   ré  r{  r.	  r®  r÷   Ú
size_allocÚ	size_freer  rE  Ú
start_stepr  Úend_stepÚ#torch._inductor.runtime.debug_utilsr
  r³  )r�   rî  r
  r
  r
  rh  Úname_to_freeable_input_bufr½   Úbuf_info_listr~  Úbuf_infor®  r
  r
  Ú	new_nodesr°  r¸   r
  s   f                @rm   rB	  Ú#Scheduler.insert_memory_check_nodesÇ  sÈ  ù€ ÷	
ó 	
ô )3´1·7±7×3GÑ3G×3LÑ3LÓ3NÓ(Oˆá" 4§:¡:¨|Ó<ð 	#ô �‰×%Ñ%×=×=Ð=Ù=Ø—
‘
˜D×,Ñ,ôô *4´A·G±G×4LÑ4LÓ4NÓ)OˆÙ5Ø�J‰JØ&Øó
Ñˆ�q˜!ô $¤C¨¯
©
£OÔ4óC
Ù4˜ˆR�‹HÑ4ñC
Ðó &ˆHà×"Ñ" aÔ'¨H×,>Ñ,>À!Ô,CÙà—‘×/Ñ/Ó1ˆHà  ×!4Ñ!4Õ5°aÕ8×?Ñ?ÀÔIØ  ×!2Ñ!2Õ3°AÕ6×=Ñ=¸hÖGñ &õ 	NáÔ÷	9ñ 	9ð2 ˆ	ä  §¡Ö,‰GˆAˆtØ×Ñ˜TÔ"Ø×ÑÙ(¨ÄÀDÇJÁJÃÐRSÕ@SÑ;SÔUöñ -ð ˆŽ
ùòeC
s   Ã9H)c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ    s   € ÷ +#ñ +# tñ +#ro   c                óZ  a	€ \         P                  '       g   R# . p\        V P                  4       EF4  pR R lo	RpVP	                  4        F¸  p\
        ;QJ d)    V	3R lVP                   4       F  '       d   K   RM	  RM! V	3R lVP                   4       4      pV'       d^   \        P                  RVP                  4       4       \        P                  P                  P                  VP                  4       4       K¶  RpKº  	  VP                  4       '       * ;'       d    V'       * pV'       g   VP                  V4       EK  \        P                  RVP                  4       4       \        P                  P                   P                  VP                  4       4       VP"                  P$                   F§  pVP&                  V P(                  9   g   K   V P(                  VP&                  ,          P                  pV Uu. uF3  qˆP*                  P                  4       VP                  4       8w  g   K1  VNK5  	  upV P(                  VP&                  ,          n        K©  	  EK7  	  \-        \        V4      4      V n        V P                   F  pVP/                  4        K  	  R# u upi )	z 
Remove any nodes without users
Nc               ó    € V ^8„  d   QhRRRR/# )rf   rb  r.  ri   r”   rk   )rl   s   "rm   rn   Ú5Scheduler.dead_node_elimination.<locals>.__annotate__!  s   € ÷ Uñ U¨ð U°dñ Uro   c                ó€   € V P                   ;'       g,    V P                  4       \        P                  P                  9   # rr   )rK  rE  rd   ré   re  )rb  s   &rm   Úcan_eliminate_userÚ;Scheduler.dead_node_elimination.<locals>.can_eliminate_user!  s)   € Ø—|‘|×TÐT t§}¡}£¼!¿'¹'×:TÑ:TÑ'TÐTro   Fc              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5irr   rk   )rv   Úur,
  s   & €rm   rx   Ú2Scheduler.dead_node_elimination.<locals>.<genexpr>&  s   øé € Ð#MÁ9¸aÑ$6°q×$9Ð$9Ã9ùó   ƒTzremoved dead buffer: %szremoved dead operation: %s)r.   Úuse_dcerù   r¼  r½  rà   r?  rÙ  rý  rE  rd   ré   rû  rS  râ  r  re  r  r  rt   r{  r¸   rÈ   ro  )
r�   Úupdated_nodesr¸   Úactive_buffersrÿ   Úcan_eliminater  r?  r/
  r,
  s
   &        @rm   r	  ÚScheduler.dead_node_elimination  sË  ø€ ô �~�~ˆ~Ùð
 ˆÜ˜TŸZ™Z×(ˆDõUð #ˆNØ×'Ñ'Ö)�ß #£Ô#MÀ3Ç9Â9Ó#M§§¢Ô#MÀ3Ç9Â9Ó#MÓ M�ß Ü—I‘IÐ7¸¿¹»ÔHÜ—G‘G×+Ñ+×/Ñ/°·±³Ö?à%)’Nñ *ð !%× 5Ñ 5Ó 7Ô7×NÐNÀÔ<NˆMç Ø×$Ñ$ T×*ô —	‘	Ð6¸¿¹»ÔHÜ—‘×*Ñ*×.Ñ.¨t¯}©}«Ô?Ø ×,Ñ,×2Ô2�DØ—y‘y D×$4Ñ$4Ö4Ø $× 0Ñ 0°·±Õ ;× AÑ A˜á',ó=Ù', !·±·±Ó0AÀTÇ]Á]Ã_Ñ0TŸA˜A¡uñ=˜×(Ñ(¨¯©Õ3Ö9ô 3ñ- )ô8 œ( =Ó1Ó2ˆŒ
ð —J”JˆDØ× Ñ Ö"ó ùò=s   È.J(È8J(c               ó    € V ^8„  d   QhRRRR/# )rf   r!  ú
str | Noneri   r”   rk   )rl   s   "rm   rn   rÖ  A  s   € ÷  ñ  °*ð  Àñ  ro   c                ó
   € VRJ# )z:Check if store mode requires cross-thread synchronization.Nrk   )r�   r!  s   &&rm   Úmode_requires_synchronizationÚ'Scheduler.mode_requires_synchronizationA  s   € à˜4ÐÐro   c               ó    € V ^8„  d   QhRRRR/# r{  rk   )rl   s   "rm   rn   rÖ  E  s   € ÷ ñ Ø,ðà	 ñro   c                óÖ   aaaa€ \         \        ,          ! 4       o\        4       o. oR VVVV3R lloV F  pVP                  4        F  pVSV&   K
  	  K!  	  V F  pS! V4       K  	  S# )z/
Ensure nodes is in topologically sorted order
c               ó    € V ^8„  d   QhRRRR/# )rf   r–  r   ri   rl  rk   )rl   s   "rm   rn   Ú9Scheduler.topological_sort_schedule.<locals>.__annotate__O  s   € ÷ 	!ñ 	!Ð&ð 	!¨4ñ 	!ro   c                óô   <€ V S9  dp   SP                  V 4       \        V P                  R  R7       F/  pVP                  S9  d   K  S! SVP                  ,          4       K1  	  SP	                  V 4       R# R# )c                ó   € V P                   # rr   r  )Úds   &rm   rµ  ÚDScheduler.topological_sort_schedule.<locals>.visit.<locals>.<lambda>R  s   € ÀaÇfÂfro   r  N)rS  r  r®  rt   r  )r–  rw   rR  r  rÃ  Úvisits   & €€€€rm   rD
  Ú2Scheduler.topological_sort_schedule.<locals>.visitO  sa   ø€ Ø˜Œ}Ø—‘˜”Ü! !×"6Ñ"6Ñ<L×M�Cà—x‘x |Ô3Ù Ù˜, s§x¡xÕ0Ö1ñ	 Nð
 —‘˜aÖ ñ ro   )r   r   rö  rŽ  )r�   r¼  r¸   rt   rR  r  rÃ  rD
  s   &&  @@@@rm   r	  Ú#Scheduler.topological_sort_scheduleE  sj   û€ ô Ô+Ö,Ó.ˆÜ59³VˆØ*,ˆ÷	!ó 	!ó ˆDØ×-Ñ-Ö/�Ø%)�˜TÓ"ó 0ñ ó ˆDÙ�$ŽKñ àˆro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  `  s   € ÷ ñ ¨$ñ ro   c           	     	óÈ  € V P                    Uu. uF1  p\        VP                  \        P                  4      '       g   K/  VNK3  	  pp\        ^\        V4      4       F|  p\        \        W#,          P                  4       4      4      p\        \        W#^,
          ,          P                  4       4      4      pW#,          P                  \        WTRR7      4       K~  	  R# u upi )r�  Trß	  N)r¼  rs   r¸   r1   ÚSwitchr®  r÷   r²  r  rŽ  r  r<   )r�   r–  Úconditional_nodesr°  rà	  Úprev_bufs   &     rm   r,	  Ú"Scheduler._enforce_switch_ordering`  s¢   € Ø(,¯
ª
ÓT©
 1´jÀÇÁÌÏÉ×6SŸQ˜Q©
ÐÐTÜ�qœ#Ð/Ó0Ö1ˆAÜ¤Ð%6Õ%9×%JÑ%JÓ%LÓ MÓNˆLÜœDÐ!2°qµ5Õ!9×!JÑ!JÓ!LÓMÓNˆHØÕ ×-Ñ-Ü˜ÀTÔJöó 2ùò Us   �,CÁ Cc               ó    € V ^8„  d   QhRRRR/# )rf   rÀ  r   ri   r¬  rk   )rl   s   "rm   rn   rÖ  i  s    € ÷ Sñ SÐ*;ð SÐ@Wñ Sro   c                	óP  a € \        4       p\        V\        \        \        \
        \        34      '       d0   VP                   F  pVP                  VP                  4       K   	  M\        R \        V4       R24      hV 3R lV 4       p\        \        V 3R lV 4       4      4      # )z+get_unmet_dep_nodes is not implemented for Ú.c              3  óf   <"  € T F&  pSP                   V,          P                  4       x € K(  	  R # 5irr   )r{  rG  r[  s   & €rm   rx   Ú1Scheduler._get_unmet_dep_nodes.<locals>.<genexpr>{  s(   øé € ÐXÉZÀc˜×)Ñ)¨#Õ.×?Ñ?×AÐAËZùs   ƒ.1c              3  óJ   <"  € T F  pSP                   V,          x € K  	  R # 5irr   ©rs  ©rv   r–  r�   s   & €rm   rx   rQ
  |  s   øé € ÐQÁ=¸a˜t×6Ñ6°q×9Ò9Ã=ùs   ƒ #)r   rs   rÚ   rb  rý  r  rD  r®  rS  rt   ÚRuntimeErrorrÐ   rÈ   )r�   rÀ  Ú
unmet_depsrw   Úunmet_dep_opss   f&   rm   Ú_get_unmet_dep_nodesÚScheduler._get_unmet_dep_nodesi  s’   ø€ Ü&0£lˆ
ÜØäÜ)Ü&Ü"Ü$ð÷	
ò 	
ð ×/Ô/�Ø—‘˜sŸx™xÖ(ò 0ô Ø=¼dÀ5»k¸]È!ÐLóð ô YÉZÓXˆÜ”JÔQÁ=ÓQÓQÓRÐRro   c               ó   € V ^8„  d   QhRR/# )rf   ri   r’  rk   )rl   s   "rm   rn   rÖ  ~  s   € ÷ ñ Ð)Fñ ro   c                óÂ  € . p\         P                  V P                  ^ 4      p/ pV P                   FQ  pV P                  V4      p\	        V4      W$&   V F*  pVP                  V. 4      pVP                  V4       WsV&   K,  	  KS  	  VP                  4        UU	u. uF  w  r‰V	^ 8X  g   K  VNK  	  p
pp	V
'       d‡   VP                  V
4       V
 FA  pVP                  V. 4       F  pW+;;,          ^,          uu&   K  	  VP                  V4       KC  	  VP                  4        UU	u. uF  w  r‰V	^ 8X  g   K  VNK  	  p
pp	KŽ  V'       d   \        R4      hV# u up	pi u up	pi )zE
Sort nodes by their topological order, return a list of node lists.
zTopological sort failed!)
rö  Úfromkeysr¼  rX
  r÷   r  r  r#  rR  rŽ   )r�   r  r¼  Úchildrenr¸   rg   rw   Úcr–  rx  Úzero_deg_nodesrb  s   &           rm   r•  Ú!Scheduler._topological_sort_nodes~  s*  € ð ˆÜ—‘˜dŸj™j¨!Ó,ˆØ#%ˆØ—J”JˆDØ×,Ñ,¨TÓ2ˆDÜ˜d›)ˆE‰KÛ�Ø—L‘L  bÓ)�Ø—‘˜”Ø !˜“ó ñ ð ).¯©¬Ô@©¡ ¸¸a¹Ÿ!˜!©ˆÑ@ßØ�L‰L˜Ô(Û#�Ø$ŸL™L¨¨BÖ/�DØ—K 1Õ$•Kñ 0à—	‘	˜!–ñ $ð -2¯K©K¬MÔD©M¡D A¸QÀ!¹VŸa˜a©MˆNÑD‰NßÜ Ð!;Ó<Ð<Øˆùó Aùó Es   ÂEÂ)EÄ%EÄ5Ec               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  ™  s   € ÷ #ñ # 4ñ #ro   c                ó°  € / pV P                    F™  p\        4       pVP                   Fd  pV P                  VP                  ,          P                  4       pWRP                  4       8X  d   KD  VP                  V4       W1V,          ,          pKf  	  W1VP                  4       &   W2n        K›  	  \        V P                   4       F  w  rbWbn
        Wbn        K  	  R# )z
Populate each node.ancestors
N)r¼  r   r®  r{  rt   rG  rE  rS  r;  r³  r¡  r¢  )r�   Úname_to_ancestorsr¸   r;  rw   Údep_node_namer  s   &      rm   r	  ÚScheduler.compute_ancestors™  s¬   € ð
 9;ÐØ—J”JˆDÜ)3«ˆIØ×.Ô.�Ø $× 0Ñ 0°·±Õ :× KÑ KÓ M�ð
 !§M¡M£OÔ3ÙØ—‘˜mÔ,Ø¨}Õ=Õ=’	ñ /ð 2;˜dŸm™m›oÑ.Ø&ŽNñ ô % T§Z¡ZÖ0‰KˆEØ"ŒNØ"ŽNó 1ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  ²  s   € ÷ /ñ /¨ñ /ro   c                óÎ  aa€ / o/ oV P                    FÉ  pVP                   Uu. uFG  pV P                  VP                  ,          P	                  4       ;pVP                  4       8w  g   KE  VNKI  	  ppV'       g   ^ p^ pM*\        V3R lV 4       4      p\        V3R lV 4       4      pVSVP                  4       &   VSVP                  4       &   WQn        Wan	        KË  	  R# u upi )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.
c              3  óD   <"  € T F  pSV,          ^,           x € K  	  R# 5irQ  rk   )rv   rF  Úname_to_min_distances   & €rm   rx   Ú4Scheduler.compute_input_distances.<locals>.<genexpr>Ç  ó   øé € ÐNÁgÀÐ3°BÕ7¸!×;Ò;Ãgùó   ƒ c              3  óD   <"  € T F  pSV,          ^,           x € K  	  R# 5irQ  rk   )rv   rF  Úname_to_max_distances   & €rm   rx   rj
  È  rk
  rl
  N)
r¼  r®  r{  rt   rG  rE  rŸ  rž  rŸ  r   )	r�   r¸   rw   rF  Údep_opsÚmin_distÚmax_distrn
  ri
  s	   &      @@rm   r	  Ú!Scheduler.compute_input_distances²  sÙ   ù€ ð 02ÐØ/1ÐØ—J”JˆDð
  ×2Ò2óá2�CØ×*Ñ*¨3¯8©8Õ4×EÑEÓGÐG�BØ—=‘=“?ñ#÷ �Ù2ð ð ÷ Ø�Ø‘äÔNÁgÓNÓN�ÜÔNÁgÓNÓN�Ø4<Ð  §¡£Ñ1Ø4<Ð  §¡£Ñ1Ø&.Ô#Ø&.Ö#ó% ùòs   ¤AC"Á+C"c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  Î  s   € ÷ $ñ $˜Tñ $ro   c                	ó˜  € \         P                  '       g   R # V P                   F¡  p\        V\        \
        34      '       d,   VP                  4       '       g   \         P                  R8w  d   KL  VP                  4        FA  p\        V\        4      '       d   VP                  4       '       d   K1  VP                  4        KC  	  K£  	  R # )NÚhalide)r.   rl  r¼  rs   rÚ   r  r^   Úcpu_backendrá   rÏ  rÇ  )r�   r¸   rÀ  s   &  rm   rÇ  ÚScheduler.merge_loopsÎ  sŠ   € Ü×0×0Ð0Ùà—J”JˆDô ˜d¤]Ô4FÐ$G×HÒHØ—K‘K—M’M¤f×&8Ñ&8¸HÔ&DáØŸ™Ö)�ä! %¬×7Ò7¸5×;LÑ;L×;NÒ;NÙà×!Ñ!Ö#ó *ó ro   c               ó    € V ^8„  d   QhRRRR/# r{  rk   )rl   s   "rm   rn   rÖ  é  s   € ÷ !ñ !Ð 7ð !Ð<Sñ !ro   c           	     ó6  € \        RRRR7      ;_uu_ 4        \        ^
4       F•  p\        V4      p\        P	                  RV^,           V4       V P                  VRR7      p\        V4      p\        P	                  RV^,           VV4       WC8X  g
   V^8X  g   Kx  \        P	                  RV^,           4        M	  \        P                  '       g   \        P                  '       d   V P                  VRR7      pVuuR	R	R	4       #   + '       g   i     R	# ; i)
z2
Combine eligible nodes into FusedSchedulerNodes.
zScheduler.fused_nodesTrê  z/===== attempting fusion (%d/10): %d nodes =====F)Úis_reorder_roundz=completed fusion round (%d/10): fused %d nodes into %d nodes
z+===== fusion complete (%d iterations) =====N)	r   r®  r÷   rü  rý  Úfuse_nodes_oncer.   rl  Úloop_index_inversion_in_fusion)r�   r¼  r°  Úold_lenÚnew_lens   &&   rm   r×  ÚScheduler.fuse_nodesé  sü   € ô Ø#¸4ÐQU÷
ö 
ô ˜2–Y�Ü˜e›*�Ü× Ñ ØEØ˜•EØôð
 ×,Ñ,¨UÀUÐ,ÓK�Ü˜e›*�Ü× Ñ ØTØ˜•EØØô	ð Ô%¨°A®Ü×$Ñ$ØEÀqÈ1Åuôñ ñ' ô, ×1×1Ð1Ü×8×8Ð8à×,Ñ,¨UÀTÐ,ÓJ�Ø÷;
÷ 
÷ 
ó 
ús   —A?DÂ6DÃDÃ(DÄD	c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ    s   € ÷ 	ñ 	 tñ 	ro   c                ó¬   € . pV P                    F;  pTP                  \        V\        4      '       d   VP	                  4       MV.4       K=  	  Wn         R# )z1
Unpack GroupedSchedulerNode into regular nodes.
N)r¼  rU  rs   rD  rØ  )r�   r%
  r¸   s   &  rm   r:	  ÚScheduler.process_grouped_nodes  sF   € ð .0ˆ	Ø—J”JˆDØ×ÑÜ!+¨DÔ2F×!GÒ!G�—‘”ÈdÈVöñ ð Ž
ro   c               ó    € V ^8„  d   QhRRRR/# ©rf   r¼  r½  ri   útuple[float, str]rk   )rl   s   "rm   rn   rÖ    s   € ÷ 8ñ 8Ø0ð8à	ñ8ro   c                ó8  € \        V4      ^ 8:  d   \        R\        V4       24      hV^ ,          P                  4       pW n        V P	                  V4      p\        RRRR7      ;_uu_ 4        VP                  V4      uuRRR4       #   + '       g   i     R# ; i)úk
Benchmark fused list of nodes and return the execution time
in milliseconds on randomly generated inputs.
ú$expected nodes to be non-empty, got Úbenchmark_fused_nodesTÚcompile_time_autotune_time_us)rë  Údynamo_compile_column_usN)r÷   rŽ   rÏ   r›	  rj  r   r‰
  )r�   r¼  r¹  r  s   &&  rm   r‰
  ÚScheduler.benchmark_fused_nodes  s‰   € ô ˆu‹:˜Œ?Ü Ð#GÌÈEË
À|Ð!TÓUÐUØ�q•×$Ñ$Ó&ˆØ$ÔØ×"Ñ" 6Ó*ˆÜØ#Ø"&Ø%D÷
ö 
ð
 ×0Ñ0°Ó7÷
÷ 
÷ 
ó 
ús   Á,BÂB	Nc               ó(   € V ^8„  d   QhRRRRRRRR/# ©	rf   r¼  r½  Úbenchmark_kernelr”   Úhint_overridero  ri   r   rk   )rl   s   "rm   rn   rÖ  *  s2   € ÷ ñ à*ðð ðð "ð	ð
 
ñro   c                ó6  € \        V4      ^ 8:  d   \        R\        V4       24      hV^ ,          P                  4       pW@n        V P	                  V4      p\        R4      ;_uu_ 4        VP                  WVR7      uuRRR4       #   + '       g   i     R# ; i)ú4
Generate a kernel given a list of pre-fused nodes.
rˆ
  Úgenerate_kernel_code_from_nodes©r�
  N)r÷   rŽ   rÏ   r›	  rj  r   r“
  )r�   r¼  r�
  r�
  r¹  r  s   &&&&  rm   r“
  Ú)Scheduler.generate_kernel_code_from_nodes*  s�   € ô ˆu‹:˜Œ?Ü Ð#GÌÈEË
À|Ð!TÓUÐUØ�q•×$Ñ$Ó&ˆØ$ÔØ×"Ñ" 6Ó*ˆÜÐ;×<Õ<Ø×:Ñ:Ø°}ð ;ó ÷ =×<×<Ó<ús   Á)BÂB	c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Úmoduler   r¹  r»  ri   r…
  rk   )rl   s   "rm   rn   rÖ  =  s$   € ÷ 
>ñ 
>Ø ð
>Ø*6ð
>à	ñ
>ro   c                ó¶   € W n         V P                  V4      p\        R4      ;_uu_ 4        VP                  V4      uuRRR4       #   + '       g   i     R# ; i)úi
Benchmark a compiled module and return the execution time
in milliseconds on randomly generated inputs.
Úbenchmark_codegened_moduleN)r›	  rj  r   rš
  )r�   r—
  r¹  r  s   &&& rm   rš
  Ú$Scheduler.benchmark_codegened_module=  sC   € ð %ÔØ×"Ñ" 6Ó*ˆÜÐ6×7Õ7Ø×5Ñ5°fÓ=÷ 8×7×7Ó7ús   «AÁA	c               ó    € V ^8„  d   QhRRRR/# )rf   Ú
multi_noder  ri   r”   rk   )rl   s   "rm   rn   rÖ  I  s   € ÷ 'ñ 'Ø0ð'à	ñ'ro   c                ó^  € \         P                  P                  pV'       g   R# \        P	                  RW4       VP
                   Fâ  pVP                  4       p\        P                  P                  P                  V4      '       g   KD  VP                  pW$,          p\        V\        P                  4      '       d(   VP                  VP                   4       VP                  p\        V\        P"                  4      '       g   KÁ  We8w  g   KÉ  \        P%                  RVVV4        R# 	  R# )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)rd   ré   Úbuffer_layout_constraintsrÙ  rý  rÎ  rE  rê  rë  r)	  Úshould_use_layout_constraintsr\  rs   r1   ÚFlexibleLayoutÚ freeze_layout_with_exact_stridesra  ÚFixedLayoutrÚ  )r�   r�
  ÚconstraintsÚinpÚinp_namer\  Úexpected_layouts   &&     rm   Ú!_has_layout_conflict_for_templateÚ+Scheduler._has_layout_conflict_for_templateI  sß   € ô —g‘g×7Ñ7ˆßÙä�	‰	Ð.°
ÔHØ×$Ô$ˆCà—|‘|“~ˆHä—?‘?×3Ñ3×QÑQÐRU×VÒVÙð —Z‘ZˆFØ)Õ3ˆOÜ˜&¤"×"3Ñ"3×4Ò4ð ×4Ñ4°_×5KÑ5KÔLàŸ™�ä˜&¤"§.¡.×1Ô1°oÖ6Oä—‘ØeØØ#Øô	ò ñ3 %ñ6 ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  r  s   € ÷ NDñ ND°ñ NDro   c           
     ó&  a€ \        V P                  4       EFW  w  r\        V\        4      '       g   K  \        VP                  \
        P                  4      '       g   KJ  VP                  p\        P                  P                  '       g+   V P                  V4      '       g   VP                  4       w  rEMŸVP                   Uu. uF;  p\        V\        P                  P                  P                   4      '       g   K9  VNK=  	  ppV'       g   \#        R4      h\%        V4      ^8”  d#   VP'                  4       o\)        VV3R lR7      pM	V^ ,          p\        V\        P                  P
                  P*                  4      '       dâ   \        P,                  '       d®   / pWHR&   \        P,                   Fw  p	VP'                  V	R7      oSP/                  4        U
Uu/ uF  w  r«\        V
\*        4      '       g   K  W«bK!  	  pp
p\)        VP/                  4       R R7      ^ ,          pWØV	&   Ky  	  VP                  P1                  V4       MVP                  P3                  V4       EKT  \
        P4                  P7                  VP8                  4      ;_uu_ 4        VP;                  4       pRRR4       XP<                  p\        V\
        P>                  4      '       g   \#        R4      hVP<                  p\        V\
        P@                  4      '       g   \#        R4      hVPB                  '       d   \E        WãPB                  4       VPF                  Vn#        V PI                  VW1V4       EKZ  	  R# u upi u upp
i   + '       g   i     LÛ; i)	aP  
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.
z&No extern kernel detected for fallbackc                ó   <€ SV ,          # rr   rk   )r^
  Útimingss   &€rm   rµ  Ú;Scheduler.finalize_multi_template_buffers.<locals>.<lambda>”  s
   ø€ ÈWÐUVÎZro   r  Nr”
  c                ó   € V ^,          # r(  rk   rÈ  s   &rm   rµ  r®
  ©  s	   € ÈqÐQRÎtro   z+expected out_storage to be an ir.StorageBoxz/expected out_buffer to be an ir.OperationBuffer)%r³  r¼  rs   rÚ   r¸   r1   ÚMultiTemplateBufferr.   r@	  Ú%force_extern_kernel_in_multi_templater¨
  Úget_min_choiceÚchoicesrê  rë  r)	  ÚExternKernelCallerrŽ   r÷   Úchoice_timingsrŸ  r#   Úmulti_kernel_hintsr#  Úfinalize_as_triton_callersÚfinalize_as_triton_callerr‡  Úcurrent_originsr  Úoutput_noder/  Ú
StorageBoxÚOperationBufferÚorigin_noder@   r\  Ú_replace_node)r�   r°  r¸   r�
  Úmin_node_unfusedr~  r^
  Úextern_choicesÚcallersrï  r7  rx  Útriton_timingsÚchoiceÚout_tensorboxÚout_storageÚ
out_bufferr­
  s   &                @rm   r&	  Ú)Scheduler.finalize_multi_template_buffersr  sÒ  ø€ ô ! §¡×,‰GˆAÜ˜$¤×.Ô.´:Ø—	‘	œ2×1Ñ1÷4ô 4ð "ŸY™Y�
ä×+Ñ+×Q×QÐQØ ×BÑBÀ:×NÒNð +5×*CÑ*CÓ*EÑ'Ð$ að ",×!3Ò!3ó&á!3˜AÜ%ØÜ!ŸO™O×<Ñ<×OÑO÷÷ ˜Ù!3ð #ð &÷ *Ü,Ð-UÓVÐVÜ˜>Ó*¨QÔ.Ø",×";Ñ";Ó"=˜Ü+.¨~ÔCWÔ+XÑ(à+9¸!Õ+<Ð(äØ$Ü—O‘O×&Ñ&×?Ñ?÷ò ô
 ×0×0Ð0ØNP˜Ø(8 ™ô %+×$=Ô$=˜DØ&0×&?Ñ&?ÈdÐ&?Ó&S˜Gð -4¯M©M¬Oô.á,;¡D AÜ#-¨aÔ1I×#Jô !% ¢Ù,;ð +ñ .ô
 &)¨×)=Ñ)=Ó)?Á^Ô%TÐUVÕ%W˜FØ,2 D›Mñ %>ð Ÿ	™	×<Ñ<¸WÕEàŸ	™	×;Ñ;Ð<LÔMÚä—Y‘Y×.Ñ.¨z×/AÑ/A×BÕBØ$4×$@Ñ$@Ó$B�M÷ Cà+×0Ñ0�Ü! +¬r¯}©}×=Ò=Ü(Ð)VÓWÐWØ(×-Ñ-�
Ü! *¬b×.@Ñ.@×AÒAÜ(ØIóð ð ×)×)Ð)Ü& }×6LÑ6LÔMà$.×$5Ñ$5�
Ô!Ø×"Ñ" :¨z¸d×CóI -ùò&ùó8.÷ C×Bús$   Ã6M5Ä M5ÇM:
Ç=M:
ÊN Î Nc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )rf   rÆ
  r  r�
  r  r°  rµ   r¸   rÚ   ri   rl  rk   )rl   s   "rm   rn   rÖ  Â  s<   € ÷ 5'ñ 5'à&ð5'ð +ð5'ð ð	5'ð
 ð5'ð 
ñ5'ro   c                	ó  a€ \        W!4       V P                  V4      pWPP                  V&   WPP                  VP	                  4       &   WPP
                  VP	                  4       &   / o\        P                  ! VP                  P                  VP                  4       FB  pV P                  P                  VP                  R 4      ;p'       g   K3  VP                  SV&   KD  	  R V3R llpV! VP                  4      Vn
        V! VP                  P                  4      VP                  n	        \        VP                  4       VP                  4       4       F2  w  ršW�P                   V
P	                  4       &   V
P"                  V	n        K4  	  VP$                  Vn        VP&                  Vn        VP(                  Vn        VP*                  Vn        V P,                  P                  V4      pW@P,                  9  d   V P/                  V4      pVP0                  e5   V\2        P4                  ! \6        P8                  VP0                  4      n        W°P,                  V&   VP=                  4        F  pW°P>                  V&   K  	  Ve
   RV n         R # R # )Nc               ó    € V ^8„  d   QhRRRR/# )rf   rg   rh   ri   rk   )rl   s   "rm   rn   Ú-Scheduler._replace_node.<locals>.__annotate__Ö  s   € ÷ 	Lñ 	L˜oð 	L°/ñ 	Lro   c                ó.   <€ \        V3R  lV  4       4      # )c              3  óD   <"  € T F  qP                  S4      x € K  	  R # 5irr   )r  )rv   rw   r¥  s   & €rm   rx   Ú?Scheduler._replace_node.<locals>.rename_deps.<locals>.<genexpr>×  s   øé € ÐKÁd¸sŸj™jÐ)9×:Ð:Ãdùrl
  r   )rg   r¥  s   &€rm   Úrename_depsÚ,Scheduler._replace_node.<locals>.rename_depsÖ  s   ø€ ÜÔKÁdÓKÓKÐKro   T)!r%  r	  r¼  rR  rE  rs  rH  rI  r  r  r®  r4  r  rt   r÷  r½  r{  r?  r¡  r¢  r;  rž  r   r~	  r¸   r  r  r1   r‡  rz	  rŽ  r	  r	  )r�   rÆ
  r�
  r°  r¸   Únew_scheduler_noderw   r0  rÏ
  Únew_outÚold_outrz	  rÿ   r¥  s   &&&&&        @rm   r¾
  ÚScheduler._replace_nodeÂ  s%  ø€ ô 	" *Ô9Ø!×7Ñ7¸
ÓCÐà*�
‰
�1‰Ø-?×Ñ˜$Ÿ-™-›/Ñ*Ø3E×Ñ §¡£Ñ0ð ÐÜ—?’? 4×#3Ñ#3×#9Ñ#9¸4×;RÑ;RÖSˆCØ ×3Ñ3×7Ñ7¸¿¹À$ÓGÐGˆy×GÐGØ.1¯h©hÐ  Ó+ñ T÷	Lð 	Lñ 1<Ø×1Ñ1ó1
ÐÔ-ñ 0;Ø×*Ñ*×0Ñ0ó0
Ð×&Ñ&Ô,ô !$Ø×*Ñ*Ó,¨d×.>Ñ.>Ó.@ö!
ÑˆGð 4;×Ñ˜W×-Ñ-Ó/Ñ0Ø#ŸM™MˆGŽMñ	!
ð (,§~¡~ÐÔ$Ø'+§~¡~ÐÔ$Ø'+§~¡~ÐÔ$Ø(,¯©ÐÔ%à×&Ñ&×*Ñ*¨4Ó0ˆØ×+Ñ+Ô+Ø×,Ñ,¨TÓ2ˆGð ×"Ñ"Ò.ØFMŒF�KŠKœŸ	™	Ð#5×#:Ñ#:Ó;ÔCØ3:×ÑÐ/Ñ0Ø%×6Ñ6Ö8ˆCØ(/× Ñ  Ó%ñ 9àÒØ"&ˆDÖñ ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Ú	node_listr½  ri   r”   rk   )rl   s   "rm   rn   rÖ  ù  s   € ÷ 
ñ 
Ð)Dð 
Èñ 
ro   c                	ój   € \         ;QJ d    R  V 4       F  '       g   K   R# 	  R# ! R  V 4       4      # )c              3  ó   "  € T F„  p\        VP                  R 4      ;'       db    VP                  RJ;'       dL    \        VP                  P                  R4      ;'       d$    VP                  P                  P                  R8H  x € K†  	  R# 5i)r/  Nr‚  r"  )rw  r¸   r/  r‚  r•  s   & rm   rx   Ú,Scheduler._any_atomic_add.<locals>.<genexpr>ú  s   é € ð 
ñ
 �ô	 �A—F‘F˜FÓ#÷ 9ð 9Ø—‘˜dÐ"÷9ð 9ä˜Ÿ™Ÿ™ ^Ó4÷9ð 9ð —‘—‘×(Ñ(¨LÑ8ô9ó ùs   ‚!B¤Bº'BÁ",BTF©rB  )r�   rÖ
  s   &&rm   Ú_any_atomic_addÚScheduler._any_atomic_addù  sA   € ß‹sñ 
ñ
 ó
�sŒsð 	
Šsð 	
ˆsñ 
ñ
 ó
ó 
ð 	
ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r¼  r½  r�
  ro  ri   z&tuple[LambdaFuture | None, ModuleType]rk   )rl   s   "rm   rn   rÖ    s$   € ÷ ñ Ø0ðØAKðà	/ñro   c                	óv  € V P                  VR VR7      p\        P                  ! V4      p\        VR4      '       g   RV3# \        P
                  P                  P                  4       pVP                  4       '       g   RpWd3# VP                  RVR7      p\        V\        4      '       g   \        R4      hWd3# )T)r�
  r�
  Útriton_N)Úkernel_nameÚsource_codez!expected fut to be a LambdaFuture)r“
  r"   Úloadrw  rê  rë  Úasync_compileÚAsyncCompileÚuse_process_poolrÌ   rs   r!   rŽ   )r�   r¼  r�
  Úsrc_codeÚmodrã
  Úfuts   &&&    rm   Úcompile_kernelÚScheduler.compile_kernel  s·   € ð ×7Ñ7Ø D¸ð 8ó 
ˆô ×Ò˜xÓ(ˆä�s˜I×&Ò&Ø˜#�;ÐäŸ™×5Ñ5×BÑBÓDˆØ×-Ñ-×/Ò/ØˆCð ˆzÐð	  ×&Ñ&°9È(Ð&ÓSˆCÜ˜c¤<×0Ò0Ü$Ð%HÓIÐIàˆzÐro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rª   r   r«   ri   rˆ   rk   )rl   s   "rm   rn   rÖ    s)   € ÷ vñ vØ&ðvØ/@ðvà	ñvro   c                ót  a aaa!a"a#a$a%a&a'a(a)a*a+a,a-a.a/a0a1a2a3a4a5€ \         ;QJ d    R SS3 4       F  '       g   K   RM	  RM! R SS3 4       4      p\        SP                  4       \        P                  4      ;'       d    \        SRR7      pV'       d,   \        P                  '       g   \        P                  R4      # \        P                  '       g   V'       g   \        P                  R4      # SP                  4       '       d/   \        SP                  4       \        P                  4      '       d-   SP                  4       '       g   SP                  4       '       d   \        P                  R4      # SP                  4       pV^ ,          P                  4       o&S&'       g   \        R4      hS&P                   R8X  d+   \        P"                  R8w  d   \        P                  R4      # SP                  4       p\%        \&        P(                  ! WV4      4      o4S P+                  S44      pV'       d   V'       g   \        P                  R4      # ^ RIHo" \1        SS4      o5S4^ ,          P                  4       o&S&f   \        R4      hR
 VV3R llo.V'       Edp   \         ;QJ d    R SS3 4       F  '       g   K   RM	  RM! R SS3 4       4      '       Ed1   SP                  4       R	Jo'S''       d   SP                  4       MSP                  4       o3\        S3\        P2                  4      '       g   \        R4      hS P5                  S34      '       d   \        P                  R4      # / o-V'       Eg˜   \        P6                   EF‚  p. o+S3P9                  V4      o%\;        S%P=                  4       R R7       F�  w  rš\        V	\>        P@                  PB                  PD                  4      '       g   K;  S3PG                  V	4      ;_uu_ 4        S+PI                  V	.S PK                  S4V	PL                  R7      O54       R	R	R	4       K�  	  \O        R4      pR	p/ pS+ Fa  w  ržp Ve   VPQ                  4        S3PG                  T	4      ;_uu_ 4        S P_                  TS&4      w  ppTYÙ&   TT8  d   TpT	pR	R	R	4       Kc  	  VS3P`                  V&   Vf   EKP  \        V\b        4      '       g   \        R\!        V4       24      hVS-V&   EK…  	  ^ RI2H3o# \        Ph                  o$\k        V#3R lS3Pl                   4       4      p\o        4       ;'       d#    S$'       * ;'       d    V\        Pp                  8*  o,\O        R4      \O        R4      uo0o1R	o/S,'       gT   S3P9                  4       o%S3Ps                  4       w  o/o0\;        S%P=                  4       \t        Pv                  ! ^4      R7      pMS3Pl                   Uu. uF  pV^ 3NK	  	  pp^ RI<H=o! R V'V33R llpR V!V'V3V4V 3R llpV'       EdV   S''       g   \        P                  R4      # . \        P6                  OR	N FÉ  pS3P9                  V4      o%R	p\;        S%P=                  4       \t        Pv                  ! ^4      R7       F`  w  ršV! V	4      '       g   K  \|        P~                  ! \>        P@                  PB                  PD                  V	4      pV! V4      '       g   K^  Tp M	  Vf   \        P                  R4      u # VS-V&   KË  	  \        P6                  '       d   S3P�                  S-4       MS-R	,          pS3Pƒ                  V4       \        P                  R4      # S$'       d/   S''       d   S P…                  V4      MS P…                  V4      w  o1pM:S''       g   \        P                  R4      # SP‡                  4       o1\‰        SSS14      o2. o+^ pV EF¨  w  p	p\        V	\>        P@                  P                  Pb                  4      p\        V	S#4      pV'       g   V'       g   KS  V'       d   V	PŠ                  '       g   Ko  V'       d   S''       g   K�  V'       d8   S''       g0   \�        V	R4      '       d   V	PŽ                  S3PŽ                  8w  d   KÀ  S$'       d   VS0S1,           8¼  d    MÕV^,          pV\        Pp                  8”  d    Mµ V'       dW   S3PG                  V	4      ;_uu_ 4        S+PI                  V	.S PK                  S4\‘        V	RR	4      R7      O54       R	R	R	4       EKW  V'       dJ   S3P“                  V	4      ;_uu_ 4        S+PI                  V	.S PK                  S44      O54       R	R	R	4       EK¨  EK«  	  \•        S+4      ^ 8X  d   \        P                  R4      # R V#V$V%V&V'V+V,V-V.V/V0V1V2V3V 3R  llp\—        R! S+ 4       R	4      p \        P™                  VV 4      # S PK                  V4      o(S PK                  V4      o*S PK                  S44      o)R" V"V&V(V)V*V.V V53R# llp\        P™                  VS)^ ,          R$7      #   + '       g   i     EKÄ  ; i  \R         dW   p\T        PW                  \X        PZ                  4      '       d"   \T        P]                  RS''       g   RMRT4        R	p?EK�  R	p?ii ; i  + '       g   i     EK›  ; iu upi   + '       g   i     EK  ; i  + '       g   i     EK-  ; i  S! d     EK;  i ; i)%úo
If config.benchmark_fusion is False, always return True.
Otherwise, return True if fusion can brings speedup.
c              3  ó¢   "  € T FE  pVP                  4       ;'       d)    \        VP                  4       \        P                  4      x € KG  	  R # 5irr   )rÏ  rs   r£  r1   r°
  r•  s   & rm   rx   Ú.Scheduler.speedup_by_fusion.<locals>.<genexpr>  sJ   é € ð  
ñ $�ð �M‰M‹O÷ Jð JÜ˜1×.Ñ.Ó0´"×2HÑ2HÓIôJã#ùs
   ‚Až1ATF)rz  rr  r·  rÌ   ©ÚCompilationErrorNc               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   Úms_fusedr}  rB  rC  ri   rl  rk   )rl   s   "rm   rn   Ú1Scheduler.speedup_by_fusion.<locals>.__annotate__R  s(   € ÷ 	ñ 	 ð 	¨Uð 	¸ð 	À4ñ 	ro   c           
     ó$  <€ \         P                  \        P                  4      '       dæ   V R 8X  d6   \         P	                  RSP                  4       SP                  4       4       R# WV,           8  dO   \         P	                  RSP                  4       SP                  4       \        W,           V ,          R 4      4       R# \         P	                  RSP                  4       SP                  4       \        WV,           ,          R 4      4       R# R# )ç        z<can fuse (assumed): fusing %s with %s (benchmarking skipped)z9can fuse (benchmark): fusing %s with %s cause %sx speedupú.3fz=cannot fuse (benchmark): fusing %s with %s cause %sx slowdownN)rü  r«	  r¬	  ÚDEBUGrý  rŽ  rK   rM   )ró
  rB  rC  rª   r«   s   &&&€€rm   Ú
log_fusionÚ/Scheduler.speedup_by_fusion.<locals>.log_fusionR  sÕ   ø€ Ü×&Ñ&¤w§}¡}×5Ò5Ø˜s”?Ü×$Ñ$ØVØ×.Ñ.Ó0Ø×.Ñ.Ó0öð
  c¥	Ô)Ü×$Ñ$ØSØ×.Ñ.Ó0Ø×.Ñ.Ó0Ü" s¥y°HÕ&<¸SÐ%AÓCö	ô ×$Ñ$ØWØ×.Ñ.Ó0Ø×.Ñ.Ó0Ü  H°cµ	Õ$:¸3Ð#?ÓAö	ñ 6ro   c              3  óD   "  € T F  qP                  4       R Jx € K  	  R # 5irr   )r£  r•  s   & rm   rx   rï
  i  s   é € ð %
Ù7E°!×ÑÓ!¨Õ-³~ùrñ  ú3expected multi_node to be an ir.MultiTemplateBufferc                ó   € V ^,          # r(  rk   rÈ  s   &rm   rµ  Ú-Scheduler.speedup_by_fusion.<locals>.<lambda>�  s   € ÐRSÐTUÖRVro   r  r”
  ÚinfúException in compiling %s: %srµ  r·  z'expected TritonTemplateCallerBase, got )ÚNVUniversalGemmCallerc              3  óH   <"  € T F  p\        V\        S34      x € K  	  R # 5irr   )rs   r#   )rv   r^
  r  s   & €rm   rx   rï
  ·  s)   øé € ð &á+�Aô ˜1Ô7Ð9NÐO×PÐPÛ+ùó   ƒ")Ú	CantSplitc               ó    € V ^8„  d   QhRRRR/# )rf   rÃ
  zir.ChoiceCallerri   r”   rk   )rl   s   "rm   rn   rô
  Ò  s   € ÷ ñ ¨ð À4ñ ro   c                óò   <€ \        V \        P                  P                  P                  4      '       g   R # S'       * ;'       d.    \        V R4      ;'       d    V P                  SP                  8g  '       * # )FÚallowed_prologue_inps)rs   rê  rë  r)	  ÚTritonTemplateCallerrw  r  )rÃ
  ru  r�
  s   &€€rm   Úchoice_supports_fusionÚ;Scheduler.speedup_by_fusion.<locals>.choice_supports_fusionÒ  ss   ø€ Ü!ØœEŸO™O×<Ñ<×QÑQ÷ò ñ !ð (Ô'÷ Yð YÜ Ð(?Ó@÷Yð Yà×4Ñ4¸
×8XÑ8XÑXôð ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rÃ
  z5torch._inductor.select_algorithm.TritonTemplateCallerri   r”   rk   )rl   s   "rm   rn   rô
  â  s   € ÷ ñ ØMðàñro   c                ó  <€ SP                  V 4      ;_uu_ 4         SP                  SV P                  R 7      w  rVe   VP                  4        MVP                  P                  4         RRR4       R#   S d     RRR4       R# \         d^   p\        P                  \        P                  4      '       d"   \        P                  RS'       g   RMRT4        Rp?RRR4       R# Rp?ii ; i  + '       g   i     R# ; i)r”
  NFr   rµ  r·  T)Úswap_as_triton_callerré
  r�
  r  rß
  Ú
precompilerØ  rü  r«	  r¬	  rø
  rý  )	rÃ
  rŒ   Ú	mod_fusedrf  r  ru  r�
  Únode_list_fusedr�   s	   &   €€€€€rm   Úcompile_without_benchmarkingÚAScheduler.speedup_by_fusion.<locals>.compile_without_benchmarkingâ  sÞ   ø€ ð  ×5Ñ5°f×=Õ=ð%Ø,0×,?Ñ,?Ø+¸6×;OÑ;Oð -@ó -Ñ)˜ð "Ò-Ø"ŸM™M�Oà%×-Ñ-×8Ñ8Õ:÷ >ñ& øð %ô %Ø$÷ >Ñ=ô %ô %Ü%×2Ñ2´7·=±=×AÒAÜ&×,Ñ,Ø ?ß2A¡
ÀzØ !ôó
  %÷% >Ñ=ûð%ú÷ >Ö=ñ& úsY   ›C2�3A6ÁC2ÁA6Á+C2Á6C/Á=C2ÂC/ÂC/ÂA C*Ã	C*ÃC2Ã*C/Ã/C2Ã2D	r  r�
  c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rô
  m  s   € ÷ F!ñ F!¨$ñ F!ro   c                 ón  <€ \        R 4      p Rp/ pS'       dŠ   S '       d!   \        S \        P                  4      '       g   \	        R4      hS P                  4       oS P                  4       w  ooS Uu. uF  pV^ ,          S9   g   K  VNK  	  upo\        SV3R lR7      oS EFå  w  rEp Ve   VP                  4       pM=S'       g3   \        VR4      '       d   VP                  pVP                  4        MRpMRp S'       dn   \        VS4      p	V	'       d   S P%                  V4      MS P'                  V4      p
T
;_uu_ 4        S!P)                  VS4      w  r¼W²V&   W°8  d   Tp TpRRR4       KÏ  SV8H  ;'       g    SS,           SV,          S,           8„  p\        VS4      p	V	'       d   V'       d   Tp MÔV'       g   EK!  V'       g   EK,  VP                  4        VP*                  '       d   VP,                  '       g   \	        R	4      hVP*                  ^ ,          pVP,                  pVP.                  p\1        SSVP,                  VVVP2                  P4                  \6        P8                  ! S4      4      pV'       g   EKä  Tp M	  S'       d   S! V SS4       S'       d   V SS,           8  d‚   Ve~   \        VS4      pV'       d   S P;                  V4       M>\<        P>                  '       d   VSR&   S PA                  S4       MS PC                  V4       S'       d   VS PD                  R&   R
# R# u upi   \         dW   p\        P                  \        P                   4      '       d"   \        P#                  RS'       g   RMRT4        Rp?EKö  Rp?ii ; i  + '       g   i     EK  ; i)rÿ
  Nrü
  c                ó$   <€ SV ^ ,          ,          # r  rk   )rß  rµ
  s   &€rm   rµ  ÚKScheduler.speedup_by_fusion.<locals>.benchmark_when_ready.<locals>.<lambda>†  s   ø€  n°Q°qµTÖ&:ro   r  rß
  r   rµ  r·  z2expected res.launchers and choice.n_regs to be setTF)#r}  rs   r1   r°
  rŽ   rµ
  r²
  r  r  rw  rß
  r  rØ  rü  r«	  r¬	  rø
  rý  Úswap_as_nvgemm_callerr  rš
  Ú	launchersÚn_regsÚn_spillsrH  Úbmreqr4  rI   rÏ  Úfinalize_as_nvgemm_callerr.   r¶
  r·
  r¸
  Ú_choice_timings)"Úmin_ms_fusedÚms_fused_choiceÚnew_timingsÚ
fut_choicerÃ
  rŒ   r  Úresrf  Úis_nvgemm_choiceÚswap_ctxró
  ÚpathÚfusible_choiceÚcompiled_kernelr2  r3  Úshould_fuse_epilogueÚ	is_nvgemmr  Úbench_epiloguerµ
  r¹  ru  Úfuture_choicesÚget_choice_timings_asyncÚ hint_override_best_fusion_choicerù
  Ú
min_choicerB  rC  Ú	ms2_fusedr�
  r�   s"                      €€€€€€€€€€€€€€€rm   Úbenchmark_when_readyÚ9Scheduler.speedup_by_fusion.<locals>.benchmark_when_readym  sX  ø€ ä$ U›|�Ø"&�Ø �ç+ç"¤z°*¼b×>TÑ>T×'UÒ'Uä,ØQóð ð &0×%>Ñ%>Ó%@�NØ&0×&?Ñ&?Ó&A‘O�J ñ
 +9ó&á*8˜JØ% a�=¨NÑ:÷ #˜
Ù*8ñ&�Nô &,Ø&Ü:ô&�Nô
 2@Ñ-�F Ið!Ø!Ò-Ø"(§-¡-£/™Cß!/Ü& y°)×<Ò<Ø&/×&7Ñ&7 Ø #§¡Õ 0à&*¡à"&™C÷ &Ü+5°fÐ>SÓ+TÐ(÷  0ð '×<Ñ<¸VÔDð ",×!AÑ!AÀ&Ó!Ið !÷ &šXØ-1×-LÑ-LØ )à &ó.™N˜Hð
 3;¨Ñ/Ø'Ô6Ø/7 Ø28 ÷ &™Xð '¨&Ñ0÷ Nð NØ" S�y¨>¸&Õ+AÀIÕ+MÑMð 'ô
 ,6°fÐ>SÓ+TÐ(ß+·ð /5˜OÙ!ß šS§^¢^Ø"×-Ñ-Ô/à$'§M§M M°f·m·m°mÜ&4Ø$Xó'"ð !"ð /2¯m©m¸AÕ.>˜Oà+:×+AÑ+A˜Là-<×-EÑ-E˜NÜ3AØ #Ø #Ø &§¡Ø ,Ø .Ø &§¡× 6Ñ 6Ü 0× 7Ò 7¸Ó ?ó4Ð0÷  4Ò3Ø28 Ù %ñ_ 2@÷b "Ù˜|¨S°#Ô6÷ '¨,¸#À½)Ô*DØ%Ò1Ü *¨?Ð<QÓ R�Iß à"×<Ñ<¸_ÕMÜ×2×2Ð2ØAPÐ8¸Ñ>à"×=Ñ=Ø<õð
 #×<Ñ<¸_ÔMç%à;F˜
×2Ñ2°4Ñ8Ùá ùòk&øô4 %ô !Ü%×2Ñ2´7·=±=×AÒAÜ&×,Ñ,Ø ?ß2A¡
ÀzØ !ôö
 !ûð!ú÷$ &ŸX™XúsO   Á3L9ÂL9Â,L>ÃL>Ã	.L>Ã8L>Ã;L>Å#N"Ì>NÍ	A NÎ
	NÎNÎ"N4c              3  ó6   "  € T F  w  rqf   K  Vx € K  	  R # 5irr   rk   )rv   r~  rè
  s   &  rm   rx   rï
  ù  s   é € ÐH¡n™˜ —’£nùs   ‚�
c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rô
    s   € ÷ Fñ F¨$ñ Fro   c                 ó†  <aaaaaa€ ^ RI Hp   S^ ,          S^ ,          S^ ,          3 F  pVf   K	  VP                  4        K  	  SP                  S^,          S
4      w  oo\        P
                  ! S4      '       d   S! R4       R# SP                  S^,          S
4      w  oo\        P
                  ! S4      '       d   S! R4       R# SP                  S^,          S
4      w  oo\        P
                  ! S4      '       d   S! R4       R# S! SSS4       \        R4      '       db   SSS,           8¼  dT   SS3SP                  9  dA   SP                  P                  SS34       \        R4      P                  VVVVVV3R l4       SSS,           8  #   T  d     R# S	 d   pR	\        T4      9   d    Rp?R
# h Rp?ii ; i)r   )ÚNoTritonConfigsErrorNz%register spilling of the first kernelFz&register spilling of the second kernelz%register spilling of the fused kernelÚslow_fusionc                 ó@   <€ R SRS RSRSRSRSRSS S,           ,          /# )Úkernel1_pathÚkernel1_latencyÚkernel2_pathÚkernel2_latencyÚfused_kernel_pathÚfused_kernel_latencyÚslow_down_ratiork   )rB  rC  ró
  Úpath1Úpath2Ú
path_fuseds   €€€€€€rm   rµ  r  6  s4   ø€ Ø .°Ø 1°3Ø .°Ø 1°3Ø 3°ZØ 6¸Ø 1°8¸sÀS½yÕ3Iñ%ro   úLoop-carried variableT)Ú)torch._inductor.runtime.triton_heuristicsr5  r  rš
  r4  Úisinfr%   r	  rS  r$   rH	  r   )r5  rè
  rf  rB  rC  ró
  r?  r@  rA  rñ
  r¹  Úfuture_and_mod_l1Úfuture_and_mod_l1_fusedÚfuture_and_mod_l2rù
  r�   r_  s      @@@@@@€€€€€€€€rm   r0  r1    s¡  þ€ õðAð *¨!Õ,Ø)¨!Õ,Ø/°Õ2ó ˜ð
 œ?ØŸJ™JžLñ ð "&×!@Ñ!@Ø)¨!Õ,àó"‘J�C˜ô
 —z’z #—’ÙÐCÔDÙ$à!%×!@Ñ!@Ø)¨!Õ,àó"‘J�C˜ô
 —z’z #—’ÙÐDÔEÙ$à+/×+JÑ+JØ/°Õ2àó,Ñ(�H˜jô
 —z’z (×+Ò+ÙÐCÔDÙ$á˜x¨¨cÔ2ô 0°×>Ò>Ø$¨¨c­	Ô1Ø" E˜N°$×2IÑ2IÔIà×/Ñ/×3Ñ3°U¸E°NÔCÜ(¨Ó7×?Ñ?÷ñ ô
ð $ c¨C¥iÑ/Ð/øà+ô !Ú à'ô Ø.´#°a³&Ô8Ý#ØûðúsT   �F ²AF Á>F Â7F Ã F Ã
7F ÄF ÄBF ÆG ÆG Æ#G Æ$F;Æ:F;Æ;G rž   )MrB  rs   r£  r1   r‡  rƒ  r.   r€  rˆ   r™   Úbenchmark_fusionrÏ  r×  rá   rÏ   rŽ   rÐ   rv
  rÈ   rH  rI  rÛ
  Útriton.compiler.errorsrñ
  rï  r°
  r¨
  r¶
  rµ
  r  r#  rê  rë  r)	  r  r  r  ré
  r�
  r}  r  rØ  rü  r«	  r¬	  rø
  rý  rš
  r  r#   Ú)torch._inductor.codegen.nv_universal_gemmr  Úbenchmark_epilogue_fusionr5  r³
  r    Ú max_epilogue_benchmarked_choicesr²
  ÚoperatorÚ
itemgetterr6  r  r  r  r·
  r¸
  r‰
  r  r/  Úsupports_epilogue_fusionrw  r  r   r  r÷   r²  rŸ   )6r�   rª   r«   Úis_multi_templateÚatomic_add_template_epilogueÚnode_list_1Únode_list_2Úhas_atomic_addr�
  rÃ
  r~  r  r  r   rŒ   r  rf  ró
  r%  Únum_fusible_callersÚchoice_timings_iterr^
  r	  r  Útriton_choiceÚbestr@  Útemplate_choicesÚunfused_timeÚ	is_tritonr)  r0  Údeferred_futurer  rñ
  r  r*  rµ
  r¹  ru  rE  rF  rG  r+  r,  r-  rù
  r.  rB  rC  r/  r�
  r  r_  s6   fff                              @@@@@@@@@@@@@@@@@@@@@rm   Úspeedup_by_fusionÚScheduler.speedup_by_fusion  sÉ	  ÿÿÿ€ ÷  ›Cñ  
ð ˜U‘^ó 
ŸCŸCšCñ  
ð ˜U‘^ó 
ó 
Ðô
 (2Ø×#Ñ#Ó%¤r×'>Ñ'>ó(
÷ (Jð (Jä.¨uÀ5ÔIð 	%÷ (´×0V×0VÐ0VÜ×$Ñ$ UÓ+Ð+ä×&×&Ð&×/@Ü×$Ñ$ TÓ*Ð*ð ×Ñ×ÒÜ˜u×6Ñ6Ó8¼"×:QÑ:Q×RÒRØ×Ñ×!Ò!Ø×Ñ×!Ò!ä×$Ñ$ TÓ*Ð*à—o‘oÓ'ˆØ˜Q•×*Ñ*Ó,ˆßÜ Ð!<Ó=Ð=ð �;‰;˜%Ô¤F×$6Ñ$6¸(Ô$BÜ×$Ñ$ TÓ*Ð*à—o‘oÓ'ˆÜœyŸš¨{ÓHÓIˆØ×-Ñ-¨oÓ>ˆ÷ ×"3Ü×$Ñ$ TÓ*Ð*å;ä˜˜uÓ%ˆà  Õ#×.Ñ.Ó0ˆØŠ>Ü Ð!<Ó=Ð=÷	ñ 	÷. Ð§£ñ %
Ø8=¸u±~ó%
§§¢ñ %
Ø8=¸u±~ó%
÷ "
ó "
ð $×5Ñ5Ó7¸tÐCˆO÷ #ð ×'Ñ'Ô)à×,Ñ,Ó.ð ô
 ˜j¬"×*@Ñ*@×AÒAÜ$ØIóð ð ×5Ñ5°j×AÒAÜ#×(Ñ(¨Ó/Ð/àRTÐ,ß!�>Ü%+×%>Õ%>�Mð ð #ð &0×%>Ñ%>¸}Ó%M�NÜ%+¨N×,@Ñ,@Ó,BÉ×%W™	˜Ü)Ø"Ü!ŸO™O×<Ñ<×QÑQ÷ ò  ñ %Ø'×=Ñ=¸f×EÕEØ*×1Ñ1à$*ð!"à%)×%8Ñ%8Ø(7Ø6<×6JÑ6Jð &9ó &&ñ!"ô÷ FÑEñ &Xô" $)¨£<�LØGK�OØ"$�KÛ5CÑ1˜¨	ð
%Ø%Ò1Ø &§¡¤ð (×=Ñ=¸f×EÕEØ-1×-LÑ-LØ )¨6ó.™N˜H dð 3;˜KÑ/Ø'¨,Ô6Ø/7 Ø28 ÷ FÑEñ 6Dð( AL�J×.Ñ.¨}Ñ=Ø&Õ2Ü)¨/Ô;S×TÒTÜ"0ð#'Ü'+¨OÓ'<Ð&=ð!?ó#ð ð
 ,ð 9¸ÔGñi &?õp Xä#×=Ñ=ˆNÜ"%ô &à#×+Ò+ó&ó #Ðô )Ó*÷ Sð SØ&Ô&÷Sð Sà'¬6×+RÑ+RÑRð %ô ˜U“|¤U¨5£\ˆHˆC�Ø15ˆJß+Ø!+×!:Ñ!:Ó!<�Ø",×";Ñ";Ó"=‘�
˜Cä&,Ø"×(Ñ(Ó*´×0CÒ0CÀAÓ0Fô'Ñ#ð 8B×7IÒ7IÓ&JÑ7I°!¨¨1£vÑ7IÐ#Ð&Jå>÷ñ ÷ ô ÷0 ˆ~ß&Ü'×,Ñ,¨UÓ3Ð3à%G¤v×'@Ñ'@Ð%GÀ$Ó%G�MØ%/×%>Ñ%>¸}Ó%M�NØGK�OÜ%+Ø&×,Ñ,Ó.´H×4GÒ4GÈÓ4J÷&™	˜ñ  6°f×=Ò=Ù$Ü(.¯ªÜ!ŸO™O×<Ñ<×QÑQØ"ó)˜ñ 8¸×FÔFØ.;˜OÙ!ñ&ð 'Ò.Ü+×0Ñ0°Ó7Ò7ØFUÐ4°]ÓCñ# &Hô& ×,×,Ð,Ø×9Ñ9Ø8õð <¸DÕA�Dà×8Ñ8¸Ô>Ü#×(Ñ(¨Ó.Ð.ç÷ 'ð ×.Ñ.¨{Ô;à×3Ñ3°KÓ@ñ �‘U÷ 'Ü'×,Ñ,¨UÓ3Ð3à×2Ñ2Ó4�Ü<¸UÀEÈ3ÓO�	àPRˆNØ ÐÜ(;Ñ$�˜Ü&ØœEŸO™O×.Ñ.×GÑGó�	ô ' vÐ/DÓE�	ç ¯Ù÷  V×%D×%DÐ%DÙ÷
 §_Ù÷ ß+Ü Ð(?×@Ò@Ø×4Ñ4¸
×8XÑ8XÔXáç! l°c¸CµiÔ&?Ùà  AÕ%Ð Ø#¤f×&MÑ&MÔMÙðß à'×=Ñ=¸f×EÕEØ*×1Ñ1à$*ð!"à%)×%8Ñ%8Ø(7Ü6=Ø,2°OÀTó7*ð &9ó &&ñ!"ô
÷ FÒE÷ #à'×=Ñ=¸f×EÕEØ*×1Ñ1Ø!'Ð O¨$×*=Ñ*=¸oÓ*NÑ Oô÷ FÒEò #ñm )<ô~ �>Ó" aÔ'Ü#×(Ñ(¨Ó/Ð/÷F!÷ F!ö F!ôV #ÙH¡nÓHÈ$óˆOô  ×-Ñ-Ð.BÀOÓTÐTð !%× 3Ñ 3°KÓ @ÐØ $× 3Ñ 3°KÓ @ÐØ&*×&9Ñ&9¸/Ó&JÐ#÷F÷ FôP  ×-Ñ-Ø0Ð9PÐQRÕ9Sð .ó ð ÷I F×EÑEûô$  )ô %Ü)×6Ñ6´w·}±}×EÒEÜ *× 0Ñ 0Ø$Cß6E¡JÈ:Ø$%ô!"ö
 %ûð%ú÷ F×EÑEüòZ 'K÷N F×EÑEú÷ F×EÑEûð !ô Ûðús�   Ð1i.	Ñ%jÒ%k'	×;k<ã4l+ã<l+ä2lål+ål+ål+å3%læl+é.j êk$êA kë	këk$ë'k9ìlìl+ìl+ìl(ì!l+ì(l+ì+l7ì6l7c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r   ri   rk   )rl   s   "rm   rn   rÖ  O  s   € ÷ >ñ >Ð#4ð >Ð9Jñ >ro   c                óD   € V P                   VP                  4       ,          # )z0Look up the node in Scheduler name_to_fused_node)rs  r€  r¸  s   &&rm   rï  ÚScheduler.get_fused_nodeO  s   € à×&Ñ& t×':Ñ':Ó'<Õ=Ð=ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rª   r   r«   rj  úOrderedSet[BaseSchedulerNode]ri   rk   )rl   s   "rm   rn   rÖ  S  s2   € ÷ ñ à ðð !ðð 3ð	ð
 
ñro   c                	ó¾  € \         P                  R VP                  4       VP                  4       4       VP                  4       pVP                  4       V8w  d    \	        RV RVP                  4        24      hV P                  V4      P                  W4      pVP                  V4       VP                  V4       VP                  V4       V P                  P                  VP                  4        Uu/ uF  qfP                  4       VbK  	  up4       V P                  V4      V P                  V&   V P                  P                  V4      V P                  V&   V# u upi )zfusing %s with %szexpected node2 device to be z, got )rü  rý  rE  rÏ   rŽ   rj  r™   r-  rS  rs  r’  rá   r—  r	  r   r  )r�   rª   r«   rj  r¹  Únode3r–  s   &&&&   rm   Úfuse_two_nodesÚScheduler.fuse_two_nodesS  s.  € ô 	×ÑÐ,¨e¯n©nÓ.>ÀÇÁÓ@PÔQà×!Ñ!Ó#ˆØ×ÑÓ Ô'Ü Ø.¨v¨h°f¸U×=MÑ=MÓ=OÐ<PÐQóð ð × Ñ  Ó(×-Ñ-¨eÓ;ˆØ×Ñ˜5Ô!Ø×Ñ˜5Ô!Ø�‰˜ÔØ×Ñ×&Ñ&ÀUÇ_Á_ÔEVÓ'WÑEVÀ¯
©
«°eÒ(;ÑEVÑ'WÔXð &*×%9Ñ%9¸%Ó%@ˆ×Ñ˜EÑ"Ø&*×&:Ñ&:×&>Ñ&>¸uÓ&Eˆ×Ñ˜UÑ#àˆùò (Xs   Ã2Ec               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rª   r   r«   Ú
speedup_fnrœ   rj  rc  rk   )rl   s   "rm   rn   rÖ  m  s2   € ÷ ñ à ðð !ðð 'ð	ð
 3ñro   c                	ó¤   € V P                  W4      '       d9   V P                  W4      '       g"   V! 4       '       d   V P                  WV4       R # R# ©TF)rI  Úwill_fusion_create_cyclerf  )r�   rª   r«   ri  rj  s   &&&&&rm   Úfuse_if_speedupÚScheduler.fuse_if_speedupm  sA   € ð �M‰M˜%×'Ò'Ø×1Ñ1°%×?Ò?Ù—’à×Ñ ¨kÔ:Ùáro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Útemplate_fusion_candidatesú,dict[BaseSchedulerNode, list[PendingFusion]]rj  rc  ri   rl  rk   )rl   s   "rm   rn   rÖ  ~  s-   € ÷ O2ñ O2à$PðO2ð 3ðO2ð 
ñ	O2ro   c                ó`  € V'       Ed%   . p/ p\        4       pV EFm  pWa9   d   \        W,          4      ^8¼  g   \        R4      hW,          P                  ^ 4      p\        W,          4      ^ 8X  d   VP	                  V4       VP                  4       w  r‰W–8X  d    \        W‰4      '       g   \        R4      hTp
M/W†8w  d   \        R4      h\        W‰4      '       g   \        R4      hT	p
V P                  V
4      V
Jd   Kæ  VP                  '       d?   VP                  P                  pVf   \        R4      hVP                  V4       Wv3WK&   EK6  V P                  W‰VP                  V4      '       g   EK\  VP	                  V4       EKp  	  \        V4       Fv  pWK,          w  r|V P                  V P                  VP                  4      V P                  VP                  4      VP                  V4      '       g   Ke  VP	                  V4       Kx  	  V F  pVP                  V4       K  	  EK-  R# )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
zAexpected candidate to have at least one template fusion candidatez.expected node1, node2 to be an epilogue fusionz!expected node1 to equal candidatez-expected node1, node2 to be a prologue fusionNzexpected f to be set)r   r÷   rŽ   rR  rS  r±   r“  r—  rï  rŒ   r  rm  rŠ   r   rª   r«   )r�   rp  rj  Útemplate_futuresÚfuture_to_pending_fusionÚfusions_to_remover5  Úpending_fusionrª   r«   r¶  ÚfÚcands   &&&          rm   Ú"_evaluate_pending_template_fusionsÚ,Scheduler._evaluate_pending_template_fusions~  s  € ÷ )Ð(Ø-/Ðð ð %ô @J»|ÐÜ7�	àÔ;ÜÐ6ÕAÓBÀaÔGä(Ø[óð ð "<Õ!F×!JÑ!JÈ1Ó!M�äÐ1Õ<Ó=ÀÔBØ%×)Ñ)¨)Ô4à-×>Ñ>Ó@‘�àÔ%Ü-¨e×;Ò;Ü,ØLóð ð %*‘MàÔ)Ü,Ð-PÓQÐQÜ-¨e×;Ò;Ü,ØKóð ð %*�Mð ×&Ñ& }Ó5¸]ÓJÙà!×(×(Ð(Ø&×-Ñ-×4Ñ4�AØ’yÜ,Ð-CÓDÐDØ$×+Ñ+¨AÔ.Ø3AÐ2MÐ,Ô/ð ×+Ñ+Ø n×&@Ñ&@À+÷õ ð *×-Ñ-¨i×8ña 8ôf "Ð"2Ö3�Ø'?Õ'BÑ$�Ø×'Ñ'Ø×'Ñ'¨×(<Ñ(<Ó=Ø×'Ñ'¨×(<Ñ(<Ó=Ø"×.Ñ.Ø÷	ô ð &×)Ñ)¨$Ö/ñ 4ó '�Ø*×.Ñ.¨qÖ1ô 'ñG )ro   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )rf   Úpossible_fusion_pairsú1list[tuple[BaseSchedulerNode, BaseSchedulerNode]]Úpending_fusionsú&dict[BaseSchedulerNode, PendingFusion]Útemplate_fusion_nodesrq  rj  rc  rz
  r”   rk   )rl   s   "rm   rn   rÖ  Ï  sE   € ÷ U?ñ U?àPðU?ð @ðU?ð  Lð	U?ð
 3ðU?ð ñU?ro   c                	ó  a aa€ R  VVV 3R llpV EFu  w  rxV! Wx4       S P                  V4      pS P                  V4      p\        Wx4      '       d   Wx3S P                  9   d   KU  S P                  WxV4      '       g   Ko  S P	                  Wx4      '       d   Kˆ  S P                  Wx4      p	V	P                  e¨   \        V	P                  VVV	P                  R7      p
\        Wx4      '       dg   Wx3S P                  9   d   \        R4      hS P                  P                  Wx34       \        Wx4      pW³9  d   . W;&   W;,          P                  V
4       M
V
SV&   V
SV&   EKN  V	P                  '       g   EKc  S P                  WxS4       EKx  	  R# )c               ó$   € V ^8„  d   QhRRRRRR/# rõ  rk   )rl   s   "rm   rn   Ú1Scheduler._try_fusion_pairs.<locals>.__annotate__×  s+   € ÷ 	Gñ 	GØ$ð	Gà$ð	Gð ñ	Gro   c                óz  <€ SP                  V 4      S9   g   SP                  V4      S9   Ed   SP                  SP                  V 4      SP                  SP                  V4      4      4      pVf   \        R4      hVP                  4       w  r4VP                  pSP                  VR 4       SP                  VR 4       SP                  V4      VJd   \        R4      hSP                  V4      VJd   \        R4      hV! 4       '       d   SP                  W4      '       d   EK$  SP                  W4S4       EK9  R # )Nz!expected pending_fusion to be setú+expected node_key1 to be its own fused nodeú+expected node_key2 to be its own fused node)rï  r  rŽ   r±   rŠ   rR  rl  rf  )	rª   r«   rv  Ú	node_key1Ú	node_key2Ú
is_speeduprj  r~  r�   s	   &&    €€€rm   Úresolve_pending_fusionsÚ<Scheduler._try_fusion_pairs.<locals>.resolve_pending_fusions×  s   ø€ ð
 ×#Ñ# EÓ*¨oÔ=Ø×&Ñ& uÓ-°Õ@à!0×!4Ñ!4Ø×'Ñ'¨Ó.Ø#×'Ñ'¨×(;Ñ(;¸EÓ(BÓCó"�ð "Ò)Ü(Ð)LÓMÐMà'5×'FÑ'FÓ'HÑ$�	Ø+×7Ñ7�
à×#Ñ# I¨tÔ4Ø×#Ñ# I¨tÔ4à×&Ñ& yÓ1¸ÓBÜ(Ð)VÓWÐWØ×&Ñ& yÓ1¸ÓBÜ(Ð)VÓWÐWá!—|’| t×'DÑ'DÀU×'RÒ'RÚà×#Ñ# I¸+×Fñ/ Aro   N)rŠ   rª   r«   rŒ   z@expected (node1, node2) to not already be a seen template fusion)rï  rš  r	  rI  rl  r]  rŠ   r©   rŒ   rŽ   rS  r�  r  r‰   rf  )r�   r|  r~  r€  rj  rz
  rŠ  rª   r«   Ú
fusion_resrv  Útemplate_pw_nodes   f&f&f&      rm   Ú_try_fusion_pairsÚScheduler._try_fusion_pairsÏ  st  ú€ ÷	Gò 	Gô> 2‰LˆEñ $ EÔ1Ø×'Ñ'¨Ó.ˆEØ×'Ñ'¨Ó.ˆEô # 5×0Ò0Ø�N d×&@Ñ&@Ô@áà�}‰}ØÐ.÷ô à×3Ñ3°E×AÔAØ!×3Ñ3°EÓA�
Ø×)Ñ)Ò5Ü%2Ø$.×$:Ñ$:Ø#Ø#Ø)×0Ñ0ô	&�Nô *¨%×7Ò7Ø!˜>¨T×-GÑ-GÔGÜ"0Ø bó#ð ð ×2Ñ2×6Ñ6¸°~ÔFä+BÀ5Ó+PÐ(Ø+ÔHØFHÐ1ÑCØ-Õ?×FÑFÀ~ÕVà1?˜¨Ñ.Ø1?˜¨Ñ.âà!×-×-Ð-Úà×#Ñ# E°+×>ó] 2ro   c               ó    € V ^8„  d   QhRRRR/# )rf   rj  rc  r~  r  rk   )rl   s   "rm   rn   rÖ  &  s#   € ÷ Sñ Sà2ðSð @ñSro   c                	ó|  € \        4       pVP                  4        F�  pVP                  4       w  rVVP                  pWs9   g   \	        WV4      '       d   K:  VP                  V4       V P                  V4      VJd   \        R 4      hV P                  V4      VJd   \        R4      hV P                  WVWq4       KŸ  	  R# )r…  r†  N)	r   r	  r±   rŠ   rš  rS  rï  rŽ   rm  )r�   rj  r~  Úseen_pair_speedup_fnrv  r‡  rˆ  Úis_speedup_fns   &&&     rm   Ú_finish_pending_fusionsÚ!Scheduler._finish_pending_fusions&  s¶   € ô
 @J»|Ðð .×4Ñ4Ö6ˆNØ#1×#BÑ#BÓ#DÑ ˆIØ*×6Ñ6ˆMàÔ4Ô8JØ÷9ò 9ñ à ×$Ñ$ ]Ô3à×"Ñ" 9Ó-°YÓ>Ü$Ð%RÓSÐSØ×"Ñ" 9Ó-°YÓ>Ü$Ð%RÓSÐSà× Ñ  °}ÖRó! 7ro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úpossible_fusionsr}  Údeferred_prologue_fusionsrk   )rl   s   "rm   rn   rÖ  @  s   € ÷ $ñ $àKð$ð $Uñ$ro   c           
     	ó
  € \        V UUu. uF  w  r4\        W44      '       g   K  VNK  	  upp4      p. pV FB  w  r4\        W44      '       d   WE9   d   VP                  W434       K0  VP                  W434       KD  	  V# u uppi rr   )r   r“  r—  r  )r�   r—  r˜  Ún1Ún2Úepilogue_template_nodesÚnew_possible_fusionss   &&&    rm   Ú_handle_template_overlapÚ"Scheduler._handle_template_overlap@  s�   € ô #-Ù.ÔMÑ.‘F�BÔ2DÀR×2L�RˆRÑ.ÒMó#
Ðð  "ÐÛ&‰FˆBÜ! "×)Ò)¨bÔ.KØ)×0Ñ0°"°Ö:à$×+Ñ+¨R¨HÖ5ñ	 'ð $Ð#ùó Ns
   ‹A?
¥A?
c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r¼  r¬  rz
  r”   ri   rk   )rl   s   "rm   rn   rÖ  T  s-   € ÷ Cñ Cà&ðCð ðCð 
!ñ	Cro   c                óæ  € V P                  V4       \        V4      p\        P                  \        P
                  4      '       dC   \        P                  R4       V F'  p\        P                  RVP                  4       4       K)  	  / p/ p. pV P                  VV4      p\        P                  '       g   \        P                  '       d   V P                  W‡4      pV P                  VVVVV4       V P                  W54       V P                  Wc4       VP!                  4        V'       d'   V P                  VVVVV4       V P                  Wc4       \#        VR R7      pV P%                  V4      pV# )zÛ
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                ó   € V P                   # rr   r<  rÈ  s   &rm   rµ  Ú+Scheduler.fuse_nodes_once.<locals>.<lambda>•  s   € °!·+²+ro   r  )rw  r   rü  r«	  r¬	  rø
  rý  rò  Úget_possible_fusionsr.   r'	  r(	  rž  rŽ  r”  ry  r}	  r  r	  )	r�   r¼  rz
  rj  r¸   r~  r€  r˜  r—  s	   &&&      rm   r{
  ÚScheduler.fuse_nodes_onceT  sd  € ð 	×!Ñ! %Ô(Ü  Ó'ˆÜ×"Ñ"¤7§=¡=×1Ò1Ü×ÑÐ;Ô<Û#�Ü× Ñ  ¨×)=Ñ)=Ó)?Ö@ñ $ð ð 	ð
 OQÐð ð 	"ð  ×4Ñ4ØØó
Ðô
 ×#×#Ð#¤v×':×':Ð':Ø#×<Ñ<Ø ó Ðð 	×ÑØØØ!ØØô	
ð 	×$Ñ$ [ÔBà×/Ñ/Ð0EÔSØ×#Ñ#Ô%ç$Ø×"Ñ"Ø)ØØ%ØØ ôð ×3Ñ3Ð4IÔWä�{Ñ(=Ô>ˆØ×.Ñ.¨uÓ5ˆØˆro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   r¼  r¬  r¿   r¾   Úmax_distancerµ   ri   z!Iterator[list[BaseSchedulerNode]]rk   )rl   s   "rm   rn   rÖ  š  s0   € ÷ ñ Ø&ðà1ðð ðð 
+ñ	ro   c              #  ó  a"  € \        V V3R lR7      pV^ 8  d   V'       d   Vx € R# . pRpV FB  pSV,          pV'       d   Wu,
          V8”  d   Vx € . pV'       g   TpVP                  V4       KD  	  V'       d   Vx € R# R# 5i)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V ,          # rr   rk   )r–  r¿   s   &€rm   rµ  Ú-Scheduler._distance_windows.<locals>.<lambda>¤  s	   ø€ ¨k¸!®nro   r  NrZ  )r  r  )r¼  r¿   r§  ÚorderedÚwindowÚ
window_minr–  Úidxs   &f&     rm   Ú_distance_windowsÚScheduler._distance_windows™  s   øé € ô ˜Ô$<Ô=ˆØ˜!ÔßØ’ÙØ*,ˆØˆ
ÛˆAØ˜a•.ˆCß˜#Õ*¨\Ô9Ø’Ø�ßØ �
Ø�M‰M˜!Öñ ÷ ØŒLñ ùs   ƒ B¤:BÁBÁ>Bc               ó    € V ^8„  d   QhRRRR/# )rf   rí  ro  ri   rl  rk   )rl   s   "rm   rn   rÖ  ¶  s   € ÷ t.ñ t.°jð t.ÈDñ t.ro   c           
     ó  a aaa€ \        S P                  4      o^ o\        S P                  4      p\        P	                  RV4       \
        P                  ^ 8„  p\
        P                  p\
        P                  pVRJ;'       g    VRJp\
        P                  pRpRp	V'       d   S P                  4       p	V	P                  p
M(\        S P                  4       UUu/ uF  w  r¼WËbK	  	  p
ppV
P                  4       oR VVVV 3R llp\        \        P                  S 4      4       EF/  w  rïVe   SV8”  d    EM \        P!                  V4      p\        V4      ^8  d   K;  \"        P%                  VW§4       FÚ  pVe   SV8”  d    Kb  \        V4      ^8  g   S P'                  V4      '       g   K:  V'       d`   V	f   \)        R4      h\*        P,                  ! 4       pS P/                  VVV	VVR7       V\*        P,                  ! 4       V,
          ,          pK¡  \        V^ ,          P0                  VRV\
        P2                  R	7      pV! VVV4       KÜ  	  EK2  	  \5        SSP6                  R
7      S n        S P9                  S P                  4      S n        \        P;                  RSV\        S P                  4      4       V'       d   \        P;                  RV4       S P=                  S P                  4       R# u uppi )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.
z2ComboKernels: Generating with num_ck_nodes = %s...Nrö
  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   Ú
combo_noderF  Úacceptedr¬  Únumrµ   ri   rl  rk   )rl   s   "rm   rn   Ú9Scheduler.create_combo_kernel_nodes.<locals>.__annotate__Ô  s6   € ÷ !	Mñ !	MØ2ð!	Mà-ð!	Mð ð!	Mð ñ	!	Mro   c                óì  <€ S^,          o\         P                  R\        V4      V4       V F  pSP                  V4       K  	  SP	                  V 4       \        V	3R lV 4       4      S	V &   S
P                  P                  V P                  4        Uu/ uF  qDP                  4       V bK  	  up4       \        V
3R lV 4       4      p\        V4      ^8w  d   \        R\        V4       24      h\        \        V4      4      S
P                  V &   \        V
3R lV 4       4      p\        V4      ^8w  d   \        R\        V4       24      h\        \        V4      4      S
P                   V &   R# u upi )r�  z0ComboKernels: Combining %d nodes for %d-th groupc              3  ó6   <"  € T F  pSV,          x € K  	  R # 5irr   rk   )rv   r¸   Úoutput_orders   & €rm   rx   ÚPScheduler.create_combo_kernel_nodes.<locals>._register_accept.<locals>.<genexpr>ã  s   øé € Ð*SÉ(À$¨<¸×+=Ò+=Ë(ùs   ƒc              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5irr   ri	  rT
  s   & €rm   rx   r»  ç  s   øé € Ð)TÉ8Àa¨$×*>Ñ*>¸q×*AÐ*AË8ùr9  z(Combo kernel combines multiple streams: c              3  óZ   <"  € T F   pSP                   P                  V4      x € K"  	  R # 5irr   )r   r  rT
  s   & €rm   rx   r»  í  s(   øé € ð +Ù5=°�×$Ñ$×(Ñ(¨×+Ð+³Xùó   ƒ(+z6Combo kernel combines multiple CUDA MemPool contexts: N)rÙ  rö  r÷   r-  rS  rŸ  rs  r’  rá   rE  r   rŽ   rÈ   r²  r  r	  r   )r´  rµ  r¶  r¸   r–  Úaccepted_streamsÚaccepted_mempoolsr	  rj  rº  r�   s   &&&    €€€€rm   Ú_register_acceptÚ=Scheduler.create_combo_kernel_nodes.<locals>._register_acceptÔ  sd  ø€ ð �Q�JˆEÜ�H‰HØBÜ�H“Øôó
 !�Ø×"Ñ" 4Ö(ñ !à�O‰O˜JÔ'Ü'*Ô*SÉ(Ó*SÓ'SˆL˜Ñ$Ø×#Ñ#×*Ñ*Ø3=×3GÑ3GÔ3IÓJÑ3I¨a—‘“˜zÒ)Ñ3IÑJôô  *Ô)TÉ8Ó)TÓTÐÜÐ#Ó$¨Ô)Ü$Ø>¼tÐDTÓ?UÐ>VÐWóð ô /3´4Ð8HÓ3IÓ.JˆD×Ñ 
Ñ+Ü *ô +Ù5=ó+ó !Ðô Ð$Ó%¨Ô*Ü$ØLÜÐ-Ó.Ð/ð1óð ô 04´DÐ9JÓ4KÓ/LˆD× Ñ  Ó,ùò! Ks   ÂE1zexpected mem_ctx to be set)ri  Ú	on_acceptT©rf  ri  rn  r  zDGenerated ComboKernel nodes: %d ComboKernels, totally %d -> %d nodesz9ComboKernels memory-aware: %.3fs spent in peak simulation)r   r¼  r÷   rÙ  rý  r.   r‚  Ú$combo_kernel_peak_memory_increase_gbÚ&combo_kernel_peak_memory_pct_thresholdÚcombo_kernel_max_distanceÚ_init_peak_memory_contextr¿   r³  r	  rF  r­  rŽ  r;  r¯  Úspeedup_by_combo_kernelrŽ   ÚtimeÚperf_counterÚ_try_combo_with_halvingr<  rƒ  r  Ú__getitem__r	  rö  rw  )r�   rí  Únum_nodes_origri  Ú
abs_thr_gbÚpct_thrÚmemory_checkr§  Úmemory_sim_timeÚmem_ctxr¿   r°  r–  rÁ  r¶  rÖ
  Úmembersr¬  Ú	sim_startr´  r	  rj  rº  s   f&                  @@@rm   r0	  Ú#Scheduler.create_combo_kernel_nodes¶  s�  û€ ô ! §¡Ó,ˆØˆÜ˜TŸZ™Z›ˆÜ�	‰	ÐFÈÔUÜ ×7Ñ7¸!Ñ;ˆä×@Ñ@ˆ
Ü×?Ñ?ˆØ!¨Ð-×DÐD°ÀÐ1DˆÜ×7Ñ7ˆØˆØ37ˆßØ×4Ñ4Ó6ˆGØ!×-Ñ-‰Kä,5°d·j±jÔ,AÔBÑ,A¡D A˜1š4Ñ,AˆKÑBØ"×'Ñ'Ó)ˆ÷!	Mó !	MôF (Ü&×DÑDÀTÓJ÷
‰NˆCð Ò'¨E°LÔ,@ÚÜ0×AÑAÀ)ÓLˆGÜ�7‹|˜aÔÙä#×5Ñ5Ø˜ö�ð  Ò+°¸Ô0DÚÜ�v“; ”?¨$×*FÑ*FÀv×*NÒ*NÙßØ’Ü,Ð-IÓJÐJÜ $× 1Ò 1Ó 3�IØ×0Ñ0ØØØØ(7Ø"2ð 1ô ð $¤t×'8Ò'8Ó':¸YÕ'FÕF’Oä!;Ø˜q�	×+Ñ+ØØ26Ø(7Ü-3×-UÑ-Uô"�Jñ % Z°¸Ö=ô7ñ
ôL ˜K¨\×-EÑ-EÔFˆŒ
Ø×3Ñ3°D·J±JÓ?ˆŒ
Ü�‰ØRØØÜ�—
‘
‹Oô		
÷ Ü�H‰HØKØôð 	×!Ñ! $§*¡*Ö-ùós Cs   ÃK;c               ó   € V ^8„  d   QhRR/# )rf   ri   r¼   rk   )rl   s   "rm   rn   rÖ  ,  s   € ÷ (
ñ (
Ð+Cñ (
ro   c           	     ó   € ^RI HpHpHpHpHpHp \        \        P                  P                  P                  4       4      p\        \        P                  P                  4       4      pV! V P                  V4      p	V! V P                  V P                  4       V! V P                  V P                  V P                  V	4       V! V P                  W˜4      w  p
 pV! V
\!        V P                  4      4      w  rËV! V
\!        V P                  4      4      p\#        T\%        V P                  4       UUu/ uF  w  rïWþbK	  	  uppVVVR7      # u uppi )zzBuild the immutable baseline state the gate compares against:
original buffer lifetimes, original peak, and step indices.
)rî  Ú/assign_memory_planning_info_for_scheduler_nodesr
  r
  Ú+live_memory_before_steps_from_buf_info_listÚpeak_memory_from_buf_info_list)r½   r¿   rÀ   rÁ   rÅ   )r-	  rî  rÙ  r
  r
  rÚ  rÛ  r   rd   ré   rh  rb  r.	  r¼  r{  rs  r÷   r¼   r³  )r�   rî  rÙ  r
  r
  rÚ  rÛ  rh  r½   Úname_to_freeabler#
  r~  rÀ   rÅ   r®  r¸   s   &               rm   rÈ  Ú#Scheduler._init_peak_memory_context,  s  € ÷	
÷ 	
ô "¤!§'¡'×"6Ñ"6×";Ñ";Ó"=Ó>ˆÜ"¤1§7¡7×#;Ñ#;Ó#=Ó>ˆá1°$·*±*¸lÓKÐÙ9¸$¿*¹*Àd×FVÑFVÔWÙ7Ø�J‰JØ×#Ñ#Ø×ÑØô		
ñ 6Ø�J‰JÐ(ó
Ñˆ�q˜!ñ :Øœ3˜tŸz™z›?ó
Ñˆñ  KØœ3˜tŸz™z›?ó 
Ðô (Ø'Ü4=¸d¿j¹jÔ4IÔJÑ4I¡y s˜šÑ4IÒJØ'Ø&Ø!5ô
ð 	
ùãJs   Ä1E
c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   Úgroup_nodesr¬  rÓ  r¼   ri  r”   ri   z-tuple[ForeachKernelSchedulerNode | None, int]rk   )rl   s   "rm   rn   rÖ  V  s8   € ÷ D&ñ D&à,ðD&ð *ðD&ð ð	D&ð
 
7ñD&ro   c           	     ó  aaa € ^RI Hp \        V^ ,          P                  VRV\        P
                  R7      p\        4       pV F(  pVP                  VP                  P                  4       K*  	  \        VR7      Vn        VP                  o \        4       p\        P                  p	Rp
V F/  pVP                  V4       S V,          pWÉ8  d   Tp	WÊ8”  g   K-  Tp
K1  	  . oRpR V3R llp\        Wš^,           4       F:  pV P                   V,          pW¸9   d   V'       g   V! WYV4       RpK1  V! W¿V4       K<  	  \#        SR R	7       Uu. uF  pVP$                  NK  	  ppV P'                  V4      p\)        V4       UUu/ uF  w  rûW¹V,           bK  	  uppoSV,          pV F  pVSV&   K
  	  R
 VV 3R llpVP*                  V	,          pV! VV	V
VVP,                  VR7      pVP.                  p\1        VP2                  V4      pVV,
          p\        P4                  p\        P6                  pVe   \9        V4      R,          .M. pVe   VP;                  VV,          4       V'       g   \=        R4      hV\?        V4      8*  pV^ 8”  d   RV,          V,          MRpV'       g$   \@        PC                  R\E        V4      VV4       R# \@        PG                  R\E        V4      VV4       VVn        VV3# u upi u uppi )aÌ  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.
)Úestimate_region_peak_memoryTrÄ  )Úpred_buffersFc               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   r¸   r   r¶   rµ   r·   ri   rl  rk   )rl   s   "rm   rn   Ú<Scheduler._try_combo_with_memory_check.<locals>.__annotate__‘  s/   € ÷ 	Cñ 	CÐ-ð 	C°Cð 	CÀ3ð 	CÈ4ñ 	Cro   c                ó>   <€ SP                  \        WV 4      4       R # rr   )r  r´   )r¸   r¶   r·   Úlocal_entriess   &&&€rm   Ú	add_localÚ9Scheduler._try_combo_with_memory_check.<locals>.add_local‘  s   ø€ Ø× Ñ ¤¨S¸DÓ!AÖBro   c                ó2   € V P                   V P                  3# rr   )r¶   r·   )rf  s   &rm   rµ  Ú8Scheduler._try_combo_with_memory_check.<locals>.<lambda>ž  s   € ÀÇÁÈÏ
É
Ñ@Sro   r  c               ó    € V ^8„  d   QhRRRR/# r  rk   )rl   s   "rm   rn   rä  §  s   € ÷ 	%ñ 	%Ð+ð 	%°ñ 	%ro   c                ó6   <€ V S9   d
   SV ,          # SV ,          # rr   rk   )r¸   Únew_stepr¿   s   &€€rm   Ústep_ofÚ7Scheduler._try_combo_with_memory_check.<locals>.step_of§  s    ø€ Ø�xÔØ •~Ð%Ø˜tÕ$Ð$ro   )Úregion_startÚ
region_endrî  r½   Ú
cur_memoryzexpected limits to be truthyg      Y@rö
  zLComboKernels memory-aware: rejected %d nodes (peak delta %+d bytes = %.3f%%)zLComboKernels memory-aware: accepted %d nodes (peak delta %+d bytes = %.3f%%)rZ  i   @)Nr   )$r-	  rá  rF  r<  r.   rƒ  r   r’  r£  râ  rH   r¿   ÚsysÚmaxsizerS  r®  r¼  r  r¸   r	  r³  rÅ   r½   rÀ   rž  rÁ   rÅ  rÆ  r}  r  rŽ   rŸ  rÙ  rý  r÷   rö  )!r�   rß  rÓ  ri  rá  r´  Úcombo_pred_buffersÚmÚ	group_setrð  rñ  r–  r®  Úinserted_comborç  r°  rf  Úlocal_nodesÚ
combo_steprî  rò  Úregion_peakÚoriginal_peakÚnew_peakÚdeltarÏ  rÐ  ÚlimitsÚacceptÚpctræ  rí  r¿   s!   &&&&                          @@@rm   Ú_try_combo_with_memory_checkÚ&Scheduler._try_combo_with_memory_checkV  sî  ú€ õ, 	8ä/Ø˜�N×$Ñ$ØØ&*Ø+Ü!'×!IÑ!Iô
ˆ
ô (›\ÐÛˆAØ×%Ñ% a§j¡j×&=Ñ&=Ö>ñ ä7Ø+ô
ˆ
Ôð ×)Ñ)ˆô 4>³<ˆ	Ü—{‘{ˆØˆ
ÛˆAØ�M‰M˜!ÔØ˜a•.ˆCØÔ!Ø"�ØÖØ ’
ñ ð ,.ˆØˆ÷	Cð 	Cô �|°!¥^Ö4ˆAØ—
‘
˜1•ˆAØŒ~ß%Ù˜j¸Ô:Ø%)�NÙÙ�a˜AÖñ 5ô # =Ñ6SÕTó
ÙT�qˆA�FŒFÑTð 	ð 
ð ×4Ñ4°[ÓAˆä4=¸kÔ4JÔKÑ4J©D¨A�A aÕ'Ò'Ñ4JÒKˆØ˜jÕ)ˆ
ÛˆAØ$ˆH�Q‹Kñ ÷	%ñ 	%ð ×1Ñ1°,Õ?ˆ
á1ØØ%Ø!ØØ!×/Ñ/Ø!ô
ˆð  ×-Ñ-ˆÜ�w×+Ñ+¨[Ó9ˆØ˜=Õ(ˆÜ×@Ñ@ˆ
Ü×?Ñ?ˆØ4>Ò4J”%˜
Ó# wÕ/Ñ0ÐPRˆØÒØ�M‰M˜' MÕ1Ô2ßÜ Ð!?Ó@Ð@Øœ#˜f›+Ñ%ˆà1>ÀÔ1Bˆu�u�}˜}Ö,ÈˆßÜ�I‰Ið2ä�KÓ ØØôð ˆNä�‰ð.ä�ÓØØô	
ð  (ˆÔØ˜:Ð%Ð%ùò{
ùó
 Ls   ÅK7ÆK<c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )rf   r5  r¬  r¶  rµ   rÓ  r¼   ri  r”   rÃ  zJCallable[[ForeachKernelSchedulerNode, list[BaseSchedulerNode], int], None]ri   rl  rk   )rl   s   "rm   rn   rÖ  Ü  sF   € ÷ '$ñ '$à*ð'$ð ð'$ð *ð	'$ð ð'$ð
ð'$ð 
ñ'$ro   c               óþ  € VP                   pV.pV'       EdV   VP                  4       p\        V4      ^8  g   V P                  V4      '       g   KB  \        P                  WW44      w  ršV	e   V! W˜V4       Ki  V Uu. uF  q¶V,          NK  	  pp\        V4      \        V4      ríWÞ8X  d   K�  WÞ,           ^,          pV Uu. uF  q¶V,          V8:  g   K  VNK  	  ppV Uu. uF  q¶V,          V8”  g   K  VNK  	  pp^\        V4      u;8:  d   \        V4      8  d   M MVP                  V4       ^\        V4      u;8:  d   \        V4      8  g   EKE  M EKJ  VP                  V4       EK^  R# u upi u upi u upi )z[Try the full candidate; on reject, halve at the
baseline-index midpoint and try each half.
N)	r¿   rR  r÷   rÉ  r;  r  rŸ  rž  r  )r�   r5  r¶  rÓ  ri  rÃ  Ún2iÚstackÚsubsetr´  rú  r–  ÚidxsÚloÚhiÚmidÚearlyÚlates   &&&&$$            rm   rÌ  Ú!Scheduler._try_combo_with_halvingÜ  s>  € ð ×!Ñ!ˆà09¨{ˆßˆeØ—Y‘Y“[ˆFÜ�6‹{˜QŒ d×&BÑ&BÀ6×&JÒ&JÙä%.×%KÑ%KØ˜gó&Ñ"ˆJð Ò%Ù˜*¨cÔ2Ùá$*Ó+¡F˜q˜—F�F¡FˆDÐ+Ü˜“Y¤ D£	�ØŒxÙØ•7˜q•.ˆCÙ &Ó8¡˜1¨a­&°C©-—Q�Q¡ˆEÐ8Ù%Ó6™v˜!¨Q­°#©—A�A™vˆDÐ6Ø”C˜“IÖ+¤ F£×+Ø—‘˜TÔ"Ø”C˜“JÖ,¤ V£×,Ô,Ø—‘˜U×#ñ- ùò ,ùò
 9ùÚ6s   Á=E0Ã E5ÃE5Ã E:Ã4E:c               ó    € V ^8„  d   QhRRRR/# ©rf   r¼  r¬  ri   rl  rk   )rl   s   "rm   rn   rÖ    s   € ÷ ?ñ ?Ð*Að ?Àdñ ?ro   c                	óN   € V F  pVP                  V P                  4       K   	  R # rr   )rw  rs  )r�   r¼  r¸   s   && rm   rw  ÚScheduler.prune_redundant_deps  s    € ÛˆDØ×%Ñ% d×&=Ñ&=Ö>ó ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r¼  r¬  rz
  r”   ri   r}  rk   )rl   s   "rm   rn   rÖ  	  s(   € ÷ 6 ñ 6 à&ð6 ð ð6 ð 
;ñ	6 ro   c                ó0  a aa
a€ . o
\         \        \        \        3,          ,          ! 4       oR VV
VV 3R llp\        P                  ! \
        4      pV FJ  pS P                  V4      '       d   K  VP                  4        F  pWF,          P                  V4       K  	  KL  	  VP                  4        F  pV! V4       K  	  \        P                  '       dq   \        P                  ! \
        4      pV F1  p\        VRR4      p	V	'       g   K  W‰,          P                  V4       K3  	  VP                  4        F  pV! V4       K  	  S P                  S
4      o
S
P                  S P                  RR7       \         P#                  R\%        S
4      4       S
# )zN
Helper to find all legal fusion opportunities, sorted by self.score_fusion()
c               ó    € V ^8„  d   QhRRRR/# r  rk   )rl   s   "rm   rn   Ú4Scheduler.get_possible_fusions.<locals>.__annotate__  s   € ÷ 	@ñ 	@Ð#:ð 	@¸tñ 	@ro   c                óÒ  <€ \        V 4       FÖ  w  rV V^,           V^,           \        P                  ,             F¥  pW#3pVS9   d   K  SP                  V4       SP	                  W#S4      '       d   SP                  V4       KK  VP                  4       '       g   VP                  4       '       g   Ky  SP	                  W2S4      '       g   K“  SP                  W234       K§  	  KØ  	  R# rQ  )r³  r.   Ú)max_fusion_buffer_group_pairwise_attemptsrS  rI  r  rÏ  r×  )	r¼  Únode1_indexrª   r«   r  rz
  r—  rÃ  r�   s	   &    €€€€rm   Úcheck_all_pairsÚ7Scheduler.get_possible_fusions.<locals>.check_all_pairs  sÉ   ø€ Ü&/°Ö&6Ñ"�Ø"Ø !•O kØõ'ä×FÑFõ'Gó�Eð
 !˜.�CØ˜d”{Ù Ø—H‘H˜S”Mà—}‘} UÐ3C×DÒDØ(×/Ñ/°Ö4Ø×+Ñ+×-Ò-°×1AÑ1A×1CÔ1CÈÏÉØÐ&6÷Jô Jð )×/Ñ/°°Ö?ó!ó '7ro   rî   NT)r  Úreversezfound %d possible fusions)r   rø   r   rg  r   rÈ   Úunfusable_noder  r  r	  r.   Úaggressive_fusionr   Ú*get_possible_fusions_with_highest_priorityr  Úscore_fusion_keyrü  rý  r÷   )r�   r¼  rz
  r  Úbuffer_names_groupingr¸   rÿ   Únode_groupingÚgroup_groupingrî   r—  rÃ  s   f&f       @@rm   r¤  ÚScheduler.get_possible_fusions	  sY  û€ ð ÐÜœ%Ô 1Ô3DÐ DÕEÖFÓHˆ÷	@ó 	@ô( !,× 7Ò 7¼Ó =ÐÛˆDØ×"Ñ" 4×(Ò(ÙØ×-Ñ-Ö/�Ø%Õ*×1Ñ1°$Ö7ó 0ñ ð
 3×9Ñ9Ö;ˆMÙ˜MÖ*ñ <ô ×#×#Ð#Ü(×4Ò4´TÓ:ˆNÛ�Ü  g¨tÓ4�ß‘5Ø"Õ)×0Ñ0°Ö6ñ ð "0×!6Ñ!6Ö!8�Ù Ö.ñ "9ð  ×JÑJØó
Ðð 	×Ñ $×"7Ñ"7ÀÐÔFÜ×ÑÐ4´cÐ:JÓ6KÔLØÐro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rÖ  A  s$   € ÷ ,ñ ,Ø&ð,Ø/@ð,à	ñ,ro   c                óR  a aaaa€ \         \        ,          ! 4       oR VVVV V3R lloVP                  4       P                  P	                  4       VP                  4       P                  P	                  4       ,          oVP
                  P                  P	                  4       VP
                  P                  P	                  4       ,          S,
          o\        ;QJ d     VV 3R lS 4       F  '       g   K   RM	  RM! VV 3R lS 4       4      pV'       d   \        W4      ! R4       V# )zf
Finds whether there's a path from node1 to node2 (or vice-versa)
caused indirectly by other fusions.
c               ó    € V ^8„  d   QhRRRR/# rÖ   rk   )rl   s   "rm   rn   Ú8Scheduler.will_fusion_create_cycle.<locals>.__annotate__K  s   € ÷ 	ñ 	Ð.ð 	°4ñ 	ro   c                ó¶  <€ \        V \        4      '       dÂ   V S9  d»   SP                  V 4       V P                  4       P	                  S4      '       d   R # \        SV P                  ,          4      ;'       g_    \        ;QJ d1    VV3R lV P                  S,
           4       F  '       g   K   R# 	  R # ! VV3R lV P                  S,
           4       4      # R # )Fc              3  óV   <"  € T F  pS! SP                   V,          4      x € K   	  R # 5irr   rS
  ©rv   r–  Ú
found_pathr�   s   & €€rm   rx   ÚIScheduler.will_fusion_create_cycle.<locals>.found_path.<locals>.<genexpr>\  s,   øé € ð Há!D˜Añ # 4×#:Ñ#:¸1Õ#=×>Ð>Û!Dùó   ƒ&)T)rs   r  rS  r<  Úissubsetr”   r;  rB  )r¸   Úcombined_ancestorsÚcombined_namesr-  r�   Úvisiteds   &€€€€€rm   r-  Ú6Scheduler.will_fusion_create_cycle.<locals>.found_pathK  s¹   ø€ ä˜$Ô 2×3Ò3¸ÀGÔ8KØ—‘˜DÔ!Ø×+Ñ+Ó-×6Ñ6Ð7I×JÒJñ !ô   °·±Õ ?Ó@÷ ð ÇCÃCõ Hà!%§¡Ð2DÖ!DóHÇCÄCð ÂCð ÀCõ Hà!%§¡Ð2DÖ!DóHó Eð ñ ro   c              3  óV   <"  € T F  pS! SP                   V,          4      x € K   	  R # 5irr   rS
  r,  s   & €€rm   rx   Ú5Scheduler.will_fusion_create_cycle.<locals>.<genexpr>j  s&   øé € ÐWÑDV¸q‘J˜t×6Ñ6°qÕ9×:Ð:ÓDVùr/  TFzwill create cycle)r   r  r<  Ú_dictrb  r;  rB  rï  )r�   rª   r«   Úcycler1  r2  r-  r3  s   f&& @@@@rm   rl  Ú"Scheduler.will_fusion_create_cycleA  sÔ   ü€ ô Ô/Ö0Ó2ˆ÷	ô 	ð2 ×%Ñ%Ó'×-Ñ-×2Ñ2Ó4Ø×'Ñ'Ó)×/Ñ/×4Ñ4Ó6õ7ð 	ð
 �O‰O×!Ñ!×&Ñ&Ó(¨5¯?©?×+@Ñ+@×+EÑ+EÓ+GÕGØõÐ÷ “ÕWÑDVÓW——’ÕWÑDVÓWÓWˆßÜ�eÔ#Ð$7Ô8Øˆro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rÖ  o  s$   € ÷ 7ñ 7Ø&ð7Ø/@ð7à	ñ7ro   c                óÂ  a a€ ^RI Ho R V 3R llpV! V4      pV! V4      p\        V3R lV 4       4      p\        V3R lV 4       4      pVP                  V4      p^ p	V F  p
 V	\	        V
^,          4      ,          p	K  	  S P                  W4      p\        P                  P                  P                  V	^ V,          4      '       d   R# R#   \
         d      R# i ; i)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.
)Úbuffer_reuse_keyc               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r   ri   zlist[ir.Buffer]rk   )rl   s   "rm   rn   Ú?Scheduler.can_fusion_increase_peak_memory.<locals>.__annotate__†  s   € ÷ 	ñ 	Ø#ð	àñ	ro   c                óV  <€ . pV P                   P                   F‹  pSP                  P                  VP                  4      pV'       g   K2  \        VP                  4      ^8X  g   KN  VP                  P                  4       '       g   Kp  VP                  VP                  4       K�  	  V# r(  )
r  r  r{  r  rt   r÷   r?  r¸   Úhas_tensor_outputr  )r¸   r¾  rT  rÿ   r�   s   &   €rm   Ú_find_single_user_inputsÚKScheduler.can_fusion_increase_peak_memory.<locals>._find_single_user_inputs†  sw   ø€ ð ˆFØ×&Ñ&×,Ô,�Ø×&Ñ&×*Ñ*¨2¯7©7Ó3�ß‘3œ3˜sŸy™y›>¨QÖ.°3·8±8×3MÑ3M×3OÔ3OØ—M‘M #§(¡(Ö+ñ -ð ˆMro   c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5irr   rk   ©rv   rÿ   r<  s   & €rm   rx   Ú<Scheduler.can_fusion_increase_peak_memory.<locals>.<genexpr>”  ó   øé € Ð#SÁ]¸cÑ$4°S×$9Ð$9Ã]ùr1
  c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5irr   rk   rD  s   & €rm   rx   rE  •  rF  r1
  FT)rô  r<  r   Úintersectionrµ   r�  r÷  rd   ré   rê   Ústatically_known_gt)r�   rª   r«   rA  Úlhs_dep_nodesÚrhs_dep_nodesÚlhs_reuse_keysÚrhs_reuse_keysÚcommon_reuse_keysÚmemory_overheadr  Ú	bw_savingr<  s   f&&         @rm   Úcan_fusion_increase_peak_memoryÚ)Scheduler.can_fusion_increase_peak_memoryo  sÎ   ù€ õ* 	6÷	ð 	ñ 1°Ó7ˆÙ0°Ó7ˆä#Ô#SÁ]Ó#SÓSˆÜ#Ô#SÁ]Ó#SÓSˆà*×7Ñ7¸ÓGÐàˆÛ$ˆCðØ¤3 s¨1¥v£;Õ.’ñ %ð ×,Ñ,¨UÓ:ˆ	ô �7‰7×Ñ×/Ñ/°ÀÀiÅ×PÒPÙÙøô ô ãðús   Á%CÃCÃCc               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rª   r   r«   Ú	thresholdrµ   ri   r”   rk   )rl   s   "rm   rn   rÖ  ¨  s,   € ÷ .2ñ .2Ø&ð.2Ø/@ð.2ØMPð.2à	ñ.2ro   c                	óê  € \        VP                  4        Uu. uF  qDP                  4       NK  	  upVP                  4        Uu. uF  qDP                  4       NK  	  up,           4      p\        R  VP                  P                   4       4      p\        R VP                  P
                   4       4      pWv,          p\        4       p	VP                  P                   FB  p
V P                  V
P                  V4      '       g   K'  V	P                  V
P                  4       KD  	  \        R VP                  P
                   4       4      \        R VP                  P
                   4       4      ,          p\        R VP                  P                   4       4      \        R VP                  P                   4       4      ,          pW¸,
          pWÉ,
          pWÞ,          p\        V4      V8„  # u upi u upi )c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   ÚEScheduler.fusion_prevent_too_many_reads_and_writes.<locals>.<genexpr>¶  s   é € Ð&TÑ;S°C§x¦xÓ;Sùr	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   rW  ·  ó   é € Ð%RÑ:Q°3§h¦hÓ:Qùr	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   rW  Ä  s   é € ð $
Ù 7˜�HŽHÓ 7ùr	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   rW  Æ  rG  r	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   rW  É  s   é € ð %
Ù 8˜�HŽHÓ 8ùr	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   rW  Ë  s   é € ÐDÑ+C C—x–xÓ+Cùr	  )
r   rá   rE  r  rÖ  r  Ú$can_buffer_be_removed_through_fusionrt   rS  r÷   )r�   rª   r«   rT  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   &&&&            rm   Ú(fusion_prevent_too_many_reads_and_writesÚ2Scheduler.fusion_prevent_too_many_reads_and_writes¨  s¬  € ô &Ø).¯©Ô):Ó;Ñ): �]‰]Ž_Ñ):Ñ;Ø+0¯?©?Ô+<Ó=Ñ+< 4�}‰}ŽÑ+<Ñ=õ>ó
Ðô 'Ñ&T¸5×;LÑ;L×;SÒ;SÓ&TÓTÐÜ%Ñ%R¸%×:KÑ:K×:QÒ:QÓ%RÓRÐØ'7Õ'KÐ$ô :D»Ð%Ø×*Ñ*×1Ô1ˆIØ×8Ñ8Ø—‘Ð 0÷ô ð .×1Ñ1°)·.±.ÖAñ	 2ô $ñ $
Ø %× 1Ñ 1× 7Ò 7ó$
ó 
äÑC¨5×+<Ñ+<×+BÒ+BÓCÓCõDˆô
 %ñ %
Ø %× 1Ñ 1× 8Ò 8ó%
ó 
äÑD¨5×+<Ñ+<×+CÒ+CÓDÓDõEˆð
 &ÕDˆð (ÕGˆð )Õ8ÐäÐ$Ó%¨	Ñ1Ð1ùòM <ùÚ=s   ˜G+ÁG0
c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rÖ  Ø  s$   € ÷ $ñ $Ø&ð$Ø/@ð$à	ñ$ro   c                ó´   € \        \        VP                  VP                  ,
          4      \        VP                  VP                  ,
          4      4      pV^@8„  # )aÉ  
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¢  )r�   rª   r«   Úproximity_scores   &&& rm   Úare_long_distant_nodesÚ Scheduler.are_long_distant_nodesØ  sE   € ô* Ü�—‘ %§/¡/Õ1Ó2Ü�—‘ %§/¡/Õ1Ó2ó
ˆð  Ñ#Ð#ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rª   r   r«   Úcommon_buf_namesz!tuple[str, ...] | OrderedSet[str]ri   r   rk   )rl   s   "rm   rn   rÖ  ó  s2   € ÷ <ñ <à ð<ð !ð<ð <ð	<ð
 
ñ<ro   c                óB  € / pVP                   P                  4        Uu/ uF  qUP                  VbK  	  ppVP                   P                  4        Uu/ uF  qUP                  VbK  	  ppV EFœ  p\        P                  P                  V4      p	Wh,          p
Wx,          p\        V
\        4      '       d   \        V\        4      '       g   R\        V
4       R\        V4       2WH&   K}  V
P                  4       VP                  4       8w  d)   RV
P                  4        RVP                  4        2WH&   KÈ  \        V
P                  4      \        VP                  4      8w  d   RWH&   Kû  V
P                  4       pVP                  4       pWÍ8w  d   RV RV 2WH&   EK.  V
P                  4       VP                  4       8X  d   RV
 RV 2WH&   EK^  Rp\        V	\        P                  4      '       g   RV	P                    2pR	V
 RV R
V 2WH&   EKŸ  	  \#        V4      # u upi u upi )ze
Try to decide reasons why fusion fail due to no shared memory even though
there are common buffers.
znot MemoryDep: rç   zdifferent numel: Ú	broadcastzdifferent offset: zMismatch loop orders: rß  zLayout: zUnknown reason: z. )r  r
  rt   rd   ré   rW  rs   r:   rÐ   r#  rb   r  Ú
get_offsetÚnormalize_with_stride_orderr1   r[  r\  r   )r�   rª   r«   rq  Úreasonsrw   Únode1_name2depÚnode2_name2depr®  rÿ   Úlhs_depÚrhs_depÚlhs_offÚrhs_offÚ
layout_strs   &&&&           rm   Údecide_fusion_fail_reasonÚ#Scheduler.decide_fusion_fail_reasonó  s  € ð ˆØ38×3DÑ3D×3UÑ3UÔ3WÓXÑ3W¨CŸ(™( Cš-Ñ3WˆÐXØ38×3DÑ3D×3UÑ3UÔ3WÓXÑ3W¨CŸ(™( Cš-Ñ3WˆÐXä(ˆHÜ—'‘'×$Ñ$ XÓ.ˆCØ$Õ.ˆGØ$Õ.ˆGä˜g¤y×1Ò1¼ÀGÌY×9WÒ9Wà%¤d¨7£m _°F¼4À»=¸/ÐJð Ñ!ñ à× Ñ Ó" g×&7Ñ&7Ó&9Ô9à'¨×(9Ñ(9Ó(;Ð'<¸FÀ7×CTÑCTÓCVÐBWÐXð Ñ!ñ ô ˜WŸ\™\Ó*¬m¸G¿L¹LÓ.IÔIØ$/�Ñ!Ùà×(Ñ(Ó*ˆGØ×(Ñ(Ó*ˆGØÔ!ð '9¸¸	ÀÈÀyÐ$Q�Ñ!Úð ×3Ñ3Ó5Ø×6Ñ6Ó8ô9ð '=¸W¸IÀVÈGÈ9Ð$U�Ñ!Úð ˆJÜ˜c¤2×#5Ñ#5×6Ò6Ø'¨¯
©
 |Ð4�
à" 7 )¨6°'°¸"¸Z¸LÐIð ÔñU )ô\ �7‹|Ðùòc YùÚXs   ŸHÁHc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rf   Úproducer_writer:   Úconsumer_readÚconsumer_writerO  rÚ   Ú	read_exprr”  ri   r”   rk   )rl   s   "rm   rn   rÖ  1  sF   € ÷ #
ñ #
à!ð#
ð !ð#
ð "ð	#
ð
  ð#
ð ð#
ð 
ñ#
ro   c                	ó6  € VP                  4       '       g   VP                  VP                  8w  d   R # \        VP                  4      p\        P                  P
                  P                  \        VP                  4      V4      '       dK   \        P                  P
                  P                  \        VP                  ^ ,          4      V4      '       g   R # \        VP                  ^ ,          4      V38X  d   R # VP                  pVe%   VP                  4       P                  4       '       g   R # VP                  ^ ,          pVP                  ^ ,          p	\        V4      \        V	4      8w  d   R # V P                  V\        V4      \        V	4      V4      RJ# )FN)rÛ   r  rb   rd   ré   rê   rí   rX  rø   r\  rg  Úis_contiguousÚvarsr¡  r÷   Ú_get_flattened_read_inverse)
r�   r�  r‚  rƒ  rO  r„  Ú	flat_sizer  r"  Ú
iter_sizess
   &&&&&&    rm   Ú)_can_reindex_consumer_for_index_inversionÚ3Scheduler._can_reindex_consumer_for_index_inversion1  s=  € ð × Ñ ×"Ò" m×&8Ñ&8¸N×<OÑ<OÔ&OÙä! .×"5Ñ"5Ó6ˆ	Ü�w‰w×Ñ×7Ñ7Ü˜-×,Ñ,Ó-¨y÷
ò 
ä—‘×!Ñ!×9Ñ9Ü˜(Ÿ/™/¨!Õ,Ó-¨y÷
ò 
ñ Ü�—‘ Õ#Ó$¨¨Ô4Ùà�~‰~ˆØŠ<˜~×7Ñ7Ó9×GÑG×IÒIÙà—I‘I˜a•Lˆ	Ø—Z‘Z •]ˆ
Üˆy‹>œS ›_Ô,Ùð ×,Ñ,Øœ5 Ó+¬U°:Ó->À	óð ðð	
ro   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rf   r„  r”  r"  ztuple[sympy.Symbol, ...]rŠ  r—  r‰  ri   z&tuple[sympy.Symbol, sympy.Expr] | Nonerk   )rl   s   "rm   rn   rÖ  V  s<   € ÷ !ñ !àð!ð ,ð!ð +ð	!ð
 ð!ð 
0ñ!ro   c                	óø   € \         P                  P                  P                  V^ 4      '       d   R# \        p\        V\        \        V\        WS4      4      4      4      pV P                  WeV4      pVf   R# WW3# r/  )
rd   ré   rê   rí   Ú_FLATTENED_READ_VARrc   rö  r÷  rS   Ú_get_indexing_inverse)r�   r„  r"  rŠ  r‰  Úflat_varrƒ   Úinverses   &&&&&   rm   rˆ  Ú%Scheduler._get_flattened_read_inverseV  sq   € ô �7‰7×Ñ×3Ñ3°I¸q×AÒAÙô 'ˆÜ#ØÜ”�Y¤°Ó EÓFÓGó
ˆð
 ×,Ñ,¨^ÀyÓQˆØŠ?ÙØÐ Ð ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   r„  r”  Ú	index_varzsympy.SymbolÚ
index_sizeri   úsympy.Expr | Nonerk   )rl   s   "rm   rn   rÖ  m  s8   € ÷ Eñ EàðEð  ðEð ð	Eð
 
ñEro   c                	óþ   € \        W\        /4      p\        P                  P                  P                  \        P                  ! V4      \        V/4      pV P                  WC4      pVf   R # \        V\        V/4      # rr   )	rc   r�  rd   ré   rê   Úsimplify_with_rangesr@  ÚexpandÚ_get_canonical_indexing_inverse)r�   r„  r•  r–  Úcanonical_readr’  s   &&&&  rm   r�  ÚScheduler._get_indexing_inversem  so   € ô $ IÔ;NÐ/OÓPˆÜŸ™×)Ñ)×>Ñ>Ü�LŠL˜Ó(Ô+>À
Ð*Kó
ˆð ×6Ñ6°~ÓRˆØŠ?ÙÜ˜'Ô$7¸Ð#CÓDÐDro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r„  r”  r–  ri   r—  rk   )rl   s   "rm   rn   rÖ    s)   € ÷ Tñ TØ#ðTØ1;ðTà	ñTro   c                	ó*   € ^ RI Hp V! V\        V4      # )r   )Úgenerate_inverse_formula)Ú$torch._inductor.invert_expr_analysisr   r�  )r�   r„  r–  r   s   &&& rm   r›  Ú)Scheduler._get_canonical_indexing_inverse~  s   € õ 	Rá'¨	Ô3FÈ
ÓSÐSro   c               ó$   € V ^8„  d   QhRRRRRR/# r&  rk   )rl   s   "rm   rn   rÖ  †  s-   € ÷ Yñ Yà ðYð !ðYð 
ñ	Yro   c                ó(
  € \         P                  '       g   R# \        ;QJ d    R W3 4       F  '       g   K   RM	  RM! R W3 4       4      '       d   R# \        V\        4      '       g   R# \        VP
                  \        P                  4      '       g   R# VP                  pVf   R# VP                  P                  4       pVP                  P                  4       pWE,          pV'       g   R# \        R VP                   4       4      pWt,
          '       d   R# \        V4      ^8”  d   R# \        VP                  P                  4      ^8w  g%   \        VP                  P                  4      ^8w  d   R# \!        \#        VP                  P                  4      4      p\!        \#        VP                  P                  4      4      p	\        V\$        4      '       d   \        V	\$        4      '       g   R# VP                  P                   U
u. uF!  qªP&                  VP&                  8X  g   K  V
NK#  	  pp
\        V4      ^8w  d   R# V^ ,          p\        V\$        4      '       g   R# \        VP(                  4      ^8w  g   VP*                  '       d   R# \        VP-                  4       4      p\        V4      ^8w  d   R# \!        \#        V4      4      pV P/                  WÈW’V4      pV'       d7   VP1                  \3        VP4                  4      .4       V P7                  W4      # V	P9                  4       '       g   R# VP;                  4       pVP<                  V	P<                  8w  d   VP4                  V	P4                  8w  d   R# VP4                  V	P4                  8w  g   \        VP>                  4      ^8w  d   R# RVP(                  9   d   RVP(                  9   g   \A        R4      hWãP(                  R,          8X  d   RpRpM&WãP(                  R,          8w  d   \A        R4      hRpRpVPB                  ^ ,          p\        V4      ^8w  d   R# V PE                  VV^ ,          VP4                  ^ ,          4      pVf   R# VPG                  VVP(                  V,          VV/4       V PI                  W4      p\        V\J        4      '       g   \A        R	4      hV^ 8X  d   V PM                  W4      p\N        PQ                  R
V4       V# u up
i )aÿ  
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
c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   ©rº  r•  s   & rm   rx   ÚAScheduler.shared_data_after_inverting_indexing.<locals>.<genexpr>ž  ó   é € Ð2¡>˜a�x‰x�zˆz£>ùr‡  TFc              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   r§  ±  s   é € ð .
Ù 8˜�HŽHÓ 8ùr	  Úindex0Úindex1z2expected index0 and index1 in node2 indexing_exprsz-expected read_expr to match node2 index1 exprzexpected score to be an intz!Shared memory after inversion: %drZ  ))r.   r|
  rB  rs   rÚ   r¸   r1   r   r\  r  Úbuffer_namesr   r®  r÷   r  rÖ  r²  r  r:   rt   ra  Ú	subblocksÚget_read_exprsr‹  r©  rb   r  Ú$shared_data_after_inverting_indexingr†  rg  r  Ú	var_namesrŽ   r‡  r�  rš  r÷  rµ   Ú*_score_fusion_memory_by_fusable_read_writerü  rö  )r�   rª   r«   r  Únode1_buffer_namesÚnode2_buffer_namesÚcommon_buffer_namesÚnode2_unmet_dependenciesÚ
node2_readÚnode2_writerw   Úmatching_node1_writesÚnode1_writeÚnode2_read_exprsr„  Úcan_reindexÚread_expr_indexÚwrite_expr_indexrï  Úinverse_formulaÚscores   &&&                  rm   r¯  Ú.Scheduler.shared_data_after_inverting_indexing†  sb  € ô* ×4×4Ð4ØˆIç‹3Ñ2 E¡>Ó2�3�3Š3Ñ2 E¡>Ó2×2Ò2ØˆIÜ˜%¤×/Ò/ØˆIÜ˜%Ÿ*™*¤b×&7Ñ&7×8Ò8ØˆIØ�{‰{ˆØŠ<ØˆIð #×.Ñ.×;Ñ;Ó=ÐØ"×.Ñ.×;Ñ;Ó=ÐØ0ÕEÐç"ØˆIô $.ñ .
Ø %× 8Ò 8ó.
ó $
Ð ð $×8Ô8ØˆIäÐ'Ó(¨1Ô,ØˆIô ˆu× Ñ ×&Ñ&Ó'¨1Ô,´°E×4EÑ4E×4LÑ4LÓ0MÐQRÔ0RØˆIäœ$˜u×0Ñ0×6Ñ6Ó7Ó8ˆ
Üœ4 × 1Ñ 1× 8Ñ 8Ó9Ó:ˆä˜*¤i×0Ò0¼
Øœ÷9
ò 9
ð ˆIð !×,Ñ,×3Ò3ó!
Ù3�C·x±xÀ:Ç?Á?Ñ7R�CˆCÑ3ð 	ð !
ô Ð$Ó%¨Ô*ØˆIà+¨AÕ.ˆä˜+¤y×1Ò1ØˆIô ˆt×"Ñ"Ó# qÔ(¨D¯N¯N¨NØˆIÜ% d×&9Ñ&9Ó&;Ó<ÐÜÐÓ  AÔ%ØˆIÜœÐ.Ó/Ó0ˆ	ð ×DÑDØ [¸ó
ˆ÷ Ø×'Ñ'¬°{×7GÑ7GÓ)HÐ(IÔJà×<Ñ<¸UÓJÐJà×(Ñ(×*Ò*ØˆIð "×+Ñ+Ó-ˆð ×Ñ ×!2Ñ!2Ô2Ø× Ñ  K×$4Ñ$4Ô4àˆIà�?‰?˜k×.Ñ.Ô.´#°j×6JÑ6JÓ2KÈqÔ2PØˆIà˜D×/Ñ/Ô/°HÀ×@SÑ@SÔ4SÜ Ð!UÓVÐVð ×+Ñ+¨HÕ5Ô5Ø&ˆOØ'Ñà×/Ñ/°Õ9Ô9Ü$Ð%TÓUÐUØ&ˆOØ'Ðà—Y‘Y˜q•\ˆ
Üˆz‹?˜aÔØˆIà×4Ñ4Ø�z !•} j§o¡o°aÕ&8ó
ˆð
 Ò"ØˆIð
 	×"Ñ"à ×!4Ñ!4Ð5EÕ!FØ  /ðô	
ð ×(Ñ(¨Ó6ˆÜ˜%¤×%Ò%Ü Ð!>Ó?Ð?Ø�AŒ:Ø×CÑCÀEÓQˆEä�‰Ð;¸UÔCØˆùòs!
s   ÈTÈ2Tc               ó$   € V ^8„  d   QhRRRRRR/# r&  rk   )rl   s   "rm   rn   rÖ  !  s$   € ÷ 76ñ 76Ø&ð76Ø/@ð76à	ñ76ro   c                ó   € \         ;QJ d    R W3 4       F  '       g   K   RM	  RM! R W3 4       4      '       d   R# VP                  4       '       g   VP                  4       '       d   R# VP                  P                  4       VP                  P                  4       ,          pV'       g   R# \        P
                  '       d   V P                  W4      pV^ 8¼  d   V# \        P                  '       d   V P                  W4      '       g   R# \        P
                  '       d   V P                  W4      pV^ 8¼  d   V# V P                  W4      # )as  
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  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r¦  r•  s   & rm   rx   Ú>Scheduler.shared_data_after_reordering_loop.<locals>.<genexpr>1  r¨  r‡  TFrZ  )
rB  rÏ  r  r¬  r.   rl  Ú!_try_reorder_loops_for_candidatesÚloop_reindexing_after_fusionÚ$_try_reindex_pointwise_for_reductionr÷  )r�   rª   r«   r´  r¿  s   &&&  rm   Ú!shared_data_after_reordering_loopÚ+Scheduler.shared_data_after_reordering_loop!  s  € ÷  ‹3Ñ2 E¡>Ó2�3�3Š3Ñ2 E¡>Ó2×2Ò2ØˆIð
 ×Ñ×Ò %×"3Ñ"3×"5Ò"5ØˆIð ×Ñ×*Ñ*Ó,¨u×/@Ñ/@×/MÑ/MÓ/OÕOð 	÷ #ØˆIä×,×,Ð,Ø×:Ñ:¸5ÓHˆEØ˜ŒzØ�ô ×3×3Ð3Ø×<Ñ<¸U×JÒJàˆIä×,×,Ð,Ø×:Ñ:¸5ÓHˆEØ˜ŒzØ�à×'Ñ'¨Ó5Ð5ro   c               ó$   € V ^8„  d   QhRRRRRR/# r&  rk   )rl   s   "rm   rn   rÖ  Z  s2   € ÷ ]Kñ ]Kà ð]Kð !ð]Kð 
ñ	]Kro   c           	     óÞ  aa€ VP                   P                  4       VP                   P                  4       ,          pVP                   P                   Uu/ uF  qDP                  VbK  	  ppVP                   P                   Uu/ uF  qDP                  VbK  	  ppVP                   P                   Uu/ uF  qDP                  VbK  	  ppVP                   P                   Uu/ uF  qDP                  VbK  	  pp. p	V EF  p
VP                  V
4      ;'       g	    WZ,          pVP                  V
4      ;'       g	    Wz,          pW¦9   ;'       d    W§9   ;'       g    W¨9   ;'       d    W¥9   pVP                  4       VP                  4       8X  dO   V	P                  V\        P                  P                  P                  VP                  4       ^ R7      VV34       Kß  V'       g   Ké  VP                  V
4      ;'       g    VP                  V
4      pVP                  V
4      ;'       g    VP                  V
4      p\        V\        4      '       g   EKV  \        V\        4      '       g   EKo  \        P                  P                  oVP                  4       P                   pVP                  4       P                   o\"        ;QJ d     VV3R lV 4       F  '       d   K   RM	  RM! VV3R lV 4       4      '       d   EK  Ru # 	  \%        V	4      ^ 8X  d   R# \'        V	\(        P*                  ! ^ ^4      R7      w  ppr¼\        V\        4      '       d   \        V\        4      '       g   R# VP,                  VP,                  8w  d7   VP                  4       VP                  4       8X  d   V P/                  V4      # R# RpVP1                  4       '       g   VP3                  W¼4      pM[VP1                  4       '       g   VP3                  WË4      pM3\4        P7                  RVP9                  4       VP9                  4       4       V'       d   V P;                  W4      # R# u upi u upi u upi u upi )z~
Find common buffers with matching normalized stride order but different
loop orders, and try to reorder loops to align them.
r   c              3  óž   <a"  € T FA  o\         ;QJ d     VV3R  lS 4       F  '       g   K   RM	  RM! VV3R  lS 4       4      x € KC  	  R# 5i)c              3  óH   <"  € T F  pSP                  SV4      x € K  	  R # 5irr   )rí   )rv   ÚrsÚsvÚwss   & €€rm   rx   ÚHScheduler._try_reorder_loops_for_candidates.<locals>.<genexpr>.<genexpr>�  s!   øé € ÐQÉÀ2˜B×6Ñ6°r¸2×>Ð>Ëùr  TFNrÚ
  )rv   rÐ  Úr_sizesrÏ  s   &@€€rm   rx   Ú>Scheduler._try_reorder_loops_for_candidates.<locals>.<genexpr>�  s6   ùé € ð á")˜B÷ ›ÕQÉÓQŸŸšÕQÉÓQ×QÐQÛ")ùs   „A”A¬!AFTr  z?Don't reorder loops since both nodes are reductions: %s v.s. %srZ  )r  r¬  r  rt   rÖ  r  ru  r  rd   ré   rê   r"  r#  rs   r:   rg  r  rà   r÷   rž  rM  rN  rË  Údep_size_hintrÛ   rÿ  rÎ  rý  rE  r÷  )r�   rª   r«   r´  rw   Únode1_readsÚnode1_writesÚnode2_readsÚnode2_writesÚ
candidatesr_  ry  rz  Úis_write_readÚwr]  Úw_sizesÚ_is_wrÚ_numelÚ	reorderedrÒ  rÏ  s   &&&                 @@rm   rÅ  Ú+Scheduler._try_reorder_loops_for_candidatesZ  s´  ù€ ð ×Ñ×*Ñ*Ó,¨u×/@Ñ/@×/MÑ/MÓ/OÕOð 	ð 16×0AÑ0A×0GÒ0GÓHÑ0G¨—x‘x ’}Ñ0GˆÐHØ16×1BÑ1B×1IÒ1IÓJÑ1I¨#Ÿ™ #šÑ1IˆÐJØ05×0AÑ0A×0GÒ0GÓHÑ0G¨—x‘x ’}Ñ0GˆÐHØ16×1BÑ1B×1IÒ1IÓJÑ1I¨#Ÿ™ #šÑ1IˆÐJàˆ
Ü.ˆKØ"×&Ñ& {Ó3×OÐO°{Õ7OˆGØ"×&Ñ& {Ó3×OÐO°{Õ7OˆGð Ñ+×JÐJ°Ñ0J÷Nð NàÑ-×LÐL°+Ñ2Lð ð
 ×3Ñ3Ó5Ø×6Ñ6Ó8ô9ð ×!Ñ!à%ÜŸ™×(Ñ(×:Ñ:Ø#×-Ñ-Ó/¸!ð ;ó ð  Øðö	÷ ‘ð !×$Ñ$ [Ó1×RÐR°\×5EÑ5EÀkÓ5R�Ø—O‘O KÓ0×PÐP°K·O±OÀKÓ4P�Ü˜a¤×+Õ+´
¸1¼i×0HÕ0HÜŸ™×)Ñ)�BØŸk™k›m×0Ñ0�GØŸk™k›m×0Ñ0�Gß›3õ á")óŸ3Ÿ3š3õ á")ó÷ õ ð  "š	ñO /ôR ˆz‹?˜aÔØˆIô ,/ØœH×/Ò/°°1Ó5ô,
Ñ(ˆ�˜ô ˜'¤9×-Ò-´ZÀÌ×5SÒ5SØˆIà×Ñ˜w×/Ñ/Ô/ð
 × Ñ Ó" g×&7Ñ&7Ó&9Ô9Ø×)Ñ)¨'Ó2Ð2ØˆIàˆ	à×!Ñ!×#Ò#Ø×7Ñ7¸ÓI‰IØ×#Ñ#×%Ò%Ø×7Ñ7¸ÓI‰Iä×#Ñ#ØQØ—‘Ó Ø—‘Ó ô÷ :Cˆt×'Ñ'¨Ó5ÐJÈÐJùòc IùÚJùÚHùÚJs   ÁQÂQ Â2Q%Ã!Q*c               ó    € V ^8„  d   QhRRRR/# )rf   r¼  r½  ri   zMemoryCoalescing | Nonerk   )rl   s   "rm   rn   rÖ  ¹  s   € ÷ 1ñ 1Ø0ð1à	 ñ1ro   c                óþ  € ^RI Hp ^RIHp V'       d{   \        P
                  P                  '       d[   \        P
                  P                  '       g;   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# V UUu. uF  qDP                  4        F  qUNK  	  K  	  pppV'       d;   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       g   R# \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# \        ;QJ d    . R	 V 4       F  NK  	  5M! R	 V 4       4      pV P                  P                  V\        4      pV\        Jd   V# V! V4      p	V	f   RV P                  V&   R# \        VR
 R7      p
V
P                   w  pw  rÍVP#                  WlWÙ4      P$                  pWàP                  V&   V# u uppi )zÑMemory accessed by these nodes codegened as one kernel, or None.

None means the coalescing cost is unknown - either the analysis does not
apply, or the tiling was forced or fell back and so was never scored.
rÝ  )Ú#analyze_memory_coalescing_for_nodesc              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )r×  r…  s   & rm   rx   Ú4Scheduler._selected_tiling_memory.<locals>.<genexpr>È  s   é € Ð7±¨—?‘?×$Ð$³ùr‡  TFNc              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5irr   ©rs   rÚ   r…  s   & rm   rx   rå  Í  s   é € Ð TÉVÀT¤¨D´-×!@Ð!@ËVùrè  c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r¦  r…  s   & rm   rx   rå  Ð  s   é € Ð0© �{‰{�}ˆ}«ùr‡  c              3  ó<   "  € T F  qVP                   3x € K  	  R # 5irr   )r]  ©rv   r£  s   & rm   rx   rå  Ú  s   é € ÐD¹V°r˜r×1Ñ1Õ2»Vùs   ‚c                ó4   € \        V P                  4       4      # rr   rh  râ   s   &rm   rµ  Ú3Scheduler._selected_tiling_memory.<locals>.<lambda>ä  s   € ´°T×5FÑ5FÓ5HÔ1Iro   r  )rÓ  rÞ  r*  rã  r.   rÌ   rá  Úprefer_nd_tilingrB  rá   rà   rø   r	  r  Ú_TILING_MEMORY_MISSrž  rî   Úselect_tiling_with_memoryr-	  )r�   r¼  rÞ  rã  r¸   rÞ   r  r‘  ÚcachedÚanalysisr¥  r~  r-  rð   r  s   &&             rm   Ú_selected_tiling_memoryÚ!Scheduler._selected_tiling_memory¹  s~  € õ 	1ÝE÷ Ü—=‘=×9×9Ð9Ü�}‰}×-×-Ð-ß‹sÑ7±Ó7�s�sŠsÑ7±Ó7×7Ò7áá&+ÔL¡e˜d¿>¹>Ö;K°’'Ñ;K‘'¡eˆÑLßŸS›SÑ TÉVÓ TŸSŸSšSÑ TÉVÓ T×TÒTÙç‹3Ñ0©Ó0�3�3Š3Ñ0©Ó0×0Ò0Ù÷ ”EÑD¹VÓD—E‘EÑD¹VÓDÓDˆ	Ø×*Ñ*×.Ñ.¨yÔ:MÓNˆØÔ,Ó,ØˆMá6°vÓ>ˆØÒØ37ˆD×%Ñ% iÑ0Ùä˜Ñ$IÔJˆ	Ø&Ÿ_™_Ñˆ‰?ˆEØ×9Ñ9Ø˜6ó
ç
‰&ð 	ð 06×!Ñ! )Ñ,Øˆùó= Ms   Â G9c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rª   r   r«   Úunfused_memoryz#tuple[MemoryCoalescing, ...] | Noneri   r”   rk   )rl   s   "rm   rn   rÖ  ì  s2   € ÷ 1ñ 1à ð1ð !ð1ð <ð	1ð
 
ñ1ro   c           	     óæ  € Vf   R# V P                  W.4      pVf   R# \        R V 4       4      pVP                  4       p \        4       p\        P
                  ! V4      ;'       d    V^ 8„  pV'       d!   WW,          \        ,           p	Wg,          p
W©8„  pMWe8„  pV'       d:   \        P                  RVP                  4       VP                  4       VVVV4       R# R#   \         d    ^ pRp L€i ; i)z¹Did reindexing make the fused kernel's memory access worse?

`unfused_memory` is measured before reindexing, so this compares the two
original kernels against the single reindexed one.
Fc              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   )Úweighted_cost)rv   r-	  s   & rm   rx   ÚDScheduler._reindexing_regresses_memory_coalescing.<locals>.<genexpr>ÿ  s   é € ÐOÁ°f×/Ñ/×1Ð1Ãùr‡  zVrejecting reindex of %s and %s: unfused memory %s (cost=%d), fused memory %s (cost=%d)T)rò  r5  rø  rX   r4  ÚisfiniterØ  Ú%_REINDEXING_FUSION_LAUNCH_OVERHEAD_NSrÎ  rý  rE  )r�   rª   r«   rõ  Úfused_memoryÚunfused_costÚ
fused_costÚ	dram_gbpsÚvalid_dram_gbpsÚunfused_time_nsÚfused_time_nsÚ	regressess   &&&&        rm   Ú'_reindexing_regresses_memory_coalescingÚ1Scheduler._reindexing_regresses_memory_coalescingì  sú   € ð Ò!ÙØ×3Ñ3°U°NÓCˆØÒÙô ÑOÁÓOÓOˆØ!×/Ñ/Ó1ˆ
ð	$Ü)Ó+ˆIÜ"Ÿmšm¨IÓ6×HÐH¸9Àq¹=ˆO÷ ð Õ(Ô+PÕPð ð 'Õ2ˆMØ%Ñ7‰Ià"Ñ1ˆIßÜ×#Ñ#ð,à—‘Ó Ø—‘Ó ØØØØô	ñ Ùøô3 ô 	$ØˆIØ#ŠOð	$ús   Á&C Á)C ÃC0Ã/C0c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rÖ    s-   € ÷ pñ pà ðpð !ðpð 
ñ	pro   c                ó
  a aaaaaaa€ ^RI Ho VP                  4       '       g   VP                  4       '       d   R# VP                  4       '       g   VP                  4       '       d   R# VP	                  4       '       d   VP	                  4       '       g   YrCM1VP	                  4       '       d   VP	                  4       '       g   Y!rCMR# VP
                  w  rV\        P                  ! \        P                  V^ ,          4      o\        P                  ! \        P                  V^,          4      oSS,          o\        ;QJ d*    R VP                  4        4       F  '       d   K   RM	  RM! R VP                  4        4       4      '       g   R# \        P                  ! \        \        ,          VP                  4       4      p\        ;QJ d    V3R lV 4       F  '       d   K   RM	  RM! V3R lV 4       4      '       g   R# \        ;QJ d!    VVV3R lV 4       F  '       d   K   RM	  RM! VVV3R lV 4       4      '       g   R# SS3o\        ;QJ d    V3R lV 4       F  '       d   K   RM	  RM! V3R lV 4       4      '       d   R# Rp\        ;QJ d    . V 3R	 lW3 4       F  NK  	  5M! V 3R	 lW3 4       4      p	\        ;QJ d    R
 V	 4       F  '       d   K   RM	  RM! R
 V	 4       4      '       d   \        P                  ! RV	4      p\        P!                  V34      p
V F  pVP#                  SS.4       K  	  \%        V\&        4      '       d$   V^ ,          P
                  Vn        \)        V4       VP*                  P-                  4       VP*                  P-                  4       ,          pVP*                  P/                  4        Uu/ uF  qÝP0                  VbK  	  upoVP*                  P/                  4        Uu/ uF  qÝP0                  VbK  	  upo\2        ;QJ d!    VVV 3R lV 4       F  '       g   K   RM	  RM! VVV 3R lV 4       4      pV'       g   V
P5                  4        R# S P7                  WV4      '       d   V
P5                  4        R# \8        P:                  '       g>   V F  pVP=                  RRR7       K  	  \%        V\&        4      '       d   \)        V4       R# u upi u upi )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Ñ  Fc              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5irr   rç  rê  s   & rm   rx   ÚAScheduler._try_reindex_pointwise_for_reduction.<locals>.<genexpr>A  s   é € ÐOÑ;N°R”:˜b¤-×0Ð0Ó;Nùrè  Tc              3  ó¬   <"  € T FI  p\         P                  P                  P                  \	        VP
                  ^ ,          4      S4      x € KK  	  R# 5ir/  )rd   ré   rê   rí   rb   rX  )rv   r£  Útarget_numels   & €rm   rx   r	  G  sH   øé € ð 
ñ �ô �G‰G×Ñ×4Ñ4Ü˜bŸi™i¨�lÓ+¨\÷ð ó ùs   ƒAAc              3  óh   <"  € T F'  pSP                  SS3VP                  4       4      x € K)  	  R # 5irr   )rÔ  r¡  )rv   r£  rÒ  Ú	red_numelÚ
red_rnumels   & €€€rm   rx   r	  O  s3   øé € ð 
á�ð ×$Ñ$ i°Ð%<¸b¿m¹m»o×NÐNÛùs   ƒ/2c              3  ób   <"  € T F$  p\        VP                  ^ ,          4      S8H  x € K&  	  R# 5ir/  )rø   rX  )rv   r£  Útarget_iter_sizess   & €rm   rx   r	  W  s$   øé € ÐIÁ&¸BŒu�R—Y‘Y˜q•\Ó"Ð&7Ö7Ã&ùs   ƒ,/Nc              3  óH   <"  € T F  pSP                  V.4      x € K  	  R # 5irr   )rò  )rv   r¸   r�   s   & €rm   rx   r	  ]  s!   øé € ÐWÉÀ�t×3Ñ3°T°F×;Ð;Ëùr  c              3  ó(   "  € T F  qR Jx € K
  	  R # 5irr   rk   )rv   rö  s   & rm   rx   r	  ^  s   é € Ð-¡f ˜�}£fùr|	  ztuple[MemoryCoalescing, ...]c              3  ód   <"  € T F%  pSP                  SV,          SV,          4      x € K'  	  R # 5irr   )Údeps_match_normalized)rv   rt   Ún1_depsÚn2_depsr�   s   & €€€rm   rx   r	  t  s0   øé € ð 
á$�ð ×&Ñ& w¨t¥}°g¸dµm×DÐDÛ$ùs   ƒ-0r˜  )rÓ  rÒ  rº  r×  rÛ   rî   r  r  r@  rt  rà   rá   rÈ   rÚ   rø   r¢  rÏ  r©  rs   r  r8  r  r¬  r
  rt   rB  r¸  r  r.   rl  r€  )r�   rª   r«   Úreduction_nodeÚpw_noder~  Úgroupsr  rõ  r-	  Úrollback_snapshotr£  Úcommon_namesrw   Úhas_benefitrÒ  r  r  r  r  r  r  s   f&&            @@@@@@@rm   rÇ  Ú.Scheduler._try_reindex_pointwise_for_reduction  s¯  ÿ€ õ 	-ð �<‰<�>Š>˜UŸ\™\Ÿ^š^Ùà×Ñ×Ò ×!1Ñ!1×!3Ò!3Ùà×Ñ×Ò¨×(:Ñ(:×(<Ò(<Ø&+™GØ×Ñ×!Ò!¨%×*<Ñ*<×*>Ò*>Ø&+™Gáà"×(Ñ(‰	ˆÜ—K’K¤§
¡
¨F°1­IÓ6ˆ	Ü—[’[¤§¡¨V°A­YÓ7ˆ
Ø  :Õ-ˆç‹sÑO¸7×;LÑ;LÔ;NÓO�s�sŠsÑO¸7×;LÑ;LÔ;NÓO×OÒOÙÜ—’œT¤-Õ0°'×2CÑ2CÓ2EÓFˆ÷ ‹sô 
ñ ó	
�s�sŠsô 
ñ ó	
÷ 
ò 
ñ ç‹sö 
áó
�s�sŠsö 
áó
÷ 
ò 
ñ ð '¨
Ð3Ðß‹3ÔIÁ&ÓI�3�3Š3ÔIÁ&ÓI×IÒIÙð ?Cˆß”ÔWÈÉÓW—‘ÔWÈÉÓWÓWˆß‹3Ñ-¡fÓ-�3�3Š3Ñ-¡fÓ-×-Ò-Ü#Ÿ[š[Ð)GÈÓPˆNô /×5Ñ5°w°jÓAÐãˆBØ×$Ñ$ i°Ð%<Ö=ñ ô �gÔ1×2Ò2Ø" 1�IŸO™OˆGŒMÜ+¨GÔ4ð ×Ñ×*Ñ*Ó,¨u×/@Ñ/@×/MÑ/MÓ/OÕOð 	ð -2×,=Ñ,=×,NÑ,NÔ,PÓQÑ,P S—8‘8˜S’=Ñ,PÑQˆØ,1×,=Ñ,=×,NÑ,NÔ,PÓQÑ,P S—8‘8˜S’=Ñ,PÑQˆß“cö 
á$ó
—c—c’cö 
á$ó
ó 
ˆ÷ Ø×%Ñ%Ô'Ùð ×7Ñ7¸Àn×UÒUØ×%Ñ%Ô'Ùô ×0×0Ð0Û�Ø×'Ñ'°$ÐPUÐ'ÖVñ ä˜'Ô#5×6Ò6Ü/°Ô8áùò; RùÚQs   ÏS>ÐTc               ó    € V ^8„  d   QhRRRR/# rÖ   rk   )rl   s   "rm   rn   rÖ  ‘  s   € ÷ ñ Ð#4ð ¸ñ ro   c                óÌ  € \        V\        4      '       d8   VP                  4       '       * ;'       d    \        VP                  4      '       * # \        V\
        4      '       d�   \        VP                  \        P                  4      '       d    VP                  P                  4       '       * # VP                  4       '       * ;'       d    \        VP                  4      '       * # R# )z.
Is this node unfusable under any conditions.
F)	rs   rý  rÏ  r`   r¸   rb  r1   r2  r3  r¸  s   &&rm   r  ÚScheduler.unfusable_node‘  s¸   € ô �dÔ2×3Ò3Ø×'Ñ'Ó)Ô)÷ ð Ô2UØ—	‘	ó3ô /ð ô �dÔ5×6Ò6Ü˜$Ÿ)™)¤R×%?Ñ%?×@Ò@ØŸ9™9×6Ñ6Ó8Ô8Ð8Ø×'Ñ'Ó)Ô)÷ ð Ô2UØ—	‘	ó3ô /ð ñ ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   Úprologue_noder   r¶  r_  rï  ri   r”   rk   )rl   s   "rm   rn   rÖ  ¡  s2   € ÷ ;ñ ;à(ð;ð )ð;ð ð	;ð
 
ñ;ro   c                óª  € VP                  4       \        P                  P                  8:  d   R# VP	                  4       pVP                  4       pRpWEV,          8”  d   V! R4       R# \        ;QJ d"    . R VP                  4        4       F  NK  	  5M! R VP                  4        4       4      pV\        P                  P                  P                  P                  38X  d   V! R4       R# R R lpVP                  4       p	V	P                  4       '       g9   V! V	P                  4      '       d!   VP!                  4       '       g   V! R	4       R# R# )
zD
Heuristics to avoid benchmarking predictably slow prologue fusions
Tgš™™™™™ñ?z@prologue fusion will not increase amount of bytes read in kernelFc              3  óÂ   "  € T FU  pVP                   f   K  VP                   P                  4        F$  pVP                  R8X  g   K  VP                  x € K&  	  KW  	  R # 5i)NÚcall_function)r¸   r  rF  r  )rv   r–  rf  s   &  rm   rx   ÚEScheduler.check_prologue_fusion_heuristics_fusable.<locals>.<genexpr>Á  sS   é € ð 
á.�Ø�v‰vô ð —V‘V×'Ñ'Ö)�Ø�t‰t�Ñ&ô	 ˆA�HŽHñ *ñ Û.ùs   ‚A—+AÁAz\prologue fusion will not increase attempt to fuse in padding bc it increases unaligned readsc               ó    € V ^8„  d   QhRRRR/# )rf   r–  ztorch.dtyperi   r”   rk   )rl   s   "rm   rn   ÚHScheduler.check_prologue_fusion_heuristics_fusable.<locals>.__annotate__Î  s   € ÷ 	Cñ 	C˜{ð 	C¨tñ 	Cro   c                óH   € V P                   ^8*  ;'       d    V P                  # )rf   )ÚitemsizeÚis_floating_point)r–  s   &rm   Úlow_prec_fpÚGScheduler.check_prologue_fusion_heuristics_fusable.<locals>.low_prec_fpÎ  s   € Ø—>‘> QÑ&×BÐB¨5×+BÑ+BÐBro   zVprologue fusion that must be upcast to fp32 not profitable for low precision templates)r<  rd   ré   Úinvoke_quant_opsr0  r4  rø   rá   rê  r
  ÚatenÚconstant_pad_ndr
  r©  r_   r–  r™  )
r�   r"  r¶  r_  Ú
read_bytesÚwrite_bytesÚBYTES_THRESHOLD_MULTIPLIERr  r,  rˆ  s
   &&&&      rm   Ú(check_prologue_fusion_heuristics_fusableÚ2Scheduler.check_prologue_fusion_heuristics_fusable¡  s%  € ð ×,Ñ,Ó.´!·'±'×2JÑ2JÔJÙà"×8Ñ8Ó:ˆ
Ø#×:Ñ:Ó<ˆð &)Ð"ØÐ'AÕAÔBÙÐRÔSÙ÷ ”%ñ 
à"×,Ñ,Ô.ó
—%‘%ñ 
à"×,Ñ,Ô.ó
ó 
ˆð ”u—y‘y—~‘~×5Ñ5×=Ñ=Ð?Ô?ÙØnôñ õ	Cð %×?Ñ?ÓAˆà×6Ñ6×8Ò8Ù˜L×.Ñ.×/Ò/Ø!×>Ñ>×@Ò@áØhôñ áro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rª   r   r«   ri   z,tuple[int, SchedulerNode, sympy.Expr] | Nonerk   )rl   s   "rm   rn   rÖ  Þ  s)   € ÷ `ñ `Ø&ð`Ø/@ð`à	5ñ`ro   c                ó  a € \        V\        4      '       d   \        V\        4      '       g   R# \        VP                  \        P                  4      '       d+   \        VP                  \        P                  4      '       g   R# VP                  4       '       g   VP                  4       '       d   R# \        P                  R8X  d   R# VP                  VP                  rCVw  rVVw  rxVP                  4       '       g6   VP                  4       '       g    Wh8w  g   \        V4      \        V4      8w  d   R# \        VP                  P                  4      ^8”  g%   \        VP                  P                  4      ^8”  d   R# S P                  \        \        VP                  P                  4      4      4      p	S P                  \        \        VP                  P                  4      4      4      p
\!        Wš4      \        P"                  8”  d   R# R V 3R llpV! V4      '       g   V! V4      '       d   R# . p\%        \'        WW4      4       F!  w  pw  rïWï8w  g   K  VP)                  V4       K#  	  \        V4      ^8w  d   R# V^ ,          pVV,          VV,          pp\*        P,                  P.                  P1                  VV4      '       d   VVV3# \*        P,                  P.                  P1                  VV4      '       d   VVV3# R# )a?  
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.
Nru
  c               ó    € V ^8„  d   QhRRRR/# rÖ   rk   )rl   s   "rm   rn   ÚBScheduler.get_expand_dim_for_pointwise_nodes.<locals>.__annotate__  s   € ÷ 	ñ 	Ð&7ð 	¸Dñ 	ro   c                óº  <€ V P                   P                   F¿  pVP                  SP                  9   d   SP                  VP                  ,          pM%SP                  P                  VP                  4      pV'       g   Kk  \        P                  P                  P                  W 4      '       g   Kœ  \        VP                  \        4      '       d   K¾   R # 	  R# rk  )r  r  rt   rz  r{  r  rd   ré   ru  rü  rs   r=  rý  )r¸   r  r  r�   s   &  €rm   Úhas_reusable_bufferÚIScheduler.get_expand_dim_for_pointwise_nodes.<locals>.has_reusable_buffer  s—   ø€ Ø×(Ñ(×.Ô.�à—9‘9 × ;Ñ ;Ô;Ø $× ;Ñ ;¸D¿I¹IÕ F‘Ià $× 0Ñ 0× 4Ñ 4°T·Y±YÓ ?�I÷ ‘IÜŸ™×,Ñ,×6Ñ6°y×GÔGÜ& y×'<Ñ'<Ô>T×UÔUâñ /ñ ro   )rs   rÚ   r¸   r1   r   r  r.   rv
  rX  rÛ   r÷   r  rÖ  rÔ  r²  r  rž  Úsmall_memory_access_thresholdr³  r÷  r  rd   ré   rê   Ústatically_known_lt)r�   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   f&&                rm   Ú"get_expand_dim_for_pointwise_nodesÚ,Scheduler.get_expand_dim_for_pointwise_nodesÞ  sq  ø€ ô ˜%¤×/Ò/´zÀ%Ì×7WÒ7WÙô �u—z‘z¤2×#4Ñ#4×5Ò5Ü˜5Ÿ:™:¤r×'8Ñ'8×9Ò9áð ×)Ñ)×+Ò+¨u×/MÑ/M×/OÒ/OÙô ×Ñ Ô)Ùð #Ÿ\™\¨5¯<©<�(Ø)1Ñ&ˆØ)1Ñ&ˆà×Ñ× Ò Ø×!Ñ!×#Ò#ØÔ1Ü�=Ó!¤S¨Ó%7Ô7áô ˆu× Ñ ×'Ñ'Ó(¨1Ô,´°E×4EÑ4E×4LÑ4LÓ0MÐPQÔ0QÙð "×/Ñ/´´T¸%×:KÑ:K×:RÑ:RÓ5SÓ0TÓUÐØ!×/Ñ/´´T¸%×:KÑ:K×:RÑ:RÓ5SÓ0TÓUÐäÐ"Ó7Ü×2Ñ2ô3ñ ÷	ð 	ñ  ˜u×%Ò%Ñ)<¸U×)CÒ)CÙð !ÐÜ'0´°]Ó1RÖ'SÑ#ˆCÑ#�'ØÖ!Ø#×*Ñ*¨3Ö/ñ (Tô Ð"Ó# qÔ(Ùà*¨1Õ-ˆà˜,Õ'Ø˜,Õ'ð 'ˆô �7‰7×Ñ×/Ñ/°À×OÒOØ ¨Ð6Ð6Ü�W‰W×Ñ×1Ñ1°.À.×QÒQØ ¨Ð6Ð6áro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rH  r   rO  ri   rj   rk   )rl   s   "rm   rn   rÖ  @  s$   € ÷ 
ñ 
Ø)ð
Ø5Fð
à	ñ
ro   c                	ó¤   a aa€ \        V 3R  lVP                  4        4       4      o\        VVV 3R lVP                  P                   4       4      # )c              3  óZ   <"  € T F   pSP                   P                  W4      x € K"  	  R # 5irr   ©r¥  r  ©rv   rt   r�   s   & €rm   rx   ÚDScheduler._producer_output_names_read_by_consumer.<locals>.<genexpr>C  s,   øé € ð (
á3�ð ×!Ñ!×%Ñ% d×1Ð1Û3ùr¾  c              3  óš   <"  € T F@  pSP                   P                  VP                  VP                  4      ;oS9   g   K<  Sx € KB  	  R # 5irr   ©r¥  r  rt   )rv   rw   rt   Úproducer_buf_namesr�   s   & €€€rm   rx   rT  G  sE   øé € ð 
á1�Ø×-Ñ-×1Ñ1°#·(±(¸C¿H¹HÓEÐE�Ø!ñ"÷ ŠDÛ1ùs   ƒ9AÁ
A)r   rŽ  r  r  )r�   rH  rO  rt   rW  s   f&&@@rm   Ú'_producer_output_names_read_by_consumerÚ1Scheduler._producer_output_names_read_by_consumer@  sN   ú€ ô (ô (
à ×1Ñ1Ô3ó(
ó 
Ðô ö 
à×+Ñ+×1Ò1ó
ó 
ð 	
ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rª   r   r«   ri   úOrderedSet[str] | Nonerk   )rl   s   "rm   rn   rÖ  N  s-   € ÷ Jñ Jà ðJð !ðJð 
 ñ	Jro   c                	ó˜   € \         P                  W4      '       g   R # \         P                  W4      '       g   R # V P                  W4      # rr   )rm  r�  rI  rX  rø  s   &&&rm   Ú"_nested_index_equivalent_dep_namesÚ,Scheduler._nested_index_equivalent_dep_namesN  s?   € ô
 ×+Ñ+¨E×9Ò9Ùô ×'Ñ'¨×5Ò5ÙØ×;Ñ;¸EÓIÐIro   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rf   rq  r   rü  r°  zCSequence[tuple[BaseSchedulerNode, NestedReduction.PointwiseDomain]]r  r”   ri   rk   )rl   s   "rm   rn   rÖ  _  s<   € ÷ !
ñ !
à'ð!
ð !ð!
ð
ð	!
ð ð!
ð 
ñ!
ro   c               	óV  a a	€ \        4       p\        V 3R  lVP                  4        4       4      o	V F`  w  rgV\        P                  P                  Jd   K%  V 3R lVP
                  P                   4       pVP                  V	3R lV 4       4       Kb  	  S P                  VVVVR7      # )c              3  óZ   <"  € T F   pSP                   P                  W4      x € K"  	  R # 5irr   rR  rS  s   & €rm   rx   Ú>Scheduler._can_fuse_nested_reduction_append.<locals>.<genexpr>j  s,   øé € ð '
á7�ð ×!Ñ!×%Ñ% d×1Ð1Û7ùr¾  c              3  ó„   <"  € T F5  pSP                   P                  VP                  VP                  4      x € K7  	  R # 5irr   rV  r[  s   & €rm   rx   rb  q  s6   øé € ð á/�Cð ×%Ñ%×)Ñ)¨#¯(©(°C·H±H×=Ð=Û/ùs   ƒ=A c              3  ó8   <"  € T F  qS9   g   K  Vx € K  	  R # 5irr   rk   )rv   Údep_nameÚgrouped_buf_namess   & €rm   rx   rb  u  s   øé € ð .Ù).˜XÐ>OÑ2O—’«ùs   ƒ�
)r  Úindex_equivalent_dep_names)	r   rŽ  rm  rŠ  r‰  r  r  r’  Ú	_can_fuse)
r�   rq  rü  r°  r  rg  r£  rÆ  r  rf  s
   f&&&$    @rm   r  Ú+Scheduler._can_fuse_nested_reduction_append_  s®   ù€ ô 7A³lÐ"Ü&ô '
à$×5Ñ5Ô7ó'
ó 
Ðó ,‰JˆBØœ_×<Ñ<×HÑHÓHÙôàŸ>™>×/Ò/óˆEð '×-Ñ-ô .Ù).ó.ö ñ ,ð �~‰~ØØØ#Ø'Að	 ó 
ð 	
ro   Fc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# ©rf   rª   r   r«   r  r”   rå  ri   rk   )rl   s   "rm   rn   rÖ  ‚  s<   € ÷ ñ à ðð !ðð ð	ð
 $(ðð 
ñro   c                óŠ   € \         P                  W34      pV P                  VVVVR7      pVP                  V'       * R7       V# )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.
©r  rå  )rÏ  )r»  rÏ  Ú_can_fuse_implrÑ  )r�   rª   r«   r  rå  rÄ  rI  s   &&&&&  rm   rI  ÚScheduler.can_fuse‚  sN   € ô '×-Ñ-¨u¨nÓ=ˆØ×&Ñ&ØØØ#Ø&?ð	 'ó 
ˆð 	�‰ H¤ˆÔ-Øˆro   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# rk  rk   )rl   s   "rm   rn   rÖ  ˜  s<   € ÷ 
ñ 
à ð
ð !ð
ð ð	
ð
 $(ð
ð 
ñ
ro   c                ó,   € V P                  VVVVR7      # )zR
Determine if it is possible to combine node1 and node2 into a
single fused node.
rm  )rh  )r�   rª   r«   r  rå  s   &&&&&rm   rn  ÚScheduler._can_fuse_impl˜  s&   € ð �~‰~ØØØ#Ø&?ð	 ó 
ð 	
ro   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
rf   rª   r   r«   r  r”   rå  rg  r[  ri   rk   )rl   s   "rm   rn   rÖ  ª  sV   € ÷ iMñ iMà ðiMð !ðiMð ð	iMð
 $(ðiMð %;ðiMð 
ñiMro   c                	ó¦  a aaa(a)a*€ SSJ d   R # Ve   \        V 3R lV 4       4      pS P                  4       '       d+   S P                  S4      pS P                  S4      pWg8w  d   R # S P                  4       '       d?   S P                  P                  S4      pS P                  P                  S4      p	W‰8w  d   R # \        S\        4      '       d   SP                  SVR7      # \        S\        4      '       d   R # \        S\        4      '       d   SP                  S4      # \        S\        4      '       d   R # \        SS4      p
SP                  4       '       d!   SP                  4       '       d   V
! R4       R # SP                  4       '       g   SP                  4       '       d7   SP                  4       '       d!   SP                  4       '       d   V
! R4       R # SP                  4       '       d8   S P                  SP                  4       4      P!                  SS4      '       d   R# SP                  4       '       d8   S P                  SP                  4       4      P#                  SS4      '       d   R# \        S\$        4      '       g   \        S\$        4      '       d   V
! R4       R # \        S\&        4      '       d!   SP                  4       '       g   V
! R4       R # \        S\(        4      '       Ed¡   \        SP*                  \,        P.                  4      '       g   V
! R	4       R # SP*                  P1                  4       '       g   V
! R
4       R # \        S\2        4      '       g   V
! R4       R # \        SP*                  \4        4      '       g   V
! R4       R # \        SP*                  P6                  \8        4      '       g   V
! R4       R # \;        SP*                  P<                  4      ^8w  d,   \?        R\;        SP*                  P<                  4       24      hSP*                  P<                  ^ ,          P@                  o*\C        SPD                  PF                  4      p\C        SPD                  PH                  4      p\;        V4      ^8w  g)   \;        V4      ^8w  g   V^ ,          P@                  S*8w  d   V
! R4       R # V^ ,          pV^ ,          p\        V\J        4      '       g   \?        R\M        V4       24      h\        V\J        4      '       g   \?        R\M        V4       24      hVPN                  VPN                  8w  g   VPP                  VPP                  8w  d   V
! R4       R # SP*                  P6                  PS                  4       pV Fe  pSP*                  P6                  PU                  V4      p\V        ;QJ d    R V 4       F  '       g   K   RM	  R M! R V 4       4      '       g   Kd   R # 	  \;        SP*                  PX                  4      ^8w  d,   \?        R\;        SP*                  PX                  4       24      hSP*                  PX                  ^ ,          PZ                  pSP*                  PZ                  p\        V\,        P\                  4      '       d!   \        V\,        P\                  4      '       g   \?        R4      hVPP                  VPP                  8w  g7   VP^                  VP^                  8w  g   VP`                  VP`                  8w  d   V
! R4       R # R VVV*3R llo(\V        ;QJ d)    V(3R lS Pb                   4       F  '       g   K   RM	  R M! V(3R lS Pb                   4       4      '       d   R # \        S\(        \&        34      '       d!   SP                  4       '       g   V
! R4       R # SPe                  4       SPf                  ,          '       d   V
! R4       R # SP                  4       '       EdÈ   \i        S4      '       g   V
! R4       R # SP                  4       '       g   SP                  4       '       d   V
! R4       R # SPk                  4       pVPm                  4       pV'       g   V
! R4       R # \        R VPn                   4       4      V,
          pSPq                  4       V,          '       d   V
! R4       R # SPs                  4       '       g   VPu                  S4      '       d   V
! R 4       R # SPw                  4       o)S)RR-  F|  pVPy                  4       pV Fc  p\z        ;QJ d)    V)3R! lVP|                   4       F  '       d   K   R M	  RM! V)3R! lVP|                   4       4      '       d   KY  V
! R"4         R # 	  K~  	  \        S\~        4      '       g   S.M3SP€                   Uu. uF  pVP                  4       '       g   K  VNK  	  upp\;        V4      ^8w  d   \?        R#\;        V4       24      hV^ ,          p\;        S)R-,          P‚                  4      ^8X  dl   \;        S)R-,          P‚                  ^ ,          P|                  4      ^8X  d:   S)R-,          P‚                  ^ ,          P|                  ^ ,          P*                  VJ g   V
! R$4       R # S P…                  SSV
4      '       g   R # SP                  4       '       dü   \‡        SS4      pS P                  SP                  4       4      pSPs                  4       '       d	   V'       d@   SP                  4       '       d   VP#                  SS4      '       d   \‰        S4      '       g   V
! R%4       R # SP‹                  4       pVf   \?        R&4      hVP�                  4       '       d5   \        SP*                  \,        P4                  4      '       g   V
! R'4       R # SPq                  4       \Ž        P�                  P’                  ,          '       g6   SPq                  4       \Ž        P�                  P’                  ,          '       d   V
! R(4       R # SP                  4       p SP                  4       p!V V!8w  d   V
! R)V V!4       R # ?!Vf   S P•                  SS4      pS P—                  SSVVR*7      p"\˜        Pš                  '       dG   S P�                  SS4      ;p#'       d-   V#w  p$p%p&V%PŸ                  V$V&4       S P—                  SSVR+7      p"V'       d]   V"\˜        P                   8  dH   \˜        P¢                  '       g   \˜        P¤                  '       d   S P§                  SS4      p'V'^ 8¼  d   T'p"\˜        P¨                  '       d1   V"\˜        P                   8  d   S P«                  SS4      p'V'^ 8¼  d   T'p"\¬        P¯                  \°        P²                  4      '       d5   \¬        Pµ                  R,SP·                  4       SP·                  4       V"4       \Ž        P¸                  P»                  S SSV"4      '       g   R # SPe                  4       SPf                  ,          '       Ed   S P½                  SSVR+7      '       dR   \Ž        P¸                  P½                  S SSV"4      '       d*   S P                  V 4      P½                  SS4      '       d   R# \˜        P¤                  '       d€   S P¿                  SS4      '       dh   S P½                  SSVR+7      ;'       dL    \Ž        P¸                  P½                  S SSV"4      ;'       d"    S P                  V 4      P½                  SS4      # R # \Ž        P¸                  PÁ                  S SSV"4      ;'       d"    S P                  V 4      PÁ                  SS4      # u upi ).FNc              3  óZ   <"  € T F   pSP                   P                  W4      x € K"  	  R # 5irr   rR  rS  s   & €rm   rx   Ú&Scheduler._can_fuse.<locals>.<genexpr>µ  s,   øé € ð 4á6�Dð ×%Ñ%×)Ñ)¨$×5Ð5Û6ùr¾  r  z5template fusion does not preserve strict sum orderingz6reduction fusion does not preserve strict sum orderingTz/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+  z1epilogue is not a unary read of the output bufferzexpected MemoryDep, got z(epilogue's read and write indices differc              3  ó*   "  € T F	  qR 8g  x € K  	  R# 5i)râ
  Nrk   )rv   Úusages   & rm   rx   rv  &   s   é € Ð;±F¨5 –³Fùs   ‚zexpected one mutable arg, got z,expected layout1 and layout2 to be ir.Layoutz*node1 and node2 uses different buf layoutsc               ó   € V ^8„  d   QhRR/# )rf   rE  r   rk   )rl   s   "rm   rn   Ú)Scheduler._can_fuse.<locals>.__annotate__<   s   € ÷ ñ Ø-ñro   c                óZ   <€ V SJ;'       d     V SJ;'       d    SV P                  4       9   # rr   )r  )rE  rª   r«   Úwritten_buffer_names   &€€€rm   Ú._is_other_node_that_references_mutation_bufferÚKScheduler._can_fuse.<locals>._is_other_node_that_references_mutation_buffer<   sC   ø€ ð   uÐ,÷ Nð NØ#¨5Ð0÷Nð Nà+¨z×/KÑ/KÓ/MÑMðro   c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5irr   rk   )rv   r¸   r}  s   & €rm   rx   rv  E   s    øé € ð á&�Dñ ?¸t×DÐDÛ&ùr1
  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  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r  )rv   r¥
  s   & rm   rx   rv  f   s   é € ÐE±_¨cŸ<™<Ÿ>˜>³_ùr‡  z;prologue fusion not implemented for kernel for these inputsz:template prologue can only fuse functional pointwise nodesc              3  ó@   <"  € T F  qP                   S9   x € K  	  R # 5irr   râ   )rv   rb  Úprologue_nodess   & €rm   rx   rv  x   s   øé € ÐQÁy¸tŸy™y¨NÖ:Ãyùs   ƒz7template prologue can only fuse nodes with a single usez!expected one template snode, got zEtemplate prologue can only fuse nodes with a single use into templateztemplate epilogue not satisfiedzexpected template_buf to be setz6multi-output template epilogue requires ComputedBufferz#fusion for buffer explicit disabledzdevice mismatch (%s vs %s))rå  rg  ©rg  z%s and %s has %s shared datarZ  )ar   ru	  r—  r‚	  r   r  rs   r  r  rÛ  rï  rÏ  r:  rÛ   rj  rÏ   Úcan_fuse_multi_outputs_templateÚcan_fuse_reduction_epiloguerD  rý  rb  r¸   r1   r2  r3  rÚ   r   r/  r   r÷   r,  rŽ   rt   rÈ   r  r  rÖ  r:   rÐ   r  r  Úinner_fn_free_symbolsÚcollect_inner_fn_symbol_usagerB  r5  r\  r`  ra  r¹  r¼  r<  r;  rŽ  r©  Úget_allowed_prologue_inpsrÎ  rŽ  r  Ú,has_aliasing_or_mutation_for_prologue_fusionrá   r½  rà   r?  r  r  r¨  r4  r‰  rx  r£  r_   rd   ré   Úno_fuse_buffer_namesr]  Ú!_score_fusion_memory_for_can_fuser.   Ú$expand_dimension_for_pointwise_nodesrM  rÃ  Úscore_fusion_memory_thresholdrl  rÆ  rÈ  r|
  r¯  rÎ  r«	  r¬	  rø
  rý  rE  r³
  rI  Úcan_fuse_verticalrÇ  Úcan_fuse_horizontal)+r�   rª   r«   r  rå  rg  Ústream1Ústream2Úmempool1Úmempool2r_  Úepilogue_readsÚepilogue_writesr  rÛ  Únode2_inner_fn_free_symbolsÚsymbolÚusagesÚlayout1Úlayout2r¨  r  Úunsupported_prologue_argsr¸   Ú	node_outsr  r–  Útemplate_snodesÚtemplate_snodeÚatomic_add_mutation_epiloguer  rˆ  r¹  Údevice2Úshared_data_scoreÚexpand_analysisÚ
expand_dimÚsmaller_nodeÚexpand_sizeÚnew_shared_data_scorer}  r‚  r|  s+   fff&&&                                  @@@rm   rh  ÚScheduler._can_fuseª  sÒ  ý€ ð �E‹>ÙØ%Ò1Ü)3ô 4á6ó4ó *Ð&ð ×'Ñ'×)Ò)Ø×*Ñ*¨5Ó1ˆGØ×*Ñ*¨5Ó1ˆGØÔ!ÙØ×"Ñ"×$Ò$Ø×+Ñ+×/Ñ/°Ó6ˆHØ×+Ñ+×/Ñ/°Ó6ˆHØÔ#Ùä�eÔ2×3Ò3Ø×&Ñ& u¸+Ð&ÓFÐFÜ�eÔ2×3Ò3Ùä�eÔ4×5Ò5Ø×&Ñ& uÓ-Ð-Ü�eÔ4×5Ò5ñ ä˜˜uÓ%ˆà×Ñ×Ò 5×#7Ñ#7×#9Ò#9ÙÐGÔHÙð ×!Ñ!×#Ò# u×';Ñ';×'=Ò'=Ø×"Ñ"×$Ò$Ø×"Ñ"×$Ò$áÐHÔIÙà×Ñ×Ò 4×#3Ñ#3Ø×ÑÓó$
ç
)Ñ
)¨%°Ó
7ö$8ñ Ø×Ñ×Ò 4×#3Ñ#3Ø×ÑÓó$
ç
%Ñ
% e¨UÓ
3ö$4ñ ä�eÔ1×2Ò2´jØÔ'÷7
ò 7
ñ ÐAÔBÙÜ�eÔ3×4Ò4¸U×=NÑ=N×=PÒ=PÙ�ÔÙä�eÔ6×7Ó7Ü˜eŸj™j¬"×*DÑ*D×EÒEÙÐ=Ô>Ùà—:‘:×/Ñ/×1Ò1ÙÐKÔLÙä˜e¤]×3Ò3ÙÐDÔEÙÜ˜eŸj™j¬.×9Ò9ÙÐIÔJÙÜ˜eŸj™jŸo™o¬y×9Ò9ÙÐJÔKÙä�5—:‘:×.Ñ.Ó/°1Ô4Ü$Ø8¼¸U¿Z¹Z×=XÑ=XÓ9YÐ8ZÐ[óð ð #(§*¡*×"=Ñ"=¸aÕ"@×"EÑ"EÐô " %×"3Ñ"3×"9Ñ"9Ó:ˆNÜ" 5×#4Ñ#4×#;Ñ#;Ó<ˆOä�NÓ# qÔ(Ü�Ó'¨1Ô,Ø! !Õ$×)Ñ)Ð-@Ô@áÐGÔHÙà'¨Õ*ˆIØ% aÕ(ˆHÜ˜h¬	×2Ò2Ü$Ð'?ÄÀXÃÐ?OÐ%PÓQÐQÜ˜i¬×3Ò3Ü$Ð'?ÄÀYÃÐ?PÐ%QÓRÐRØ�~‰~ §¡Ô0°H·M±MÀYÇ^Á^Ô4SÙÐ>Ô?Ùð +0¯*©*¯/©/×*OÑ*OÓ*QÐ'Û5�ØŸ™Ÿ™×FÑFÀvÓN�ß“3Ñ;±FÓ;—3—3’3Ñ;±FÓ;×;Ô;Ú ñ 6ô �5—:‘:×*Ñ*Ó+¨qÔ0Ü$Ø4´S¸¿¹×9PÑ9PÓ5QÐ4RÐSóð ð
 —j‘j×-Ñ-¨aÕ0×7Ñ7ˆGØ—j‘j×'Ñ'ˆGÜ˜w¬¯	©	×2Ò2´zÀ'Ì2Ï9É9×7UÒ7UÜ$Ð%SÓTÐTà—‘ §¡Ô,Ø—>‘> W§^¡^Ô3Ø—>‘> W§^¡^Ô3áÐ@ÔAÙ÷ò ÷ ‹sô à ŸJšJó�s�sŠsô à ŸJšJó÷ ò ñ ô �uÔ8Ô:PÐQ×RÒRØ×%Ñ%×'Ò'áÐ(Ô)Ùà×$Ñ$Ó&¨¯©×8Ô8ÙÐ,Ô-Ùà×Ñ×ÓÜ.¨u×5Ò5ÙÐ0Ô1Ùà×!Ñ!×#Ò# u×'8Ñ'8×':Ò':ÙÐHÔIÙà×7Ñ7Ó9ˆHØ$,×$FÑ$FÓ$HÐ!ß(ÙÐ=Ô>Ùô ÑE°X·_²_ÓEÓEØ'õ(ð &ð
 ×%Ñ%Ó'Ð*C×CÔCÙÐQÔRÙà×-Ñ-×/Ò/Ø×EÑEÀe×LÒLáÐPÔQÙà"Ÿ_™_Ó.ˆNØ& s¨Ó+�Ø ×,Ñ,Ó.�	Û$�Cß›3ÔQÀsÇyÂyÓQŸ3Ÿ3š3ÔQÀsÇyÂyÓQ×QÔQÙÐUÔVÛ$ó %ñ ,ô " %Ô);×<Ò<ð ‘à!&§¢ÓA¡˜A°·±·—a�a¡ÑAð ô
 �?Ó# qÔ(Ü$Ø7¼¸OÓ8LÐ7MÐNóð ð -¨QÕ/ˆNô �N 2Õ&×.Ñ.Ó/°1Ô4Ü˜ rÕ*×2Ñ2°1Õ5×;Ñ;Ó<ÀÔAØ" 2Õ&×.Ñ.¨qÕ1×7Ñ7¸Õ:×?Ñ?À>ÓQáØ[ôñ à×@Ñ@ÀÈÈs×SÒSÙà×Ñ×ÒÜ+QØ�uó,Ð(ð ×&Ñ& u×'7Ñ'7Ó'9Ó:ˆGà×/Ñ/×1Ò1×:Và×&Ñ&×(Ò(Ø#×?Ñ?ÀÀu×MÒMä2°5×9Ò9áÐ5Ô6ÙØ ×2Ñ2Ó4ˆLØÒ#Ü$Ð%FÓGÐGØ×5Ñ5×7Ò7Ä
Ø—
‘
œB×-Ñ-÷Aò Añ ÐLÔMÙà×"Ñ"Ó$¤q§w¡w×'CÑ'C×CÔCØ×"Ñ"Ó$¤q§w¡w×'CÑ'C×CÔCáÐ5Ô6ÙØ×!Ñ!Ó#ˆØ×"Ñ"Ó$ˆØ�WÔÙÐ,¨f°gÔ>ÙØà%Ò-Ø)-×)PÑ)PØ�uó*Ð&ð !×BÑBØØØ&?Ø'Að	 Có 
Ðô ×6×6Ð6Ø#×FÑFÀuÈeÓTÐTˆOÖTà6EÑ3ˆZ˜ {Ø×<Ñ<¸ZÈÔUØ $× FÑ FØØØ+Eð !Gó !Ð÷ Ø!¤F×$HÑ$HÔHä×1×1Ð1´V×5X×5XÐ5Xð %)×$JÑ$JÈ5ÐRWÓ$XÐ!Ø$¨Ô)Ø$9Ð!ô ×1×1Ð1Ø!¤F×$HÑ$HÔHà$(×$MÑ$MØ�uó%Ð!ð %¨Ô)Ø$9Ð!ä×)Ñ)¬'¯-©-×8Ò8Ü×#Ñ#Ø.Ø—‘Ó Ø—‘Ó Ø!ô	ô �y‰y×!Ñ! $¨¨uÐ6G×HÒHÙà×$Ñ$Ó&¨¯©×8Õ8ð ×&Ñ&ØØØ/Ið '÷ ò ô
 —I‘I×/Ñ/°°e¸UÐDU×VÒVØ×$Ñ$ VÓ,×>Ñ>¸uÀe×LÒLáô ×3×3Ð3Ø×=Ñ=¸eÀU×KÒKð ×*Ñ*ØØØ3Mð +ó ÷ Qð Qô
 Ÿ	™	×3Ñ3Ø˜e UÐ,=ó÷Qð Qð ×(Ñ(¨Ó0×BÑBÀ5È%ÓPð
ñ ä—9‘9×0Ñ0Ø�e˜UÐ$5ó÷ Mð Mà×"Ñ" 6Ó*×>Ñ>¸uÀeÓLðMùòe Bs   ç!ç>rg  c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   rª   r   r«   rg  r[  ri   r”   rk   )rl   s   "rm   rn   rÖ  !  s8   € ÷ Gñ Gà ðGð !ðGð
 %;ðGð 
ñGro   c               ó¤  € VP                  4       p\        W4      p\        \        4      pVP                   Fz  pV P
                  P                  VP                  VP                  4      p\        V\        4      '       d   V P                  WqV4      '       d   Kc  Wh,          P                  V4       K|  	  VP                  P                   EF=  p	\        V	\        4      '       g   \        V	\        4      '       g   K2  V P
                  P                  V	P                  V	P                  4      p
VP                  V
4      pV'       g   K}  V Fº  p\        V	\        4      '       dU   T P!                  VP#                  V P
                  4      T	VRJ;'       d    W£9   R7      '       d   VP%                  V4       Km  \        V	\        4      '       g   K…  V P'                  WÉVP(                  4      '       g   K©  VP%                  V4       K¼  	  EK@  	  \+        R \,        P.                  P1                  VP3                  4       4       4       4      pWÔ,          '       d   V! R4       R# VP5                  4       pV FX  pV P6                  V,          P9                  4       pWàP:                  V,          P<                  ,          '       g   KO  V! R4        R# 	  R# )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  ó:   "  € T F  pVP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   Ú.Scheduler.can_fuse_vertical.<locals>.<genexpr>H!  s   é € ð $
áU�ð �HŽHÛUùrG  zmemory deps did not matchFz(intermediate nodes between node1 & node2T)rŽ  rï  r   rÈ   r®  r¥  r  rt   rs   r<   r"  r  r  rÖ  r:   r;   Úfusable_read_and_writer  r-  Ú.fusable_stardep_write_and_read_on_empty_tensorr¸   r   rH  rI  rø  r	  r<  r{  rG  rs  r;  )r�   rª   r«   rg  Únode1_buf_namesr_  Úremaining_deps_by_namerw   rt   ÚcdÚ
write_nameÚ	remainingrT  Úremaining_depsÚnode1_op_namesrf  s   &&&$            rm   rŽ  ÚScheduler.can_fuse_vertical!  sA  € ð$  ×0Ñ0Ó2ˆÜ˜Ó%ˆÜ7BÄ4Ó7HÐà×+Ô+ˆCØ×(Ñ(×,Ñ,¨S¯X©X°s·x±xÓ@ˆDÜ˜#œw×'Ò'¨D×,AÑ,AÀ#Èe×,TÒ,TÙØ"Õ(×/Ñ/°Ö4ñ	 ,ð ×#Ñ#×*Õ*ˆBÜ˜b¤)×,Ò,´ZÀÄG×5LÒ5LÙØ×.Ñ.×2Ñ2°2·7±7¸B¿G¹GÓDˆJØ.×2Ñ2°:Ó>ˆIß‰yÛ#�BÜ! "¤i×0Ò0°T×5PÑ5PØŸ	™	 $×"7Ñ"7Ó8Øà6¸dÐB÷ Ið IØ *Ñ Hð 6Q÷ 6ò 6ð "×(Ñ(¨Ö,Ü# B¬×0Ô0Ø×KÑKØ E§J¡J÷ô ð "×(Ñ(¨Ö,ô $ñ +ô. $ñ $
ä —‘×4Ñ4Ð5K×5RÑ5RÓ5TÔUó$
ó 
ˆð
 ×+Ô+ñ
 Ð+Ô,Ùà×2Ñ2Ó4ˆÛ"ˆDØ×&Ñ& tÕ,×=Ñ=Ó?ˆGØ× 7Ñ 7¸Õ @× JÑ J×JÖJÙÐ>Ô?Úñ	 #ñ ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   Úweak_depr<   rª   r   r«   ri   r”   rk   )rl   s   "rm   rn   rÖ  ^!  s,   € ÷ =)ñ =)Øð=)Ø(9ð=)ØBSð=)à	ñ=)ro   c                	óÄ  a€ VP                   VP                  4       9  d   R # VP                  P                   Uu. uF"  pVP                   VP                  8X  g   K   VNK$  	  pp\        V4      ^8w  d   R # V^ ,          o\        S\        4      '       d   R # \        S\        4      '       g   \        R4      h\        SP                  \        P                  4      '       d   R # \        SP                  4      SP                  P                   8:  g   R # V P"                  VP                  ,          pV.p\        V\$        4      '       d   VP&                  p^ pV Fô  p	V	P                  P(                   U
u. uF  p
V
P                   V8X  g   K  V
NK  	  pp
V'       g   KE  VP+                  4       pVeP   VP,                  R8X  d   \.        P0                  R8X  g'   VP,                  R8X  d   \.        P2                  R8X  d    R # V^,          p\4        ;QJ d    V3R lV 4       F  '       d   K   R M	  RM! V3R lV 4       4      '       d   Kó   R # 	  V^8*  # u upi u up
i )Fz expected write to be a MemoryDepr·  ru
  rÍ   c              3  ó*  <"  € T Fˆ  p\        V\        4      ;'       dl    \        VP                  \        P
                  4      '       * ;'       d;    VP                  SP                  8H  ;'       d    VP                  SP                  8H  x € KŠ  	  R # 5irr   )rs   r:   r)   r  r+   ÚTMPr  )rv   r  r~  s   & €rm   rx   Ú-Scheduler.fusable_weak_dep.<locals>.<genexpr>“!  s}   øé € ð ñ
 +�Dô	 ˜4¤Ó+÷ ,ð ,Ü+¨D¯J©J¼¿¹ÓAÔA÷,ð ,à—J‘J %§+¡+Ñ-÷,ð ,ð —I‘I §¡Ñ+ô,ó +ùs   ƒBŸ0BÁ BÁ1"BT)rt   rŽ  r  rÖ  rà	  r÷   rs   r;   r:   rŽ   r)   r  r+   r¼  r   r°  r'   r4  rF  r  r  rÏ   rÐ   r.   rv
  Úcuda_backendrà   )r�   r¹  rª   r«   r~  Úmutating_writesr0  Úrelevant_reading_nodesÚnum_concurrent_readsÚreading_noder  Úrelevant_readsr¹  s   &&&&`        rm   r"  ÚScheduler.fusable_weak_dep^!  s  ø€ ð �=‰= × 6Ñ 6Ó 8Ô8Ùð ×*Ñ*×1Ò1ó
á1�Ø�z‰z˜X×2Ñ2Ñ2÷ ˆEÙ1ð 	ð 
ô
 ˆÓ 1Ô$ÙØ Õ"ˆÜ�eœW×%Ò%ÙÜ˜%¤×+Ò+Ü Ð!CÓDÐDä˜uŸ{™{¬D¯H©H×5Ò5Ùô
 ˜%Ÿ/™/Ó*¨e¯k©k×.FÑ.FÔFÙà×+Ñ+¨H×,AÑ,AÕBˆ	Ø"' ÐÜ�eÔ7×8Ò8Ø%*§\¡\Ð"Ø ÐÛ2ˆLð )×4Ñ4×:Ò:óá:�DØ—9‘9 	Ñ)÷ �Ù:ð ð ÷
 "ÙØ×%Ñ%Ó'ˆFØÒ!Ø—‘ Ô%¬&×*<Ñ*<ÀÔ*HØ—K‘K 6Ô)¬f×.AÑ.AÀXÔ.Mò
 Ø  AÕ%Ð ß“3ô ñ
 +ó—3—3’3ô ñ
 +ó÷ ô ò ñ3 3ð4 $ qÑ(Ð(ùòk
ùò8s   »IÁIÅ6IÆIc               ó$   € V ^8„  d   QhRRRRRR/# ©rf   r  r:   r~  ri   r”   rk   )rl   s   "rm   rn   rÖ  ž!  s!   € ÷ 
ñ 
¨9ð 
¸Yð 
È4ñ 
ro   c                	ó  € V P                   VP                   8H  ;'       dc    \        V P                  4      \        VP                  4      8¬  ;'       d0    V P                  R \        VP                  4       VP                  8H  # rr   )r  r÷   r  )r  r~  s   &&rm   Ú_same_index_with_prefix_sizeÚ&Scheduler._same_index_with_prefix_size�!  se   € ð �J‰J˜%Ÿ+™+Ñ%÷ ;ð ;Ü�D—I‘I“¤# e§j¡j£/Ñ1÷;ð ;à—	‘	Ð+œC §
¡
›OÐ,°·
±
Ñ:ð	
ro   r«  c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   r  r9   r~  r:   r«  r”   ri   rk   )rl   s   "rm   rn   rÖ  ¦!  s,   € ÷ =ñ =Øð=Ø )ð=ØGKð=à	ñ=ro   c               óX  € \        V\        4      '       Ed7   VP                  VP                  8w  gU   \        VP                  \
        P                  4      '       g+   \        VP                  \
        P                  4      '       d   R# TpTpV P                  VP                  4      '       d   R# V P                  WE4      '       d   R# \        P                  '       d<   VP                  VP                  8w  d!   VP                  4       pVP                  4       pV P                  W4      '       d   R# V'       g   R# V P                  WE4      # \        V\        4      '       dG   VP                  VP                  8X  d,   VP                  e   VP                  VP                  8X  d   R# R# )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)rs   r:   rt   r)   r  r+   r¼  r:
  r!  rÈ  r.   rl  rË  rg  Ú%_fusable_read_after_index_equivalencer;   )r�   r  r~  r«  Úoriginal_readÚoriginal_writes   &&&$  rm   r®  Ú Scheduler.fusable_read_and_write¦!  s0  € ô �dœI×&Ó&à—	‘	˜UŸZ™ZÔ'Ü& t§z¡z´4·8±8×<Ò<Ü& u§{¡{´D·H±H×=Ò=áà ˆMØ"ˆNð ×1Ñ1°.×2EÑ2E×FÒFÙð ×0Ñ0°×OÒOÙä×0×0Ð0°T·]±]ÀeÇnÁnÔ5Tð —~‘~Ó'�ØŸ™Ó)�ð
 ×0Ñ0°×=Ò=Ùç*Ùà×=Ñ=Øóð ô ˜œg×&Ò&à—	‘	˜UŸZ™ZÔ'Ø—J‘JÒ*Ø—I‘I §¡Ô+áÙro   c               ó$   € V ^8„  d   QhRRRRRR/# rÆ  rk   )rl   s   "rm   rn   rÖ  å!  s$   € ÷ =ñ =Øð=Ø&/ð=à	ñ=ro   c                	óJ  € \        VP                  4      VP                  P                  8:  g   R # VP	                  4       P                  4       '       g'   VP                  4       P                  4       '       g   R # V P                  W4      ;'       g    V P                  W4      # rþ  )	r   r°  r  r'   rg  r†  ru  r  Ú_fusable_read_after_broadcast)r�   r  r~  s   &&&rm   rÌ  Ú/Scheduler._fusable_read_after_index_equivalenceå!  sƒ   € ô ˜%Ÿ/™/Ó*¨e¯k©k×.FÑ.FÔFÙð
 �O‰OÓ×+Ñ+×-Ò-Ø×0Ñ0Ó2×@Ñ@×BÒBáà×)Ñ)Øó
÷ =ð =à×/Ñ/°Ó<ð	=ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÆ  rk   )rl   s   "rm   rn   rÖ  û!  s+   € ÷ OIñ OI¨Ið OI¸ið OIÈDñ OIro   c           
     ó  a € \         ;QJ d!    . V 3R lS P                   4       F  NK  	  5M! V 3R lS P                   4       4      p\        V4      S P                  8w  d•   V Uu/ uF  q3S P                  V,          bK  	  pp\        S P                  S P                  \        V4      \        VP                  4       4      S P                  4      o S P                  4       VP                  4       8X  d   R# S P                  VP                  8w  d   R# \        P                  P                  p\         ;QJ d'    . R \        S P                  4       4       F  NK  	  5M ! R \        S P                  4       4       4      p/ p/ p\        S P                  S P                   WaP                   4       FÁ  w  ršr¼VP#                  W¬4      '       d   W·V	&   K#  VP#                  \$        P&                  ! W¬4      ^ 4      '       g    R# VP)                  \+        W¬4      4      pVP-                  V^4      '       g    R# \$        P.                  ! R\        V4       2RRR7      pW½,          V,           Wy&   WØV&   KÃ  	  V'       g   R# VP1                  \3        S P                  V4      / \5        \        WaP                   4      4      CVC4      p\3        VP                  \5        \        VP                  V4      4      4      pVP#                  VV4      # u upi )a  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  ó`   <"  € T F#  qSP                   P                  9   g   K  Vx € K%  	  R # 5irr   )r  r'   )rv   r  r  s   & €rm   rx   Ú:Scheduler._fusable_read_after_broadcast.<locals>.<genexpr>"  s%   øé € ð 
Ù)�C°D·J±J×4KÑ4KÑ-K�CŠC›>ùs   ƒ.¤
.TFc              3  óZ   "  € T F!  p\         P                  ! R V 2RRR7      x € K#  	  R# 5i)Ú_fusable_broadcast_Tr„   N)r@  rä	  )rv   r°  s   & rm   rx   r×  %"  s/   é € ð 
á)�ô �LŠLÐ.¨q¨cÐ2¸DÈd×SÑSÛ)ùs   ‚)+Ú_fusable_broadcast_tail_r„   )rø   r°  r÷   rË  Úrangesr:   rt   r  r	  r!  rg  rd   ré   rê   r®  r÷  r  rí   r@  rü  rë   r(   rI  rä	  r™  rc   rö  )r  r~  Ú	read_varsr  Úread_rangesrê   Ú
write_varsr–  Útail_rangesÚread_varÚ	read_sizeÚ	write_varÚ
write_sizer›  Útail_varÚ
read_indexÚwrite_indexs   f&               rm   rÒ  Ú'Scheduler._fusable_read_after_broadcastú!  sy  ø€ ÷* ”Eô 
ØŸ>š>ó
—E‘Eô 
ØŸ>š>ó
ó 
ˆ	ô ˆy‹>˜TŸ]™]Ô*Ù<EÓF¹I°S §¡¨CÕ 0Ò0¹IˆKÐFÜØ—	‘	Ø—
‘
Ü�kÓ"Ü�k×(Ñ(Ó*Ó+Ø—	‘	óˆDð �~‰~Ó 5§?¡?Ó#4Ô4Ùà�=‰=˜EŸN™NÔ*Ùô
 —7‘7×#Ñ#ˆß”Uñ 
ä˜4Ÿ=™=Ô)ó
—U‘Uñ 
ä˜4Ÿ=™=Ô)ó
ó 
ˆ
ð 68ˆØ68ˆÜ:=Ø�N‰N˜DŸI™I z·:±:ö;
Ñ6ˆH ð ×/Ñ/°	×FÒFØ)2˜XÑ&Ùà×3Ñ3Ü—	’	˜)Ó0°!÷ò ò Ø×&Ñ&¤x°	Ó'FÓGˆFØ×/Ñ/°¸×:Ò:Úä—|’|Ø*¬3¨{Ó+;Ð*<Ð=ØØ ôˆHð
 &/Õ%7¸(Õ%BˆLÑ"Ø$*˜Ó!ñ+;
÷. Ùà×2Ñ2Ü�t—z‘z <Ó0Ø@Œt”C˜
§J¡JÓ/Ó0Ð@°KÐ@ó
ˆ
ô ! §¡¬d´3°u·±È
Ó3SÓ.TÓUˆØ×/Ñ/°
¸KÓHÐHùòo Gs   Á&Lc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rf   r  r9   r~  r;   Úwriting_noder¦  ri   r”   rk   )rl   s   "rm   rn   rÖ  O"  s,   € ÷ ñ ØðØ 'ðØ7Jðà	ñro   c                	óv  € \        V\        P                  4      '       g   R # VP                  4       '       g   R # V P                  P                  VP                  VP                  4      pV P                  P                  VP                  VP                  4      p\        V\        4      '       d	   WE8X  d   R# R # ©FT)rs   r1   r2  r3  r¥  r  rt   r;   )r�   r  r~  ré  Ú	read_namer³  s   &&&&  rm   r¯  Ú8Scheduler.fusable_stardep_write_and_read_on_empty_tensorO"  s„   € ô ˜,¬×(BÑ(B×CÒCÙØ×-Ñ-×/Ò/ÙØ×)Ñ)×-Ñ-¨d¯i©i¸¿¹ÓCˆ	Ø×*Ñ*×.Ñ.¨u¯z©z¸5¿:¹:ÓFˆ
Ü�eœW×%Ò%¨)Ô*AÙÙro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Údep1r9   Údep2ri   r”   rk   )rl   s   "rm   rn   rÖ  ]"  s!   € ÷ 4ñ 4 Cð 4¨sð 4°tñ 4ro   c                ó(  € \        V \        4      '       d   \        V\        4      '       g   R# W8X  d   R# V P                  VP                  8X  d"   V P                  4       VP                  4       8H  # V P	                  4       VP	                  4       8H  # )zü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)rs   r:   rË  ru  rg  ©rï  rð  s   &&rm   r  ÚScheduler.deps_match_normalized\"  sr   € ô ˜$¤	×*Ò*´*¸TÄ9×2MÒ2MÙØŒ<ÙØ�=‰=˜DŸM™MÔ)à×0Ñ0Ó2°d×6VÑ6VÓ6XÑXðð �~‰~Ó 4§>¡>Ó#3Ñ3Ð3ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rw   r9   rö  r”   ri   rµ   rk   )rl   s   "rm   rn   rÖ  n"  s!   € ÷ ;ñ ; ð ;°4ð ;À3ñ ;ro   c                	ó@   € \         P                  P                  W4      # rr   )rd   ré   Úget_dep_size_hint)r�   rw   rö  s   &&&rm   rÔ  ÚScheduler.dep_size_hintn"  s   € Ü�w‰w×(Ñ(¨Ó:Ð:ro   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rf   rH  r   rO  rö  r”   rg  r[  ri   rµ   rk   )rl   s   "rm   rn   rÖ  q"  s<   € ÷ (ñ (à#ð(ð $ð(ð ð	(ð
 %;ð(ð 
ñ(ro   c           
     ó¼  € VP                  4       VP                  ,          '       g   ^ # \        VP                  P                  4      p\        4       p^ pVP                  P                   Fí  p\        V\        4      '       g   K  V P                  P                  VP                  VP                  4      p	\        V4       F“  w  r«W¦9   d   K  T P                  VP                  V P                  4      TVRJ;'       d    W”9   R7      '       g   KP  VP                  V
4       V\!        V P#                  W³4      V P#                  Wƒ4      4      ,          p Kë  	  Kï  	  V# )a  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.
Nrª  )r<  r;  rÈ   r  r  r   rÖ  rs   r:   r¥  r  rt   r³  r®  r  rS  rž  rÔ  )r�   rH  rO  rö  rg  r  Úmatched_readsr¿  r~  r³  r°  r  s   &&&&&       rm   r±  Ú4Scheduler._score_fusion_memory_by_fusable_read_writeq"  s3  € ð ×,Ñ,Ó.°×1CÑ1C×CÔCÙä�X×)Ñ)×/Ñ/Ó0ˆÜ)3«ˆØˆØ×)Ñ)×0Ô0ˆEÜ˜e¤Y×/Ò/ÙØ×.Ñ.×2Ñ2°5·:±:¸u¿z¹zÓJˆJÜ$ UÖ+‘�ØÔ%ÙØ×.Ñ.Ø—K‘K × 5Ñ 5Ó6Øà2¸$Ð>÷ Eð EØ&ÑDð /÷ ô ð "×%Ñ% aÔ(ØœSØ×*Ñ*¨4Ó=Ø×*Ñ*¨5Ó>óõ �Eò ó! ,ñ	 1ð* ˆro   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rf   rª   r   r«   rå  r”   rg  r[  ri   rµ   rk   )rl   s   "rm   rn   rÖ  ›"  s<   € ÷ ñ à ðð !ðð $(ð	ð
 %;ðð 
ñro   c                	óÎ   € V P                  VVVR 7      p\        V\        4      '       g   \        R\	        V4       24      hV^ 8X  d   V'       d   V P                  VVVR7      pV# )rä  zexpected score to be int, got rƒ  )r÷  rs   rµ   rŽ   rÐ   r±  )r�   rª   r«   rå  rg  r¿  s   &&&&& rm   r‹  Ú+Scheduler._score_fusion_memory_for_can_fuse›"  sx   € ð ×(Ñ(ØØØ&?ð )ó 
ˆô
 ˜%¤×%Ò%Ü Ð#AÄ$ÀuÃ+ÀÐ!OÓPÐPØ�AŒ:×4Ø×CÑCØØØ+Eð Dó ˆEð
 ˆro   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rf   rª   r   r«   rö  r”   Úreturn_is_mix_order_reductionzLiteral[False]rå  ri   rµ   rk   )rl   s   "rm   rn   rÖ  ²"  sF   € ÷ ñ à ðð !ðð ð	ð
 (6ðð $(ðð 
ñro   c                	ó   € R # rr   rk   ©r�   rª   r«   rö  r   rå  s   &&&&&&rm   r÷  ÚScheduler.score_fusion_memory±"  s   € ñ ro   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rf   rª   r   r«   rö  r”   r   zLiteral[True]rå  ri   ztuple[int, int, bool]rk   )rl   s   "rm   rn   rÖ  ¼"  sF   € ÷ $ñ $à ð$ð !ð$ð ð	$ð
 (5ð$ð $(ð$ð 
ñ$ro   c                	ó   € R # rr   rk   r  s   &&&&&&rm   r÷  r  »"  s   € ñ !$ro   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
rf   rª   r   r«   rö  r”   r   rå  ri   zint | tuple[int, int, bool]rk   )rl   s   "rm   rn   rÖ  Å"  sV   € ÷ ^Kñ ^Kà ð^Kð !ð^Kð ð	^Kð
 (,ð^Kð $(ð^Kð 
%ñ^Kro   c           	     ó  a aa€ V3R lpV'       d;   \         P                  W4      '       d    \         P                  W4      pV! V^ R4      # \        VP                  \
        P                  4      '       d!   VP                  P                  4       '       g-   VP                  4       '       g   VP                  4       '       dÈ   VP                  P                  VP                  P                  ,          pVP                  P                  VP                  P                  ,          p	R R lp
^ pV FM  pV	 FD  pV
! W¼4      '       g   K  V\        S P                  V4      S P                  V4      4      ,          pKF  	  KO  	  V! V^ R4      # VP                  P                  VP                  P                  ,          pVP                  P                  VP                  P                  ,          p	\        V4      \        V	4      8”  d   Y˜r˜V Uu. uF  qÝV	9   g   K  VNK  	  pp\        VV 3R lV 4       4      pV'       d   V! V^ R4      # ^ pV^ 8X  d)   S P!                  W4      '       d   S P#                  W4      pV! WR4      # u upi )aÊ  
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                ó,   <€ S'       d   WV3# W,           # rr   rk   )r¿  Úbuffer_overlap_scoreÚis_mix_order_reductionr   s   &&&€rm   Ú_construct_return_valueÚ>Scheduler.score_fusion_memory.<locals>._construct_return_valueÞ"  s   ø€ ÷ -ØÐ5KÐLÐLØÕ/Ð/ro   Tc               ó    € V ^8„  d   QhRRRR/# )rf   rï  r9   rð  rk   )rl   s   "rm   rn   Ú3Scheduler.score_fusion_memory.<locals>.__annotate__þ"  s   € ÷ ñ ˜Sð ¨ñ ro   c                ó¸   € W8X  d   R # \        V \        \        34      '       d6   \        V\        \        34      '       d   V P                  VP                  8H  # R# rk  )rs   r;   r:   rt   rò  s   &&rm   Ú_matchÚ-Scheduler.score_fusion_memory.<locals>._matchþ"  sJ   € Ø”<ÙÜ˜d¤W¬iÐ$8×9Ò9¼jØœ7¤IÐ.÷?ò ?ð  Ÿ9™9¨¯	©	Ñ1Ð1Ùro   Fc              3  óH   <"  € T F  pSP                  VS4      x € K  	  R # 5irr   ©rÔ  )rv   rw   rö  r�   s   & €€rm   rx   Ú0Scheduler.score_fusion_memory.<locals>.<genexpr>#  s#   øé € ÐWÑDV¸S�D×&Ñ& s¨K×8Ð8ÓDVùr  )rÔ   rI  r(  rs   r¸   r1   r2  r3  rÏ  r  r  rÖ  rž  rÔ  r÷   r5  Ú_can_use_buffer_overlap_scoringÚ&_score_fusion_memory_by_buffer_overlap)r�   rª   r«   rö  r   rå  r  r¿  Ú
node1_depsÚ
node2_depsr  Ú	node1_depÚ	node2_deprw   Úcommon_memory_depsr	  s   f&&ff&          rm   r÷  r  Å"  s  ú€ õ2	0÷ %Ô):×)CÑ)CÀE×)QÒ)Qô
 &×6Ñ6°uÓDˆEÙ*¨5°!°TÓ:Ð:ô ˜5Ÿ:™:¤r×'AÑ'A×BÒBØ—J‘J×0Ñ0×2Ò2à× Ñ ×"Ò"Ø× Ñ ×"Ò"à×*Ñ*×0Ñ0°5×3DÑ3D×3KÑ3KÕKˆJØ×*Ñ*×0Ñ0°5×3DÑ3D×3KÑ3KÕKˆJõð ˆEÛ'�	Û!+�IÙ˜i×3Ô3Ø¤Ø ×.Ñ.¨yÓ9¸4×;MÑ;MÈiÓ;Xó"õ šó ",ñ (ñ +¨5°!°UÓ;Ð;à×&Ñ&×,Ñ,¨u×/@Ñ/@×/GÑ/GÕGˆ
Ø×&Ñ&×,Ñ,¨u×/@Ñ/@×/GÑ/GÕGˆ
Üˆz‹?œS ›_Ô,Ø%/˜
á-7ÓM©Z cÀ*Ñ;LŸc˜c©ZÐÐMÜÕWÑDVÓWÓWˆßÙ*¨5°!°UÓ;Ð;ð  !ÐØ�AŒ:˜$×>Ñ>¸u×LÒLØ#'×#NÑ#NØó$Ð ñ ' uÀEÓJÐJùò Ns   È
JÈJc               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rÖ  %#  s-   € ÷ dñ dà ðdð !ðdð 
ñ	dro   c                ó¾  € VP                  4       '       g   VP                  4       '       d   R# VP                  4       '       g   VP                  4       '       d   R# \        P                  '       g   \        P                  '       EdÔ   VP                  4       pVP                  4       pV'       d	   V'       g   R# \        R V 4       4      p\        R V 4       4      p\        4       pV EF  pVP                   Fú  p	\        V	P                  \        4      '       g   K%  V	P                  P                  4       '       g   KG  \        V	P                  4      '       g   Kd  V	P                  P                  4       p
V
e^   \        V
\        P                  4      '       d>   V
P                  4       pW[,          '       d   VP!                  V	P                  4       KÝ  Kß  VP!                  V	P                  4       Kü  	  EK  	  V'       dØ   V FÑ  pVP                   F¾  p	\        V	P                  \        4      '       g   K%  V	P                  P                  4       '       g   KG  V	P                  V9   g   KZ  V	P                  P                  4       p
V
eE   \        V
\        P                  4      '       d%   V
P                  4       pWk,          '       d     R# K¼    R# 	  KÓ  	  W3 Fx  pVP"                  P$                   F[  pV P&                  P)                  VP*                  4      pVf   K.  VP                  4       '       g   KF  \-        V4      '       g   KY    R# 	  Kz  	  R# )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  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r  r  s   & rm   rx   Ú<Scheduler._can_use_buffer_overlap_scoring.<locals>.<genexpr>L#  ó   é € Ð+TÁm¸s¯L©L¯N¨NÃmùr‡  c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irr   r  r  s   & rm   rx   r  M#  r   r‡  )rÛ   rÏ  r.   r(	  r'	  r½  r   r?  rs   r¸   r   rŽ  r£  r1   r‡  rˆ  rS  r  r  rs  r  rt   rx  )r�   rª   r«   Únode1_outputsÚnode2_outputsÚnode1_output_namesÚnode2_output_namesÚ&node1_prologue_eligible_template_usersrÿ   rb  r¶  Úallowed_inpsr¸   rw   rH  s   &&&            rm   r  Ú)Scheduler._can_use_buffer_overlap_scoring%#  s�  € ð4 ×Ñ×Ò 5×#5Ñ#5×#7Ò#7ÙØ×Ñ×Ò %×"3Ñ"3×"5Ò"5Ùä××Ð¤&×":×":Ñ":Ø!×-Ñ-Ó/ˆMØ!×-Ñ-Ó/ˆM÷ !¯Ùä!+Ñ+TÁmÓ+TÓ!TÐÜ!+Ñ+TÁmÓ+TÓ!TÐô
 “ð 3ô %�ØŸIœI�Dä" 4§9¡9Ô.?×@Ô@Ø ŸI™I×1Ñ1×3Ô3Ü7¸¿	¹	×BÔBð
 )-¯	©	×(CÑ(CÓ(E˜Ø(Ò4¼Ø)¬2×+BÑ+B÷:ò :ð ,9×+RÑ+RÓ+T˜LØ1×@Ô@Ø F× JÑ JÈ4Ï9É9Ö Uñ  Að C×FÑFÀtÇyÁyÖQô% &ñ %÷. 6Û(�CØ #§	¤	˜ä& t§y¡yÔ2C×DÔDØ $§	¡	× 5Ñ 5× 7Ô 7Ø $§	¡	Ð-SÖ Sð -1¯I©I×,GÑ,GÓ,I˜MØ,Ò8¼ZØ -¬r×/FÑ/F÷>ò >ð 0=×/VÑ/VÓ/X Ø#5×#DÔ#DÛ+0ñ $Eó (-ó! !*ñ )ð& ›�Ø×+Ñ+×1Ô1�CØ#×6Ñ6×:Ñ:¸3¿8¹8ÓD�Hà Ô,Ø$×0Ñ0×2Ô2Ü7¸×AÔAã$ó 2ñ 'ñ ro   c               ó$   € V ^8„  d   QhRRRRRR/# r&  rk   )rl   s   "rm   rn   rÖ  ‹#  s)   € ÷ R
ñ R
Ø&ðR
Ø/@ðR
à	ñR
ro   c                óª  a aaa€ ^
oR VV 3R llo\        R VP                  P                   4       4      p\        R VP                  P                   4       4      pW4,          oS'       g   ^ # \        V3R lVP                  P                   4       4      p\        V3R lVP                  P                   4       4      p\	        WV4      pV^ 8X  d   ^ # \        VV3R lVP                  P                   4       4      p\        VV3R lVP                  P                   4       4      p	\	        W‰4      p
W§,          pV\
        P                  8¼  d   V
# ^ # )	a�  
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
c               ó    € V ^8„  d   QhRRRR/# )rf   rw   r9   ri   rµ   rk   )rl   s   "rm   rn   ÚFScheduler._score_fusion_memory_by_buffer_overlap.<locals>.__annotate__«#  s   € ÷ 	;ñ 	;˜cð 	; cñ 	;ro   c                ó<   <€ SP                  V 4      pV^ 8”  d   V# S# r  r  )rw   r  ÚFALLBACK_DEP_SIZEr�   s   & €€rm   Úget_dep_sizeÚFScheduler._score_fusion_memory_by_buffer_overlap.<locals>.get_dep_size«#  s%   ø€ Ø×%Ñ% cÓ*ˆDØ !œ8�4Ð:Ð):Ð:ro   c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   ÚCScheduler._score_fusion_memory_by_buffer_overlap.<locals>.<genexpr>¯#  rY  r	  c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   r2  °#  rY  r	  c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5irr   rk   ©rv   rw   r/  s   & €rm   rx   r2  ¹#  ó   øé € ð $
Ù)@ #‰L˜×ÐÓ)@ùr1
  c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5irr   rk   r5  s   & €rm   rx   r2  ¼#  r6  r1
  c              3  óZ   <"  € T F   pVP                   S9   g   K  S! V4      x € K"  	  R # 5irr   r  ©rv   rw   r  r/  s   & €€rm   rx   r2  Ç#  ó.   øé € ð %
á.�Ø�x‰x˜<Ñ'ô ‰L˜×ÐÛ.ùó   ƒ+›+c              3  óZ   <"  € T F   pVP                   S9   g   K  S! V4      x € K"  	  R # 5irr   r  r9  s   & €€rm   rx   r2  Ì#  r:  r;  )r   r  r  r5  rž  r.   Úmin_overlap_ratio)r�   rª   r«   Únode1_read_namesra  Ú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   f&&         @@@rm   r  Ú0Scheduler._score_fusion_memory_by_buffer_overlap‹#  sJ  û€ ð< Ð÷	;ñ 	;ô &Ñ%R¸%×:KÑ:K×:QÒ:QÓ%RÓRÐÜ%Ñ%R¸%×:KÑ:K×:QÒ:QÓ%RÓRÐð (Õ:ˆçÙô !$ô $
Ø).×):Ñ):×)@Ò)@ó$
ó !
Ðô !$ô $
Ø).×):Ñ):×)@Ò)@ó$
ó !
Ðô "Ð"7ÓOÐØ !Ô#Ùô
 "%õ %
à×(Ñ(×.Ò.ó%
ó "
Ðô
 "%õ %
à×(Ñ(×.Ò.ó%
ó "
Ðô #&Ð&<Ó"UÐð 0ÕEˆð
 (5¼×8PÑ8PÔ'PÐ#ð	
ØVWð	
ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r—  r}  ri   rk   )rl   s   "rm   rn   rÖ  ß#  s   € ÷ $6ñ $6Ø Qð$6à	:ñ$6ro   c                	ó   € \        V4      ^ 8X  d   V# / pV F’  w  r4VP                  4       VP                  4       8w  d   \        R4      hVP                  4       p\        V P	                  V4      P                  W44      4      pWb9  d	   W43.W&&   Kz  W&,          P                  W434       K”  	  \        VP                  4       \        P                  ! ^ 4      R7      ^,          p\        V4      ^ 8:  d   \        R4      hV# )r   z1expected node1 and node2 to be on the same devicer  z;expected at least one possible fusion with highest priority)r÷   rÏ   rŽ   rµ   rj  Úget_fusion_pair_priorityr  rŸ  r#  rM  rN  )r�   r—  Ú"possible_fusions_group_by_priorityrª   r«   r¹  Úfusion_pair_priorityÚ&possible_fusions_with_highest_prioritys   &&      rm   r   Ú4Scheduler.get_possible_fusions_with_highest_priorityß#  s  € ô
 ÐÓ  AÔ%Ø#Ð#ð ð 	+ó -‰LˆEØ×ÑÓ! U×%5Ñ%5Ó%7Ô7Ü$ØGóð ð ×%Ñ%Ó'ˆFÜ#&Ø× Ñ  Ó(×AÑAÀ%ÓOó$Ð ð $ÔMà�NðLÐ2ÓHð 3ÕH×OÑOØ�Nöñ -ô$ 25Ø.×4Ñ4Ó6¼H×<OÒ<OÐPQÓ<Rô2
à
õ2Ð.ô Ð5Ó6¸!Ô;Ü ØMóð ð 6Ð5ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¼  r­   ri   r   rk   )rl   s   "rm   rn   rÖ  $  s   € ÷ 4ñ 4Ø@ð4à	ñ4ro   c                óF   € \         P                  P                  ! V .VO5!  # )z
Shim for list.sort(key=...)
)rd   r³
  Úscore_fusionrÙ  s   &&rm   r!  ÚScheduler.score_fusion_key$  s   € ô �y‰y×%Ò% dÐ3¨UÓ3Ð3ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  $  s   € ÷ 	8ñ 	8 Dñ 	8ro   c                óø   € \        \        P                  P                  4       4      p\	        V P
                  4       F9  pVP                  WP                  4       VP                  VP                  4       K;  	  R# )zW
Populate node.last_usage recursively (also for the nodes within a FusedSchedulerNode)
N)
r   rd   ré   r.	  rù   r¼  r<  r4  r’  rž  )r�   r3  r¸   s   &  rm   r?	  ÚScheduler.compute_last_usage$  sV   € ô
 )¬¯©×)AÑ)AÓ)CÓDÐä˜TŸZ™ZÖ(ˆDØ×ÑÐ 3×5LÑ5LÔMØ×&Ñ& t§¡Ö7ó )ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  $  s   € ÷ *ñ *˜dñ *ro   c                óh  € \        V P                  \        P                  P                  ,
          \        P                  P
                  P                  ,
          4       EFµ  pWP                  9   da   V P                  V,          pVP                  4       '       d6   \        P                  P
                  P                  VP                  4       Kr  Kt  V\        P                  P                  9   g   K•  \        P                  P                  V,          p\        V\        P                  4      '       d-   \        P                  P
                  P                  V4       EK  \        V\        P                  \        P                   34      '       d   EK5  VP"                  p\        V\        P$                  4      '       d   VP'                  4       '       g   \)        R4      h\        P                  P
                  P                  VP"                  4       EK¸  	  V P                  P+                  4        R# )z*Free any buffers that are no longer neededz4expected storage to be an ir.StorageBox input bufferN)r  rE	  rd   ré   rû  ru  Úfreedr{  r…  Úcodegen_freer¸   rh  rs   r1   r[  rÆ  rÇ  r/  r»
  Úis_input_bufferrŽ   r}	  )r�   rt   rÿ   r¥
  Ústorages   &    rm   Úfree_buffersÚScheduler.free_buffers$  sj  € äØ×%Ñ%Ü�g‰g×%Ñ%õ&ä�g‰g×"Ñ"×(Ñ(õ)÷
ˆDð
 ×'Ñ'Ô'Ø×&Ñ& tÕ,�Ø—<‘<—>’>Ü—G‘G×(Ñ(×5Ñ5°c·h±hÖ?ñ "àœŸ™×-Ñ-Ö-Ü—g‘g×*Ñ*¨4Õ0�Ü˜c¤2×#5Ñ#5×6Ò6Ü—G‘G×(Ñ(×5Ñ5°c×:Ü ¤b×&7Ñ&7¼×9MÑ9MÐ%N×OÒOÚà!Ÿh™h�Gä" 7¬B¯M©M×:Ò:¸w×?VÑ?V×?XÒ?Xä,ØRóð ô —G‘G×(Ñ(×5Ñ5°g·l±l×Cñ/
ð2 	×!Ñ!×'Ñ'Ö)ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  5$  s   € ÷ ñ �tñ ro   c                	óˆ   € V P                   P                  4        F  pVP                  4        K  	  V P                  4        R # rr   )r	  r	  Úflushr[  )r�   r  s   & rm   r_  ÚScheduler.flush5$  s.   € Ø—}‘}×+Ñ+Ö-ˆGØ�M‰MŽOñ .à×ÑÖro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úscheduler_noder   ri   rl  rk   )rl   s   "rm   rn   rÖ  :$  s   € ÷ ñ à)ðð 
ñro   c                	óÎ  € \        V\        \        34      '       g   \        R 4      h\        R,          R;;,          ^,          uu&   \
        P                  ! \        RR7      4      ;_uu_ 4        VP                  4        VP                  4        RRR4       VP                  \
        P                  P                  4       V P                  4        R#   + '       g   i     LK; i)zMexpected an ExternKernelSchedulerNode or FusedExternTritonKernelSchedulerNoderq  Úextern_callsF)Úincrease_kernel_countN)rs   rb  r   rŽ   r   rd   Úset_kernel_handlerr6   r
  r@  rø  ré   ru  r[  )r�   rb  s   &&rm   Úcodegen_extern_callÚScheduler.codegen_extern_call:$  sª   € ô ØÜ&Ô(LÐM÷
ò 
ô !Ø_óð ô 	�Õ˜^×,°Õ1Ó,Ü×!Ò!¤&¸uÔ"E×FÕFØ×0Ñ0Ô2Ø×#Ñ#Ô%÷ Gð 	×ÑœqŸw™w×3Ñ3Ô4Ø×ÑÖ÷	 G×Fús   Á0!CÃC$	c               ó    € V ^8„  d   QhRRRR/# )rf   r¹  r»  ri   ÚBaseSchedulingrk   )rl   s   "rm   rn   rÖ  P$  s   € ÷ 'ñ ' \ð '°nñ 'ro   c                	ó”  € \        VP                  4      '       d   VP                  f   \        V R24      h\        P
                  P                  V4       \        VP                  4      pVf   \        RVP                   24      h\        4       '       g«   VP                  R8X  dP   \        P                  P                  V4      ;pP                  ^8  d    \        V\        P                   ! 4       4      h\        VP                  4      '       d0   VP                  R8X  g   \#        \        P                   ! 4       4      hV! V 4      # )Nz( should have been normalized in loweringzUnsupported device type: rÍ   r”  )r^   rÐ   r  rŽ   rd   ré   Úadd_device_infor5   rU
  r,   rê  rÍ   Úget_device_propertiesÚmajorr=   ÚinspectÚcurrentframer>   )r�   r¹  Údevice_schedulingr5  s   &&  rm   Úcreate_backendÚScheduler.create_backendP$  sð   € Ü�&—+‘+×Ò 6§<¡<Ò#7Ü  F 8Ð+SÐ!TÓUÐUÜ	�‰×Ñ Ô'ä5°f·k±kÓBÐØÒ$ÜÐ!:¸6¿;¹;¸-ÐHÓIÐIä�|Š|à—‘˜vÔ%Ü%*§Z¡Z×%EÑ%EÀfÓ%MÐM�\×TÑTÐWXÔXä(¨´w×7KÒ7KÓ7MÓNÐNÜ˜Ÿ™×$Ò$¨V¯[©[¸EÔ-AÜ#¤G×$8Ò$8Ó$:Ó;Ð;á  Ó&Ð&ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¹  r˜  ri   rj  rk   )rl   s   "rm   rn   rÖ  d$  s   € ÷ %ñ %Ð"5ð %¸.ñ %ro   c                	ó¢   € Vf   \        R4      hWP                  9  d   V P                  V4      V P                  V&   V P                  V,          # )Nrr  )rŽ   r	  rr  r¸  s   &&rm   rj  ÚScheduler.get_backendd$  sE   € ØŠ>Ü Ð!<Ó=Ð=ØŸ™Ô&Ø$(×$7Ñ$7¸Ó$?ˆD�M‰M˜&Ñ!Ø�}‰}˜VÕ$Ð$ro   c               ó    € V ^8„  d   QhRRRR/# ©rf   r¸   r   ri   rl  rk   )rl   s   "rm   rn   rÖ  k$  s   € ÷ 5ñ 5Ð"3ð 5¸ñ 5ro   c                	óº  a € R  V 3R llpVP                  4        UUu/ uF?  pVP                  f   K  VP                  P                  4        F  pV! V4      V3RbK  	  KA  	  ppp\        VP	                  4       4      pV'       dO   \        V\        P                  ! ^ 4      R7      w  rg\        P                  P                  P                  V4       R# R# u uppi )c               ó    € V ^8„  d   QhRRRR/# )rf   r–  ztorch.fx.Noderi   rµ   rk   )rl   s   "rm   rn   Ú-Scheduler.enter_context.<locals>.__annotate__l$  s   € ÷ 	+ñ 	+˜ð 	+¨3ñ 	+ro   c                óð   <€ V SP                   9  dM   SP                   P                  \        V P                  P                  4       UU u/ uF  w  rWbK	  	  up p4       SP                   X ,          # u up pi rr   )rF	  r’  r³  ré   r¼  )r–  r°  r�   s   & €rm   Ú	get_orderÚ*Scheduler.enter_context.<locals>.get_orderl$  s^   ø€ Ø˜×,Ñ,Ô,Ø×$Ñ$×+Ñ+¼iÈÏÉÏÉÔ>VÔ,WÑ>V±d°a¨QªTÑ>VÒ,WÔXØ×'Ñ'¨Õ*Ð*ùó -Xs   Á
A2
Nr  )rá   r¸   r  rÈ   rb  rž  rM  rN  rd   ré   ru  Úenter_context)r�   r¸   r}  r–  rf  r  r~  Úlasts   f&      rm   r  ÚScheduler.enter_contextk$  s¾   ø€ ÷	+ð 	+ð —^‘^Ô%ô
á%�Ø�v‰vô ð —V‘V×'Ñ'Ö)�ñ �q‹\˜1Ð˜tÒ#ñ *ñ Ù%ð 	ñ 
ô �w—|‘|“~Ó&ˆßÜ˜'¤x×':Ò':¸1Ó'=Ô>‰GˆAÜ�G‰G× Ñ ×.Ñ.¨tÖ4ñ ùó
s
   žC³0Cc               ó$   € V ^8„  d   QhRRRRRR/# )rf   rt   r   r_  rj   ri   r”   rk   )rl   s   "rm   rn   rÖ  }$  s$   € ÷ 
ñ 
Øð
Ø+:ð
à	ñ
ro   c                	ó0  a€  V P                   V,          P                  p\        ;QJ d    T3R lT 4       F  '       d   K   R M	  RM! T3R lT 4       4      ;'       d%    YP                  9  ;'       d    YP
                  9  #   \         d     R # i ; i)Fc              3  óp   <"  € T F+  qP                   ;'       g    VP                  4       S9   x € K-  	  R # 5irr   )rK  rE  )rv   rb  r_  s   & €rm   rx   ÚAScheduler.can_buffer_be_removed_through_fusion.<locals>.<genexpr>…$  s,   øé € ÐVÑPUÈ—‘×CÐC §¡£Ð3CÑ CÔCÓPUùs   ƒ6š6T)r{  r?  ÚKeyErrorrà   r¥  r4  )r�   rt   r_  r?  s   &&f rm   r^  Ú.Scheduler.can_buffer_be_removed_through_fusion}$  s…   ø€ ð	Ø×$Ñ$ TÕ*×0Ñ0ˆE÷ ‹CÔVÑPUÓV�C�CŠCÔVÑPUÓVÓV÷ 4ð 4Ø×1Ñ1Ñ1÷4ð 4à×3Ñ3Ñ3ð	
øô ô 	Úð	ús   ƒB ÂBÂBc               ó    € V ^8„  d   QhRRRR/# ©rf   r¸   r   ri   r8
  rk   )rl   s   "rm   rn   rÖ  Š$  s   € ÷ ?ñ ?Ð%6ð ?¸:ñ ?ro   c                óø  € VP                   p\        V\        P                  P                  P
                  4      '       d†   VP                  ;p'       dr   \        V4      w  rEV\        P                  9   g   V\        P                  9   d;   \        V\        P                  P                  4      '       g   \        R4      hRV 2# \        P                  P                  P                  P                  '       g   \        P                   f   R# \        V\"        4      '       d3   VP$                   F   pV P'                  V4      pV'       g   K  Vu # 	  R# VP                   f   \        R4      hVP)                  4       '       g   VP+                  4        R2# \        VP                   \        P,                  4      '       d   R# \        VP                   \        P.                  4      '       d   R# \1        VP                   R	R4      '       d   R
# \3        VP                   4      '       d   R# V P5                  V4      ;p'       d   V# \        P                  P6                  '       d   \9        V4      '       d   R# R# )zr
Return the reason why we should partition the inductor graph on this node,
or None if the node is cudagraphable.
z)expected op to be a torch._ops.OpOverloadzcustom partition op: Nz6partition includes all ops when cudagraphs is disabledrk  z opszDeviceCopy opsz
Switch opsÚunbacked_bindingszunbacked binding opszCUDAGraph-unsafe custom opszdynamic shape ops)r¸   rs   rê  rë  r1   r  rc  rY   r.   Úcustom_should_partition_opsrÙ  rÚ  rŽ   rÌ   r~   rO   rK  r  r  Úshould_partitionr^   rÏ   Ú
DeviceCopyrI
  r   r]   Ú&_uses_cudagraph_unsafe_unbacked_symintÚcudagraph_skip_dynamic_graphsri  )r�   r¸   rm  rF  Úop_overload_packet_nameÚop_overload_namerÀ  rò  s   &&      rm   r�  ÚScheduler.should_partitionŠ$  sÌ  € ð —)‘)ˆÜ�gœuŸ™×1Ñ1×@Ñ@×AÒAØ×%Ñ%Ð%ˆBÖ%ä8DÀRÓ8HÑ5Ð#à'¬6×+MÑ+MÔMØ#¤v×'IÑ'IÔIä! "¤e§j¡j×&;Ñ&;×<Ò<Ü(Ð)TÓUÐUØ.Ð/?Ð.@ÐAÐAô —‘×&Ñ&×-Ñ-×8×8Ð8Ü6×>Ñ>ÒFáKä�dÔ.×/Ò/ØŸœ�Ø×.Ñ.¨uÓ5�ß‘6Ø!’Mñ %ñ à�9‰9ÒÜ Ð!?Ó@Ð@à�{‰{�}Š}Ø—o‘oÓ'Ð(¨Ð-Ð-ä�d—i‘i¤§¡×/Ò/Ù#ä�d—i‘i¤§¡×+Ò+Ùä�4—9‘9Ð1°4×8Ò8Ù)ä! $§)¡)×,Ò,Ù0à×@Ñ@ÀÓFÐFˆ6ÖFØˆMô �=‰=×6×6Ð6Ü-¨d×3Ò3Ù*áro   c               ó   € V ^8„  d   QhRR/# )rf   ri   r]  rk   )rl   s   "rm   rn   rÖ  Ì$  s   € ÷ !ñ !Ð8Pñ !ro   c                ó   € \        4       p\        P                  '       g   V# V P                   EF  pVP                  pVf   K  \        V\        P                  P                  P                  4      '       g   KL  VP                  pVf   K^  \        V4      w  rVV\        P                  9  d   V\        P                  9  d   K—  VP                  4        Fo  p\        P                  P                  P!                  V4      p\#        V\$        P&                  \$        P(                  34      '       g   K^  VP+                  V4       Kq  	  EK  	  V# )zS
Collect output unbacked symints from ops in config.cudagraph_unsafe_unbacked_ops.
)r   r.   Úcudagraph_unsafe_unbacked_opsr¼  r¸   rs   rê  rë  r1   r  rc  rY   rã	  rd   ré   rê   rë   r*   r+   ÚUNBACKED_INTÚUNBACKED_FLOATrS  )r�   Úunsafe_symintsr¸   rm  rF  r‘  r’  Úsyms   &       rm   Ú&_get_cudagraph_unsafe_unbacked_symintsÚ0Scheduler._get_cudagraph_unsafe_unbacked_symintsË$  sý   € ô
 4>³<ˆä×3×3Ð3Ø!Ð!à—J•JˆDØ—i‘iˆGØŠÙä˜g¤u§¡×'9Ñ'9×'HÑ'H×IÒIÙà×$Ñ$ˆBØŠzÙä8DÀRÓ8HÑ5Ð#à'¬v×/SÑ/SÔSØ$¬F×,PÑ,PÔPáà×7Ñ7Ö9�Ü—g‘g×&Ñ&×/Ñ/°Ó4�Ü! #¬×(9Ñ(9¼4×;NÑ;NÐ'O×PÔPØ"×&Ñ& sÖ+ô :ñ' ð0 Ðro   c               ó    € V ^8„  d   QhRRRR/# r‰  rk   )rl   s   "rm   rn   rÖ  ï$  s   € ÷ ñ Ø%ðà	ñro   c                	óø   € V P                  4       pV'       g   R # \        V4      pV FN  p\        P                  P                  P                  V4      pVP                   F  pWb9   g   K  RV 2u u # 	  KP  	  R # )Nz'uses cudagraph-unsafe unbacked symint: )r›  ri  rd   ré   rê   rë   r'   )r�   r¸   r™  Únode_symbolsrš  Úsimplified_symÚfree_syms   &&     rm   r�  Ú0Scheduler._uses_cudagraph_unsafe_unbacked_symintï$  sn   € ð ×DÑDÓFˆßÙä5°dÓ;ˆãˆCÜŸW™W×-Ñ-×6Ñ6°sÓ;ˆNØ*×7Ô7�ØÖ-ØDÀXÀJÐOÔOó 8ñ  ñ ro   c               ó   € V ^8„  d   QhRR/# )rf   ri   ú6dict[str, ir.IRNode | ir.TorchBindObject | sympy.Expr]rk   )rl   s   "rm   rn   rÖ   %  s   € ÷ ñ à	?ñro   c                óä   € / pVP                  \        P                  P                  4       V P                   F4  pVP
                  P                  4        F  w  r4VP                  W&   K  	  K6  	  V# )zf
Return a mapping from name strings to the corresponding graph inputs or
base scheduler node outputs.
)r’  rd   ré   rh  r¼  rª  r#  r¸   )r�   rR  r¸   rt   Úscheduler_buffers   &    rm   Úget_name_to_nodesÚScheduler.get_name_to_nodes %  sd   € ð PRˆØ×ÑœAŸG™G×0Ñ0Ô1à—J”JˆDØ*.×*>Ñ*>×*DÑ*DÖ*FÑ&�Ø%5×%:Ñ%:�Ó"ó +Gñ ð Ðro   c               ó    € V ^8„  d   QhRRRR/# )rf   Ú
signaturesúlist[GraphPartitionSignature]ri   rl  rk   )rl   s   "rm   rn   rÖ  %  s   € ÷ )ñ )à1ð)ð 
ñ)ro   c           	     ó  € \        \        P                  P                  4       UUu/ uF  w  r#W2bK	  	  ppp\	        \
        4      p\        \        P                  P                  4       4       F  w  r#WS,          P                  V4       K  	  . \        P                  n        \        V4       FÑ  w  rgVP                  '       d   K  . pVP                   F#  pVP                  VP                  V4      4       K%  	  . p	VP                   F2  p
V	P                  VP                  V
P                  4       . 4      4       K4  	  \        P                  P                  P                  \        VVV	VP                  4      4       KÓ  	  R# u uppi )zj
computes a mapping from partition input/output indices to graph input/output
indices for each partition.
N)r³  rd   ré   rh  r   rÈ   r.	  r  Úpartition_mapsÚskip_cudagraphÚinput_nodesr  Úoutput_nodesrE  rZ   Úconstant_names)r�   rª  r®  rt   Úname_to_graph_input_indexÚname_to_graph_output_indicesÚpartition_idÚ	signatureÚinput_mappingÚoutput_mappingr¸   s   &&         rm   Úcompute_graph_partition_mapsÚ&Scheduler.compute_graph_partition_maps%  sE  € ô (1´·±×1EÑ1EÔ'Fô%
Ù'F™)˜#ˆDŠIÑ'Fð 	"ñ %
ô >IÌÓ=NÐ$Ü"¤1§7¡7×#;Ñ#;Ó#=Ö>‰IˆCØ(Õ.×5Ñ5°cÖ:ñ ?ð "$Œ�‰ÔÜ'0°Ö'<Ñ#ˆLØ×'×'Ð'ñ
 àˆMØ!×-Ô-�Ø×$Ñ$Ð%>×%BÑ%BÀ4Ó%HÖIñ .ð  ˆNØ!×.Ô.�Ø×%Ñ%Ø0×4Ñ4°T·]±]³_ÀbÓIöñ /ô
 �G‰G×"Ñ"×)Ñ)Ü!Ø Ø!Ø"Ø×,Ñ,ó	öó% (=ùó%
s   §Fc               ó$   € V ^8„  d   QhRRRRRR/# )rf   Ú	partitionr€   r¯  r¤  ri   r]  rk   )rl   s   "rm   rn   rÖ  ;%  s3   € ÷ BHñ BHà ðBHð LðBHð 
"ñ	BHro   c                ó¼  a€ R R loR R lp\        4       P                  ! R V 4       !  pVP                  ! V3R lVP                  4        4       !   V! V4      p\        4       pV FG  p\        P
                  P                  P                  V4      pVP                  VP                  4       KI  	  \        \        V\        P                  ! R4      R7      4      # )	a9  
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.
c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   z+ir.IRNode | sympy.Expr | ir.TorchBindObjectri   r]  rk   )rl   s   "rm   rn   ÚAScheduler.get_graph_partition_symbol_inputs.<locals>.__annotate__H%  s    € ÷ 	Xñ 	XØ=ð	Xà%ñ	Xro   c                óÚ   € \        V \        P                  4      '       d   \        4       # \        V \        P                  4      '       d   \        V 4      # \        R\        V 4       24      h)z?
Gets symbols used in input node shapes, strides, and offsets.
zUnsupported input node type: )rs   r1   r[  r   r‡  rc  rÆ  rÐ   râ   s   &rm   Úget_input_node_symbolsÚKScheduler.get_graph_partition_symbol_inputs.<locals>.get_input_node_symbolsH%  sT   € ô ˜$¤× 2Ñ 2×3Ò3ä!“|Ð#Ü˜D¤"§)¡)×,Ò,Ü)¨$Ó/Ð/ô *Ð,IÌ$ÈtË*ÈÐ*VÓWÐWro   c               ó    € V ^8„  d   QhRRRR/# )rf   Úsymbolsr]  ri   rk   )rl   s   "rm   rn   r¾  X%  s   € ÷ 	ñ 	Ø-ð	à%ñ	ro   c                ó&   € \        R V  4       4      # )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  óÆ   "  € T FW  p\        V\        P                  \        P                  \        P                  \        P
                  34      '       g   KS  Vx € KY  	  R # 5irr   )r*   r+   ÚSIZEÚFLOATr—  r˜  ©rv   r>  s   & rm   rx   ÚVScheduler.get_graph_partition_symbol_inputs.<locals>.filter_symbols.<locals>.<genexpr>`%  sI   é € ð á �AÜ!ØäŸ	™	ÜŸ
™
Ü×)Ñ)Ü×+Ñ+ð	÷÷ ’Û ùs   ‚AA!Á
A!r   )rÃ  s   &rm   Úfilter_symbolsÚCScheduler.get_graph_partition_symbol_inputs.<locals>.filter_symbolsX%  s   € ô ñ á óó ð ro   c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irr   rh  r…  s   & rm   rx   Ú>Scheduler.get_graph_partition_symbol_inputs.<locals>.<genexpr>o%  s   é € ÐI¹y°tÔ,¨T×2Ð2»yùr	  c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5irr   rk   )rv   r¸   rÀ  s   & €rm   rx   rÍ  r%  s   øé € ÐLÑ7K¨tÑ$ T×*Ð*Ó7Kùr1
  rt   r  )r   r7  r’  r	  rd   ré   rê   rë   r'   r  rM  Ú
attrgetter)	r�   r»  r¯  rÊ  Úcandidate_symbolsr"  r>  Úsymplified_srÀ  s	   &&&     @rm   Ú!get_graph_partition_symbol_inputsÚ+Scheduler.get_graph_partition_symbol_inputs;%  s·   ø€ õ	Xõ 	ô, 7A³l×6HÒ6HÙI¹yÓIñ7
Ðð 	× Ò ÜL°{×7IÑ7IÔ7KÓLò	
ñ +Ð+<Ó=Ðä(2«ˆÛ"ˆAÜŸ7™7×+Ñ+×4Ñ4°QÓ7ˆLà�J‰J�|×0Ñ0Ö1ñ #ô
 œ& ¬(×*=Ò*=¸fÓ*EÔFÓGÐGro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   Ú
partitionsúlist[PartitionType]Úskip_cudagraphsz
list[bool]ri   r«  rk   )rl   s   "rm   rn   rÖ  %  s)   € ÷ D ñ D Ø-ðD Ø@JðD à	&ñD ro   c           	     óÐ  a a€ . p\        \        P                  P                  4       4      pS P	                  4       pR VV 3R llo\        \        V4      \        V4      4       EFP  w  rg\        4       pV F,  p	VP                  V	P                  P                  4       4       K.  	  VP                  V4      p
\        P                  P                  V U	u. uF  q™P                  NK  	  up	4      p\        VP                   VP"                  ,          4      V,
          p\        V 3R lV 4       4      p\        4       pV F  p	VP                  V	P$                  4       K   	  WØ,
           Uu. uF  pWå9   g   K  VNK  	  ppVP                  V4       V Uu/ uF  pWå9   g   K  WåV,          bK  	  ppV Uu/ uF  pWå9   g   K  WîV9   bK  	  ppV Uu. uF  pWå9   g   K  Wí9  g   K  VNK  	  ppV
P                  V4       \        V 3R lV
 4       4      p
V
 Uu. uF  pS! V4      '       d   K  W^,          NK  	  ppV Uu. uF%  qî\        P                  P&                  9   g   K#  VNK'  	  ppS P)                  VV4      p\+        VVVVVV4      pVP-                  V4       VP/                  WJ,
          4      pEKS  	  VRRR1,          # u up	i u upi u upi u upi u upi u upi u upi )z‰
Gets signature for each graph partition, including input nodes, output nodes, and
whether deallocating an input within graph partition.
c               ó    € V ^8„  d   QhRRRR/# )rf   r®  r   ri   r”   rk   )rl   s   "rm   rn   Ú=Scheduler.get_graph_partition_signature.<locals>.__annotate__‹%  s   € ÷ 	ñ 	¨Cð 	°Dñ 	ro   c                óü   <€ SP                   P                  V R4      pVf   R# \        VP                  P                  \
        4      '       d/   SP                  P                  V R4      ;p'       d	   S! V4      # R# R# )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  rs   r¸   r\  rE   r4  )r®  rÿ   r0  Úis_unallocated_bufferr�   s   &  €€rm   rÜ  ÚFScheduler.get_graph_partition_signature.<locals>.is_unallocated_buffer‹%  sk   ø€ ð ×"Ñ"×&Ñ& x°Ó6ˆCàŠ{Ùä˜#Ÿ(™(Ÿ/™/¬:×6Ò6ð !%× 7Ñ 7× ;Ñ ;¸HÀdÓ KÐK�9ÖKÙ0°Ó;Ð;ááro   c              3  óZ   <"  € T F   pSP                   P                  W4      x € K"  	  R # 5irr   ©r4  r  rS  s   & €rm   rx   Ú:Scheduler.get_graph_partition_signature.<locals>.<genexpr>·%  ó,   øé € ð /á1�Dð ×'Ñ'×+Ñ+¨D×7Ð7Û1ùr¾  c              3  óZ   <"  € T F   pSP                   P                  W4      x € K"  	  R # 5irr   rß  rS  s   & €rm   rx   rà  á%  rá  r¾  NrZ  )r   rd   ré   r.	  r§  r÷  rù   r’  rª  rb  rH  r0   r5  r6  r  rz   r  rÖ  rž  r	  rÒ  rB   r  r7  )r�   rÕ  r×  rª  Úunmet_output_namesrR  r»  r®  Úoutput_namesr¸   Úreturned_output_namesr  Úpartition_input_namesrE	  rt   Úextra_input_namesr¯  Úinput_deallocationÚextra_output_namesr°  r±  Úsymbol_inputsÚpartition_signaturerÜ  s   f&&                    @rm   Úget_graph_partition_signatureÚ'Scheduler.get_graph_partition_signature%  s,  ù€ ð ˆ
ä'¬¯©×(@Ñ(@Ó(BÓCÐØ×-Ñ-Ó/ˆ÷	ñ 	ô, *-Ü�ZÓ ¤(¨?Ó";÷*
Ñ%ˆIô -7«LˆLã!�Ø×#Ñ# D×$8Ñ$8×$=Ñ$=Ó$?Ö@ñ "ð %1×$=Ñ$=Ð>PÓ$QÐ!ô '×1Ñ1×<Ñ<Ù.7Ó8©i d×!Ô!©iÑ8óˆKô   × 1Ñ 1°K×4FÑ4FÕ FÓGÈ,ÕVð "ô %/ô /á1ó/ó %Ð!ô
 5?³LÐ Û!�Ø$×+Ñ+¨D¯O©OÖ<ñ "ð 2Ö@ó!á@�DØÑ'÷ �Ù@ð ð !ð
 "×(Ñ(Ð):Ô;ñ 2óá1�DØÑ'ô )� 4Õ(Ò(Ù1ð ð ñ 2ó"á1�DØÑ'ô 3�Ð2Ñ2Ò2Ù1ð ð "ñ 2ó"á1�DØÑ'ô à,0Ñ,L÷ �Ù1ð ð "ð "×(Ñ(Ð);Ô<ä$.ô /á1ó/ó %Ð!ñ 2óá1�DÙ,¨T×2ô #�×"Ð"Ù1ð ð ñ "7óÙ!6˜Ä!Ç'Á'×BSÑBSÑ:S—�Ñ!6ð ð ð !×BÑBØ˜;óˆMô #:ØØØØ"ØØó#Ðð ×ÑÐ1Ô2à!6×!<Ñ!<Ø"Õ:ó"Óñ}*
ðD ™$˜B˜$ÕÐùòk 9ùò*!ùòùò
"ùò"ùòùòsT   ÃK
Å)K
Å6K
ÆKÆ KÆ3KÇ 	KÇKÇKÇ$KÈKÈ+KÈ= K#É"K#c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rµ  rB   rû  rj   ri   rk   )rl   s   "rm   rn   rÖ  &  s(   € ÷ "
ñ "
à*ð"
ð )ð"
ð 
!ñ	"
ro   c                óô  € VP                   P                  4        UUu/ uF  w  r4W29  g   K  W4bK  	  pppVP                  P                  4        UUu/ uF  w  r6W29  g   K  W6bK  	  pppVP                   Uu. uF  pVP	                  4       V9  g   K  VNK  	  p	pVP
                   Uu. uF  q3V9  g   K  VNK  	  p
p\        VP                  VV	VVP                  V
4      # u uppi u uppi u upi u upi )z�
Updates the partition signature by removing buffers specified in
removed_buffers. See [Note: Removed Graph Partition Arguments]
)	r¯  r#  rè  r°  Úmaybe_get_namer±  rB   rê  r®  )r�   rµ  rû  rt   r  r¯  rñ	  rè  r¸   r°  r±  s   &&&        rm   Ú.clean_removed_buffer_from_partition_signaturesÚ8Scheduler.clean_removed_buffer_from_partition_signatures&  s$  € ð !*× 5Ñ 5× ;Ñ ;Ô =ô
á =‘�ØÑ*ô ˆDŠLÙ =ð 	ñ 
ð '×9Ñ9×?Ñ?ÔAô
áA‘	�ØÑ*ô ˆDŠIÙAð 	ñ 
ð "×.Ò.ó
á.�Ø×"Ñ"Ó$¨OÑ;÷ ˆDÙ.ð 	ð 
ð '×5Ò5ó
Ù5�TÀ_Ñ9T�DˆDÑ5ð 	ð 
ô 'Ø×#Ñ#ØØØØ×$Ñ$Øó
ð 	
ùó%
ùó

ùò

ùò

s.   ž
C$­C$Á
C*Á"C*Á9C0ÂC0Â+C5Â8C5c               ó    € V ^8„  d   QhRRRR/# r{  rk   )rl   s   "rm   rn   rÖ  )&  s"   € ÷ Bñ Bà&ðBð 
!ñBro   c                ó¢  a aa	a
aaa€ ^ RI o	\        4       o. o. o\        V4       UUu/ uF  w  r#W2bK	  	  uppoR VV	VVV 3R llo
R V
V3R llpV F=  p\        VP                  P
                  4      SV&   SV,          ^ 8X  g   K5  S
! V4       K?  	  . p^ pV\        V4      8  dˆ   S'       g	   S'       dx   S'       d/   S	P                  S4      w  rsVP                  V4       V! V4       K6  S'       d/   S	P                  S4      w  rsVP                  V4       V! V4       K6  V^,          pK—  V\        V4      8”  d   \        R4      hV# u uppi )ad  
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.
Nc               ó    € V ^8„  d   QhRRRR/# rx  rk   )rl   s   "rm   rn   Ú@Scheduler.reorder_for_minimizing_partition.<locals>.__annotate__<&  s   € ÷ 	Eñ 	EÐ'8ð 	E¸Tñ 	Ero   c                ó˜   <€ SV ,          V 3pSP                  V 4      '       d   SP                  SV4       R # SP                  SV4       R # rr   )r�  Úheappush)r¸   Únode_with_indexÚcudagraphable_nodesÚheapqÚnode_to_indexÚnon_cudagraphable_nodesr�   s   & €€€€€rm   Úinsert_pending_nodesÚHScheduler.reorder_for_minimizing_partition.<locals>.insert_pending_nodes<&  sA   ø€ Ø,¨TÕ2°DÐ9ˆOØ×$Ñ$ T×*Ò*Ø—‘Ð6¸ÖHà—‘Ð2°OÖDro   c               ó    € V ^8„  d   QhRRRR/# rx  rk   )rl   s   "rm   rn   rö  C&  s   € ÷ 	4ñ 	4Ð"3ð 	4¸ñ 	4ro   c                óâ   <€ V P                   P                   FS  pSV,          ^ 8:  d   \        RSV,           24      hSV;;,          ^,          uu&   SV,          ^ 8X  g   KK  S! V4       KU  	  R# )r   z expected positive indegree, got N)r£  Ú
succ_nodesrŽ   )r¸   Ú	succ_noderþ  Únode_to_indegrees   & €€rm   Úupdate_indegreeÚCScheduler.reorder_for_minimizing_partition.<locals>.update_indegreeC&  si   ø€ Ø!Ÿ]™]×5Ô5�	Ø# IÕ.°!Ô3Ü(Ø:Ð;KÈIÕ;VÐ:WÐXóð ð ! ×+¨qÕ0Ó+Ø# IÕ.°!Ö3Ù(¨Ö3ó 6ro   z’
                Failed to schedule, while loop ran too long when
                reordering for minimizing the num of partitions
                )	rû  rö  r³  r÷   r£  Ú
pred_nodesÚheappopr  rU
  )r�   r¼  r®  r¸   r  r	  Ú	num_itersr~  rú  rû  rþ  r  rü  rý  s   f&      @@@@@@rm   Ú reorder_for_minimizing_partitionÚ*Scheduler.reorder_for_minimizing_partition)&  s/  þ€ ó 	ä9=»ÐØCEÐØGIÐÜ4=¸eÔ4DÔEÑ4D¡y s˜šÑ4DÒEˆ÷	Eô 	E÷	4ñ 	4ó ˆDÜ%(¨¯©×)AÑ)AÓ%BÐ˜TÑ"Ø Õ%¨Ö*Ù$ TÖ*ñ ð
 -/ˆØˆ	Øœ#˜e›*Ô$ß#×':ç)ØŸ-™-Ð(?Ó@‘�Ø—‘ Ô%Ù Ö%ç%ØŸ-™-Ð(;Ó<‘�Ø—‘ Ô%Ù Ö%à˜�NŠIà”s˜5“zÔ!Üðóð ð ˆùóc Fs   ¨Ec               ó    € V ^8„  d   QhRRRR/# r{  rk   )rl   s   "rm   rn   rÖ  m&  s   € ÷ ñ à&ðð 
!ñro   c           	     óŽ  € ^RI HpHp \        \        P
                  P                  4       4      pV! VV P                  V P                  \        \        P
                  P                  P                  4       4      V4      w  rVV P                  V4      pV! WvV4      w  r‰VV\        P                  P                  ,          8  d   V# V# )z`
Reorder nodes to minimize the number of partitions if this only slightly
increase peak memory.
)Úestimate_peak_memoryÚprepare_planning_info)r-	  r  r  r   rd   ré   r.	  r{  rs  rh  rb  r
  r.   rÌ   Ú!cudagraph_partition_memory_budget)
r�   r¼  r  r  r½   Údefault_peak_memoryr"
  Úreordered_nodesÚreorder_peak_memoryr~  s
   &&        rm   r=	  Ú0Scheduler.maybe_reorder_for_minimizing_partitionm&  s¯   € ÷ 	Hä"¤1§7¡7×#;Ñ#;Ó#=Ó>ˆá:OØØ×ÑØ×#Ñ#Ü”q—w‘w×+Ñ+×0Ñ0Ó2Ó3Øó;
Ñ7Ðð ×?Ñ?ÀÓFˆÙ!5Ø¸ó"
ÑÐð
  Ø!¤F§M¡M×$SÑ$SÕSôTð #Ð"àˆro   c               ó    € V ^8„  d   QhRRRR/# r{  rk   )rl   s   "rm   rn   rÖ  Ž&  s   € ÷ %ñ %Ø,ð%à	 ñ%ro   c                óN  € . p. p. pR R lpV F…  pV P                  V4      RJpV'       d.   \        VP                  4      ^ 8X  d   VP                  V4       KK  V'       d"   V! V4      '       d   VP                  V4       Kt  VP                  V4       K‡  	  W#,           V,           # )zë
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
c               ó    € V ^8„  d   QhRRRR/# rÖ   rk   )rl   s   "rm   rn   ÚLScheduler.reorder_for_partition_with_simple_dependency.<locals>.__annotate__œ&  s   € ÷ 	ñ 	Ð#4ð 	¸ñ 	ro   c                ó¢   € V P                  4        F:  pVP                   F'  p\        VP                  \        4      '       d   K%    R # 	  K<  	  R# rë  )r½  r?  rs   r¸   rƒ  )r¸   rÿ   r„  s   &  rm   Úonly_output_userÚPScheduler.reorder_for_partition_with_simple_dependency.<locals>.only_output_userœ&  s<   € Ø×'Ñ'Ö)�ØŸ9œ9�CÜ% c§h¡h´
×;Ô;Û$ó %ñ *ñ ro   N)r�  r÷   r®  r  )r�   r¼  ÚfrontÚmiddleÚbackr  r¸   r�  s   &&      rm   r>	  Ú6Scheduler.reorder_for_partition_with_simple_dependencyŽ&  s�   € ð *,ˆØ*,ˆØ(*ˆõ	ó ˆDØ#×4Ñ4°TÓ:À$ÐFÐß¤C¨×(?Ñ(?Ó$@ÀAÔ$EØ—‘˜TÖ"ß!Ñ&6°t×&<Ò&<Ø—‘˜DÖ!à—‘˜dÖ#ñ ð �~ Õ$Ð$ro   c               ó   € V ^8„  d   QhRR/# )rf   ri   z9tuple[list[PartitionType], list[GraphPartitionSignature]]rk   )rl   s   "rm   rn   rÖ  ®&  s   € ÷ 0&ñ 0&à	Bñ0&ro   c                óª  € . pRp. p. pV P                    F[  pV P                  V4      RJpV'       d+   W&8w  d%   VP                  V4       VP                  V4       . pTpVP                  V4       K]  	  V'       d#   VP                  V4       VP                  V4       \        P                  P
                  pV^ 8”  d`   \        \        W4      4       FG  w  pw  ršV
'       d   K  V P                  V	4      pW·8  g   K+  RWH&   \        P                  RVVV4       KI  	  V P                  WR7      pV P                  V4       V P                  W4       W3# )zz
Given a list of BaseSchedulerNodes, split into a list of
graph partitions and compute partition input/output signatures.
TNzFPartition %d has %d kernels, below minimum size %d, skipping cudagraph)rÕ  r×  )r¼  r�  r  r.   rÌ   Úcudagraph_min_partition_sizer³  r÷  rß  Úcudagraphs_logrý  rì  r¸  Ú_log_graph_partitions)r�   rÕ  r®  Úcur_partitionr×  r¸   Únode_should_partitionÚmin_sizer°  r»  ÚskipÚkernel_countrª  s   &            rm   r;	  ÚScheduler.graph_partition®&  sL  € ð +-ˆ
ØˆØ')ˆØˆØ—J”JˆDØ$(×$9Ñ$9¸$Ó$?ÀtÐ$KÐ!ß Ô!HØ×!Ñ! -Ô0Ø×&Ñ& ~Ô6Ø "�à2ˆNØ× Ñ  Ö&ñ ÷ Ø×Ñ˜mÔ,Ø×"Ñ" >Ô2ô —=‘=×=Ñ=ˆØ�aŒ<Ü(1´#°jÓ2RÖ(SÑ$�Ñ$�Iß‘tØ#'×#:Ñ#:¸9Ó#E�LØ#Ö.Ø-1˜Ñ*Ü&×,Ñ,ØdØØ(Ø$ö	ñ )Tð ×7Ñ7Ø!ð 8ó 
ˆ
ð 	×)Ñ)¨*Ô5à×"Ñ" :Ô:àÐ%Ð%ro   c               ó$   € V ^8„  d   QhRRRRRR/# ©rf   rÕ  rÖ  rª  r«  ri   rl  rk   )rl   s   "rm   rn   rÖ  à&  s(   € ÷ ";ñ ";à'ð";ð 2ð";ð 
ñ	";ro   c                	ó  € \         P                  \        P                  4      '       g   R # \        ;QJ d4    R \
        P                  P                   4       F  '       g   K   RM)	  RM%! R \
        P                  P                   4       4      pV'       g   R # \        R V 4       4      p\        V4      V,
          p\         P                  R\        V4      VV4       \        \        W4      4       F“  w  pw  rx\         P                  RT\        V4      VP                  '       d   RMR\        VP                  4      \        VP                  4      4       VP                  '       g   Ky  V F  p	V P!                  V	4       K  	  K•  	  R # )	Nc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irr   )r^   )rv   r¹  s   & rm   rx   Ú2Scheduler._log_graph_partitions.<locals>.<genexpr>ê&  s   é € ÐOÑ:N°œV FŸ^˜^Ó:Nùr	  TFc              3  óL   "  € T F  qP                   '       d   K  ^x € K  	  R# 5irQ  )r®  rÈ  s   & rm   rx   r/  î&  s   é € Ð!P©Z¨×?OÕ?O§!¢!«Zùs   ‚$š
$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ø
  rB  rd   ré   Údevice_typesr5  r÷   rý  r³  r÷  r®  r¯  r°  Ú_log_non_cudagraphable_node)
r�   rÕ  rª  Úhas_gpu_deviceÚcudagraphable_countÚnon_cudagraphable_countr°  r»  rµ  r¸   s
   &&&       rm   r$  ÚScheduler._log_graph_partitionsà&  s$  € ô
 ×*Ñ*¬7¯=©=×9Ò9Ù÷ ›ÑO¼!¿'¹'×:NÒ:NÓOŸŸšÑO¼!¿'¹'×:NÒ:NÓOÓOˆßÙä!Ñ!P©ZÓ!PÓPÐÜ"% j£/Ð4GÕ"GÐÜ×ÑØQÜ�
‹OØØ#ô		
ô *3´3°zÓ3NÖ)OÑ%ˆAÑ%�	Ü× Ñ ØEØÜ�I“Ø'0×'?×'?Ð'?Ñ#À_Ü�I×)Ñ)Ó*Ü�I×*Ñ*Ó+ôð ×'×'Ò'ã%�DØ×4Ñ4°TÖ:ó &ó *Pro   c               ó    € V ^8„  d   QhRRRR/# rx  rk   )rl   s   "rm   rn   rÖ  '  s   € ÷ >ñ >Ð0Að >Àdñ >ro   c                óÒ  € V P                  V4      pV'       g   R# VP                  4       pVP                  e   VP                  P                  4       MRpRV 2.p\	        VP                  4      P
                  pVP                  RV 24       VeG   VP                   RRP                  R VP                   4       4       R2pVP                  RV 24       \        P                  R	VRP                  V4      4       Vee   VP                  P                  R
R4      pV'       d?   VP                  4       P                  R4       F  p	\        P                  RV	4       K  	  R# R# R# )z)Log details for a non-cudagraphable node.Nzreason=zir=rÊ  rç  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irr   )r   )rv   rÌ  s   & rm   rx   Ú8Scheduler._log_non_cudagraphable_node.<locals>.<genexpr>'  s   é € Ð2PÁ<¸a´3°q·6°6Ã<ùr	  rÃ  zfx=z
    %s: %sr  rÍ  z         %s)r�  rE  r¸   rs  rÐ   r¡   r  r  rÓ  ro  r#  rý  r  r  ÚstripÚsplit)
r�   r¸   rò  rU  rv  ÚpartsÚir_typeÚfx_strr  Úlines
   &&        rm   r3  Ú%Scheduler._log_non_cudagraphable_node'  s,  € à×&Ñ& tÓ,ˆßÙà—M‘M“Oˆ	Ø15·±Ò1F�$—)‘)×+Ñ+Ô-ÈDˆØ˜6˜(Ð#Ð$ˆÜ�t—y‘y“/×*Ñ*ˆØ�‰�s˜7˜)�_Ô%ØÒØŸ™Ð' q¨¯©Ñ2PÀ7Ç<Â<Ó2PÓ)PÐ(QÐQRÐSˆFØ�L‰L˜3˜v˜h˜Ô(ä×Ñ˜\¨9°d·i±iÀÓ6FÔGð ÒØ!Ÿ,™,×*Ñ*¨=¸$Ó?ˆKßØ'×-Ñ-Ó/×5Ñ5°dÖ;�DÜ"×(Ñ(¨¸Ö=ó <ñ ñ ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  '  s   € ÷ ñ ˜ñ ro   c                	ó  € \        R 4      ;_uu_ 4        \        P                  P                  P                  '       d   V P                  4       MV P                  V P                  4       uuRRR4       #   + '       g   i     R# ; i)zScheduler.codegenN)r   rê  rë  r.   r;	  Ú_codegen_partitionsÚ_codegenr¼  r�   s   &rm   rø  ÚScheduler.codegen'  sX   € ÜÐ-×.Õ.ô —?‘?×)Ñ)×9×9Ð9ð ×(Ñ(Ô*à—]‘] 4§:¡:Ó.ð÷ /×.×.Ó.ús   ”AA5Á5B	c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r»  r€   rµ  rB   ri   rl  rk   )rl   s   "rm   rn   rÖ  $'  s(   € ÷ 4
ñ 4
à ð4
ð +ð4
ð 
ñ	4
ro   c           	     ó  € ^RI Hp \        P                  P                  p\        V P                  4      pVP                  V4      p\        P                  P                  4       ;_uu_ 4        \        P                  P                  RVVVR7       \        P                  P                  P                  4       pV P                  V4       \        \        P                  P                  V4      '       g   \        R4      h\        P                  P                  V,
          pV P                  W(4      pV\        P                  P                  n        \        P                  P                  P#                  4        \        P                  P                  P%                  \        P                  P&                  4      w  ršRRR4       \        P                  P                  P)                  VX	4       \        P                  P                  P+                  WR4       \        P                  P                  P,                  P/                  VP0                   Uu. uF  q»P3                  4       NK  	  up4       R#   + '       g   i     L¿; iu upi )z,Codegen a partition given its inputs/outputs)ÚSubgraphPythonWrapperCodegenT)Úis_subgraphÚsubgraph_nameÚparent_wrapper_codeÚpartition_signaturesz:expected wrapper_code to be a SubgraphPythonWrapperCodegenN)rô  rJ  rd   ré   ru  r²  r	  Úget_partition_nameÚset_current_wrapper_codeÚinit_wrapper_coderû  r	  rF  rs   rŽ   rñ  rN  Úwrite_prefixÚgenerateÚis_inferenceÚdefine_subgraph_launcher_fnÚcodegen_partition_callÚ	allocatedr’  r°  rE  )r�   r»  rµ  rJ  rM  Úgraph_partition_idÚ
graph_nameÚremoved_buffers_before_codegenÚremoved_buffers_during_codegenÚpartition_coder~  r¸   s   &&&         rm   Ú_codegen_partition_wrapperÚ$Scheduler._codegen_partition_wrapper$'  sÊ  € õ 	BäŸg™g×2Ñ2ÐÜ! $×"?Ñ"?Ó@ÐØ(×;Ñ;Ð<NÓOˆ
ä�W‰W×-Ñ-×/Õ/Ü�G‰G×%Ñ%Ø Ø(Ø$7Ø%.ð	 &ô ô ./¯W©W×-DÑ-D×-IÑ-IÓ-KÐ*Ø�M‰M˜)Ô$ô œaŸg™g×2Ñ2Ð4P×QÒQÜ$ØPóð ô —‘×'Ñ'Ð*HÕHð +ð ×KÑKØóˆIð 9BŒA�G‰G× Ñ Ô5Ü�G‰G× Ñ ×-Ñ-Ô/ä !§¡× 4Ñ 4× =Ñ =¼a¿g¹g×>RÑ>RÓ SÑˆN÷C 0ôF 	
�‰×Ñ×8Ñ8¸À^ÔTä	�‰×Ñ×3Ñ3Ð4FÔRÜ	�‰×Ñ×&Ñ&×-Ñ-Ø)2×)?Ò)?Ó@Ñ)? �]‰]Ž_Ñ)?Ñ@ö	
÷M 0×/üòN As   Á-EI2ÉJÉ2J	c               ó$   € V ^8„  d   QhRRRRRR/# )rf   rÕ  rÖ  rª  r«  ri   z'contextlib.AbstractContextManager[None]rk   )rl   s   "rm   rn   rÖ  Z'  s$   € ÷ ñ Ø-ðØ;Xðà	0ñro   c                	óR   a aa€ \         P                  R  VV V3R ll4       pV! 4       # )c               ó   € V ^8„  d   QhRR/# )rf   ri   zIterator[None]rk   )rl   s   "rm   rn   Ú:Scheduler.use_default_device_context.<locals>.__annotate__^'  s   € ÷ 	3ñ 	3�^ñ 	3ro   c               3  ó  <"  € SP                  S S4       SP                  '       d†   \        SP                  P                  4      '       da   SP                  P                  f   \        R4      h\        P                  P                  P                  SP                  P                  4        R x € SP                  '       dN   \        SP                  P                  4      '       d)   \        P                  P                  P                  4        R Sn        R #   SP                  '       dN   \        SP                  P                  4      '       d)   \        P                  P                  P                  4        R Sn        i ; i5i)Núdevice should have an index)Ú%update_graph_partition_default_devicer	  rT   rÐ   r  rŽ   rd   ré   ru  Úcodegen_device_guard_enterÚcodegen_device_guard_exit)rÕ  r�   rª  s   €€€rm   ÚctxÚ1Scheduler.use_default_device_context.<locals>.ctx]'  s   øé € à×6Ñ6°zÀ:ÔNØ×*×*Ð*Ô/@Ø×+Ñ+×0Ñ0÷0ò 0ð ×.Ñ.×4Ñ4Ò<Ü(Ð)FÓGÐGÜ—‘×$Ñ$×?Ñ?Ø×/Ñ/×5Ñ5ôð3Ûà×.×.Ð.Ô3DØ×/Ñ/×4Ñ4÷4ò 4ô —G‘G×(Ñ(×BÑBÔDØ.2�Ö+øð	 ×.×.Ð.Ô3DØ×/Ñ/×4Ñ4÷4ò 4ô —G‘G×(Ñ(×BÑBÔDØ.2�Õ+üs    ƒB*FÂ.D Â2A(FÄA(FÆF)Ú
contextlibÚcontextmanager)r�   rÕ  rª  rh  s   fff rm   Úuse_default_device_contextÚ$Scheduler.use_default_device_contextZ'  s+   ú€ ô 
×	"Ñ	"÷	3ñ 	3ó 
#ð	3ñ( ‹uˆro   c               ó$   € V ^8„  d   QhRRRRRR/# r,  rk   )rl   s   "rm   rn   rÖ  t'  s)   € ÷ .Añ .AØ-ð.AØ;Xð.Aà	ñ.Aro   c                	ób  € \        V4      ^8X  d   V^ ,          P                  '       g   R# R R lpR R lpRp\        W4       F!  w  rgVP                  '       d   K  V! V4      p M	  Vf   R# \        W4       F*  w  rgVP                  '       g   K  V! We4      '       d   K)   R# 	  WPn        R# )r�  Nc               ó    € V ^8„  d   QhRRRR/# )rf   r»  r€   ri   r»  rk   )rl   s   "rm   rn   ÚEScheduler.update_graph_partition_default_device.<locals>.__annotate__ƒ'  s   € ÷ 	$ñ 	$°mð 	$Èñ 	$ro   c                óR   € V ^ ,          P                  4       pVf   \        R4      hV# )r   z#expected partition_device to be set)rÏ   rŽ   )r»  Úpartition_devices   & rm   Úget_cudagraph_partition_deviceÚWScheduler.update_graph_partition_default_device.<locals>.get_cudagraph_partition_deviceƒ'  s-   € Ø(¨�|×6Ñ6Ó8ÐØÒ'Ü$Ð%JÓKÐKØ#Ð#ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   r»  r€   Útarget_devicer»  ri   r”   rk   )rl   s   "rm   rn   rq  ‰'  s$   € ÷ 	ñ 	Ø$ð	Ø5Að	àñ	ro   c                óJ   € V  F  pVP                  4       pW18w  g   K   R # 	  R# rë  rY	  )r»  rw  r¸   r¹  s   &&  rm   Úall_on_target_deviceÚMScheduler.update_graph_partition_default_device.<locals>.all_on_target_device‰'  s(   € ó "�ØŸ™Ó*�ØÖ*Ú ñ "ñ ro   )r÷   r®  r÷  r	  )r�   rÕ  rª  rt  ry  Úcudagraph_partition_devicer»  rµ  s   &&&     rm   re  Ú/Scheduler.update_graph_partition_default_devicet'  s«   € ô ˆz‹?˜aÔ¨
°1­×(D×(DÐ(Dñ õ	$õ	ð &*Ð"Ü$'¨
Ö$?Ñ ˆIØ×+×+Ò+Ù-KÈIÓ-VÐ*Ùñ %@ð &Ò-Ùä$'¨
Ö$?Ñ ˆIØ×'×'Ò'Ñ0DØ÷1ô 1ò ñ	 %@ð 'AÖ#ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  ¤'  s   € ÷ !ñ ! Tñ !ro   c           	     óx  € V P                  4       w  r\        V4      ^8”  d*   \        R,          R;;,          \        V4      ,          uu&   V P                  W4      ;_uu_ 4        \	        W4       Fb  w  r4\        V4      ^8  d   \        R\        V4       24      hVP                  '       d   V P                  V4       KQ  V P                  W44       Kd  	  RRR4       \        V P                  4      p\        P                  P                  P                  V4       V^ 8”  d„   \        P                  P                  f   \        R4      hV\        \        P                  P                  4      8w  d3   \        RV R\        \        P                  P                  4       24      hR# R#   + '       g   i     LÚ; i)zª
Split nodes into partitions and codegen each partition into separate functions.
This allows further applying different optimizations (e.g., cudagraph) to
each function.
rq  Úcudagraph_partitionsz5Each partition must have at least one node but found Nz)expected V.graph.partition_maps to be setzExpect z partition maps but got )r;	  r÷   r   rl  r÷  rŽ   r®  rF  r]  r²  r	  rd   ré   ru  Úset_all_partition_namesr­  )r�   rÕ  rª  r»  rµ  Únum_partitionss   &     rm   rE  ÚScheduler._codegen_partitions¤'  sb  € ð "&×!5Ñ!5Ó!7Ñˆ
äˆz‹?˜QÔÜ�ZÕ Ð!7×8¼CÀ
»OÕKÓ8à×,Ñ,¨Z×DÕDÜ(+¨JÖ(CÑ$�	Ü�y“> AÔ%Ü(ØOÔPSÐT]ÓP^ÐO_Ð`óð ð ×+×+Ð+Ø—M‘M )Ö,à×3Ñ3°IÖIñ )D÷ Eô ˜d×;Ñ;Ó<ˆÜ	�‰×Ñ×4Ñ4°^ÔDð ˜AÔÜ�w‰w×%Ñ%Ò-Ü$Ð%PÓQÐQØ¤¤Q§W¡W×%;Ñ%;Ó!<Ô<Ü$Ø˜nÐ-Ð-EÄcÌ!Ï'É'×J`ÑJ`ÓFaÐEbÐcóð ñ =ñ ÷! E×Dús   Á%A	F)Â/(F)Æ)F9	c               ó    € V ^8„  d   QhRRRR/# r  rk   )rl   s   "rm   rn   rÖ  Ç'  s   € ÷ dñ dÐ5ð d¸$ñ dro   c                	óv  a € \         P                  '       dÍ   ^ RIp\        P                  ! 4       p\        4       p\        V4       Fš  pVP                  R8X  d2   VP                  VP                  P                  P                  8X  d    MYVP                  VP                  3pWd9   d'   \        RVP                   RVP                   R24      hVP                  V4       Kœ  	  S P                  S n        S P"                  e   \        R4      hS P                  '       dI   \         P$                  P&                  '       d)   \(        P*                  P,                  P/                  4        \(        P*                  P,                  P1                  4        S P3                  4       '       Ed   \(        P*                  P,                  P4                  pV'       då   / pV Fv  p	S P6                  P9                  V	^ 4      p
\;        V	P<                  P>                  4       F4  pW·9   g   K  VPA                  V\        4       4      P                  V
4       K6  	  Kx  	  VPC                  4        UUu. uF  w  r¼\E        V4      ^8”  g   K  VNK  	  pppV'       d*   \(        P*                  P,                  PG                  V4       V EF§  p\H        PK                  \L        PN                  4      '       d5    \H        PQ                  RVPS                  4       VPU                  4       4       S PY                  V4       \         PZ                  '       dE   \(        P*                  P,                  P]                  R	 VP<                  P>                   4       4       VP_                  4       ;p'       Edª   VS P                   8w  g-   VPa                  4       '       g   VPc                  4       '       d   S Pe                  4        VS P                   8w  EdK   S P                   '       dl   \g        S P                   Ph                  4      '       dG   S Pj                  e   S Pm                  4        \(        P*                  P,                  Po                  4        VS n        \g        VPh                  4      '       d¬   VPp                  f   \        R
4      h^pS P3                  4       '       d<   \        V 3R lS Pr                   4       4      pV'       d   \u        V4      ^,           M^p\(        P*                  P,                  Pw                  VPp                  VS Px                  4       RpRp\{        V\|        4      '       g   S P~                  P9                  V4      pVeZ   S Pe                  4        S Pj                  e   S Pm                  4        \(        P*                  P,                  P�                  V4       RpS P3                  4       '       d    S P                   e   S Pƒ                  V4       \(        P*                  P,                  P…                  R VP<                  P>                   4       S P6                  P9                  V^ 4      4       VS nC        S Pˆ                  P‹                  VPŒ                  4       VPc                  4       '       dQ   VP�                  \‘        VP“                  4       4      4      w  pppS P•                  V4      P—                  VVV4       EM›VPa                  4       '       d   S P™                  V4       EMrVP›                  4       '       d�   \œ        Pž                  ! \         V4      pS P•                  V4      p^RIQHRp ^RISHTp ^RIUHVp \{        VVVV34      '       d   TpM\        R\i        S 4      : 24      hVP¯                  V4       MÜ\{        V\°        4      '       d"   S P•                  V4      P³                  V4       M¥\{        V\´        4      '       d"   S P•                  V4      P·                  V4       Mn\{        V\¸        \º        34      '       d"   S P•                  V4      P½                  V4       M1\{        V\|        4      '       g   \        R4      hVP¿                  4        \         P$                  PÀ                  '       d    S P•                  V4      PÃ                  4        S PÄ                  P‹                  VPÇ                  4       4       S PÈ                  P‹                  VPË                  4       4       \{        V\|        4      '       g[   VP_                  4       pVeG   VPh                  R8w  d6   S P•                  V4      PÍ                  4       '       d   S Pe                  4        V'       dW   S Pe                  4        S Pj                  e   S Pm                  4        \(        P*                  P,                  PÏ                  4        \Ð        ;QJ d*    R VP“                  4        4       F  '       d   K   RM	  RM! R VP“                  4        4       4      '       d   VS n        EK   RS n        EKª  	  S P                   S P                  8w  dg   S P                   f   \        R4      h\g        S P                   Ph                  4      '       d)   \(        P*                  P,                  Po                  4        RS n        S Pe                  4        R# u uppi   \V         d)    \H        PQ                  RTPS                  4       4        ELi ; i)r   NÚ_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.z!expected previous_node to be Nonez5Generating code for node %s with estimated runtime %fz6Generating code for node %s with estimated runtime 0.0c              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   Ú%Scheduler._codegen.<locals>.<genexpr>(  s   é € ð DÙ(> —H–HÓ(>ùr	  rd  c              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5irr   ri	  rT
  s   & €rm   rx   rˆ  '(  s"   øé € ð 8ÙAK¸A × 4Ñ 4°Q× 7Ð 7Ãùr9  FTc              3  ó8   "  € T F  qP                   x € K  	  R # 5irr   r  ru   s   & rm   rx   rˆ  R(  s   é € Ð<Ñ%;˜c—–Ó%;ùr	  )ÚCUDACombinedSchedulingrÝ  )ÚXPUCombinedSchedulingztype(self)=z,expected node to be a NopKernelSchedulerNoder  c              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5irr   rç  r•  s   & rm   rx   rˆ  š(  s   é € ÐJÑ9I°A”:˜a¤×/Ð/Ó9Iùrè  z!expected current_device to be set)ir.   Ú"check_stack_no_cycles_TESTING_ONLYÚtorch._dynamo.convert_frameÚ	tracebackÚextract_stackr   rù   rt   ÚfilenameÚ_dynamoÚconvert_frameÚ__file__ÚlinenorŽ   rS  r	  r›	  r		  rÌ   Úautotune_at_compile_timerd   ré   ru  Úwrite_get_raw_stream_headerÚregister_alignment_check_inputsru	  Ú_pending_alignment_copiesr	  r  rz   r  r  ro	  r#  r÷   Úmark_multistream_alignmentrÙ  r«	  r¬	  rø
  rý  rE  r€  rØ  r  Úsize_assertsÚcodegen_deferred_input_assertsrÏ   rÓ  rÏ  r_  rT   rÐ   Úcurrent_stream_idxÚgenerate_stream_ctx_exitrg  r  r¼  rž  rf  r!	  rs   rý  r   Úcodegen_cuda_mempool_enterÚgenerate_stream_ctx_switchingÚ!codegen_deferred_alignment_copiesr
	  rE	  r’  rž  r¸  rÈ   rá   rj  Úcodegen_templaterg  r×  r  r  rF  Ú codegen.cuda_combined_schedulingr‹  rÓ  rÞ  Ú#codegen.xpu.xpu_combined_schedulingrŒ  Úcodegen_combo_kernelr  Úcodegen_nested_reductionrÛ  Úcodegen_mix_order_reductionr  rÚ   Úcodegen_noder@  Údebug_sync_kernelÚcodegen_syncrZ  rŽ  rú  r<  Úready_to_flushÚcodegen_cuda_mempool_exitrà   )r�   r¼  rê  r  rÃ  Úframer  ÚpendingÚinput_streamsr–  r>  rt   ÚssÚmultir¸   r¹  Únum_streamsÚunique_streamsÚnode_mempoolÚmempool_ctx_enteredrµ  r¶  r·  Úbackend_r‹  rÞ  rŒ  r  s   f&                          rm   rF  ÚScheduler._codegenÇ'  sQ  ø€ Ü×4×4Ð4Û.ä×+Ò+Ó-ˆEÜ7A³|ˆDÜ! %ž�ð —J‘JÐ"2Ô2ØŸ™¨%¯-©-×*EÑ*E×*NÑ*NÔNáØ—~‘~ u§|¡|Ð4�Ø”;Ü(Ø0°·±Ð0@ÀÀ%Ç,Á,Àð PNð Nóð ð
 —‘˜–ñ )ð  #×9Ñ9ˆÔØ×ÑÒ)Ü Ð!DÓEÐEð ×&×&Ð&¬6¯=©=×+Q×+QÐ+QÜ�G‰G× Ñ ×<Ñ<Ô>ô 	
�‰×Ñ×<Ñ<Ô>ð ×'Ñ'×)Ó)Ü—g‘g×*Ñ*×DÑDˆGßØ<>�Û�AØ×+Ñ+×/Ñ/°°1Ó5�AÜ /°·±×0CÑ0CÖ D˜Øž?Ø)×4Ñ4°T¼:»<ÓH×LÑLÈQÖOó !Eñ ð
 /<×.AÑ.AÔ.CÔSÑ.C¡( $ÄsÈ2ÃwÐQRÁ{Ÿ˜Ñ.C�ÑSßÜ—G‘G×(Ñ(×CÑCÀEÔJäˆDÜ×Ñ¤§¡×.Ò.ð
Ü—I‘IØOØŸ™›Ø×2Ñ2Ó4ôð ×Ñ˜tÔ$ô ×"×"Ð"Ü—‘×$Ñ$×CÑCñ DØ(,×(8Ñ(8×(>Ò(>óDô ð Ÿ™Ó*Ð*ˆv×*à˜d×1Ñ1Ô1Ø—~‘~×'Ò'Ø×'Ñ'×)Ò)à—J‘J”LØ˜T×0Ñ0Õ0Ø×*×*Ð*Ô/@Ø×+Ñ+×0Ñ0÷0ò 0ð  ×2Ñ2Ò>Ø ×9Ñ9Ô;ÜŸ™×,Ñ,×FÑFÔHØ*0�DÔ'Ü(¨¯©×5Ò5Ø!Ÿ<™<Ò/Ü"0Ð1NÓ"OÐOà&'˜Ø×7Ñ7×9Ò9ä-7ô 8ØAEÇÂó8ó .˜N÷ <J¤ NÓ 3°aÖ 7Èqð (ô Ÿ™×,Ñ,×GÑGØ"ŸL™LØ'Ø ×;Ñ;ôð  ˆLØ"'Ðô ˜dÔ$:×;Ò;Ø#×3Ñ3×7Ñ7¸Ó=�ØÒ'ð
 —
‘
”Ø×*Ñ*Ò6Ø×1Ñ1Ô3Ü—‘×$Ñ$×?Ñ?ÀÔMØ&*Ð#ð ×+Ñ+×-Ò-°$×2EÑ2EÒ2QØ×2Ñ2°4Ô8ô �G‰G× Ñ ×BÑBÙ< T×%5Ñ%5×%;Ò%;Ó<Ø×#Ñ#×'Ñ'¨¨aÓ0ôð
 !%ˆDÔØ×%Ñ%×,Ñ,¨T¯_©_Ô=à×Ñ×!Ò!Ø48×4WÑ4WÜ˜Ÿ™Ó)Ó*ó5Ñ1�˜-¨ð × Ñ  Ó(×9Ñ9Ø! 8¨Xöð —‘×!Ò!Ø×(Ñ(¨Ö.Ø—‘×"Ò"Ü—{’{Ô#=¸tÓD�à×+Ñ+¨FÓ3�ÝTÝ8ÝVäØØ#Ð%;Ð=RÐS÷ò ð '‘Gä(¨K¬D°«J©=Ð)9Ó:Ð:Ø×,Ñ,¨TÕ2Ü˜DÔ"7×8Ò8à× Ñ  Ó(×AÑAÀ$ÕGÜ˜DÔ"9×:Ò:à× Ñ  Ó(×DÑDÀTÕJÜ˜DÔ#5´}Ð"E×FÒFà× Ñ  Ó(×5Ñ5°dÕ;ä! $Ô(>×?Ò?Ü(Ð)WÓXÐXØ—‘”ô �}‰}×.×.Ð.à× Ñ  Ó(×5Ñ5Ô7à×'Ñ'×.Ñ.¨t×/DÑ/DÓ/FÔGØ×%Ñ%×,Ñ,¨T×-EÑ-EÓ-GÔHä˜dÔ$:×;Ò;ØŸ™Ó*�àÒ&ØŸ™ vÔ-Ø×(Ñ(¨Ó0×?Ñ?×AÒAà—J‘J”Lç"ð —
‘
”Ø×*Ñ*Ò6Ø×1Ñ1Ô3Ü—‘×$Ñ$×>Ñ>Ô@ç‹sÑJ¸¿¹Ô9IÓJ�s�sŠsÑJ¸¿¹Ô9IÓJ×JÒJØ%)�×"à%)�×"ñG ðJ ×Ñ $×"=Ñ"=Ô=ð ×"Ñ"Ò*Ü$Ð%HÓIÐIÜ  ×!4Ñ!4×!9Ñ!9×:Ò:ô —‘×$Ñ$×>Ñ>Ô@à!ˆÔØ�
‰
Žùók Tøô !ô Ü—I‘IØPØŸ™›÷ðús   É$k?É=k?Ë'3lì/l8ì7l8c               ó    € V ^8„  d   QhRRRR/# ©rf   rÖ
  r½  ri   z%tuple[float, float, list[str | None]]rk   )rl   s   "rm   rn   rÖ  ­(  s    € ÷ Qñ QØ4ðQà	.ñQro   c                óÈ   € V^ ,          P                  4       pV \        P                  n        W0n        Vf   \        R4      hV P                  V4      pVP                  W4      # )r‡
  rr  )rÏ   rd   ré   r<  r›	  rŽ   rj  r�  )r�   rÖ
  Únode_benchmark_resultsr¹  r  s   &&&  rm   r�  Ú Scheduler.benchmark_combo_kernel­(  sZ   € ð ˜1•×(Ñ(Ó*ˆØ Œ�‰ÔØ$ÔØŠ>Ü Ð!<Ó=Ð=Ø×"Ñ" 6Ó*ˆØ×-Ñ-¨iÓPÐPro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¼  r¬  ri   r”   rk   )rl   s   "rm   rn   rÖ  ¼(  s   € ÷ O5ñ O5Ð-Dð O5Èñ O5ro   c                ó   a€ TpV^ ,          P                  4       o\        ;QJ d    V3R lV 4       F  '       d   K   RM	  RM! V3R lV 4       4      '       g   \        R4      h\        P                  '       g   R# ^ RIHp R. rT/ p\        V4       F©  w  rxVP                  4       p	V P                  V	4      '       d   \        P                  R4        V P                  V	4      w  r«W«3Wh&   \        P                  ! V
4      '       d   \        P                  RV4        R#  YJ,          pTP!                  T4       K«  	   V P	                  W&4      w  rÞpYÞ,
          R8  ;'       g    TR8  p\        P#                  \$        P&                  4      '       d^   YM8”  g	   T'       d)   \        P                  R\)        YM,          R 4      4       M'\        P                  R\+        YM,          R 4      4       YÞ,
          T8  ;'       g    T#   T d3   pR	\        T4      9   d   \        P                  R
4        Rp? R# h Rp?ii ; i  T d2   pR	\        T4      9   d   \        P                  R
4        Rp?R# h Rp?ii ; i)rí
  c              3  óH   <"  € T F  qP                  4       S8H  x € K  	  R # 5irr   rY	  )rv   r¸   r¹  s   & €rm   rx   Ú4Scheduler.speedup_by_combo_kernel.<locals>.<genexpr>Å(  s   øé € ÐK¹?°4—?‘?Ó$¨Ö.»?ùr  FTz<All nodes in a combo kernel group must be on the same devicerð
  rö
  z<ComboKernel: benchmarking may not accurate due to atomic_addz;ComboKernel benchmark: register spilling of %d-th subkernelrB  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.   r�  rI  rñ
  r³  rá   rÛ
  rü  rý  r‰
  r4  rD  r   r  r«	  r¬	  rø
  rK   rM   )r�   r¼  Úsubkernel_nodesrñ
  rB  Ú
path1_listr¼  r°  rÀ  rÖ
  r”  r%  rf  rC  Ú	ms2_cloneÚ_path2_listÚsmall_kernelr¹  s   &&               @rm   rÉ  Ú!Scheduler.speedup_by_combo_kernel¼(  s,  ø€ ð  ˆØ  Õ#×.Ñ.Ó0ˆç‹sÔK¹?ÓK�s�sŠsÔK¹?ÓK×KÒKÜ ØNóð ô ×,×,Ð,Ùå;à˜rˆZØ!#ÐÜ! /Ö2‰HˆAØŸ™Ó)ˆIð ×#Ñ# I×.Ò.Ü× Ñ ØRôðØ×5Ñ5°iÓ@‘�Ø13°
Ð&Ñ-Ü—:’:˜b—>’>Ü×$Ñ$ØUØôò !ð "ð �IˆCØ×Ñ˜dÖ#ñ9 3ð<	Ø*.×*EÑ*EØó+Ñ'ˆC˜Kð •¨Ñ,×9Ð9°°c±	ˆÜ×"Ñ"¤7§=¡=×1Ò1ØŒyŸLÜ× Ñ ØEÜ #¥)¨C Ó2õô
 × Ñ ØIÜ ¥	¨#˜Ó0ôð
 � Ñ$×4Ð4¨Ð4øðQ $ô à*¬c°!«fÔ4Ü×$Ñ$Ø]ôö  àûðûð   ô 	à&¬#¨a«&Ô0Ü× Ñ ØYôõ àûð	ús=   ÃA
H	ÅI È	IÈ%H=È<H=È=IÉI=É%I8É7I8É8I=c               ó    € V ^8„  d   QhRRRR/# )rf   r®  r   ri   z	ir.Layoutrk   )rl   s   "rm   rn   rÖ  )  s   € ÷ %ñ %¨#ð %°)ñ %ro   c                	óŽ   € V P                   V,          pVP                  f   \        R4      hVP                  P                  4       # )Nzexpected buf.node to be set)r{  r¸   rŽ   Ú
get_layout)r�   r®  rÿ   s   && rm   Úget_buffer_layoutÚScheduler.get_buffer_layout)  s;   € Ø×Ñ˜xÕ(ˆØ�8‰8ÒÜ Ð!>Ó?Ð?Ø�x‰x×"Ñ"Ó$Ð$ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  )  s   € ÷ Hñ H¨Dñ Hro   c                	ó  € V P                    Fù  pVP                  4       '       g   K  VP                  P                   FÄ  p\        P
                  P                  P                  VP                  4      pV'       g   K@  \        V4      R 8X  g   KR  \        VP                  \        \        34      '       d   Kz  VP                  4       . 8X  g   K‘  \        P
                  P                  P!                  VP                  4       KÆ  	  Kû  	  R# )r·  N)r¼  r^   r  r  rd   ré   rT  r  rt   rA   rs   r\  rE   rD   rí  Úzero_dim_cpu_tensor_listrS  )r�   r¸   r  r  s   &   rm   r	  Ú$Scheduler.update_zero_dim_cpu_tensor)  sª   € Ø—J”JˆDØ�{‰{�}Œ}Ø ×,Ñ,×2Ô2�DÜŸW™W×3Ñ3×7Ñ7¸¿	¹	ÓB�Fç™Ü+¨FÓ3°uÖ<Ü *Ø"ŸM™M¬JÔ8IÐ+J÷!ô !ð #ŸO™OÓ-°Ö3äŸ™×8Ñ8×<Ñ<¸T¿Y¹YÖGó 3ó ro   c               ó   € V ^8„  d   QhRR/# rn  rk   )rl   s   "rm   rn   rÖ  #)  s   € ÷ ñ  Jñ ro   c                óN   € V P                   e   V P                   P                  # R# )z:CUDA Stream index that current scheduler node assigned to.N)rG	  r\	  r�   s   &rm   rž  ÚScheduler.current_stream_idx")  s%   € ð ×#Ñ#Ò/Ø×+Ñ+×6Ñ6Ð6áro   c               ó   € V ^8„  d   QhRR/# )rf   ri   r8
  rk   )rl   s   "rm   rn   rÖ  +)  s   € ÷ ñ  Zñ ro   c                ó<   € V P                   ;pe   \        V4      # R# )z9CUDA Stream name that current scheduler node assigned to.N)rž  r&   )r�   r\	  s   & rm   Úcurrent_stream_nameÚScheduler.current_stream_name*)  s#   € ð ×1Ñ1Ð1ˆJÒ>Ü" :Ó.Ð.áro   c               ó    € V ^8„  d   QhRRRR/# rx  rk   )rl   s   "rm   rn   rÖ  2)  s   € ÷ 
ñ 
Ð.?ð 
ÀDñ 
ro   c                óÈ   € \        V\        4      '       d   \        R4      hV P                  V4      p\        P
                  P                  P                  VR7      V n        R# )z6Code-gen to enter the Stream context assigned to node.z0expected node to not be a NopKernelSchedulerNode)r\	  N)	rs   rý  rŽ   r—  rd   ré   ru  Úcodegen_cuda_stream_enterrG	  )r�   r¸   Únode_streams   && rm   Úgenerate_stream_ctx_enterÚ#Scheduler.generate_stream_ctx_enter2)  sR   € ä�dÔ2×3Ò3Ü Ð!SÓTÐTØ×*Ñ*¨4Ó0ˆÜ#$§7¡7×#7Ñ#7×#QÑ#QØ"ð $Ró $
ˆÖ ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rÖ  ;)  s   € ÷ (ñ (¨$ñ (ro   c                ó–   € V P                   f   \        R4      h\        P                  P                  P                  4        RV n         R# )z1Code-gen to exit from the current Stream context.Nz&expected _current_stream_ctx to be set)rG	  rŽ   rd   ré   ru  Úcodegen_cuda_stream_exitr�   s   &rm   rŸ  Ú"Scheduler.generate_stream_ctx_exit;)  s8   € à×#Ñ#Ò+Ü Ð!IÓJÐJÜ	�‰×Ñ×5Ñ5Ô7Ø#'ˆÖ ro   c               ó    € V ^8„  d   QhRRRR/# rx  rk   )rl   s   "rm   rn   rÖ  B)  s   € ÷ 1ñ 1Ð2Cð 1Èñ 1ro   c                ó2  € \        V\        4      '       d   RMV P                  V4      pV P                  V8X  d   R# V P                  e   Vf   R# V P                  f   Ve   V P	                  V4       R# V P                  4        V P	                  V4       R# )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)rs   rý  r—  rž  rÜ  rŸ  )r�   r¸   Ústreams   && rm   r¡  Ú'Scheduler.generate_stream_ctx_switchingB)  s�   € ô ˜$Ô 6×7Ò7ñ à×%Ñ% dÓ+ð 	ð
 ×"Ñ" fÔ,ñ Ø×$Ñ$Ò0°V²^ñ Ø×$Ñ$Ò,°Ò1Cà×*Ñ*¨4Ö0ð ×)Ñ)Ô+Ø×*Ñ*¨4Ö0ro   ) rG	  r	  r	  r 	  r	  rZ  r	  r	  r	  rE	  rú  r›	  r
	  r	  r	  r4  r¥  r{  rz  rs  rR  r   r	  r¼  r 	  rF	  rÿ  r		  rI	  r	  r!	  r"	  rr   rë  )FTNrº  )TN)...)TFT)’r¡   r¢   r£   r¤   r¹   r¸  rk  rß  rØ  r	  r#	  r_	  r—  ru	  r$	  r‚	  r~	  r�	  rÿ  rþ  Úpropertyr›	  ÚsetterrD	  r®	  r	  r	  r}   rB	  r	  r:
  r	  r,	  rX
  r•  r	  r	  rÇ  r×  r:	  r‰
  r“
  rš
  r¨
  r&	  r¾
  rÛ
  ré
  r]  rï  rf  rm  ry  rŽ  r”  rž  r{
  r¯  r0	  rÈ  r  rÌ  rw  r¤  rl  rQ  ri  rn  r~  r‹  rˆ  r�  rQ   r›  r¯  rÈ  rÅ  rò  r  rÇ  r  r4  rM  rX  r]  r  rI  rn  rh  rŽ  r"  rÈ  r®  rÌ  rÒ  r¯  r  rÔ  r±  r‹  r   r÷  r  r  r   r!  r?	  r[  r_  rg  rr  rj  r  r^  r�  rP   r›  r�  r§  r¸  rÒ  rì  rñ  r
  r=	  r>	  r;	  r$  r3  rø  r]  rl  re  rE  rF  r�  rÉ  rË  r	  rž  rÖ  rÜ  rŸ  r¡  r§   rO  rP  s   @rm   r;  r;  ’  s@  ø† ñõ
ð ôXó ðX÷H9ð H9õT	#õ0
õdõ+õZ(õ
õ"#õ$õ.Sõ
Xõ
Kð ô&ó ð&ð ×Ñô(ó ð(õ7õ#õ
,õ"õH_PõB	KõZ+#õZ õõ6õSõ*õ6#õ2/õ8$õ6!õF	õ8÷&ð õ&
>õ'õRNDõ`5'õn
÷ð õ*võp>õõ4õ"O2õbU?õnSõ4$õ(CðJ ôó ð÷8t.ð t.õl(
õTD&õL'$õR?õ6 õp,õ\7õr.2õ`$õ6<õ|#
õJ!õ.Eñ" ˜KÓ(ôTó )ðTõYõv76õr]Kõ~1õf1õfpõdõ ;õz`õD
õJõ"!
÷Fð ÷,
ð 
÷$iMð iMðVGð
 >B÷GõR=)ð~ ô
ó ð
ð=ØNS÷=õ~=ð* ôOIó ðOIõhð ô4ó ð4÷";ð ;÷(ð (÷Tð ð, ÷ó ðð ÷$ó ð$÷^Kð ^Kõ@dõLR
õh$6õL4õ	8õ*õ:õ
õ,'õ(%õ5õ$
õ?ðB ô!ó ð!õFõ"õ )õVBHõHD õL"
õHBõHõB%õ@0&õd";õH>õ0õ4
õlö4.A÷`!÷Fd÷LQ÷O5÷b%÷Hð öó ðð öó ð÷
÷(÷1ö 1ro   r;  c                  ó2  a € ] tR tRtR V 3R lltR R ltR R ltR R	 ltR
 R ltR R lt	R R lt
R R ltR R ltR R ltR/R R lltR R ltR R ltR R ltR R ltR  R! ltR" R# ltR$ R% ltR& R' ltR( R) ltR* R+ ltR/R, R- lltR.tV ;t# )0rj  i_)  c               ó   € V ^8„  d   QhRR/# )rf   r<  zScheduler | Nonerk   )rl   s   "rm   rn   ÚBaseScheduling.__annotate__`)  s   € ÷ #ñ #Ð"2ñ #ro   c                	ó0   <€ \         SV `  4        Wn        R # rr   )r0  r¸  r<  )r�   r<  r8  s   &&€rm   r¸  ÚBaseScheduling.__init__`)  s   ø€ Ü‰ÑÔØ"Žro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rê  d)  s   € ÷ *ñ *¨4ñ *ro   c                	ób   € V P                   '       d   V P                   P                  4        R # R # rr   )r<  r[  r�   s   &rm   Úfree_buffers_in_schedulerÚ(BaseScheduling.free_buffers_in_schedulerd)  s    € Ø�>�>ˆ>Ø�N‰N×'Ñ'Ö)ñ ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¹  r»  ri   zOrderedSet[BackendFeature]rk   )rl   s   "rm   rn   rê  h)  s   € ÷ ñ ¨<ð Ð<Vñ ro   c                ó   € \        4       # )z0Return a set of .codegen.common.BackendFeature()r   r¸  s   &&rm   Úget_backend_featuresÚ#BaseScheduling.get_backend_featuresh)  s
   € ä‹|Ðro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rê  l)  ó$   € ÷ "ñ "Ø&ð"Ø/@ð"à	ñ"ro   c                ó   € \         h)z?
Check whether node1 and node2 can be vertically fused or not.
rÅ  rø  s   &&&rm   rŽ  Ú BaseScheduling.can_fuse_verticall)  ó
   € ô "Ð!ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rê  t)  rö  ro   c                ó   € \         h)zA
Check whether node1 and node2 can be horizontally fused or not.
rÅ  rø  s   &&&rm   r�  Ú"BaseScheduling.can_fuse_horizontalt)  rù  ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rê  |)  s$   € ÷ ñ Ø&ðØ/@ðà	ñro   c                	ó   € R # rþ  rk   rø  s   &&&rm   r…  Ú*BaseScheduling.can_fuse_reduction_epilogue|)  r  ro   c               ó$   € V ^8„  d   QhRRRRRR/# rÊ   rk   )rl   s   "rm   rn   rê  �)  s$   € ÷ ñ Ø&ðØ/@ðà	ñro   c                ó4  € VP                  4       p\        V\        P                  4      '       g   R# VP	                  4       '       g   R# \        VP
                  \        P                  4      '       d¤   \        VP
                  P                  4      ^8H  ;'       dz    \        VP
                  P                  ^ ,          \        P                  4      ;'       d=    VP
                  P                  ^ ,          P                  4       VP                  4       8H  # R# )aF  
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.

F)r£  rs   r1   rh  r_   r¸   rC   r÷   rÎ  r‡  rE  )r�   rª   r«   rˆ  s   &&& rm   r„  Ú.BaseScheduling.can_fuse_multi_outputs_template�)  sÎ   € ð ×.Ñ.Ó0ˆÜ˜,¬×(9Ñ(9×:Ò:ÙØ×5Ñ5×7Ò7Ùä�e—j‘j¤"§.¡.×1Ò1ä�E—J‘J×%Ñ%Ó&¨!Ñ+÷ Oð OÜ˜uŸz™z×0Ñ0°Õ3´R·Y±YÓ?÷Oð Oà—J‘J×%Ñ% aÕ(×1Ñ1Ó3°|×7LÑ7LÓ7NÑNðñ ro   c               ó$   € V ^8„  d   QhRRRRRR/# rH  rk   )rl   s   "rm   rn   rê  ›)  s$   € ÷ 9ñ 9Ø&ð9Ø/@ð9à	ñ9ro   c                ó  € VP                  4       '       g   VP                  4       '       d   \        P                  W4      # \        P	                  W4      '       d'   \        P                  W4      '       d   \        W4      # \        P                  W4      '       d   \        W4      # \        V\        4      '       d   VP                  V4      # \        V\        4      '       d   VP                  V4      # \        V\        4      '       da   \        V\        4      '       dK   \        VP                  \        P                   4      '       g   \#        R4      h\$        P'                  W4      # \(        P                  W4      # )z
Fuse two nodes
r*  )r×  rF  r™   rm  ru  rI  r  rÔ   rM  rÛ  rs   r	  rb  rÚ   r¸   r1   r2  rŽ   r   r1  r  rø  s   &&&rm   r™   ÚBaseScheduling.fuse›)  s&  € ð ×Ñ×Ò ×!1Ñ!1×!3Ò!3Ü-×2Ñ2°5Ó@Ð@Ü×9Ñ9Ø÷
ò 
ä×&Ñ& u×4Ò4Ü(¨Ó6Ð6Ü×7Ñ7¸×EÒEÜ*¨5Ó8Ð8Ü˜Ô4×5Ò5Ø—?‘? 5Ó)Ð)Ü˜Ô6×7Ò7Ø—?‘? 5Ó)Ð)Ü˜Ô8×9Ò9¼jØ”=÷?
ò ?
ô ˜eŸj™j¬"×*DÑ*D×EÒEÜ$ØMóð ô 8×EÑEÀeÓSÐSä%×*Ñ*¨5Ó8Ð8ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¡  rF  ri   z"tuple[tuple[sympy.Expr, ...], ...]rk   )rl   s   "rm   rn   rê  ¸)  s   € ÷ "ñ "Ø3ð"à	+ñ"ro   c                ó   € \         h)zK
Process the iteration sizes in case a transformation needs to be applied.
rÅ  )r�   r¡  s   &&rm   rk  ÚBaseScheduling.group_fn¸)  rù  ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rf   r¶  r   Úepilogue_nodesr½  r‚  ri   r8
  rk   )rl   s   "rm   rn   rê  À)  s2   € ÷ "ñ "à(ð"ð 4ð"ð 4ð	"ð
 
ñ"ro   c                ó   € \         h)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Å  )r�   r¶  r
  r‚  s   &&&&rm   r£  ÚBaseScheduling.codegen_templateÀ)  s
   € ô "Ð!ro   c               ó(   € V ^8„  d   QhRRRRRRRR/# rŽ
  rk   )rl   s   "rm   rn   rê  Î)  s2   € ÷ 	"ñ 	"à*ð	"ð ð	"ð "ð		"ð
 
ñ	"ro   c                ó   € \         h©r’
  rÅ  )r�   r¼  r�
  r�
  s   &&&&rm   r“
  Ú.BaseScheduling.generate_kernel_code_from_nodesÎ)  s
   € ô "Ð!ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   z"FusedSchedulerNode | SchedulerNoderi   rl  rk   )rl   s   "rm   rn   rê  Ù)  s   € ÷ "ñ "Ð!Cð "Èñ "ro   c                ó   € \         hr  rÅ  r¸  s   &&rm   r©  ÚBaseScheduling.codegen_nodeÙ)  ó
   € ô "Ð!ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   rÛ  ri   rl  rk   )rl   s   "rm   rn   rê  ß)  s   € ÷ "ñ "Ð0Gð "ÈDñ "ro   c                	ó   € \         hrr   rÅ  r¸  s   &&rm   r¨  Ú*BaseScheduling.codegen_mix_order_reductionß)  rÈ  ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r¸   r  ri   rl  rk   )rl   s   "rm   rn   rê  â)  s   € ÷ "ñ "Ð-Bð "Àtñ "ro   c                	ó   € \         hrr   rÅ  r¸  s   &&rm   r§  Ú'BaseScheduling.codegen_nested_reductionâ)  rÈ  ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rê  å)  s   € ÷ "ñ "˜dñ "ro   c                ó   € \         h)zd
Generate synchronization code for the kernel. This method depends on the hardware characteristics.
rÅ  r�   s   &rm   r«  ÚBaseScheduling.codegen_syncå)  r  ro   c               ó   € V ^8„  d   QhRR/# rJ  rk   )rl   s   "rm   rn   rê  ë)  s   € ÷ ñ  ñ ro   c                ó   € R# )z}
Check whether the backend is requesting the scheduler to flush the generated kernel.
If not supported, please return False.
Frk   r�   s   &rm   r¬  ÚBaseScheduling.ready_to_flushë)  s   € ñ
 ro   c               ó   € V ^8„  d   QhRR/# rk  rk   )rl   s   "rm   rn   rê  ò)  s   € ÷ "ñ "�tñ "ro   c                ó   € \         h)zM
Flush the generated kernel and python wrapper code to the source code file.
rÅ  r�   s   &rm   r_  ÚBaseScheduling.flushò)  r  ro   c               ó    € V ^8„  d   QhRRRR/# r„
  rk   )rl   s   "rm   rn   rê  ø)  s   € ÷ "ñ "Ø0ð"à	ñ"ro   c                ó   € \         h)r‡
  rÅ  rÙ  s   &&rm   r‰
  Ú$BaseScheduling.benchmark_fused_nodesø)  ó
   € ô "Ð!ro   c               ó    € V ^8„  d   QhRRRR/# )rf   r—
  r   ri   r…
  rk   )rl   s   "rm   rn   rê  *  s   € ÷ "ñ "°ð "Ð@Qñ "ro   c                ó   € \         h)r™
  rÅ  )r�   r—
  s   &&rm   rš
  Ú)BaseScheduling.benchmark_codegened_module*  s
   € ô
 "Ð!ro   c               ó$   € V ^8„  d   QhRRRRRR/# r&  rk   )rl   s   "rm   rn   rê  *  s$   € ÷ ñ Ø&ðØ/@ðà	ñro   c                ó   € ^ # )zt
Return an unsigned integer which represents the priority of this fusion pair.
The smaller is with higher priority.
rk   rø  s   &&&rm   rI  Ú'BaseScheduling.get_fusion_pair_priority*  s   € ñ ro   c               ó    € V ^8„  d   QhRRRR/# rº  rk   )rl   s   "rm   rn   rê  *  s   € ÷ "ñ "Ø4ð"à	.ñ"ro   c                ó   € \         h)z‰
Benchmark the list of nodes to combine and return the execution time
and memory copy time in milliseconds on randomly generated inputs.
rÅ  )r�   rÖ
  r¼  s   &&&rm   r�  Ú%BaseScheduling.benchmark_combo_kernel*  r'  ro   c               ó$   € V ^8„  d   QhRRRRRR/# )rf   ræ  r½  rà
  r8
  ri   rl  rk   )rl   s   "rm   rn   rê  *  s(   € ÷ ñ à2ðð  ðð 
ñ	ro   c                	óŠ   € V'       d;   ^ RI Hp V! VV4      p\        P                  P                  P                  W$4       R# R# )r   )Ú'set_kernel_post_grad_provenance_tracingN)r	  r3  rd   ré   ru  Úwrite_provenance_debug_handle)r�   ræ  rà
  r3  Údebug_handles   &&&  rm   Úcodegen_commentÚBaseScheduling.codegen_comment*  s<   € ÷
 ÝUáBØØóˆLô �G‰G× Ñ ×>Ñ>Øöñ ro   r¬  rr   )r¡   r¢   r£   r¤   r¸  rï  ró  rŽ  r�  r…  r„  r™   rk  r£  r“
  r©  r¨  r§  r«  r¬  r_  r‰
  rš
  rI  r�  r6  r§   rO  rP  s   @rm   rj  rj  _)  s{   ø† ÷#ð #õ*õõ"õ"õõ
õ49õ:"õ"÷	"õ"õ"õ"õ"õõ"õ"õ"õõ"÷õ ro   rj  )rk   )äÚ__conditional_annotations__Ú
__future__r   rg  rj  rÆ   r…  r  ro  rH  r¬	  r4  rM  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   r1   r   r   Úcollections.abcr   r   r   r   Útypesr   Útorch._inductor.codegen.wrapperr   rÓ  r   rô  r   r*  r   r@  rê  Ú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,   rß  r-   r.   r/   r0   r2   Úanalyze_preserves_zero_maskr3   Úcodegen.commonr4   r5   r6   Úcomm_analysisr7   r8   r9   r:   r;   r<   Úexcr=   r>   Úfx_utilsr?   r@   rA   rB   rC   rD   rE   rd  rF   r-	  rG   rH   Úruntime.hintsrI   rJ   Úruntime.runtime_utilsrK   rL   rM   rê   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   Úvirtualizedrd   Ú	getLoggerr¡   rÙ  rz   Ú_loggingÚgetArtifactLoggerrü  rÎ  ré	  r#  rÈ   r€   r¥   r�   r‚   ÚDummyr�  rû  r8  rˆ   r©   r´   r¼   rÒ   rÔ   rm  r:  rœ  r   r’  rŠ  r‰  rÝ  r�  rï  r^  rƒ  rv  rb  rý  rÚ   r8  rE  r  rÛ  r  r   rF  rD  r  r%  r/  r@  rH  r.  r	  r	  rc  ri  rx  rƒ  r‰  rŽ  r“  r—  rš  r�  r   r¢  r»  rQ  rî  r;  rj  )r8  s   @rm   Ú<module>rY     s“  øðß "Ð "ã Û Û Û Û Û Û Û Û Û Û 	Û Û 
Û Û Û Û ß ,ß 3÷	÷ 	ó 	õ (å /ç )÷ ßFÓFÝ åJå.Ý5Ý1ã ã Û $ß $Ð $ß 6Ý Eß ?Ý 7ß MÝ 8Ý >Ý 1ß OÑ OÝ *ç D× DÝ Dß MÑ M÷÷ ;Ó :ß 2Ý $÷÷ õ  ß Jß :ß FÑ FÝ &÷÷ ÷ ÷ ÷ õ õ. ð ×Ó˜Ó!€õPð �^Š^×-Ò-¨h¸ÓA€
Ø—N’N×4Ò4°X¸ÓOÐ Ø Ÿ>š>×;Ò;ØÐ$óÐ ð —’×1Ò1°(¸LÓI€àÐ 3Õ4€ˆyÓ 4ÙˆTƒ]€Ùˆtƒ_€Ø—k“kÐ"2¸DÈdÔSÐ Ø(-Ð %ð ×Ò÷Dð Dó ðDð, ×Ò÷(ð (ó ð(ô
�*ô 
ð ×Ó˜TÔ"÷Nð Nó #ðNõ*	÷iñ i÷X	sñ sðl ×Ò÷p8ð p8ó ðp8ðf ×Òô1˜_ó 1ó ð1÷v1ñ v1ðr ‡‚ô2ó ð2õõ,õ,$ðN ×Ó˜TÔ"÷
ð 
ó #ð
õ*÷ñ õ *KôZ$*Ð 1ô $*ôN5Ð.ô 5ôb*Ð%ô b*õJõ$ô:x*Ð*ô x*ôvmGÐ0ô mGô`^<Ð.ô ^<ôBL-Ð+=ô L-ô^z:Ð!3ô z:ôzcÐ,ô c÷L+õ\0õ<
1õ(õ:ð@ ×Ò÷
ð 
ó ð
ð@ %Ÿ?›?Ó,Ð õõ&õ("ðØ59÷õ4:õ"õõõPõ@õð ×Ò÷,2ð ,2ó ð,2ð^ ×Ò÷@ð @ó ð@ñH “hÐ ÷Jc1ñ Jc1÷ZFIó Iro   