§
    ŠŠtj�o ã                  ó¢  — U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZ
d dlZd dlZd dlmZmZ d dlmZ d dlmZmZ d dlmZmZ d dlZd dlZd dlZd dlmZ d dlmc m Z! d dl"m#Z#m$Z$ d dl%m&Z& d d	l'm(Z( d d
l)m*Z+ d dl,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z> d dl?m@Z@mAZA d dlBmCZCmDZDmEZEmFZFmGZGmHZH d dlImJZJ d dlKmLZL d dlMmNZN d dlOmPZP dd
lQm*Z* ddlRmSZS ddlTmUZUmVZVmWZWmXZX ddlYmZZZ ddl[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZb dd lcmdZd dd!lemfZfmgZgmhZhmiZimjZjmkZkmlZl dd"lmmnZnmoZompZp erd dlqZrd dlsZse*jt        Zud#evd$<    ejw        ex¦  «        Zyd%evd&<   ejz        j{        Z{ejz        j|        Z|e G d'„ d(¦  «        ¦   «         Z}e G d)„ d*¦  «        ¦   «         Z~e G d+„ d,¦  «        ¦   «         Zdíd0„Z€díd1„Z�dîd4„Z‚dîd5„Zƒdïd7„Z„ G d8„ d9¦  «        Z…díd:„Z† e…¦   «         Z‡dðd=„Zˆdñd>„Z‰dòdA„ZŠ	 	 dódôdM„Z‹dídN„ZŒdídO„Z�dídP„ZŽdídQ„Z�dídR„Z�dídS„Z‘dídT„Z’dídU„Z“dõdY„Z”död^„Z•d÷da„Z–	 	 	 dødùdk„Z—dúdq„Z˜dûdt„Z™düdv„Zšdýdw„Z›dþdx„Zœdÿd{„Z��d �dd|„Zž�dd}„ZŸ	 �d �dd‚„Z 	 	 �d�dd…„Z¡	 �dddBdBd†œ�ddŒ„Z¢ddd�œ�dd’„Z£ e¤d“¦  «        Z¥�d	d•„Z¦dïd–„Z§�d
d—„Z¨ej©        �dd™„¦   «         Zª�ddŸ„Z«�dd¡„Z¬�dd­„Z­�dd¯„Z®�dd°„Z¯�dd±„Z°�dd²„Z±díd³„Z²�ddµ„Z³	 �d�ddº„Z´�dd¾„Zµ�ddÁ„Z¶�ddÃ„Z·�ddÄ„Z¸�ddÅ„Z¹�ddÌ„Zºd dÍl»m¼Z¼ �ddÐ„Z½�ddÑ„Z¾	 �d�ddÓ„Z¿�ddÕ„ZÀ�ddÖ„ZÁ�ddØ„ZÂ�ddÛ„ZÃ�d dÝ„ZÄ	 �d!ddßœ�d"dá„ZÅ	 	 	 	 	 �d#�d$dì„ZÆdS (%  é    )ÚannotationsN)ÚdefaultdictÚdeque)ÚCallable)Ú	dataclassÚreplace)ÚAnyÚTYPE_CHECKING)ÚcountersÚis_node_meta_valid)Ú(create_structured_trace_for_min_cut_info)Úis_with_effects)Úconfig)ÚCustomKnapsackSolverÚCustomRuntimeEstimator)ÚFakeScriptObject)Ú
is_builtin)Ú
LazyStringÚtrace_structured)Ú	trace_log)Úextract_tensor_metadata)ÚBackwardState)Úis_sym_nodeÚpy_sym_types)Úmagic_methodsÚmethod_to_operator)Úfind_symbol_binding_fx_nodesÚfree_symbolsÚis_symbol_binding_fx_nodeÚoptimization_hintÚstatically_known_falseÚstatically_known_true)Úgraph_drawer)Ú_get_memory_budget_annotation)Ú
OrderedSet)ÚCheckpointPolicyé   )ÚGraphInfoProvider)Údp_knapsackÚdp_knapsack_sliding_hirschbergÚgreedy_knapsackÚilp_knapsack)ÚKnapsackEvaluator)Ú	AOTOutputÚSavedForBackwardsAOTOutputÚ#SavedForBackwardsNoVcCheckAOTOutput)Ú_is_functional_graph)Úis_opaque_node)Úget_aot_graph_name)Ú_is_bwd_seed_offsetÚ_is_fwd_seed_offsetÚ
_is_primalÚ_is_tangentÚget_default_generatorÚget_device_rng_stateÚsupports_graphsafe_rng)Úfx_graph_cseÚget_aten_targetÚraise_getitemsÚboolÚAOT_PARTITIONER_DEBUGzlogging.LoggerÚlogc                  ón   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   dd„Zdd„Zdd„Zdd„Zdd„Z	dS )ÚOpTypesz8Class for keeping track of different operator categorieszOrderedSet[Callable[..., Any]]Úfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsÚnodeúfx.NodeÚreturnr>   c                ó.   — t          |¦  «        | j        v S ©N)r<   rC   ©ÚselfrH   s     ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_functorch/partitioners.pyÚ
is_fusiblezOpTypes.is_fusiblek   s   € Ý˜tÑ$Ô$¨Ô(8Ð8Ð8ó    c                ó.   — t          |¦  «        | j        v S rL   )r<   rD   rM   s     rO   Úis_compute_intensivezOpTypes.is_compute_intensiven   s   € Ý˜tÑ$Ô$¨Ô(BÐBÐBrQ   c                ó.   — t          |¦  «        | j        v S rL   )r<   rE   rM   s     rO   Ú	is_randomzOpTypes.is_randomq   s   € Ý˜tÑ$Ô$¨¬Ð7Ð7rQ   c                ó.   — t          |¦  «        | j        v S rL   )r<   rF   rM   s     rO   Úis_viewzOpTypes.is_viewt   s   € Ý˜tÑ$Ô$¨¬Ð5Ð5rQ   c                ó.   — t          |¦  «        | j        v S rL   )r<   rG   rM   s     rO   Úis_recomputablezOpTypes.is_recomputablew   s   € Ý˜tÑ$Ô$¨Ô(=Ð=Ð=rQ   N©rH   rI   rJ   r>   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rP   rS   rU   rW   rY   © rQ   rO   rB   rB   a   sÀ   € € € € € € àBÐBà/Ð/Ð/Ñ/Ø9Ð9Ð9Ñ9Ø.Ð.Ð.Ñ.Ø,Ð,Ð,Ñ,Ø4Ð4Ð4Ñ4ð9ð 9ð 9ð 9ðCð Cð Cð Cð8ð 8ð 8ð 8ð6ð 6ð 6ð 6ð>ð >ð >ð >ð >ð >rQ   rB   c                  ó˜   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ej        dd„¦   «         Zdd„Zdd„Zdd„Z	dd„Z
dS )ÚNodeInfoúlist[fx.Node]ÚinputsúOrderedSet[fx.Node]Ú_required_fw_nodesÚrequired_bw_nodesÚtangents_closureÚunclaimed_nodesúdict[fx.Node, int]Úfw_orderÚstatic_lifetime_input_nodesrJ   c                óJ   ‡ — t          d„ ‰ j        D ¦   «         ˆ fd„¬¦  «        S )Nc              3  ó   K  — | ]}|V — Œd S rL   r`   ©Ú.0Úns     rO   ú	<genexpr>z-NodeInfo.required_fw_nodes.<locals>.<genexpr>‹   s"   è è € Ð0Ð0�1ˆQÐ0Ð0Ð0Ð0Ð0Ð0rQ   c                ó   •— ‰j         |          S rL   )rk   )rq   rN   s    €rO   ú<lambda>z,NodeInfo.required_fw_nodes.<locals>.<lambda>‹   s   ø€ ÀÄÈaÔ@P€ rQ   ©Úkey)Úsortedrf   ©rN   s   `rO   Úrequired_fw_nodeszNodeInfo.required_fw_nodesˆ   s:   ø€ åØ0Ð0˜Ô/Ð0Ñ0Ô0Ð6PÐ6PÐ6PÐ6Pð
ñ 
ô 
ð 	
rQ   rq   rI   r>   c                ó   — || j         v S rL   )rf   ©rN   rq   s     rO   Úis_required_fwzNodeInfo.is_required_fwŽ   s   € Ø�DÔ+Ð+Ð+rQ   c                ó   — || j         v S rL   )rg   r{   s     rO   Úis_required_bwzNodeInfo.is_required_bw‘   s   € Ø�DÔ*Ð*Ð*rQ   c                ó   — || j         v S rL   )ri   r{   s     rO   Úis_unclaimedzNodeInfo.is_unclaimed”   s   € Ø�DÔ(Ð(Ð(rQ   Úintc                óT   — || j         vrt          d|› d�¦  «        ‚| j        |         S )NúNode z not in fw nodes!)rf   ÚAssertionErrorrk   r{   s     rO   Úget_fw_orderzNodeInfo.get_fw_order—   s7   € Ø�DÔ+Ð+Ð+Ý Ð!=¨Ð!=Ð!=Ð!=Ñ>Ô>Ð>ØŒ}˜QÔÐrQ   N)rJ   rc   )rq   rI   rJ   r>   )rq   rI   rJ   r�   )r[   r\   r]   r_   Ú	functoolsÚcached_propertyry   r|   r~   r€   r…   r`   rQ   rO   rb   rb   {   sÞ   € € € € € € ð ÐÐÑØ+Ð+Ð+Ñ+Ø*Ð*Ð*Ñ*Ø)Ð)Ð)Ñ)Ø(Ð(Ð(Ñ(Ø Ð Ð Ñ à4Ð4Ð4Ñ4àÔð
ð 
ð 
ñ Ôð
ð
,ð ,ð ,ð ,ð+ð +ð +ð +ð)ð )ð )ð )ð ð  ð  ð  ð  ð  rQ   rb   c                  óB   — e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )ÚMinCutOptionsr>   Úban_if_used_far_apartÚban_if_long_fusible_chainsÚban_if_materialized_backwardÚban_if_not_in_allowlistÚban_if_reductionN)r[   r\   r]   r_   r`   rQ   rO   r‰   r‰   �   sN   € € € € € € àÐÐÑØ$Ð$Ð$Ñ$Ø&Ð&Ð&Ñ&Ø!Ð!Ð!Ñ!ØÐÐÑÐÐrQ   r‰   rH   rI   rJ   c                óh   — | j                              dd ¦  «        t          j        t          j        fv S )NÚ	recompute)ÚmetaÚgetr&   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©rH   s    rO   Úmust_recomputer–   ¦   s0   € ØŒ9�=Š=˜ dÑ+Ô+ÝÔ'ÝÔ)ð0ð ð rQ   c                óÒ   — t          | j                             d¦  «        t          j        ¦  «        o5t          | j        ¦  «        dk    ot          d„ | j        D ¦   «         ¦  «        S )NÚvalr   c              3  óZ   K  — | ]&}|j         t          j        j        j        j        u V — Œ'd S rL   )ÚtargetÚtorchÚopsÚatenÚ_assert_scalarÚdefault©rp   Úusers     rO   rr   z*_is_assert_only_symbool.<locals>.<genexpr>±   sD   è è € ð 
ð 
ØEIˆDŒK�5œ9œ>Ô8Ô@Ð@ð
ð 
ð 
ð 
ð 
ð 
rQ   )Ú
isinstancer‘   r’   r›   ÚSymBoolÚlenÚusersÚallr•   s    rO   Ú_is_assert_only_symboolr§   ­   si   € å�4”9—=’= Ñ'Ô'­¬Ñ7Ô7ð 	
Ý�”
‰OŒO˜aÒð	
åð 
ð 
ØMQÌZð
ñ 
ô 
ñ 
ô 
ðrQ   Úfx_gúfx.GraphModulec                óH   — | j         j        D ]}t          |¦  «        r dS ŒdS )NTF)ÚgraphÚnodesr–   ©r¨   rH   s     rO   Úhas_recomputable_opsr®   ·   s7   € Ø”
Ô ð ð ˆÝ˜$ÑÔð 	Ø�4�4ð	àˆ5rQ   c                ó¬   — | j         j        D ]F}t          |¦  «        r5t          |j        d¦  «        r t
          j        j        |j        j        v r dS ŒGdS )NÚtagsTF)	r«   r¬   r–   Úhasattrrš   r›   ÚTagÚnondeterministic_seededr°   r­   s     rO   Úhas_recomputable_rng_opsr´   ¾   s^   € Ø”
Ô ð ð ˆå˜4Ñ Ô ð	å˜œ VÑ,Ô,ð	õ ”	Ô1°T´[Ô5EÐEÐEà�4�4øØˆ5rQ   r�   c                ó
  — t          | j        d         t          j        t          j        f¦  «        rdS t          | j        d         t          j        ¦  «        s*t          dt          | j        d         ¦  «        › �¦  «        ‚dS )Nr˜   r'   z.expected node.meta['val'] to be SymFloat, got é   )r¢   r‘   r›   ÚSymIntr£   ÚSymFloatr„   Útyper•   s    rO   Úsym_node_sizerº   É   sw   € Ý�$”)˜EÔ"¥U¤\µ5´=Ð$AÑBÔBð ØˆqÝ�d”i Ô&­¬Ñ7Ô7ð 
ÝØU½TÀ$Ä)ÈEÔBRÑ=SÔ=SÐUÐUñ
ô 
ð 	
ð ˆ1rQ   c                  ó   — e Zd Zdd„ZdS )ÚInvalidNodeBaserJ   Ústrc                ó   — dS )NzInvalid Noder`   rx   s    rO   Ú__repr__zInvalidNodeBase.__repr__Ô   s   € Øˆ~rQ   N)rJ   r½   )r[   r\   r]   r¿   r`   rQ   rO   r¼   r¼   Ó   s(   € € € € € ðð ð ð ð ð rQ   r¼   c                ó6   — t          | j        dd ¦  «        dk    S )NÚ	namespaceÚ_c10d_functional)Úgetattrrš   r•   s    rO   Úis_not_collectiverÄ   Ù   s   € Ý�4”; ¨TÑ2Ô2Ð6HÒHÐHrQ   Úgetitem_nodeúfx.Node | Nonec                ó:  — | j         t          j        k    rdS | j        d         }| j        d         }t	          |t
          j        ¦  «        r|j        dk    rdS d|j        vrdS |j        d         }||vrdS ||         }t	          |t
          j        ¦  «        r|S dS )zÄGiven a getitem node, check if it extracts from a higher-order op
    that has kwargs mapping the key back to an original input.

    Returns the original input node if found, None otherwise.
    Nr   r'   Úcall_functionÚkwargs)	rš   ÚoperatorÚgetitemÚargsr¢   ÚfxÚNodeÚoprÉ   )rÅ   Ú	ho_resultrv   rÉ   Úoriginal_inputs        rO   Ú_get_ho_op_original_inputrÒ   à   s±   € ð Ô�hÔ.Ò.Ð.ØˆtØÔ! !Ô$€IØ
Ô
˜AÔ
€CÝ�i¥¤Ñ)Ô)ð ¨Y¬\¸_Ò-LÐ-LØˆtØ�yÔ'Ð'Ð'ØˆtØÔ˜hÔ'€Fà
�&ÐÐØˆtà˜C”[€NÝ�.¥"¤'Ñ*Ô*ð ØÐØˆ4rQ   c                óð   — | j         t          j        j        j        j        t          j        j        j        j        fvrdS | j        d         }t          |t          j
        ¦  «        sdS t          |¦  «        S )zÊCheck if node is a view/reshape of a higher-order op output that aliases an input.

    Returns the original input node from the higher-order op's kwargs if the pattern
    matches, None otherwise.
    Nr   )rš   r›   rœ   r�   ÚviewrŸ   ÚreshaperÌ   r¢   rÍ   rÎ   rÒ   )rH   Úsources     rO   Ú_is_copy_node_bw_onlyr×   ù   sa   € ð „{�5œ9œ>Ô.Ô6½¼	¼Ô8NÔ8VÐWÐWÐWØˆtØŒY�qŒ\€FÝ�f�bœgÑ&Ô&ð ØˆtÝ$ VÑ,Ô,Ð,rQ   Úenvúdict[fx.Node, Any]c                óæ   — t          | ¦  «        }|�'||v r#t          ||         t          ¦  «        s||         S t          | ¦  «        }|�'||v r#t          ||         t          ¦  «        s||         S dS )aµ  Try to find a valid input replacement for an invalid forward output.

    This handles cases where a forward output depends on backward nodes but
    semantically aliases an input. For example, a view of a getitem from a
    triton kernel that mutates a buffer in backward, or a direct getitem from
    such a higher-order op. The original input may be a primal or a valid
    intermediate node already present in the forward graph.
    N)r×   r¢   r¼   rÒ   )rH   rØ   rÑ   s      rO   Ú_find_input_for_invalid_outputrÛ     s�   € õ +¨4Ñ0Ô0€NàÐ"Ø˜cÐ!Ð!Ý˜3˜~Ô.µÑ@Ô@ð "ð �>Ô"Ð"å.¨tÑ4Ô4€NàÐ"Ø˜cÐ!Ð!Ý˜3˜~Ô.µÑ@Ô@ð "ð �>Ô"Ð"Øˆ4rQ   FÚjoint_graphúfx.Graphrd   rc   ÚoutputsÚoutputs_descsúlist[AOTOutput]Úsubgraphú
str | NoneÚignore_must_be_in_fw_bwc                ó   ‡— t          j        ¦   «         }i Š|D ]-}|                     |j        ¦  «        }|j        |_        |‰|<   Œ.| j        D �]}|sHt          |¦  «        r|dk    r||vrt          ‰|<   Œ)t          |¦  «        r|dk    r||vrt          ‰|<   ŒM|‰v rŒR|j	        dk    rt          ‰|<   Œh|j	        dk    r`t          j        |j        i |j        ¤Ž}	ˆfd„|	D ¦   «         }	t          |	¦  «        rt          ‰|<   Œ¶|                     |ˆfd„¦  «        ‰|<   ŒÓ|j	        dk    r|                     |ˆfd„¦  «        ‰|<   Œû|j	        d	k    r	 �Œ	g }
t!          ||¦  «        D �]{\  }}t#          |t           j        ¦  «        �rE|‰vrt'          d
|› d�¦  «        ‚t#          ‰|         t(          ¦  «        röd}|j        t,          j        j        j        j        u r”t          |¦  «        r…t7          |j        ¦  «        dk    rmt#          |j        d         t           j        ¦  «        rH|j        d         ‰v r9t#          ‰|j        d                  t(          ¦  «        s‰|j        d                  }|€t9          |‰¦  «        }|�|
                     |¦  «         �Œ6t=          d
|› d�¦  «        ‚|
                     ‰|         ¦  «         �Œf|
                     |¦  «         �Œ}|                     tA          |
¦  «        ¦  «        }||j        d<   d„ |
D ¦   «         |j        d<   | !                    ¦   «          | "                    ¦   «          |S )a‘  
    Given a graph, extracts out a subgraph that takes the specified nodes as
    inputs and returns the specified outputs.

    This includes specifying non-placeholder nodes as inputs.

    The general strategy is to initialize all inputs with proxies as we
    encounter them, and trace through the graph, only keeping values which take
    in valid proxies. Then, all dead code is eliminated.
    ÚbackwardÚforwardÚplaceholderrÈ   c                óz   •— g | ]7}t          |t          j        ¦  «        ¯t          ‰|         t          ¦  «        ‘Œ8S r`   )r¢   rÍ   rÎ   r¼   )rp   ÚxrØ   s     €rO   ú
<listcomp>z6_extract_graph_with_inputs_outputs.<locals>.<listcomp>^  sI   ø€ ð ð ð àÝ˜a¥¤Ñ)Ô)ðÝ˜3˜qœ6¥?Ñ3Ô3ðð ð rQ   c                ó   •— ‰|          S rL   r`   ©ré   rØ   s    €rO   rt   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>g  ó   ø€ ¸CÀ¼F€ rQ   Úget_attrc                ó   •— ‰|          S rL   r`   rì   s    €rO   rt   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>j  rí   rQ   Úoutputrƒ   z couldn't be found in envNr'   r   z was invalid, but is outputÚdescc                óz   — g | ]8}t          |t          j        ¦  «        r|j                             d ¦  «        nd‘Œ9S )Ústack_traceN)r¢   rÍ   rÎ   r‘   r’   )rp   Úvs     rO   rê   z6_extract_graph_with_inputs_outputs.<locals>.<listcomp>‘  sL   € ð 'ð 'ð 'àõ &0°µ2´7Ñ%;Ô%;ÐEˆŒ�
Š
�=Ñ!Ô!Ð!Àð'ð 'ð 'rQ   Úoutput_stack_traces)#rÍ   ÚGraphrç   Únamer‘   r¬   Ú_must_be_in_backwardÚInvalidNodeÚ_must_be_in_forwardrÏ   ÚpytreeÚarg_tree_leavesrÌ   rÉ   ÚanyÚ	node_copyÚzipr¢   rÎ   ÚRuntimeErrorr¼   rš   r›   rœ   r�   Úcopy_rŸ   r¤   rÛ   Úappendr„   rð   ÚtupleÚeliminate_dead_codeÚlint)rÜ   rd   rÞ   rß   rá   rã   Ú	new_graphrH   Únew_nodeÚall_argsÚoutput_valuesré   Úx_descÚreplacementÚoutrØ   s                  @rO   Ú"_extract_graph_with_inputs_outputsr  &  sÉ  ø€ õ$ ”‘
”
€IØ"$€Cð ð ð ˆØ×(Ò(¨¬Ñ3Ô3ˆàœ	ˆŒàˆˆD‰	ˆ	àÔ!ð )ñ )ˆØ&ð 	å$ TÑ*Ô*ðà 
Ò*Ð*Ø Ð&Ð&å'��D‘	Øõ $ DÑ)Ô)ðà 	Ò)Ð)Ø Ð&Ð&å'��D‘	Øà�3ˆ;ˆ;ð ØŒW˜Ò%Ð%Ý#ˆC�‰IˆIØŒW˜Ò'Ð'ÝÔ-¨t¬yÐH¸D¼KÐHÐHˆHðð ð ð à!ðñ ô ˆHõ
 �8‰}Œ}ð Ý'��D‘	Øà!×+Ò+¨DÐ2BÐ2BÐ2BÐ2BÑCÔCˆC�‰IˆIØŒW˜
Ò"Ð"à!×+Ò+¨DÐ2BÐ2BÐ2BÐ2BÑCÔCˆC�‰IˆIØŒW˜Ò Ð ØùØ€MÝ˜ -Ñ0Ô0ð $ñ $‰	ˆˆ6Ý�a�œÑ!Ô!ñ 	$Ø˜ˆ|ˆ|Ý"Ð#G¨1Ð#GÐ#GÐ#GÑHÔHÐHÝ˜#˜aœ&¥/Ñ2Ô2ð Mð #�ð ”H¥¤	¤Ô 4Ô <Ð<Ð<Ý,¨QÑ/Ô/ð =å˜AœF™œ qÒ(Ð(Ý" 1¤6¨!¤9­b¬gÑ6Ô6ð )àœ˜qœ	 SÐ(Ð(Ý& s¨1¬6°!¬9¤~µÑGÔGð )ð #& a¤f¨Q¤i¤.�Kð Ð&Ý"@ÀÀCÑ"HÔ"H�KØÐ*Ø!×(Ò(¨Ñ5Ô5Ð5ÙÝ$Ð%K¨QÐ%KÐ%KÐ%KÑLÔLÐLØ× Ò   Q¤Ñ(Ô(Ð(Ñ(à× Ò  Ñ#Ô#Ð#Ñ#Ø
×
Ò
�5 Ñ/Ô/Ñ
0Ô
0€CØ$€C„HˆVÑð'ð 'àð'ñ 'ô '€C„HÐ"Ñ#ð
 ×!Ò!Ñ#Ô#Ð#Ø‡N‚NÑÔÐØÐrQ   c                óÊ   — t           j        oWt          | j        t          j        j        ¦  «        rt          | j        ¦  «         p| j        t          j        j	        j
        k    S rL   )r   Úis_non_builtin_to_includer¢   rš   r›   Ú_opsÚ
OpOverloadr   rœ   Úhigher_orderÚ triton_kernel_wrapper_functionalr•   s    rO   r  r  ›  sP   € ÝÔ+ð Ý	�D”K¥¤Ô!6Ñ	7Ô	7Ð	WÅ
È4Ì;Ñ@WÔ@WÐ<Wð 	RØŒ;�%œ)Ô0ÔQÒQðrQ   c                ór   — | j         dk    o,t          | j                             d¦  «        t          ¦  «        S )Nrç   r˜   )rÏ   r¢   r‘   r’   r   r•   s    rO   Ú_is_backward_stater  ¢  s,   € ØŒ7�mÒ#ÐW­
°4´9·=²=ÀÑ3GÔ3GÍÑ(WÔ(WÐWrQ   c                ó@   — | j                              dd ¦  «        dk    S )NÚpartitioner_tagÚis_backward©r‘   r’   r•   s    rO   Ú_has_tag_is_backwardr  ¦  s   € ØŒ9�=Š=Ð*¨DÑ1Ô1°]ÒBÐBrQ   c                ó@   — | j                              dd ¦  «        dk    S )Nr  Ú
is_forwardr  r•   s    rO   Ú_has_tag_is_forwardr  ª  s   € ØŒ9�=Š=Ð*¨DÑ1Ô1°\ÒAÐArQ   c                ó@   — | j                              dd ¦  «        dk    S )Nr  Úmust_be_in_forwardr  r•   s    rO   Ú_has_tag_must_be_in_forwardr   ®  s   € ØŒ9�=Š=Ð*¨DÑ1Ô1Ð5IÒIÐIrQ   c                ó@   — | j                              dd ¦  «        dk    S )Nr  Úmust_be_in_backwardr  r•   s    rO   Ú_has_tag_must_be_in_backwardr#  ²  s   € ØŒ9�=Š=Ð*¨DÑ1Ô1Ð5JÒJÐJrQ   c                óÒ   — t          | ¦  «        rdS t          | j        t          j        j        ¦  «        o| j        j        j        }t          | ¦  «         ot          | ¦  «         o|S ©NT)
r   r¢   rš   r›   r  r  Ú_schemaÚ
is_mutabler  r#  ©rH   r'  s     rO   rú   rú   ¶  sr   € Ý" 4Ñ(Ô(ð Øˆtõ 	�4”;¥¤
Ô 5Ñ6Ô6ð 	+ØŒKÔÔ*ð õ
 ! Ñ&Ô&Ð&ð 	Ý,¨TÑ2Ô2Ð2ð	àðrQ   c                ó°   — t          | ¦  «        rdS t          | j        t          j        j        ¦  «        o| j        j        j        }t          | ¦  «        o|S r%  )	r#  r¢   rš   r›   r  r  r&  r'  r  r(  s     rO   rø   rø   Å  sU   € Ý# DÑ)Ô)ð Øˆtå�4”;¥¤
Ô 5Ñ6Ô6ð 	+ØŒKÔÔ*ð õ   Ñ%Ô%Ð4¨*Ð4rQ   Újoint_moduleÚnum_fwd_outputsúEtuple[list[fx.Node], list[fx.Node], list[AOTOutput], list[AOTOutput]]c          	     ó¢  — t          j        d„ | j                             d¬¦  «        D ¦   «         Ž }t          j        t	          t          | j                             d¬¦  «        ¦  «        ¦  «        j                             dd gt          |¦  «        z  ¦  «        ¦  «        }|d |…         }||d …         }|d |…         }||d …         }||||fS )Nc              3  ó$   K  — | ]}|j         V — Œd S rL   ©rÌ   ©rp   rH   s     rO   rr   z+_extract_fwd_bwd_outputs.<locals>.<genexpr>Ó  s$   è è € Ð	KÐ	K˜ˆ$Œ)Ð	KÐ	KÐ	KÐ	KÐ	KÐ	KrQ   rð   ©rÏ   rñ   )	rû   rü   r«   Ú
find_nodesÚnextÚiterr‘   r’   r¤   )r*  r+  rÞ   rß   Úfwd_outputsÚbwd_outputsÚfwd_outputs_descsÚbwd_outputs_descss           rO   Ú_extract_fwd_bwd_outputsr9  Ï  së   € õ Ô$Ø	KÐ	K Ô 2× =Ò =ÀÐ =Ñ JÔ JÐ	KÑ	KÔ	Kð€Gõ Ô*Ý�T�,Ô$×/Ò/°8Ð/Ñ<Ô<Ñ=Ô=Ñ>Ô>ÔC×GÒGØ�T�F�S ™\œ\Ñ)ñ	
ô 	
ñô €Mð
 Ð*˜?Ð*Ô+€KØ˜/Ð*Ð*Ô+€KØ%Ð&6 Ð&6Ô7ÐØ% oÐ&6Ð&6Ô7ÐØ˜Ð%6Ð8IÐIÐIrQ   Úsaved_valuesr÷   r½   ÚNonec                óV   — | D ]%}|j         |k    r|                      |¦  «          d S Œ&d S rL   )r÷   Úremove)r:  r÷   Úsaved_values      rO   Ú_remove_by_namer?  á  sI   € Ø#ð ð ˆØÔ˜tÒ#Ð#Ø×Ò Ñ,Ô,Ð,ØˆEˆEð $ðð rQ   Úfwd_module_outputsú#list[fx.Node] | tuple[fx.Node, ...]c                ó¤   — t          | ¦  «        }t          t          | ¦  «        dz
  dd¦  «        D ]}t          | |         ¦  «        s|dz   } nŒ|S )Nr'   éÿÿÿÿ)r¤   Úranger   )r@  ÚidxÚis      rO   Úfind_first_sym_noderG  è  sk   € õ Ð Ñ
!Ô
!€CÝ•3Ð)Ñ*Ô*¨QÑ.°°BÑ7Ô7ð ð ˆÝÐ-¨aÔ0Ñ1Ô1ð 	Ø�a‘%ˆCØˆEð	ð €JrQ   ç      ì@çê-�™—q=r«   útorch.fx.Graphútorch.fx.NodeÚmaxÚfloatÚminÚpositionc           	     óÒ
  — |                       |¦  «        5  |                      t          j        j        j        j        |f¬¦  «        }t          j        j        j                             |j        d         ¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |¦  «        5  |                      t          j        j        j	        j        |dgdf¬¦  «        }t          j        j        j	                             |j        d         dgd¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |¦  «        5  |                      t          j        j
        j        j        |t          j        f¬¦  «        }t          j        j
        j                             |j        d         t          j        ¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |¦  «        5  |                      t          j        j        j        j        ||f¬¦  «        }t          j        j        j                             |j        d         |¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |¦  «        5  |                      t          j        j        j        j        |f¬¦  «        }	t          j        j        j                             |j        d         ¦  «        |	j        d<   t          |	j        d         ¦  «        |	j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |	¦  «        5  |                      t          j        j        j        j        |	|f¬¦  «        }
t          j        j        j                             |	j        d         |¦  «        |
j        d<   t          |
j        d         ¦  «        |
j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |
¦  «        5  |                      t          j        j
        j        j        |
t          j        fd|› d|j        › �¬¦  «        }t          j        j
        j                             |
