Ë
    ÃÓ^j�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*jè                  Zud#evd$<    ejî                  ex«      Zyd%evd&<   ejô                  jö                  Z{ejô                  jø                  Z|e G d'„ d(«      «       Z}e G d)„ d*«      «       Z~e G d+„ d,«      «       Zdud-„Z€dud.„Z�dvd/„Z‚dvd0„Zƒdwd1„Z„ G d2„ d3«      Z…dud4„Z† e…«       Z‡dxd5„Zˆdyd6„Z‰	 	 	 	 	 	 dzd7„ZŠ	 	 d{	 	 	 	 	 	 	 	 	 	 	 	 	 d|d9„Z‹dud:„ZŒdud;„Z�dud<„ZŽdud=„Z�dud>„Z�dud?„Z‘dud@„Z’dudA„Z“	 	 	 	 	 	 d}dB„Z”d~dC„Z•	 	 	 	 ddD„Z–	 	 	 d€	 	 	 	 	 	 	 	 	 	 	 d�dE„Z—	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d‚dF„Z˜dƒdG„Z™d„dH„Zšd…dI„Z›d†dJ„Zœd‡dK„Z�dˆd‰dL„ZždŠdM„ZŸ	 dˆ	 	 	 	 	 	 	 	 	 d‹dN„Z 	 	 dŒ	 	 	 	 	 	 	 	 	 	 	 d�dO„Z¡	 dŽdd8d8dPœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d�dQ„Z¢dddRœ	 	 	 	 	 	 	 	 	 	 	 d�dS„Z£ e¤dT«      Z¥d‘dU„Z¦dwdV„Z§d’dW„Z¨e�jR                  d“dX„«       Zª	 	 	 	 	 	 d”dY„Z«d•dZ„Z¬	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d–d[„Z­	 	 	 	 	 	 	 	 	 	 d—d\„Z®d˜d]„Z¯d˜d^„Z°d˜d_„Z±dud`„Z²	 	 	 	 	 	 d™da„Z³	 dŽ	 	 	 	 	 	 	 	 	 dšdb„Z´	 	 	 	 d›dc„Zµdœdd„Z¶	 	 	 	 d�de„Z·dždf„Z¸dŸdg„Z¹	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dh„Zºd dil»m¼Z¼ d¡dj„Z½d¢dk„Z¾	 d£	 	 	 	 	 	 	 d¤dl„Z¿d¥dm„ZÀd¥dn„ZÁ	 	 	 	 	 	 d¦do„ZÂ	 	 	 	 	 	 d§dp„ZÃ	 	 	 	 	 	 	 	 d¨dq„ZÄ	 d©ddrœ	 	 	 	 	 	 	 	 	 	 	 dªds„ZÅ	 	 	 	 	 d«	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d¬dt„ZÆy)­é    )Ú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                  ól   — 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	y)ÚOpTypesz8Class for keeping track of different operator categorieszOrderedSet[Callable[..., Any]]Úfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsc                ó0   — t        |«      | j                  v S ©N)r<   rC   ©ÚselfÚnodes     úh/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_functorch/partitioners.pyÚ
is_fusiblezOpTypes.is_fusiblek   s   € Ü˜tÓ$¨×(8Ñ(8Ð8Ð8ó    c                ó0   — t        |«      | j                  v S rI   )r<   rD   rJ   s     rM   Úis_compute_intensivezOpTypes.is_compute_intensiven   s   € Ü˜tÓ$¨×(BÑ(BÐBÐBrO   c                ó0   — t        |«      | j                  v S rI   )r<   rE   rJ   s     rM   Ú	is_randomzOpTypes.is_randomq   s   € Ü˜tÓ$¨¯©Ð7Ð7rO   c                ó0   — t        |«      | j                  v S rI   )r<   rF   rJ   s     rM   Úis_viewzOpTypes.is_viewt   s   € Ü˜tÓ$¨¯©Ð5Ð5rO   c                ó0   — t        |«      | j                  v S rI   )r<   rG   rJ   s     rM   Úis_recomputablezOpTypes.is_recomputablew   s   € Ü˜tÓ$¨×(=Ñ(=Ð=Ð=rO   N©rL   úfx.NodeÚreturnr>   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rN   rQ   rS   rU   rW   © rO   rM   rB   rB   a   s=   … áBà/Ó/Ø9Ó9Ø.Ó.Ø,Ó,Ø4Ó4ó9óCó8ó6ô>rO   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
y)Ú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_nodesc                óF   ‡ — t        d„ ‰ j                  D «       ˆ fd„¬«      S )Nc              3  ó    K  — | ]  }|–— Œ y ­wrI   r`   ©Ú.0Úns     rM   ú	<genexpr>z-NodeInfo.required_fw_nodes.<locals>.<genexpr>‹   s   è ø€ Ò0�1ŒQÑ0ùs   ‚c                ó"   •— ‰j                   |    S rI   )rk   )rq   rK   s    €rM   ú<lambda>z,NodeInfo.required_fw_nodes.<locals>.<lambda>‹   s   ø€ ÀÇÁÈaÑ@P€ rO   ©Úkey)Úsortedrf   ©rK   s   `rM   Úrequired_fw_nodeszNodeInfo.required_fw_nodesˆ   s!   ø€ äÙ0˜×/Ñ/Ô0Ó6Pô
ð 	
rO   c                ó   — || j                   v S rI   )rf   ©rK   rq   s     rM   Úis_required_fwzNodeInfo.is_required_fwŽ   s   € Ø�D×+Ñ+Ð+Ð+rO   c                ó   — || j                   v S rI   )rg   r{   s     rM   Úis_required_bwzNodeInfo.is_required_bw‘   s   € Ø�D×*Ñ*Ð*Ð*rO   c                ó   — || j                   v S rI   )ri   r{   s     rM   Úis_unclaimedzNodeInfo.is_unclaimed”   s   € Ø�D×(Ñ(Ð(Ð(rO   c                óZ   — || j                   vrt        d|› d�«      ‚| j                  |   S )NúNode z not in fw nodes!)rf   ÚAssertionErrorrk   r{   s     rM   Úget_fw_orderzNodeInfo.get_fw_order—   s4   € Ø�D×+Ñ+Ñ+Ü  5¨¨Ð+<Ð!=Ó>Ð>Ø�}‰}˜QÑÐrO   N)rZ   rc   )rq   rY   rZ   r>   )rq   rY   rZ   Úint)r[   r\   r]   r_   Ú	functoolsÚcached_propertyry   r|   r~   r€   r„   r`   rO   rM   rb   rb   {   sZ   … ð ÓØ+Ó+Ø*Ó*Ø)Ó)Ø(Ó(Ø Ó à!4Ó4à×Ñò
ó ð
ó
,ó+ó)ô rO   rb   c                  ó@   — e Zd ZU ded<   ded<   ded<   ded<   ded<   y)Ú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`   rO   rM   r‰   r‰   �   s    … àÓØ $Ó$Ø"&Ó&Ø!Ó!ØÔrO   r‰   c                óz   — | j                   j                  dd «      t        j                  t        j                  fv S )NÚ	recompute)ÚmetaÚgetr&   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©rL   s    rM   Úmust_recomputer–   ¦   s5   € Ø�9‰9�=‰=˜ dÓ+Ü×'Ñ'Ü×)Ñ)ð0ð ð rO   c                óØ   — t        | j                  j                  d«      t        j                  «      xr6 t        | j                  «      dkD  xr t        d„ | j                  D «       «      S )NÚvalr   c              3  ó�   K  — | ]>  }|j                   t        j                  j                  j                  j
                  u –— Œ@ y ­wrI   )ÚtargetÚtorchÚopsÚatenÚ_assert_scalarÚdefault©rp   Úusers     rM   rr   z*_is_assert_only_symbool.<locals>.<genexpr>±   s2   è ø€ ò 
ØEIˆD�K‰Kœ5Ÿ9™9Ÿ>™>×8Ñ8×@Ñ@Ô@ñ
ùs   ‚AA)Ú
isinstancer‘   r’   r›   ÚSymBoolÚlenÚusersÚallr•   s    rM   Ú_is_assert_only_symboolr§   ­   sU   € ä�4—9‘9—=‘= Ó'¬¯©Ó7ò 	
Ü�—
‘
‹O˜aÑò	
äñ 
ØMQÏZÉZô
ó 
ðrO   c                óT   — | j                   j                  D ]  }t        |«      sŒ y y)NTF)ÚgraphÚnodesr–   ©Úfx_grL   s     rM   Úhas_recomputable_opsr­   ·   s+   € Ø—
‘
× Ñ ò ˆÜ˜$ÕÙðð rO   c                óä   — | j                   j                  D ]W  }t        |«      sŒt        |j                  d«      sŒ&t
        j                  j                  |j                  j                  v sŒW y y)NÚtagsTF)	r©   rª   r–   Úhasattrrš   r›   ÚTagÚnondeterministic_seededr¯   r«   s     rM   Úhas_recomputable_rng_opsr³   ¾   sU   € Ø—
‘
× Ñ ò ˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEáðð rO   c                ó
  — t        | j                  d   t        j                  t        j                  f«      ryt        | j                  d   t        j
                  «      s$t        dt        | j                  d   «      › �«      ‚y)Nr˜   r'   z.expected node.meta['val'] to be SymFloat, got é   )r¢   r‘   r›   ÚSymIntr£   ÚSymFloatrƒ   Útyper•   s    rM   Úsym_node_sizer¹   É   sg   € Ü�$—)‘)˜EÑ"¤U§\¡\´5·=±=Ð$AÔBØÜ�d—i‘i Ñ&¬¯©Ô7ÜØ<¼TÀ$Ç)Á)ÈEÑBRÓ=SÐ<TÐUó
ð 	
ð rO   c                  ó   — e Zd Zdd„Zy)ÚInvalidNodeBasec                 ó   — y)NzInvalid Noder`   rx   s    rM   Ú__repr__zInvalidNodeBase.__repr__Ô   s   € ØrO   N)rZ   Ústr)r[   r\   r]   r½   r`   rO   rM   r»   r»   Ó   s   „ ôrO   r»   c                ó6   — t        | j                  dd «      dk7  S )NÚ	namespaceÚ_c10d_functional)Úgetattrrš   r•   s    rM   Úis_not_collectiverÃ   Ù   s   € Ü�4—;‘; ¨TÓ2Ð6HÑHÐHrO   c                óX  — | j                   t        j                  k7  ry| j                  d   }| j                  d   }t	        |t
        j                  «      r|j                  dk7  ryd|j                  vry|j                  d   }||vry||   }t	        |t
        j                  «      r|S y)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Æ   )Úgetitem_nodeÚ	ho_resultrv   rÆ   Úoriginal_inputs        rM   Ú_get_ho_op_original_inputrÐ   à   s£   € ð ×Ñœh×.Ñ.Ò.ØØ×!Ñ! !Ñ$€IØ
×
Ñ
˜AÑ
€CÜ�i¤§¡Ô)¨Y¯\©\¸_Ò-LØØ�y×'Ñ'Ñ'ØØ×Ñ˜hÑ'€Fà
�&ÑØà˜C‘[€NÜ�.¤"§'¡'Ô*ØÐØrO   c                ó>  — | j                   t        j                  j                  j                  j
                  t        j                  j                  j                  j
                  fvry| j                  d   }t        |t        j                  «      sy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Ð   )rL   Úsources     rM   Ú_is_copy_node_bw_onlyrÕ   ù   si   € ð ‡{�{œ5Ÿ9™9Ÿ>™>×.Ñ.×6Ñ6¼¿	¹	¿¹×8NÑ8N×8VÑ8VÐWÑWØØ�Y‰Y�q‰\€FÜ�fœbŸg™gÔ&ØÜ$ VÓ,Ð,rO   c                ó¨   — t        | «      }|�||v rt        ||   t        «      s||   S t        | «      }|�||v rt        ||   t        «      s||   S y)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Ð   )rL   ÚenvrÏ   s      rM   Ú_find_input_for_invalid_outputrØ     sk   € ô +¨4Ó0€NàÐ"Ø˜cÑ!Ü˜3˜~Ñ.´Ô@à�>Ñ"Ð"ä.¨tÓ4€NàÐ"Ø˜cÑ!Ü˜3˜~Ñ.´Ô@à�>Ñ"Ð"ØrO   Fc                óx  ‡— t        j                  «       }i Š|D ]3  }|j                  |j                  «      }|j                  |_        |‰|<   Œ5 | j
                  D �]:  }|s<t        |«      r|dk7  r||vr
t        ‰|<   Œ$t        |«      r|dk7  r||vr
t        ‰|<   ŒB|‰v rŒG|j                  dk(  r
t        ‰|<   Œ`|j                  dk(  r’t        j                  |j                  i |j                  ¤Ž}	|	D �
cg c]/  }
t        |
t         j                  «      rt        ‰|
   t         «      ‘Œ1 }	}
t#        |	«      r
t        ‰|<   Œç|j%                  |ˆfd„«      ‰|<   �Œ|j                  dk(  r|j%                  |ˆfd„«      ‰|<   �Œ*|j                  dk(  s�Œ;�Œ= g }t'        ||«      D �]i  \  }
}t        |
t         j                  «      �r7|
‰vrt)        d	|
› d
�«      ‚t        ‰|
   t         «      rûd}|
j*                  t,        j.                  j0                  j2                  j4                  u r�t        |
«      r‚t7        |
j                  «      dk\  rjt        |
j                  d   t         j                  «      rC|
j                  d   ‰v r2t        ‰|
j                  d      t         «      s‰|
j                  d      }|€t9        |
‰«      }|�|j;                  |«       �Œ4t=        d	|
› d�«      ‚|j;                  ‰|
   «       �ŒY|j;                  |
«       �Œl |j?                  tA        |«      «      }||j                  d<   |D �cg c]9  }t        |t         j                  «      r|j                  jC                  d«      nd‘Œ; c}|j                  d<   |jE                  «        |jG                  «        |S c c}
w c c}w )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                ó   •— ‰|    S rI   r`   ©Úxr×   s    €rM   rt   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>g  ó   ø€ ¸CÀ¹F€ rO   Úget_attrc                ó   •— ‰|    S rI   r`   rÞ   s    €rM   rt   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>j  rà   rO   Úoutputr‚   z couldn't be found in envNr'   r   z was invalid, but is outputÚdescÚstack_traceÚoutput_stack_traces)$rÊ   ÚGraphrÜ   Únamer‘   rª   Ú_must_be_in_backwardÚInvalidNodeÚ_must_be_in_forwardrÌ   ÚpytreeÚarg_tree_leavesrÉ   rÆ   r¢   rË   r»   ÚanyÚ	node_copyÚzipÚRuntimeErrorrš   r›   rœ   r�   Úcopy_rŸ   r¤   rØ   Úappendrƒ   rã   Útupler’   Úeliminate_dead_codeÚlint)Újoint_graphrd   ÚoutputsÚoutputs_descsÚsubgraphÚignore_must_be_in_fw_bwÚ	new_graphrL   Únew_nodeÚall_argsrß   Úoutput_valuesÚx_descÚreplacementÚoutÚvr×   s                   @rM   Ú"_extract_graph_with_inputs_outputsr  &  sm  ø€ ô$ —‘“
€IØ"$€Cð ò ˆØ×(Ñ(¨¯©Ó3ˆàŸ	™	ˆŒàˆˆDŠ	ðð ×!Ñ!ó )ˆÙ&ä$ TÔ*Ø 
Ò*Ø Ñ&ä'��D‘	Øô $ DÔ)Ø 	Ò)Ø Ñ&ä'��D‘	Øà�3‰;ð Ø�W‰W˜Ò%Ü#ˆC�ŠIØ�W‰W˜Ò'Ü×-Ñ-¨t¯y©yÐH¸D¿K¹KÑHˆHð "öàÜ˜a¤§¡Ô)ô ˜3˜q™6¤?Õ3ðˆHð ô
 �8Œ}Ü'��D‘	Øà!×+Ñ+¨DÓ2BÓCˆC�‹IØ�W‰W˜
Ò"à!×+Ñ+¨DÓ2BÓCˆC�‹IØ�W‰W˜Ô ÙðS)ðT €MÜ˜ -Ó0ó $‰	ˆˆ6Ü�aœŸ™Õ!Ø˜‰|Ü" U¨1¨#Ð-FÐ#GÓHÐHÜ˜#˜a™&¤/Ô2ð #�ð —H‘H¤§	¡	§¡× 4Ñ 4× <Ñ <Ñ<Ü,¨QÔ/Ü˜AŸF™F› qÒ(Ü" 1§6¡6¨!¡9¬b¯g©gÔ6ØŸ™˜q™	 SÑ(Ü& s¨1¯6©6°!©9¡~´ÔGà"% a§f¡f¨Q¡i¡.�Kð Ð&Ü"@ÀÀCÓ"H�KØÐ*Ø!×(Ñ(¨Ô5ÙÜ$ u¨Q¨CÐ/JÐ%KÓLÐLØ× Ñ   Q¡Ö(à× Ñ  Ö#ð=$ð> ×
Ñ
œ5 Ó/Ó
0€CØ$€C‡H�HˆVÑð
 ö'àô &0°´2·7±7Ô%;ˆ�‰�
‰
�=Ô!ÀÑEò'€C‡H�HÐ"Ñ#ð
 ×!Ñ!Ô#Ø‡N�NÔØÐùòuùòf's   Ã84N2Í>N7c                ó  — t         j                  xry t        | j                  t        j
                  j                  «      xr t        | j                  «       xs1 | j                  t        j                  j                  j                  k(  S rI   )r   Úis_non_builtin_to_includer¢   rš   r›   Ú_opsÚ
OpOverloadr   rœ   Úhigher_orderÚ triton_kernel_wrapper_functionalr•   s    rM   r  r  ›  s`   € Ü×+Ñ+ò Ü	�D—K‘K¤§¡×!6Ñ!6Ó	7Ò	WÄ
È4Ï;É;Ó@WÐ<Wò 	RØ�;‰;œ%Ÿ)™)×0Ñ0×QÑQÑQðrO   c                óv   — | j                   dk(  xr) t        | j                  j                  d«      t        «      S )NrÜ   r˜   )rÌ   r¢   r‘   r’   r   r•   s    rM   Ú_is_backward_stater  ¢  s*   € Ø�7‰7�mÑ#ÒW¬
°4·9±9·=±=ÀÓ3GÌÓ(WÐWrO   c                ó@   — | j                   j                  dd «      dk(  S )NÚpartitioner_tagÚis_backward©r‘   r’   r•   s    rM   Ú_has_tag_is_backwardr  ¦  s   € Ø�9‰9�=‰=Ð*¨DÓ1°]ÑBÐBrO   c                ó@   — | j                   j                  dd «      dk(  S )Nr  Ú
is_forwardr  r•   s    rM   Ú_has_tag_is_forwardr  ª  s   € Ø�9‰9�=‰=Ð*¨DÓ1°\ÑAÐArO   c                ó@   — | j                   j                  dd «      dk(  S )Nr  Úmust_be_in_forwardr  r•   s    rM   Ú_has_tag_must_be_in_forwardr  ®  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5IÑIÐIrO   c                ó@   — | j                   j                  dd «      dk(  S )Nr  Úmust_be_in_backwardr  r•   s    rM   Ú_has_tag_must_be_in_backwardr  ²  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5JÑJÐJrO   c                óö   — t        | «      ryt        | j                  t        j                  j
                  «      xr  | j                  j                  j                  }t        | «       xr t        | «       xr |S ©NT)
r  r¢   rš   r›   r  r  Ú_schemaÚ
is_mutabler  r  ©rL   r  s     rM   rë   rë   ¶  sn   € Ü" 4Ô(Øô 	�4—;‘;¤§
¡
× 5Ñ 5Ó6ò 	+Ø�K‰K×Ñ×*Ñ*ð ô
 ! Ó&Ð&ò 	Ü,¨TÓ2Ð2ò	àðrO   c                óØ   — t        | «      ryt        | j                  t        j                  j
                  «      xr  | j                  j                  j                  }t        | «      xr |S r  )	r  r¢   rš   r›   r  r  r  r  r  r  s     rM   ré   ré   Å  sT   € Ü# DÔ)Øä�4—;‘;¤§
¡
× 5Ñ 5Ó6ò 	+Ø�K‰K×Ñ×*Ñ*ð ô   Ó%Ò4¨*Ð4rO   c          	     ól  — t        j                  d„ | j                  j                  d¬«      D «       Ž }t        j                  t	        t        | j                  j                  d¬«      «      «      j                  j                  dd gt        |«      z  «      «      }|d | }||d  }|d | }||d  }||||fS )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wrI   ©rÉ   ©rp   rL   s     rM   rr   z+_extract_fwd_bwd_outputs.<locals>.<genexpr>Ó  s   è ø€ Ò	K˜ˆ$�)�)Ñ	Kùs   ‚rã   ©rÌ   rä   )	rì   rí   r©   Ú
find_nodesÚnextÚiterr‘   r’   r¤   )Újoint_moduleÚnum_fwd_outputsrø   rù   Úfwd_outputsÚbwd_outputsÚfwd_outputs_descsÚbwd_outputs_descss           rM   Ú_extract_fwd_bwd_outputsr/  Ï  sÍ   € ô ×$Ñ$Ù	K × 2Ñ 2× =Ñ =ÀÐ =Ó JÔ	Kð€Gô ×*Ñ*ÜŒT�,×$Ñ$×/Ñ/°8Ð/Ó<Ó=Ó>×CÑC×GÑGØ�T�FœS ›\Ñ)ó	
ó€Mð
 Ð*˜?Ð+€KØ˜/Ð*Ð+€KØ%Ð&6 Ð7ÐØ% oÐ&6Ð7ÐØ˜Ð%6Ð8IÐIÐIrO   c                óV   — | D ]$  }|j                   |k(  sŒ| j                  |«        y  y rI   )rè   Úremove)Úsaved_valuesrè   Úsaved_values      rM   Ú_remove_by_namer4  á  s0   € Ø#ò ˆØ×Ñ˜tÓ#Ø×Ñ Ô,ÙñrO   c                ó„   — t        | «      }t        t        | «      dz
  dd«      D ]  }t        | |   «      rŒ|dz   } |S  |S )Nr'   éÿÿÿÿ)r¤   Úranger   )Úfwd_module_outputsÚidxÚis      rM   Úfind_first_sym_noder;  è  sX   € ô Ð Ó
!€CÜ”3Ð)Ó*¨QÑ.°°BÓ7ò ˆÜÐ-¨aÑ0Õ1Ø�a‘%ˆCØØ€Jð	ð €JrO   c           	     ó’  — | j                  |«      5  | j                  t        j                  j                  j
                  j                  |f¬«      }t        j                  j                  j
                  j                  |j                  d   «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  |dgdf¬«      }t        j                  j                  j                  j                  |j                  d   dgd«      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  |t        j                  f¬«      }t        j                  j                  j                  j                  |j                  d   t        j                  «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  ||f¬«      }t        j                  j                  j                  j                  |j                  d   |«      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  |f¬«      }	t        j                  j                  j                  j                  |j                  d   «      |	j                  d<   t        |	j                  d   «      |	j                  d<   d d d «       | j                  	«      5  | j                  t        j                  j                  j                  j                   |	|f¬«      }