j        d         t          j        ¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |S )	Nr/  r˜   Útensor_metarC  TÚfp8_scale_pos_Ú_©rÌ   r÷   )Úinserting_afterrÈ   r›   rœ   r�   ÚabsrŸ   r‘   r   ÚamaxÚprimsÚconvert_element_typeÚfloat64Ú	clamp_minÚ
reciprocalÚmulÚTensorÚfloat32r÷   )r«   rH   rL  rN  rO  Úabs_nodeÚ	amax_nodeÚamax_64_nodeÚclamp_min_nodeÚreciprocal_nodeÚmul_nodeÚ
scale_nodes               rO   Úcalculate_quantization_scalingrg  ó  sÜ  € ð 
×	Ò	˜tÑ	$Ô	$ð Uð UØ×&Ò&ÝŒIŒNÔÔ&Ø�ð 'ñ 
ô 
ˆõ  %œyœ~Ô1×9Ò9¸$¼)ÀEÔ:JÑKÔKˆŒ�eÑÝ'>¸x¼}ÈUÔ?SÑ'TÔ'TˆŒ�mÑ$ðUð Uð Uñ Uô Uð Uð Uð Uð Uð Uð Uøøøð Uð Uð Uð Uð 
×	Ò	˜xÑ	(Ô	(ð Wð WØ×'Ò'ÝŒIŒNÔÔ'Ø˜R˜D $Ð'ð (ñ 
ô 
ˆ	õ !&¤	¤Ô 3× ;Ò ;ØŒM˜%Ô  2 $¨ñ!
ô !
ˆ	Œ�uÑõ )@À	ÄÈuÔ@UÑ(VÔ(Vˆ	Œ�}Ñ%ðWð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wð 
×	Ò	˜yÑ	)Ô	)ð 

ð 

Ø×*Ò*ÝŒIŒOÔ0Ô8Ø�Uœ]Ð+ð +ñ 
ô 
ˆõ $)¤9¤?Ô#G×#OÒ#OØŒN˜5Ô!¥5¤=ñ$
ô $
ˆÔ˜%Ñ õ ,CØÔ˜eÔ$ñ,
ô ,
ˆÔ˜-Ñ(ð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð 
×	Ò	˜|Ñ	,Ô	,ð 

ð 

Ø×,Ò,ÝŒIŒNÔ$Ô,Ø Ð$ð -ñ 
ô 
ˆõ &+¤Y¤^Ô%=×%EÒ%EØÔ˜eÔ$ cñ&
ô &
ˆÔ˜EÑ"õ .EØÔ Ô&ñ.
ô .
ˆÔ˜MÑ*ð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð 
×	Ò	˜~Ñ	.Ô	.ð 

ð 

Ø×-Ò-ÝŒIŒNÔ%Ô-Ø Ð"ð .ñ 
ô 
ˆõ ',¤i¤nÔ&?×&GÒ&GØÔ Ô&ñ'
ô '
ˆÔ˜UÑ#õ /FØÔ  Ô'ñ/
ô /
ˆÔ˜]Ñ+ð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð 
×	Ò	˜Ñ	/Ô	/ð Uð UØ×&Ò&ÝŒIŒNÔÔ%Ø! 3Ð'ð 'ñ 
ô 
ˆõ  %œyœ~Ô1×8Ò8ØÔ  Ô'¨ñ 
ô  
ˆŒ�eÑõ (?¸x¼}ÈUÔ?SÑ'TÔ'TˆŒ�mÑ$ðUð Uð Uñ Uô Uð Uð Uð Uð Uð Uð Uøøøð Uð Uð Uð Uð 
×	Ò	˜xÑ	(Ô	(ð 	Yð 	YØ×(Ò(ÝŒIŒOÔ0Ô8Ø�EœMÐ*Ø8 (Ð8Ð8¨T¬YÐ8Ð8ð )ñ 
ô 
ˆ
õ
 "'¤¤Ô!E×!MÒ!MØŒM˜%Ô ¥%¤-ñ"
ô "
ˆ
Œ˜Ñõ *AÀÄÐQVÔAWÑ)XÔ)Xˆ
Œ˜Ñ&ð	Yð 	Yð 	Yñ 	Yô 	Yð 	Yð 	Yð 	Yð 	Yð 	Yð 	Yøøøð 	Yð 	Yð 	Yð 	Yð Ðs„   –BB2Â2B6Â9B6ÃBE4Å4E8Å;E8ÆB&IÉI
ÉI
É&BLÌLÌLÌ$BO Ï OÏOÏ BQ>Ñ>RÒRÒB2UÕU Õ#U rf  Ú
quant_typeútorch.dtyper[  Ú	clamp_maxc           	     óÈ  — |                       |¦  «        5  |                      t          j        j        j        j        |t          j        f¬¦  «        }t          j        j        j                             |j        d         t          j        ¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |¦  «        5  |                      t          j        j
        j        j        ||f¬¦  «        }t          j        j
        j                             |j        d         |j        d         ¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |¦  «        5  |                      t          j        j
        j        j        ||f¬¦  «        }	t          j        j
        j                             |j        d         |¦  «        |	j        d<   t          |	j        d         ¦  «        |	j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |	¦  «        5  |                      t          j        j
        j        j        |	|f¬¦  «        }
t          j        j
        j                             |	j        d         |¦  «        |
j        d<   t          |
j        d         ¦  «        |
j        d<   d d d ¦  «         n# 1 swxY w Y   |                       |
¦  «        5  |                      t          j        j        j        j        |
|fd|› d|j        › �¬¦  «        }t          j        j        j                             |
j        d         |¦  «        |j        d<   t          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |S )Nr/  r˜   rQ  Úfp8_quant_pos_rS  rT  )rU  rÈ   r›   rœ   rX  rY  rŸ   r_  r‘   r   r�   r]  r^  r[  rj  r÷   )r«   rH   rf  rh  r[  rj  rO  Útarget_node_32Úscaled_target_nodeÚclamp_min_scaled_nodeÚclamp_max_scaled_nodeÚquant_activation_nodes               rO   Úperform_quantizationrr  A  sô  € ð 
×	Ò	˜zÑ	*Ô	*ð 

ð 

Ø×,Ò,ÝŒIŒOÔ0Ô8Ø�œÐ&ð -ñ 
ô 
ˆõ &+¤Y¤_Ô%I×%QÒ%QØŒI�eÔ�eœmñ&
ô &
ˆÔ˜EÑ"õ .EØÔ Ô&ñ.
ô .
ˆÔ˜MÑ*ð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð 
×	Ò	˜~Ñ	.Ô	.ð 

ð 

Ø"×0Ò0ÝŒIŒNÔÔ%Ø  *Ð-ð 1ñ 
ô 
Ðõ */¬¬Ô);×)BÒ)BØÔ Ô&¨
¬¸Ô(>ñ*
ô *
ÐÔ Ñ&õ 2IØÔ# EÔ*ñ2
ô 2
ÐÔ Ñ.ð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð 
×	Ò	Ð1Ñ	2Ô	2ð 

ð 

Ø %× 3Ò 3ÝŒIŒNÔ$Ô,Ø$ iÐ0ð !4ñ !
ô !
Ðõ -2¬I¬NÔ,D×,LÒ,LØÔ# EÔ*¨Iñ-
ô -
ÐÔ" 5Ñ)õ 5LØ!Ô& uÔ-ñ5
ô 5
ÐÔ" =Ñ1ð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð 
×	Ò	Ð4Ñ	5Ô	5ð 

ð 

Ø %× 3Ò 3ÝŒIŒNÔ$Ô,Ø'¨Ð3ð !4ñ !
ô !
Ðõ -2¬I¬NÔ,D×,LÒ,LØ!Ô& uÔ-¨yñ-
ô -
ÐÔ" 5Ñ)õ 5LØ!Ô& uÔ-ñ5
ô 5
ÐÔ" =Ñ1ð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð 
×	Ò	Ð4Ñ	5Ô	5ð 
ð 
Ø %× 3Ò 3ÝŒIŒOÔ0Ô8Ø'¨Ð4Ø8 (Ð8Ð8¨T¬YÐ8Ð8ð !4ñ !
ô !
Ðõ ŒIŒOÔ0×8Ò8Ø%Ô*¨5Ô1°:ñô ð 	Ô" 5Ñ)õ
 5LØ!Ô& uÔ-ñ5
ô 5
ÐÔ" =Ñ1ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð !Ð s^   –B&CÃCÃCÃ(BFÆFÆFÆ1BIÉIÉIÉ/BLÌLÌLÌ-BOÏOÏOÚtensorútorch.Tensorc                ób   — |                       ¦   «         }|                      ¦   «         }||z  dz  S )z©
    Calculate the size of a PyTorch tensor in megabytes (MB).

    Args:
        tensor (torch.Tensor): Input tensor

    Returns:
        float: Memory size in MB
    i   )ÚnumelÚelement_size)rs  Únum_elementsrw  s      rO   Úcalculate_tensor_sizery  ‡  s2   € ð —<’<‘>”>€LØ×&Ò&Ñ(Ô(€Là˜<Ñ'¨KÑ8Ð8rQ   úlist[torch.dtype]c                 ó¤   — t           j        j        j        d                              dd¦  «        } d„ |                      d¦  «        D ¦   «         } | S )NÚ!activation_quantization_aten_passÚallowed_dtypesztorch.bfloat16c                ój   — g | ]0}t          t          |                     d ¦  «        d         ¦  «        ‘Œ1S )ú.rC  )rÃ   r›   Úsplit)rp   Údtypes     rO   rê   z&get_allowed_dtypes.<locals>.<listcomp>œ  s@   € ð ð ð Ø16�•�u—{’{ 3Ñ'Ô'¨Ô+Ñ,Ô,ðð ð rQ   ú;)r›   Ú	_inductorr   Úpost_grad_fusion_optionsr’   r€  )r}  s    rO   Úget_allowed_dtypesr…  ˜  s_   € Ý”_Ô+ÔDØ+ôç	‚cÐ
Ð,Ñ-Ô-ð ðð Ø:H×:NÒ:NÈsÑ:SÔ:Sðñ ô €Nð ÐrQ   c                ó<  — t          ¦   «         }t          | ¦  «        r| j        d         j        |vrdS t          j        j        j        d                              dd¦  «        }t          | j        d         ¦  «        }t          j        j        j        d                              dd¦  «        s||k    S t          j        j        j        d                              dd¦  «        r't          ||k    ¦  «        pt          ||k    ¦  «         S t          ||k    ¦  «        S )Nr˜   Fr|  Ú
size_in_mbéd   Úskip_dynamo_guardsÚquantize_dynamic_shape)r…  r   r‘   r�  r›   rƒ  r   r„  r’   ry  r"   r!   )rH   r}  Úsize_thresholdr‡  s       rO   Úshould_quantizerŒ  ¢  s  € Ý'Ñ)Ô)€NÝ˜dÑ#Ô#ð  t¤y°Ô'7Ô'=À^Ð'SÐ'SØˆuÝ”_Ô+ÔDØ+ôç	‚cˆ,˜ÑÔð õ ' t¤y°Ô'7Ñ8Ô8€JÝŒ?Ô!Ô:Ø+ôç	‚cÐ
 Ñ&Ô&ðGð ˜^Ò+Ð+õ Œ?Ô!Ô:Ø/ô
ç
Š#Ð&¨Ñ
.Ô
.ð	Gõ )Ø˜nÒ,ñô ð Jå+¨J¸.Ò,HÑIÔIÐIðJõ
 )¨°~Ò)EÑFÔFÐFrQ   c                 ó¾   — t           j        j        j        d                              dd¦  «        } t          t           |                      d¦  «        d         ¦  «        S )Nr|  rh  ztorch.float8_e5m2r  rC  )r›   rƒ  r   r„  r’   rÃ   r€  )rh  s    rO   Úget_quant_typerŽ  ¼  sO   € Ý”Ô'Ô@Ø+ôç	‚cˆ,Ð+Ñ,Ô,ð õ •5˜*×*Ò*¨3Ñ/Ô/°Ô3Ñ4Ô4Ð4rQ   r�  útuple[float, float]c                óF   — t          j        | ¦  «        }|j        |j        fS )zÇ
    Calculate the range of values for a given torch.dtype.
    Args:
        dtype (torch.dtype): The input dtype.
    Returns:
        tuple: A tuple containing the minimum and maximum values.
    )r›   ÚfinforN  rL  )r�  Úinfos     rO   Úcalculate_ranger“  Ä  s"   € õ Œ;�uÑÔ€DØŒ8�T”XÐÐrQ   c           
     ó  ‡— |                       d¬¦  «        d         }|j        d         }t          ¦   «         }t          |¦  «        \  }}t	          ¦   «         Šg }g }t          |¦  «        D �]‹\  }	}
|	|k     rŒ|
j                             dd¦  «        �rbt          j	        j
        j        d                              dd¦  «        rct          | |
|d	|	¦  «        }t          | |
|||||	¦  «        }t          |¦  «        s|                     |¦  «         nà|                     |¦  «         nÊ|                      |
¦  «        5  |                      t          j        j        j        j        |
|fd
|	› d|
j        › �¬¦  «        }t          j        j        j                             |
j        d         |¦  «        |j        d<   t/          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |‰|	<   �Œ�ˆfd„t          |¦  «        D ¦   «         }t1          |¦  «        }||z   }|r|d |…         |z   ||d …         z   }|                     dt5          |¦  «        ¦  «         t6          d         dxx         dz  cc<   d S )Nrð   r1  r   Úsaved_for_quantizationFr|  Úuse_scalingTrI  rl  rS  rT  r˜   rQ  c                óB   •— g | ]\  }}‰                      ||¦  «        ‘ŒS r`   )r’   )rp   rF  rH   Úposition_to_quants      €rO   rê   z*quantize_activation_fw.<locals>.<listcomp>	  s;   ø€ ð ð ð Ù+2¨1¨dÐ×Ò˜a Ñ&Ô&ðð ð rQ   ÚinductorÚ%activation_quantization_fwd_aten_passr'   )r2  rÌ   rŽ  r“  ÚdictÚ	enumerater‘   r’   r›   rƒ  r   r„  rg  rr  r   r  rU  rÈ   rœ   rX  rY  rŸ   r÷   r   rG  Ú
update_argr  r   )r«   r+  rð   r5  rh  r[  rj  Útensor_scale_nodesÚsym_scale_nodesrO  rH   rf  Ú
quant_nodeÚoutput_updated_argsrE  Úscale_nodesr˜  s                   @rO   Úquantize_activation_fwr£  Ð  s  ø€ Ø×Ò ÐÑ*Ô*¨1Ô-€FØ”+˜a”.€KÝÑ!Ô!€JÝ*¨:Ñ6Ô6Ñ€IˆyÝ™œÐØ(*ÐØ%'€OÝ# KÑ0Ô0ð -5ñ -5‰ˆ�$ð �oÒ%Ð%ØàŒ9�=Š=Ð1°5Ñ9Ô9ñ #	5åŒÔ%Ô>Ø3ôçŠc�- Ñ&Ô&ðõ <Ø˜4 ¨E°8ñô �
õ
 2Ø˜4 ¨Z¸ÀIÈxñô �
õ # :Ñ.Ô.ð 7Ø&×-Ò-¨jÑ9Ô9Ð9Ð9à#×*Ò*¨:Ñ6Ô6Ð6Ð6ð ×*Ò*¨4Ñ0Ô0ð ð Ø!&×!4Ò!4Ýœ	œÔ<ÔDØ" JÐ/ØD¨hÐDÐD¸¼ÐDÐDð "5ñ "ô "�Jõ œ	œÔ<×DÒDØ œI eÔ,¨jñô ð ”O EÑ*õ
 6MØ"œ¨Ô.ñ6ô 6�J”O MÑ2ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð +5Ð˜hÑ'ùðð ð ð Ý6?ÀÑ6LÔ6Lðñ ô Ðõ
 Ð1Ñ
2Ô
2€CØ$ Ñ6€KØð 
à   Ô%¨Ñ3Ð6IÈ#È$È$Ô6OÑOð 	ð ×Ò�a�Ð2Ñ3Ô3Ñ4Ô4Ð4ÝˆZÔÐ@ÐAÐAÔAÀQÑFÐAÐAÑAÐAÐAs   Ä=BG'Ç'G+	Ç.G+	c           
     ó
	  ‡	— d„ | j         D ¦   «         }d }|D �]O}|j                             dd¦  «        �r0|j                             d¦  «         |j                             d¦  «        }t          j        j        j        d                              dd¦  «        �r¬|                      |¦  «        5  d|j	         
                    dd	¦  «        z   Š	t          ˆ	fd
„|D ¦   «         ¦  «        }d d d ¦  «         n# 1 swxY w Y   |                      |¦  «        5  |                      t          j        j        j        j        ||f¬¦  «        }t          j        j        j                             |j        d         |¦  «        |j        d<   t#          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                      |¦  «        5  |                      t          j        j        j        j        ||f¬¦  «        }t          j        j        j                             |j        d         |j        d         ¦  «        |j        d<   t#          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                      |¦  «        5  |                      t          j        j        j        j        ||f¬¦  «        }t          j        j        j                             |j        d         |¦  «        |j        d<   t#          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   nÔ|                      |¦  «        5  |                      t          j        j        j        j        ||fdt+          |j	        ¦  «        z   ¬¦  «        }t          j        j        j                             |j        d         |¦  «        |j        d<   t#          |j        d         ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   t-          |j                             ¦   «         ¦  «        D ]$}||k    r||k    r|                     ||¦  «         Œ%�ŒQt4          d         dxx         dz  cc<   d S )Nc                ó(   — g | ]}|j         d k    ¯|‘ŒS ©rç   r1  r0  s     rO   rê   z*quantize_activation_bw.<locals>.<listcomp>  s$   € ÐJÐJÐJ˜$°´¸MÒ1IÐ1I�Ð1IÐ1IÐ1IrQ   r•  FÚdequant_typer|  r–  Ú
fp8_scale_Ú
fp8_quant_Ú c              3  ó2   •K  — | ]}|j         ‰k    ¯|V — Œd S rL   ©r÷   )rp   Ú	bwd_inputÚ
scale_names     €rO   rr   z)quantize_activation_bw.<locals>.<genexpr>(  s<   øè è € ð &ð &à%Ø$œ>¨ZÒ7Ð7ð "à7Ð7Ð7Ð7ð&ð &rQ   r/  r˜   rQ  Údequant_rT  r™  Ú%activation_quantization_bwd_aten_passr'   )r¬   r‘   r’   Úpopr›   rƒ  r   r„  rU  r÷   r   r3  rÈ   rœ   rX  rY  rŸ   r   r�   Údivr^  r½   Úlistr¥   ÚkeysÚreplace_input_withr   )
r«   Ú	bw_inputsÚactivation_noderH   r§  rf  Údivided_target_node_32Údequant_noder¡   r®  s
            @rO   Úquantize_activation_bwrº    s¼  ø€ ØJÐJ %¤+ÐJÑJÔJ€IØ€OØð H@ñ H@ˆØŒ9�=Š=Ð1°5Ñ9Ô9ñ G	@ØŒI�MŠMÐ2Ñ3Ô3Ð3Øœ9Ÿ=š=¨Ñ8Ô8ˆLåŒÔ%Ô>Ø3ôçŠc�- Ñ'Ô'ñ?ð ×*Ò*¨4Ñ0Ô0ð ð à!-°´	×0AÒ0AÀ,ÐPRÑ0SÔ0SÑ!S�JÝ!%ð &ð &ð &ð &à)2ð&ñ &ô &ñ "ô "�Jðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ×*Ò*¨:Ñ6Ô6ð ð Ø&+×&9Ò&9Ýœ	œÔ<ÔDØ" LÐ1ð ':ñ 'ô '�Oõ
 œ	œÔ<×DÒDØ œI eÔ,¨lñô ð $Ô(¨Ñ/õ
 ;RØ'Ô,¨UÔ3ñ;ô ;�OÔ(¨Ñ7ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ×*Ò*¨?Ñ;Ô;ð 
ð 
Ø-2×-@Ò-@Ýœ	œÔ*Ô1Ø-¨zÐ:ð .Añ .ô .Ð*õ :?¼¼Ô9K×9RÒ9RØ'Ô,¨UÔ3°Z´_ÀUÔ5Kñ:ô :Ð*Ô/°Ñ6õ 0Ð0FÔ0KÈEÔ0RÑSÔSð +Ô/°Ñ>ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð ×*Ò*Ð+AÑBÔBð ð Ø#(×#6Ò#6Ýœ	œÔ<ÔDØ4°lÐCð $7ñ $ô $�Lõ
 œ	œÔ<×DÒDØ2Ô7¸Ô>Àñô ð !Ô% eÑ,õ
 8OØ$Ô)¨%Ô0ñ8ô 8�LÔ% mÑ4ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øð ×*Ò*¨4Ñ0Ô0ð ð Ø#(×#6Ò#6Ýœ	œÔ<ÔDØ" LÐ1Ø'­#¨d¬i©.¬.Ñ8ð $7ñ $ô $�Lõ œ	œÔ<×DÒDØ œI eÔ,¨lñô ð !Ô% eÑ,õ
 8OØ$Ô)¨%Ô0ñ8ô 8�LÔ% mÑ4ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ ˜TœZŸ_š_Ñ.Ô.Ñ/Ô/ð @ð @�Ø˜<Ò'Ð'¨D°OÒ,CÐ,CØ×+Ò+¨D°,Ñ?Ô?Ð?øùåˆZÔÐ@ÐAÐAÔAÀQÑFÐAÐAÑAÐAÐAs^   Â0:C6Ã6C:	Ã=C:	ÄBF4Æ4F8	Æ;F8	ÇBI=É=J	ÊJ	ÊBL;Ì;L?	ÍL?	ÍB(PÐP	ÐP	Ú
fwd_moduleÚ
bwd_moduleÚbwd_module_inputsúdict[str, fx.Node]c                óª  ‡ ‡— t          dd„ ˆ fd„¬¦  «         t          ‰ j        |¦  «         t          dd„ ˆ fd„¬¦  «         t          dd„ ˆfd„¬¦  «         ‰ j                             d	¬
¦  «        d         j        d         }|D ]í}d|j        v râ|t          j        dd|j        ¦  «                 }‰j                             |¦  «        5  ‰j         	                    |j        ¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |j
        d         }|j
                             |j
        ¦  «         d|j
        d<   ||j
        d<   |                     |¦  «         ‰j                             |¦  «         Œît          j        j        j        d                              dd¦  «        �rt'          ‰j                             d¬
¦  «        ¦  «        }	|	d         }
t)          |	¦  «        D ]}t+          |¦  «        s|}
 nŒ‰ j                             d	¬
¦  «        d         j        d         }|D ]~}d|j        v rs‰j                             |
¦  «        5  ‰j         	                    |j        ¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |j
                             |j
        ¦  «         |}
Œt-          ‰j        ¦  «         t          dd„ ˆfd„¬¦  «         d S )NÚartifactc                 ó   — dddœS )NÚ,before_activation_quantization_fwd_aten_passÚstring©r÷   Úencodingr`   r`   rQ   rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>q  ó   € ØBØ ð
ð 
€ rQ   c                 ó4   •— ‰                       ddd¬¦  «        S ©NFT©Úprint_outputÚinclude_strideÚinclude_device©Úprint_readable©r»  s   €rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>u  ó#   ø€ ˜:×4Ò4Ø¨tÀDð 5ñ 
ô 
€ rQ   ©Úmetadata_fnÚ
payload_fnc                 ó   — dddœS )NÚ+after_activation_quantization_fwd_aten_passrÃ  rÄ  r`   r`   rQ   rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>~  ó   € ØAØ ð
ð 
€ rQ   c                 ó4   •— ‰                       ddd¬¦  «        S rÈ  rÍ  rÏ  s   €rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>‚  rÐ  rQ   c                 ó   — dddœS )NÚ,before_activation_quantization_bwd_aten_passrÃ  rÄ  r`   r`   rQ   rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>‰  rÆ  rQ   c                 ó4   •— ‰                       ddd¬¦  «        S rÈ  rÍ  ©r¼  s   €rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>�  rÐ  rQ   rð   r1  r   r©  z^fp8_quant_pos_\d+_rª  r¬  r§  Tr•  r|  r–  rç   rC  r¨  c                 ó   — dddœS )NÚ+after_activation_quantization_bwd_aten_passrÃ  rÄ  r`   r`   rQ   rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>º  rÖ  rQ   c                 ó4   •— ‰                       ddd¬¦  «        S rÈ  rÍ  rÛ  s   €rO   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>¾  rÐ  rQ   )r   r£  r«   r2  rÌ   r÷   ÚreÚsubrU  rç   r‘   ÚupdateÚreplace_all_uses_withÚ
erase_noder›   rƒ  r   r„  r’   r³  Úreversedr7   rº  )r»  r¼  r½  r+  Úquant_fwd_module_outputsÚfwd_noder­  Úquant_bwd_inputr§  Úquant_bwd_module_inputsÚbwd_input_locÚbw_inputÚscaled_fwd_module_outputsÚscale_bwd_inputs   ``            rO   Ú#perform_fp8_activation_quantizationrí  i  s  øø€ õ Øð
ð 
ð
ð 
ð 
ð 
ð	ñ 	ô 	ð 	õ ˜:Ô+¨_Ñ=Ô=Ð=åØð
ð 
ð
ð 
ð 
ð 
ð	ñ 	ô 	ð 	õ Øð
ð 
ð
ð 
ð 
ð 
ð	ñ 	ô 	ð 	ð  *Ô/×:Ò:¸hÐ:ÑGÔGÈÔJÔOÐPQÔRÐà,ð 3ð 3ˆØ˜8œ=Ð(Ð(Ø)Ý”Ð-¨r°8´=ÑAÔAôˆIð Ô!×1Ò1°)Ñ<Ô<ð Sð SØ",Ô"2×">Ò">ÀHÄMÐ">Ñ"RÔ"R�ðSð Sð Sñ Sô Sð Sð Sð Sð Sð Sð Søøøð Sð Sð Sð Sà$œ>¨.Ô9ˆLØÔ ×'Ò'¨¬Ñ6Ô6Ð6Ø=AˆOÔ Ð!9Ñ:Ø3?ˆOÔ  Ñ0Ø×+Ò+¨OÑ<Ô<Ð<ØÔ×'Ò'¨	Ñ2Ô2Ð2øå„ÔÔ6Ø+ôç	‚cˆ-˜ÑÔñ0õ #' zÔ'7×'BÒ'BÀmÐ'BÑ'TÔ'TÑ"UÔ"UÐà/°Ô3ˆÝ Ð!8Ñ9Ô9ð 	ð 	ˆHÝ˜xÑ(Ô(ð Ø (�Ø�ðð %/Ô$4×$?Ò$?À8Ð$?Ñ$LÔ$LÈQÔ$OÔ$TÐUVÔ$WÐ!Ø1ð 	0ð 	0ˆHØ˜xœ}Ð,Ð,àÔ%×5Ò5°mÑDÔDð Wð WØ&0Ô&6×&BÒ&BÈÌÐ&BÑ&VÔ&V�OðWð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð WàÔ$×+Ò+¨H¬MÑ:Ô:Ð:Ø /�øå˜:Ô+Ñ,Ô,Ð,åØð
ð 
ð
ð 
ð 
ð 
ð	ñ 	ô 	ð 	ð 	ð 	s$   Ã!C;Ã;C?	ÄC?	É!I<É<J 	ÊJ 	rl   úOrderedSet[fx.Node] | Nonec                óÖ  — |rd„ |D ¦   «         ng }d„ | D ¦   «         }t           j        j        j        d                              dd¦  «        rd„ | D ¦   «         }|j                             d¬¦  «        d	         j        d	         }d
„ |j                             d¬¦  «        D ¦   «         }d}	|D ]¤}
|
j        |v r™t          |
¦  «        rŠ|
j        |v r!t                               d|
j        ¦  «         ŒDd|
j        d<   |
j        d         j        |
j        d<   d||
j                 j        d<   |
j        d         j        ||
j                 j        d<   d}	Œ¥|	rt          ||||¦  «         d S d S )Nc                ó   — g | ]	}|j         ‘Œ
S r`   r¬  r0  s     rO   rê   z2enable_activation_quantization.<locals>.<listcomp>Ì  s   € Ð;Ð;Ð;�tˆŒÐ;Ð;Ð;rQ   c                ó   — i | ]
}|j         |“ŒS r`   r¬  r0  s     rO   ú
<dictcomp>z2enable_activation_quantization.<locals>.<dictcomp>Ð  s   € ÐCÐCÐC¨d˜$œ) TÐCÐCÐCrQ   r|  Úexclude_primalsFc                ó0   — i | ]}d |j         v¯|j         |“ŒS )Úprimalsr¬  r0  s     rO   rò  z2enable_activation_quantization.<locals>.<dictcomp>Ô  s/   € ð 
ð 
ð 
Ø $¸	ÈÌÐ8RÐ8RˆDŒI�tÐ8RÐ8RÐ8RrQ   rð   r1  r   c                ó   — i | ]
}|j         |“ŒS r`   r¬  r0  s     rO   rò  z2enable_activation_quantization.<locals>.<dictcomp>Ø  s)   € ð ð ð Ø ˆŒ	�4ðð ð rQ   rç   z*Skipping quantization of static input %s: Tr•  r˜   r§  )r›   rƒ  r   r„  r’   r«   r2  rÌ   r÷   rŒ  r@   Údebugr‘   r�  rí  )r:  r»  r¼  rl   r+  Ústatic_input_namesÚsaved_values_namesr@  r½  Úshould_perform_fp8_quantrH   s              rO   Úenable_activation_quantizationrû  Ä  sÔ  € ð 'ð	Ð;Ð;Ð:Ð;Ñ;Ô;Ð;àð ð
 DÐC°lÐCÑCÔCÐÝ„ÔÔ6Ø+ôç	‚cÐ
˜UÑ#Ô#ð
ð
ð 
Ø(4ð
ñ 
ô 
Ðð $Ô)×4Ò4¸Ð4ÑAÔAÀ!ÔDÔIÈ!ÔLÐðð Ø$.Ô$4×$?Ò$?À=Ð$?Ñ$QÔ$Qðñ ô Ðð  %ÐØ"ð 
,ð 
,ˆØŒ9Ð*Ð*Ð*­¸tÑ/DÔ/DÐ*ØŒyÐ.Ð.Ð.Ý—	’	ÐFÈÌ	ÑRÔRÐRØØ26ˆDŒIÐ.Ñ/Ø(,¬	°%Ô(8Ô(>ˆDŒI�nÑ%àJNÐ˜dœiÔ(Ô-Ð.FÑGØ@DÄ	È%Ô@PÔ@VÐ˜dœiÔ(Ô-¨nÑ=Ø'+Ð$øàð 
Ý+Ø˜
Ð$5°ñ	
ô 	
ð 	
ð 	
ð 	
ð
ð 
rQ   )rl   rã   Úomit_aot_autograd_runtimeÚsaved_sym_nodesÚsaved_opaque_nodesúlist[fx.Node] | Nonerü  ú%tuple[fx.GraphModule, fx.GraphModule]c               óò  ‡‡#— t          | |¬¦  «        \  }}	}
}| j                             d¬¦  «        }g t          t          |¦  «        ¢}|rg ng t          t
          |¦  «        ¢}g t          t          |¦  «        ¢}g t          t          |¦  «        ¢}g t          t          |¦  «        ¢}|€g }t          | j        ||z   ‰z   |z   |z   |	|d|¬¦  «        }t          j                             ¦   «         }|                     d¬¦  «        D ]Þ}|j        s@t          ‰|j        ¦  «         t          ||j        ¦  «         t          ||j        ¦  «         ŒI|r^t!          d„ |j        D ¦   «         ¦  «        r@t          ‰|j        ¦  «         t          ||j        ¦  «         t          ||j        ¦  «         Œ©t          |¦  «        r&t          ‰|j        ¦  «         |st#          d¦  «        ‚Œßt%          ¦   «         }g }g }|D ]S}t'          |¦  «        }|r+|                     |¦  «         |                     |¦  «         Œ>|                     |¦  «         ŒTt-          | j        ¦  «        }t/          j        |‰|¦  «        D ]c}d	|j        vrŒt5          |j        d	         ¦  «        |z
  }t7          |d
„ ¬¦  «        D ]"}||vrŒ|                     ||         ¦  «         Œ#||z  }Œd|                     ¦   «          |                     ||z   ¦  «         |�sÚg }g }g }‰D ]‹}t=          |j                             d	¦  «        t@          ¦  «        r|                     |¦  «         ŒE|j                             dd¦  «        r|                     |¦  «         Œv|                     |¦  «         ŒŒ‰                     ¦   «          ‰                     ||z   ¦  «         tC          |¦  «        Š#tE          ‰¦  «        D ]K\  }}|‰#k    r@|j                             dd¦  «        s%t#          d|› d‰#› dtC          ‰¦  «        › �¦  «        ‚ŒLt          | j        ||z   |‰z   |z   |z   |z   |
ˆ#ˆfd„tG          tC          ‰¦  «        tC          |¦  «        z   tC          |¦  «        z   tC          |¦  «        z   ¦  «        D ¦   «         z   d|¬¦  «        } t          | j        |‰z   |z   |z   |z   |z   |z   |	|d|¬¦  «        }n}t          | j        ||z   |‰z   |z   |
d„ tG          tC          ‰¦  «        tC          |¦  «        z   ¦  «        D ¦   «         z   d|¬¦  «        } t          | j        ‰|z   |z   |z   |	|d|¬¦  «        }|j$        D ]}|j%        dv r
d|j        d<   ŒtL          j'         (                    | | ¦  «        }!tL          j'         (                    | |¦  «        }"tR          j*                             dd¦  «        	 �tW          ‰|!|"||¦  «         |!|"fS )aj  Extract forward and backward graph modules from a joint graph.

    Args:
        ignore_must_be_in_fw_bw: When True, disables forward/backward placement
            enforcement in _extract_graph_with_inputs_outputs. Needed when the
            joint_module is not an original fwd+bwd joint graph (e.g. a backward
            graph being re-partitioned for dI/dW splitting).
        omit_aot_autograd_runtime: When True, skips postprocessing that is
            only needed when the resulting modules will be wrapped in a custom
            autograd.Function (the AOTAutograd path). This includes: tangent input
            handling, version-counter check sorting of saved tensors, opaque object
            (FakeScriptObject) separation, and fp8 activation quantization. Set this
            to True when the fwd/bwd modules will be executed directly without autograd.
    ©r+  rç   r1  Nrå   )rã   c              3  óŠ   K  — | ]>}|j         t          j        j        j        j        u ot          |j        ¦  «        d k    V — Œ?dS ©r   N)rš   r›   rœ   rÂ   Úwait_tensorrŸ   r¤   r¥   ro   s     rO   rr   z+_extract_fwd_bwd_modules.<locals>.<genexpr>/  s_   è è € ð )
ð )
ð ð ŒH�œ	Ô2Ô>ÔFÐFð "Ý�A”G‘” Ò!ð)
ð )
ð )
ð )
ð )
ð )
rQ   z'backward_state_inputs must not be emptyr˜   c                ó   — | j         S rL   r¬  )Úss    rO   rt   z*_extract_fwd_bwd_modules.<locals>.<lambda>W  s   € °1´6€ rQ   ru   Úsaved_tensor_with_no_vc_checkFzi=z, no_vc_check_start_idx=z, len(saved_values)=c                ó~   •— g | ]9}|‰k    r"|t          ‰¦  «        k     rt          |¦  «        nt          |¦  «        ‘Œ:S r`   )r¤   r0   r/   )rp   rF  Úno_vc_check_start_idxr:  s     €€rO   rê   z,_extract_fwd_bwd_modules.<locals>.<listcomp>”  sa   ø€ ð 
ð 
ð 
ð ð Ð-Ò-Ð-°!µc¸,Ñ6GÔ6GÒ2GÐ2Gõ 4°AÑ6Ô6Ð6å/°Ñ2Ô2ð
ð 
ð 
rQ   ræ   c                ó,   — g | ]}t          |¦  «        ‘ŒS r`   )r/   ©rp   rF  s     rO   rê   z,_extract_fwd_bwd_modules.<locals>.<listcomp>·  s0   € ð ð ð àõ +¨1Ñ-Ô-ðð ð rQ   )rÈ   rî   TÚautograd_backwardr|  ),r9  r«   r2  Úfilterr6   r7   r5   r4   r  r  r›   ÚdistributedÚis_availabler¥   r?  r÷   r¦   r„   r%   r   Úaddr  r   Ú	itertoolsÚchainr‘   r   rw   ÚclearÚextendr¢   r’   r   r¤   rœ  rD  r¬   rÏ   rÍ   Ú_lazy_graph_moduleÚ_make_graph_moduleÚinductor_configr„  rû  )$r*  r:  rý  rþ  r+  rl   rã   rü  r5  r6  r7  r8  ÚplaceholdersÚprimal_inputsÚtangent_inputsÚfwd_seed_offset_inputsÚbwd_seed_offset_inputsÚbackward_state_inputsÚ	bwd_graphÚdistributed_enabledrH   Úsaved_symbolsÚsaved_sym_nodes_bindingÚsaved_sym_nodes_derivedÚsymbolÚsymbol_bindingsÚnew_symbolsr  Úsaved_values_with_vc_checkÚsaved_values_no_vc_checkÚsaved_opaque_objectsrF  Ú	fwd_graphr»  r¼  r
  s$    `                                 @rO   Ú_extract_fwd_bwd_modulesr+  î  s»  øø€ õ4 	! ¸ÐOÑOÔOñ C€K�Ð/Ð1Bð  Ô%×0Ò0°MÐ0ÑBÔB€LØ7•f�Z¨Ñ6Ô6Ð7€Mà'ÐQˆˆÐ-Q­vµkÀ<Ñ/PÔ/PÐ-Qð ð J�vÕ&9¸<ÑHÔHÐIÐØI�vÕ&9¸<ÑHÔHÐIÐØG�fÕ%7¸ÑFÔFÐGÐàÐ!ØÐå2ØÔØØ
ñ	à
ñ	ð ñ	ð !ñ		!ð
 	ØØØ 7ðñ ô €Iõ  Ô+×8Ò8Ñ:Ô:Ðà×$Ò$¨Ð$Ñ6Ô6ð Pð PˆàŒzð 	PÝ˜L¨$¬)Ñ4Ô4Ð4Ý˜O¨T¬YÑ7Ô7Ð7ÝÐ.°´	Ñ:Ô:Ð:Ð:ð
 !ð 	P¥Sð )
ð )
ð ”Zð)
ñ )
ô )
ñ &
ô &
ð 	Põ
 ˜L¨$¬)Ñ4Ô4Ð4Ý˜O¨T¬YÑ7Ô7Ð7ÝÐ.°´	Ñ:Ô:Ð:Ð:Ý Ñ%Ô%ð 	På˜L¨$¬)Ñ4Ô4Ð4Ø(ð PÝ$Ð%NÑOÔOÐOøõ /9©l¬l€MØ ÐØ Ðð  ð 1ð 1ˆÝ*¨4Ñ0Ô0ˆØð 	1Ø×Ò˜fÑ%Ô%Ð%Ø#×*Ò*¨4Ñ0Ô0Ð0Ð0à#×*Ò*¨4Ñ0Ô0Ð0Ð0õ 3°<Ô3EÑFÔF€OÝ”Ð 7¸À~ÑVÔVð %ð %ˆØ˜œ	Ð!Ð!ØÝ" 4¤9¨UÔ#3Ñ4Ô4°}ÑDˆå˜Ð)9Ð)9Ð:Ñ:Ô:ð 	?ð 	?ˆAð ˜Ð'Ð'ØØ#×*Ò*¨?¸1Ô+=Ñ>Ô>Ð>Ð>Ø˜Ñ$ˆˆð
 ×ÒÑÔÐØ×ÒÐ2Ð5LÑLÑMÔMÐMà$ñ b
ð &(Ð"Ø#%Ð Ø!ÐØ ð 	8ð 	8ˆDå˜$œ)Ÿ-š-¨Ñ.Ô.Õ0@ÑAÔAð 8Ø$×+Ò+¨DÑ1Ô1Ð1Ð1Ø”—’Ð>ÀÑFÔFð 8Ø(×/Ò/°Ñ5Ô5Ð5Ð5à*×1Ò1°$Ñ7Ô7Ð7Ð7Ø×ÒÑÔÐØ×ÒÐ6Ð9QÑQÑRÔRÐRÝ #Ð$>Ñ ?Ô ?Ðõ ! Ñ.Ô.ð 	ð 	‰GˆAˆtØÐ)Ò)Ð)Ø”y—}’}Ð%DÀeÑLÔLð Ý(Øv˜QÐvÐvÐ8MÐvÐvÕcfÐgsÑctÔctÐvÐvñô ð øõ 7ØÔØÐ2Ñ2ØØñà"ñ#ð !ñ!ð ñ	ð
 ð
ð 
ð 
ð 
ð 
õ Ý˜Ñ%Ô%ÝÐ.Ñ/Ô/ñ0åÐ,Ñ-Ô-ñ.õ ˜/Ñ*Ô*ñ+ñô ð	
ñ 
ô 
ñð Ø$;ð+
ñ 
ô 
ˆ	õ. 7ØÔØØñà"ñ#ð !ñ!ð ñ	ð
 %ñ%ð $ñ$ð ØØØ$;ð
ñ 
ô 
ˆ	ˆ	õ  7ØÔØÐ2Ñ2Ø˜,Ñ&¨Ñ8Øðð å�s <Ñ0Ô0µ3°Ñ3GÔ3GÑGÑHÔHðñ ô ñð
 Ø$;ð
ñ 
ô 
ˆ	õ 7ØÔØØñà$ñ%ð $ñ$ð ØØØ$;ð

ñ 

ô 

ˆ	ð ”ð 2ð 2ˆØŒ7Ð3Ð3Ð3Ø-1ˆDŒIÐ)Ñ*øåÔ&×9Ò9¸,È	ÑRÔR€JÝÔ&×9Ò9¸,È	ÑRÔR€JåÔ0×4Ò4Ø/°ñ	
ô 	
ð ð	õ
 	'ØØØØ'Øñ	
ô 	
ð 	
ð �zÐ!Ð!rQ   )Ústatic_lifetime_input_indicesrl   Ú_joint_inputsr	   r,  úlist[int] | Nonec          	     ó€  ‡‡— g }d}| j         j        D ]1}t          |¦  «        st          |¦  «        st	          |¦  «        r|}Œ2|€t          d¦  «        ‚| j         j        D ],}t          |¦  «        s|                     |¦  «         ||u r nŒ-t          d„ |D ¦   «         ¦  «        Št          | ¦  «        }t          | ¦  «        }	|rRt          | j         ¦  «        d         �'t          j        d¦  «         t          | |||¬¦  «        S t          | d¬¦  «        } t           j        st%          | ¦  «         t'          | ¦  «         t)          | ¦  «         |€g }t+          | ||¦  «        }
g }g }g }t,          j                             ¦   «         Šd!d„}d!d„}d!ˆfd„}| j         j        D �]®}|j        ‰vrŒ|j        dk    r&|j        d„ |                      ¦   «         D ¦   «         v rŒ>|j        t,          j        j        j        j         t,          j        j        j!        j         t,          j        j        j!        j"        t,          j        j#        j$        j         t,          j        j#        j%        j         t,          j        j#        j&        j         t,          j        j#        j&        j'        fv rŒþtQ          |¦  «        r|                     |¦  «         �Œ$ ||¦  «        r�Œ1|j)         *                    d¦  «        tV          j,        k    r<t[          |¦  «        r|                     |¦  «         n|                     |¦  «         �Œ• ||¦  «        rX|rt          d|› d|j        › �¦  «        ‚t[          |¦  «        r|                     |¦  «         n|                     |¦  «         �Œøt[          |¦  «        r|                     |¦  «         �Œ ||¦  «        s|j        dk    rt          d|› d�¦  «        ‚ˆfd„|j.        D ¦   «         }t_          d„ |D ¦   «         ¦  «        r| 0                    |¦  «         �ŒŠtc          |¦  «        s|                     |¦  «         �Œ°te          tf           4                    |¦  «         5                    ¦   «         ¦  «        }te          tf           4                    |¦  «         5                    ¦   «         ¦  «        }d„ |D ¦   «         }te          tf           4                    |¦  «         5                    ¦   «         ¦  «        }t           j6        rtm          | j         |¦  «        }|€|
j7        }tq          | |||||¬¦  «        \  }}|j          9                    tt          ¬¦  «         |j          9                    tt          ¬¦  «         |r3|	r"tw          | ||ty          |¦  «        ¦  «        \  }}t{          |¦  «        }t           j>        rddl?m>}  |||||¦  «         t�          |¦  «        }t�          |¦  «        }tƒ          |d¬ ¦  «        }ty          |
jB        ¦  «        dk    rtƒ          |d¬ ¦  «        }||fS )"aÔ  
    Partitions the :attr:`joint_module` in a manner that closely resembles the
    behavior observed in the original ``.forward()`` and ``.backward()`` of the
    callable, i.e., the resulting forward graph contains those operators that
    are executed in the original ``.forward()`` callable passed to
    :func:`aot_function`.

    The default partitioner collects the operators that are between the forward
    inputs and the forward outputs. This helps in finding the tensors which have
    to be stashed for the backward pass. These stashed tensors become the output
    of the generated forward graph. The remaining operators are then placed in
    the backward graph.

    .. warning::
        This API is experimental and likely to change.

    Args:
        joint_module(fx.GraphModule): The joint forward and backward graph. This
            is the result of AOT Autograd tracing.

    Returns:
        Returns the generated forward and backward Fx graph modules.
    Nzlast_node must not be Nonec              3  ó:   K  — | ]}|j         d k    ¯|j        V — ŒdS ©rð   N©rÏ   r÷   r0  s     rO   rr   z$default_partition.<locals>.<genexpr>  s9   è è € ð $ð $Ø¨t¬w¸(Ò/BÐ/BˆŒ	Ð/BÐ/BÐ/BÐ/Bð$ð $rQ   r   zxTrying to unsafely apply AC to a non-functional graph with the default partitioner. Falling back to min-cut partitioner.)r+  r,  T©Úis_default_partitionrH   rI   rJ   r>   c                ó‚   — d| j         v p6t          | j                              d¦  «        t          j        j        ¦  «        S )NrQ  r˜   )r‘   r¢   r’   r›   Ú_subclassesÚ
FakeTensorr•   s    rO   Ú	is_tensorz$default_partition.<locals>.is_tensor4  s;   € Ø ¤	Ð)ð 
­ZØŒI�MŠM˜%Ñ Ô ¥%Ô"3Ô">ñ.
ô .
ð 	
rQ   c                ón   — t          d„ | j        D ¦   «         ¦  «        ot          | j        ¦  «        dk    S )Nc              3  ó@   K  — | ]}|j         t          j        k    V — Œd S rL   )rš   rÊ   rË   r    s     rO   rr   z=default_partition.<locals>.is_multi_output.<locals>.<genexpr>;  s,   è è € ÐGÐG°D�”�xÔ/Ò/ÐGÐGÐGÐGÐGÐGrQ   r   )r¦   r¥   r¤   r•   s    rO   Úis_multi_outputz*default_partition.<locals>.is_multi_output9  s8   € åÐGÐG¸D¼JÐGÑGÔGÑGÔGð $Ý�D”J‘” !Ò#ð	
rQ   c                óŒ   •— |                       d¬¦  «        o-| j        dvo$‰ p!| j        t          j        j        j        j        uS )NF)Úimpure_random)rç   rð   )Ú	is_impurerÏ   rš   r›   rœ   rÂ   r  rŸ   )rH   r   s    €rO   r>  z$default_partition.<locals>.is_impure?  sW   ø€ ð �NŠN¨ˆNÑ/Ô/ð 	Ø”ððð	ð (Ð'ð UØ”;¥e¤iÔ&@Ô&LÔ&TÐTð	
rQ   rî   c              3  ó    K  — | ]	\  }}|V — Œ
d S rL   r`   ©rp   Úkrô   s      rO   rr   z$default_partition.<locals>.<genexpr>T  s7   è è € ð 3
ð 3
Ù�!�QˆAð3
ð 3
ð 3
ð 3
ð 3
ð 3
rQ   r�   z.Trying to apply AC on a graph with impure op: z, rÈ   z	Expected z to be a tensorc                ó&   •— g | ]}|j         ‰v¯|‘ŒS r`   r¬  )rp   rq   Úforward_node_namess     €rO   rê   z%default_partition.<locals>.<listcomp>‚  s&   ø€ ÐUÐUÐU °A´FÐBTÐ4TÐ4T˜1Ð4TÐ4TÐ4TrQ   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rL   )r   ro   s     rO   rr   z$default_partition.<locals>.<genexpr>ƒ  s(   è è € Ð7Ð7 !�{˜1‰~Œ~Ð7Ð7Ð7Ð7Ð7Ð7rQ   c                ó0   — g | ]}t          |¦  «        °|‘ŒS r`   )r§   r0  s     rO   rê   z%default_partition.<locals>.<listcomp>–  s6   € ð ð ð ØÕ0GÈÑ0MÔ0MðØðð ð rQ   ©rý  rþ  r+  rl   )Úis_impure_noder'   ©Úenable_activation_offloadingF©r  rZ   )Cr«   r¬   r  r6   r5   r„   r7   r  r%   r®   r´   r1   ÚwarningsÚwarnÚ#min_cut_rematerialization_partitionÚcleanup_recompute_tagsr   Ú(unsafe_allow_optimization_of_collectivesÚforce_save_collectivesÚforce_save_effectful_opsÚforce_save_bw_mutation_srcÚclassify_nodesr›   r  r  r÷   rÏ   Únamed_modulesrš   rœ   r�   rž   rŸ   Ú_assert_asyncÚmsgÚprofilerÚ_record_function_enter_newÚ_record_function_enterÚ_record_function_exitÚ_RecordFunctionr   r‘   r’   r&   Ú	MUST_SAVEr2   r¥   r¦   r  r–   r³  r›  Úfromkeysr´  Ú_sync_decision_cross_ranksrl   r+  r  rÄ   Úfunctionalize_rng_opsr¤   Ú#reordering_to_mimic_autograd_enginerI  Ú,_activation_offloading.activation_offloadingr=   Úthread_graphsafe_rng_from_hopsrg   )r*  r-  r+  r,  rl   Úforward_nodesÚ	last_noderH   Úgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsÚ	node_infor:  rý  rþ  r8  r;  r>  Úbackward_usagesÚ	fw_moduleÚ	bw_modulerI  r   rC  s                        @@rO   Údefault_partitionrk  à  s.  øø€ ð@ €MØ€IØÔ"Ô(ð ð ˆÝ˜tÑ$Ô$ð 	­
°4Ñ(8Ô(8ð 	Õ<OÐPTÑ<UÔ<Uð 	ØˆIøØÐÝÐ9Ñ:Ô:Ð:ØÔ"Ô(ð ð ˆÝ˜4Ñ Ô ð 	'Ø× Ò  Ñ&Ô&Ð&Ø�9ÐÐØˆEð å#ð $ð $Ø+ð$ñ $ô $ñ ô Ðõ "6°lÑ!CÔ!CÐÝ%=¸lÑ%KÔ%KÐ"Ø!ð WÝ Ô 2Ñ3Ô3°AÔ6ÐBõ ŒMðLñô ð õ 7ØØØ /Ø.Kð	ñ ô ð õ .¨lÐQUÐVÑVÔVˆåÔ:ð -Ý˜|Ñ,Ô,Ð,å˜\Ñ*Ô*Ð*Ý˜|Ñ,Ô,Ð,à$Ð,Ø(*Ð%ÝØÐ3°_ñô €Ið €LØ€OØÐåÔ+×8Ò8Ñ:Ô:Ðð
ð 
ð 
ð 
ð

ð 
ð 
ð 
ð
ð 
ð 
ð 
ð 
ð 
ð$ Ô"Ô(ð >&ñ >&ˆØŒ9Ð.Ð.Ð.ØØŒ7�jÒ Ð  T¤Yð 3
ð 3
Ø&×4Ò4Ñ6Ô6ð3
ñ 3
ô 3
ð &
ð &
ð ØŒ;ÝŒIŒNÔ)Ô1ÝŒIŒNÔ(Ô0ÝŒIŒNÔ(Ô,õ ŒIÔÔ9ÔAÝŒIÔÔ5Ô=ÝŒIÔÔ4Ô<ÝŒIÔÔ4ÔDð
ð 
ð 
ð Ý�tÑÔð 	ð ×"Ò" 4Ñ(Ô(Ð(ÙØˆ?˜4Ñ Ô ð 	áØŒ9�=Š=˜Ñ%Ô%Õ)9Ô)CÒCÐCÝ˜dÑ#Ô#ð *Ø"×)Ò)¨$Ñ/Ô/Ð/Ð/à×#Ò# DÑ)Ô)Ð)ÙØˆ9�T‰?Œ?ð 		Ø)ð Ý$ØZÀTÐZÐZÈTÌ[ÐZÐZñô ð õ ˜dÑ#Ô#ð *Ø"×)Ò)¨$Ñ/Ô/Ð/Ð/à×#Ò# DÑ)Ô)Ð)ÙÝ˜$ÑÔð 	Ø×%Ò% dÑ+Ô+Ð+ÙØˆy˜‰Œð 	D 4¤7¨oÒ#=Ð#=Ý Ð!B¨TÐ!BÐ!BÐ!BÑCÔCÐCØUÐUÐUÐU d¤jÐUÑUÔUˆÝÐ7Ð7 Ð7Ñ7Ô7Ñ7Ô7ð 
	ð ×"Ò" ?Ñ3Ô3Ð3ÙÝ˜dÑ#Ô#ð 	&Ø×Ò Ñ%Ô%Ð%ùå�Ÿš lÑ3Ô3×8Ò8Ñ:Ô:Ñ;Ô;€LÝ�4Ÿ=š=¨Ñ9Ô9×>Ò>Ñ@Ô@ÑAÔA€Oðð Ø(ðñ ô €Oõ �dŸmšmÐ,>Ñ?Ô?×DÒDÑFÔFÑGÔGÐåÔ(ð TÝ1°,Ô2DÀlÑSÔSˆà"Ð*Ø&/Ô&KÐ#Ý3ØØØ'Ø-Ø'Ø$?ðñ ô Ñ€Iˆyð „O×'Ò'Õ7HÐ'ÑIÔIÐIØ„O×'Ò'Õ7HÐ'ÑIÔIÐIà!ð CØ)ð 	Ý#8Ø˜i¨µC¸Ñ4HÔ4Hñ$ô $Ñ ˆI�yõ 8¸	ÑBÔBˆ	õ Ô*ð 

ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	%Ð$ØØØØ'ñ		
ô 	
ð 	
õ ˜yÑ)Ô)€IÝ˜yÑ)Ô)€Iå.¨yÀeÐLÑLÔL€IÝ
ˆ9Ô&Ñ'Ô'¨!Ò+Ð+Ý2°9È$ÐOÑOÔOˆ	à�iÐÐrQ   g    €„.Arv  c                ó   — | |j         z  S rL   )Úitemsize)rv  r�  s     rO   Ú_tensor_nbytesrn  Ð  s   € Ø�5”>Ñ!Ð!rQ   c                óX  ‡— dd„Šd| j         v �r6| j         d         }t          |t          ¦  «        rdS t          |t          t          f¦  «        rt          ˆfd„|D ¦   «         ¦  «        S t          |t          ¦  «        r-t          ˆfd	„|                     ¦   «         D ¦   «         ¦  «        S t          |t          j	        ¦  «        r ‰|¦  «        S t          |t          j
        t          f¦  «        r1t          j        rd
S t          dt          |¦  «        › d| › d�¦  «        ‚t          dt          |¦  «        › d| › �¦  «        ‚| j        dk    sFt          | j        t          j        j        ¦  «        r$t)          | j        j        j        ¦  «        d
k    rd
S t          d| › d�¦  «        ‚)Nré   ÚobjectrJ   r�   c                ó¦   — t          | t          j        ¦  «        sdS t          t	          |                      ¦   «         d¬¦  «        | j        ¦  «        S )Nr   é   ©Úfallback)r¢   r›   r^  rn  r    rv  r�  ©ré   s    rO   Úobject_nbytesz_size_of.<locals>.object_nbytesÕ  sC   € Ý˜!�Uœ\Ñ*Ô*ð 	Ø�1ÝÕ/°·²±	´	ÀDÐIÑIÔIÈ1Ì7ÑSÔSÐSrQ   r˜   r'   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rL   r`   ©rp   rq   rv  s     €rO   rr   z_size_of.<locals>.<genexpr>â  s-   øè è € Ð5Ð5¨A�}�} QÑ'Ô'Ð5Ð5Ð5Ð5Ð5Ð5rQ   c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rL   r`   rx  s     €rO   rr   z_size_of.<locals>.<genexpr>ä  s-   øè è € Ð>Ð>¨A�}�} QÑ'Ô'Ð>Ð>Ð>Ð>Ð>Ð>rQ   r   zCannot compute the size of z	 on node zð. A ScriptObject may hold tensors internally and the partitioner has no general way to measure its memory footprint. Set torch._functorch.config.unsafe_treat_script_objects_as_zero_size = True to assume such objects are zero size (unsound).zUnknown metadata type rî   rƒ   zO didn't have `val` metadata; we should always have `val` metadata on the nodes.)ré   rp  rJ   r�   )r‘   r¢   r   r³  r  Úsumr›  Úvaluesr›   r^  ÚScriptObjectr   r   Ú(unsafe_treat_script_objects_as_zero_sizer   r¹   rÏ   rš   r  r  r¤   r&  Úreturns)rH   r˜   rv  s     @rO   Ú_size_ofr  Ô  sã  ø€ ðTð Tð Tð Tð
 �”	ÐÑØŒi˜ÔˆÝ�c�<Ñ(Ô(ð 	Ø�1õ ˜�d¥E˜]Ñ+Ô+ð 	ÝÐ5Ð5Ð5Ð5°Ð5Ñ5Ô5Ñ5Ô5Ð5Ý˜�TÑ"Ô"ð 	ÝÐ>Ð>Ð>Ð>°·²±´Ð>Ñ>Ô>Ñ>Ô>Ð>Ý˜�Uœ\Ñ*Ô*ð 	Ø �= Ñ%Ô%Ð%Ý˜�eÔ0Õ2BÐCÑDÔDð 	õ Ô>ð Ø�qÝðJ­d°3©i¬ið Jð JÀ$ð Jð Jð Jñô ð õ ÐNµD¸±I´IÐNÐNÈÐNÐNÑOÔOÐOØ„w�*ÒÐÝ�4”;¥¤
Ô 5Ñ6Ô6ð å�”Ô#Ô+Ñ,Ô,°Ò1Ð1àˆqÝ
Øe�ÐeÐeÐeñô ð rQ   c           	     ó.  — ddl m}  |t          ¦  «        }| j        D ]'}|j        dk    r||j        j        xx         dz  cc<   Œ(t                               dt          | 
                    ¦   «         t          j        d¦  «        d¬¦  «        ¦  «         d S )Nr   )r   rÈ   r'   ú%sT©rv   Úreverse)Úcollectionsr   r�   r¬   rÏ   rš   r[   r@   r’  rw   ÚitemsrÊ   Ú
itemgetter)r«   r   ÚcntrH   s       rO   Ú
_count_opsrˆ    sŸ   € Ø'Ð'Ð'Ð'Ð'Ð'à%˜+¥cÑ*Ô*€CØ”ð +ð +ˆØŒ7�oÒ%Ð%Ø�”Ô$Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%øÝ‡H‚HˆT•6˜#Ÿ)š)™+œ+­8Ô+>¸qÑ+AÔ+AÈ4ÐPÑPÔPÑQÔQÐQÐQÐQrQ   ú!list[torch._ops.OpOverloadPacket]c                 óV  — g } t          t          j        j        ¦  «        D ]‡}t	          t          j        j        |¦  «        }t          |t          j        j        ¦  «        sŒA|                     ¦   «         D ]1}t          j	        j
        |j        v r|                      |¦  «          nŒ2Œˆ| S rL   )Údirr›   rœ   r�   rÃ   r¢   r  ÚOpOverloadPacketÚop_overloadsr²   Ú	pointwiser°   r  )rœ   Ú	attr_nameÚopoverloadpacketÚop_overloads       rO   Úpointwise_opsr’    s¤   € à-/€CÝ�œœÑ(Ô(ð 	ð 	ˆ	Ý"¥5¤9¤>°9Ñ=Ô=ÐÝÐ*­E¬JÔ,GÑHÔHð 	Øà+×8Ò8Ñ:Ô:ð 	ð 	ˆKÝŒyÔ" kÔ&6Ð6Ð6à—
’
Ð+Ñ,Ô,Ð,Ø�ð 7øð
 €JrQ   rÌ   útuple[Any, ...]Ú	depth_maprj   úlist[tuple[fx.Node, int]]c                óŒ   ‡— ˆfd„| D ¦   «         }t          |                     ¦   «         t          j        d¦  «        d¬¦  «        S )Nc                ój   •— i | ]/}t          |t          j        j        j        ¦  «        ¯&|‰|         “Œ0S r`   )r¢   r›   rÍ   rH   rÎ   )rp   Úargr”  s     €rO   rò  zsort_depths.<locals>.<dictcomp>  sE   ø€ ð ð ð Ø #­z¸#½u¼x¼}Ô?QÑ/RÔ/RðØˆY�sŒ^ðð ð rQ   r'   Tr‚  )rw   r…  rÊ   r†  )rÌ   r”  Ú