t        j                  j                  j                  j!                  |	j                  d   |«      |
j                  d<   t        |
j                  d   «      |
j                  d<   d d d «       | j                  
«      5  | j                  t        j                  j                  j                  j                  |
t        j"                  fd|› d|j$                  › �¬«      }t        j                  j                  j                  j                  |
j                  d   t        j"                  «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       |S # 1 sw Y   �Œ+xY w# 1 sw Y   �ŒfxY w# 1 sw Y   �Œ‰xY w# 1 sw Y   �ŒÈxY w# 1 sw Y   �Œ	xY w# 1 sw Y   �ŒHxY w# 1 sw Y   S xY w)	Nr#  r˜   Útensor_metar6  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©   rL   ÚmaxÚminÚpositionÚabs_nodeÚ	amax_nodeÚamax_64_nodeÚclamp_min_nodeÚreciprocal_nodeÚmul_nodeÚ
scale_nodes               rM   Úcalculate_quantization_scalingrV  ó  s$  € ð 
×	Ñ	˜tÓ	$ñ UØ×&Ñ&Ü�I‰I�N‰N×Ñ×&Ñ&Ø�ð 'ó 
ˆô  %Ÿy™yŸ~™~×1Ñ1×9Ñ9¸$¿)¹)ÀEÑ:JÓKˆ�‰�eÑÜ'>¸x¿}¹}ÈUÑ?SÓ'Tˆ�‰�mÑ$÷Uð 
×	Ñ	˜xÓ	(ñ WØ×'Ñ'Ü�I‰I�N‰N×Ñ×'Ñ'Ø˜R˜D $Ð'ð (ó 
ˆ	ô !&§	¡	§¡× 3Ñ 3× ;Ñ ;Ø�M‰M˜%Ñ  2 $¨ó!
ˆ	�‰�uÑô )@À	ÇÁÈuÑ@UÓ(Vˆ	�‰�}Ñ%÷Wð 
×	Ñ	˜yÓ	)ñ 

Ø×*Ñ*Ü�I‰I�O‰O×0Ñ0×8Ñ8ØœUŸ]™]Ð+ð +ó 
ˆô $)§9¡9§?¡?×#GÑ#G×#OÑ#OØ�N‰N˜5Ñ!¤5§=¡=ó$
ˆ×Ñ˜%Ñ ô ,CØ×Ñ˜eÑ$ó,
ˆ×Ñ˜-Ñ(÷

ð 
×	Ñ	˜|Ó	,ñ 

Ø×,Ñ,Ü�I‰I�N‰N×$Ñ$×,Ñ,Ø Ð$ð -ó 
ˆô &+§Y¡Y§^¡^×%=Ñ%=×%EÑ%EØ×Ñ˜eÑ$ có&
ˆ×Ñ˜EÑ"ô .EØ×Ñ Ñ&ó.
ˆ×Ñ˜MÑ*÷

ð 
×	Ñ	˜~Ó	.ñ 

Ø×-Ñ-Ü�I‰I�N‰N×%Ñ%×-Ñ-Ø Ð"ð .ó 
ˆô ',§i¡i§n¡n×&?Ñ&?×&GÑ&GØ×Ñ Ñ&ó'
ˆ×Ñ˜UÑ#ô /FØ× Ñ  Ñ'ó/
ˆ×Ñ˜]Ñ+÷

ð 
×	Ñ	˜Ó	/ñ UØ×&Ñ&Ü�I‰I�N‰N×Ñ×%Ñ%Ø! 3Ð'ð 'ó 
ˆô  %Ÿy™yŸ~™~×1Ñ1×8Ñ8Ø× Ñ  Ñ'¨ó 
ˆ�‰�eÑô (?¸x¿}¹}ÈUÑ?SÓ'Tˆ�‰�mÑ$÷Uð 
×	Ñ	˜xÓ	(ñ 	YØ×(Ñ(Ü�I‰I�O‰O×0Ñ0×8Ñ8ØœEŸM™MÐ*Ø! ( ¨1¨T¯Y©Y¨KÐ8ð )ó 
ˆ
ô
 "'§¡§¡×!EÑ!E×!MÑ!MØ�M‰M˜%Ñ ¤%§-¡-ó"
ˆ
�‰˜Ñô *AÀÇÁÐQVÑAWÓ)Xˆ
�‰˜Ñ&÷	Yð Ð÷IUñ Uú÷Wñ Wú÷

ñ 

ú÷

ñ 

ú÷

ñ 

ú÷Uñ Uú÷	Yð ÐúsZ   ’B3W.ÃB9W;Æ0CXÊB5XÍ(B3X"Ð4B5X/ÔC"X<×.W8×;XØXØXØ"X,Ø/X9Ø<Yc           	     ó	  — | j                  |«      5  | j                  t        j                  j                  j
                  j                  |t        j                  f¬«      }t        j                  j                  j
                  j                  |j                  d   t        j                  «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  ||f¬«      }t        j                  j                  j                  j                  |j                  d   |j                  d   «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  ||f¬«      }	t        j                  j                  j                  j                  |j                  d   |«      |	j                  d<   t        |	j                  d   «      |	j                  d<   d d d «       | j                  	«      5  | j                  t        j                  j                  j                  j                  |	|f¬«      }
t        j                  j                  j                  j                  |	j                  d   |«      |
j                  d<   t        |
j                  d   «      |
j                  d<   d d d «       | j                  
«      5  | j                  t        j                  j                  j
                  j                  |
|fd|› d|j                  › �¬«      }t        j                  j                  j
                  j                  |
j                  d   |«      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       |S # 1 sw Y   �ŒbxY w# 1 sw Y   �Œ”xY w# 1 sw Y   �ŒÓxY w# 1 sw Y   �ŒxY w# 1 sw Y   S xY w)Nr#  r˜   r=  Úfp8_quant_pos_r?  r@  )rA  rÅ   r›   rœ   rD  rE  rŸ   rK  r‘   r   r�   rI  rJ  rG  Ú	clamp_maxrè   )r©   rL   rU  Ú
quant_typerG  rY  rN  Útarget_node_32Úscaled_target_nodeÚclamp_min_scaled_nodeÚclamp_max_scaled_nodeÚquant_activation_nodes               rM   Úperform_quantizationr`  A  sä  € ð 
×	Ñ	˜zÓ	*ñ 

Ø×,Ñ,Ü�I‰I�O‰O×0Ñ0×8Ñ8ØœŸ™Ð&ð -ó 
ˆô &+§Y¡Y§_¡_×%IÑ%I×%QÑ%QØ�I‰I�eÑœeŸm™mó&
ˆ×Ñ˜EÑ"ô .EØ×Ñ Ñ&ó.
ˆ×Ñ˜MÑ*÷

ð 
×	Ñ	˜~Ó	.ñ 

Ø"×0Ñ0Ü�I‰I�N‰N×Ñ×%Ñ%Ø  *Ð-ð 1ó 
Ðô */¯©¯©×);Ñ);×)BÑ)BØ×Ñ Ñ&¨
¯©¸Ñ(>ó*
Ð×Ñ Ñ&ô 2IØ×#Ñ# EÑ*ó2
Ð×Ñ Ñ.÷

ð 
×	Ñ	Ð1Ó	2ñ 

Ø %× 3Ñ 3Ü�I‰I�N‰N×$Ñ$×,Ñ,Ø$ iÐ0ð !4ó !
Ðô -2¯I©I¯N©N×,DÑ,D×,LÑ,LØ×#Ñ# EÑ*¨Ió-
Ð×"Ñ" 5Ñ)ô 5LØ!×&Ñ& uÑ-ó5
Ð×"Ñ" =Ñ1÷

ð 
×	Ñ	Ð4Ó	5ñ 

Ø %× 3Ñ 3Ü�I‰I�N‰N×$Ñ$×,Ñ,Ø'¨Ð3ð !4ó !
Ðô -2¯I©I¯N©N×,DÑ,D×,LÑ,LØ!×&Ñ& uÑ-¨yó-
Ð×"Ñ" 5Ñ)ô 5LØ!×&Ñ& uÑ-ó5
Ð×"Ñ" =Ñ1÷

ð 
×	Ñ	Ð4Ó	5ñ 
Ø %× 3Ñ 3Ü�I‰I�O‰O×0Ñ0×8Ñ8Ø'¨Ð4Ø! ( ¨1¨T¯Y©Y¨KÐ8ð !4ó !
Ðô �I‰I�O‰O×0Ñ0×8Ñ8Ø%×*Ñ*¨5Ñ1°:óð 	×"Ñ" 5Ñ)ô
 5LØ!×&Ñ& uÑ-ó5
Ð×"Ñ" =Ñ1÷
ð !Ð ÷u

ñ 

ú÷

ñ 

ú÷

ñ 

ú÷

ñ 

ú÷
ð !Ð ús@   ’CQÃ<CQÇB5QÊ%B5Q*Í3CQ7ÑQÑQÑQ'Ñ*Q4Ñ7Rc                óR   — | j                  «       }| j                  «       }||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)ÚtensorÚnum_elementsrc  s      rM   Úcalculate_tensor_sizerf  ‡  s-   € ð —<‘<“>€LØ×&Ñ&Ó(€Là˜<Ñ'¨KÑ8Ð8rO   c            	     óú   — t         j                  j                  j                  d   j	                  dd«      } | j                  d«      D �cg c]$  }t        t         |j                  d«      d   «      ‘Œ& } }| S c c}w )NÚ!activation_quantization_aten_passÚallowed_dtypesztorch.bfloat16ú;ú.r6  )r›   Ú	_inductorr   Úpost_grad_fusion_optionsr’   ÚsplitrÂ   )ri  Údtypes     rM   Úget_allowed_dtypesrp  ˜  sz   € Ü—_‘_×+Ñ+×DÑDØ+ñç	�cÐ
Ð,Ó-ð ð ;I×:NÑ:NÈsÓ:SöØ16Œ”�u—{‘{ 3Ó'¨Ñ+Õ,ð€Nð ð Ðùòs   Á)A8c                óB  — t        «       }t        | «      r| j                  d   j                  |vryt        j
                  j                  j                  d   j                  dd«      }t        | j                  d   «      }t        j
                  j                  j                  d   j                  dd«      s||k\  S t        j
                  j                  j                  d   j                  dd«      rt        ||k\  «      xs t        ||k\  «       S t        ||k\  «      S )Nr˜   Frh  Ú
size_in_mbéd   Úskip_dynamo_guardsÚquantize_dynamic_shape)rp  r   r‘   ro  r›   rl  r   rm  r’   rf  r"   r!   )rL   ri  Úsize_thresholdrr  s       rM   Úshould_quantizerw  ¢  s  € Ü'Ó)€NÜ˜dÔ# t§y¡y°Ñ'7×'=Ñ'=À^Ñ'SØÜ—_‘_×+Ñ+×DÑDØ+ñç	�cˆ,˜Óð ô ' t§y¡y°Ñ'7Ó8€JÜ�?‰?×!Ñ!×:Ñ:Ø+ñç	�cÐ
 Ó&ð'ð ˜^Ñ+Ð+ô �?‰?×!Ñ!×:Ñ:Ø/ñ
ç
‰#Ð&¨Ó
.ð/ô )Ø˜nÑ,óò Jä+¨J¸.Ñ,HÓIÐIðJô
 )¨°~Ñ)EÓFÐFrO   c                 ó´   — t         j                  j                  j                  d   j	                  dd«      } t        t         | j                  d«      d   «      S )Nrh  rZ  ztorch.float8_e5m2rk  r6  )r›   rl  r   rm  r’   rÂ   rn  )rZ  s    rM   Úget_quant_typery  ¼  sN   € Ü—‘×'Ñ'×@Ñ@Ø+ñç	�cˆ,Ð+Ó,ð ô ”5˜*×*Ñ*¨3Ó/°Ñ3Ó4Ð4rO   c                ó\   — 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›   ÚfinforM  rL  )ro  Úinfos     rM   Úcalculate_ranger}  Ä  s%   € ô �;‰;�uÓ€DØ�8‰8�T—X‘XÐÐrO   c           
     óø  — | j                  d¬«      d   }|j                  d   }t        «       }t        |«      \  }}t	        «       }g }g }	t        |«      D �]“  \  }
}|
|k  rŒ|j                  j                  dd«      sŒ*t        j                  j                  j                  d   j                  dd«      rOt        | ||d	|
«      }t        | ||||||
«      }t        |«      s|j                  |«       nñ|	j                  |«       nß| j!                  |«      5  | j#                  t        j$                  j&                  j(                  j*                  ||fd
|
› d|j,                  › �¬«      }t        j$                  j&                  j(                  j+                  |j                  d   |«      |j                  d<   t/        |j                  d   «      |j                  d<   d d d «       ||
<   �Œ– t        |«      D ��cg c]  \  }}|j                  ||«      ‘Œ }}}t1        |«      }||	z   }|r|d | |z   ||d  z   }|j3                  dt5        |«      «       t6        d   dxx   dz  cc<   y # 1 sw Y   ŒŽxY wc c}}w )Nrã   r%  r   Úsaved_for_quantizationFrh  Úuse_scalingTçê-�™—q=rX  r?  r@  r˜   r=  ÚinductorÚ%activation_quantization_fwd_aten_passr'   )r&  rÉ   ry  r}  ÚdictÚ	enumerater‘   r’   r›   rl  r   rm  rV  r`  r   ró   rA  rÅ   rœ   rD  rE  rŸ   rè   r   r;  Ú
update_argrô   r   )r©   r*  rã   r+  rZ  rG  rY  Úposition_to_quantÚtensor_scale_nodesÚsym_scale_nodesrN  rL   rU  Ú
quant_noder:  Úoutput_updated_argsr9  Úscale_nodess                     rM   Úquantize_activation_fwr�  Ð  sˆ  € Ø×Ñ ÐÓ*¨1Ñ-€FØ—+‘+˜a‘.€KÜÓ!€JÜ*¨:Ó6Ñ€IˆyÜ›ÐØ(*ÐØ%'€OÜ# KÓ0ó -5‰ˆ�$ð �oÒ%Øà�9‰9�=‰=Ð1°5Õ9ä�‰×%Ñ%×>Ñ>Ø3ñç‰c�- Ó&ð'ô <Ø˜4 ¨E°8ó�
ô
 2Ø˜4 ¨Z¸ÀIÈxó�
ô # :Ô.Ø&×-Ñ-¨jÕ9à#×*Ñ*¨:Õ6ð ×*Ñ*¨4Ó0ñ Ø!&×!4Ñ!4ÜŸ	™	Ÿ™×<Ñ<×DÑDØ" JÐ/Ø-¨h¨Z°q¸¿¹¸ÐDð "5ó "�Jô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨jóð —O‘O EÑ*ô
 6MØ"Ÿ™¨Ñ.ó6�J—O‘O MÑ2÷ð +5Ð˜hÓ'ð[-5ôd 7@ÀÓ6L÷Ù+2¨1¨dÐ×Ñ˜a Õ&ðÐñ ô
 Ð1Ó
2€CØ$ Ñ6€KÙà  Ð%¨Ñ3Ð6IÈ#È$Ð6OÑOð 	ð ×Ñ�aœÐ2Ó3Ô4ÜˆZÑÐ@ÓAÀQÑFÔA÷Að üó&s   ÄCI*Ç;I6É*I3	c           
     ó
  ‡	— | j                   D �cg c]  }|j                  dk(  sŒ|‘Œ }}d }|D �]~  }|j                  j                  dd«      sŒ!|j                  j	                  d«       |j                  j	                  d«      }t
        j                  j                  j                  d   j                  dd«      �rÅ| j                  |«      5  d|j                  j                  dd	«      z   Š	t        ˆ	fd
„|D «       «      }d d d «       | j                  «      5  | j                  t
        j                  j                  j                   j"                  ||f¬«      }t
        j                  j                  j                   j#                  |j                  d   |«      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       | j                  |«      5  | j                  t
        j                  j&                  j(                  j*                  ||f¬«      }t
        j                  j&                  j(                  j+                  |j                  d   |j                  d   «      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t
        j                  j                  j                   j"                  ||f¬«      }t
        j                  j                  j                   j#                  |j                  d   |«      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       nå| j                  |«      5  | j                  t
        j                  j                  j                   j"                  ||fdt-        |j                  «      z   ¬«      }t
        j                  j                  j                   j#                  |j                  d   |«      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       t/        |j0                  j3                  «       «      D ]   }|k7  sŒ	||k7  sŒ|j5                  ||«       Œ" �Œ� t6        d   dxx   dz  cc<   y c c}w # 1 sw Y   �ŒÊxY w# 1 sw Y   �Œ	xY w# 1 sw Y   �Œ;xY w# 1 sw Y   Œ“xY w# 1 sw Y   ŒŸxY w)NrÜ   r  FÚdequant_typerh  r€  Ú
fp8_scale_Ú
fp8_quant_Ú c              3  ó@   •K  — | ]  }|j                   ‰k(  r|–— Œ y ­wrI   ©rè   )rp   Ú	bwd_inputÚ
scale_names     €rM   rr   z)quantize_activation_bw.<locals>.<genexpr>(  s%   øè ø€ ò &à%Ø$Ÿ>™>¨ZÒ7ô "ñ&ùs   ƒr#  r˜   r=  Údequant_r@  r‚  Ú%activation_quantization_bwd_aten_passr'   )rª   rÌ   r‘   r’   Úpopr›   rl  r   rm  rA  rè   r   r'  rÅ   rœ   rD  rE  rŸ   r   r�   ÚdivrJ  r¾   Úlistr¥   ÚkeysÚreplace_input_withr   )
r©   rL   Ú	bw_inputsÚactivation_noder�  rU  Údivided_target_node_32Údequant_noder¡   r–  s
            @rM   Úquantize_activation_bwr¢    si  ø€ Ø"'§+¡+ÖJ˜$°·±¸MÓ1I’ÐJ€IÐJØ€OØó H@ˆØ�9‰9�=‰=Ð1°5Õ9Ø�I‰I�M‰MÐ2Ô3ØŸ9™9Ÿ=™=¨Ó8ˆLä�‰×%Ñ%×>Ñ>Ø3ñç‰c�- Ó'ñ(ð ×*Ñ*¨4Ó0ñ à!-°·	±	×0AÑ0AÀ,ÐPRÓ0SÑ!S�JÜ!%ó &à)2ô&ó "�J÷ð ×*Ñ*¨:Ó6ñ Ø&+×&9Ñ&9ÜŸ	™	Ÿ™×<Ñ<×DÑDØ" LÐ1ð ':ó '�Oô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨lóð $×(Ñ(¨Ñ/ô
 ;RØ'×,Ñ,¨UÑ3ó;�O×(Ñ(¨Ñ7÷ð ×*Ñ*¨?Ó;ñ 
Ø-2×-@Ñ-@ÜŸ	™	Ÿ™×*Ñ*×1Ñ1Ø-¨zÐ:ð .Aó .Ð*ô :?¿¹¿¹×9KÑ9K×9RÑ9RØ'×,Ñ,¨UÑ3°Z·_±_ÀUÑ5Kó:Ð*×/Ñ/°Ñ6ô 0Ð0F×0KÑ0KÈEÑ0RÓSð +×/Ñ/°Ñ>÷
ð ×*Ñ*Ð+AÓBñ Ø#(×#6Ñ#6ÜŸ	™	Ÿ™×<Ñ<×DÑDØ4°lÐCð $7ó $�Lô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ2×7Ñ7¸Ñ>Àóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Ñ0ó8�L×%Ñ% mÑ4÷ð ð ×*Ñ*¨4Ó0ñ Ø#(×#6Ñ#6ÜŸ	™	Ÿ™×<Ñ<×DÑDØ" LÐ1Ø'¬#¨d¯i©i«.Ñ8ð $7ó $�Lô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨lóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Ñ0ó8�L×%Ñ% mÑ4÷ô ˜TŸZ™ZŸ_™_Ó.Ó/ò @�Ø˜<Ó'¨D°OÓ,CØ×+Ñ+¨D°,Õ?ò@ðMH@ôT ˆZÑÐ@ÓAÀQÑFÔAùòY K÷ñ ú÷ñ ú÷
ñ 
ú÷ð ú÷ð úsJ   �S¥SÃ4SÄB5SÇ*CS%ËB5S2ÎCS>ÓS	ÓS"	Ó%S/	Ó2S;	Ó>T	c                óâ  ‡ ‡— t        dd„ ˆ fd„¬«       t        ‰ j                  |«       t        dd„ ˆ fd„¬«       t        dd„ ˆfd„¬«       ‰ j                  j                  d	¬
«      d   j                  d   }|D ]ý  }d|j
                  v sŒ|t        j                  dd|j
                  «         }‰j                  j                  |«      5  ‰j                  j                  |j
                  ¬«      }d d d «       |j                  d   }j                  j                  |j                  «       d|j                  d<   ||j                  d<   |j                  |«       ‰j                  j                  |«       Œÿ t        j                  j                   j"                  d   j%                  dd«      rüt'        ‰j                  j                  d¬
«      «      }	|	d   }
t)        |	«      D ]  }t+        |«      rŒ|}
 n ‰ j                  j                  d	¬
«      d   j                  d   }|D ]‚  }d|j
                  v sŒ‰j                  j                  |
«      5  ‰j                  j                  |j
                  ¬«      }d d d «       j                  j                  |j                  «       |}
Œ„ t-        ‰j                  «       t        dd„ ˆfd„¬«       y # 1 sw Y   �ŒåxY w# 1 sw Y   ŒgxY w)NÚartifactc                 ó   — dddœS )NÚ,before_activation_quantization_fwd_aten_passÚstring©rè   Úencodingr`   r`   rO   rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>q  ó   € ØBØ ñ
€ rO   c                 ó,   •— ‰ j                  ddd¬«      S ©NFT©Úprint_outputÚinclude_strideÚinclude_device©Úprint_readable©Ú
fwd_modules   €rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>u  ó   ø€ ˜:×4Ñ4Ø¨tÀDð 5ó 
€ rO   ©Úmetadata_fnÚ
payload_fnc                 ó   — dddœS )NÚ+after_activation_quantization_fwd_aten_passr§  r¨  r`   r`   rO   rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>~  ó   € ØAØ ñ
€ rO   c                 ó,   •— ‰ j                  ddd¬«      S r¬  r±  r³  s   €rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>‚  rµ  rO   c                 ó   — dddœS )NÚ,before_activation_quantization_bwd_aten_passr§  r¨  r`   r`   rO   rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>‰  rª  rO   c                 ó,   •— ‰ j                  ddd¬«      S r¬  r±  ©Ú
bwd_modules   €rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>�  rµ  rO   rã   r%  r   r‘  z^fp8_quant_pos_\d+_r’  r”  r�  Tr  rh  r€  rÜ   r6  r�  c                 ó   — dddœS )NÚ+after_activation_quantization_bwd_aten_passr§  r¨  r`   r`   rO   rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>º  r»  rO   c                 ó,   •— ‰ j                  ddd¬«      S r¬  r±  rÀ  s   €rM   rt   z5perform_fp8_activation_quantization.<locals>.<lambda>¾  rµ  rO   )r   r�  r©   r&  rÉ   rè   ÚreÚsubrA  rÜ   r‘   ÚupdateÚreplace_all_uses_withÚ
erase_noder›   rl  r   rm  r’   r›  Úreversedr7   r¢  )r´  rÁ  Úbwd_module_inputsr*  Ú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   ``            rM   Ú#perform_fp8_activation_quantizationrÔ  i  sÆ  ù€ ô Øñ
ó
õ	ô ˜:×+Ñ+¨_Ô=äØñ
ó
õ	ô Øñ
ó
õ	ð  *×/Ñ/×:Ñ:¸hÐ:ÓGÈÑJ×OÑOÐPQÑRÐà,ò 3ˆØ˜8Ÿ=™=Ò(Ø)Ü—‘Ð-¨r°8·=±=ÓAñˆIð ×!Ñ!×1Ñ1°)Ó<ñ SØ",×"2Ñ"2×">Ñ">ÀHÇMÁMÐ">Ó"R�÷Sà$Ÿ>™>¨.Ñ9ˆLØ× Ñ ×'Ñ'¨¯©Ô6Ø=AˆO× Ñ Ð!9Ñ:Ø3?ˆO× Ñ  Ñ0Ø×+Ñ+¨OÔ<Ø×Ñ×'Ñ'¨	Õ2ð3ô ‡�×Ñ×6Ñ6Ø+ñç	�cˆ-˜Óðô #' z×'7Ñ'7×'BÑ'BÀmÐ'BÓ'TÓ"UÐà/°Ñ3ˆÜ Ð!8Ó9ò 	ˆHÜ˜xÕ(Ø (�Ùð	ð
 %/×$4Ñ$4×$?Ñ$?À8Ð$?Ó$LÈQÑ$O×$TÑ$TÐUVÑ$WÐ!Ø1ò 	0ˆHØ˜xŸ}™}Ò,à×%Ñ%×5Ñ5°mÓDñ WØ&0×&6Ñ&6×&BÑ&BÈÏÉÐ&BÓ&V�O÷Wà×$Ñ$×+Ñ+¨H¯M©MÔ:Ø /‘ð	0ô ˜:×+Ñ+Ô,äØñ