arg_depthss    ` rO   Úsort_depthsrš    sY   ø€ ðð ð ð Ø'+ðñ ô €Jõ �*×"Ò"Ñ$Ô$­(Ô*=¸aÑ*@Ô*@È$ÐOÑOÔOÐOrQ   Úgmc                ó4  ‡	‡
‡— t          j        ¦   «         Š
i Š	| j                             d¬¦  «        D ]}‰
                     |ˆ	fd„¦  «        ‰	|<   Œd„ t          | j        j        ¦  «        D ¦   «         Šdˆ	ˆ
ˆfd	„}t          t          t          | j        j        ¦  «        ¦  «        }d
}t          j        }|D ]"}|j        D ]}‰|         |k     r
‰|         }|}ŒŒ#|€| S t          | j        j        ¦  «        d
‰|         …         D ]:}|j        dk    r-|j        t          j        j        j        j        u r ||¦  «         Œ;t          | j        j        ¦  «        ‰|         d
…         D ]} ||¦  «         Œt          j                              | ‰
¦  «        }|S )aÄ  
    This pass finds the first bwd node in the graph (by looking at users of
    tangents) and then reorders the graph by walking from this node to all the
    way to the end of the graph. At each op in this traversal, we insert this op
    in a new graph and try to bring only the relevant subgraph from the other
    non-bwd edges relevant for this op. This closely mimics the behavior of
    autograd engine.

    Why is this pass required in the first place?

    This is an artifact of how partitioners work today. The starting point of
    partitioner is a joint graph, which is fwd and then bwd graph. In the case
    of checkpointing, we keep portions of fwd graph in their original place in
    the joint graph, while obtaining a bwd graph. As a result, the resulting bwd
    graph has copies of recomputed fwd subgraphs followed by the original bwd
    graph. If we run this naively, this leads to bad memory footprint, because
    the fwd subgraphs are live for way longer duration than necessary. This pass
    reorders the operations such that we prioritize the ops for the original bwd
    graph while only realizing those ops from the fwd graph that are necessary
    at any given point in the graph.
    rç   r1  c                ó   •— ‰|          S rL   r`   rì   s    €rO   rt   z5reordering_to_mimic_autograd_engine.<locals>.<lambda>A  s   ø€ ¸¸A¼€ rQ   c                ó   — i | ]\  }}||“Œ	S r`   r`   ©rp   rE  rH   s      rO   rò  z7reordering_to_mimic_autograd_engine.<locals>.<dictcomp>C  s   € ÐBÐBÐB™9˜3 ˆT�3ÐBÐBÐBrQ   rH   rI   rJ   r;  c                óX  •— | g}t          ¦   «         }t          |¦  «        dk    rO|                     ¦   «         } | |v s| ‰v rŒ0|                     | ¦  «         || j        z  }t          |¦  «        dk    °Ot          |ˆfd„¬¦  «        }|D ]} ‰                     | ˆfd„¦  «        ‰| <   Œd S )Nr   c                ó   •— ‰|          S rL   r`   )rq   Úorders    €rO   rt   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>S  s   ø€ À%ÈÄ(€ rQ   ru   c                ó   •— ‰|          S rL   r`   rì   s    €rO   rt   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>U  rí   rQ   )r%   r¤   r±  r  Úall_input_nodesrw   rþ   )rH   Ú	cur_nodesÚinsertable_nodesrØ   r  r¢  s      €€€rO   Úinsert_node_in_graphzAreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graphE  sá   ø€ Ø�Fˆ	Ý0:±´ÐÝ�)‰nŒn˜qÒ Ð Ø—=’=‘?”?ˆDØÐ'Ð'Ð'¨4°3¨;¨;ØØ× Ò  Ñ&Ô&Ð&ð ˜Ô-Ñ-ˆIõ �)‰nŒn˜qÒ Ð õ "Ð"2Ð8JÐ8JÐ8JÐ8JÐKÑKÔKÐØ$ð 	Dð 	DˆDØ!×+Ò+¨DÐ2BÐ2BÐ2BÐ2BÑCÔCˆC�‰IˆIð	Dð 	DrQ   NrÈ   ©rH   rI   rJ   r;  )rÍ   rö   r«   r2  rþ   rœ  r¬   r³  r  r7   ÚmathÚinfr¥   rÏ   rš   r›   rœ   r�   r  rŸ   ÚGraphModule)r›  rH   r§  r  Úfirst_node_in_bwdÚminimum_orderÚtangentr¡   Únew_gmrØ   r  r¢  s            @@@rO   r`  r`  %  sí  øøø€ õ. ”‘
”
€IØ"$€Cð ”×#Ò# }Ð#Ñ5Ô5ð @ð @ˆØ×'Ò'¨Ð.>Ð.>Ð.>Ð.>Ñ?Ô?ˆˆD‰	ˆ	àBÐB­	°"´(´.Ñ(AÔ(AÐBÑBÔB€EðDð Dð Dð Dð Dð Dð Dð Dõ& �&¥¨b¬h¬nÑ=Ô=Ñ>Ô>€NØÐÝ”H€MØ!ð )ð )ˆØ”Mð 	)ð 	)ˆDØ�TŒ{˜]Ò*Ð*Ø % d¤�Ø$(Ð!øð	)ð Ð Øˆ	õ �R”X”^Ñ$Ô$Ð%? uÐ->Ô'?Ð%?Ô@ð 'ð 'ˆØŒ7�oÒ%Ð%¨$¬+½¼¼Ô9MÔ9UÐ*UÐ*UØ Ð  Ñ&Ô&Ð&øå�R”X”^Ñ$Ô$ UÐ+<Ô%=Ð%?Ð%?Ô@ð #ð #ˆØÐ˜TÑ"Ô"Ð"Ð"õ ŒX×!Ò! " iÑ0Ô0€FØ€MrQ   ri  útorch.fx.GraphModulerj  Úfw_nodeÚbw_nodeÚdeviceútorch.deviceÚ	rng_countÚlast_fwd_inputÚlast_bwd_inputú#tuple[torch.fx.Node, torch.fx.Node]c                óÐ  — |j         }|€t          d¦  «        ‚| j        }	|j        }
t          j        j        j        }| j                             |¦  «        5  | j                             d|› �¦  «        }t          |¦  «         
                    ¦   «         |j        d<   |}ddd¦  «         n# 1 swxY w Y   |j                             |¦  «        5  |j                             d|› �¦  «        }t          |¦  «         
                    ¦   «         |j        d<   |}ddd¦  «         n# 1 swxY w Y   t          |j        ¦  «        }||d<   | j                             |¦  «        5  |	                     d||j        g|j        ¢R |¬¦  «        }ddd¦  «         n# 1 swxY w Y   |                     |¦  «         |	                     |¦  «         t          |j        ¦  «        }||d<   |
                     |¦  «        5  |
                     d||j        g|j        ¢R |¬¦  «        }|                     |¦  «         |
                     |¦  «         ddd¦  «         n# 1 swxY w Y   ||fS )	a%  
    Note [CUDA Graph Safe RNG Functionalization]

    CUDA Graph capture doesn't work with get_rng_state and set_rng_state because these functions operate on CPU values,
    while CUDA Graph RNG capture uses on-device CUDA tensors. To solve this, we use graphsafe_set_state with a
    CUDA Generator registered to the CUDA Graph before capture begins. graphsafe_set_state updates the generator's pointer
    to reference a different GeneratorImpl, ensuring subsequent calls are correctly forwarded to the desired generator
    (and its cuda-tensor RNG state during graph capture).

    For each RNG operation's forward/backward pair:

    - We create two generators initialized with identical values
    - Each forward and backward call advances its respective generator equally
    - This keeps generators synchronized so forward and backward operations use matching RNG values

    When forward is called multiple times before backward (causing desynchronization):

    - We save the forward RNG state
    - We update the backward Generator's state before executing backward

    Before each CUDA Graph replay, replay_prologue updates captured RNG pointers with current states, ensuring backward Generator
    changes are reflected during replay.

    This function modifies both forward and backward computation graphs by:

    Creating RNG state placeholders for both passes
    Updating the forward node to use graph-safe RNG state
    Updating the backward node to use graph-safe RNG state

    For more details: https://github.com/pytorch/pytorch/issues/113541
    Nzdevice_idx must not be NoneÚfwd_rng_state_r˜   Úbwd_rng_state_Ú	rng_staterÈ   ©rÌ   rÉ   )Úindexr„   r«   r›   Ú_primsÚ	rng_primsÚgraphsafe_run_with_rng_staterU  rç   r8   Úclone_stater‘   r›  rÉ   Úcreate_noderš   rÌ   râ  rã  Úinserting_before)ri  rj  r±  r²  r³  rµ  r¶  r·  Ú
device_idxÚfw_graphÚbw_graphrÁ  Úfwd_rng_stateÚbwd_rng_stateÚ	fw_kwargsÚfunctional_fw_nodeÚ
bwd_kwargsÚ
rng_outputs                     rO   Ú%apply_graphsafe_rng_functionalizationrÎ  s  sv  € ðR ”€JØÐÝÐ:Ñ;Ô;Ð;ØŒ€HØŒ€HÝ#(¤<Ô#9Ô#VÐ ð 
Œ×	(Ò	(¨Ñ	8Ô	8ð 'ð 'Ø!œ×3Ò3Ð4PÀYÐ4PÐ4PÑQÔQˆÝ$9¸&Ñ$AÔ$A×$MÒ$MÑ$OÔ$OˆÔ˜5Ñ!Ø&ˆð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ð 
Œ×	(Ò	(¨Ñ	8Ô	8ð 'ð 'Ø!œ×3Ò3Ð4PÀYÐ4PÐ4PÑQÔQˆå$9¸&Ñ$AÔ$A×$MÒ$MÑ$OÔ$OˆÔ˜5Ñ!Ø&ˆð	'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'õ �W”^Ñ$Ô$€IØ*€IˆkÑØ	Œ×	(Ò	(¨Ñ	1Ô	1ð 
ð 
Ø%×1Ò1ØØ(Ø”.Ð0 7¤<Ð0Ð0Øð	 2ñ 
ô 
Ðð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð ×!Ò!Ð"4Ñ5Ô5Ð5Ø×Ò˜Ñ Ô Ð õ �g”nÑ%Ô%€JØ+€Jˆ{ÑØ	×	"Ò	" 7Ñ	+Ô	+ð %ð %Ø×)Ò)ØØ(Ø”.Ð0 7¤<Ð0Ð0Øð	 *ñ 
ô 
ˆ
ð 	×%Ò% jÑ1Ô1Ð1Ø×Ò˜GÑ$Ô$Ð$ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð ˜>Ð)Ð)sK   ÁA	B,Â,B0Â3B0ÃA	D&Ä&D*Ä-D*Å$(FÆFÆFÇ;AIÉIÉ IÚnum_sym_nodesc                ó>  ‡'— t          j        ¦   «         }dd„}dd	„Š'd d„} || ¦  «        } ||¦  «        } ||¦  «        }	i }
| j        j        D ]…}t	          |¦  «        rtt          |j        d¦  «        r_t          j        j	        |j        j
        v rB|j        |vs	|j        |	vrŒV||j                 }||j                 }|	|j                 }||dœ|
|<   Œ†t          j        j        j        }t          j        j        j        }d }|j                             d¬¦  «        D ]}d|j        v r|} nŒ|€t#          d¦  «        ‚g }t%          t'          |j                             d¬¦  «        ¦  «        ¦  «        }t%          t'          |j                             d¬¦  «        ¦  «        ¦  «        }t)          ˆ'fd„|
                     ¦   «         D ¦   «         ¦  «        }|                     t          j        d¦  «        ¦  «         t1          |¦  «        dk    }t          j        j        }t4          j        o| o|j         p|j        j        }t?          |
                     ¦   «         ¦  «        D �]Z\  }}|d         }|d         } ‰'|¦  «        }|j        }|j        }|r+|�)tA          |¦  «        rtC          ||||||||¦  «        \  }}Œ\| "                    |¦  «        5  | #                    d||j        g|j$        ¢R |j%        ¬¦  «        }| #                    dtL          j'        |dfi ¬¦  «        } ||¦  «        |j(        d<   | #                    dtL          j'        |dfi ¬¦  «        } tS          j)        |j(        ¦  «        | _(        | *                    | ¦  «         | +                    |¦  «         | ,                    |¦  «         d d d ¦  «         n# 1 swxY w Y   | "                    |¦  «        5  dt%          |¦  «        › �}!| -                    |!¦  «        }" ||¦  «        |"j(        d<   d d d ¦  «         n# 1 swxY w Y   | "                    |¦  «        5  | #                    d||"|j        g|j$        ¢R |j%        ¬¦  «        } | *                    | ¦  «         | +                    |¦  «         d d d ¦  «         n# 1 swxY w Y   �Œ\|r­t%          t]          |j                             d¬¦  «        ¦  «        ¦  «        }#|#j$        d         }$t1          |$¦  «        |z
  }%|$d |%…         t_          |¦  «        z   |$|%d …         z   }&|j         0                    |&¦  «         |j         +                    |#¦  «         | 1                    ¦   «          | 1                    ¦   «          ||fS )!NÚgmodr©   rJ   r¾  c                ó¶   — i }| j         j        D ]I}|j        dk    r<t          |j        d¦  «        r't
          j        j        |j        j        v r
|||j	        <   ŒJ|S )NrÈ   r°   )
r«   r¬   rÏ   r±   rš   r›   r²   r³   r°   r÷   )rÑ  Úrandom_nodesrH   s      rO   Úget_rng_opsz*functionalize_rng_ops.<locals>.get_rng_opsì  sd   € Ø+-ˆØ”JÔ$ð 	/ð 	/ˆDà”˜?Ò*Ð*Ý˜DœK¨Ñ0Ô0ð +å”IÔ5¸¼Ô9IÐIÐIà*.�˜TœYÑ'øØÐrQ   rH   rI   útorch.device | Nonec                ó  — d| j         vrdS | j         d         }t          |t          ¦  «        s|f}|D ]9}t          |t          j        ¦  «        rt          |j        ¦  «        r	|j        c S Œ:t          j        d¦  «        S )zV
        Check the example value of the node outputs to find the device type.
        r˜   NÚcpu)r‘   r¢   r  r›   r^  r:   r³  )rH   Ú
candidatesÚ	candidates      rO   Ú
get_devicez)functionalize_rng_ops.<locals>.get_device÷  s‘   € ð ˜œ	Ð!Ð!Ø�4à”Y˜uÔ%ˆ
Ý˜*¥eÑ,Ô,ð 	'Ø$˜ˆJà#ð 	,ð 	,ˆIÝ˜)¥U¤\Ñ2Ô2ð ,Ý)¨)Ô*:Ñ;Ô;ð ,Ø$Ô+Ð+Ð+Ð+øåŒ|˜EÑ"Ô"Ð"rQ   r³  rt  c                óF  — ddl m}  |¦   «         }|€t          d¦  «        ‚|5  | �=t          | ¦  «        r.|                     t          | ¦  «        ¦  «        cd d d ¦  «         S |                     t          j        ¦   «         ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nr   )Údetect_fake_modezfake_mode must not be None)Útorch._guardsrÜ  r„   r:   Úfrom_tensorr9   r›   Úget_rng_state)r³  rÜ  Ú	fake_modes      rO   Úget_sample_rng_statez3functionalize_rng_ops.<locals>.get_sample_rng_state	  s/  € Ø2Ð2Ð2Ð2Ð2Ð2à$Ð$Ñ&Ô&ˆ	ØÐÝ Ð!=Ñ>Ô>Ð>Øð 	@ð 	@ØÐ!Õ&<¸VÑ&DÔ&DÐ!Ø ×,Ò,Õ-AÀ&Ñ-IÔ-IÑJÔJð	@ð 	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð ×(Ò(­Ô)<Ñ)>Ô)>Ñ?Ô?ð	@ð 	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð 	@ð 	@s   ¤3BÁ$%BÂBÂBr°   )ÚfwdÚbwdrç   r1  r®  zaCouldn't find tangent node in graph inputs. This is unexpected, please file a bug if you see thisc              3  ó:   •K  — | ]} ‰|d          ¦  «        V — ŒdS )râ  Nr`   )rp   Ú	node_pairrÚ  s     €rO   rr   z(functionalize_rng_ops.<locals>.<genexpr>;  sC   øè è € ð ð Ø)2ˆ
ˆ
�9˜UÔ#Ñ$Ô$ðð ð ð ð ð rQ   r×  r'   râ  rã  rÈ   r½  r   r˜   Úrng_state_output_rð   )rÑ  r©   rJ   r¾  )rH   rI   rJ   rÕ  )r³  rÕ  rJ   rt  )2r  Úcountr«   r¬   r–   r±   rš   r›   r²   r³   r°   r÷   r¿  rÀ  Úrun_and_save_rng_stateÚrun_with_rng_stater2  r   r3  rä  r%   r{  Údiscardr³  r¤   rƒ  r   Úgraphsafe_rng_functionalizationÚfallback_randomÚtest_configsÚ*graphsafe_rng_func_ignores_fallback_randomrœ  r:   rÎ  rÄ  rÃ  rÌ   rÉ   rÊ   rË   r‘   Úcopyrâ  rã  r  rç   r4  r  rð   Ú	recompile)(r*  ri  rj  rÏ  ÚuidrÔ  rá  Újoint_graph_rng_opsÚfw_graph_rng_opsÚbw_graph_rng_opsÚrecomputable_rng_ops_maprH   Ú	base_noder±  r²  Úrun_and_save_rngré  Úbw_tangent_start_nodeÚfw_rng_state_outputsr¶  r·  ÚdevicesÚmulti_graphsafe_devicesÚ
ind_configÚ'use_rng_graphsafe_rng_functionalizationrµ  rå  r³  rÆ  rÇ  rË  ÚstaterÍ  Ú
state_nameÚbw_rng_state_nodeÚfw_output_nodeÚ
fw_outputsÚsym_node_start_idxrÞ   rÚ  s(                                          @rO   r_  r_  Ñ  sl  ø€ õ2 Œ/Ñ
Ô
€Cð	ð 	ð 	ð 	ð#ð #ð #ð #ð$	@ð 	@ð 	@ð 	@ð &˜+ lÑ3Ô3ÐØ"�{ 9Ñ-Ô-ÐØ"�{ 9Ñ-Ô-ÐØ!ÐØÔ"Ô(ð Sð Sˆå˜4Ñ Ô ð	Så˜œ VÑ,Ô,ð	Sõ ”	Ô1°T´[Ô5EÐEÐEð
 ŒyÐ 0Ð0Ð0°D´IÐEUÐ4UÐ4UØØ+¨D¬IÔ6ˆIØ& t¤yÔ1ˆGØ& t¤yÔ1ˆGØ:AÈ'Ð2RÐ2RÐ$ YÑ/øå”|Ô-ÔDÐÝœÔ/ÔBÐà ÐØ”×*Ò*¨mÐ*Ñ<Ô<ð ð ˆØ˜œ	Ð!Ð!Ø$(Ð!ØˆEð "ð Ð$ÝØoñ
ô 
ð 	
ð +-Ðå�( 9¤?×#=Ò#=ÀÐ#=Ñ#OÔ#OÑPÔPÑQÔQ€NÝ�( 9¤?×#=Ò#=ÀÐ#=Ñ#OÔ#OÑPÔPÑQÔQ€Nåð ð ð ð Ø6N×6UÒ6UÑ6WÔ6Wðñ ô ñ ô €Gð ‡O‚O•E”L Ñ'Ô'Ñ(Ô(Ð(õ " '™lœl¨QÒ.Ðõ ”Ô'€JåÔ.ð 	
Ø'Ð'ð	
ð Ô*Ð*ð RØÔ&ÔQð ,õ !*Ð*B×*IÒ*IÑ*KÔ*KÑ LÔ Lð P-ñ P-Ñˆ	�9à˜EÔ"ˆØ˜EÔ"ˆØ�˜GÑ$Ô$ˆà”?ˆØ”?ˆð 4ðG	-àÐ"Ý& vÑ.Ô.ð #õ .SØØØØØØØØñ	.ô 	.Ñ*ˆN˜N˜Nð ×*Ò*¨7Ñ3Ô3ð !3ð !3Ø%-×%9Ò%9Ø#Ø$ð  œðà œðð ð #œ>ð &:ñ 	&ô 	&Ð"ð !×,Ò,Ø#ÝÔ$Ø,¨aÐ0Øð	 -ñ ô �ð %9Ð$8¸Ñ$@Ô$@�”
˜5Ñ!à%×1Ò1Ø#ÝÔ$à*Øðð ð 2ñ ô �
õ #'¤)¨G¬LÑ"9Ô"9�
”à×-Ò-¨jÑ9Ô9Ð9Ø×#Ò# GÑ,Ô,Ð,Ø$×+Ò+¨EÑ2Ô2Ð2ðC!3ð !3ð !3ñ !3ô !3ð !3ð !3ð !3ð !3ð !3ð !3øøøð !3ð !3ð !3ð !3ðH ×*Ò*Ð+@ÑAÔAð Mð MØ<µ°c±´Ð<Ð<�
Ø$,×$8Ò$8¸Ñ$DÔ$DÐ!Ø0DÐ0DÀVÑ0LÔ0LÐ!Ô& uÑ-ðMð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Mð
 ×*Ò*¨7Ñ3Ô3ð -ð -Ø%×1Ò1Ø#Ø&ð *Øœðð !œðð ð
 #œ>ð 2ñ 
ô 
�
ð ×-Ò-¨jÑ9Ô9Ð9Ø×#Ò# GÑ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ùð& ð 
3Ý�d 9¤?×#=Ò#=ÀÐ#=Ñ#JÔ#JÑKÔKÑLÔLˆØ#Ô(¨Ô+ˆ
Ý  ™_œ_¨}Ñ<ÐàÐ*Ð*Ð*Ô+ÝÐ(Ñ)Ô)ñ*àÐ+Ð,Ð,Ô-ñ.ð 	ð
 	Œ×Ò˜wÑ'Ô'Ð'ØŒ×"Ò" >Ñ2Ô2Ð2Ø×ÒÑÔÐØ×ÒÑÔÐØ�iÐÐs8   ËC'OÏO	ÏO	Ï,;P3Ð3P7	Ð:P7	ÑAR7Ò7R;	Ò>R;	c                óÒ   — | j         j        D ]Y}t          |j        t          j        j        ¦  «        r3|j        j        dk    r#t          |¦  «        st          j
        |j        d<   ŒZdS )z½
    By default, the partitioner is not allowed to recompute collectives
    unless they come from a user-annotated AC region.
    See Note [Recomputing collectives in the partitioner]
    rÂ   r�   N)r«   r¬   r¢   rš   r›   r  r  rÁ   r–   r&   r\  r‘   )r*  rH   s     rO   rP  rP  µ  st   € ð Ô"Ô(ð @ð @ˆå�t”{¥E¤JÔ$9Ñ:Ô:ð	@à”Ô%Ð);Ò;Ð;Ý" 4Ñ(Ô(ð <õ &6Ô%?ˆDŒI�kÑ"øð@ð @rQ   c                ó¢   ‡— dˆfd„Š| j         j        D ]:}t          |¦  «        r)t          |¦  «        st	          |¦  «        s ‰|¦  «         Œ;dS )a\  
    Force save outputs from with_effects nodes wrapping effectful ops.

    Effectful ops (registered via _register_effectful_op) should not be recomputed
    because they may have arbitrary global side effects (I/O, RNG state, collectives,
    etc.). We mark the tensor outputs of with_effects as MUST_SAVE to prevent
    recomputation of the effectful op.

    The with_effects node returns a tuple (token, result). We recursively find all
    leaf outputs extracted via getitem and mark them as MUST_SAVE. Since these are
    saved, the with_effects op doesn't need to be recomputed in backward.
    rH   rI   rJ   r;  c                óè   •— | j         D ]h}|j        t          j        u rS ‰|¦  «         t	          |j                             d¦  «        t          t          f¦  «        st          j
        |j        d<   Œid S )Nr˜   r�   )r¥   rš   rÊ   rË   r¢   r‘   r’   r  r³  r&   r\  )rH   r¡   Úmark_getitem_outputss     €rO   r  z6force_save_effectful_ops.<locals>.mark_getitem_outputsÒ  sx   ø€ Ø”Jð 	Hð 	HˆDØŒ{�hÔ.Ð.Ð.Ø$Ð$ TÑ*Ô*Ð*Ý! $¤)§-¢-°Ñ"6Ô"6½Å¸ÑFÔFð HÝ-=Ô-G�D”I˜kÑ*øð		Hð 	HrQ   Nr¨  )r«   r¬   r   r–   r  )r*  rH   r  s     @rO   rQ  rQ  Ä  sŽ   ø€ ðHð Hð Hð Hð Hð Hð Ô"Ô(ð 'ð 'ˆå˜DÑ!Ô!ð	'å" 4Ñ(Ô(ð	'õ )¨Ñ.Ô.ð	'ð
 !Ð  Ñ&Ô&Ð&øð'ð 'rQ   c                ó˜  — t          ¦   «         }t          | j        j        ¦  «        D ]¡}|j        dk    rŒ|j        t          j        j        j	        j
        u }|rmt          |¦  «        r |                     |j        d         ¦  «         t          |¦  «        r.|j        d         |v rt          j        |j        d         j        d<   ŒŸ d S d S )Nrð   r   r'   r�   )r%   rä  r«   r¬   rÏ   rš   r›   rœ   r�   r  rŸ   r#  r  rÌ   r   r&   r\  r‘   )r*  Úhas_mutation_in_bwrH   Úis_copy_s       rO   rR  rR  â  sÏ   € õ 5?±L´LÐÝ˜Ô+Ô1Ñ2Ô2ð ð ˆØŒ7�hÒÐØà”;¥%¤)¤.Ô"6Ô">Ð>ˆØð 	Ý+¨DÑ1Ô1ð 5Ø"×&Ò& t¤y°¤|Ñ4Ô4Ð4å*¨4Ñ0Ô0ð L°T´Y¸q´\ÐEWÐ5WÐ5WÝ1AÔ1K�”	˜!”Ô! +Ñ.øð ˆEˆEð!ð rQ   c                óæ   — | j         t          j        k    rdS | j        d         }t	          |¦  «        t
          j        urt          dt	          |¦  «        › �¦  «        ‚d|j        vo
| j	        dk    S )NFr   z#expected parent to be fx.Node, got rQ  rÈ   )
rš   rÊ   rË   rÌ   r¹   rÍ   rÎ   r„   r‘   rÏ   )rH   Úparents     rO   Úis_getitem_of_multi_outputr  ù  sk   € Ø„{•hÔ&Ò&Ð&ØˆuØŒY�qŒ\€FÝˆF�|„|�2œ7Ð"Ð"ÝÐQÅ4ÈÁ<Ä<ÐQÐQÑRÔRÐRØ ¤Ð+ÐJ°´¸?Ò0JÐJrQ   r4  c               óX  — | j         j        D �]}t          |¦  «        r©|j        D ]S}t          |¦  «        rBd|j        v r9d|j        v r0|j        d         |j        d         k    rt
          j        |j        d<   ŒT|j                             dd¦  «        r2t          d„ |j        D ¦   «         ¦  «        st
          j        |j        d<   Œ»d|j        vrWt          d„ |j        D ¦   «         ¦  «        r9t          |¦  «        rd|j
        d         j        v s|rt
          j        |j        d<   �Œ| S )a  
    If there are two consecutive checkpointed blocks with no operator in
    between, we would still want to stash the tensor at the boundary of
    checkpointed blocks. The following pass makes the last output node
    non-recomputable to allow for that.
    Úac_graph_idr�   Úhas_backward_hookFc              3  ó4   K  — | ]}t          |¦  «        V — Œd S rL   ©r–   r    s     rO   rr   z)cleanup_recompute_tags.<locals>.<genexpr>  sC   è è € ð Eð EØ)-•˜tÑ$Ô$ðEð Eð Eð Eð Eð ErQ   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rL   r  r    s     rO   rr   z)cleanup_recompute_tags.<locals>.<genexpr>+  s*   è è € Ð@Ð@¨T•N 4Ñ(Ô(Ð@Ð@Ð@Ð@Ð@Ð@rQ   r   )r«   r¬   r–   r¥   r‘   r&   r\  r’   rý   r  rÌ   )r*  r4  rH   r¡   s       rO   rN  rN    so  € ð Ô"Ô(ð +@ñ +@ˆÝ˜$ÑÔð *	@Øœ
ð Hð H�å" 4Ñ(Ô(ðHà%¨¬Ð2Ð2Ø%¨¬Ð2Ð2Øœ	 -Ô0°4´9¸]Ô3KÒKÐKå-=Ô-G�D”I˜kÑ*øØŒy�}Š}Ð0°%Ñ8Ô8ð DÅð Eð EØ15´ðEñ Eô Eñ Bô Bð Dõ& *:Ô)C�”	˜+Ñ&øà ¤Ð*Ð*ÝÐ@Ð@°T´ZÐ@Ñ@Ô@Ñ@Ô@ð +õ +¨4Ñ0Ô0ð	 +ð 6CÀdÄiÐPQÄlÔFWÐ5WÐ5Wà$ð 6Xõ &6Ô%?ˆDŒI�kÑ"ùØÐrQ   rg  Úmin_cut_optionsÚdont_banú)tuple[list[fx.Node], OrderedSet[fx.Node]]c                ó   ‡‡‡‡<‡=‡>‡?‡@‡A‡B‡C‡D‡E‡F‡G‡H‡I‡J‡K— ‰€t          ¦   «         Št          ¦   «         ŠIt          rZt          d„ | j        D ¦   «         ¦  «        }|t          d„ ‰Ij        D ¦   «         ¦  «        z
  }t
                               d|¦  «         dbd	„Š=dbd
„Š>dbˆ=ˆ>ˆIfd„ŠA	 dd lŠGn"# t          $ r}t          d¦  «        |‚d }~ww xY wdcˆAˆˆIfd„ŠCddˆCˆˆIfd„}dcˆAfd„ŠBdeˆBˆIfd„} ‰Gj
        ¦   «         ŠHt          ¦   «         Š<dfdgˆ<ˆˆHˆIfd„}	| j        D �]¤}
|
j        dk    rŒ|
‰j        v ra|
‰j        vr,‰H                     |
j        dz   dt           j        d¬¦  «         n,‰H                     |
j        d z   dt           j        d!¬¦  «         Œyt%          |
¦  «        r,‰H                     |
j        d z   dt           j        d"¬¦  «         Œ´t'          |
¦  «        r |	|
d#¦  «         nt)          |
¦  «        r |	|
d$¦  «          ||
¦  «        }‰                     |
¦  «        r|r |	|
|¦  «         d%|
j        vod&|
j        vp.d%|
j        v o%t/          |
j        d%         t0          j        ¦  «         }t5          |
¦  «        rt7          t9          |
¦  «        ¦  «        }d }nm|rWt/          |
j                             d%¦  «        t<          t>          f¦  «        stA          |
¦  «        rd'}d }n#t           j        }d(}n ||
‰j!        ¦  «        \  }}|rH|t           j        k    s|tD          k    r-‰H                     |
j        d z   |
j        dz   |d)|› �¬¦  «         n(‰H                     |
j        d z   |
j        dz   |¬*¦  «         |
j#        D ]5}‰H                     |
j        dz   |j        d z   t           j        d+¬¦  «         Œ6�Œ¦dhˆAˆfd0„}‰j$        �r‰j%        D ]ú}ˆfd1„|j#        D ¦   «         }ˆfd2„|j#        D ¦   «         }tM          |¦  «        dk    r¿ ||tO          |¦  «        ¦  «        }tQ          |j#        ¦  «        D ]‘}‰                     |¦  «        rz‰ )                    |¦  «        |k    ra ‰A||¦  «        rU|‰<v rŒAt
                               d3|‰ )                    |¦  «        ||‰ )                    |¦  «        ¦  «          |	|¦  «         Œ’Œû‰j*        �rŽt          ¦   «         }| j        D �]w}‰                     |¦  «        sŒ‰ )                    |¦  «        |fg}‰ )                    |¦  «        }tM          |¦  «        dk    �rtW          j,        |¦  «        \  }}||v rŒ0| -                    |¦  «         ‰ )                    |¦  «        |d4z   k    rctM          |¦  «        dk    rPt
                               d5||‰ )                    |¦  «        ‰ )                    |¦  «        ¦  «          |	|¦  «         nm|j#        D ]Q}‰                     |¦  «        r: ‰A||¦  «        r.|‰<vr*tW          j.        |‰ )                    |¦  «        |f¦  «         ŒRtM          |¦  «        dk    �°�Œy	  ‰Gj/        ‰Hd6d¦  «        \  }}�nû# ‰Gj0        $ �rŽ}tc          td          j3        ¦  «        }d }d Š@| j4        } 	 | �|  5                    d7d8d8¬9¦  «        ntm          | ¦  «        Š@to          d:d;„ ˆ@fd<„¬=¦  «         tq          d>d?¦  «        }ts          |d@¦  «        5 }!|! :                    ‰@¦  «         d d d ¦  «         n# 1 swxY w Y   n# tv          $ r}dA|› dB�}Y d }~nd }~ww xY wdC <                    ‰Gj=        j>         ?                    ‰H¦  «        ¦  «        Š?to          d:dD„ ˆ?fdE„¬=¦  «         t�          ‰H¦  «        }"|"�r
i }#d6g}$didG„}%|"D �]!\  }&}'}(|$ A                    |'¦  «         |&d6k    r5 |%|'¦  «        })|# B                    |)g ¦  «         A                    |(¦  «         ŒW|'dk    r5 |%|&¦  «        })|# B                    |)g ¦  «         A                    |(¦  «         Œ’ |%|&¦  «         |%|'¦  «        k    r5 |%|&¦  «        })|# B                    |)g ¦  «         A                    |(¦  «         Œß |%|&¦  «        }* |%|'¦  «        }+|# B                    |+g ¦  «         A                    dH|*› �¦  «         �Œ#g },|# C                    ¦   «         D ];\  }-}.|, A                    dI|-› dJ�¦  «         |.D ]}/|, A                    dK|/› �¦  «         ŒŒ<dC <                    |,¦  «        }0dL <                    |$¦  «        }1t‰          ‰H¦  «        \  }2ŠJ‰Jrto          d:dM„ ˆJfdN„¬=¦  «         |rdO|› dC�nd}3|2r	|3dP|2› dC�z  }3d}4|rdQ}4t          dR|0› dS|1› dC|3› |4› �¦  «        |‚t
                               dT¦  «         t
                               dUt‹          ˆGˆHfdV„¦  «        ¦  «         t‰          ‰H¦  «         ‚ d }~wtv          $ rW t
                               dT¦  «         t
                               dUt‹          ˆGˆHfdW„¦  «        ¦  «         t‰          ‰H¦  «         ‚ w xY w|\  }5ŠFt          ¦   «         }6ˆHfdX„|5D ¦   «         D ]'\  ŠK}7|6 F                    ˆFˆKfdY„|7D ¦   «         ¦  «         Œ(t          ¦   «         }8|6D ]_\  }9}:|9d dZ…         |:d d[…         k    r%t�          d\|9d dZ…         › d]|:d d[…         › �¦  «        ‚|9d dZ…         }-|8 -                    |-¦  «         Œ`t‘          | ¦  «        ŠDd^„ t“          | j        ¦  «        D ¦   «         ŠEt•          ˆDfd_„|8D ¦   «         ˆEfd`„¬a¦  «        };|;‰<fS )jNc              3  óˆ   K  — | ]=}|j         d k    ¯t          |j        d¦  «        ¯"t          |j        j        ¦  «        V — Œ>dS )rÈ   Ú_overloadpacketN)rÏ   r±   rš   r½   r  r0  s     rO   rr   z solve_min_cut.<locals>.<genexpr>E  sZ   è è € ð &
ð &
àØŒw˜/Ò)Ð)­g°d´kÐCTÑ.UÔ.UÐ)õ �”Ô+Ñ,Ô,à)Ð)Ð)Ð)ð&
ð &
rQ   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rL   )r½   r  s     rO   rr   z solve_min_cut.<locals>.<genexpr>J  s9   è è € ð 4
ð 4
Ø�C�‰FŒFð4
ð 4
ð 4
ð 4
ð 4
ð 4
rQ   z&Ops banned from re-materialization: %sÚarI   ÚbrJ   r>   c                ó  — |j         t          j        j        j        k    rdS |j        d         }t          j        j                             |¦  «        \  }}|D ]2}|j	        |         }| |u r dS t          |t          ¦  «        r| |v r dS Œ3dS ©NFr   T)rš   r›   rœ   r  Úauto_functionalizedrÌ   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsrÉ   r¢   r³  )r  r  Ú
mutable_opÚmutable_arg_namesrS  r÷   r˜  s          rO   Ú!can_fuse_into_auto_functionalizedz8solve_min_cut.<locals>.can_fuse_into_auto_functionalizedO  s¤   € ØŒ8•u”yÔ-ÔAÒAÐAØ�5Ø”V˜A”Yˆ
õ Ô#Ô6×GÒGàñ
ô 
ñ	
ØØð
 &ð 	 ð 	 ˆDØ”(˜4”.ˆCØ�CˆxˆxØ�t�tÝ˜#�tÑ$Ô$ð  Ø˜�8�8Ø˜4˜4øØˆurQ   c                óÆ   — |j         t          j        j        j        k    rdS |j        d         }|D ]/}|j        d         }|€t          d¦  «        ‚||         }| |u r dS Œ0dS )NFÚtensors_to_clonerÉ   zkwargs must not be NoneT)rš   r›   rœ   r  r  rÉ   r„   )r  r  r$  r÷   rÉ   r˜  s         rO   Ú.can_fuse_into_triton_kernel_wrapper_functionalzEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functionalc  s|   € ØŒ8•u”yÔ-ÔNÒNÐNØ�5ØœHÐ%7Ô8ÐØ%ð 	ð 	ˆDØœ( 8Ô,ˆFØˆ~Ý$Ð%>Ñ?Ô?Ð?Ø˜”,ˆCØ�CˆxˆxØ�t�tð àˆurQ   c                óH  •— t          |¦  «        t          j        k    rdS  ‰| |¦  «        rdS  ‰| |¦  «        rdS | j        t          j        u r*| j        d         j        t          j        j	        j
        u rdS ‰                     | ¦  «        o‰                     |¦  «        S )NTr   F)r<   r�   Úcatrš   rÊ   rË   rÌ   r›   rœ   r  r  rP   )r  r  r%  r(  Úop_typess     €€€rO   rP   z!solve_min_cut.<locals>.is_fusiblep  s´   ø€ õ ˜1ÑÔ¥¤Ò)Ð)Ø�4Ø,Ð,¨Q°Ñ2Ô2ð 	Ø�4Ø9Ð9¸!¸QÑ?Ô?ð 	Ø�4àŒH�Ô(Ð(Ð(Ø”�q”	Ô ÝŒyÔ%ÔFðGð Gð
 �5Ø×"Ò" 1Ñ%Ô%Ð@¨(×*=Ò*=¸aÑ*@Ô*@Ð@rQ   r   zANeed networkx installed to perform smart recomputation heuristicsrH   c                óz  •— ‰                      | ¦  «        rdS t          | g¦  «        }t          |¦  «        dk    r|                     ¦   «         }|j        D ]P}‰                     |¦  «        s ‰||¦  «        s dS ‰                      |¦  «        r|                     |¦  «         ŒQt          |¦  «        dk    °dS r  )rW   r%   r¤   r±  r¥   r|   r  )rH   r¥  Úcurr¡   rP   rg  r+  s       €€€rO   Úis_materialized_backwardsz0solve_min_cut.<locals>.is_materialized_backwardsŠ  sÏ   ø€ Ø×Ò˜DÑ!Ô!ð 	Ø�5Ý ˜vÑ&Ô&ˆ	Ý�)‰nŒn˜qÒ Ð Ø—-’-‘/”/ˆCØœ	ð (ð (�Ø ×/Ò/°Ñ5Ô5ð  ¸j¸jÈÈdÑ>SÔ>Sð  Ø˜4˜4Ø×#Ò# DÑ)Ô)ð (Ø—M’M $Ñ'Ô'Ð'øõ �)‰nŒn˜qÒ Ð ð ˆurQ   râ   c                ó@  •— | j         dk    rdS | j        t          j        u rdS | j                             dd¦  «        t          j        k    rdS t          j	        r‰ 
                    | ¦  «        rdS | j        t          j        j        t          j        j        fv rdS ‰j        r‰                     | ¦  «        sdS n?‰                     | ¦  «        rdS ‰                     | ¦  «        rdS t'          | ¦  «        rdS ‰j        r; ‰| ¦  «        r0t*                               d	| t/          | j        ¦  «        ¦  «         d
S | j        dk     r| j        t          j        k    rdS ‰j        r8t9          d„ | j        D ¦   «         ¦  «        }t=          | ¦  «        }|dz  |k     rdS dS )zRReturns reason string if node should be banned from recomputation, None otherwise.rÈ   Nr�   zmarked MUST_SAVEznot in recomputable allowlistz	random opzcompute intensive opznon-builtin opzmaterialized backwards: %s %szmaterialized in backwardiè  ztoo far from backwardc              3  óh   K  — | ]-}t          |t          j        ¦  «        ¯t          |¦  «        V — Œ.d S rL   )r¢   rÍ   rÎ   r  r  s     rO   rr   zBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>Ë  sM   è è € ð %ð %Ø !µ*¸QÅÄÑ2HÔ2Hð%Ý˜‘”ð%ð %ð %ð %ð %ð %rQ   r¶   zreduction op)rÏ   rš   rÊ   rË   r‘   r’   r&   r\  r   Úrecompute_viewsrW   r�   Úlift_fresh_copyrŸ   Ú
lift_freshr�   rY   rU   rS   r  rŒ   r@   r÷  r  r¥   Údist_from_bwÚmax_dist_from_bwrŽ   rz  rÌ   r  )rH   Úinput_tensors_sizeÚoutput_sizer.  r  r+  s      €€€rO   Úshould_ban_recomputationz/solve_min_cut.<locals>.should_ban_recomputation˜  sç  ø€ àŒ7�oÒ%Ð%Ø�4ØŒ;�(Ô*Ð*Ð*Ø�4ØŒ9�=Š=˜ dÑ+Ô+Õ/?Ô/IÒIÐIØ%Ð%ÝÔ!ð 	 h×&6Ò&6°tÑ&<Ô&<ð 	Ø�4ØŒ;�4Ô/Ô7½¼Ô9PÐQÐQÐQØ�4àÔ2ð 		(Ø×+Ò+¨DÑ1Ô1ð 7Ø6Ð6ð7ð ×!Ò! $Ñ'Ô'ð #Ø"�{Ø×,Ò,¨TÑ2Ô2ð .Ø-Ð-Ý(¨Ñ.Ô.ð (Ø'Ð'ð Ô7ð 	.Ð<UÐ<UØñ=
ô =
ð 	.õ �IŠIÐ5°t½UÀ4Ä:Ñ=NÔ=NÑOÔOÐOØ-Ð-ð Ô Ò$Ð$¨Ô):½VÔ=TÒ)TÐ)Tà*Ð*ð Ô+ð 	&Ý!$ð %ð %Ø%)¤Yð%ñ %ô %ñ "ô "Ðõ # 4™.œ.ˆKØ˜Q‰Ð!3Ò3Ð3Ø%�~ØˆtrQ   c                ód   •‡ — ‰ j         dk    rdS t          ˆˆ fd„‰ j        D ¦   «         ¦  «         S )Nrç   Tc              3  ó0   •K  — | ]} ‰‰|¦  «        V — Œd S rL   r`   )rp   r¡   rP   rH   s     €€rO   rr   z9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>×  s/   øè è € ÐEÐE°$�z�z $¨Ñ-Ô-ÐEÐEÐEÐEÐEÐErQ   )rÏ   r¦   r¥   )rH   rP   s   `€rO   Úis_materializedz&solve_min_cut.<locals>.is_materializedÓ  sA   øø€ ØŒ7�mÒ#Ð#Ø�4åÐEÐEÐEÐEÐE¸$¼*ÐEÑEÔEÑEÔEÐEÐErQ   rl   re   útuple[float, str | None]c           
     óØ  •— t           j        r| |v rdS t          | ¦  «        }t           j        r#‰                     | ¦  «        rt
          j        dfS t          | j        d         t          ¦  «        r.t          | j        d         t          j        ¦  «        s	t          dfS t          |dt          t          | j        d¦  «        d¦  «        z  z  ¦  «        } ‰| ¦  «        r|dfS |d	z  dfS )
z¸Returns (weight, cannot_save_reason).

        cannot_save_reason is None for finite weights, or a string explaining
        why the node cannot be saved for infinite weights.
        r  zview op (recompute_views=True)r˜   z$SymFloat (non-SymInt symbolic value)gš™™™™™ñ?rˆ  r'   Né   )r   Ú treat_parameters_as_free_to_saver  r1  rW   r©  rª  r¢   r‘   r   r›   r·   ÚINT_INFr�   rL  rN  r4  )rH   rl   Úmem_szr;  r+  s      €€rO   Úget_node_weightz&solve_min_cut.<locals>.get_node_weightÙ  s   ø€ õ Ô3ð	àÐ3Ð3Ð3à�7Ý˜$‘”ˆÝÔ!ð 	> h×&6Ò&6°tÑ&<Ô&<ð 	>õ ”8Ð=Ð=Ð=å�d”i Ô&­Ñ5Ô5ð 	Gå˜dœi¨Ô.µ´Ñ=Ô=ð GÝÐ FÐFÐFõ à�c�S¥ TÔ%6¸Ñ!<Ô!<¸aÑ@Ô@Ñ@ÑAñ
ô 
ˆð ˆ?˜4Ñ Ô ð 	$Ø˜4�<Ðà˜A‘:˜tÐ#Ð#rQ   rª  Úreasonr½   c                óÖ  •— ‰                      | ¦  «        rdS | ‰v rDt          | j        t          j        j        ¦  «        o| j        j        dk    }t          j        s|sdS t          | ¦  «        rdS d| j
        v r't          | j
        d         t          j        ¦  «        rdS ‰                     | ¦  «         ‰                     d| j        dz   t          j        |rd|› �nd¬¦  «         d	S )
NFrÂ   r˜   rÖ   Ú_inzcannot recompute: zcannot recompute©ÚcapacityrC  T)rW   r¢   rš   r›   r  r  rÁ   r   rO  r–   r‘   r¸   r  Úadd_edger÷   r©  rª  )rH   rC  Úis_collectiveÚbanned_nodesr  Únx_graphr+  s      €€€€rO   Úban_recomputation_if_allowedz3solve_min_cut.<locals>.ban_recomputation_if_allowed	  s  ø€ Ø×Ò˜DÑ!Ô!ð 	Ø�5Ø�8ÐÐõ ˜4œ;­¬
Ô(=Ñ>Ô>ð @Ø”KÔ)Ð-?Ò?ð õ Ô>ð Àmð Ø�uõ ˜$ÑÔð 	Ø�5à�D”IÐÐ¥*¨T¬Y°uÔ-=½u¼~Ñ"NÔ"NÐØ�5Ø×Ò˜ÑÔÐð
 	×ÒØØŒI˜ÑÝ”XØ4:ÐRÐ0¨Ð0Ð0Ð0Ð@Rð	 	ñ 	
ô 	
ð 	
ð ˆtrQ   rð   Ú_outÚsinkz;must be available for backward: input required for gradientrF  rE  z3must be computed in backward: required for gradientz+must recompute: marked by checkpoint policyzprimal inputzforward RNG seedr˜   rQ  ç        znon-tensor outputzcannot save: )rG  zdata dependencyÚstart_nodesrc   Ú	max_ranger�   c                óþ  •— g }| D ]-}t          j        |‰
                     |¦  «        |df¦  «         Œ.t          |¦  «        dk    r¶t          j        |¦  «        \  }}}|s‰
                     |¦  «        S |j        D ]l}‰
                     |¦  «        rU‰
                     |¦  «        |k    rŒ1‰
                     |¦  «        | ‰	||¦  «        f}||vrt          j        ||¦  «         Œmt          |¦  «        dk    °¶|S )z„
        Finds the first unfusible node in the chain of nodes starting from
        `start_nodes` and returns its position.
        Tr   )ÚheapqÚheappushr…   r¤   Úheappopr¥   r|   )rP  rQ  Úsorted_nodesrq   rS  rH   Únode_is_fusibler¡   r˜   rP   rg  s            €€rO   Úfind_first_unfusiblez+solve_min_cut.<locals>.find_first_unfusible�	  s4  ø€ ð
 9;ˆØð 	Oð 	OˆAÝŒN˜<¨)×*@Ò*@ÀÑ*CÔ*CÀQÈÐ)MÑNÔNÐNÐNå�,ÑÔ !Ò#Ð#Ý',¤}°\Ñ'BÔ'BÑ$ˆAˆt�_Ø"ð 4Ø ×-Ò-¨dÑ3Ô3Ð3Øœ
ð 
:ð 
:�Ø×+Ò+¨DÑ1Ô1ð 	:Ø ×-Ò-¨dÑ3Ô3°iÒ?Ð?Ø à!×.Ò.¨tÑ4Ô4ØØ"˜
 4¨Ñ.Ô.ð6�Cð
  ,Ð.Ð.Ýœ |°SÑ9Ô9Ð9øõ �,ÑÔ !Ò#Ð#ð ÐrQ   c                ód   •— g | ],}‰                      |¦  «        ¯‰                     |¦  «        ‘Œ-S r`   )r|   r…   ©rp   r¡   rg  s     €rO   rê   z!solve_min_cut.<locals>.<listcomp>¬	  sK   ø€ ð ð ð àØ×+Ò+¨DÑ1Ô1ðØ×&Ò& tÑ,Ô,ðð ð rQ   c                ó>   •— g | ]}‰                      |¦  «        ¯|‘ŒS r`   )r|   rZ  s     €rO   rê   z!solve_min_cut.<locals>.<listcomp>±	  s<   ø€ ð ð ð Ø°I×4LÒ4LÈTÑ4RÔ4RðØðð ð rQ   z1used above/below fusible %s:(%s) -> %s -> %s:(%s)rˆ  ztoo long %s %s %s %srÖ   FTrÉ  rÀ  c                 ó   — dddœS )NÚmin_cut_failed_fx_graphrÃ  rÄ  r`   r`   rQ   rO   rt   zsolve_min_cut.<locals>.<lambda>
  s   € Ø5Ø (ð%ð %€ rQ   c                 ó   •— ‰ S rL   r`   )Úfx_graph_strs   €rO   rt   zsolve_min_cut.<locals>.<lambda>
  s   ø€  <€ rQ   rÑ  Úmin_cut_failed_graphz.txtÚwz(failed to write: ú)ú
c                 ó   — dddœS )NÚmin_cut_failed_edge_listrÃ  rÄ  r`   r`   rQ   rO   rt   zsolve_min_cut.<locals>.<lambda>
  s   € Ø2Ø$ð!ð !€ rQ   c                 ó   •— ‰ S rL   r`   )Úedge_list_strs   €rO   rt   zsolve_min_cut.<locals>.<lambda>"
  s   ø€ ˜}€ rQ   Ú	node_namec                ón   — dD ]1}|                       |¦  «        r| d t          |¦  «         …         c S Œ2| S )N)rE  rM  )Úendswithr¤   )rh  Úsuffixs     rO   Úget_base_namez$solve_min_cut.<locals>.get_base_name6
  sO   € Ø-ð 9ð 9�FØ ×)Ò)¨&Ñ1Ô1ð 9Ø(¨­C°©K¬K¨<¨Ô8Ð8Ð8Ð8ð9à Ð rQ   zdepends on z  ú:z    - z -> c                 ó   — dddœS )NÚmin_cut_failed_svgrÃ  rÄ  r`   r`   rQ   rO   rt   zsolve_min_cut.<locals>.<lambda>a
  s   € Ø 4Ø$,ð)ð )€ rQ   c                 ó   •— ‰ S rL   r`   )Úsvg_contents   €rO   rt   zsolve_min_cut.<locals>.<lambda>e
  s   ø€  {€ rQ   zFX graph dump: zMin-cut graph visualization: z‡[Production debugging: Use tlparse to extract debug artifacts (min_cut_failed_fx_graph, min_cut_failed_edge_list, min_cut_failed_svg)]
a™  AOT Autograd failed to partition the joint forward-backward graph.

The partitioner determines which intermediate values to save from the forward pass vs recompute in the backward pass. This error means a value is required for backward, but cannot be saved AND cannot be recomputed.

This is a bug in PyTorch. Please file an issue at https://github.com/pytorch/pytorch/issues

Nodes involved in the conflict:
zª

[For PyTorch developers: one of the above constraints is wrong. Either the node should be recomputable, saveable, or not required for backward.]

[Debug: min-cut path] z-Failed to compute min-cut on following graph:r�  c                 óh   •— d                      ‰ j        j                             ‰¦  «        ¦  «        S ©Nrc  ©ÚjoinÚ	readwriteÚedgelistÚgenerate_edgelist©ÚnxrK  s   €€rO   rt   zsolve_min_cut.<locals>.<lambda>Œ
  ó&   ø€ ˜Ÿ	š	 "¤,Ô"7×"IÒ"IÈ(Ñ"SÔ"SÑTÔT€ rQ   c                 óh   •— d                      ‰ j        j                             ‰¦  «        ¦  «        S rs  rt  ry  s   €€rO   rt   zsolve_min_cut.<locals>.<lambda>–
  r{  rQ   c              3  ó,   •K  — | ]}|‰|         fV — Œd S rL   r`   )rp   rq   rK  s     €rO   rr   z solve_min_cut.<locals>.<genexpr>ž
  s,   øè è € Ð8Ð8¨�Q˜ œÐ$Ð8Ð8Ð8Ð8Ð8Ð8rQ   c              3  ó(   •K  — | ]}|‰v ¯‰|fV — Œd S rL   r`   )rp   rô   Únon_reachableÚus     €€rO   rr   z solve_min_cut.<locals>.<genexpr>Ÿ
  s1   øè è € ÐAÐA ¨a°=Ð.@Ð.@�q˜!�fÐ.@Ð.@Ð.@Ð.@ÐAÐArQ   éýÿÿÿéüÿÿÿznode_in[:-3]=z != node_out[:-4]=c                ó   — i | ]\  }}||“Œ	S r`   r`   rŸ  s      rO   rò  z!solve_min_cut.<locals>.<dictcomp>¬
  s   € ÐHÐHÐH™i˜c 4��cÐHÐHÐHrQ   c              3  ó(   •K  — | ]}‰|         V — Œd S rL   r`   ©rp   rH   Úname_to_nodes     €rO   rr   z solve_min_cut.<locals>.<genexpr>®
  s(   øè è € Ð2Ð2 ˆ�dÔ	Ð2Ð2Ð2Ð2Ð2Ð2rQ   c                ó   •— ‰|          S rL   r`   )ré   Únode_idxs    €rO   rt   zsolve_min_cut.<locals>.<lambda>®
  s   ø€ À(È1Ä+€ rQ   ru   )r  rI   r  rI   rJ   r>   rZ   )rH   rI   rJ   râ   )rH   rI   rl   re   rJ   r<  )rª  )rH   rI   rC  r½   rJ   r>   )rP  rc   rQ  r�   rJ   r�   )rh  r½   rJ   r½   )Kr%   Úget_default_op_listr?   r¬   rG   r@   r’  ÚnetworkxÚImportErrorr   ÚDiGraphrÏ   rg   rh   rH  r÷   r©  rª  r–   r6   r5   r|   r‘   r¢   r›   r^  r   rM  rº   r’   r   r   r2   rl   r@  r¥   rŠ   ry   r¤   rL  r  r…   r‹   rS  rU  r  rT  Úminimum_cutÚNetworkXUnboundedr>   r   ÚhandlersÚowning_modulerÎ  r½   r   Ú_get_unique_pathÚopenÚwriteÚ	Exceptionru  rv  rw  rx  Ú_find_infinite_capacity_pathr  Ú