ó
ö	÷?Sñ Sú÷0Wð Wús   Ã'KÉ'K%ËK"	Ë%K.	c                óð  — |r|D �cg c]  }|j                   ‘Œ c}ng }| D �ci c]  }|j                   |“Œ }}t        j                  j                  j                  d   j                  dd«      r)| D �ci c]  }d|j                   vsŒ|j                   |“Œ  }}|j                  j                  d¬«      d   j                  d   }|j                  j                  d¬«      D �ci c]  }|j                   |“Œ }	}d}
|D ]Ò  }|j                   |v sŒt        |«      sŒ|j                   |v r!t        j                  d	|j                   «       ŒMd
|j                  d<   |j                  d   j                  |j                  d<   d
|	|j                      j                  d<   |j                  d   j                  |	|j                      j                  d<   d
}
ŒÔ |
rt        |||	|«       y y c c}w c c}w c c}w c c}w )Nrh  Úexclude_primalsFÚprimalsrã   r%  r   rÜ   z*Skipping quantization of static input %s: Tr  r˜   r�  )rè   r›   rl  r   rm  r’   r©   r&  rÉ   rw  r@   Údebugr‘   ro  rÔ  )r2  r´  rÁ  rl   r*  rL   Ústatic_input_namesÚsaved_values_namesr8  rË  Úshould_perform_fp8_quants              rM   Úenable_activation_quantizationrÜ  Ä  s÷  € ñ 'ð  ;Ö;�tˆ�‹Ó;àð ð
 7CÖC¨d˜$Ÿ)™) T™/ÐCÐÐCÜ‡�×Ñ×6Ñ6Ø+ñç	�cÐ
˜UÓ#ð$ð )5ö
Ø $¸	ÈÏÉÒ8RˆD�I‰I�t‰Oð
Ðð 
ð $×)Ñ)×4Ñ4¸Ð4ÓAÀ!ÑD×IÑIÈ!ÑLÐà$.×$4Ñ$4×$?Ñ$?À=Ð$?Ó$QöØ ˆ�	‰	�4‰ðÐð ð  %ÐØ"ò 
,ˆØ�9‰9Ð*Ò*¬¸tÕ/DØ�y‰yÐ.Ñ.Ü—	‘	ÐFÈÏ	É	ÔRØØ26ˆD�I‰IÐ.Ñ/Ø(,¯	©	°%Ñ(8×(>Ñ(>ˆD�I‰I�nÑ%àJNÐ˜dŸi™iÑ(×-Ñ-Ð.FÑGØ@DÇ	Á	È%Ñ@P×@VÑ@VÐ˜dŸi™iÑ(×-Ñ-¨nÑ=Ø'+Ñ$ð
,ñ  Ü+Ø˜
Ð$5°õ	
ð  ùò9 	<ùò Dùò
ùòs   ‡G$£G)Á4G.ÂG.Ã#G3)rl   rû   Úomit_aot_autograd_runtimec               ó   — t        | |¬«      \  }}	}
}| j                  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                  j                  «       }|j                  d¬«      D ]á  }|j                  sCt        ||j                  «       t        ||j                  «       t        ||j                  «       ŒR|r_t!        d„ |j                  D «       «      rCt        ||j                  «       t        ||j                  «       t        ||j                  «       Œ³t        |«      sŒ¿t        ||j                  «       |rŒØt#        d«      ‚ t%        «       }g }g }|D ]C  }t'        |«      }|r#|j)                  |«       |j+                  |«       Œ3|j+                  |«       ŒE t-        | j                  «      }t/        j0                  |||«      D ]]  }d	|j2                  vrŒt5        |j2                  d	   «      |z
  }t7        |d
„ ¬«      D ]  }||vrŒ|j+                  ||   «       Œ ||z  }Œ_ |j9                  «        |j;                  ||z   «       |�sÎg }g }g }|D ]|  }t=        |j2                  j?                  d	«      t@        «      r|j+                  |«       Œ>|j2                  j?                  dd«      r|j+                  |«       Œl|j+                  |«       Œ~ |j9                  «        |j;                  ||z   «       tC        |«      }tE        |«      D ]D  \  } }| |k\  sŒ|j2                  j?                  dd«      rŒ)t#        d| › d|› dtC        |«      › �«      ‚ t        | j                  ||z   ||z   |z   |z   |z   |
tG        tC        |«      tC        |«      z   tC        |«      z   tC        |«      z   «      D � cg c]+  } | |k\  r| tC        |«      k  rtI        | «      n
tK        | «      ‘Œ- c} z   d|¬«      }!t        | j                  ||z   |z   |z   |z   |z   |z   |	|d|¬«      }n€t        | j                  ||z   ||z   |z   |
tG        tC        |«      tC        |«      z   «      D � cg c]  } tK        | «      ‘Œ c} z   d|¬«      }!t        | j                  ||z   |z   |z   |	|d|¬«      }|jL                  D ]   }|jN                  dv sŒd|j2                  d<   Œ" tP        jR                  jU                  | |!«      }"tP        jR                  jU                  | |«      }#tV        jX                  j?                  dd«      	 �t[        ||"|#||«       |"|#fS c c} w c c} w )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Ü   r%  NrÚ   )rû   c              3  óÄ   K  — | ]X  }|j                   t        j                  j                  j                  j
                  u xr t        |j                  «      d k(  –— ŒZ y­w©r   N)rš   r›   rœ   rÁ   Úwait_tensorrŸ   r¤   r¥   ro   s     rM   rr   z+_extract_fwd_bwd_modules.<locals>.<genexpr>/  sS   è ø€ ò )
ð ð �H‰HœŸ	™	×2Ñ2×>Ñ>×FÑFÐFò "Ü�A—G‘G“ Ñ!ó"ñ)
ùs   ‚AA z'backward_state_inputs must not be emptyr˜   c                ó   — | j                   S rI   r”  )Úss    rM   rt   z*_extract_fwd_bwd_modules.<locals>.<lambda>W  s
   € °1·6±6€ rO   ru   Úsaved_tensor_with_no_vc_checkFzi=z, no_vc_check_start_idx=z, len(saved_values)=rÛ   )rÅ   rá   TÚautograd_backwardrh  ).r/  r©   r&  Úfilterr6   r7   r5   r4   r  r  r›   ÚdistributedÚis_availabler¥   r4  rè   r¦   rƒ   r%   r   Úaddró   r   Ú	itertoolsÚchainr‘   r   rw   ÚclearÚextendr¢   r’   r   r¤   r…  r7  r0   r/   rª   rÌ   rÊ   Ú_lazy_graph_moduleÚ_make_graph_moduleÚinductor_configrm  rÜ  )$r)  r2  Úsaved_sym_nodesÚsaved_opaque_nodesr*  rl   rû   rÝ  r+  r,  r-  r.  ÚplaceholdersÚprimal_inputsÚtangent_inputsÚfwd_seed_offset_inputsÚbwd_seed_offset_inputsÚbackward_state_inputsÚ	bwd_graphÚdistributed_enabledrL   Ú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_objectsÚno_vc_check_start_idxr:  Ú	fwd_graphr´  rÁ  s$                                       rM   Ú_extract_fwd_bwd_modulesr  î  sˆ  € ô4 	! ¸ÔOñ C€K�Ð/Ð1Bð  ×%Ñ%×0Ñ0°MÐ0ÓB€LØ7”fœZ¨Ó6Ð7€Má'‰Ð-Q¬v´kÀ<Ó/PÐ-Qð ð JœvÔ&9¸<ÓHÐIÐØIœvÔ&9¸<ÓHÐIÐØGœfÔ%7¸ÓFÐGÐàÐ!ØÐä2Ø×ÑØØ
ñ	à
ñ	ð ñ	ð !ñ		!ð
 	ØØØ 7ô€Iô  ×+Ñ+×8Ñ8Ó:Ðà×$Ñ$¨Ð$Ó6ò Pˆà�zŠzÜ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÔ7ÜÐ.°·	±	Õ:ñ
 !¤Sñ )
ð —Z‘Zô)
ô &
ô
 ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÔ7ÜÐ.°·	±	Õ:Ü Õ%ä˜L¨$¯)©)Ô4Ú(Ü$Ð%NÓOÐOð-Pô8 /9«l€MØ ÐØ Ðð  ò 1ˆÜ*¨4Ó0ˆÙØ×Ñ˜fÔ%Ø#×*Ñ*¨4Õ0à#×*Ñ*¨4Õ0ð1ô 3°<×3EÑ3EÓF€OÜ—‘Ð 7¸À~ÓVò %ˆØ˜Ÿ	™	Ñ!ØÜ" 4§9¡9¨UÑ#3Ó4°}ÑDˆä˜Ñ)9Ô:ò 	?ˆAð ˜Ñ'ØØ#×*Ñ*¨?¸1Ñ+=Õ>ð	?ð 	˜Ñ$‰ð%ð" ×ÑÔØ×ÑÐ2Ð5LÑLÔMâ$ð &(Ð"Ø#%Ð Ø!ÐØ ò 	8ˆDä˜$Ÿ)™)Ÿ-™-¨Ó.Ô0@ÔAØ$×+Ñ+¨DÕ1Ø—‘—‘Ð>ÀÔFØ(×/Ñ/°Õ5à*×1Ñ1°$Õ7ð	8ð 	×ÑÔØ×ÑÐ6Ð9QÑQÔRÜ #Ð$>Ó ?Ðô ! Ó.ò 	‰GˆAˆtØÐ)Ó)Ø—y‘y—}‘}Ð%DÀeÕLÜ(Ø˜Q˜CÐ7Ð8MÐ7NÐNbÔcfÐgsÓctÐbuÐvóð ð	ô 7Ø×ÑØÐ2Ñ2ØØñà"ñ#ð !ñ!ð ñ	ð
 ô
 Ü˜Ó%ÜÐ.Ó/ñ0äÐ,Ó-ñ.ô ˜/Ó*ñ+óö	
ð ð Ð-Ò-°!´c¸,Ó6GÒ2Gô 4°AÔ6ä/°Ó2ñ3ò
ñð Ø$;ô+
ˆ	ô. 7Ø×ÑØØñà"ñ#ð !ñ!ð ñ	ð
 %ñ%ð $ñ$ð ØØØ$;ô
‰	ô  7Ø×ÑØÐ2Ñ2Ø˜,Ñ&¨Ñ8Øô œs <Ó0´3°Ó3GÑGÓHöàô +¨1Õ-òñð
 Ø$;ô
ˆ	ô 7Ø×ÑØØñà$ñ%ð $ñ$ð ØØØ$;ô

ˆ	ð —‘ò 2ˆØ�7‰7Ð3Ò3Ø-1ˆD�I‰IÐ)Ò*ð2ô ×&Ñ&×9Ñ9¸,È	ÓR€JÜ×&Ñ&×9Ñ9¸,È	ÓR€Jä×0Ñ0×4Ñ4Ø/°ó	
ð ð	ô
 	'ØØØØ'Øô	
ð �zÐ!Ð!ùòS
ùòFs   Ð90WÓ!W)Ústatic_lifetime_input_indicesrl   c          	     óÞ  ‡— g }d}| j                   j                  D ]&  }t        |«      st        |«      st	        |«      sŒ%|}Œ( |€t        d«      ‚| j                   j                  D ]$  }t        |«      s|j                  |«       ||u sŒ$ n t        d„ |D «       «      }t        | «      }	t        | «      }
|	rIt        | j                   «      d   �$t        j                  d«       t        | |||¬«      S t        | d¬«      } t         j"                  st%        | «       t'        | «       t)        | «       |€g }t+        | ||«      }g }g }g }t,        j.                  j1                  «       Šdd	„}dd
„}dˆfd„}| j                   j                  D �]  }|j2                  |vrŒ|j4                  dk(  r$|j2                  d„ | j7                  «       D «       v rŒF|j8                  t,        j:                  j<                  j>                  j@                  t,        j:                  j<                  jB                  j@                  t,        j:                  j<                  jB                  jD                  t,        j:                  jF                  jH                  j@                  t,        j:                  jF                  jJ                  j@                  t,        j:                  jF                  jL                  j@                  t,        j:                  jF                  jL                  jN                  fv r�Œ‘tQ        |«      r|j                  |«       �Œ¯ ||«      r�Œ¹|jR                  jU                  d«      tV        jX                  k(  r0t[        |«      r|j                  |«       n|j                  |«       �Œ ||«      rM|	rt        d|› d|j8                  › �«      ‚t[        |«      r|j                  |«       n|j                  |«       �Œjt[        |«      r|j                  |«       �Œˆ ||«      s|j4                  dk(  rt        d|› d�«      ‚|j\                  D �cg c]  }|j2                  |vsŒ|‘Œ }}t_        d„ |D «       «      r|ja                  |«       �Œûtc        |«      r�Œ|j                  |«       �Œ te        tf        ji                  |«      jk                  «       «      }te        tf        ji                  |«      jk                  «       «      }|D �cg c]  }tm        |«      rŒ|‘Œ }}te        tf        ji                  |«      jk                  «       «      }t         jn                  rto        | j                   |«      }|€|jp                  }ts        | |||||¬«      \  }}|j                   ju                  tv        ¬«       |j                   ju                  tv        ¬«       |	r'|
rty        | ||t{        |«      «      \  }}t}        |«      }t         j~                  rddl@m?}  |||||«       tƒ        |«      }tƒ        |«      }t…        |d¬«      }t{        |j†                  «      dkD  rt…        |d¬«      }||fS c c}w c c}w )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  óT   K  — | ]   }|j                   d k7  sŒ|j                  –— Œ" y­w©rã   N©rÌ   rè   r$  s     rM   rr   z$default_partition.<locals>.<genexpr>  s$   è ø€ ò $Ø¨t¯w©w¸(Ó/Bˆ�	�	ñ$ùó   ‚(—(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_partitionc                óœ   — d| j                   v xs= t        | j                   j                  d«      t        j                  j
                  «      S )Nr=  r˜   )r‘   r¢   r’   r›   Ú_subclassesÚ
FakeTensorr•   s    rM   Ú	is_tensorz$default_partition.<locals>.is_tensor4  s=   € Ø §	¡	Ð)ò 
¬ZØ�I‰I�M‰M˜%Ó ¤%×"3Ñ"3×">Ñ">ó.
ð 	
rO   c                ón   — t        d„ | j                  D «       «      xr t        | j                  «      dkD  S )Nc              3  óV   K  — | ]!  }|j                   t        j                  k(  –— Œ# y ­wrI   )rš   rÇ   rÈ   r    s     rM   rr   z=default_partition.<locals>.is_multi_output.<locals>.<genexpr>;  s   è ø€ ÒG°D�—‘œx×/Ñ/Õ/ÑGùs   ‚')r   )r¦   r¥   r¤   r•   s    rM   Úis_multi_outputz*default_partition.<locals>.is_multi_output9  s.   € äÑG¸D¿J¹JÔGÓGò $Ü�D—J‘J“ !Ñ#ð	
rO   c                óÊ   •— | j                  d¬«      xrO | j                  dvxr? ‰ xs: | j                  t        j                  j
                  j                  j                  uS )NF)Úimpure_random)rÜ   rã   )Ú	is_impurerÌ   rš   r›   rœ   rÁ   râ  rŸ   )rL   rû  s    €rM   r  z$default_partition.<locals>.is_impure?  sc   ø€ ð �N‰N¨ˆNÓ/ò 	Ø—‘ððò	ð (Ð'ò UØ—;‘;¤e§i¡i×&@Ñ&@×&LÑ&L×&TÑ&TÐTð	
rO   rá   c              3  ó&   K  — | ]	  \  }}|–— Œ y ­wrI   r`   )rp   Úkr  s      rM   rr   z$default_partition.<locals>.<genexpr>T  s   è ø€ ò 3
Ù�!�QŒAñ3
ùs   ‚r�   z.Trying to apply AC on a graph with impure op: z, rÅ   z	Expected z to be a tensorc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrI   )r   ro   s     rM   rr   z$default_partition.<locals>.<genexpr>ƒ  s   è ø€ Ò7 !Œ{˜1�~Ñ7ùó   ‚©rò  ró  r*  rl   )Úis_impure_noder'   ©Úenable_activation_offloadingF©r  rX   )Dr©   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œ  r§   Ú_sync_decision_cross_ranksrl   r  rõ   rÃ   Úfunctionalize_rng_opsr¤   Ú#reordering_to_mimic_autograd_enginer!  Ú,_activation_offloading.activation_offloadingr=   Úthread_graphsafe_rng_from_hopsrg   )r)  Ú_joint_inputsr*  r  rl   Úforward_nodesÚ	last_noderL   Úforward_node_namesÚgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsÚ	node_infor2  rò  ró  r  r  r  rq   Úbackward_usagesÚ	fw_moduleÚ	bw_moduler!  rû  s                          @rM   Údefault_partitionrE  à  sµ  ø€ ð@ €MØ€IØ×"Ñ"×(Ñ(ò ˆÜ˜tÔ$¬
°4Ô(8Ô<OÐPTÕ<UØ‰Iðð ÐÜÐ9Ó:Ð:Ø×"Ñ"×(Ñ(ò ˆÜ˜4Ô Ø× Ñ  Ô&Ø�9ÒÙð	ô
 $ñ $Ø+ô$ó Ðô "6°lÓ!CÐÜ%=¸lÓ%KÐ"Ù!Ü × 2Ñ 2Ó3°AÑ6ÐBô �M‰MðLôô 7ØØØ /Ø.Kô	ð ô .¨lÐQUÔVˆä×:Ò:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ð,Ø(*Ð%ÜØÐ3°_ó€Ið €LØ€OØÐä×+Ñ+×8Ñ8Ó:Ðó
ó

õ
ð$ ×"Ñ"×(Ñ(ó >&ˆØ�9‰9Ð.Ñ.ØØ�7‰7�jÒ  T§Y¡Yñ 3
Ø&×4Ñ4Ó6ô3
ñ &
ð Ø�;‰;Ü�I‰I�N‰N×)Ñ)×1Ñ1Ü�I‰I�N‰N×(Ñ(×0Ñ0Ü�I‰I�N‰N×(Ñ(×,Ñ,ô �I‰I×Ñ×9Ñ9×AÑAÜ�I‰I×Ñ×5Ñ5×=Ñ=Ü�I‰I×Ñ×4Ñ4×<Ñ<Ü�I‰I×Ñ×4Ñ4×DÑDð
ñ 
ñ Ü�tÔð ×"Ñ" 4Ô(ÙÙ˜4Ô áØ�9‰9�=‰=˜Ó%Ô)9×)CÑ)CÒCÜ˜dÔ#Ø"×)Ñ)¨$Õ/à×#Ñ# DÔ)ÙÙ�TŒ?Ù)Ü$ØDÀTÀFÈ"ÈTÏ[É[ÈMÐZóð ô ˜dÔ#Ø"×)Ñ)¨$Õ/à×#Ñ# DÔ)ÙÜ˜$ÔØ×%Ñ% dÔ+ÙÙ˜Œ 4§7¡7¨oÒ#=Ü  9¨T¨F°/Ð!BÓCÐCØ&*§j¡jÖU °A·F±FÐBTÒ4Tš1ÐUˆÐUÜÑ7 Ô7Ô7ð ×"Ñ" ?Ô3ÙÜ˜dÖ#Ø×Ñ Ö%ð}>&ô@ œŸ™ lÓ3×8Ñ8Ó:Ó;€LÜœ4Ÿ=™=¨Ó9×>Ñ>Ó@ÓA€Oð
 )öØÔ0GÈÕ0MŠð€Oð ô œdŸm™mÐ,>Ó?×DÑDÓFÓGÐä×(Ò(Ü1°,×2DÑ2DÀlÓSˆà"Ð*Ø&/×&KÑ&KÐ#Ü3ØØØ'Ø-Ø'Ø$?ôÑ€Iˆyð ‡O�O×'Ñ'Ô7HÐ'ÔIØ‡O�O×'Ñ'Ô7HÐ'ÔIá!Ù)Ü#8Ø˜i¨´C¸Ó4Hó$Ñ ˆI�yô 8¸	ÓBˆ	ô ×*Ò*õ	
ñ 	%ØØØØ'ô		
ô ˜yÓ)€IÜ˜yÓ)€Iä.¨yÀeÔL€IÜ
ˆ9×&Ñ&Ó'¨!Ò+Ü2°9È$ÔOˆ	à�iÐÐùòQ Vùò(s   ÑY%ÑY%ÔY*ÔY*g    €„.Ac                ó    — | |j                   z  S rI   )Úitemsize)rb  ro  s     rM   Ú_tensor_nbytesrH  Ð  s   € Ø�5—>‘>Ñ!Ð!rO   c                ó$  ‡— dd„Šd| j                   v �r| j                   d   }t        |t        «      ryt        |t        t        f«      rt        ˆfd„|D «       «      S t        |t        «      r"t        ˆfd„|j                  «       D «       «      S t        |t        j                  «      r ‰|«      S t        |t        j                  t        f«      r,t        j                  ryt        dt        |«      › d| › d	�«      ‚t        d
t        |«      › d| › �«      ‚| j                   dk(  sZt        | j"                  t        j$                  j&                  «      r-t)        | j"                  j*                  j,                  «      dk(  ryt        d| › d�«      ‚)Nc                ó–   — t        | t        j                  «      syt        t	        | j                  «       d¬«      | j                  «      S )Nr   é   ©Úfallback)r¢   r›   rJ  rH  r    rb  ro  ©rß   s    rM   Úobject_nbytesz_size_of.<locals>.object_nbytesÕ  s2   € Ü˜!œUŸ\™\Ô*ØÜÔ/°·±³	ÀDÔIÈ1Ï7É7ÓSÐSrO   r˜   r'   c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrI   r`   ©rp   rq   rO  s     €rM   rr   z_size_of.<locals>.<genexpr>â  s   øè ø€ Ò5¨A‘} Q×'Ñ5ùó   ƒc              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrI   r`   rQ  s     €rM   rr   z_size_of.<locals>.<genexpr>ä  s   øè ø€ Ò>¨A‘} Q×'Ñ>ùrR  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ß   ÚobjectrZ   r…   )r‘   r¢   r   r›  rô   Úsumr„  Úvaluesr›   rJ  ÚScriptObjectr   r   Ú(unsafe_treat_script_objects_as_zero_sizerñ   r¸   rÌ   rš   r  r  r¤   r  Úreturns)rL   r˜   rO  s     @rM   Ú_size_ofrZ  Ô  sY  ø€ óTð
 �—	‘	ÒØ�i‰i˜ÑˆÜ�cœ<Ô(Øô ˜œd¤E˜]Ô+ÜÓ5°Ô5Ó5Ð5Ü˜œTÔ"ÜÓ>°·±³Ô>Ó>Ð>Ü˜œUŸ\™\Ô*Ù  Ó%Ð%Ü˜œe×0Ñ0Ô2BÐCÔDô ×>Ò>ØÜØ-¬d°3«i¨[¸	À$Àð HJð Jóð ô Ð3´D¸³I°;¸iÈÀvÐNÓOÐOØ‡w�w�*ÒÜ�4—;‘;¤§