setdefaultr…  Úvisualize_min_cut_graphr   rá  r„   Úget_name_to_noderœ  rw   )LrÜ   rg  r  r  Újoint_module_opsÚops_ignoredÚer8  rB  rL  rH   Ú
ban_reasonÚis_non_tensor_nodeÚweightÚcannot_save_reasonr¡   rX  Ú	used_nodeÚordersÚfw_usersÚfirst_unfusible_useÚvisitedÚ
start_nodeÚfusibleÚstart_orderrS  r-  Ú	cut_valueÚ	partitionÚunbounded_excÚstructured_tracing_enabledÚfx_graph_filer*  ÚfÚinf_pathÚnode_constraintsÚraw_path_nodesrl  Ú	from_nodeÚto_noderC  ÚbaseÚ	from_baseÚto_baseÚconstraint_linesrh  ÚconstraintsÚcÚconstraints_strÚraw_path_strÚsvg_pathÚlocal_files_msgÚtlparse_msgÚ	reachableÚcutsetÚnbrsÚ	cut_nodesÚnode_inÚnode_outr:  rJ  r%  r(  rg  r_  rP   r;  r.  r†  rˆ  r  rz  rK  r+  rq  r€  sL    ```                                                        @@@@@@@@@@@@@@@@rO   Úsolve_min_cutrÄ  :  s\  øøøøøøøøøøøøøøøøøøø€ ð ÐÝ‘<”<ˆÝ"Ñ$Ô$€Håð 	HÝ%ð &
ð &
à#Ô)ð&
ñ &
ô &
ñ 
ô 
Ðð
 '­ð 4
ð 4
Ø$Ô5ð4
ñ 4
ô 4
ñ *
ô *
ñ 
ˆõ 	�ŠÐ9¸;ÑGÔGÐGðð ð ð ð(ð ð ð ðAð Að Að Að Að Að Að Að&ØÐÐÐÐøÝð ð ð ÝØOñ
ô 
àð	øøøøðøøøð
ð ð ð ð ð ð ð ð9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ðvFð Fð Fð Fð Fð Fð&$ð &$ð &$ð &$ð &$ð &$ð &$ðP ˆrŒz‰|Œ|€HÝ(2©¬€Lðð ð ð ð ð ð ð ð ð ð@ Ô!ð Yñ YˆØŒ7�hÒÐØà�9Ô.Ð.Ð.à˜9Ô5Ð5Ð5Ø×!Ò!Ø”I Ñ&ØÝ!œXØXð	 "ñ ô ð ð ð ×!Ò!Ø”I Ñ%ØÝ!œXØPð	 "ñ ô ð ð å˜$ÑÔð 	ð
 ×ÒØ”	˜EÑ!ØÝœØDð	 ñ ô ð ð å�dÑÔð 	CØ(Ð(¨¨~Ñ>Ô>Ð>Ð>Ý  Ñ&Ô&ð 	CØ(Ð(¨Ð/AÑBÔBÐBð
 .Ð-¨dÑ3Ô3ˆ
Ø×#Ò# DÑ)Ô)ð 	;¨jð 	;Ø(Ð(¨¨zÑ:Ô:Ð:ð ˜œÐ"ÐE }¸D¼IÐ'EðUà�t”yÐ ÐS­°D´I¸eÔ4DÅeÄlÑ)SÔ)SÐ%Sð 	õ �tÑÔð 	Ý�=¨Ñ.Ô.Ñ/Ô/ˆFØ!%ÐÐØð 	õ Ø”	—’˜eÑ$Ô$¥}Õ6FÐ&Gñô ð 9å Ñ%Ô%ð9ð �Ø%)Ð"Ð"åœ�Ø%8Ð"Ð"à)8¨Ø�iÔ;ñ*ô *Ñ&ˆFÐ&ð
 ð 	V 6­T¬XÒ#5Ð#5¸Å7Ò9JÐ9JØ×ÒØ”	˜EÑ!Ø”	˜FÑ"ØØ;Ð'9Ð;Ð;ð	 ñ ô ð ð ð ×Ò˜dœi¨%Ñ/°´¸VÑ1CÈfÐÑUÔUÐUà”Jð 	ð 	ˆDØ×ÒØ”	˜FÑ"Ø”	˜EÑ!ÝœØ(ð	 ñ ô ð ð ñ	ð2ð ð ð ð ð ð ð4 Ô,ñ ;Ø"Ô4ð 	;ð 	;ˆIðð ð ð à%œOðñ ô ˆFð
ð ð ð Ø!*¤ðñ ô ˆHõ �6‰{Œ{˜QŠˆØ&:Ð&:¸8ÅSÈÁ[Ä[Ñ&QÔ&QÐ#Ý! )¤/Ñ2Ô2ð ;ð ;�Dà!×0Ò0°Ñ6Ô6ð;à%×2Ò2°4Ñ8Ô8Ð;NÒNÐNØ&˜J y°$Ñ7Ô7ð Oð   <Ð/Ð/Ø$ÝŸšØOØ%Ø%×2Ò2°9Ñ=Ô=Ø/Ø Ø%×2Ò2°4Ñ8Ô8ñô ð ð 5Ð4°TÑ:Ô:Ð:øøð Ô1ñ #VÝ'1¡|¤|ˆØ%Ô+ð !	Vñ !	VˆJØ×+Ò+¨JÑ7Ô7ð Øà×'Ò'¨
Ñ3Ô3°ZÐ@ð2ˆGð $×0Ò0°Ñ<Ô<ˆKÝ�g‘,”, Ò"Ñ"Ýœ wÑ/Ô/‘��3Ø˜'�>�>ØØ—’˜CÑ Ô Ð ð ×*Ò*¨3Ñ/Ô/°+ÀÑ2CÒCÐCÝ˜G™œ¨Ò)Ð)å—H’HØ.ØØ"Ø!×.Ò.¨sÑ3Ô3Ø!×.Ò.¨zÑ:Ô:ñô ð ð 1Ð0°Ñ5Ô5Ð5ØàœIð Vð V�Dà!×0Ò0°Ñ6Ô6ðVà&˜J s¨DÑ1Ô1ðVð !¨Ð4Ð4åœ w°×1GÒ1GÈÑ1MÔ1MÈtÐ0TÑUÔUÐUøõ5 �g‘,”, Ò"Ñ"ùð8bØ-˜rœ~¨h¸À&ÑIÔIÑˆ	�9‘9øØÔð Vñ Vð Vå%)­)Ô*<Ñ%=Ô%=Ð"ð %)ˆØ#'ˆØ"Ô0ˆð	6ð
  Ð+ð ×+Ò+Ø!&°tÈDð ,ñ ô ð õ ˜Ñ%Ô%ð õ Øðð ð 0Ð/Ð/Ð/ðñ ô ð õ -Ð-CÀVÑLÔLˆMÝ�m SÑ)Ô)ð &¨QØ—’˜Ñ%Ô%Ð%ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &øøåð 	6ð 	6ð 	6Ø5°Ð5Ð5Ð5ˆMˆMˆMˆMˆMˆMøøøøð	6øøøð Ÿ	š	 "¤,Ô"7×"IÒ"IÈ(Ñ"SÔ"SÑTÔTˆÝØðð ð -Ð,Ð,Ð,ð	
ñ 	
ô 	
ð 	
õ 0°Ñ9Ô9ˆØñ ^	!ð 68ÐØ&˜ZˆNð!ð !ð !ð !ð /7ð ñ Ñ*�	˜7 FØ×%Ò% gÑ.Ô.Ð.ð  Ò(Ð(Ø(˜=¨Ñ1Ô1�DØ$×/Ò/°°bÑ9Ô9×@Ò@ÀÑHÔHÐHÐHØ Ò&Ð&Ø(˜=¨Ñ3Ô3�DØ$×/Ò/°°bÑ9Ô9×@Ò@ÀÑHÔHÐHÐHØ"�] 9Ñ-Ô-°°¸wÑ1GÔ1GÒGÐGà(˜=¨Ñ3Ô3�DØ$×/Ò/°°bÑ9Ô9×@Ò@ÀÑHÔHÐHÐHð !. ¨iÑ 8Ô 8�IØ+˜m¨GÑ4Ô4�GØ$×/Ò/°¸Ñ<Ô<×CÒCØ1 iÐ1Ð1ñô ð ñ ð
 +-ÐØ*:×*@Ò*@Ñ*BÔ*Bð :ð :Ñ&�	˜;Ø ×'Ò'Ð(9¨YÐ(9Ð(9Ð(9Ñ:Ô:Ð:Ø$ð :ð :�AØ$×+Ò+¨L°Q¨L¨LÑ9Ô9Ð9Ð9ð:ð #ŸišiÐ(8Ñ9Ô9ˆOØ!Ÿ;š; ~Ñ6Ô6ˆLõ %<¸HÑ$EÔ$EÑ!ˆH�kØð Ý Øð!ð !ð  3Ð2Ð2Ð2ðñ ô ð ð 8EÐLÐ3 -Ð3Ð3Ð3Ð3È"ð ð ð PØÐ#OÀ8Ð#OÐ#OÐ#OÑO�ð ˆKØ)ð ðað õ
 ð!ð #ð!ð !ð *6ð!ð !ð #ð!ð ð!ð !ñô ð !ð!õ" 	�ŠÐ@ÑAÔAÐAÝ�ŠØÝØTÐTÐTÐTÐTñô ñ	
ô 	
ð 	
õ 	  Ñ)Ô)Ð)ØøøøøÝð 	ð 	ð 	Ý�ŠÐ@ÑAÔAÐAÝ�ŠØÝØTÐTÐTÐTÐTñô ñ	
ô 	
ð 	
õ 	  Ñ)Ô)Ð)Øð	øøøð  )Ñ€Iˆ}Ý*4©,¬,€FØ8Ð8Ð8Ð8¨iÐ8Ñ8Ô8ð Bð B‰ˆˆ4Ø�ŠÐAÐAÐAÐAÐA dÐAÑAÔAÑAÔAÐAÐAå!+¡¤€IØ#ð !ð !Ñˆ�Ø�3�B�3Œ<˜8 C R Cœ=Ò(Ð(Ý ØO ¨¨¨¤ÐOÐOÀÈÈ"ÈÄÐOÐOñô ð ð ˜C˜R˜C”Lˆ	Ø�Š�iÑ Ô Ð Ð å# KÑ0Ô0€LàHÐH­9°[Ô5FÑ+GÔ+GÐHÑHÔH€HÝØ2Ð2Ð2Ð2¨	Ð2Ñ2Ô2Ð8MÐ8MÐ8MÐ8Mðñ ô €Lð ˜Ð%Ð%s�   Â$B) Â)
CÂ3CÃCÙ$Y; Ù;i3Ú$hÚ+A\8Ü
\,Ü \8Ü,\0	Ü0\8Ü3\0	Ü4\8Ü7hÜ8
]Ý]ÝhÝ]ÝJ=hèA$i3rK  únx.DiGraph[str, dict[str, Any]]ú!list[tuple[str, str, str]] | Nonec                óæ  — t          dg¦  «        }t          dg fg¦  «        }|rÌ|                     ¦   «         \  }}|                      |¦  «        D ]�}||v rŒ| |         |         }|                     dd¦  «        }|t
          j        k    s|t          k    rW|                     dd¦  «        }|||f}	||	gz   }
|dk    r|
c S |                     |¦  «         | 	                    ||
f¦  «         Œž|°ÌdS )zºBFS from source to sink following only infinite-capacity edges.

    Returns a list of (from_node, to_node, reason) tuples representing the path,
    or None if no such path exists.
    rÖ   rG  r   rC  ÚunknownrN  N)
r%   r   ÚpopleftÚ
successorsr’   r©  rª  r@  r  r  )rK  r¤  ÚqueuerH   Ú	edge_pathÚneighborÚ	edge_datarG  rC  Únew_edgeÚnew_paths              rO   r•  r•  ³
  s   € õ ˜(˜Ñ$Ô$€Gõ <AÀ8ÈRÀ.ÐAQÑ;RÔ;R€Eà
ð 3ØŸ-š-™/œ/‰ˆˆiØ ×+Ò+¨DÑ1Ô1ð 	3ð 	3ˆHØ˜7Ð"Ð"ØØ  œ xÔ0ˆIØ —}’} Z°Ñ3Ô3ˆHà�4œ8Ò#Ð# xµ7Ò':Ð':Ø"Ÿš x°Ñ;Ô;�Ø  (¨FÐ3�Ø$¨ zÑ1�Ø˜vÒ%Ð%Ø#�O�O�OØ—’˜HÑ%Ô%Ð%Ø—’˜h¨Ð1Ñ2Ô2Ð2øð ð 3ð  ˆ4rQ   Ú	base_nameÚ	extensionc                ó  — | › |› �}t           j                             |¦  «        s|S d}t           j                             | › d|› |› �¦  «        r+|dz  }t           j                             | › d|› |› �¦  «        °+| › d|› |› �S )zžGet a unique file path, appending a counter if the file already exists.

    For example, if "min_cut_failed.svg" exists, returns "min_cut_failed_1.svg".
    r'   rS  )ÚosÚpathÚexists)rÑ  rÒ  rÕ  Úcounters       rO   r‘  r‘  Ô
  sª   € ð
 Ð$˜Ð$Ð$€DÝŒ7�>Š>˜$ÑÔð Øˆà€GÝ
Œ'�.Š.˜IÐ<Ð<¨Ð<°Ð<Ð<Ñ
=Ô
=ð Ø�1‰ˆõ Œ'�.Š.˜IÐ<Ð<¨Ð<°Ð<Ð<Ñ
=Ô
=ð àÐ.Ð.˜'Ð. 9Ð.Ð.Ð.rQ   útuple[str | None, str | None]c                ó   — ddl }	 ddl}n-# t          $ r  t                               dd¬¦  «         Y dS w xY w|j                             | ¦  «                             ¦   «         }|                     |¦  «        d         }| 	                    ¦   «         D ]„}| | 
                    ¦   «                  |                     ¦   «                  d         }|                     t          |¦  «        ¦  «         |t          d¦  «        k    r|                     d	¦  «         Œ…|                     ¦   «                              d
¦  «        }t%          dd¦  «        }t'          |d¦  «        5 }	|	                     |¦  «         ddd¦  «         n# 1 swxY w Y   ||fS )z†Visualize the min-cut graph to an SVG file.

    Returns (path_to_svg, svg_content) tuple. Both are None if pydot is unavailable.
    r   NzMInstall pydot to visualize the min-cut graph for debugging: pip install pydotT)Úexc_info)NNrG  rª  Úredúutf-8Úmin_cut_failedú.svgra  )rŠ  Úpydotr‹  r@   r’  Únx_pydotÚto_pydotÚ	to_stringÚgraph_from_dot_dataÚ	get_edgesÚ
get_sourceÚget_destinationÚ	set_labelr½   rM  Ú	set_colorÚ
create_svgÚdecoder‘  r’  r“  )
rK  rz  rß  Ú
dot_formatÚ	dot_graphÚedgerž  rq  r»  r­  s
             rO   r—  r—  ã
  sÕ  € ð ÐÐÐðØˆˆˆˆøÝð ð ð Ý�ŠØ[Øð 	ñ 	
ô 	
ð 	
ð ˆzˆzðøøøð ”×%Ò% hÑ/Ô/×9Ò9Ñ;Ô;€JØ×)Ò)¨*Ñ5Ô5°aÔ8€IØ×#Ò#Ñ%Ô%ð "ð "ˆØ˜$Ÿ/š/Ñ+Ô+Ô,¨T×-AÒ-AÑ-CÔ-CÔDÀZÔPˆà�Š•s˜6‘{”{Ñ#Ô#Ð#à•U˜5‘\”\Ò!Ð!Ø�NŠN˜5Ñ!Ô!Ð!øð ×&Ò&Ñ(Ô(×/Ò/°Ñ8Ô8€Kõ  Ð 0°&Ñ9Ô9€HÝ	ˆh˜Ñ	Ô	ð  Ø	�Š�ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �[Ð Ð s   † ‹&5´5ÅFÆFÆFc                 óF  — g t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j	        ‘t           j
        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j         ‘t           j!        ‘t           j"        ‘t           j#        ‘t           j$        ‘t           j%        ‘t           j&        ‘t           j'        ‘t           j(        ‘t           j)        ‘t           j*        ‘t           j+        ‘t           j,        ‘t           j-        ‘t           j.        ‘t           j/        ‘t           j0        ‘t           j1        ‘t           j2        ‘t           j3        ‘t           j4        ‘t           j5        ‘t           j6        ‘t           j7        ‘t           j8        ‘t           j9        ‘t           j:        ‘t           j;        ‘t           j<        ‘t           j=        ‘t           j>        ‘t           j?        ‘t           j@        ‘t           jA        ‘t           jB        ‘t           jC        ‘t           jD        ‘t           jE        ‘t           jF        ‘tŽ          jH        ‘t           jI        ‘t           jJ        ‘t           jK        ‘t           jL        ‘} t           jI        t           jJ        t           jM        g}|t           jN        t           jO        t           jP        t¢          jR        t           jS        t           jT        t           jU        t           jV        t           jW        g	z  }|}| g t¢          j        ‘t¢          jX        ‘t¢          jY        ‘t           jZ        ‘t           jL        ‘t           j[        ‘t¢          j\        ‘t¢          j@        ‘t           j\        ‘t           j]        ‘t¢          jR        ‘t           jV        ‘t           j^        ‘t           jN        ‘t           jS        ‘t           jO        ‘t           j_        ‘t           j`        ‘t           ja        ‘t           jb        ‘t           jc        ‘t           jd        ‘t           je        ‘t           jf        ‘t           jg        ‘t           jh        ‘t           ji        ‘t           jj        ‘t           jT        ‘t           jk        ‘t           jl        ‘t           jm        ‘t           jn        ‘t           jo        ‘t¢          jp        ‘t¢          jq        ‘z  } | t           jr        t           js        gz  } | |z  } | té          ¦   «         z  } | t           ju        gz  } | d„ tì          D ¦   «         z  } tï          | ¦  «        }tï          tð          dtò          f                  t           jz        t           j{        t           j|        g¦  «        }t           j}        t           j~        t           j        t           j€        t           j�        t           j‚        t           jƒ        t           j„        t           j…        t           j†        t           j‡        g}||z  }�t          |tï          |¦  «        |tï          |¦  «        |¦  «        S )Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r`   )r   )rp   Úms     rO   rê   z'get_default_op_list.<locals>.<listcomp>•  s!   € Ð NÐ NÐ N¸1Õ!3°AÑ!6Ô!6Ð NÐ NÐ NrQ   .)‰r�   r  rà  r²  Úatan2r]  rL  rN  ÚpowÚ	remainderÚfmodÚ__and__Ú__or__Ú__xor__Ú
__lshift__Ú
__rshift__ÚeqÚneÚgeÚgtÚleÚltrV  Úbitwise_notÚceilÚfloorÚfracÚnegÚreluÚroundÚsiluÚtruncr@   Úlog10Úlog1pÚlog2ÚlgammaÚexpÚexpm1ÚerfÚerfcÚcosÚacosÚcoshÚsinÚasinÚsinhÚtanÚatanÚtanhÚatanhÚsqrtÚrsqrtr\  ÚsigmoidÚsoftplusÚ	thresholdÚthreshold_backwardÚclampÚwhereÚlerpÚaddcmulÚgeluÚgelu_backwardrz  ÚmeanÚ_grad_sum_to_sizeÚsum_to_sizerW  ÚtoÚtype_asrÊ   rË   ÚsqueezeÚ	unsqueezeÚrsubÚ_to_copyÚaliasrÔ   ÚsliceÚtrX  Úbroadcast_in_dimÚexpandÚ
as_stridedÚpermuteÚselectr€  rY  Úprepare_softmax_onlineÚcloneÚ	full_likeÚvarÚstdÚ_unsafe_viewrÕ   Úbroadcast_tensorsÚscalar_tensorÚonesÚ	new_zerosr2  ÚarangeÚtriuÚvar_meanÚisinfrý   ÚfullÚzerosÚemptyÚ
empty_likeÚargmaxÚmaximumÚiotaÚ'_low_memory_max_pool_offsets_to_indicesr¾  Úgatherr’  Ú
zeros_liker   r%   r   r	   Únative_dropoutÚ	rand_likeÚ
randn_likeÚmmÚconvolutionÚconvolution_backwardÚbmmÚaddmmÚ#_scaled_dot_product_flash_attentionÚ'_scaled_dot_product_efficient_attentionÚ_flash_attention_forwardÚ_efficient_attention_forwardÚupsample_bilinear2dÚ
_scaled_mmrB   )Údefault_recomputable_opsÚrecomputable_view_opsrF   rG   rE   rD   rC   s          rO   r‰  r‰  
  s‚  € ðL:ÝŒðL:åŒðL:õ 	ŒðL:õ 	Œ
ð	L:õ
 	ŒðL:õ 	ŒðL:õ 	ŒðL:õ 	ŒðL:õ 	ŒðL:õ 	Œ	ðL:õ 	ŒðL:õ 	ŒðL:õ 	ŒðL:õ 	ŒðL:õ 	ŒðL:õ  	Œð!L:õ" 	Œð#L:õ$ 	Œð%L:õ& 	Œð'L:õ( 	Œð)L:õ* 	Œð+L:õ, 	Œð-L:õ. 	Ôð/L:õ0 	Œ	ð1L:õ2 	Œ
ð3L:õ4 	Œ	ð5L:õ6 	Œð7L:õ8 	Œ	ð9L:õ: 	Œ
ð;L:õ< 	Œ	ð=L:õ> 	Œ
ð?L:õ@ 	ŒðAL:õB 	Œ
ðCL:õD 	Œ
ðEL:õF 	Œ	ðGL:õH 	ŒðIL:õJ 	ŒðKL:õL 	Œ
ðML:õN 	ŒðOL:õP 	Œ	ðQL:õR 	ŒðSL:õT 	Œ	ðUL:õV 	Œ	ðWL:õX 	ŒðYL:õZ 	Œ	ð[L:õ\ 	Œ	ð]L:õ^ 	Œð_L:õ` 	Œ	ðaL:õb 	Œ	ðcL:õd 	Œ
ðeL:õf 	Œ	ðgL:õh 	Œ
ðiL:õj 	ŒðkL:õl 	ŒðmL:õn 	ŒðoL:õp 	ŒðqL:õr 	ÔðsL:õt 	Œ
ðuL:õv 	Œ
ðwL:õx 	Œ	ðyL:õz 	Œð{L:õ| 	Œ	ð}L:õ~ 	ÔðL:õ@ 	ŒðAL:õB 	Œ	ðCL:õD 	ÔðEL:õF 	ÔðGL:õH 	Œ	ðIL:õJ 	ŒðKL:õL 	ŒðML:õN 	ÔðOL:õP 	ŒðQL:õR 	ŒðSL:õT 	Œ	ðUL:õV 	ŒðWL:ÐõZ "œ\­4¬>½4¼:ÐFÐØÝŒ	ÝŒ
ÝŒÝÔÝŒÝŒÝŒÝŒÝŒ
ð
ñ 
Ðð %€HØð %!ÝŒ	ð%!åÔ"ð%!õ 	Ô$ð%!õ 	Œ
ð	%!õ
 	Œð%!õ 	Œð%!õ 	Œ	ð%!õ 	Œ	ð%!õ 	Œð%!õ 	Œð%!õ 	Ôð%!õ 	Œð%!õ 	Ôð%!õ 	Œ	ð%!õ 	Œð%!õ  	Œ
ð!%!õ" 	Œð#%!õ$ 	Ôð%%!õ& 	Ôð'%!õ( 	Œ	ð)%!õ* 	Œð+%!õ, 	Ôð-%!õ. 	Œð/%!õ0 	Œ	ð1%!õ2 	Œð3%!õ4 	Œ
ð5%!õ6 	Œð7%!õ8 	Œ	ð9%!õ: 	Œð;%!õ< 	Œ
ð=%!õ> 	Œ
ð?%!õ@ 	ŒðA%!õB 	ŒðC%!õD 	ŒðE%!õF 	Œ
ðG%!õH 	Ô5ðI%!ñ %ÐðN ¥¤­T¬[Ð 9Ñ9ÐØ Ñ(Ðà¥¡¤Ñ/ÐàÝŒð!ñ Ðð Ð NÐ NÅÐ NÑ NÔ NÑNÐÝ!Ð":Ñ;Ô;Ðå�H S­# XÔ.Ô/Ý	Ô	�dœn­d¬oÐ>ñô €Jõ 	ŒÝÔÝÔ!ÝŒÝŒ
ÝÔ0ÝÔ4ÝÔ%ÝÔ)ÝÔ ÝŒðÐð # ZÑ/€KÞØÝÐ(Ñ)Ô)ØÝ�8ÑÔØñô ð rQ   c                ó2   — i }| j         D ]}|||j        <   Œ|S rL   )r¬   r÷   )r«   r†  rH   s      rO   r˜  r˜  ³  s-   € Ø')€LØ”ð 'ð 'ˆØ"&ˆ�T”YÑÐØÐrQ   Úmemoryúlist[float]ÚruntimesÚ
max_memoryÚall_recomputable_banned_nodesú"tuple[float, list[int], list[int]]c                ó0  — t           j        }|dk    rt          |||¦  «        S |dk    rt          |||¦  «        S |dk    rt	          |||¦  «        S |dk    rt          |||¦  «        S |dk    rkt                               d¦  «         t          j	        | |||¬¦  «        }t	          ||t          |¬¦  «                             t          |¬	¦  «        ¦  «        S t          |t          ¦  «        r ||| |||¦  «        \  }}	d
||	fS t          d|› �¦  «        ‚)NÚgreedyÚilpÚdpr*   Údynamic_memory_budget_dpz”dynamic_memory_budget_dp is an experimental solver. It does not guarantee performance improvements. Additionally, it is not guaranteed to be stable.)rÜ   re  Ú recorded_knapsack_input_memoriesÚ recorded_knapsack_input_runtimes)Úgraph_info_provider)Úknapsack_algoÚmax_mem_budgetrO  z,Not aware of memory budget knapsack solver: )r   Úactivation_memory_budget_solverr+   r,   r)   r*   r@   Úwarningr(   Úinialize_from_graphr-   Úget_knee_point_memory_budgetr¢   r   r   )
rÜ   ra  rc  rd  rg  re  ÚSOLVERrn  Úsaved_node_idxÚrecomp_node_idxs
             rO   Ú#_optimize_runtime_with_given_memoryrx  º  sr  € õ Ô3€FØ�ÒÐÝ˜v x°Ñ<Ô<Ð<Ø	�5ŠˆÝ˜F H¨jÑ9Ô9Ð9Ø	�4ŠˆÝ˜6 8¨ZÑ8Ô8Ð8Ø	Ð3Ò	3Ð	3Ý-¨f°hÀ
ÑKÔKÐKØ	Ð-Ò	-Ð	-Ý�Šð?ñ	
ô 	
ð 	
õ
 0ÔCØ#Ø*GØ-3Ø-5ð	
ñ 
ô 
Ðõ ØØÝØ$7ðñ ô ç*Ò*Ý)Ø)ð +ñ ô ñ	
ô 	
ð 		
õ 
�FÕ0Ñ	1Ô	1ð TØ*0¨&Ø�K ¨YÐ8Uñ+
ô +
Ñ'ˆ˜ð �^ _Ð5Ð5åÐRÈ&ÐRÐRÑSÔSÐSrQ   ©Úno_dispatchré   rt  c                óÄ   ‡‡— t          | j        ¦  «        }d	ˆfd„Šˆfd„|D ¦   «         }ˆfd„|                      ¦   «         D ¦   «         }|                      ||¬¦  «        S )
NÚdútorch.SymInt | intrJ   r�   c                ó&   •— t          | ‰¬¦  «        S )Nrs  )r    )r|  rt  s    €rO   Úrealize_symbolz8_remove_symbols_without_guarding.<locals>.realize_symbolñ  s   ø€ Ý  ¨XÐ6Ñ6Ô6Ð6rQ   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r`   r`   ©rp   r  r  s     €rO   rê   z4_remove_symbols_without_guarding.<locals>.<listcomp>ô  s#   ø€ Ð.Ð.Ð. 1ˆ^ˆ^˜AÑÔÐ.Ð.Ð.rQ   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r`   r`   r�  s     €rO   rê   z4_remove_symbols_without_guarding.<locals>.<listcomp>õ  s#   ø€ Ð4Ð4Ð4 Aˆnˆn˜QÑÔÐ4Ð4Ð4rQ   )Ústride)r|  r}  rJ   r�   )r³  Úshaperƒ  Únew_empty_strided)ré   rt  r„  rƒ  r  s    `  @rO   Ú _remove_symbols_without_guardingr†  î  s„   øø€ Ý�”‰MŒM€Eð7ð 7ð 7ð 7ð 7ð 7ð /Ð.Ð.Ð.¨Ð.Ñ.Ô.€EØ4Ð4Ð4Ð4¨¯ª©¬Ð4Ñ4Ô4€FØ×Ò˜u¨VÐÑ4Ô4Ð4rQ   c                óŽ  ‡ ‡‡	— t           j        }dd„}|dk    rdS |dk    rnt          ¦   «         5  dd	lm} t          j        |‰ j        ‰ j        f¦  «        \  ŠŠ	| 	                    ˆˆ	ˆ fd
„¦  «        }|cd d d ¦  «         S # 1 swxY w Y   d S |dk    rddl
m} t          j        |‰ j        ‰ j        f¦  «        \  ŠŠ	 |d¬¦  «        5 } ‰ j        ‰i ‰	¤Ž d d d ¦  «         n# 1 swxY w Y   |                     ¦   «         }t          |d¦  «        S t          |t           ¦  «        r |‰ ¦  «        S t#          d|› �¦  «        ‚)Nré   r	   rJ   c                óv  — t          | t          j        ¦  «        rAt          | j        d         t          j        ¦  «        rt          | j        d         d¬¦  «        S t          | t          j        ¦  «        rAt          | j        d         t          j        ¦  «        rt          | j        d         d¬¦  «        S t          | t          j        ¦  «        r't          | j        d         t          j	        ¦  «        rdS t          | t          j        ¦  «        r't          | j        d         t          j
        ¦  «        rdS | S )Nr˜   rr  rs  ç      ð?T)r¢   rÍ   rÎ   r‘   r›   r^  r†  r·   r    r¸   r£   ru  s    rO   Úmaterialize_argz)estimate_runtime.<locals>.materialize_argü  s÷   € Ý�a�œÑ!Ô!ð 		¥j°´¸´ÅÄÑ&MÔ&Mð 		Ý3°A´F¸5´MÈDÐQÑQÔQÐQÝ˜�2œ7Ñ#Ô#ð 	­
°1´6¸%´=Å%Ä,Ñ(OÔ(Oð 	Ý$ Q¤V¨E¤]¸TÐBÑBÔBÐBÝ˜�2œ7Ñ#Ô#ð 	­
°1´6¸%´=Å%Ä.Ñ(QÔ(Qð 	Ø�3Ý˜�2œ7Ñ#Ô#ð 	­
°1´6¸%´=Å%Ä-Ñ(PÔ(Pð 	Ø�4àˆHrQ   Útestingr'   Úprofiler   )Úbenchmarkerc                 ó   •—  ‰j         ‰ i ‰¤ŽS rL   )rš   )rÌ   rÉ   rH   s   €€€rO   rt   z"estimate_runtime.<locals>.<lambda>  s   ø€ °;°4´;ÀÐ3OÈÐ3OÐ3O€ rQ   Úflops)ÚFlopCounterModeF)Údisplayz Not aware of runtime estimator: )ré   r	   rJ   r	   )r   Ú*activation_memory_budget_runtime_estimatorrz  Ú$torch._inductor.runtime.benchmarkingr�  rû   Útree_maprÌ   rÉ   Úbenchmark_gpuÚtorch.utils.flop_counterr�  rš   Úget_total_flopsrL  r¢   r   r   )
rH   ÚRUNTIME_MODErŠ  r�  Úmsr�  ÚmodeÚcounted_flopsrÌ   rÉ   s
   `       @@rO   Úestimate_runtimerœ  ù  s  øøø€ ÝÔD€Lð
ð 
ð 
ð 
ð �yÒ Ð Øˆqà	˜Ò	"Ð	"Ý‰]Œ]ð 	ð 	ØHÐHÐHÐHÐHÐHå!œ?¨?¸T¼YÈÌÐ<TÑUÔU‰LˆD�&à×*Ò*Ð+OÐ+OÐ+OÐ+OÐ+OÐ+OÑPÔPˆBØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 
˜Ò	 Ð	 à<Ð<Ð<Ð<Ð<Ð<å” ¸¼ÀDÄKÐ8PÑQÔQ‰ˆˆfØˆ_ UÐ+Ñ+Ô+ð 	)¨tàˆDŒK˜Ð( Ð(Ð(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð ×,Ò,Ñ.Ô.ˆÝ�= !Ñ$Ô$Ð$å	�LÕ"8Ñ	9Ô	9ð NØˆ|˜DÑ!Ô!Ð!õ ÐL¸lÐLÐLÑMÔMÐMs$   °ABÂBÂ
BÃC&Ã&C*Ã-C*Úmemory_budgetc                óö
  ‡ ‡‡‡‡‡‡‡ ‡!‡"‡#‡$‡%‡&‡'‡(‡)‡*— |dk    s|dk     rt          d|› �¦  «        ‚t          t          j        t          j        t          j        t          j        t          j        ¬¦  «        }t          j        rt          |dddd¬¦  «        }|dk    r‰j
        S t          ‰ ‰|¦  «        \  }}|dk    r|S dBd„Š ‰‰j
        ¦  «        Š& ‰|¦  «        Š$‰$‰&k    r|S dCˆ$ˆ&fd„Š!dDˆˆ$ˆ&fd„Št          |ddd¬¦  «        }t          ‰ ‰|¦  «        \  }} ‰|¦  «        Š'‰'|k     r|S t          |d¬¦  «        Št          ‰ ‰‰¦  «        \  }}	 ‰|¦  «        Š‰|k     r|S ddlmŠ  t          ˆ fd„‰j
        D ¦   «         ¦  «        Š#dEˆ ˆ#fd„}
 |
|	¦  «        }d„ |D ¦   «         Š(ˆ(fd„|D ¦   «         }t          |t           d¬¦  «        Št#          ‰¦  «        dk    r
‰j
        ‰(z   S ˆ!fd„‰D ¦   «         Š%d„ ‰D ¦   «         Š*ddlmŠ) dFˆˆˆˆˆ$ˆ%ˆ&ˆ'ˆ)ˆ*f
d$„Š"t          j        �r=dGˆˆ"ˆ ˆˆ*fd'„} |d(¦  «         |d)¦  «        g}|d         dd …         |d         dd …         k    rã|d         |d         fg}|rÐ|                     ¦   «         \  }}|d         |d         z
  d*k     r+|                     |¦  «         |                     |¦  «         ŒY ||d         |d         z   d+z  ¦  «        }|dd …         |dd …         k    r|                     ||f¦  «         |dd …         |dd …         k    r|                     ||f¦  «         |°Ð|                     ¦   «          dd lm} d,„ |D ¦   «         }d-„ |D ¦   «         }|                     d.¬/¦  «         |                     ||d0¬1¦  «         t9          |¦  «        D ])\  }}|                     |d2›|||         fd3d4d5¬6¦  «         Œ*|                     d7¦  «         |                     d8¦  «         |                      d9¦  «         | !                    d¦  «         | "                    ¦   «         }| #                    ¦   «          tI          j%        ¦   «         }t          j&        �"t          j&        }tI          j'        |d¬:¦  «         d;}tP          j)         *                    ¦   «         r?tP          j)         +                    ¦   «         r!d<tP          j)         ,                    ¦   «         › �}tH          j-         .                    |d=|› d>t_          ¦   «         › d?�¦  «        }| 0                    |¦  «         tb           2                    d@|¦  «          ‰"|‰‰ ¬A¦  «        d         S )HNr'   r   zJThe valid ranges for memory budget are 0 <= m <= 1. The provided value is )rŠ   r‹   rŒ   r�   rŽ   F)rŠ   r‹   rŒ   r�   r:  rc   rJ   rM  c                óL   — t          t          t          | ¦  «        ¦  «        dz  S ©Nç    eÍÍA)rz  Úmapr  )r:  s    rO   Úestimate_activations_sizez:choose_saved_values_set.<locals>.estimate_activations_sizeK  s   € Ý•3•x Ñ.Ô.Ñ/Ô/°#Ñ5Ð5rQ   Úszc                ó   •— | dz  ‰‰z
  z  S r   r`   )r¤  Úmax_act_sizeÚmin_act_sizes    €€rO   Úget_normalized_sizez4choose_saved_values_set.<locals>.get_normalized_sizeT  s   ø€ Ø�S‘˜\¨LÑ8Ñ9Ð9rQ   Úactivationsc                ó,   •—  ‰| ¦  «        ‰z
  ‰‰z
  z  S rL   r`   )r©  r£  r¦  r§  s    €€€rO   Úget_mem_ratioz.choose_saved_values_set.<locals>.get_mem_ratioW  s(   ø€ Ø)Ð)¨+Ñ6Ô6¸ÑEØ˜<Ñ'ñ
ð 	
rQ   )rŠ   r‹   rŒ   )r�   )Úget_node_storagec              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rL   r`   )rp   rH   r¬  s     €rO   rr   z*choose_saved_values_set.<locals>.<genexpr>y  s/   øè è € ÐTÐT¸4Ð 0Ð 0°Ñ 6Ô 6ÐTÐTÐTÐTÐTÐTrQ   rJ  re   c                ó"   •— ˆˆfd„| D ¦   «         S )Nc                ó|   •— g | ]8}|j         t          d ¦  «        k     r ‰|¦  «        ‰vst          |¦  «        ¯6|‘Œ9S )r¡  )r4  r�   r  )rp   rF  r¬  Úinput_storagess     €€rO   rê   zRchoose_saved_values_set.<locals>.get_recomputable_banned_nodes.<locals>.<listcomp>~  s`   ø€ ð 
ð 
ð 
àð ”¥ S¡¤Ò)Ð)à$Ð$ QÑ'Ô'¨~Ð=Ð=Ý0°Ñ3Ô3ð >ð ð >Ð=Ð=rQ   r`   )rJ  r¬  r°  s    €€rO   Úget_recomputable_banned_nodesz>choose_saved_values_set.<locals>.get_recomputable_banned_nodes{  s3   ø€ ð
ð 
ð 
ð 
ð 
à!ð
ñ 
ô 
ð 	
rQ   c                ód   — g | ]-}|j                              d d¦  «        t          j        k    ¯+|‘Œ.S )r�   F)r‘   r’   r&   r\  r  s     rO   rê   z+choose_saved_values_set.<locals>.<listcomp>Œ  sA   € ð ð ð àØŒ6�:Š:�k 5Ñ)Ô)Õ-=Ô-GÒGÐGð 	
àGÐGÐGrQ   c                ó   •— g | ]}|‰v¯|‘Œ	S r`   r`   )rp   rF  Úmust_save_nodess     €rO   rê   z+choose_saved_values_set.<locals>.<listcomp>‘  s*   ø€ ð !ð !ð !Ø°¸Ð0HÐ0HˆÐ0HÐ0HÐ0HrQ   Tr‚  c                ó@   •— g | ]} ‰t          |¦  «        ¦  «        ‘ŒS r`   ©r  )rp   rF  r¨  s     €rO   rê   z+choose_saved_values_set.<locals>.<listcomp>ž  s8   ø€ ð ð ð Ø-.ÐÐ�H Q™KœKÑ(Ô(ðð ð rQ   c                ó,   — g | ]}t          |¦  «        ‘ŒS r`   )rœ  r0  s     rO   rê   z+choose_saved_values_set.<locals>.<listcomp>¡  s.   € ð ð ð Ø#'Õ˜ÑÔðð ð rQ   ry  r�  rg  rb   rÜ   rÝ   útuple[list[fx.Node], float]c                óü  •
—  ‰¦   «         5  t          |‰‰t          | d¦  «        |‰¦  «        \  }}}d d d ¦  «         n# 1 swxY w Y   t          ¦   «         }|D ].}	 |                     ‰|         ¦  «         Œ# t          $ r Y Œ+w xY w|                     ‰¦  «        st          d¦  «        ‚t          ||‰
|¦  «        \  }}	t          r1t          |‰|||d„ ‰D ¦   «         ‰‰|| ‰‰ ‰|¦  «        ‰‰¬¦  «         ||fS )Nr   z:dont_ban must be a subset of all_recomputable_banned_nodesc                ó,   — g | ]}t          |¦  «        ‘ŒS r`   r¶  r  s     rO   rê   zNchoose_saved_values_set.<locals>.get_saved_values_knapsack.<locals>.<listcomp>Ð  s+   € ð 'ð 'ð 'Ø$%•H˜Q‘K”Kð'ð 'ð 'rQ   )rÜ   re  Úsaved_node_idxsÚrecomputable_node_idxsÚexpected_runtimeÚmemories_banned_nodesÚ normalized_memories_banned_nodesÚruntimes_banned_nodesÚmin_cut_saved_valuesr�  r§  r¦  Úsaved_values_act_sizeÚ&more_aggressive_saved_values_mem_ratioÚ/aggressive_recomputation_saved_values_mem_ratio)
rx  rL  r%   r  ÚBaseExceptionÚissubsetr„   rÄ  r?   r   )r�  rg  rÜ   r½  r»  r¼  r  rE  r:  rS  Úaggressive_optionsrÄ  re  r£  r¦  r¾  r§  rÃ  rz  rÀ  s             €€€€€€€€€€rO   Úget_saved_values_knapsackz:choose_saved_values_set.<locals>.get_saved_values_knapsack¦  sË  ø€ ð ˆ[‰]Œ]ð 	ð 	õ
 4ØØ%Ø%Ý�M 1Ñ%Ô%ØØ-ñô ñ	Ø ØØ&ð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ )3©¬ˆØ)ð 	ð 	ˆCðØ—’Ð:¸3Ô?Ñ@Ô@Ð@Ð@øÝ ð ð ð Ø�ðøøøð × Ò Ð!>Ñ?Ô?ð 	Ý ØLñô ð õ (ØØØØñ	
ô 
‰ˆ�aõ !ð 	Ý4Ø'Ø.KØ /Ø'=Ø!1ð'ð 'Ø)Fð'ñ 'ô 'ð 2GØ&;Ø%1Ø+Ø)Ø)Ø&?Ð&?ÀÑ&MÔ&MØ7]Ø@oð#ñ ô ð ð& Ð-Ð-Ð-s!   Œ'?¿AÁAÁA9Á9
BÂBr  útuple[float, float, float]c                ób   •—  ‰| ‰‰¬¦  «        \  }}| t          ‰¦  «        |z
   ‰|¦  «        fS )N)rg  rÜ   )rz  )r  r:  r½  r«  rÈ  rÜ   rg  rÀ  s      €€€€€rO   Úestimate_for_budgetz4choose_saved_values_set.<locals>.estimate_for_budgetá  sU   ø€ Ø-FÐ-FØ˜Y°Kð.ñ .ô .Ñ*ˆLÐ*ð ÝÐ)Ñ*Ô*Ð-=Ñ=Ø�˜lÑ+Ô+ðð rQ   rO  r‰  gü©ñÒMbP?r>  c                ó   — g | ]
}|d          ‘ŒS )r>  r`   ©rp   Úitems     rO   rê   z+choose_saved_values_set.<locals>.<listcomp>þ  ó   € Ð0Ð0Ð0 �D˜”GÐ0Ð0Ð0rQ   c                ó   — g | ]
}|d          ‘ŒS ©r'   r`   rÍ  s     rO   rê   z+choose_saved_values_set.<locals>.<listcomp>ÿ  rÏ  rQ   )é
   é   )ÚfigsizeÚo)Úmarkerz.4fzoffset points)r   rÒ  Úcenter)Ú