¡
× 5Ñ 5Ô6Ü�—‘×#Ñ#×+Ñ+Ó,°Ò1àÜ
Ø
�ˆvÐdÐeóð rO   c           	     ó2  — ddl m}  |t        «      }| j                  D ]3  }|j                  dk(  sŒ||j
                  j                  xx   dz  cc<   Œ5 t        j                  dt        |j                  «       t        j                  d«      d¬«      «       y )Nr   )r   rÅ   r'   ú%sT©rv   Úreverse)Úcollectionsr   r…   rª   rÌ   rš   r[   r@   r|  rw   ÚitemsrÇ   Ú
itemgetter)r©   r   ÚcntrL   s       rM   Ú
_count_opsrc    sr   € Ý'á%¤cÓ*€CØ—‘ò +ˆØ�7‰7�oÓ%Ø�—‘×$Ñ$Ó%¨Ñ*Ô%ð+ô ‡H�HˆT”6˜#Ÿ)™)›+¬8×+>Ñ+>¸qÓ+AÈ4ÔPÕQrO   c                 óˆ  — g } t        t        j                  j                  «      D ]™  }t	        t        j                  j                  |«      }t        |t        j                  j                  «      sŒL|j                  «       D ];  }t        j                  j                  |j                  v sŒ*| j                  |«        Œ™ Œ› | S rI   )Údirr›   rœ   r�   rÂ   r¢   r  ÚOpOverloadPacketÚop_overloadsr±   Ú	pointwiser¯   ró   )rœ   Ú	attr_nameÚopoverloadpacketÚop_overloads       rM   Úpointwise_opsrl    s—   € à-/€CÜœŸ™Ÿ™Ó(ò 	ˆ	Ü"¤5§9¡9§>¡>°9Ó=ÐÜÐ*¬E¯J©J×,GÑ,GÔHØà+×8Ñ8Ó:ò 	ˆKÜ�y‰y×"Ñ" k×&6Ñ&6Ò6à—
‘
Ð+Ô,Ùñ		ð	ð €JrO   c                óî   — | D �ci c]7  }t        |t        j                  j                  j                  «      sŒ2|||   “Œ9 }}t        |j                  «       t        j                  d«      d¬«      S c c}w )Nr'   Tr]  )	r¢   r›   rÊ   rL   rË   rw   r`  rÇ   ra  )rÉ   Ú	depth_mapÚargÚ
arg_depthss       rM   Úsort_depthsrq    sh   € ð (,öØ #¬z¸#¼u¿x¹x¿}¹}×?QÑ?QÕ/RˆˆY�s‰^Ñð€Jð ô �*×"Ñ"Ó$¬(×*=Ñ*=¸aÓ*@È$ÔOÐOùòs
   …3A2¹A2c                ó   ‡
‡‡— t        j                  «       Ši Š
| j                  j                  d¬«      D ]  }‰j	                  |ˆ
fd„«      ‰
|<   Œ t        | j                  j                  «      D ��ci c]  \  }}||“Œ
 c}}Šdˆ
ˆˆfd„}t        t        t        | j                  j                  «      «      }d}t        j                  }|D ]#  }|j                  D ]  }‰|   |k  sŒ‰|   }|}Œ Œ% |€| S t        | j                  j                  «      d‰|    D ]U  }|j                  dk(  sŒ|j                  t        j                   j"                  j$                  j&                  u sŒN ||«       ŒW t        | j                  j                  «      ‰|   d D ]
  } ||«       Œ t        j                   j)                  | ‰«      }	|	S c c}}w )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Ü   r%  c                ó   •— ‰|    S rI   r`   rÞ   s    €rM   rt   z5reordering_to_mimic_autograd_engine.<locals>.<lambda>A  s   ø€ ¸¸A¹€ rO   c                ó*  •— | g}t        «       }t        |«      dkD  rH|j                  «       } | |v s| ‰v rŒ'|j                  | «       || j                  z  }t        |«      dkD  rŒHt        |ˆfd„¬«      }|D ]  } ‰j                  | ˆfd„«      ‰| <   Œ y )Nr   c                ó   •— ‰|    S rI   r`   )rq   Úorders    €rM   rt   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>S  s   ø€ À%ÈÁ(€ rO   ru   c                ó   •— ‰|    S rI   r`   rÞ   s    €rM   rt   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>U  rà   rO   )r%   r¤   r™  rê  Úall_input_nodesrw   rï   )rL   Ú	cur_nodesÚinsertable_nodesr×   rü   rv  s      €€€rM   Úinsert_node_in_graphzAreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graphE  s¢   ø€ Ø�Fˆ	Ü0:³ÐÜ�)‹n˜qÒ Ø—=‘=“?ˆDØÐ'Ñ'¨4°3©;ØØ× Ñ  Ô&ð ˜×-Ñ-Ñ-ˆIô �)‹n˜qÓ ô "Ð"2Ó8JÔKÐØ$ò 	DˆDØ!×+Ñ+¨DÓ2BÓCˆC�ŠIñ	DrO   NrÅ   ©rL   rY   rZ   ÚNone)rÊ   rç   r©   r&  rï   r…  rª   r›  rç  r7   ÚmathÚinfr¥   rÌ   rš   r›   rœ   r�   rò   rŸ   ÚGraphModule)ÚgmrL   r9  r{  rö  Úfirst_node_in_bwdÚminimum_orderÚtangentr¡   Únew_gmr×   rü   rv  s             @@@rM   r8  r8  %  s©  ú€ ô. —‘“
€IØ"$€Cð —‘×#Ñ# }Ð#Ó5ò @ˆØ×'Ñ'¨Ó.>Ó?ˆˆDŠ	ð@ô )2°"·(±(·.±.Ó(A×B™9˜3 ˆT�3‰YÓB€E÷Dô& œ&¤¨b¯h©h¯n©nÓ=Ó>€NØÐÜ—H‘H€MØ!ò )ˆØ—M‘Mò 	)ˆDØ�T‰{˜]Ó*Ø % d¡�Ø$(Ñ!ñ	)ð)ð Ð Øˆ	ô �R—X‘X—^‘^Ó$Ð%? uÐ->Ñ'?Ð@ò 'ˆØ�7‰7�oÓ%¨$¯+©+¼¿¹¿¹×9MÑ9M×9UÑ9UÒ*UÙ  Õ&ð'ô �R—X‘X—^‘^Ó$ UÐ+<Ñ%=Ð%?Ð@ò #ˆÙ˜TÕ"ð#ô �X‰X×!Ñ! " iÓ0€FØ€Mùó[ Cs   Á5G
c                óæ  — |j                   }|€t        d«      ‚| j                  }	|j                  }
t        j                  j
                  j                  }| j                  j                  |«      5  | j                  j                  d|› �«      }t        |«      j                  «       |j                  d<   |}ddd«       |j                  j                  |«      5  |j                  j                  d|› �«      }t        |«      j                  «       |j                  d<   |}ddd«       t        |j                  «      }|d<   | j                  j                  |«      5  |	j                  d||j                  g|j                   ¢­|¬«      }ddd«       |j#                  «       |	j%                  |«       t        |j                  «      }|d<   |
j'                  |«      5  |
j                  d||j                  g|j                   ¢­|¬«      }|j#                  |«       |
j%                  |«       ddd«       ||fS # 1 sw Y   �ŒˆxY w# 1 sw Y   �Œ+xY w# 1 sw Y   ŒÌxY w# 1 sw Y   ||fS xY w)	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_staterA  rÜ   r8   Úclone_stater‘   r„  rÆ   Úcreate_noderš   rÉ   rÈ  rÉ  Úinserting_before)rC  rD  Úfw_nodeÚbw_nodeÚdeviceÚ	rng_countÚlast_fwd_inputÚlast_bwd_inputÚ
device_idxÚfw_graphÚbw_graphrŽ  Úfwd_rng_stateÚbwd_rng_stateÚ	fw_kwargsÚfunctional_fw_nodeÚ
bwd_kwargsÚ
rng_outputs                     rM   Ú%apply_graphsafe_rng_functionalizationr¡  s  sJ  € ðR —‘€JØÐÜÐ:Ó;Ð;Ø�‰€HØ�‰€HÜ#(§<¡<×#9Ñ#9×#VÑ#VÐ ð 
�‰×	(Ñ	(¨Ó	8ñ 'Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆÜ$9¸&Ó$A×$MÑ$MÓ$Oˆ×Ñ˜5Ñ!Ø&ˆ÷'ð 
�‰×	(Ñ	(¨Ó	8ñ 'Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆä$9¸&Ó$A×$MÑ$MÓ$Oˆ×Ñ˜5Ñ!Ø&ˆ÷	'ô �W—^‘^Ó$€IØ*€IˆkÑØ	�‰×	(Ñ	(¨Ó	1ñ 
Ø%×1Ñ1ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 2ó 
Ð÷
ð ×!Ñ!Ð"4Ô5Ø×Ñ˜Ô ô �g—n‘nÓ%€JØ+€Jˆ{ÑØ	×	"Ñ	" 7Ó	+ñ %Ø×)Ñ)ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 *ó 
ˆ
ð 	×%Ñ% jÔ1Ø×Ñ˜GÔ$÷%ð ˜>Ð)Ð)÷M'ñ 'ú÷'ñ 'ú÷
ð 
ú÷%ð ˜>Ð)Ð)ús3   Á1AH>ÃAIÅ.IÇ"AI$È>IÉIÉI!É$I0c                ó^  ‡'— t        j                  «       }dd„}dd„Š'dd„} || «      } ||«      } ||«      }	i }
| j                  j                  D ]¨  }t	        |«      sŒt        |j                  d«      sŒ&t        j                  j                  |j                  j                  v sŒW|j                  |vs|j                  |	vrŒt||j                     }||j                     }|	|j                     }||dœ|
|<   Œª t        j                  j                  j                  }t        j                  j                  j                  }d }|j                  j!                  d¬«      D ]  }d|j                  v sŒ|} n |€t#        d	«      ‚g }t%        t'        |j                  j!                  d¬«      «      «      }t%        t'        |j                  j!                  d¬«      «      «      }t)        ˆ'fd
„|
j+                  «       D «       «      }|j-                  t        j.                  d«      «       t1        |«      dkD  }t        j2                  j4                  }t4        j6                  xr* | xr% |j8                   xs |j:                  j<                  }t?        |
j+                  «       «      D �]  \  }}|d   }|d   } ‰'|«      }|j                  }|j                  }|r#|�!tA        |«      rtC        ||||||||«      \  }}ŒV|jE                  |«      5  |jG                  d||j                  g|jH                  ¢­|jJ                  ¬«      }|jG                  dtL        jN                  |dfi ¬«      } ||«      |jP                  d<   |jG                  dtL        jN                  |dfi ¬«      } tS        jR                  |jP                  «      | _(        |jU                  | «       |jW                  |«       |jY                  |«       d d d «       |jE                  |«      5  dt%        |«      › �}!|j[                  |!«      }" ||«      |"jP                  d<   d d d «       |jE                  |«      5  |jG                  d|"|j                  g|jH                  ¢­|jJ                  ¬«      } |jU                  | «       |jW                  |«       d d d «       �Œ! |r˜t%        t]        |j                  j!                  d¬«      «      «      }#|#jH                  d   }$t1        |$«      |z
  }%|$d |% t_        |«      z   |$|%d  z   }&|j                  ja                  |&«       |j                  jW                  |#«       |jc                  «        |jc                  «        ||fS # 1 sw Y   �Œ�xY w# 1 sw Y   �ŒLxY w# 1 sw Y   �ŒxY w)Nc                ó  — i }| j                   j                  D ]i  }|j                  dk(  sŒt        |j                  d«      sŒ*t
        j                  j                  |j                  j                  v sŒ[|||j                  <   Œk |S )NrÅ   r¯   )
r©   rª   rÌ   r°   rš   r›   r±   r²   r¯   rè   )ÚgmodÚrandom_nodesrL   s      rM   Úget_rng_opsz*functionalize_rng_ops.<locals>.get_rng_opsì  sl   € Ø+-ˆØ—J‘J×$Ñ$ò 	/ˆDà—‘˜?Ó*Ü˜DŸK™K¨Õ0Ü—I‘I×5Ñ5¸¿¹×9IÑ9IÒIà*.�˜TŸY™YÒ'ð	/ð ÐrO   c                ó  — d| j                   vry| j                   d   }t        |t        «      s|f}|D ]@  }t        |t        j                  «      sŒt        |j                  «      sŒ4|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›   rJ  r:   r”  )rL   Ú
candidatesÚ	candidates      rM   Ú
get_devicez)functionalize_rng_ops.<locals>.get_device÷  sz   € ð ˜Ÿ	™	Ñ!Øà—Y‘Y˜uÑ%ˆ
Ü˜*¤eÔ,Ø$˜ˆJà#ò 	,ˆIÜ˜)¤U§\¡\Õ2Ü)¨)×*:Ñ*:Õ;Ø$×+Ñ+Ò+ð	,ô
 �|‰|˜EÓ"Ð"rO   c                ó  — ddl m}  |«       }|€t        d«      ‚|5  | �.t        | «      r#|j	                  t        | «      «      cd d d «       S |j	                  t        j                  «       «      cd d d «       S # 1 sw Y   y xY w)Nr   )Údetect_fake_modezfake_mode must not be None)Útorch._guardsr­  rƒ   r:   Úfrom_tensorr9   r›   Úget_rng_state)r”  r­  Ú	fake_modes      rM   Úget_sample_rng_statez3functionalize_rng_ops.<locals>.get_sample_rng_state	  s‚   € Ý2á$Ó&ˆ	ØÐÜ Ð!=Ó>Ð>Øñ 	@ØÐ!Ô&<¸VÔ&DØ ×,Ñ,Ô-AÀ&Ó-IÓJ÷	@ñ 	@ð ×(Ñ(¬×)<Ñ)<Ó)>Ó?÷	@÷ 	@ò 	@ús   �'A:Á"A:Á:Br¯   )ÚfwdÚbwdrÜ   r%  r„  zaCouldn't find tangent node in graph inputs. This is unexpected, please file a bug if you see thisc              3  ó4   •K  — | ]  } ‰|d    «      –— Œ y­w)r³  Nr`   )rp   Ú	node_pairr«  s     €rM   rr   z(functionalize_rng_ops.<locals>.<genexpr>;  s    øè ø€ ò Ø)2‰
�9˜UÑ#×$ñùs   ƒr¨  r'   r³  r´  rÅ   rŠ  r   r˜   Úrng_state_output_rã   )r¤  úfx.GraphModulerZ   údict[str, fx.Node])rL   rY   rZ   útorch.device | None)r”  rº  rZ   útorch.Tensor)2rë  Úcountr©   rª   r–   r°   rš   r›   r±   r²   r¯   rè   rŒ  r�  Úrun_and_save_rng_stateÚrun_with_rng_stater&  rñ   r'  rÊ  r%   rV  Údiscardr”  r¤   rl  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Ü   r(  rô   rã   Ú	recompile)(r)  rC  rD  Únum_sym_nodesÚuidr¦  r²  Újoint_graph_rng_opsÚfw_graph_rng_opsÚbw_graph_rng_opsÚrecomputable_rng_ops_maprL   Ú	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(                                          @rM   r7  r7  Ñ  s°  ø€ ô2 �/‰/Ó
€Có	ó#ó$	@ñ & lÓ3ÐÙ" 9Ó-ÐÙ" 9Ó-ÐØ!ÐØ×"Ñ"×(Ñ(ò Sˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEð
 �y‰yÐ 0Ñ0°D·I±IÐEUÑ4UØØ+¨D¯I©IÑ6ˆIØ& t§y¡yÑ1ˆGØ& t§y¡yÑ1ˆGØ:AÈ'Ñ2RÐ$ YÒ/ðSô  —|‘|×-Ñ-×DÑDÐÜŸ™×/Ñ/×BÑBÐà ÐØ—‘×*Ñ*¨mÐ*Ó<ò ˆØ˜Ÿ	™	Ò!Ø$(Ð!Ùðð Ð$ÜØoó
ð 	
ð +-Ðäœ( 9§?¡?×#=Ñ#=ÀÐ#=Ó#OÓPÓQ€NÜœ( 9§?¡?×#=Ñ#=ÀÐ#=Ó#OÓPÓQ€Näó Ø6N×6UÑ6UÓ6Wôó €Gð ‡O�O”E—L‘L Ó'Ô(ô " '›l¨QÑ.Ðô —‘×'Ñ'€Jä×.Ñ.ò 	
Ø'Ð'ò	
ð ×*Ñ*Ð*ò RØ×&Ñ&×QÑQð ,ô !*Ð*B×*IÑ*IÓ*KÓ Ló P-Ñˆ	�9à˜EÑ"ˆØ˜EÑ"ˆÙ˜GÓ$ˆà—?‘?ˆØ—?‘?ˆñ 4ØÐ"Ü& vÔ.ä-RØØØØØØØØó	.Ñ*ˆN™Nð ×*Ñ*¨7Ó3ñ !3Ø%-×%9Ñ%9Ø#Ø$ð  Ÿ™ðà Ÿ™ñð #Ÿ>™>ð &:ó 	&Ð"ð !×,Ñ,Ø#Ü×$Ñ$Ø,¨aÐ0Øð	 -ó �ñ %9¸Ó$@�—
‘
˜5Ñ!à%×1Ñ1Ø#Ü×$Ñ$à*Øðð ð 2ó �
ô #'§)¡)¨G¯L©LÓ"9�
”à×-Ñ-¨jÔ9Ø×#Ñ# GÔ,Ø$×+Ñ+¨EÔ2÷C!3ðH ×*Ñ*Ð+@ÓAñ MØ0´°c³°Ð<�
Ø$,×$8Ñ$8¸Ó$DÐ!Ù0DÀVÓ0LÐ!×&Ñ& uÑ-÷Mð
 ×*Ñ*¨7Ó3ñ -Ø%×1Ñ1Ø#Ø&ð *ØŸ™ðð !Ÿ™ñð
 #Ÿ>™>ð 2ó 
�
ð ×-Ñ-¨jÔ9Ø×#Ñ# GÔ,÷-ñ -ðEP-ñj Üœd 9§?¡?×#=Ñ#=ÀÐ#=Ó#JÓKÓLˆØ#×(Ñ(¨Ñ+ˆ
Ü  ›_¨}Ñ<ÐàÐ*Ð*Ð+ÜÐ(Ó)ñ*àÐ+Ð,Ð-ñ.ð 	ð
 	�‰×Ñ˜wÔ'Ø�‰×"Ñ" >Ô2Ø×ÑÔØ×ÑÔØ�iÐÐ÷S!3ñ !3ú÷HMñ Mú÷
-ñ -ús&   ÌC.VÐ5VÑ$AV"ÖV	ÖV	Ö"V,	c                ó  — | j                   j                  D ]t  }t        |j                  t        j
                  j                  «      sŒ2|j                  j                  dk(  sŒLt        |«      rŒXt        j                  |j                  d<   Œv y)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&   r4  r‘   )r)  rL   s     rM   r(  r(  µ  sh   € ð ×"Ñ"×(Ñ(ò @ˆä�t—{‘{¤E§J¡J×$9Ñ$9Õ:Ø—‘×%Ñ%Ð);Ó;Ü" 4Õ(ä%5×%?Ñ%?ˆD�I‰I�kÒ"ñ@rO   c                ó    ‡— dˆfd„Š| j                   j                  D ].  }t        |«      sŒt        |«      rŒt	        |«      rŒ' ‰|«       Œ0 y)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.
    c                ó  •— | j                   D ]t  }|j                  t        j                  u sŒ  ‰|«       t	        |j
                  j                  d«      t        t        f«      rŒXt        j                  |j
                  d<   Œv y )Nr˜   r�   )r¥   rš   rÇ   rÈ   r¢   r‘   r’   rô   r›  r&   r4  )rL   r¡   Úmark_getitem_outputss     €rM   rÝ  z6force_save_effectful_ops.<locals>.mark_getitem_outputsÒ  sa   ø€ Ø—J‘Jò 	HˆDØ�{‰{œh×.Ñ.Ò.Ù$ TÔ*Ü! $§)¡)§-¡-°Ó"6¼Ä¸ÕFÜ-=×-GÑ-G�D—I‘I˜kÒ*ñ		HrO   Nr|  )r©   rª   r   r–   r  )r)  rL   rÝ  s     @rM   r)  r)  Ä  sF   ø€ õHð ×"Ñ"×(Ñ(ò 'ˆä˜DÕ!Ü" 4Õ(Ü(¨Õ.á  Õ&ñ'rO   c                óÞ  — t        «       }t        | j                  j                  «      D ]Á  }|j                  dk(  rŒ|j
                  t        j                  j                  j                  j                  u }|rrt        |«      r|j                  |j                  d   «       t        |«      sŒ„|j                  d   |v sŒ–t        j                   |j                  d   j"                  d<   ŒÁ y  y )Nrã   r   r'   r�   )r%   rÊ  r©   rª   rÌ   rš   r›   rœ   r�   rò   rŸ   r  rê  rÉ   r  r&   r4  r‘   )r)  Úhas_mutation_in_bwrL   Úis_copy_s       rM   r*  r*  â  s¹   € ô 5?³LÐÜ˜×+Ñ+×1Ñ1Ó2ò ˆØ�7‰7�hÒØà—;‘;¤%§)¡)§.¡.×"6Ñ"6×">Ñ">Ð>ˆÙÜ+¨DÔ1Ø"×&Ñ& t§y¡y°¡|Ô4ä*¨4Õ0°T·Y±Y¸q±\ÐEWÒ5WÜ1A×1KÑ1K�—	‘	˜!‘×!Ñ! +Ò.ñ ñ!rO   c                óþ   — | j                   t        j                  k7  ry| j                  d   }t	        |«      t
        j                  urt        dt	        |«      › �«      ‚d|j                  vxr | j                  dk(  S )NFr   z#expected parent to be fx.Node, got r=  rÅ   )
rš   rÇ   rÈ   rÉ   r¸   rÊ   rË   rƒ   r‘   rÌ   )rL   Úparents     rM   Úis_getitem_of_multi_outputrã  ù  sh   € Ø‡{�{”h×&Ñ&Ò&ØØ�Y‰Y�q‰\€FÜˆFƒ|œ2Ÿ7™7Ñ"ÜÐBÄ4ÈÃ<À.ÐQÓRÐRØ §¡Ð+ÒJ°·±¸?Ñ0JÐJrO   c               óâ  — | j                   j                  D �]T  }t        |«      rÐ|j                  D ]i  }t        |«      sŒd|j                  v sŒd|j                  v sŒ-|j                  d   |j                  d   kD  sŒMt
        j                  |j                  d<   Œk |j                  j                  dd«      sŒ¤t        d„ |j                  D «       «      rŒÁt
        j                  |j                  d<   Œßd|j                  vsŒît        d„ |j                  D «       «      s�Œt        |«      rd|j                  d   j                  v r�Œ4|s�Œ8t
        j                  |j                  d<   �ŒW | 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  ó2   K  — | ]  }t        |«      –— Œ y ­wrI   ©r–   r    s     rM   rr   z)cleanup_recompute_tags.<locals>.<genexpr>  s   è ø€ ò EØ)-”˜t×$ñEùr  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrI   rè  r    s     rM   rr   z)cleanup_recompute_tags.<locals>.<genexpr>+  s   è ø€ Ò@¨T”N 4×(Ñ@ùr  r   )r©   rª   r–   r¥   r‘   r&   r4  r’   rî   rã  rÉ   )r)  r  rL   r¡   s       rM   r&  r&    s3  € ð ×"Ñ"×(Ñ(ó +@ˆÜ˜$ÔØŸ
™
ò H�ä" 4Õ(Ø%¨¯©Ò2Ø%¨¯©Ò2ØŸ	™	 -Ñ0°4·9±9¸]Ñ3KÓKä-=×-GÑ-G�D—I‘I˜kÒ*ðHð �y‰y�}‰}Ð0°%Õ8Äñ EØ15·±ôEõ Bô& *:×)CÑ)C�—	‘	˜+Ò&à §¡Ò*ÜÑ@°T·Z±ZÔ@Ö@ô +¨4Ô0°]ÀdÇiÁiÐPQÁl×FWÑFWÓ5Wã$ô &6×%?Ñ%?ˆD�I‰I�kÓ"ðW+@ðX ÐrO   c                óÌ  ‡‡‡‡=‡>‡?‡@‡A‡B‡C‡D‡E‡F‡G‡H‡I‡J‡K‡L— ‰€
t        «       Št        «       ŠJt        rQt        d„ | j                  D «       «      }|t        d„ ‰Jj                  D «       «      z
  }t
        j                  d|«       dNd„Š>dNd„Š?dNˆ>ˆ?ˆJfd„ŠB	 dd lŠHdOˆBˆˆJfd	„ŠDdPˆDˆˆJfd
„}dOˆBfd„ŠC	 	 	 	 	 	 dQˆCˆJfd„} ‰Hj                  «       ŠIt        «       Š=dRdSˆ=ˆˆIˆJfd„}	| j                  D �]Ë  }
|
j                  dk(  rŒ|
‰j                  v rp|
‰j                  vr1‰Ij                  |
j                  dz   dt         j"                  d¬«       n1‰Ij                  |
j                  dz   dt         j"                  d¬«       Œ’t%        |
«      r1‰Ij                  |
j                  dz   dt         j"                  d¬«       ŒÎt'        |
«      r
 |	|
d«       nt)        |
«      r	 |	|
d«        ||
«      }‰j+                  |
«      r|r	 |	|
|«       d|
j,                  vxr d|
j,                  vxs8 d|
j,                  v xr( t/        |
j,                  d   t0        j2                  «       }t5        |
«      rt7        t9        |
«      «      }d }nj|rRt/        |
j,                  j;                  d«      t<        t>        f«      stA        |
«      rd}d }n)t         j"                  }d}n ||
‰jB                  «      \  }}|rO|t         j"                  k(  s	|tD        k(  r3‰Ij                  |
j                  dz   |
j                  dz   |d|› �¬«       n.‰Ij                  |
j                  dz   |
j                  dz   |¬«       |
jF                  D ]?  }‰Ij                  |
j                  dz   |j                  dz   t         j"                  d¬«       ŒA �ŒÎ dTˆBˆfd „}‰jH                  �r(‰jJ                  D �]  }|jF                  D �cg c]$  }‰j+                  |«      r‰jM                  |«      ‘Œ& }}|jF                  D �cg c]  }‰j+                  |«      sŒ|‘Œ }}tO        |«      dkD  sŒw ||tQ        |«      «      }tS        |jF                  «      D ]x  }‰j+                  |«      sŒ‰jM                  |«      |kD  sŒ* ‰B||«      sŒ4|‰=v rŒ9t
        j                  d!|‰jM                  |«      ||‰jM                  |«      «        |	|«       Œz �Œ ‰jT                  �r^t        «       }| j                  D �]D  }‰j+                  |«      sŒ‰jM                  |«      |fg}‰jM                  |«      }tO        |«      dkD  sŒJtW        jX                  |«      \  }}||v rŒ,|j[                  |«       ‰jM                  |«      |d"z   kD  rNtO        |«      dk(  r@t
        j                  d#||‰jM                  |«      ‰jM                  |«      «        |	|«       ŒÝ|jF                  D ]J  }‰j+                  |«      sŒ ‰B||«      sŒ|‰=vsŒ$tW        j\                  |‰jM                  |«      |f«       ŒL tO        |«      dkD  rŒû�ŒG 	  ‰Hj^                  ‰Id$d«      \  }}|\  }5ŠGt        «       }6ˆIfdE„|5D «       D ]   \  ŠL}7|6j�                  ˆGˆLfdF„|7D «       «       Œ" t        «       }8|6D ]=  \  }9}:|9d dG |:d dH k7  rt�        dI|9d dG › dJ|:d dH › �«      ‚|9d dG }-|8j[                  |-«       Œ? t‘        | «      ŠEt“        | j                  «      D �;�
ci c]  \  };}
|
|;“Œ
 c}
};ŠFt•        ˆEfdK„|8D «       ˆFfdL„¬M«      }<|<‰=fS # t        $ r}t        d«      |‚d }~ww xY wc c}w c c}w # ‰Hj`                  $ �r}tc        td        jf                  «      }d }d ŠA| jh                  } 	 | �| jk                  d%d&d&¬'«      n
tm        | «      ŠAto        d(d)„ ˆAfd*„¬+«       tq        d,d-«      }ts        |d.«      5 }!|!ju                  ‰A«       d d d «       n# 1 sw Y   nxY wn# tv        $ r}d/|› d0�}Y d }~nd }~ww xY wd1jy                  ‰Hjz                  j|                  j                  ‰I«      «      Š@to        d(d2„ ˆ@fd3„¬+«       t�        ‰I«      }"|"�r²i }#d$g}$dUd4„}%|"D ]ä  \  }&}'}(|$jƒ                  |'«       |&d$k(  r* |%|'«      })|#j…                  |)g «      jƒ                  |(«       ŒG|'dk(  r* |%|&«      })|#j…                  |)g «      jƒ                  |(«       Œv |%|&«       |%|'«      k(  r* |%|&«      })|#j…                  |)g «      jƒ                  |(«       Œ± |%|&«      }* |%|'«      }+|#j…                  |+g «      jƒ                  d5|*› �«       Œæ g },|#j‡                  «       D ]5  \  }-}.|,jƒ                  d6|-› d7�«       |.D ]  }/|,jƒ                  d8|/› �«       Œ Œ7 d1jy                  |,«      }0d9jy                  |$«      }1t‰        ‰I«      \  }2ŠK‰Krto        d(d:„ ˆKfd;„¬+«       |rd<|› d1�nd}3|2r	|3d=|2› d1�z  }3d}4|rd>}4t        d?|0› d@|1› d1|3› |4› �«      |‚t
        j                  dA«       t
        j                  dBt‹        ˆHˆIfdC„«      «       t‰        ‰I«       ‚ d }~wtv        $ rE t
        j                  dA«       t
        j                  dBt‹        ˆHˆIfdD„«      «       t‰        ‰I«       ‚ w xY wc c}
};w )VNc              3  ó¤   K  — | ]H  }|j                   d k(  r7t        |j                  d«      r!t        |j                  j                  «      –— ŒJ y­w)rÅ   Ú_overloadpacketN)rÌ   r°   rš   r¾   rì  r$  s     rM   rr   z solve_min_cut.<locals>.<genexpr>E  sA   è ø€ ò &
àØ�w‰w˜/Ò)¬g°d·k±kÐCTÔ.Uô �—‘×+Ñ+×,ñ&
ùs   ‚AAc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrI   )r¾   ©rp   r:  s     rM   rr   z solve_min_cut.<locals>.<genexpr>J  s   è ø€ ò 4
ØŒC��Fñ4
ùr  z&Ops banned from re-materialization: %sc                óD  — |j                   t        j                  j                  j                  k7  ry|j
                  d   }t        j                  j                  j                  |«      \  }}|D ].  }|j                  |   }| |u r yt        |t        «      sŒ)| |v sŒ. y y©NFr   T)rš   r›   rœ   r	  Úauto_functionalizedrÉ   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsrÆ   r¢   r›  )ÚaÚbÚ
mutable_opÚmutable_arg_namesr?  rè   ro  s          rM   Ú!can_fuse_into_auto_functionalizedz8solve_min_cut.<locals>.can_fuse_into_auto_functionalizedO  s™   € Ø�8‰8”u—y‘y×-Ñ-×AÑAÒAØØ—V‘V˜A‘Yˆ
ô ×#Ñ#×6Ñ6×GÑGàó
ñ	
ØØð
 &ò 	 ˆDØ—(‘(˜4‘.ˆCØ�C‰xÙÜ˜#œtÕ$Ø˜’8Ùð	 ð rO   c                óâ   — |j                   t        j                  j                  j                  k7  ry|j
                  d   }|D ])  }|j
                  d   }|€t        d«      ‚||   }| |u sŒ) y y)NFÚtensors_to_clonerÆ   zkwargs must not be NoneT)rš   r›   rœ   r	  r
  rÆ   rƒ   )rõ  rö  rø  rè   rÆ   ro  s         rM   Ú.can_fuse_into_triton_kernel_wrapper_functionalzEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functionalc  sw   € Ø�8‰8”u—y‘y×-Ñ-×NÑNÒNØØŸH™HÐ%7Ñ8ÐØ%ò 	ˆDØŸ(™( 8Ñ,ˆFØˆ~Ü$Ð%>Ó?Ð?Ø˜‘,ˆCØ�CŠxÙð	ð rO   c                ób  •— t        |«      t        j                  k(  ry ‰| |«      ry ‰| |«      ry| j                  t        j
                  u r>| j                  d   j                  t        j                  j                  j                  u ry‰j                  | «      xr ‰j                  |«      S )NTr   F)r<   r�   Úcatrš   rÇ   rÈ   rÉ   r›   rœ   r	  r
  rN   )rõ  rö  rù  rü  Úop_typess     €€€rM   rN   z!solve_min_cut.<locals>.is_fusiblep  s•   ø€ ô ˜1Ó¤§¡Ò)ØÙ,¨Q°Ô2ØÙ9¸!¸QÔ?Øà�H‰Hœ×(Ñ(Ñ(Ø—‘�q‘	× Ñ Ü�y‰y×%Ñ%×FÑFñGð
 Ø×"Ñ" 1Ó%Ò@¨(×*=Ñ*=¸aÓ*@Ð@rO   r   zANeed networkx installed to perform smart recomputation heuristicsc                ó<  •— ‰j                  | «      ryt        | g«      }t        |«      dkD  ro|j                  «       }|j                  D ]A  }‰j                  |«      s ‰||«      s y‰j                  |«      sŒ1|j                  |«       ŒC t        |«      dkD  rŒoyrð  )rU   r%   r¤   r™  r¥   r|   rê  )rL   ry  Úcurr¡   rN   rA  rÿ  s       €€€rM   Úis_materialized_backwardsz0solve_min_cut.<locals>.is_materialized_backwardsŠ  s‘   ø€ Ø×Ñ˜DÔ!ØÜ ˜vÓ&ˆ	Ü�)‹n˜qÒ Ø—-‘-“/ˆCØŸ	™	ò (�Ø ×/Ñ/°Ô5¹jÈÈdÔ>SÙØ×#Ñ# DÕ)Ø—M‘M $Õ'ð	(ô �)‹n˜qÓ ð rO   c                ón  •— | j                   dk7  ry| j                  t        j                  u ry| j                  j                  dd«      t        j                  k(  ryt        j                  r‰j                  | «      ry| j                  t        j                  j                  t        j                  j                  fv ry‰j                  r‰j!                  | «      s1y‰j#                  | «      ry‰j%                  | «      ryt'        | «      ry‰j(                  r3 ‰| «      r+t*        j-                  d	| t/        | j0                  «      «       y
| j2                  dk  r| j2                  t        j4                  kD  ry‰j6                  r0t9        d„ | j:                  D «       «      }t=        | «      }|dz  |k  ryy)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                  «      sŒt        |«      –— Œ, y ­wrI   )r¢   rÊ   rË   rZ  rî  s     rM   rr   zBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>Ë  s&   è ø€ ò %Ø !´*¸QÄÇÁÕ2H”˜—ñ%ùs   ‚2¢2rµ   zreduction op)rÌ   rš   rÇ   rÈ   r‘   r’   r&   r4  r   Úrecompute_viewsrU   r�   Úlift_fresh_copyrŸ   Ú
lift_freshr�   rW   rS   rQ   r  rŒ   r@   rØ  rô   r¥   Údist_from_bwÚmax_dist_from_bwrŽ   rU  rÉ   rZ  )rL   Úinput_tensors_sizeÚoutput_sizer  Úmin_cut_optionsrÿ  s      €€€rM   Úshould_ban_recomputationz/solve_min_cut.<locals>.should_ban_recomputation˜  sr  ø€ à�7‰7�oÒ%ØØ�;‰;œ(×*Ñ*Ñ*ØØ�9‰9�=‰=˜ dÓ+Ô/?×/IÑ/IÒIØ%Ü×!Ò! h×&6Ñ&6°tÔ&<ØØ�;‰;œ4×/Ñ/×7Ñ7¼¿¹×9PÑ9PÐQÑQØà×2Ò2Ø×+Ñ+¨DÔ1Ø6à×!Ñ! $Ô'Ø"Ø×,Ñ,¨TÔ2Ø-Ü(¨Ô.Ø'ð ×7Ò7Ñ<UØô=
ô �I‰IÐ5°t¼UÀ4Ç:Á:Ó=NÔOØ-ð ×Ñ Ò$¨×):Ñ):¼V×=TÑ=TÒ)Tà*ð ×+Ò+Ü!$ñ %Ø%)§Y¡Yô%ó "Ðô # 4›.ˆKØ˜Q‰Ð!3Ò3Ø%ØrO   c                óf   •‡ — ‰ j                   dk(  ryt        ˆˆ fd„‰ j                  D «       «       S )NrÜ   Tc              3  ó0   •K  — | ]  } ‰‰|«      –— Œ y ­wrI   r`   )rp   r¡   rN   rL   s     €€rM   rr   z9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>×  s   øè ø€ ÒE°$‘z $¨×-ÑEùs   ƒ)rÌ   r¦   r¥   )rL   rN   s   `€rM   Úis_materializedz&solve_min_cut.<locals>.is_materializedÓ  s*   ù€ Ø�7‰7�mÒ#ØäÔE¸$¿*¹*ÔEÓEÐEÐErO   c           
     óÆ  •— t         j                  r| |v ryt        | «      }t         j                  r#‰j	                  | «      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š™™™™™ñ?rs  r'   Né   )r   Ú treat_parameters_as_free_to_saverZ  r  rU   r~  r  r¢   r‘   r   r›   r¶   ÚINT_INFr…   rL  rM  r  )rL   rl   Úmem_szr  rÿ  s      €€rM   Úget_node_weightz&solve_min_cut.<locals>.get_node_weightÙ  sÑ   ø€ ô ×3Ò3ØÐ3Ñ3àÜ˜$“ˆÜ×!Ò! h×&6Ñ&6°tÔ&<ô —8‘8Ð=Ð=Ð=ä�d—i‘i Ñ&¬Ô5ä˜dŸi™i¨Ñ.´·±Ô=ÜÐ FÐFÐFô à�cœS¤ T×%6Ñ%6¸Ó!<¸aÓ@Ñ@ÑAó
ˆñ ˜4Ô Ø˜4�<Ðà˜A‘:˜tÐ#Ð#rO   r’  c                ó
  •— ‰j                  | «      ry| ‰v r\t        | j                  t        j                  j
                  «      xr | j                  j                  dk(  }t        j                  s|syt        | «      ryd| j                  v r(t        | j                  d   t        j                  «      ry‰j                  | «       ‰j                  d| j                  dz   t        j                   |rd|› �¬«       y	d¬«       y	)
NFrÁ   r˜   rÔ   Ú_inzcannot recompute: zcannot recompute©ÚcapacityÚreasonT)rU   r¢   rš   r›   r  r  rÀ   r   r'  r–   r‘   r·   rê  Úadd_edgerè   r~  r  )rL   r  Úis_collectiveÚbanned_nodesÚdont_banÚnx_graphrÿ  s      €€€€rM   Úban_recomputation_if_allowedz3solve_min_cut.<locals>.ban_recomputation_if_allowed	  s÷   ø€ Ø×Ñ˜DÔ!ØØ�8Ñô ˜4Ÿ;™;¬¯
©
×(=Ñ(=Ó>ò @Ø—K‘K×)Ñ)Ð-?Ñ?ð ô ×>Ò>ÁmØô ˜$ÔØà�D—I‘IÑ¤*¨T¯Y©Y°uÑ-=¼u¿~¹~Ô"NØØ×Ñ˜Ôð
 	×ÑØØ�I‰I˜ÑÜ—X‘XÙ4:Ð'¨ xÐ0ð	 	ô 	
ð ð ASð	 	ô 	
ð rO   rã   Ú_outÚsinkz;must be available for backward: input required for gradientr  r  z3must be computed in backward: required for gradientz+must recompute: marked by checkpoint policyzprimal inputzforward RNG seedr˜   r=  ç        znon-tensor outputzcannot save: )r  zdata dependencyc                óØ  •— g }| D ]*  }t        j                  |‰
j                  |«      |df«       Œ, t        |«      dkD  r©t        j                  |«      \  }}}|s‰
j                  |«      S |j
                  D ]_  }‰
j                  |«      sŒ‰
j                  |«      |kD  rŒ*‰
j                  |«      | ‰	||«      f}||vsŒJt        j                  ||«       Œa t        |«      dkD  rŒ©|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|   )Ústart_nodesÚ	max_rangeÚsorted_nodesrq   r?  rL   Únode_is_fusibler¡   r˜   rN   rA  s            €€rM   Úfind_first_unfusiblez+solve_min_cut.<locals>.find_first_unfusible�	  sû   ø€ ð
 9;ˆØò 	OˆAÜ�N‰N˜<¨)×*@Ñ*@ÀÓ*CÀQÈÐ)MÕNð	Oô �,Ó !Ò#Ü',§}¡}°\Ó'BÑ$ˆAˆt�_Ù"Ø ×-Ñ-¨dÓ3Ð3ØŸ
™
ò 
:�Ø×+Ñ+¨DÕ1Ø ×-Ñ-¨dÓ3°iÒ?Ø à!×.Ñ.¨tÓ4ØÙ" 4¨Ó.ð6�Cð
  ,Ò.ÜŸ™ |°SÕ9ð