textcoordsÚxytextÚhazMemory Budgetz Runtime of Recomputed Componentsz:Pareto Frontier of Memory Budget vs. Recomputation Runtime)Úexist_okrª  Ú_rank_Úmemory_budget_paretorS  rÞ  z%Generated Pareto frontier curve at %s)r�  rg  rÜ   )r:  rc   rJ   rM  )r¤  rM  rJ   rM  )r©  rc   rJ   rM  )rJ  re   rJ   rc   )r�  rM  rg  rb   rÜ   rÝ   rJ   r¸  )r  rM  rJ   rÉ  )3r   r‰   r   Úban_recompute_used_far_apartÚ!ban_recompute_long_fusible_chainsÚ#ban_recompute_materialized_backwardÚban_recompute_not_in_allowlistÚban_recompute_reductionsÚaggressive_recomputationr   rd   rÄ  Útorch._inductor.fx_utilsr¬  r%   rw   r  r¤   Útorch.utils._mode_utilsrz  Úvisualize_memory_budget_paretor±  r  ÚsortÚmatplotlib.pyplotÚpyplotÚfigureÚplotrœ  ÚannotateÚxlabelÚylabelÚtitleÚgridÚgcfÚshowrÔ  ÚgetcwdÚmemory_budget_pareto_dirÚmakedirsr›   r  r  Úis_initializedÚget_rankrÕ  ru  r3   Úsavefigr@   rr  )+rÜ   rg  r�  r  Úruntime_optimized_saved_valuesrS  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesrJ  r±  Úrecomputable_banned_nodesrË  ÚoptionsÚbisectsÚlhsÚrhsÚmidÚpltÚx_valuesÚy_valuesrF  ÚtxtÚfigÚfig_dirÚrank_suffixÚfig_namerÇ  rÄ  re  r£  r«  r¬  r¨  rÈ  r°  r¦  r¾  r§  rÃ  r´  rz  rÀ  s+   ``                         @@@@@@@@@@@@@@@@rO   Úchoose_saved_values_setr  &  s¯  øøøøøøøøøøøøøøøøøø€ ð
 �qÒÐ˜M¨AÒ-Ð-ÝØhÐYfÐhÐhñ
ô 
ð 	
õ $Ý$ÔAÝ#)Ô#KÝ%+Ô%OÝ &Ô EÝÔ8ðñ ô €Oõ Ô&ð 
Ý!ØØ"'Ø',Ø).Ø$)ð
ñ 
ô 
ˆð ˜ÒÐØÔÐå(5ØØØñ)ô )Ñ%Ð" Að ˜ÒÐØ-Ð-ð6ð 6ð 6ð 6ð -Ð,¨YÔ-=Ñ>Ô>€LØ,Ð,Ð-KÑLÔL€Là�|Ò#Ð#Ø-Ð-ð:ð :ð :ð :ð :ð :ð :ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
õ
 &ØØ#Ø#(Ø%*ð	ñ ô Ðõ '4Ø�YÐ 7ñ'ô 'Ñ#Ð  !ð .;¨]Ð;WÑ-XÔ-XÐ*Ø-°Ò=Ð=Ø+Ð+å ØØ %ðñ ô Ðõ ;HØ�YÐ 2ñ;ô ;Ñ7Ð)¨<ð 7D°mØ-ñ7ô 7Ð3ð 7¸ÒFÐFØ4Ð4à9Ð9Ð9Ð9Ð9Ð9åÐTÐTÐTÐTÀ9ÔCSÐTÑTÔTÑTÔT€Nð
ð 
ð 
ð 
ð 
ð 
ð 
ð  !>Ð =¸lÑ KÔ KÐðð à*ðñ ô €Oð
!ð !ð !ð !Ø,ð!ñ !ô !Ðõ %+Ø!¥x¸ð%ñ %ô %Ð!õ Ð(Ñ)Ô)¨QÒ.Ð.ØÔ /Ñ1Ð1ðð ð ð Ø2Oðñ ô Ððð Ø+Hðñ ô Ðð 4Ð3Ð3Ð3Ð3Ð3ð7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.ð 7.õr Ô,ñ AGð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 'Ð& sÑ+Ô+Ð-@Ð-@ÀÑ-EÔ-EÐFˆà�1Œ:�a�b�bŒ>˜W QœZ¨¨¨œ^Ò+Ð+Ø œ
 G¨A¤JÐ/Ð0ˆGØð 
/Ø"Ÿ;š;™=œ=‘��SØ�q”6˜C œF‘? TÒ)Ð)Ø—N’N 3Ñ'Ô'Ð'Ø—N’N 3Ñ'Ô'Ð'ØØ)Ð)¨3¨q¬6°C¸´F©?¸aÑ*?Ñ@Ô@�Ø�q�r�r”7˜c ! " "œgÒ%Ð%Ø—N’N C¨ :Ñ.Ô.Ð.Ø�q�r�r”7˜c ! " "œgÒ%Ð%Ø—N’N C¨ :Ñ.Ô.Ð.ð ð 
/ð 	�Š‰Œˆà'Ð'Ð'Ð'Ð'Ð'à0Ð0¨Ð0Ñ0Ô0ˆØ0Ð0¨Ð0Ñ0Ô0ˆð 	�
Š
˜7ˆ
Ñ#Ô#Ð#Ø�Š�˜8¨CˆÑ0Ô0Ð0õ   Ñ)Ô)ð 	ð 	‰FˆAˆsØ�LŠLØ��Ø�h˜q”kÐ"Ø*ØØð ñ ô ð ð ð 	�
Š
�?Ñ#Ô#Ð#Ø�
Š
Ð5Ñ6Ô6Ð6Ø�	Š	ÐNÑOÔOÐOØ�Š�‰ŒˆØ�gŠg‰iŒiˆØ�Š‰
Œ
ˆ
Ý”)‘+”+ˆÝÔ*Ð6ÝÔ5ˆGÝŒK˜¨$Ð/Ñ/Ô/Ð/ØˆÝÔ×)Ò)Ñ+Ô+ð 	BµÔ0A×0PÒ0PÑ0RÔ0Rð 	BØA¥5Ô#4×#=Ò#=Ñ#?Ô#?ÐAÐAˆKÝ”7—<’<ØÐT¨KÐTÐTÕ:LÑ:NÔ:NÐTÐTÐTñ
ô 
ˆð 	�Š�HÑÔÐÝ�ŠÐ;¸XÑFÔFÐFð %Ð$Ø#¨yÀkðñ ô àô	ð 	rQ   údict[torch.fx.Node, str]c                ó’  ‡— i Št          t          | j        ¦  «        ¦  «        D �] }|j        dk    rq|j                             d¦  «        }t          |t          j        ¦  «        rdt          |j
        ¦  «        |j        f}nIt          |t          j        ¦  «        rd}n,d}n)|j        dk    rd}n|j        t          |j        ¦  «        f}t          t          ˆfd„|j        D ¦   «         ¦  «        ¦  «        }t#          j        t          ||f¦  «                             d¦  «        ¦  «                             ¦   «         ‰|<   �Œ"‰S )	a�  Compute a forward-looking structural hash for each node.

    Each node's hash captures its "role" in the graph toward the output:
    hash(self_key, sorted(cone_hash(user) for user in users)).

    For placeholders, self_key uses tensor metadata instead of the node name
    (which varies across ranks). This makes the hash invariant to the original
    node naming and ordering.
    rç   r˜   )rç   Úsymintr¦  rð   )rð   c              3  ó(   •K  — | ]}‰|         V — Œd S rL   r`   )rp   r€  Úhashess     €rO   rr   z_cone_hashes.<locals>.<genexpr>L  s'   øè è € Ð"AÐ"A° 6¨!¤9Ð"AÐ"AÐ"AÐ"AÐ"AÐ"ArQ   rÜ  )rä  r³  r¬   rÏ   r‘   r’   r¢   r›   r^  r½   r�  Úrequires_gradr·   rš   r  rw   r¥   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r«   rH   r˜   Úself_keyÚuser_hashesr  s        @rO   Ú_cone_hashesr  -  s@  ø€ ð (*€FÝ�˜eœkÑ*Ô*Ñ+Ô+ð ñ ˆØŒ7�mÒ#Ð#Ø”)—-’- Ñ&Ô&ˆCÝ˜#�uœ|Ñ,Ô,ð ,ð "Ý˜œ	‘N”NØÔ%ð-��õ
 ˜C¥¤Ñ.Ô.ð ,Ø4��à+��ØŒW˜Ò Ð Ø"ˆHˆHàœ¥ T¤[Ñ!1Ô!1Ð2ˆHå�FÐ"AÐ"AÐ"AÐ"A°d´jÐ"AÑ"AÔ"AÑAÔAÑBÔBˆÝ”~Ý�˜;Ð'Ñ(Ô(×/Ò/°Ñ8Ô8ñ
ô 
ç
Š)‰+Œ+ð 	ˆt‰‰ð €MrQ   c                ó’  ‡
‡— t          | ¦  «        Št                               | j        d¦  «        }| j        D ]}|j        D ]}||xx         dz  cc<   ŒŒi Š
d	ˆ
ˆfd„}d}g }| j        D ]4}||         dk    r&t          j        | ||¦  «        ||f¦  «         |dz  }Œ5g }|r�t          j        |¦  «        \  }}}	|                     |	¦  «         t          ‰
¦  «        ‰
|	<   |	j        D ]D}||xx         dz  cc<   ||         dk    r&t          j        | ||¦  «        ||f¦  «         |dz  }ŒE|°�d„ t          |¦  «        D ¦   «         S )
a¡  Build a canonical name mapping for graph nodes using Kahn's algorithm.

    Returns a dict mapping each node to a deterministic name like "node_0",
    "node_1", etc. The mapping is invariant to the original node ordering and
    naming, so structurally equivalent graphs (e.g., traced with different dict
    iteration orders across distributed ranks) produce identical mappings.

    Does NOT modify the graph.
    r   r'   rH   rK  rJ   r“  c                óØ  •— | j         dk    rz| j                             d¦  «        }t          |t          j        ¦  «        rt          |j        ¦  «        |j        f}nt          |t          j	        ¦  «        rd}nd}d|‰|          fS | j         dk    rdt          | j
        ¦  «        fS | j         dk    rd	S t          ˆfd
„| j        D ¦   «         ¦  «        }dt          | j
        ¦  «        |fS )Nrç   r˜   )r  r`   r   rî   r'   rð   )é   c              3  ó(   •K  — | ]}‰|         V — Œd S rL   r`   )rp   rq   Úcanonical_idxs     €rO   rr   z@_canonical_node_names.<locals>._canonical_key.<locals>.<genexpr>{  s(   øè è € Ð!QÐ!Q°q -°Ô"2Ð!QÐ!QÐ!QÐ!QÐ!QÐ!QrQ   r>  )rÏ   r‘   r’   r¢   r›   r^  r½   r�  r  r·   rš   r  r¤  )rH   r˜   Úmeta_keyÚinput_indicesr  Úcones       €€rO   Ú_canonical_keyz-_canonical_node_names.<locals>._canonical_keyg  sö   ø€ ØŒ7�mÒ#Ð#Ø”)—-’- Ñ&Ô&ˆCÝ˜#�uœ|Ñ,Ô,ð 
õ ˜œ	‘N”NØÔ%ð-��õ ˜C¥¤Ñ.Ô.ð Ø&��à�Ø�x  d¤Ð,Ð,ØŒW˜
Ò"Ð"Ø•s˜4œ;Ñ'Ô'Ð(Ð(ØŒW˜Ò Ð Ø�4å!Ð!QÐ!QÐ!QÐ!Q¸DÔ<PÐ!QÑ!QÔ!QÑQÔQˆMØ•s˜4œ;Ñ'Ô'¨Ð7Ð7rQ   c                ó    — i | ]\  }}|d |› �“ŒS )Únode_r`   )rp   rF  rH   s      rO   rò  z)_canonical_node_names.<locals>.<dictcomp>”  s$   € ÐHÐHÐH¡' ! TˆD�+˜!�+�+ÐHÐHÐHrQ   )rH   rK  rJ   r“  )r  r›  r]  r¬   r¥   rS  rT  rU  r  r¤   rœ  )r«   ÚindegrH   r¡   r!  r×  ÚreadyÚcanonical_orderrS  r-  r  r   s             @@rO   Ú_canonical_node_namesr'  T  s¾  øø€ õ ˜ÑÔ€Då&*§m¢m°E´KÀÑ&CÔ&C€EØ”ð ð ˆØ”Jð 	ð 	ˆDØ�$ˆKˆKŒK˜1ÑˆKˆK‰KˆKð	ð /1€Mð8ð 8ð 8ð 8ð 8ð 8ð 8ð2 €GØ8:€EØ”ð ð ˆØ�Œ;˜!ÒÐÝŒN˜5 > >°$Ñ#7Ô#7¸À$Ð"GÑHÔHÐHØ�q‰LˆGøà%'€Oà
ð 	Ý”M %Ñ(Ô(‰	ˆˆ1ˆcØ×Ò˜sÑ#Ô#Ð#Ý  Ñ/Ô/ˆ�cÑà”Ið 	ð 	ˆDØ�$ˆKˆKŒK˜1ÑˆKˆK‰KØ�TŒ{˜aÒÐÝ”˜u ~ ~°dÑ';Ô';¸WÀdÐ&KÑLÔLÐLØ˜1‘�øð ð 	ð IÐH­Y°Ñ-GÔ-GÐHÑHÔHÐHrQ   úlist[torch.fx.Node]c                ó˜  ‡‡‡‡— ddl mŠ dd„}t          j                             ¦   «         rKt          j                             ¦   «         r-t          j                             ¦   «         dk    r || ¦  «        s|S t          | ¦  «        Šd	„ ‰                     ¦   «         D ¦   «         Šdˆˆfd
„} || ¦  «        �rt          ¦   «         5   ‰¦   «         5  ˆfd„|D ¦   «         g}d„ t          t          j                             ¦   «         ¦  «        D ¦   «         }t          j                             ||d         ¦  «         g }i }t          |¦  «        D ]t\  }}	ˆfd„|	D ¦   «         }
d}|
D ]B}t          |¦  «        }||z  }|t          j                             ¦   «         k    r
|||j        <   ŒC||d<   |                     |¦  «         Œut          j        |t          j        j                             ¦   «         ¬¦  «        }t          j                             |t          j        j        j        j        ¬¦  «         t/          t          j        |¦  «                             ¦   «         ¦  «        }d|› d|› �Št5          dd„ ˆfd„¬¦  «         ˆfd„||         D ¦   «         }d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   |S )Nr   )Úunset_fake_temporarilyrÜ   rJ  rJ   r>   c                ó„   — | j         D ]7}t          |j        t          j        j        ¦  «        r|j        j        dv r dS Œ8dS )N>   Úc10d_functionalrÂ   TF)r¬   r¢   rš   r›   r  r  rÁ   )rÜ   rH   s     rO   Úhas_collectivesz3_sync_decision_cross_ranks.<locals>.has_collectives�  sP   € ØÔ%ð 	ð 	ˆDÝØ”�UœZÔ2ñô ð à”+Ô'Ð+RÐRÐRØ�t�tøØˆurQ   r'   c                ó   — i | ]\  }}||“Œ	S r`   r`   r@  s      rO   rò  z._sync_decision_cross_ranks.<locals>.<dictcomp>®  s   € Ð<Ð<Ð<¡$ ! Q˜˜AÐ<Ð<Ð<rQ   c                óf  •‡‡— dˆfd„Šd                      ˆfd„t          | j        ˆfd„¬	¦  «        D ¦   «         ¦  «        }t          j        |                     d
¦  «        ¦  «                             ¦   «         }d„ t          t          j	         
                    ¦   «         ¦  «        D ¦   «         Št          ¦   «         5   ‰¦   «         5  t          j	                             ‰|¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t          ˆfd„‰D ¦   «         ¦  «        S )Nrq   rK  rJ   r½   c                ór   •— | j         dk    r‰|          › d| j         › �S ‰|          › d| j         › d| j        › �S )Nrç   rm  ©rÏ   rš   ©rq   Ú	canonicals    €rO   Ú_node_hash_strzJ_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>._node_hash_str´  sP   ø€ ð Œt�}Ò$Ð$Ø# Aœ,Ð/Ð/¨¬Ð/Ð/Ð/Ø ”lÐ6Ð6 Q¤TÐ6Ð6¨A¬HÐ6Ð6Ð6rQ   ú/c              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rL   r`   )rp   rq   r4  s     €rO   rr   zE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>¼  sA   øè è € ð 
ð 
àð ˆN˜1ÑÔð
ð 
ð 
ð 
ð 
ð 
rQ   c                ó   •— ‰|          S rL   r`   r2  s    €rO   rt   zD_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<lambda>¾  s   ø€ ¸YÀq¼\€ rQ   ru   rÜ  c                ó   — g | ]}d ‘ŒS rL   r`   ©rp   rS  s     rO   rê   zF_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<listcomp>Á  s   € ÐNÐNÐN˜q�dÐNÐNÐNrQ   c              3  ó0   •K  — | ]}‰d          |k    V — ŒdS r  r`   )rp   ré   Ú
all_inputss     €rO   rr   zE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>Å  s,   øè è € Ð:Ð:¨!�:˜a”= AÒ%Ð:Ð:Ð:Ð:Ð:Ð:rQ   )rq   rK  rJ   r½   )ru  rw   r¬   r  r  r  r  rD  r›   r  Úget_world_sizerz  Úall_gather_objectr¦   )rÜ   Únode_strrd   r4  r;  r3  r*  s      @@€€rO   Úhas_same_nodesz2_sync_decision_cross_ranks.<locals>.has_same_nodes°  sî  øøø€ ð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð —8’8ð 
ð 
ð 
ð 
å˜KÔ-Ð3IÐ3IÐ3IÐ3IÐJÑJÔJð
ñ 
ô 
ñ 
ô 
ˆõ ” §¢°Ñ 8Ô 8Ñ9Ô9×CÒCÑEÔEˆØNÐN¥E­%Ô*;×*JÒ*JÑ*LÔ*LÑ$MÔ$MÐNÑNÔNˆ
Ý‰]Œ]ð 	Dð 	DÐ2Ð2Ñ4Ô4ð 	Dð 	DåÔ×/Ò/°
¸FÑCÔCÐCð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dõ Ð:Ð:Ð:Ð:¨zÐ:Ñ:Ô:Ñ:Ô:Ð:s6   Â>DÃ	!C6Ã*DÃ6C:	Ã:DÃ=C:	Ã>DÄDÄDc                ó    •— g | ]
}‰|         ‘ŒS r`   r`   )rp   ré   r3  s     €rO   rê   z._sync_decision_cross_ranks.<locals>.<listcomp>Ë  s   ø€ Ð;Ð;Ð;¨˜	 !œÐ;Ð;Ð;rQ   c                ó   — g | ]}g ‘ŒS r`   r`   r9  s     rO   rê   z._sync_decision_cross_ranks.<locals>.<listcomp>Ì  s%   € ð :ð :ð :Ø�ð:ð :ð :rQ   c                ó    •— g | ]
}‰|         ‘ŒS r`   r`   )rp   Úop_nameÚreverse_canonicals     €rO   rê   z._sync_decision_cross_ranks.<locals>.<listcomp>Ô  s,   ø€ ð ð ð Ø3:Ð% gÔ.ðð ð rQ   z
total size)r³  r1  zpicked_rank_idx=z, saved_nodes of current rank=rÀ  c                 ó   — dddœS )NÚ)aot_joint_graph_sync_decision_cross_ranksrÃ  rÄ  r`   r`   rQ   rO   rt   z,_sync_decision_cross_ranks.<locals>.<lambda>ì  s   € ØGØ (ð%ð %€ rQ   c                 ó   •— ‰ S rL   r`   )Úsync_decision_cross_ranks_strs   €rO   rt   z,_sync_decision_cross_ranks.<locals>.<lambda>ð  s   ø€ Ð#@€ rQ   rÑ  c                ó    •— g | ]
}‰|         ‘ŒS r`   r`   )rp   rq   rD  s     €rO   rê   z._sync_decision_cross_ranks.<locals>.<listcomp>ó  s,   ø€ ð ð ð Ø)*Ð! !Ô$ðð ð rQ   )rÜ   rJ  rJ   r>   )Útorch._subclasses.fake_tensorr*  r›   r  r  rö  r<  r'  r…  rz  rD  r=  rœ  r  r÷  r÷   r  rs  Údistributed_c10dÚ_get_object_coll_deviceÚ
all_reduceÚReduceOpÚMAXr�   ÚargminrÎ  r   )rÜ   r:  r-  r?  ÚobjectsÚsaved_ops_names_all_ranksÚsaved_sizesÚsaved_ops_with_sizesrE  Úsaved_ops_namesÚsaved_nodesÚ
saved_sizerH   Úsize_of_nodeÚsaved_sizes_tensorÚpicked_rank_idxr3  rD  rH  r*  s                   @@@@rO   r^  r^  —  s  øøøø€ ð EÐDÐDÐDÐDÐDðð ð ð õ 	Ô×&Ò&Ñ(Ô(ðåÔ×,Ò,Ñ.Ô.ðõ Ô×,Ò,Ñ.Ô.°Ò2Ð2ØˆO˜KÑ(Ô(ð 3ð Ðå% kÑ2Ô2€IØ<Ð<¨)¯/ª/Ñ*;Ô*;Ð<Ñ<Ô<Ðð;ð ;ð ;ð ;ð ;ð ;ð ;ð. €~�kÑ"Ô"ñ .Ý‰]Œ]ð -	ð -	Ð2Ð2Ñ4Ô4ð -	ð -	ð <Ð;Ð;Ð;¨lÐ;Ñ;Ô;Ð<ˆGð:ð :Ý!¥%Ô"3×"BÒ"BÑ"DÔ"DÑEÔEð:ñ :ô :Ð%õ Ô×/Ò/Ð0IÈ7ÐSTÌ:ÑVÔVÐVØ%'ˆKØ35Ð å(1Ð2KÑ(LÔ(Lð /ð /Ñ$��_ðð ð ð Ø>Mðñ ô �ð �
Ø'ð Gð G�DÝ#+¨D¡>¤>�LØ ,Ñ.�JØ�eÔ/×8Ò8Ñ:Ô:Ò:Ð:Ø:FÐ,¨T¬YÑ7øØ5?Ð$ \Ñ2Ø×"Ò" :Ñ.Ô.Ð.Ð.å!&¤ØÝÔ(Ô9×QÒQÑSÔSð"ñ "ô "Ðõ Ô×(Ò(Ø"¥uÔ'8Ô'IÔ'RÔ'Vð )ñ ô ð õ "¥%¤,Ð/AÑ"BÔ"B×"GÒ"GÑ"IÔ"IÑJÔJˆOð -E¸ð  -Eð  -Eð  oCð  -Eð  -EÐ)ÝØðð ð AÐ@Ð@Ð@ðñ ô ð ðð ð ð Ø.GÈÔ.Xðñ ô ˆLðW-	ð -	ð -	ñ -	ô -	ð -	ð -	ð -	ð -	ð -	ð -	øøøð -	ð -	ð -	ð -	ð -	ð -	ð -	ñ -	ô -	ð -	ð -	ð -	ð -	ð -	ð -	øøøð -	ð -	ð -	ð -	ð^ Ðs7   ÃJ?ÃG	J(ÊJ?Ê(J,	Ê,J?Ê/J,	Ê0J?Ê?KËKÚmoduler  c                ór  — d}|rdnd}t          t          | j                             d¬¦  «        ¦  «        ¦  «        }| j                             dt          j        j        j        ¬¦  «        D �]Ç}t          | |j	        d         j
        ¦  «        }t          |t          j        ¦  «        �r‰g }|j                             d¬¦  «        D ]�}||j        v r‚| j                             |¦  «        5  | j                             |› d|› �¦  «        }	|d	z  }|j        d
         |	j        d