:ô	 �,Ó !Ó#ð ÐrO   z1used above/below fusible %s:(%s) -> %s -> %s:(%s)rs  ztoo long %s %s %s %srÔ   FTr­  r¤  c                 ó   — dddœS )NÚmin_cut_failed_fx_graphr§  r¨  r`   r`   rO   rM   rt   zsolve_min_cut.<locals>.<lambda>
  s   € Ø5Ø (ñ%€ rO   c                 ó   •— ‰ S rI   r`   )Úfx_graph_strs   €rM   rt   zsolve_min_cut.<locals>.<lambda>
  s   ø€  <€ rO   r¶  Úmin_cut_failed_graphz.txtÚwz(failed to write: ú)ú
c                 ó   — dddœS )NÚmin_cut_failed_edge_listr§  r¨  r`   r`   rO   rM   rt   zsolve_min_cut.<locals>.<lambda>
  s   € Ø2Ø$ñ!€ rO   c                 ó   •— ‰ S rI   r`   )Úedge_list_strs   €rM   rt   zsolve_min_cut.<locals>.<lambda>"
  s   ø€ ˜}€ rO   c                óX   — dD ]$  }| j                  |«      sŒ| d t        |«        c S  | S )N)r  r"  )Úendswithr¤   )Ú	node_nameÚsuffixs     rM   Úget_base_namez$solve_min_cut.<locals>.get_base_name6
  s:   € Ø-ò 9�FØ ×)Ñ)¨&Õ1Ø(¨¬C°«K¨<Ð8Ò8ð9ð !Ð rO   zdepends on z  ú:z    - z -> c                 ó   — dddœS )NÚmin_cut_failed_svgr§  r¨  r`   r`   rO   rM   rt   zsolve_min_cut.<locals>.<lambda>a
  s   € Ø 4Ø$,ñ)€ rO   c                 ó   •— ‰ S rI   r`   )Úsvg_contents   €rM   rt   zsolve_min_cut.<locals>.<lambda>e
  s   ø€  {€ rO   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                 ól   •— dj                  ‰ j                  j                  j                  ‰«      «      S ©Nr5  ©ÚjoinÚ	readwriteÚedgelistÚgenerate_edgelist©Únxr   s   €€rM   rt   zsolve_min_cut.<locals>.<lambda>Œ
  ó%   ø€ ˜Ÿ	™	 "§,¡,×"7Ñ"7×"IÑ"IÈ(Ó"SÓT€ rO   c                 ól   •— dj                  ‰ j                  j                  j                  ‰«      «      S rE  rF  rK  s   €€rM   rt   zsolve_min_cut.<locals>.<lambda>–
  rM  rO   c              3  ó,   •K  — | ]  }|‰|   f–— Œ y ­wrI   r`   )rp   rq   r   s     €rM   rr   z solve_min_cut.<locals>.<genexpr>ž
  s   øè ø€ Ò8¨�Q˜ ™Ô$Ñ8ùs   ƒc              3  ó0   •K  — | ]  }|‰v sŒ‰|f–— Œ y ­wrI   r`   )rp   r  Únon_reachableÚus     €€rM   rr   z solve_min_cut.<locals>.<genexpr>Ÿ
  s   øè ø€ ÒA ¨a°=Ò.@�q˜!”fÑAùs   ƒ	�	éýÿÿÿéüÿÿÿznode_in[:-3]=z != node_out[:-4]=c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wrI   r`   ©rp   rL   Úname_to_nodes     €rM   rr   z solve_min_cut.<locals>.<genexpr>®
  s   øè ø€ Ò2 ˆ�dÕ	Ñ2ùó   ƒc                ó   •— ‰|    S rI   r`   )rß   Únode_idxs    €rM   rt   zsolve_min_cut.<locals>.<lambda>®
  s   ø€ À(È1Á+€ rO   ru   )rõ  rY   rö  rY   rZ   r>   rX   )rL   rY   rZ   ú
str | None)rL   rY   rl   re   rZ   ztuple[float, str | None])r’  )rL   rY   r  r¾   rZ   r>   )r)  rc   r*  r…   rZ   r…   )r<  r¾   rZ   r¾   )Kr%   Úget_default_op_listr?   rª   rG   r@   r|  ÚnetworkxÚImportErrorrñ   ÚDiGraphrÌ   rg   rh   r  rè   r~  r  r–   r6   r5   r|   r‘   r¢   r›   rJ  r   Úfloatr¹   r’   r   r   r2   rl   r  r¥   rŠ   ry   r„   r¤   rL  rô   r‹   r&  r(  rê  r'  Úminimum_cutÚNetworkXUnboundedr>   r   ÚhandlersÚowning_moduler²  r¾   r   Ú_get_unique_pathÚopenÚwriteÚ	ExceptionrG  rH  rI  rJ  Ú_find_infinite_capacity_pathró   Ú
setdefaultr`  Úvisualize_min_cut_graphr   rÇ  rƒ   Úget_name_to_noder…  rw   )Mr÷   rA  r  r  Újoint_module_opsÚops_ignoredÚer  r  r!  rL   Ú
ban_reasonÚis_non_tensor_nodeÚweightÚcannot_save_reasonr¡   r-  Ú	used_nodeÚordersÚfw_usersÚfirst_unfusible_useÚvisitedÚ
start_nodeÚfusibleÚstart_orderr?  r  Ú	cut_valueÚ	partitionÚunbounded_excÚstructured_tracing_enabledÚfx_graph_filer)  ÚfÚinf_pathÚnode_constraintsÚraw_path_nodesr>  Ú	from_nodeÚto_noder  ÚbaseÚ	from_baseÚto_baseÚconstraint_linesr<  ÚconstraintsÚcÚconstraints_strÚraw_path_strÚsvg_pathÚlocal_files_msgÚtlparse_msgÚ	reachableÚcutsetÚnbrsÚ	cut_nodesÚnode_inÚnode_outr9  r2  r  rù  rü  r9  r1  rN   r  r  rW  rZ  rQ  rL  r   rÿ  rC  rR  sM    ```                                                         @@@@@@@@@@@@@@@@rM   Úsolve_min_cutr˜  :  se  ÿÿú€ ð ÐÜ“<ˆÜ"Ó$€HåÜ%ñ &
à#×)Ñ)ô&
ó 
Ðð
 '¬ñ 4
Ø$×5Ñ5ô4
ó *
ñ 
ˆô 	�‰Ð9¸;ÔGóó(÷Að&Û÷÷9õvFð&$Øð&$Ø4Gð&$à	!ö&$ðP ˆr�z‰z‹|€HÜ(2«€L÷ñ ð@ ×!Ñ!ó YˆØ�7‰7�hÒØà�9×.Ñ.Ñ.à˜9×5Ñ5Ñ5Ø×!Ñ!Ø—I‘I Ñ&ØÜ!ŸX™XØXð	 "õ ð ×!Ñ!Ø—I‘I Ñ%ØÜ!ŸX™XØPð	 "ô ð ä˜$Ôð
 ×ÑØ—	‘	˜EÑ!ØÜŸ™ØDð	 ô ð ä�dÔÙ(¨¨~Õ>Ü  Ô&Ù(¨Ð/AÔBñ
 .¨dÓ3ˆ
Ø×#Ñ# DÔ)©jÙ(¨¨zÔ:ð ˜Ÿ™Ð"ÒE }¸D¿I¹IÐ'EòUà�t—y‘yÐ ÒS¬°D·I±I¸eÑ4DÄeÇlÁlÓ)SÐ%Sð 	ô �tÔÜœ=¨Ó.Ó/ˆFØ!%ÑÙô Ø—	‘	—‘˜eÓ$¤}Ô6FÐ&Gôä Ô%Ø�Ø%)Ñ"äŸ™�Ø%8Ñ"á)8Ø�i×;Ñ;ó*Ñ&ˆFÐ&ñ
  6¬T¯X©XÒ#5¸Ä7Ò9JØ×ÑØ—	‘	˜EÑ!Ø—	‘	˜FÑ"ØØ&Ð'9Ð&:Ð;ð	 õ ð ×Ñ˜dŸi™i¨%Ñ/°·±¸VÑ1CÈfÐÔUà—J‘Jò 	ˆDØ×ÑØ—	‘	˜FÑ"Ø—	‘	˜EÑ!ÜŸ™Ø(ð	 õ ò	ðgYöXð4 ×,Ó,Ø"×4Ñ4ó 	;ˆIð &ŸO™OöàØ×+Ñ+¨DÔ1ð ×&Ñ& tÕ,ðˆFð ð "+§¡öØ°I×4LÑ4LÈTÕ4R’ðˆHð ô �6‹{˜Q‹Ù&:¸8ÄSÈÃ[Ó&QÐ#Ü! )§/¡/Ó2ò ;�Dà!×0Ñ0°Õ6Ø%×2Ñ2°4Ó8Ð;NÓNÙ& y°$Õ7à <Ñ/Ø$ÜŸ™ØOØ%Ø%×2Ñ2°9Ó=Ø/Ø Ø%×2Ñ2°4Ó8ôñ 5°TÕ:ò!;ð	;ðP ×1Ó1Ü'1£|ˆØ%×+Ñ+ó !	VˆJØ×+Ñ+¨JÔ7Øà×'Ñ'¨
Ó3°ZÐ@ð2ˆGð $×0Ñ0°Ó<ˆKÜ�g“, Ó"ÜŸ™ wÓ/‘��3Ø˜'‘>ØØ—‘˜CÔ ð ×*Ñ*¨3Ó/°+ÀÑ2CÒCÜ˜G›¨Ò)ä—H‘HØ.ØØ"Ø!×.Ñ.¨sÓ3Ø!×.Ñ.¨zÓ:ôñ 1°Ô5ØàŸI™Iò V�Dà!×0Ñ0°Õ6Ù& s¨DÕ1Ø ¨Ò4äŸ™ w°×1GÑ1GÈÓ1MÈtÐ0TÕUðVô) �g“, Õ"ð!	VðFbØ-˜rŸ~™~¨h¸À&ÓIÑˆ	�9ðF  )Ñ€Iˆ}Ü*4«,€FÛ8¨iÔ8ò B‰ˆˆ4Ø�‰ÔA dÔAÕAðBô ",£€IØ#ò !Ñˆ�Ø�3�Bˆ<˜8 C R˜=Ò(Ü Ø ¨¨ ˜~Ð-?ÀÈÈ"À¸ÐOóð ð ˜C˜R�Lˆ	Ø�‰�iÕ ð!ô $ KÓ0€Lä+4°[×5FÑ5FÓ+G×H™i˜c 4��c‘	ÓH€HÜÛ2¨	Ô2Ó8Mô€Lð ˜Ð%Ð%øôW ò ÜØOó
àð	ûðüòN	ùò
øðR ×Ñó Vä%)¬)×*<Ñ*<Ó%=Ð"ð %)ˆØ#'ˆØ"×0Ñ0ˆð	6ð
  Ð+ð ×+Ñ+Ø!&°tÈDð ,ô ô ˜Ó%ð ô Øñó 0õô -Ð-CÀVÓLˆMÜ�m SÓ)ð &¨QØ—‘˜Ô%÷&÷ &ñ &üäò 	6Ø0°°°1Ð5�Mûð	6úð Ÿ	™	 "§,¡,×"7Ñ"7×"IÑ"IÈ(Ó"SÓTˆÜØñó -õ	
ô 0°Ó9ˆÚð 68ÐØ&˜ZˆNó!ð /7ò Ñ*�	˜7 FØ×%Ñ% gÔ.ð  Ò(Ù(¨Ó1�DØ$×/Ñ/°°bÓ9×@Ñ@ÀÕHØ Ò&Ù(¨Ó3�DØ$×/Ñ/°°bÓ9×@Ñ@ÀÕHÙ" 9Ó-±¸wÓ1GÒGá(¨Ó3�DØ$×/Ñ/°°bÓ9×@Ñ@ÀÕHñ !.¨iÓ 8�IÙ+¨GÓ4�GØ$×/Ñ/°¸Ó<×CÑCØ% i [Ð1õð%ð. +-ÐØ*:×*@Ñ*@Ó*Bò :Ñ&�	˜;Ø ×'Ñ'¨"¨Y¨K°qÐ(9Ô:Ø$ò :�AØ$×+Ñ+¨f°Q°C¨LÕ9ñ:ð:ð
 #Ÿi™iÐ(8Ó9ˆOØ!Ÿ;™; ~Ó6ˆLô %<¸HÓ$EÑ!ˆH�kÙÜ Øñ!ó  3õñ 8E�/ - °Ñ3È"ð ñ ØÐ%BÀ8À*ÈBÐ#OÑO�ð ˆKÙ)ðað ô
 ð4ð #Ð#ð $)ð *6¨°bØ"Ð#Ø�-ð!óð !ð!ô" 	�‰Ð@ÔAÜ�‰ØÜÜTóô	
ô 	  Ô)ØûÜò 	Ü�‰Ð@ÔAÜ�‰ØÜÜTóô	
ô 	  Ô)Øð	üó6 Is�   Â] Ï+)]/Ð$]4Ð;]4Ù!]9 Ü$k Ý	],Ý]'Ý'],Ý9kÞ	)jÞ3A`&ß>`à	`&à`"	à`&à%jà&	`?à/`:à5jà:`?à?IjêAkc                ó   — t        dg«      }t        dg fg«      }|r²|j                  «       \  }}| j                  |«      D ]ˆ  }||v rŒ| |   |   }|j	                  dd«      }|t
        j                  k(  s
|t        k(  sŒ?|j	                  dd«      }|||f}	||	gz   }
|dk(  r|
c S |j                  |«       |j                  ||
f«       ŒŠ |rŒ²y)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Ô   r  r   r  Úunknownr#  N)
r%   r   ÚpopleftÚ
successorsr’   r~  r  r  rê  ró   )r   rx  ÚqueuerL   Ú	edge_pathÚneighborÚ	edge_datar  r  Únew_edgeÚnew_paths              rM   ri  ri  ³
  sè   € ô ˜(˜Ó$€Gô <AÀ8ÈRÀ.ÐAQÓ;R€Eá
ØŸ-™-›/‰ˆˆiØ ×+Ñ+¨DÓ1ò 	3ˆHØ˜7Ñ"ØØ  ™ xÑ0ˆIØ —}‘} Z°Ó3ˆHàœ4Ÿ8™8Ò# x´7Ó':Ø"Ÿ™ x°Ó;�Ø  (¨FÐ3�Ø$¨ zÑ1�Ø˜vÒ%Ø#’OØ—‘˜HÔ%Ø—‘˜h¨Ð1Õ2ð	3ò ð  rO   c                ó
  — | › |› �}t         j                  j                  |«      s|S d}t         j                  j                  | › d|› |› �«      r,|dz  }t         j                  j                  | › d|› |› �«      rŒ,| › 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'   r?  )ÚosÚpathÚexists)Ú	base_nameÚ	extensionr¥  Úcounters       rM   re  re  Ô
  sŠ   € ð
 ˆ[˜˜Ð$€DÜ�7‰7�>‰>˜$ÔØˆà€GÜ
�'‰'�.‰.˜I˜; a¨ y°°Ð<Ô
=Ø�1‰ˆô �'‰'�.‰.˜I˜; a¨ y°°Ð<Õ
=àˆ[˜˜'˜ 9 +Ð.Ð.rO   c                óŽ  — ddl }	 ddl}|j
                  j                  | «      j                  «       }|j                  |«      d   }|j                  «       D ]c  }| |j                  «          |j                  «          d   }|j                  t        |«      «       |t        d«      k(  sŒS|j                  d	«       Œe |j!                  «       j#                  d
«      }t%        dd«      }t'        |d«      5 }	|	j)                  |«       ddd«       ||fS # t        $ r t        j	                  dd¬«       Y yw xY w# 1 sw Y   ||fS xY w)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)NNr  r  Úredúutf-8Úmin_cut_failedú.svgr3  )r]  Úpydotr^  r@   r|  Únx_pydotÚto_pydotÚ	to_stringÚgraph_from_dot_dataÚ	get_edgesÚ
get_sourceÚget_destinationÚ	set_labelr¾   r`  Ú	set_colorÚ
create_svgÚdecodere  rf  rg  )
r   rL  r°  Ú
dot_formatÚ	dot_graphÚedgerr  rC  r�  r�  s
             rM   rk  rk  ã
  s@  € ó ðÛð —‘×%Ñ% hÓ/×9Ñ9Ó;€JØ×)Ñ)¨*Ó5°aÑ8€IØ×#Ñ#Ó%ò "ˆØ˜$Ÿ/™/Ó+Ñ,¨T×-AÑ-AÓ-CÑDÀZÑPˆà�‰”s˜6“{Ô#à”U˜5“\Ó!Ø�N‰N˜5Õ!ð"ð ×&Ñ&Ó(×/Ñ/°Ó8€Kô  Ð 0°&Ó9€HÜ	ˆh˜Ó	ð  Ø	�‰�Ô÷ð �[Ð Ð øô3 ò Ü�‰Ø[Øð 	ô 	
ñ ðú÷,ð �[Ð Ð ús   †D Ã4D8Ä D5Ä4D5Ä8Ec                 óš  — 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         j0                  ‘t         j2                  ‘t         j4                  ‘t         j6                  ‘t         j8                  ‘t         j:                  ‘t         j<                  ‘t         j>                  ‘t         j@                  ‘t         jB                  ‘t         jD                  ‘t         jF                  ‘t         jH                  ‘t         jJ                  ‘t         jL                  ‘t         jN                  ‘t         jP                  ‘t         jR                  ‘t         jT                  ‘t         jV                  ‘t         jX                  ‘t         jZ                  ‘t         j\                  ‘t         j^                  ‘t         j`                  ‘t         jb                  ‘t         jd                  ‘t         jf                  ‘t         jh                  ‘t         jj                  ‘t         jl                  ‘t         jn                  ‘t         jp                  ‘t         jr                  ‘t         jt                  ‘t         jv                  ‘t         jx                  ‘t         jz                  ‘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š                  g}|t         jœ                  t         jž                  t         j                   t¢        j¤                  t         j¦                  t         j¨                  t         jª                  t         j¬                  t         j®                  g	z  }|}| 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â                  ‘z  } | t         jä                  t         jæ                  gz  } | |z  } | té        «       z  } | t         jê                  gz  } | tì        D �cg c]  }tï        |«      ‘Œ c}z  } tñ        | «      }tñ        tò        dtô        f      t         jö                  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 c c}w )N.)Šr�   rê  rÆ  rš  Úatan2rI  rL  rM  ÚpowÚ	remainderÚfmodÚ__and__Ú__or__Ú__xor__Ú
__lshift__Ú
__rshift__ÚeqÚneÚgeÚgtÚleÚltrB  Ú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ÚrsqrtrH  ÚsigmoidÚsoftplusÚ	thresholdÚthreshold_backwardÚclampÚwhereÚlerpÚaddcmulÚgeluÚgelu_backwardrU  ÚmeanÚ_grad_sum_to_sizeÚsum_to_sizerC  ÚtoÚtype_asrÇ   rÈ   ÚsqueezeÚ	unsqueezeÚrsubÚ_to_copyÚaliasrÒ   ÚsliceÚtrD  Úbroadcast_in_dimÚexpandÚ
as_stridedÚpermuteÚselectrn  rE  Úprepare_softmax_onlineÚcloneÚ	full_likeÚvarÚstdÚ_unsafe_viewrÓ   Úbroadcast_tensorsÚscalar_tensorÚonesÚ	new_zerosr  ÚarangeÚtriuÚvar_meanÚisinfrî   ÚfullÚzerosÚemptyÚ
empty_likeÚargmaxÚmaximumÚiotaÚ'_low_memory_max_pool_offsets_to_indicesr‹  Úgatherrl  Ú
zeros_liker   r   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   ÚmrG   rE   rD   rC   s           rM   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Ñ5ðI%!ñ %ÐðN ¤§¡¬T¯[©[Ð 9Ñ9ÐØ Ñ(Ðà¤£Ñ/ÐàÜ�‰ð!ñ Ðð ÄÖ N¸1Ô!3°AÕ!6Ò NÑNÐÜ!Ð":Ó;ÐäœH S¬# XÑ.Ñ/Ü	×	Ñ	œdŸn™n¬d¯o©oÐ>ó€Jô 	�‰Ü×ÑÜ×!Ò!Ü�ŠÜ�
Š
Ü×0Ò0Ü×4Ò4Ü×%Ò%Ü×)Ò)Ü× Ò Ü�ŠðÐð # ZÑ/€KÝØÜÐ(Ó)ØÜ�8ÓØóð ùò+ !Os   àec                óJ   — i }| j                   D ]  }|||j                  <   Œ |S rI   )rª   rè   )r©   rW  rL   s      rM   rl  rl  ³  s.   € Ø')€LØ—‘ò 'ˆØ"&ˆ�T—Y‘YÒð'àÐrO   c                óÔ  — t         j                  }|dk(  rt        |||«      S |dk(  rt        |||«      S |dk(  rt	        |||«      S |dk(  rt        |||«      S |dk(  rZt        j                  d«       t        j                  | |||¬«      }t	        ||t        |¬«      j                  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÷   Úall_recomputable_banned_nodesÚ recorded_knapsack_input_memoriesÚ recorded_knapsack_input_runtimes)Úgraph_info_provider)Úknapsack_algoÚmax_mem_budgetr$  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÷   ÚmemoryÚruntimesÚ
max_memoryrA  r6  ÚSOLVERr9  Úsaved_node_idxÚrecomp_node_idxs
             rM   Ú#_optimize_runtime_with_given_memoryrF  º  s#  € ô ×3Ñ3€FØ�ÒÜ˜v x°Ó<Ð<Ø	�5ŠÜ˜F H¨jÓ9Ð9Ø	�4ŠÜ˜6 8¨ZÓ8Ð8Ø	Ð3Ò	3Ü-¨f°hÀ
ÓKÐKØ	Ð-Ò	-Ü�‰ð?ô	
ô
 0×CÑCØ#Ø*GØ-3Ø-5ô	
Ðô ØØÜØ$7ôç*Ñ*Ü)Ø)ð +ó ó	
ð 		
ô 
�FÔ0Ô	1Ù*0Ø�K ¨YÐ8Uó+
Ñ'ˆ˜ð �^ _Ð5Ð5äÐIÈ&ÈÐRÓSÐSrO   ©Úno_dispatchc                óä   ‡— t        | j                  «      }dˆfd„}|D �cg c]
  } ||«      ‘Œ }}| j                  «       D �cg c]
  } ||«      ‘Œ }}| j                  ||¬«      S c c}w c c}w )Nc                ó   •— t        | ‰¬«      S )NrL  )r    )ÚdrM  s    €rM   Úrealize_symbolz8_remove_symbols_without_guarding.<locals>.realize_symbolñ  s   ø€ Ü  ¨XÔ6Ð6rO   )Ústride)rK  ztorch.SymInt | intrZ   r…   )r›  ÚshaperM  Únew_empty_strided)rß   rM  rN  rL  rä  rM  s    `    rM   Ú _remove_symbols_without_guardingrP  î  sk   ø€ Ü�—‘‹M€Eõ7ð ).Ö. 1‰^˜AÕÐ.€EÐ.Ø)*¯©«Ö4 A‰n˜QÕÐ4€FÐ4Ø×Ñ˜u¨VÐÓ4Ð4ùò /ùÚ4s   ¡A(ÁA-c                óx  ‡ ‡‡	— t         j                  }dd„}|dk(  ry|dk(  rat        «       5  ddlm} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	|j                  ˆˆ	ˆ fd„«      }|cd d d «       S |dk(  rudd	l
m} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	 |d
¬«      5 } ‰ j                  ‰i ‰	¤Ž d d d «       j                  «       }t        |d«      S t        |t         «      r |‰ «      S t#        d|› �«      ‚# 1 sw Y   y xY w# 1 sw Y   ŒWxY w)Nc                óz  — 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yt        | t        j                  «      r(t        | j                  d   t        j                  «      ry| S )Nr˜   rK  rL  ç      ð?T)r¢   rÊ   rË   r‘   r›   rJ  rP  r¶   r    r·   r£   rN  s    rM   Úmaterialize_argz)estimate_runtime.<locals>.materialize_argü  sÃ   € Ü�aœŸ™Ô!¤j°·±¸±ÄÇÁÔ&MÜ3°A·F±F¸5±MÈDÔQÐQÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç,Á,Ô(OÜ$ Q§V¡V¨E¡]¸TÔBÐBÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç.Á.Ô(QØÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç-Á-Ô(PØàˆHrO   Útestingr'   Úprofiler   )Úbenchmarkerc                 ó(   •—  ‰j                   ‰ i ‰¤ŽS rI   )rš   )rÉ   rÆ   rL   s   €€€rM   rt   z"estimate_runtime.<locals>.<lambda>  s   ø€ °;°4·;±;ÀÐ3OÈÑ3O€ rO   Úflops)ÚFlopCounterModeF)Údisplayz Not aware of runtime estimator: )rß   r	   rZ   r	   )r   Ú*activation_memory_budget_runtime_estimatorrH  Ú$torch._inductor.runtime.benchmarkingrW  rì   Útree_maprÉ   rÆ   Úbenchmark_gpuÚtorch.utils.flop_counterrZ  rš   Úget_total_flopsrL  r¢   r   rñ   )
rL   ÚRUNTIME_MODErT  rW  ÚmsrZ  ÚmodeÚcounted_flopsrÉ   rÆ   s
   `       @@rM   Úestimate_runtimerf  ù  s'  ú€ Ü×DÑD€Ló
ð �yÒ Øà	˜Ò	"Ü‹]ñ 	ÝHä!Ÿ?™?¨?¸T¿Y¹YÈÏÉÐ<TÓU‰LˆD�&à×*Ñ*Õ+OÓPˆBØ÷	ñ 	ð 
˜Ò	 å<ä—‘ ¸¿¹ÀDÇKÁKÐ8PÓQ‰ˆˆfÙ UÔ+ð 	)¨tàˆD�K‰K˜Ð( Ò(÷	)ð ×,Ñ,Ó.ˆÜ�= !Ó$Ð$ä	�LÔ"8Ô	9Ù˜DÓ!Ð!ô Ð=¸l¸^ÐLÓMÐM÷/	ð 	ú÷	)ð 	)ús   ­AD$ÃD0Ä$D-Ä0D9c                óÀ
  ‡ ‡‡‡ ‡!‡"‡#‡$‡%‡&‡'‡(‡)‡*‡+‡,— |dkD  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 d-d„Š" ‰"‰j                  «      Š) ‰"|«      Š'‰'‰)k  r|S d.ˆ'ˆ)fd„}d/ˆ"ˆ'ˆ)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 «       «      Š&	 	 	 	 d0ˆ$ˆ&fd„} ||
«      }|D �cg c]1  }|j                  j!                  dd«      t"        j$                  k(  r|‘Œ3 }}|D �cg c]	  }||vsŒ|‘Œ }}t'        |t(        d¬«      Š!t+        ‰!«      dk(  r‰j                  |z   S ‰!D �cg c]  } |t)        |«      «      ‘Œ c}Š(‰!D �cg c]  }t-        |«      ‘Œ c}Š,ddlmŠ+ 	 	 	 	 	 	 	 	 d1ˆˆ ˆ!ˆ"ˆ'ˆ(ˆ)ˆ*ˆ+ˆ,f
d„Š%t        j2                  �rÃd2ˆ#ˆ%ˆ ˆˆ,fd„} |d«       |d«      g}|d   dd  |d   dd  k7  r¤|d   |d   fg}|r—|j5                  «       \  }}|d   |d   z
  dk  r#|j7                  |«       |j7                  |«       ŒF ||d   |d   z   dz  «      }|dd  |dd  k7  r|j7                  ||f«       |dd  |dd  k7  r|j7                  ||f«       |rŒ—|j9                  «        dd lm} |D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }}|j?                  d¬«       |jA                  ||d¬«       tC        |«      D ]"  \  }}|jE                  |d›|||   fddd ¬!«       Œ$ |jG                  d"«       |jI                  d#«       |jK                  d$«       |jM                  d«       |jO                  «       }|jQ                  «        tS        jT                  «       }t        jV                  �'t        jV                  }tS        jX                  |d¬%«       d&}tZ        j\                  j_                  «       r?tZ        j\                  ja                  «       r!d'tZ        j\                  jc                  «       › �}tR        jd                  jg                  |d(|› d)ti        «       › d*�«      }|jk                  |«       tl        jo                  d+|«        ‰%|‰‰ ¬,«      d   S c c}w c c}w c c}w c c}w c c}w c c}w )3Nr'   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�   c                ó:   — t        t        t        | «      «      dz  S ©Nç    eÍÍA)rU  ÚmaprZ  )r2  s    rM   Úestimate_activations_sizez:choose_saved_values_set.<locals>.estimate_activations_sizeK  s   € Ü”3”x Ó.Ó/°#Ñ5Ð5rO   c                ó   •— | dz  ‰‰z
  z  S ri  r`   )ÚszÚmax_act_sizeÚmin_act_sizes    €€rM   Úget_normalized_sizez4choose_saved_values_set.<locals>.get_normalized_sizeT  s   ø€ Ø�S‘˜\¨LÑ8Ñ9Ð9rO   c                ó&   •—  ‰| «      ‰z
  ‰‰z
  z  S rI   r`   )Úactivationsrl  ro  rp  s    €€€rM   Úget_mem_ratioz.choose_saved_values_set.<locals>.get_mem_ratioW  s"   ø€ Ù)¨+Ó6¸ÑEØ˜<Ñ'ñ
ð 	
rO   )rŠ   r‹   rŒ   )r�   )Úget_node_storagec              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrI   r`   )rp   rL   ru  s     €rM   rr   z*choose_saved_values_set.<locals>.<genexpr>y  s   øè ø€ ÒT¸4Ñ 0°× 6ÑTùrR  c                óˆ   •— | D �cg c]1  }|j                   t        d«      k  r ‰|«      ‰vst        |«      r|‘Œ3 c}S c c}w ri  )r  r…   r  )r  r:  ru  Úinput_storagess     €€rM   Úget_recomputable_banned_nodesz>choose_saved_values_set.<locals>.get_recomputable_banned_nodes{  sL   ø€ ð
 "ö
àð —‘¤ S£Ò)á$ QÓ'¨~Ñ=Ü0°Ô3ò ò
ð 	
ùò 
s   †6?r�   Tr]  rG  c                óÈ  •
—  ‰«       5  t        |‰‰t        | d«      |‰«      \  }}}d d d «       t        «       }D ]  }	 |j                  ‰|   «       Œ |j                  ‰«      st        d«      ‚t        ||‰|«      \  }}	t        r7t        |‰|‰D �
cg c]  }
t        |
«      ‘Œ c}
‰‰|| ‰‰ ‰|«      ‰‰¬«       |fS # 1 sw Y   Œ�xY w# t        $ r Y ŒŸw xY wc c}
w )Nr   z:dont_ban must be a subset of all_recomputable_banned_nodes)r÷   r6  Úsaved_node_idxsÚrecomputable_node_idxsÚexpected_runtimeÚmemories_banned_nodesÚ normalized_memories_banned_nodesÚruntimes_banned_nodesÚmin_cut_saved_valuesÚmemory_budgetrp  ro  Úsaved_values_act_sizeÚ&more_aggressive_saved_values_mem_ratioÚ/aggressive_recomputation_saved_values_mem_ratio)rF  rL  r%   rê  ÚBaseExceptionÚissubsetrƒ   r˜  r?   r   rZ  )r‚  rA  r÷   r}  r{  r|  r  r9  r2  r?  r:  Úaggressive_optionsr…  r6  rl  ro  r~  rp  r„  rH  r€  s              €€€€€€€€€€rM   Úget_saved_values_knapsackz:choose_saved_values_set.<locals>.get_saved_values_knapsack¦  s8  ø€ ñ ‹]ñ 	ô
 4ØØ%Ø%Ü�M 1Ó%ØØ-óñ	Ø ØØ&÷		ô )3«ˆØ)ò 	ˆCðØ—‘Ð:¸3Ñ?Õ@ð	ð × Ñ Ð!>Ô?Ü ØLóð ô (ØØØØó	
‰ˆ�aõ !Ü4Ø'Ø.KØ /Ø'=Ø!1à)Fö'Ø$%”H˜Q•Kò'ð 2GØ&;Ø%1Ø+Ø)Ø)Ù&?ÀÓ&MØ7]Ø@oõ#ð& Ð-Ð-Ð-÷i	ð 	ûô$ !ò Ùðüò*'s#   ‰CÁ CÂCÃCÃ	CÃCc                óN   •—  ‰| ‰‰¬«      \  }}| t        ‰«      |z
   ‰|«      fS )N)rA  r÷   )rU  )rö  r2  r}  rt  r‰  r÷   rA  r€  s      €€€€€rM   Úestimate_for_budgetz4choose_saved_values_set.<locals>.estimate_for_budgetá  s@   ø€ Ù-FØ˜Y°Kô.Ñ*ˆLÐ*ð ÜÐ)Ó*Ð-=Ñ=Ù˜lÓ+ðð rO   r$  rS  gü©ñÒMbP?r  )é
   é   )Ú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_paretor?  r¯  z%Generated Pareto frontier curve at %s)r‚  rA  r÷   )r2  rc   rZ   r`  )rn  r`  rZ   r`  )rs  rc   rZ   r`  )r  re   rZ   rc   )r‚  r`  rA  rb   r÷   úfx.GraphrZ   ztuple[list[fx.Node], float])rö  r`  rZ   ztuple[float, float, float])8rñ   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_utilsru  r%   r‘   r’   r&   r4  rw   rZ  r¤   rf  Útorch.utils._mode_utilsrH  Ú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¥  rG  r3   Úsavefigr@   r=  )-r÷   rA  r‚  r  Úruntime_optimized_saved_valuesr?  rq  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesr  ry  Úrecomputable_banned_nodesr:  Úmust_save_nodesrL   r‹  ÚoptionsÚbisectsÚlhsÚrhsÚmidÚpltÚitemÚx_valuesÚy_valuesÚtxtÚfigÚfig_dirÚrank_suffixÚfig_namerˆ  r…  r6  rl  rt  ru  r‰  rx  ro  r~  rp  r„  rH  r€  s-   ``                             @@@@@@@@@@@@@@rM   Úchoose_saved_values_setrÈ  &  sË  ÿÿ€ ð
 �qÒ˜M¨AÒ-ÜØXÐYfÐXgÐhó