<   |	}|                     |	¦  «         ddd¦  «         n# 1 swxY w Y   ŒŽ|rÜ| j                             |¦  «        5  | j                             dt          j        j        j        g |j	        ¢|¢R i ¦  «        }
|                     |
d¬¦  «         ddd¦  «         n# 1 swxY w Y   |j                             d¦  «        }|r"|\  }}g |¢d„ |D ¦   «         ¢R }||f|
j        d<   | j                             |¦  «         �ŒÉ| S )uõ  
    Graph-safe RNG lets torch.compile use CUDA Graphs for graphs with RNG ops.
    For graphs without HOPs, the partitioner adds placeholder nodes
    fwd_rng_state_* and bw_rng_state_* to the forward and backward graphs. At
    runtime, the AOTDispatcher retrieves these RNG states and passes them to the
    compiled graphs.

    This works well for no-HOP graphs. With HOPs, the partitioner runs
    recursively: it first partitions the HOP (producing forward/backward HOP
    subgraphs) and then stitches them back into the outer joint graph. For HOPs
    that contain RNG ops, the outer joint graph now includes HOP subgraph
    modules with extra RNG placeholders. We must thread these placeholders
    through the outer module partitioned forward and backward graphsâ€”this
    function does exactly that. It collects the RNG placeholder nodes from the
    HOPs and creates corresponding placeholders in the outer forward and
    backward graphs.

    There is a catch: for a short period, the joint graph is in a â€œbadâ€� state.
    The HOP subgraphs expect additional inputs (because of the new
    placeholders), but the outer graph call sites don't yet provide them. We
    can't fix this in the joint graph because the joint graph's input signature
    is fixed (primals, tangents). As a compromise, we keep the joint graph in
    somewhat of a bad state for some time and, once the outer forward and
    backward graphs are partitioned, insert the corresponding RNG placeholders
    and wire up the calls.
    r   rÉ  rÈ  rç   r1  rÈ   r1  rS  r'   r˜   NT)Úpropagate_metaÚeager_input_valsc                ó(   — g | ]}|j         d          ‘ŒS )r˜   )r‘   )rp   Úinps     rO   rê   z2thread_graphsafe_rng_from_hops.<locals>.<listcomp>A  s   € ÐDÐDÐD¨c˜#œ( 5œ/ÐDÐDÐDrQ   )r3  rä  r«   r2  r›   rœ   r  Úinvoke_subgraphrÃ   rÌ   rš   r¢   rÍ   r«  r÷   rU  rç   r‘   r  rÃ  râ  r’   rã  )r[  r  rµ  Ú
rng_stringÚ
last_inputÚhop_noderá   Únew_rng_inputsÚplaceholder_noder¼  Únew_hop_node_with_fixed_argsÚ
eager_valsÚ
eager_argsÚeager_kwargsÚnew_eager_argss                  rO   rb  rb  ú  s  € ð< €IØ$/ÐD��°_€JÝ•h˜vœ|×6Ò6¸-Ð6ÑHÔHÑIÔIÑJÔJ€JØ”L×+Ò+Ø¥5¤9Ô#9Ô#Ið ,ñ ô ð ,2ñ ,2ˆõ ˜6 8¤=°Ô#3Ô#:Ñ;Ô;ˆÝ�h¥¤Ñ/Ô/ñ (	2Ø,.ˆNØ$,¤N×$=Ò$=ÀÐ$=Ñ$OÔ$Oð 9ð 9Ð ØÐ!1Ô!6Ð6Ð6ð  œ×5Ò5°jÑAÔAð 9ð 9Ø$*¤L×$<Ò$<Ø)Ð7Ð7¨IÐ7Ð7ñ%ô %˜	ð " Q™˜	Ø0@Ô0EÀeÔ0L˜	œ uÑ-Ø%.˜
Ø&×-Ò-¨iÑ8Ô8Ð8ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9øð ð 2à”\×1Ò1°(Ñ;Ô;ð 	ð 	Ø39´<×3KÒ3KØ'Ýœ	Ô.Ô>Ø9˜(œ-Ð9¨.Ð9Ð9Øñ	4ô 4Ð0ð ×2Ò2Ø4ÀTð 3ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð &œ]×.Ò.Ð/AÑBÔB�
Øð 	Ø/9Ñ,�J ð&Ø#ð&àDÐD°^ÐDÑDÔDð&ð &�Nð
 'Ø$ðMÐ0Ô5Ð6HÑIð ”×'Ò'¨Ñ1Ô1Ð1ùà€Ms&   Ã.AEÅEÅEÅ3AGÇG	ÇG	ú	list[int]c           	     ó  ‡‡‡‡— t          | j        ¦  «        Št          ¦   «         Š| j        j        D ]n}|j        dk    rd|j        v r‰                     |¦  «         n$t          |¦  «        r‰                     |¦  «         |‰v r‰                     |j	        ¦  «         Œot          t          t          | j        j        ¦  «        ¦  «        }t          t          t          | j        j        ¦  «        ¦  «        }||z   }t          | |¬¦  «        \  }}}	}
‰                     ¦   «         }‰                     d„ |D ¦   «         ¦  «         t!          | j        |||	d¦  «        }t          ˆfd„|j        D ¦   «         ¦  «        Št          ˆˆfd„| j        j        D ¦   «         ¦  «        }t          ˆfd„t#          |¦  «        D ¦   «         ¦  «        }d	}i }| j        j        D ]}|‰v r
|||<   |d
z  }Œt%          |‰‰||||¦  «        S )Nrç   Útangentsr  c              3  ó4   K  — | ]}|®|j         dk    ¯|V — Œd S )Nrð   r1  )rp   rÕ  s     rO   rr   z!classify_nodes.<locals>.<genexpr>i  s;   è è € ð ð Ø ! -°A´D¸HÒ4DÐ4DˆÐ4DÐ4DÐ4DÐ4Dðð rQ   ræ   c              3  óH   •K  — | ]}|j         d k    ¯‰|j                 V — ŒdS r1  r2  r…  s     €rO   rr   z!classify_nodes.<locals>.<genexpr>o  sC   øè è € ð 8ð 8àØŒ7�hÒÐð 	�T”YÔàÐÐÐð8ð 8rQ   c              3  ó,   •K  — | ]}|‰v¯|‰v¯
|V — Œd S rL   r`   )rp   rH   rg   ry   s     €€rO   rr   z!classify_nodes.<locals>.<genexpr>t  sF   øè è € ð 6ð 6àØÐ(Ð(Ð(¨TÐ9JÐ-JÐ-Jð 	à-JÐ-JÐ-JÐ-Jð6ð 6rQ   c              3  ó*   •K  — | ]\  }}|‰v ¯	|V — Œd S rL   r`   )rp   rF  Úpr,  s      €rO   rr   z!classify_nodes.<locals>.<genexpr>y  s;   øè è € ð -ð -Ùˆa�°!Ð7TÐ2TÐ2TˆÐ2TÐ2TÐ2TÐ2Tð-ð -rQ   r   r'   )r˜  r«   r%   r¬   rÏ   rš   r  rø   rá  r¥   r³  r  r6   r5   r9  rï  r  rœ  rb   )r*  r,  r+  rH   r  r  rd   r5  r6  r7  r8  rh   Úforward_only_graphri   rl   Úfw_cntrk   r†  rg   ry   s    `               @@@rO   rS  rS  L  s¢  øøøø€ õ
 $ LÔ$6Ñ7Ô7€LÝ-7©\¬\ÐØÔ"Ô(ð 1ð 1ˆØŒ7�mÒ#Ð#¨
°d´kÐ(AÐ(AØ×!Ò! $Ñ'Ô'Ð'Ð'Ý! $Ñ'Ô'ð 	(Ø×!Ò! $Ñ'Ô'Ð'àÐ$Ð$Ð$Ø×$Ò$ T¤ZÑ0Ô0Ð0øå�¥
¨LÔ,>Ô,DÑEÔEÑFÔF€MÝ!¥&Õ)<¸lÔ>PÔ>VÑ"WÔ"WÑXÔXÐØÐ3Ñ3€Få  ¸ÐOÑOÔOñ C€K�Ð/Ð1Bð )×-Ò-Ñ/Ô/ÐØ×Òð ð Øðñ ô ñ ô ð õ <ØÔ˜F KÐ1BÀIñô Ðõ .8ð 8ð 8ð 8ð 8à&Ô,ð8ñ 8ô 8ñ .ô .Ðõ
 ,6ð 6ð 6ð 6ð 6ð 6à Ô&Ô,ð6ñ 6ô 6ñ ,ô ,€Oõ
 #-ð -ð -ð -ð -Ý Ñ.Ô.ð-ñ -ô -ñ #ô #Ðð €FØ€HØÔ"Ô(ð ð ˆØÐ$Ð$Ð$Ø#ˆH�T‰NØ�a‰KˆFøÝØØØØØØØ#ñô ð rQ   r™  )r,  Úcompilerc               ó(  — | j                              ¦   «          |                      ¦   «          | j         }t          j        rt          |¦  «        }|| _         | j         }t          | ¦  «        }t          | ¦  «        }	|rt          | d¬¦  «        } t          j	        st          | ¦  «         t          | ¦  «         t          | ¦  «         |€g }t          | ||¦  «        }
t          |
j        ¦  «        dk    rt!          | ||||
j        ¬¦  «        S t%          | j         j        ¦  «        D ]}|j        dk    rt+          d¦  «        |_        Œ"|
                     |¦  «        sd|_        Œ?t+          d¦  «        |_        |j        D ]$}t3          |j        |j        dz   ¦  «        |_        Œ%Œ€t          j        }|j        D ]?}t7          |j                             d	d¦  «        t<          ¦  «        r|j        d	         } nŒ@t?          ¦   «         }g }|j        D ]^}tA          |¦  «        }|�| !                    |¦  «         Œ)|j        d
k    r*|
                     |¦  «        r| "                    |¦  «         Œ_t?          |¦  «        }|  #                    ¦   «         D ]~\  }}t7          |tH          j%        ¦  «        r_|j         |urV|j         j        D ]I}tA          |¦  «        }|�| !                    |¦  «         Œ)|j        d
k    r| "                    |¦  «         ŒJŒt          |¦  «        dk    r tM          dtO          |¦  «        › d�¦  «        ‚|rK|r-tM          dt          |¦  «        › dd„ |D ¦   «         › d�¦  «        ‚tQ          tS          |¦  «        ¦  «        }tU          ||
|¬¦  «        }t          j+        rtW          ||¦  «        }tY          t[          d„ |¦  «        ¦  «        }tY          t[          t\          |¦  «        ¦  «        }tY          t[          d„ |¦  «        ¦  «        }t_          | |||||
j        ¬¦  «        \  }}|r$|	r"ta          | ||t          |¦  «        ¦  «        \  }}tc          |¦  «        }t          j2        rddl3m2}  |||||
j        ¦  «         ti          |¦  «        }ti          |¦  «        }tk          |d¬¦  «        }tk          |d¬¦  «        }tl          �r³tO          d„ |D ¦   «         ¦  «        }to          d„ |D ¦   «         ¦  «        dz  }tp           9                    d|¦  «         tp           9                    d|¦  «         t?          d„ |j         j        D ¦   «         ¦  «        }t?          d„ |j         j        D ¦   «         ¦  «        }||z  }tu          t*          ¦  «        } |j         j        D ]G}|j;        |v r<ty          |j=        d¦  «        r'| t}          |j=        j?        ¦  «        xx         dz  cc<   ŒHtp           9                    dt          |¦  «        t          |¦  «        t          |¦  «        ¦  «         tO          |  @                    ¦   «         tƒ          jB        d¦  «        d¬ ¦  «        }!tp           9                    d!|!¦  «         ||fS )"ax  
    Partitions the joint graph such that the backward recomputes the forward.
    Recomputing helps in trading off memory bandwidth with computation.

    To create the fwd and bwd graph, we copy the joint graph, manually set the
    outputs to just original forward or backward outputs. And then we run the
    resulting graphs through dead code elimination.

    .. warning::
        This API is experimental and likely to change.

    Args:
        joint_module(fx.GraphModule): The joint forward and backward graph. This
            is the result of AOT Autograd tracing.
        _joint_inputs: The inputs to the joint graph. This is unused.
        compiler: This option determines the default set of recomputable ops.
            Currently, there are two options: ``nvfuser`` and ``inductor``.
        recomputable_ops: This is an optional set of recomputable ops. If this
            is not None, then this set of ops will be used instead of the
            default set of ops.
        num_fwd_outputs: The number of outputs from the forward graph.

    Returns:
        Returns the generated forward and backward Fx graph modules.
    Fr3  Nr   )r+  r,  rl   rð   r¡  r'   r�  rÈ   z„torch.autograd.graph.region_activation_memory_budget: conflicting budgets within a single joint graph (including nested subgraphs): zD. Use a graph break to separate regions that need different budgets.z{torch.autograd.graph.region_activation_memory_budget: must cover the entire forward of a graph (including HOP bodies), but z÷ forward op(s) are unannotated. Wrap the whole forward in a single region; use a graph break to scope different budgets to different graphs. Note that a graph break inside the annotated region can also cause unannotated ops here. Unannotated ops: c                ó   — g | ]	}|j         ‘Œ
S r`   r¬  ro   s     rO   rê   z7min_cut_rematerialization_partition.<locals>.<listcomp>  s   € Ð$HÐ$HÐ$H° Q¤VÐ$HÐ$HÐ$HrQ   r  )r�  c                ó@   — t          | ¦  «        ot          | ¦  «         S rL   )r   r§   ©rq   s    rO   rt   z5min_cut_rematerialization_partition.<locals>.<lambda>*  s   € •k !‘n”nÐGÕ-DÀQÑ-GÔ-GÐ)G€ rQ   c                óB   — t          | ¦  «         ot          | ¦  «         S rL   )r   r2   rz  s    rO   rt   z5min_cut_rematerialization_partition.<locals>.<lambda>/  s   € �[¨™^œ^Ð+ÐEµNÀ1Ñ4EÔ4EÐ0E€ rQ   rF  rH  rJ  Tc                óJ   — g | ] }t          |¦  «        t          |¦  «        f‘Œ!S r`   )r  r½   r  s     rO   rê   z7min_cut_rematerialization_partition.<locals>.<listcomp>Z  s)   € ÐKÐKÐK¸¥¨¡¤­S°©V¬VÐ4ÐKÐKÐKrQ   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rL   r¶  r  s     rO   rr   z6min_cut_rematerialization_partition.<locals>.<genexpr>]  s(   è è € Ð'JÐ'J¸­°©¬Ð'JÐ'JÐ'JÐ'JÐ'JÐ'JrQ   z'Theoretical Activations Stored: %.2f GBz,Theoretical Per Activation Storage Sizes: %sc              3  ó:   K  — | ]}|j         d k    ¯|j        V — ŒdS ©rÈ   Nr2  r0  s     rO   rr   z6min_cut_rematerialization_partition.<locals>.<genexpr>b  ó9   è è € ð %
ð %
Ø¸4¼7ÀoÒ;UÐ;UˆDŒIÐ;UÐ;UÐ;UÐ;Uð%
ð %
rQ   c              3  ó:   K  — | ]}|j         d k    ¯|j        V — ŒdS r  r2  r0  s     rO   rr   z6min_cut_rematerialization_partition.<locals>.<genexpr>e  r€  rQ   r  z# remat/fw/bw: %d/%d/%dr‚  zCount of Ops Rematerialized: %s)Cr«   r  rð  r   Úcser;   r®   r´   rN  rO  rP  rQ  rR  rS  r¤   rg   rk  rl   rä  r¬   rÏ   r�   r4  r|   r¥   rN  Úactivation_memory_budgetr¢   r‘   r’   rM  r%   r$   r  r  rT  rÍ   r«  r   rw   r3  r4  r  r^  r³  r  r2   r+  r_  r`  rI  ra  r=   rb  r?   rz  r@   r’  r   r÷   r±   rš   r½   r  r…  rÊ   r†  )"r*  r-  rv  r+  r,  r¨   Ú	cse_graphrÜ   re  rf  rg  rH   r¡   r�  Úregion_budgetsÚunannotated_fw_opsÚbudgetÚall_budgetsrS  rà  r  r:  rý  rþ  ri  rj  rI  Úsorted_sizesÚtotal_activations_size_gbÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountsÚrematerialized_opss"                                     rO   rM  rM  �  s–  € ðD Ô×*Ò*Ñ,Ô,Ð,Ø×ÒÑÔÐàÔ€Dõ „zð 'Ý  Ñ&Ô&ˆ	Ø&ˆÔØÔ$€Kå!5°lÑ!CÔ!CÐÝ%=¸lÑ%KÔ%KÐ"Ø!ð XÝ-¨lÐQVÐWÑWÔWˆÝÔ:ð -Ý˜|Ñ,Ô,Ð,å˜\Ñ*Ô*Ð*Ý˜|Ñ,Ô,Ð,à$Ð,Ø(*Ð%ÝØÐ3°_ñô €Iõ ˆ9Ô&Ñ'Ô'¨1Ò,Ð,Ý ØØØ+Ø*GØ(1Ô(Mð
ñ 
ô 
ð 	
õ ˜Ô+Ô1Ñ2Ô2ð Rð RˆØŒ7�hÒÐÝ # C¡¤ˆDÔÐØ×)Ò)¨$Ñ/Ô/ð 	RØ !ˆDÔÐå # C¡¤ˆDÔØœ
ð Rð R�Ý$'¨Ô(9¸4Ô;LÈqÑ;PÑ$QÔ$Q�Ô!Ð!ðRõ Ô3€MØÔ!ð ð ˆÝ�d”i—m’m O°TÑ:Ô:½EÑBÔBð 	Ø œI oÔ6ˆMØˆEð	õ )3©¬€NØ(*ÐØÔ!ð ,ð ,ˆÝ.¨tÑ4Ô4ˆØÐØ×Ò˜vÑ&Ô&Ð&Ð&ØŒW˜Ò'Ð'¨I×,DÒ,DÀTÑ,JÔ,JÐ'Ø×%Ò% dÑ+Ô+Ð+øõ &0°Ñ%?Ô%?€KØ×,Ò,Ñ.Ô.ð 4ð 4‰ˆˆ3Ý�c�2œ>Ñ*Ô*ð 	4¨s¬yÀÐ/KÐ/KØœ	œð 4ð 4�Ý1°$Ñ7Ô7�Ø�=Ø—O’O AÑ&Ô&Ð&Ð&Ø”W Ò/Ð/Ø&×-Ò-¨dÑ3Ô3Ð3øøÝ
ˆ;ÑÔ˜!ÒÐÝð4å! +Ñ.Ô.ð4ð 4ð 4ñ
ô 
ð 	
ð ð 0Øð 		ÝðLåÐ)Ñ*Ô*ðLð Lð %IÐ$HÐ5GÐ$HÑ$HÔ$HðLð Lð Lñô ð õ �T +Ñ.Ô.Ñ/Ô/ˆÝ*ØØØ#ðñ ô €Lõ Ô(ð MÝ1°+¸|ÑLÔLˆåÝØGÐGÈñ	
ô 	
ñô €Oõ
 �f¥^°\ÑBÔBÑCÔCÐÝÝÐEÐEÀ|ÑTÔTñô €Lõ
 4ØØà'Ø-Ø'Ø$-Ô$Iðñ ô Ñ€Iˆyð "ð Ø)ð 	Ý#8Ø˜i¨µC¸Ñ4HÔ4Hñ$ô $Ñ ˆI�yõ 4°IÑ>Ô>€Iõ Ô*ð 

ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	%Ð$ØØØØÔ1ñ		
ô 	
ð 	
õ ˜yÑ)Ô)€IÝ˜yÑ)Ô)€Iå.¨yÀeÐLÑLÔL€IÝ.¨yÀdÐKÑKÔK€Iåñ HåÐKÐK¸lÐKÑKÔKÑLÔLˆõ %(Ð'JÐ'J¸\Ð'JÑ'JÔ'JÑ$JÔ$JÈSÑ$PÐ!Ý�ŠÐ:Ð<UÑVÔVÐVõ 	�ŠÐ?ÀÑNÔNÐNÝ$ð %
ð %
Ø"+¤/Ô"7ð%
ñ %
ô %
ñ 
ô 
ˆõ %ð %
ð %
Ø"+¤/Ô"7ð%
ñ %
ô %
ñ 
ô 
ˆð &¨Ñ7ˆå!,­SÑ!1Ô!1ˆØ”OÔ)ð 	>ð 	>ˆDØŒy˜KÐ'Ð'­G°D´KÐARÑ,SÔ,SÐ'Ø•s˜4œ;Ô6Ñ7Ô7Ð8Ð8Ô8¸AÑ=Ð8Ð8Ñ8øÝ�ŠØ%Ý�ÑÔÝ�Ñ Ô Ý�Ñ Ô ñ		
ô 	
ð 	
õ $Ø�LŠL‰NŒN¥Ô 3°AÑ 6Ô 6Àð
ñ 
ô 
Ðõ 	�ŠÐ2Ð4FÑGÔGÐGØ�iÐÐrQ   Úfx_graphTÚtracedÚfnameÚfignameÚ
clear_metaÚprogústr | list[str] | NoneÚparse_stack_traceÚdot_graph_shapec                óx  — |rDt          j        | j        ¦  «        }t          j        | |¦  «        } | j        j        D ]	}i |_        Œ
t          j         	                    |¦  «        \  }	}
|
sdt          j        z   }
t                               d|	|
¦  «         t          j        | |||¬¦  «        }|                     ¦   «         }|	› |
› �}|
                     d¦  «        }|dv r|                     |¦  «         d S |€ t'          |d|z   ¦  «        } ||¦  «         d S t'          |d|z   ¦  «        } |||¬¦  «         d S )Nr  zWriting FX graph to file: %s%s)r—  r˜  >   ÚdotÚrawÚwrite_)r•  )rï  Údeepcopyr«   rÍ   r«  r¬   r‘   rÔ  rÕ  Úsplitextr   Útorch_compile_graph_formatr@   r’  r#   ÚFxGraphDrawerÚget_main_dot_graphÚlstripr“  rÃ   )r‘  r’  r“  r”  r•  r—  r˜  r  rH   r³  ÚextÚgré   Úgraph_formatÚwrite_methods                  rO   Ú
draw_graphr§  {  s`  € ð ð Ý”M &¤,Ñ/Ô/ˆ	Ý” ¨	Ñ2Ô2ˆØ”LÔ&ð 	ð 	ˆDØˆDŒIˆIÝ”× Ò  Ñ'Ô'�I€Dˆ#Øð 6Ø•FÔ5Ñ5ˆÝ‡H‚HÐ-¨t°SÑ9Ô9Ð9ÝÔ"ØØØ+Ø'ð		ñ 	ô 	€Að 	
×ÒÑÔ€AØˆN�SˆNˆN€EØ—:’:˜c‘?”?€LØ�~Ð%Ð%ð 	
�Š�‰ŒˆˆˆØ	ˆÝ˜q (¨\Ñ"9Ñ:Ô:ˆØˆ�UÑÔÐÐÐå˜q (¨\Ñ"9Ñ:Ô:ˆØˆ�U Ð&Ñ&Ô&Ð&Ð&Ð&rQ   rZ   )r¨   r©   rJ   r>   )rH   rI   rJ   r�   )rÅ   rI   rJ   rÆ   )rH   rI   rJ   rÆ   )rH   rI   rØ   rÙ   rJ   rÆ   )NF)rÜ   rÝ   rd   rc   rÞ   rc   rß   rà   rá   râ   rã   r>   rJ   rÝ   )r*  r©   r+  r�   rJ   r,  )r:  rc   r÷   r½   rJ   r;  )r@  rA  rJ   r�   )rH  rI  r   )r«   rJ  rH   rK  rL  rM  rN  rM  rO  r�   rJ   rK  )r«   rJ  rH   rK  rf  rK  rh  ri  r[  rM  rj  rM  rO  r�   rJ   rK  )rs  rt  rJ   rM  )rJ   rz  )rH   rK  rJ   r>   )rJ   ri  )r�  ri  rJ   r�  )r   )r«   rJ  r+  r�   rJ   r;  )r«   rJ  rJ   r;  )
r»  r©   r¼  r©   r½  r¾  r+  r�   rJ   r;  )Nr   )r:  rc   r»  r©   r¼  r©   rl   rî  r+  r�   rJ   r;  rL   )r*  r©   r:  rc   rý  rc   rþ  rÿ  r+  r�   rl   rî  rã   r>   rü  r>   rJ   r   )r*  r©   r-  r	   r+  r�   r,  r.  rl   rî  rJ   r   )rv  r�   r�  ri  rJ   r�   )r«   rÝ   rJ   r;  )rJ   r‰  )rÌ   r“  r”  rj   rJ   r•  )r›  r©   rJ   r©   )ri  r°  rj  r°  r±  rK  r²  rK  r³  r´  rµ  r�   r¶  rK  r·  rK  rJ   r¸  )
r*  r©   ri  r©   rj  r©   rÏ  r�   rJ   r   )r*  r©   rJ   r;  )r*  r©   r4  r>   rJ   r©   )
rÜ   rÝ   rg  rb   r  r‰   r  rî  rJ   r  )rK  rÅ  rJ   rÆ  )rÑ  r½   rÒ  r½   rJ   r½   )rK  rÅ  rJ   rØ  )rJ   rB   )r«   rÝ   rJ   r¾  )rÜ   rÝ   ra  rb  rc  rb  rd  rM  rg  rb   re  rc   rJ   rf  )ré   rt  rt  r�   rJ   rt  )rH   rI   rJ   rM  rÑ  )rÜ   rÝ   rg  rb   r�  rM  rJ   rc   )r«   rJ  rJ   r  )rÜ   rJ  r:  r(  rJ   r(  )r[  r©   r  r>   rJ   r©   )r*  r©   r,  rl  r+  r�   rJ   rb   )r™  )r*  r©   r-  r	   rv  r½   r+  r�   r,  r.  rJ   r   )r�  TNFN)r‘  r°  r’  r½   r“  r½   r”  r>   r•  r–  r—  r>   r˜  râ   rJ   r;  )ÇÚ
__future__r   rï  r†   r  rS  r  Úloggingr©  rÊ   rÔ  Úos.pathrß  rK  r„  r   r   Úcollections.abcr   Údataclassesr   r   Útypingr	   r
   r›   Útorch._inductor.inductor_primsÚtorch.distributedÚtorch.fxrÍ   Útorch.utils._pytreeÚutilsÚ_pytreerû   Útorch._dynamo.utilsr   r   Ú;torch._functorch._activation_checkpointing.ac_logging_utilsr   Ú$torch._functorch._aot_autograd.utilsr   Útorch._inductorr   r  Ú!torch._inductor.custom_graph_passr   r   Ú"torch._library.fake_class_registryr   Útorch._library.utilsr   Útorch._loggingr   r   Útorch._logging._internalr   rJ  r   Ú%torch.fx.experimental._backward_stater   Ú"torch.fx.experimental.proxy_tensorr   r   Útorch.fx.experimental.sym_noder   r   Ú%torch.fx.experimental.symbolic_shapesr   r   r   r    r!   r"   Útorch.fx.passesr#   Útorch.fx.tracebackr$   Útorch.utils._ordered_setr%   Útorch.utils.checkpointr&   rª  Ú-_activation_checkpointing.graph_info_providerr(   Ú"_activation_checkpointing.knapsackr)   r*   r+   r,   Ú,_activation_checkpointing.knapsack_evaluatorr-   Ú_aot_autograd.descriptorsr.   r/   r0   Ú_aot_autograd.functional_utilsr1   Ú_aot_autograd.graph_compiler2   Ú_aot_autograd.logging_utilsr3   Ú_aot_autograd.utilsr4   r5   r6   r7   r8   r9   r:   Úcompile_utilsr;   r<   r=   rŠ  rz  ÚsympyÚdebug_partitionerr?   r_   Ú	getLoggerr[   r@   rœ   r�   rX  rB   rb   r‰   r–   r§   r®   r´   rº   r¼   rÄ   rù   rÒ   r×   rÛ   r  r  r  r  r  r   r#  rú   rø   r9  r?  rG  rg  rr  ry  r…  rŒ  rŽ  r“  r£  rº  rí  rû  r+  rk  r�   r@  rn  r  rˆ  Úcacher’  rš  r`  rÎ  r_  rP  rQ  rR  r  rN  rÄ  r•  r‘  r—  r‰  r˜  rx  rå  rz  r†  rœ  r  r  r'  r^  rb  rS  rM  r§  r`   rQ   rO   ú<module>rÒ     s.  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø $Ð $Ð $Ð $Ð $Ð $Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à €€€Ø %Ð %Ð %Ð %Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ðð ð ð ð ð ð AÐ @Ð @Ð @Ð @Ð @Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ð ð ð ð ð ð @Ð ?Ð ?Ð ?Ð ?Ð ?Ø +Ð +Ð +Ð +Ð +Ð +Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø .Ð .Ð .Ð .Ð .Ð .Ø AÐ AÐ AÐ AÐ AÐ AØ ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð )Ð (Ð (Ð (Ð (Ð (Ø <Ð <Ð <Ð <Ð <Ð <Ø /Ð /Ð /Ð /Ð /Ð /Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à Ð Ð Ð Ð Ð Ø LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð ð ð ð ð LÐ KÐ KÐ KÐ KÐ Kðð ð ð ð ð ð ð ð ð ð
 AÐ @Ð @Ð @Ð @Ð @Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð IÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hð ð ØÐÐÐØ€L€L€Lð %Ô6Ð Ð 6Ð 6Ð 6Ñ 6Ø'�gÔ'¨Ñ1Ô1€Ð 1Ð 1Ð 1Ñ 1à„y„~€ØŒ	Œ€ð ð>ð >ð >ð >ð >ñ >ô >ñ „ð>ð2 ð ð  ð  ð  ð  ñ  ô  ñ „ð ðB ðð ð ð ð ñ ô ñ „ððð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð ñ ô ð ðIð Ið Ið Ið ˆoÑÔ€ðð ð ð ð2-ð -ð -ð -ðð ð ð ðH  Ø$)ðrð rð rð rð rðjð ð ð ðXð Xð Xð XðCð Cð Cð CðBð Bð Bð BðJð Jð Jð JðKð Kð Kð Kðð ð ð ð5ð 5ð 5ð 5ðJð Jð Jð Jð$ð ð ð ðð ð ð ð ØØðKð Kð Kð Kð Kð\C!ð C!ð C!ð C!ðL9ð 9ð 9ð 9ð"ð ð ð ðGð Gð Gð Gð45ð 5ð 5ð 5ð	ð 	ð 	ð 	ñFGñ FGð FGð FGð FGñRMGð MGð MGð MGðh ñ	Xñ Xð Xð Xð Xð~ ?CØñ'
ñ '
ð '
ð '
ð '
ð\ 04ñ	o"ð ?CØ$)Ø&+ðo"ð o"ñ o"ð o"ð o"ð o"ðn 7;Ø>Bðj ð j ñ j ð j ð j ð j ðZ ˆ#ˆc‰(Œ(€ñ"ð "ð "ð "ð)ð )ð )ð )ñZRð Rð Rð Rð „ñð ð ñ „ðñ Pð Pð Pð PñKð Kð Kð Kñ\[*ð [*ð [*ð [*ñ|a ð a ð a ð a ñH@ð @ð @ð @ñ'ð 'ð 'ð 'ñ<ð ð ð ð.Kð Kð Kð Kñ5ð 5ð 5ð 5ðx ,0ñ	v	&ñ v	&ð v	&ð v	&ð v	&ñrð ð ð ñB/ð /ð /ð /ñ$!ð $!ð $!ð $!ñNfð fð fð fñRð ð ð ñ-Tð -Tð -Tð -Tð` 0Ð /Ð /Ð /Ð /Ð /ñ5ð 5ð 5ð 5ñ*Nð *Nð *Nð *Nð` ñD	ñ D	ð D	ð D	ð D	ñN$ð $ð $ð $ñN@Ið @Ið @Ið @IñF`ð `ð `ð `ñFOð Oð Oð Oñd>ð >ð >ð >ðH ñk ð 7;ðk ð k ñ k ð k ð k ð k ðb ØØ#'Ø#Ø"&ñ%'ñ %'ð %'ð %'ð %'ð %'ð %'rQ   