ð 	
ô $Ü$×AÑAÜ#)×#KÑ#KÜ%+×%OÑ%OÜ &× EÑ EÜ×8Ñ8ô€Oô ×&Ò&Ü!ØØ"'Ø',Ø).Ø$)ô
ˆð ˜ÒØ×ÑÐä(5ØØØó)Ñ%Ð" Að ˜ÒØ-Ð-ó6ñ -¨Y×-=Ñ-=Ó>€LÙ,Ð-KÓL€Là�|Ò#Ø-Ð-ö:÷
ô
 &ØØ#Ø#(Ø%*ô	Ðô '4Ø�YÐ 7ó'Ñ#Ð  !ñ .;Ð;WÓ-XÐ*Ø-°Ò=Ø+Ð+ä ØØ %ôÐô ;HØ�YÐ 2ó;Ñ7Ð)¨<ñ 7DØ-ó7Ð3ð 7¸ÒFØ4Ð4å9äÓTÀ9×CSÑCSÔTÓT€Nð
Ø)ð
à	ö
ñ  !>¸lÓ KÐð +öàØ�6‰6�:‰:�k 5Ó)Ô-=×-GÑ-GÒGò 	
ð€Oð ð -ö!Ø°¸Ò0HŠð!Ðð !ô %+Ø!¤x¸ô%Ð!ô Ð(Ó)¨QÒ.Ø×Ñ /Ñ1Ð1à2OöØ-.ÑœH Q›KÕ(òÐð ,IöØ#'Ô˜ÕòÐõ 4ð7.Øð7.Ø)1ð7.Ø@Hð7.à	$÷7.ö 7.ôr ×,Ó,÷	ñ 	ñ ' sÓ+Ñ-@ÀÓ-EÐFˆà�1‰:�a�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�7˜c ! "˜gÒ%Ø—N‘N C¨ :Ô.Ø�q�r�7˜c ! "˜gÒ%Ø—N‘N C¨ :Ô.ò ð 	�‰Œå'à(/Ö0 �D˜“GÐ0ˆÐ0Ø(/Ö0 �D˜“GÐ0ˆÐ0ð 	�
‰
˜7ˆ
Ô#Ø�‰�˜8¨CˆÔ0ô   Ó)ò 	‰FˆAˆsØ�L‰LØ�s�)Ø�h˜q‘kÐ"Ø*ØØð õ ð	ð 	�
‰
�?Ô#Ø�
‰
Ð5Ô6Ø�	‰	ÐNÔOØ�‰�ŒØ�g‰g‹iˆØ�‰Œ
Ü—)‘)“+ˆÜ×*Ñ*Ð6Ü×5Ñ5ˆGÜ�K‰K˜¨$Õ/ØˆÜ×Ñ×)Ñ)Ô+´×0AÑ0A×0PÑ0PÔ0RØ"¤5×#4Ñ#4×#=Ñ#=Ó#?Ð"@ÐAˆKÜ—7‘7—<‘<ØÐ+¨K¨=¸Ô:LÓ:NÐ9OÈtÐTó
ˆð 	�‰�HÔÜ�‰Ð;¸XÔFñ %Ø#¨yÀkôàñ	ð 	ùòyùò
!ùòùòùòz 1ùÚ0s*   Æ6UÇ	UÇUÈUÈ.UÍUÍ,Uc                ó˜  ‡— i Št        t        | j                  «      «      D �]$  }|j                  dk(  rx|j                  j                  d«      }t        |t        j                  «      r#dt        |j                  «      |j                  f}nSt        |t        j                  «      rd}n6d}n3|j                  dk(  rd}n!|j                  t        |j                  «      f}t        t        ˆfd„|j                   D «       «      «      }t#        j$                  t        ||f«      j'                  d«      «      j)                  «       ‰|<   �Œ' ‰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Ü   Úsymint)rÜ   rã   )rã   c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wrI   r`   )rp   rR  Úhashess     €rM   rr   z_cone_hashes.<locals>.<genexpr>L  s   øè ø€ Ò"A° 6¨!¥9Ñ"AùrX  r­  )rÊ  r›  rª   rÌ   r‘   r’   r¢   r›   rJ  r¾   ro  Úrequires_gradr¶   rš   rô   rw   r¥   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r©   rL   r˜   Úself_keyÚuser_hashesrÌ  s        @rM   Ú_cone_hashesrÔ  -  s	  ø€ ð (*€FÜœ˜eŸk™kÓ*Ó+ó ˆØ�7‰7�mÒ#Ø—)‘)—-‘- Ó&ˆCÜ˜#œuŸ|™|Ô,ð "Ü˜Ÿ	™	“NØ×%Ñ%ð-‘ô
 ˜C¤§¡Ô.Ø4‘à+‘Ø�W‰W˜Ò Ø"‰HàŸ™¤ T§[¡[Ó!1Ð2ˆHäœFÓ"A°d·j±jÔ"AÓAÓBˆÜ—~‘~Ü�˜;Ð'Ó(×/Ñ/°Ó8ó
ç
‰)‹+ð 	ˆt‹ð+ð2 €MrO   c                ó´  ‡‡— t        | «      Št        j                  | j                  d«      }| j                  D ]   }|j                  D ]  }||xx   dz  cc<   Œ Œ" i Šdˆˆfd„}d}g }| j                  D ]/  }||   dk(  sŒt        j                  | ||«      ||f«       |dz  }Œ1 g }|r†t        j                  |«      \  }}}	|j                  |	«       t        ‰«      ‰|	<   |	j                  D ]<  }||xx   dz  cc<   ||   dk(  sŒt        j                  | ||«      ||f«       |dz  }Œ> |rŒ†t        |«      D �
�ci c]  \  }
}|d|
› �“Œ c}}
S c c}}
w )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'   c                óö  •— | j                   dk(  r~| j                  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y	t        ˆfd
„| j                  D «       «      }dt        | j                  «      |fS )NrÜ   r˜   )rÊ  r`   r   rá   r'   rã   )é   c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wrI   r`   )rp   rq   Úcanonical_idxs     €rM   rr   z@_canonical_node_names.<locals>._canonical_key.<locals>.<genexpr>{  s   øè ø€ Ò!Q°q -°Õ"2Ñ!QùrX  r  )rÌ   r‘   r’   r¢   r›   rJ  r¾   ro  rÍ  r¶   rš   rô   rx  )rL   r˜   Úmeta_keyÚinput_indicesrÙ  Úcones       €€rM   Ú_canonical_keyz-_canonical_node_names.<locals>._canonical_keyg  sÒ   ø€ Ø�7‰7�mÒ#Ø—)‘)—-‘- Ó&ˆCÜ˜#œuŸ|™|Ô,ô ˜Ÿ	™	“NØ×%Ñ%ð-‘ô ˜C¤§¡Ô.Ø&‘à�Ø�x  d¡Ð,Ð,Ø�W‰W˜
Ò"Ø”s˜4Ÿ;™;Ó'Ð(Ð(Ø�W‰W˜Ò Øä!Ó!Q¸D×<PÑ<PÔ!QÓQˆMØ”s˜4Ÿ;™;Ó'¨Ð7Ð7rO   Únode_)rL   útorch.fx.NoderZ   útuple[Any, ...])rÔ  r„  r5  rª   r¥   r&  r'  r(  ró   r¤   r…  )r©   ÚindegrL   r¡   rÝ  r©  ÚreadyÚcanonical_orderr?  r  r:  rÙ  rÜ  s              @@rM   Ú_canonical_node_namesrä  T  sk  ù€ ô ˜Ó€Dä&*§m¡m°E·K±KÀÓ&C€EØ—‘ò ˆØ—J‘Jò 	ˆDØ�$‹K˜1ÑŒKñ	ðð /1€Mö8ð2 €GØ8:€EØ—‘ò ˆØ�‰;˜!ÓÜ�N‰N˜5¡>°$Ó#7¸À$Ð"GÔHØ�q‰L‰Gðð
 &(€Oá
Ü—M‘M %Ó(‰	ˆˆ1ˆcØ×Ñ˜sÔ#Ü  Ó/ˆ�cÑà—I‘Iò 	ˆDØ�$‹K˜1Ñ‹KØ�T‰{˜aÓÜ—‘˜u¡~°dÓ';¸WÀdÐ&KÔLØ˜1‘‘ð		ò ô .7°Ó-G×H¡' ! TˆD�E˜!˜�+ÑÓHÐHùÓHs   Å Ec                óÌ  ‡‡‡— ddl mŠ dd„}t        j                  j	                  «       rGt        j                  j                  «       r)t        j                  j                  «       dkD  r || «      s|S t        | «      Š‰j                  «       D ��ci c]  \  }}||“Œ
 }}}dˆˆfd„} || «      �rþt        «       5   ‰«       5  |D �cg c]  }‰|   ‘Œ	 c}g}t        t        j                  j                  «       «      D �	cg c]  }	g ‘Œ }
}	t        j                  j                  |
|d   «       g }i }t        |
«      D ]w  \  }}|D �cg c]  }||   ‘Œ	 }}d}|D ]C  }t        |«      }||z  }|t        j                  j                  «       k(  sŒ5|||j                  <   ŒE ||d<   |j!                  |«       Œy t        j"                  |t        j                  j$                  j'                  «       ¬«      }t        j                  j)                  |t        j                  j$                  j*                  j,                  ¬«       t/        t        j0                  |«      j3                  «       «      }d	|› d
|› �Št5        dd„ ˆfd„¬«       |
|   D �cg c]  }||   ‘Œ	 }}d d d «       d d d «       |S |S c c}}w c c}w c c}	w c c}w c c}w # 1 sw Y   Œ/xY w# 1 sw Y   |S xY w)Nr   )Úunset_fake_temporarilyc                ó¸   — | j                   D ]K  }t        |j                  t        j                  j
                  «      sŒ2|j                  j                  dv sŒK y y)N>   Úc10d_functionalrÁ   TF)rª   r¢   rš   r›   r  r  rÀ   )r÷   rL   s     rM   Úhas_collectivesz3_sync_decision_cross_ranks.<locals>.has_collectives�  sM   € Ø×%Ñ%ò 	ˆDÜØ—‘œUŸZ™Z×2Ñ2õà—+‘+×'Ñ'Ð+RÒRÙð		ð
 rO   r'   c                ó.  •‡‡— dˆfd„Šdj                  ˆfd„t        | j                  ˆfd„¬«      D «       «      }t        j                  |j                  d«      «      j                  «       }t        t        j                  j                  «       «      D �cg c]  }d ‘Œ c}Št        «       5   ‰«       5  t        j                  j                  ‰|«       d d d «       d d d «       t        ˆfd„‰D «       «      S c c}w # 1 sw Y   Œ*xY w# 1 sw Y   Œ.xY w)	Nc                óŒ   •— | j                   dk(  r‰|    › d| j                   › �S ‰|    › d| j                   › d| j                  › �S )NrÜ   r?  ©rÌ   rš   ©rq   Ú	canonicals    €rM   Ú_node_hash_strzJ_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>._node_hash_str´  sM   ø€ ð �t‰t�}Ò$Ø# A™,˜ q¨¯©¨Ð/Ð/Ø ‘l�^ 1 Q§T¡T F¨!¨A¯H©H¨:Ð6Ð6rO   ú/c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrI   r`   )rp   rq   rï  s     €rM   rr   zE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>¼  s   øè ø€ ò 
àñ ˜1×ñ
ùrR  c                ó   •— ‰|    S rI   r`   rí  s    €rM   rt   zD_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<lambda>¾  s   ø€ ¸YÀq¹\€ rO   ru   r­  c              3  ó.   •K  — | ]  }‰d    |k(  –— Œ y­wrá  r`   )rp   rß   Ú
all_inputss     €rM   rr   zE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>Å  s   øè ø€ Ò:¨!�:˜a‘= AÕ%Ñ:ùrR  )rq   rß  rZ   r¾   )rG  rw   rª   rÎ  rÏ  rÐ  rÑ  r7  r›   rè  Úget_world_sizerH  Úall_gather_objectr¦   )r÷   Únode_strrd   r?  rï  rô  rî  ræ  s       @@€€rM   Úhas_same_nodesz2_sync_decision_cross_ranks.<locals>.has_same_nodes°  så   ú€ õ	7ð —8‘8ó 
ä˜K×-Ñ-Ó3IÔJô
ó 
ˆô —‘ §¡°Ó 8Ó9×CÑCÓEˆÜ$)¬%×*;Ñ*;×*JÑ*JÓ*LÓ$MÖN˜q’dÒNˆ
Ü‹]ñ 	DÑ2Ó4ñ 	Dä×Ñ×/Ñ/°
¸FÔC÷	D÷ 	Dô Ó:¨zÔ:Ó:Ð:ùò	 O÷	Dð 	Dú÷ 	Dð 	Dús*   Â	C:Â-DÂ5!C?ÃDÃ?D	ÄDÄDz
total size)r”  r%  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`   rO   rM   rt   z,_sync_decision_cross_ranks.<locals>.<lambda>ì  s   € ØGØ (ñ%€ rO   c                 ó   •— ‰ S rI   r`   )Úsync_decision_cross_ranks_strs   €rM   rt   z,_sync_decision_cross_ranks.<locals>.<lambda>ð  s   ø€ Ð#@€ rO   r¶  )r÷   útorch.fx.GraphrZ   r>   )Útorch._subclasses.fake_tensorræ  r›   rè  ré  r±  rõ  rä  r`  rH  r7  rö  r…  rZ  r²  rè   ró   rd  Údistributed_c10dÚ_get_object_coll_deviceÚ
all_reduceÚReduceOpÚMAXr…   ÚargminrÀ  r   )r÷   r2  ré  r  r  Úreverse_canonicalrø  rß   Úobjectsr?  Úsaved_ops_names_all_ranksÚsaved_sizesÚsaved_ops_with_sizesr9  Úsaved_ops_namesÚop_nameÚsaved_nodesÚ
saved_sizerL   Úsize_of_nodeÚsaved_sizes_tensorÚpicked_rank_idxrq   rî  rü  ræ  s                          @@@rM   r6  r6  —  só  ú€ õ Eóô 	×Ñ×&Ñ&Ô(Ü×Ñ×,Ñ,Ô.Ü×Ñ×,Ñ,Ó.°Ò2Ù˜KÔ(àÐä% kÓ2€IØ*3¯/©/Ó*;×<¡$ ! Q˜˜A™Ð<ÐÑ<ö;ñ. �kÕ"Ü‹]ñ -	Ñ2Ó4ñ -	ð /;Ö;¨˜	 !›Ò;Ð<ˆGä!¤%×"3Ñ"3×"BÑ"BÓ"DÓEö:Ø’ð:Ð%ð :ô ×Ñ×/Ñ/Ð0IÈ7ÐSTÉ:ÔVØ%'ˆKØ35Ð ä(1Ð2KÓ(Lò /Ñ$��_à>MöØ3:Ð% gÓ.ð�ð ð �
Ø'ò G�DÜ#+¨D£>�LØ ,Ñ.�JØœe×/Ñ/×8Ñ8Ó:Ó:Ø:FÐ,¨T¯Y©YÒ7ð	Gð
 6@Ð$ \Ñ2Ø×"Ñ" :Õ.ð/ô "'§¡ØÜ×(Ñ(×9Ñ9×QÑQÓSô"Ðô ×Ñ×(Ñ(Ø"¤u×'8Ñ'8×'IÑ'I×'RÑ'R×'VÑ'Vð )ô ô "¤%§,¡,Ð/AÓ"B×"GÑ"GÓ"IÓJˆOØ.>¸Ð>OÐOmð  oCð  nDð  -EÐ)ÜØñó Aõð /HÈÑ.XöØ)*Ð! !Ó$ðˆLð ÷W-	÷ -	ð^ Ðˆ<ÐùóS =ùò: <ùò:ùòùò>÷W-	ð -	ú÷ -	ð^ Ðúsg   ÂJ3Â=KÃKÃ
J9Ã-KÄ	J>Ä>KÅ
K
Å:KÆD KÊKÊKÊKÊ9KËK	ËKËK#c                óü  — d}|rdnd}t        t        | j                  j                  d¬«      «      «      }| j                  j                  dt        j
                  j                  j                  ¬«      D �]ä  }t        | |j                  d   j                  «      }t        |t        j                  «      sŒBg }|j                  j                  d¬«      D ]‰  }||j                  v sŒ| j                  j                  |«      5  | j                  j!                  |› d|› �«      }	|d	z  }|j"                  d
   |	j"                  d
<   |	}|j%                  |	«       ddd«       Œ‹ |sŒï| j                  j                  |«      5  | j                  j'                  dt        j
                  j                  j                  g |j                  ¢|¢­i «      }
|j)                  |
d¬«       ddd«       |j"                  j+                  d«      }|r8|\  }}g |¢|D �cg c]  }|j"                  d
   ‘Œ c}¢­}||f
j"                  d<   | j                  j-                  |«       �Œç | S # 1 sw Y   �Œ”xY w# 1 sw Y   Œ‹xY wc c}w )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Ü   r%  rÅ   rì  r?  r'   r˜   NT)Úpropagate_metaÚeager_input_vals)r'  rÊ  r©   r&  r›   rœ   r	  Úinvoke_subgraphrÂ   rÉ   rš   r¢   rÊ   r€  rè   rA  rÜ   r‘   ró   r�  rÈ  r’   rÉ  )Úmoduler  r•  Ú
rng_stringÚ
last_inputÚhop_noderú   Únew_rng_inputsÚplaceholder_noder‰  Únew_hop_node_with_fixed_argsÚ
eager_valsÚ
eager_argsÚeager_kwargsÚinpÚnew_eager_argss                   rM   r:  r:  ú  sf  € ð< €IÙ$/‘°_€JÜ”h˜vŸ|™|×6Ñ6¸-Ð6ÓHÓIÓJ€JØ—L‘L×+Ñ+Ø¤5§9¡9×#9Ñ#9×#IÑ#Ið ,ó ó ,2ˆô ˜6 8§=¡=°Ñ#3×#:Ñ#:Ó;ˆÜ�h¤§¡Õ/Ø,.ˆNØ$,§N¡N×$=Ñ$=ÀÐ$=Ó$Oò 9Ð ØÐ!1×!6Ñ!6Ò6ð  Ÿ™×5Ñ5°jÓAñ 9Ø$*§L¡L×$<Ñ$<Ø)˜l¨!¨I¨;Ð7ó%˜	ð " Q™˜	Ø0@×0EÑ0EÀeÑ0L˜	Ÿ™ uÑ-Ø%.˜
Ø&×-Ñ-¨iÔ8÷9ð 9ð	9ò à—\‘\×1Ñ1°(Ó;ñ 	Ø39·<±<×3KÑ3KØ'ÜŸ	™	×.Ñ.×>Ñ>Ø9˜(Ÿ-™-Ð9¨.Ñ9Øó	4Ð0ð ×2Ñ2Ø4ÀTð 3ô ÷	ð &Ÿ]™]×.Ñ.Ð/AÓB�
ÙØ/9Ñ,�J ð&Ø#ð&à5CÖD¨c˜#Ÿ(™( 5›/ÒDñ&�Nð
 'Ø$ðMÐ0×5Ñ5Ð6HÑIð —‘×'Ñ'¨Ö1ðY,2ð\ €M÷I9ñ 9ú÷	ð 	üò" Es    ÄAI Æ A#I-ÈI9É I*É-I6	c           	     óþ  ‡‡‡‡— t        | j                  «      Št        «       Š| j                  j                  D ]m  }|j                  dk(  r d|j
                  v r‰j                  |«       nt        |«      r‰j                  |«       |‰v sŒS‰j                  |j                  «       Œo t        t        t        | j                  j                  «      «      }t        t        t        | j                  j                  «      «      }||z   }t        | |¬«      \  }}}	}
‰j                  «       }‰j                  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 sŒ|||<   |d
z  }Œ t%        |‰‰||||«      S )NrÜ   Útangentsrß  c              3  óF   K  — | ]  }|€Œ|j                   dk7  sŒ|–— Œ y ­w)Nrã   r%  )rp   r�  s     rM   rr   z!classify_nodes.<locals>.<genexpr>i  s$   è ø€ ò Ø !¡-°A·D±D¸HÓ4DŒñùs   ‚!Š!š!rÛ   c              3  óZ   •K  — | ]"  }|j                   d k7  r‰|j                     –— Œ$ y­wr  r  rV  s     €rM   rr   z!classify_nodes.<locals>.<genexpr>o  s.   øè ø€ ò 8àØ�7‰7�hÒð 	�T—Y‘YÕñ8ùs   ƒ(+c              3  ó2   •K  — | ]  }|‰vr|‰vr|–— Œ y ­wrI   r`   )rp   rL   rg   ry   s     €€rM   rr   z!classify_nodes.<locals>.<genexpr>t  s*   øè ø€ ò 6àØÐ(Ñ(¨TÐ9JÑ-Jô 	ñ6ùs   ƒc              3  ó2   •K  — | ]  \  }}|‰v sŒ|–— Œ y ­wrI   r`   )rp   r:  Úpr  s      €rM   rr   z!classify_nodes.<locals>.<genexpr>y  s"   øè ø€ ò -Ùˆa�°!Ð7TÒ2TŒñ-ùs   ƒ�r   r'   )rl  r©   r%   rª   rÌ   rš   rê  ré   rÇ  r¥   r›  rç  r6   r5   r/  rÄ  r  r…  rb   )r)  r  r*  rL   rõ  r÷  rd   r+  r,  r-  r.  rh   Úforward_only_graphri   rl   Úfw_cntrk   rW  rg   ry   s    `               @@@rM   r+  r+  L  s  û€ ô
 $ L×$6Ñ$6Ó7€LÜ-7«\ÐØ×"Ñ"×(Ñ(ò 1ˆØ�7‰7�mÒ#¨
°d·k±kÑ(AØ×!Ñ! $Õ'Ü! $Ô'Ø×!Ñ! $Ô'àÐ$Ò$Ø×$Ñ$ T§Z¡ZÕ0ð1ô œ¤
¨L×,>Ñ,>×,DÑ,DÓEÓF€MÜ!¤&Ô)<¸l×>PÑ>P×>VÑ>VÓ"WÓXÐØÐ3Ñ3€Fä  ¸ÔOñ C€K�Ð/Ð1Bð )×-Ñ-Ó/ÐØ×Ññ Øôô ô <Ø×Ñ˜F KÐ1BÀIóÐô .8ó 8à&×,Ñ,ô8ó .Ðô
 ,6ô 6à ×&Ñ&×,Ñ,ô6ó ,€Oô
 #-ó -Ü Ó.ô-ó #Ðð €FØ€HØ×"Ñ"×(Ñ(ò ˆØÐ$Ò$Ø#ˆH�T‰NØ�a‰K‰Fðô ØØØØØØØ#óð rO   )r  c          	     ó¾  — | j                   j                  «        | 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«      |_        Œ#|
j/                  |«      sd|_        Œ<t+        d«      |_        |j0                  D ]*  }t3        |j,                  |j,                  dz   «      |_        Œ, Œ† t        j4                  }|j&                  D ]=  }t7        |j8                  j;                  d	d«      t<        «      sŒ.|j8                  d	   } n t?        «       }g }|j&                  D ]T  }tA        |«      }|�|jC                  |«       Œ"|j(                  d
k(  sŒ2|
j/                  |«      sŒD|jE                  |«       ŒV t?        |«      }| jG                  «       D ]Š  \  }}t7        |tH        jJ                  «      sŒ!|j                   |usŒ0|j                   j&                  D ]B  }tA        |«      }|�|jC                  |«       Œ"|j(                  d
k(  sŒ2|jE                  |«       ŒD ŒŒ t        |«      dkD  rtM        dtO        |«      › d�«      ‚|rI|r3tM        dt        |«      › d|D �cg c]  }|jP                  ‘Œ c}› d�«      ‚tS        tU        |«      «      }tW        ||
|¬«      }t        jX                  rtY        ||«      }t[        t]        d„ |«      «      }t[        t]        t^        |«      «      }t[        t]        d„ |«      «      }ta        | |||||
j"                  ¬«      \  }}|r|	rtc        | ||t        |«      «      \  }}te        |«      }t        jf                  rddl4m3}  |||||
j"                  «       tk        |«      }tk        |«      }tm        |d¬«      }tm        |d¬«      }tn        �r±tO        |D �cg c]  }tq        |«      ts        |«      f‘Œ c}«      }tu        d„ |D «       «      dz  }tv        jy                  d|«       tv        jy                  d|«       t?        d„ |j                   j&                  D «       «      }t?        d„ |j                   j&                  D «       «      } || z  }!t{        t*        «      }"|j                   j&                  D ]R  }|jP                  |!v sŒt}        |j~                  d«      sŒ)|"ts        |j~                  j€                  «      xx   dz  cc<   ŒT tv        jy                  dt        |!«      t        |«      t        | «      «       tO        |"jƒ                  «       t…        j†                  d«      d¬«      }#tv        jy                  d|#«       ||fS c c}w c c}w ) 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.
    Fr  Nr   )r*  r  rl   rã   rj  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: rk  )r‚  c                ó4   — t        | «      xr t        | «       S rI   )r   r§   ©rq   s    rM   rt   z5min_cut_rematerialization_partition.<locals>.<lambda>*  s   € ”k !“nÒGÔ-DÀQÓ-GÐ)G€ rO   c                ó6   — t        | «       xr t        | «       S rI   )r   r2   r,  s    rM   rt   z5min_cut_rematerialization_partition.<locals>.<lambda>/  s   € œ[¨›^Ð+ÒE´NÀ1Ó4EÐ0E€ rO   r  r   r"  Tc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrI   )rZ  rî  s     rM   rr   z6min_cut_rematerialization_partition.<locals>.<genexpr>]  s   è ø€ Ò'J¸¬°¯Ñ'Jùr  z'Theoretical Activations Stored: %.2f GBz,Theoretical Per Activation Storage Sizes: %sc              3  óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­w©rÅ   Nr  r$  s     rM   rr   z6min_cut_rematerialization_partition.<locals>.<genexpr>b  ó$   è ø€ ò %
Ø¸4¿7¹7ÀoÓ;UˆD�I�Iñ%
ùr  c              3  óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­wr0  r  r$  s     rM   rr   z6min_cut_rematerialization_partition.<locals>.<genexpr>e  r1  r  rì  z# remat/fw/bw: %d/%d/%dr]  zCount of Ops Rematerialized: %s)Dr©   rõ   rÅ  r   Úcser;   r­   r³   r&  r'  r(  r)  r*  r+  r¤   rg   rE  rl   rÊ  rª   rÌ   r…   r  r|   r¥   rM  Úactivation_memory_budgetr¢   r‘   r’   r`  r%   r$   rê  ró   r,  rÊ   r€  rñ   rw   rè   r'  r(  rÈ  r6  r›  rç  r2   r  r7  r8  r!  r9  r=   r:  r?   rZ  r¾   rU  r@   r|  r   r°   rš   rì  r`  rÇ   ra  )$r)  r;  Úcompilerr*  r  r¬   Ú	cse_graphr÷   r?  r@  rA  rL   r¡   r‚  Úregion_budgetsÚunannotated_fw_opsÚbudgetÚall_budgetsr?  rÆ  rö  rq   r2  rò  ró  rC  rD  r!  r:  Úsorted_sizesÚtotal_activations_size_gbÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountsÚrematerialized_opss$                                       rM   r%  r%  �  sù  € ðD ×Ñ×*Ñ*Ô,Ø×ÑÔà×Ñ€Dô ‡z‚zÜ  Ó&ˆ	Ø&ˆÔØ×$Ñ$€Kä!5°lÓ!CÐÜ%=¸lÓ%KÐ"Ù!Ü-¨lÐQVÔWˆÜ×:Ò:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ð,Ø(*Ð%ÜØÐ3°_ó€Iô ˆ9×&Ñ&Ó'¨1Ò,Ü ØØØ+Ø*GØ(1×(MÑ(Mô
ð 	
ô ˜×+Ñ+×1Ñ1Ó2ò RˆØ�7‰7�hÒÜ # C£ˆDÕØ×)Ñ)¨$Ô/Ø !ˆDÕä # C£ˆDÔØŸ
™
ò R�Ü$'¨×(9Ñ(9¸4×;LÑ;LÈqÑ;PÓ$Q�Õ!ñRðRô( ×3Ñ3€MØ×!Ñ!ò ˆÜ�d—i‘i—m‘m O°TÓ:¼EÕBØ ŸI™I oÑ6ˆMÙðô )3«€NØ(*ÐØ×!Ñ!ò ,ˆÜ.¨tÓ4ˆØÐØ×Ñ˜vÕ&Ø�W‰W˜Ó'¨I×,DÑ,DÀTÕ,JØ×%Ñ% dÕ+ð,ô &0°Ó%?€KØ×,Ñ,Ó.ò 4‰ˆˆ3Ü�cœ2Ÿ>™>Õ*¨s¯y©yÀÒ/KØŸ	™	Ÿ™ò 4�Ü1°$Ó7�Ø�=Ø—O‘O AÕ&Ø—W‘W Ó/Ø&×-Ñ-¨dÕ3ñ4ð4ô ˆ;Ó˜!ÒÜðä! +Ó.Ð/ð 03ð4ó
ð 	
ñ ÙÜðSäÐ)Ó*Ð+ð ,$ð 6HÖ$H° Q§V£VÒ$HÐ#IÈðLóð ô œT +Ó.Ó/ˆÜ*ØØØ#ô€Lô ×(Ò(Ü1°+¸|ÓLˆäÜÙGÈó	
ó€Oô
 œf¤^°\ÓBÓCÐÜÜÑEÀ|ÓTó€Lô
 4ØØà'Ø-Ø'Ø$-×$IÑ$IôÑ€Iˆyñ "Ù)Ü#8Ø˜i¨´C¸Ó4Hó$Ñ ˆI�yô 4°IÓ>€Iô ×*Ò*õ	
ñ 	%ØØØØ×1Ñ1ô		
ô ˜yÓ)€IÜ˜yÓ)€Iä.¨yÀeÔL€IÜ.¨yÀdÔK€Iæä¸lÖK¸¤¨£¬S°«VÒ4ÒKÓLˆô %(Ñ'J¸\Ô'JÓ$JÈSÑ$PÐ!Ü�‰Ð:Ð<UÔVô 	�‰Ð?ÀÔNÜ$ñ %
Ø"+§/¡/×"7Ñ"7ô%
ó 
ˆô %ñ %
Ø"+§/¡/×"7Ñ"7ô%
ó 
ˆð &¨Ñ7ˆä!,¬SÓ!1ˆØ—O‘O×)Ñ)ò 	>ˆDØ�y‰y˜KÒ'¬G°D·K±KÐARÕ,SØ”s˜4Ÿ;™;×6Ñ6Ó7Ó8¸AÑ=Ô8ð	>ô 	�‰Ø%Ü�ÓÜ�Ó Ü�Ó ô		
ô $Ø�L‰L‹N¤× 3Ñ 3°AÓ 6Àô
Ðô 	�‰Ð2Ð4FÔGØ�iÐÐùòy %Iùò| Ls   ÍYÒ)Yc                ód  — |rWt        j                  | j                  «      }t        j                  | |«      } | j                  j
                  D ]	  }i |_        Œ t        j                  j                  |«      \  }	}
|
sdt        j                  z   }
t        j                  d|	|
«       t        j                  | |||¬«      }|j!                  «       }|	› |
› �}|
j#                  d«      }|dv r|j%                  |«       y |€t'        |d|z   «      } ||«       y t'        |d|z   «      } |||¬«       y )Nrk  zWriting FX graph to file: %s%s)Úparse_stack_traceÚdot_graph_shape>   ÚdotÚrawÚwrite_)Úprog)rÄ  Údeepcopyr©   rÊ   r€  rª   r‘   r¤  r¥  Úsplitextr   Útorch_compile_graph_formatr@   r|  r#   ÚFxGraphDrawerÚget_main_dot_graphÚlstriprg  rÂ   )ÚtracedÚfnameÚfignameÚ
clear_metarH  rC  rD  rü   rL   r‡  ÚextÚgrß   Úgraph_formatÚwrite_methods                  rM   Ú
draw_graphrW  {  s  € ñ Ü—M‘M &§,¡,Ó/ˆ	Ü—‘ ¨	Ó2ˆØ—L‘L×&Ñ&ò 	ˆDØˆD�Ið	ä—‘× Ñ  Ó'�I€Dˆ#ÙØ”F×5Ñ5Ñ5ˆÜ‡H�HÐ-¨t°SÔ9Ü×"Ñ"ØØØ+Ø'ô		€Að 	
×ÑÓ€AØˆf�S�EˆN€EØ—:‘:˜c“?€LØ�~Ñ%ð 	
�‰��Ø	ˆÜ˜q (¨\Ñ"9Ó:ˆÙ�UÕä˜q (¨\Ñ"9Ó:ˆÙ�U Ö&rO   rX   )r¬   r¸  rZ   r>   )rL   rY   rZ   r…   )rÍ   rY   rZ   úfx.Node | None)rL   rY   rZ   rX  )rL   rY   r×   zdict[fx.Node, Any]rZ   rX  )NF)r÷   r˜  rd   rc   rø   rc   rù   zlist[AOTOutput]rú   r[  rû   r>   rZ   r˜  )r)  r¸  r*  r…   rZ   zEtuple[list[fx.Node], list[fx.Node], list[AOTOutput], list[AOTOutput]])r2  rc   rè   r¾   rZ   r}  )r8  z#list[fx.Node] | tuple[fx.Node, ...]rZ   r…   )g      ì@r�  r   )r©   rý  rL   rß  rL  r`  rM  r`  rN  r…   rZ   rß  )r©   rý  rL   rß  rU  rß  rZ  útorch.dtyperG  r`  rY  r`  rN  r…   rZ   rß  )rd  r»  rZ   r`  )rZ   zlist[torch.dtype])rL   rß  rZ   r>   )rZ   rY  )ro  rY  rZ   ztuple[float, float])r   )r©   rý  r*  r…   rZ   r}  )r©   rý  rZ   r}  )
r´  r¸  rÁ  r¸  rË  r¹  r*  r…   rZ   r}  )Nr   )r2  rc   r´  r¸  rÁ  r¸  rl   úOrderedSet[fx.Node] | Noner*  r…   rZ   r}  rI   )r)  r¸  r2  rc   rò  rc   ró  zlist[fx.Node] | Noner*  r…   rl   rZ  rû   r>   rÝ  r>   rZ   ú%tuple[fx.GraphModule, fx.GraphModule])r)  r¸  r;  r	   r*  r…   r  úlist[int] | Nonerl   rZ  rZ   r[  )rb  r…   ro  rY  rZ   r…   )r©   r˜  rZ   r}  )rZ   z!list[torch._ops.OpOverloadPacket])rÉ   rà  rn  rj   rZ   zlist[tuple[fx.Node, int]])r�  r¸  rZ   r¸  )rC  útorch.fx.GraphModulerD  r]  r’  rß  r“  rß  r”  ztorch.devicer•  r…   r–  rß  r—  rß  rZ   z#tuple[torch.fx.Node, torch.fx.Node])
r)  r¸  rC  r¸  rD  r¸  rÆ  r…   rZ   r[  )r)  r¸  rZ   r}  )r)  r¸  r  r>   rZ   r¸  )
r÷   r˜  rA  rb   r  r‰   r  rZ  rZ   z)tuple[list[fx.Node], OrderedSet[fx.Node]])r   únx.DiGraph[str, dict[str, Any]]rZ   z!list[tuple[str, str, str]] | None)r§  r¾   r¨  r¾   rZ   r¾   )r   r^  rZ   ztuple[str | None, str | None])rZ   rB   )r©   r˜  rZ   r¹  )r÷   r˜  r@  úlist[float]rA  r_  rB  r`  rA  rb   r6  rc   rZ   z"tuple[float, list[int], list[int]])rß   r»  rM  r…   rZ   r»  )rL   rY   rZ   r`  )r'   )r÷   r˜  rA  rb   r‚  r`  rZ   rc   )r©   rý  rZ   zdict[torch.fx.Node, str])r÷   rý  r2  úlist[torch.fx.Node]rZ   r`  )r  r¸  r  r>   rZ   r¸  )r)  r¸  r  z	list[int]r*  r…   rZ   rb   )r‚  )r)  r¸  r;  r	   r5  r¾   r*  r…   r  r\  rZ   r[  )Úfx_graphTNFN)rO  r]  rP  r¾   rQ  r¾   rR  r>   rH  zstr | list[str] | NonerC  r>   rD  r[  rZ   r}  )ÇÚ
__future__r   rÄ  r†   rÎ  r&  rë  Úloggingr~  rÇ   r¤  Úos.pathrÅ  r#  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   rþ  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]  rL  ÚsympyÚdebug_partitionerr?   r_   Ú	getLoggerr[   r@   rœ   r�   rD  rB   rb   r‰   r–   r§   r­   r³   r¹   r»   rÃ   rê   rÐ   rÕ   rØ   r  r  r  r  r  r  r  rë   ré   r/  r4  r;  rV  r`  rf  rp  rw  ry  r}  r�  r¢  rÔ  rÜ  r  rE  r…   r  rH  rZ  rc  Úcacherl  rq  r8  r¡  r7  r(  r)  r*  rã  r&  r˜  ri  re  rk  r\  rl  rF  r   rH  rP  rf  rÈ  rÔ  rä  r6  r:  r+  r%  rW  r`   rO   rM   ú<module>rŒ     s(  ðÞ "ã Û Û Û Û Û Û Û Û 	Û Û 	Û ß *Ý $ß *ß %ã Û %Û Ý ß $Ð $ß <õõ AÝ 5÷õ @Ý +ß 7Ý .Ý AÝ ?ß Hß L÷÷ õ )Ý <Ý /Ý 3å Ý L÷ó õ L÷ñ õ
 AÝ 7Ý ;÷÷ ñ ÷ IÑ Hñ ÛÛð %×6Ñ6Ð �tÓ 6Ø'�g×'Ñ'¨Ó1€€^Ó 1à‡y�y‡~�~€Ø�	‰	�‰€ð ÷>ð >ó ð>ð2 ÷ ð  ó ð ðB ÷ð ó ðóóóóó÷ñ óIñ Ó€óó2-ðØ
ðà	ðð óðH  Ø$)ðrØðràðrð ðrð #ð	rð
 ðrð "ðrð órójóXóCóBóJóKóó5ðJØ ðJØ69ðJàJóJó$ðØ;ðàóð ØØðKØðKà
ðKð 
ðKð 
ð	Kð
 ðKð óKð\C!ØðC!à
ðC!ð ðC!ð ð	C!ð
 ðC!ð ðC!ð ðC!ð óC!óL9ó"óGó45ó	ôFGóRMGðh ð	XØðXàðXð *ðXð ð	Xð
 
óXð~ ?CØð'
Øð'
àð'
ð ð'
ð "<ð	'
ð
 ð'
ð 
ó'
ð\ 04ð	o"ð ?CØ$)Ø&+ño"Ø ðo"àðo"ð #ðo"ð -ð	o"ð ðo"ð "<ðo"ð "ðo"ð  $ðo"ð +óo"ðn 7;Ø>Bñj Ø ðj àðj ð ð	j ð
 $4ðj ð "<ðj ð +ój ñZ ˆc‹(€ó"ó)óZRð ‡‚òó ðð PØ
ðPØ&8ðPàóPóKð\[*Ø#ð[*à#ð[*ð ð[*ð ð	[*ð
 ð[*ð ð[*ð "ð[*ð "ð[*ð )ó[*ð|a Ø ða àða ð ða ð ð	a ð
 +óa óH@ó'ó<ó.Kð5Ø ð5Ø;?ð5àó5ðx ,0ð	v	&Øðv	&àðv	&ð #ðv	&ð )ð	v	&ð
 /óv	&ðrØ-ðà&óóB/ð$!Ø-ð$!à"ó$!óNfóRð-TØð-Tàð-Tð ð-Tð ð	-Tð
 ð-Tð $1ð-Tð (ó-Tõ` 0ó5ó*Nð` ðD	ØðD	àðD	ð ðD	ð ó	D	óN$óN@IðF`Øð`Ø/Bð`àó`ðFOØðOØ)-ðOàóOðd>Ø ð>à#,ð>ð ð>ð ó	>ðH ðk ð 7;ñk Ø ðk àðk ð ðk ð
 ðk ð $4ðk ð +ók ðb ØØ#'Ø#Ø"&ð%'Ø ð%'àð%'ð ð%'ð ð	%'ð
 !ð%'ð ð%'ð  ð%'ð 
ô%'rO   