+
    –°³jª± ã                  ó0  a € 0 t $ ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIHtHt ^ RIHtHt ^ RIHtHtHt ^ RIt^ RIt^ RIt^ RIt^ RI H!t! ^ RI"H#u H$t% ^ RI&H't'H(t( ^ RI)H*t* ^ R	I+H,t, ^ R
I-H.t. ^ RI/H0t1 ^ RI2H3t3H4t4 ^ RI5H6t7H8t8 ^ RI9H:t: ^ RI;H<t< ^ RI=H>t> ^ RI?H@t@HAtA ^ RIBHCtC ^ RIDHEtE ^ RIFHGtG ^ RIHHItI ^ RIJHKtKHLtL ^ RIMHNtNHOtOHPtP ^ RIQHRtRHStSHTtTHUtUHVtVHWtWHXtXHYtY ^ RIZH[t[ ^ RI\H]t] ^ RI^H_t_ ^ RI`Hata ^RIbH0t0 ^RIcHdtd ^RIeHftfHgtgHhthHiti ^RIjHktk ^R IlHmtmHntnHoto ^R!IpHqtq ^R"IrHsts ^R#ItHutu ^R$IvHwtwHxtxHytyHztzH{t{H|t|H}t} ^R%I~HtH€t€H�t� ]'       d   ^ RI‚tƒ]0EP                  t…R&]†R'&   ]EP                  ! ]ˆ4      t‰R(]†R)&   ]EP                  EP                  t‹]EP                  EP                  tŒ] ! R* R+4      4       t�] ! R, R-4      4       tŽ] ! R. R/4      4       t�R0 R1 lt�R2 R3 lt‘R4 R5 lt’R6 R7 lt“R8 R9 lt”R: R; lt•R< R= lt–R> R? lt— ! R@ RA4      t˜RB RC lt™]˜! 4       tšRD RE lt›RF RG ltœRH RI lt�RJ RK ltžRL RM ltŸRN RO lt RP RQ lt¡RÍRS RT llt¢RU RV lt£RW RX lt¤RY RZ lt¥R[ R\ lt¦R] R^ lt§R_ R` lt¨Ra Rb lt©Rc Rd ltªRe Rf lt«Rg Rh lt¬Ri Rj lt­Rk Rl lt®Rm Rn lt¯RÎRo Rp llt°Rq Rr lt±Rs Rt lt²Ru Rv lt³Rw Rx lt´Ry Rz ltµR{ R| lt¶RÏR} R~ llt·R R€ lt¸RÏR� R‚ llt¹RÐRƒ R„ lltºRÑR…RR†RRR‡RR/Rˆ R‰ lllt»RŠRR…R/R‹ RŒ llt¼]½! R�4      t¾RŽ R� lt¿R� R‘ ltÀR’ R“ ltÁ]EP„                  R” R• l4       tÃR– R— ltÄR˜ R™ ltÅRš R› ltÆRœ R� ltÇRž RŸ ltÈR  R¡ ltÉR¢ R£ ltÊR¤ R¥ ltËR¦ R§ ltÌRÑR¨ R© lltÍRª R« ltÎR¬ R­ ltÏR® R¯ ltÐR° R± ltÑR² R³ ltÒR´ Rµ ltÓ^ R¶IÔHÕtÕ R· R¸ ltÖR¹ Rº lt×RÒR» R¼ lltØR½ R¾ ltÙR¿ RÀ ltÚRÁ RÂ ltÛRÃ RÄ ltÜRÅ RÆ ltÝRÇ RÈ ltÞRÓRŠR/RÉ RÊ llltßRÔRË RÌ lltàR# )Õé    )ÚannotationsN)ÚdefaultdictÚdeque)ÚCallableÚIterator)Ú	dataclassÚreplace)ÚAnyÚcastÚTYPE_CHECKING)ÚcountersÚis_node_meta_valid)Ú(create_structured_trace_for_min_cut_info)Ú	_SYNC_OPS)Úis_with_effects)Úconfig)ÚCustomKnapsackSolverÚCustomRuntimeEstimator)Úcontrol_depsÚget_subgraph_name)ÚFakeScriptObject)Úis_opaque_value)Ú
is_builtin)Ú
LazyStringÚtrace_structured)Ú	trace_log)Úextract_tensor_metadata)Úis_sparse_any)ÚBackwardState)Úis_sym_nodeÚpy_sym_types)Úmagic_methodsÚmethod_to_operatorÚSymNode)Ú_get_placeholder_exprÚfind_symbol_binding_fx_nodesÚfree_symbolsÚis_symbol_binding_fx_nodeÚis_symbolicÚ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                  óŠ   € ] tR t^kt$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R R	 ltR
 R ltR R ltR R lt	R R lt
RtR# )ÚOpTypesz8Class for keeping track of different operator categorieszOrderedSet[Callable[..., Any]]Úfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsc               ó    € V ^8„  d   QhRRRR/# ©é   Únodeúfx.NodeÚreturnrG   © )Úformats   "Ú^/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_functorch/partitioners.pyÚ__annotate__ÚOpTypes.__annotate__u   s   € ÷ 9ñ 9˜wð 9¨4ñ 9ó    c                	ó2   € \        V4      V P                  9   # ©N)rE   rL   ©ÚselfrT   s   &&rY   Ú
is_fusibleÚOpTypes.is_fusibleu   s   € Ü˜tÓ$¨×(8Ñ(8Ñ8Ð8r\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   r[   x   s   € ÷ Cñ C¨ð C°Tñ Cr\   c                	ó2   € \        V4      V P                  9   # r^   )rE   rM   r_   s   &&rY   Úis_compute_intensiveÚOpTypes.is_compute_intensivex   s   € Ü˜tÓ$¨×(BÑ(BÑBÐBr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   r[   {   s   € ÷ 8ñ 8˜gð 8¨$ñ 8r\   c                	ó2   € \        V4      V P                  9   # r^   )rE   rN   r_   s   &&rY   Ú	is_randomÚOpTypes.is_random{   s   € Ü˜tÓ$¨¯©Ñ7Ð7r\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   r[   ~   s   € ÷ 6ñ 6˜Gð 6¨ñ 6r\   c                	ó2   € \        V4      V P                  9   # r^   )rE   rO   r_   s   &&rY   Úis_viewÚOpTypes.is_view~   s   € Ü˜tÓ$¨¯©Ñ5Ð5r\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   r[   �   s   € ÷ >ñ > Gð >°ñ >r\   c                	ó2   € \        V4      V P                  9   # r^   )rE   rP   r_   s   &&rY   Úis_recomputableÚOpTypes.is_recomputable�   s   € Ü˜tÓ$¨×(=Ñ(=Ñ=Ð=r\   rW   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__ra   re   ri   rm   rq   Ú__static_attributes__rW   r\   rY   rK   rK   k   sB   ‡ áBà/Ó/Ø9Ó9Ø.Ó.Ø,Ó,Ø4Ó4õ9õCõ8õ6÷>ñ >r\   rK   c                  ó¸   € ] tR t^…t$ R]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   ]P                  R R l4       tR R ltR R lt	R R lt
R R ltRtR# )Ú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               ó   € V ^8„  d   QhRR/# )rS   rV   r|   rW   )rX   s   "rY   rZ   ÚNodeInfo.__annotate__“   s   € ÷ 
ñ 
 =ñ 
r\   c                	óH   a € \        R  S P                   4       V 3R lR7      # )c              3  ó$   "  € T F  qx € K  	  R # 5ir^   rW   ©Ú.0Úns   & rY   Ú	<genexpr>Ú-NodeInfo.required_fw_nodes.<locals>.<genexpr>•   s   é € Ð0Ñ/�1ŒQÓ/ùs   ‚c                ó*   <€ SP                   V ,          # r^   )r„   )rŒ   r`   s   &€rY   Ú<lambda>Ú,NodeInfo.required_fw_nodes.<locals>.<lambda>•   s   ø€ ÀÇÁÈaÖ@Pr\   ©Úkey)Úsortedr   ©r`   s   frY   Úrequired_fw_nodesÚNodeInfo.required_fw_nodes’   s!   ø€ äÙ0˜×/Ò/Ó0Ô6Pô
ð 	
r\   c               ó    € V ^8„  d   QhRRRR/# ©rS   rŒ   rU   rV   rG   rW   )rX   s   "rY   rZ   r‡   ˜   s   € ÷ ,ñ , ð ,¨Dñ ,r\   c                	ó   € WP                   9   # r^   )r   ©r`   rŒ   s   &&rY   Úis_required_fwÚNodeInfo.is_required_fw˜   s   € Ø×+Ñ+Ñ+Ð+r\   c               ó    € V ^8„  d   QhRRRR/# r™   rW   )rX   s   "rY   rZ   r‡   ›   s   € ÷ +ñ + ð +¨Dñ +r\   c                	ó   € WP                   9   # r^   )r€   r›   s   &&rY   Úis_required_bwÚNodeInfo.is_required_bw›   s   € Ø×*Ñ*Ñ*Ð*r\   c               ó    € V ^8„  d   QhRRRR/# r™   rW   )rX   s   "rY   rZ   r‡   ž   s   € ÷ )ñ )˜gð )¨$ñ )r\   c                	ó   € WP                   9   # r^   )r‚   r›   s   &&rY   Úis_unclaimedÚNodeInfo.is_unclaimedž   s   € Ø×(Ñ(Ñ(Ð(r\   c               ó    € V ^8„  d   QhRRRR/# )rS   rŒ   rU   rV   ÚintrW   )rX   s   "rY   rZ   r‡   ¡   s   € ÷  ñ  ˜gð  ¨#ñ  r\   c                	óf   € WP                   9  d   \        R V R24      hV P                  V,          # )úNode z not in fw nodes!)r   ÚAssertionErrorr„   r›   s   &&rY   Úget_fw_orderÚNodeInfo.get_fw_order¡   s2   € Ø×+Ñ+Ô+Ü  5¨¨Ð+<Ð!=Ó>Ð>Ø�}‰}˜QÕÐr\   rW   N)rs   rt   ru   rv   rx   Ú	functoolsÚcached_propertyr–   rœ   r    r¤   r«   ry   rW   r\   rY   r{   r{   …   s_   ‡ ð ÓØ+Ó+Ø*Ó*Ø)Ó)Ø(Ó(Ø Ó à!4Ó4à×Ñô
ó ð
õ
,õ+õ)÷ ñ  r\   r{   c                  óJ   € ] tR t^§t$ R]R&   R]R&   R]R&   R]R&   R]R&   RtR# )	ÚMinCutOptionsrG   Úban_if_used_far_apartÚban_if_long_fusible_chainsÚban_if_materialized_backwardÚban_if_not_in_allowlistÚban_if_reductionrW   N)rs   rt   ru   rv   rx   ry   rW   r\   rY   r°   r°   §   s    ‡ àÓØ $Ó$Ø"&Ó&Ø!Ó!Ø×r\   r°   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   °   s   € ÷ ñ ˜ð  Tñ r\   c                ó|   € V P                   P                  R R4      \        P                  \        P                  39   # )Ú	recomputeN)ÚmetaÚgetr0   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©rT   s   &rY   Úmust_recomputer¾   °   s5   € Ø�9‰9�=‰=˜ dÓ+Ü×'Ñ'Ü×)Ñ)ð0ñ ð r\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   ÚtargetÚobjectÚarg_nameÚstrrV   z
int | NonerW   )rX   s   "rY   rZ   rZ   ·   s!   € ÷ ñ ˜vð °ð ¸ñ r\   c                óØ   € \        V \        P                  P                  4      '       g   R# \	        V P
                  P                  4       F  w  r#VP                  V8X  g   K  Vu # 	  R# )zAReturn the positional schema index for an operator argument name.N)Ú
isinstanceÚtorchÚ_opsÚ
OpOverloadÚ	enumerateÚ_schemaÚ	argumentsÚname)rÀ   rÂ   ÚidxÚargs   &&  rY   Úget_schema_arg_idxrÏ   ·   sM   € ä�fœeŸj™j×3Ñ3×4Ò4ÙÜ˜fŸn™n×6Ñ6Ö7‰ˆØ�8‰8�xÖØŠJñ 8ñ r\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   Á   s   € ÷ Sñ S 'ð S¨dñ Sr\   c                ó  € V P                   p\        V\        P                  P                  4      '       g   R# \        VR4      pVf   R# VP                  P                  V,          p\        V P                  4      V8”  d   V P                  V,          pMBRV P                  9   d   V P                  R,          pMVP                  e   VP                  pMR# \        \        \        \        P                  ,          VR8H  4      4      '       * # )zJReturn True unless SDPA-family dropout is statically known to be disabled.TÚ	dropout_pç        )rÀ   rÅ   rÆ   rÇ   rÈ   rÏ   rÊ   rË   ÚlenÚargsÚkwargsÚdefault_valuer,   r   rG   ÚSymBool)rT   rÀ   Údropout_arg_idxÚdropout_argrÒ   s   &    rY   Úis_nonzero_dropout_sdparÛ   Á   sÃ   € à�[‰[€FÜ�fœeŸj™j×3Ñ3×4Ò4Ùä(¨°Ó=€OØÒÙà—.‘.×*Ñ*¨?Õ;€KÜ
ˆ4�9‰9ƒ~˜Ô'Ø—I‘I˜oÕ.‰	Ø	˜Ÿ™Ô	#Ø—K‘K Õ,‰	Ø	×	"Ñ	"Ò	.Ø×-Ñ-‰	áä$¤T¬$´·±Õ*>À	ÈSÑ@PÓ%QÓRÔRÐRr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   Ø   s   € ÷ ñ �Gð  ñ r\   c                óî   € \        V P                  R4      '       d4   \        P                  P                  V P                  P
                  9   g   R# \        V P                  R4      e   \        V 4      # R# )zOReturn True when a node's seeded nondeterminism cannot be statically ruled out.ÚtagsFrÒ   T)ÚhasattrrÀ   rÆ   ÚTagÚnondeterministic_seededrÞ   rÏ   rÛ   r½   s   &rY   Ú	is_rng_oprâ   Ø   sS   € ô 	�—‘˜V×$Ò$Ü�I‰I×-Ñ-°·±×1AÑ1AÔAáä˜$Ÿ+™+ {Ó3Ò?Ü& tÓ,Ð,ár\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   æ   s   € ÷ ñ  'ð ¨dñ r\   c                óH  € \        V P                  P                  R 4      \        P                  4      ;'       di    \        V P                  4      ^ 8„  ;'       dI    \        ;QJ d&    R V P                   4       F  '       d   K   R# 	  R# ! R V P                   4       4      # )Úvalc              3  ó”   "  € T F>  qP                   \        P                  P                  P                  P
                  J x € K@  	  R # 5ir^   )rÀ   rÆ   ÚopsÚatenÚ_assert_scalarÚdefault©r‹   Úusers   & rY   r�   Ú*_is_assert_only_symbool.<locals>.<genexpr>ê   s.   é € ð 
ÙMWÀT�K‰Kœ5Ÿ9™9Ÿ>™>×8Ñ8×@Ñ@Õ@ËZùs   ‚AAFT)rÅ   r¹   rº   rÆ   rØ   rÔ   ÚusersÚallr½   s   &rY   Ú_is_assert_only_symboolrð   æ   sŠ   € ä�4—9‘9—=‘= Ó'¬¯©Ó7÷ 	
ð 	
Ü�—
‘
‹O˜aÑ÷	
ð 	
ç‹Cñ 
ØMQÏZÊZó
�CŒCðò ðð ñ 
ØMQÏZÊZó
ó 
ðr\   c               ó    € V ^8„  d   QhRRRR/# ©rS   Úfx_gúfx.GraphModulerV   rG   rW   )rX   s   "rY   rZ   rZ   ð   s   € ÷ ñ ˜~ð °$ñ r\   c                óh   € V P                   P                   F  p\        V4      '       g   K   R # 	  R# ©TF)ÚgraphÚnodesr¾   ©ró   rT   s   & rY   Úhas_recomputable_opsrú   ð   s)   € Ø—
‘
× Ô ˆÜ˜$×ÔÚñ !ñ r\   c               ó    € V ^8„  d   QhRRRR/# rò   rW   )rX   s   "rY   rZ   rZ   ÷   s   € ÷ ñ  >ð °dñ r\   c                óŽ   € V P                   P                   F*  p\        V4      '       g   K  \        V4      '       g   K)   R # 	  R# rö   )r÷   rø   r¾   râ   rù   s   & rY   Úhas_recomputable_rng_opsrý   ÷   s1   € Ø—
‘
× Ô ˆÜ˜$×Ô¤I¨d§O¤OÚñ !ñ r\   c               ó    € V ^8„  d   QhRRRR/# ©rS   rT   rU   rV   r§   rW   )rX   s   "rY   rZ   rZ   þ   s   € ÷ ñ ˜ð  Cñ r\   c                ó>  € \        V P                  R ,          \        P                  \        P                  34      '       d   ^# \        V P                  R ,          \        P
                  4      '       g)   \        R\        V P                  R ,          4       24      h^# )rå   z.expected node.meta['val'] to be SymFloat, got )rÅ   r¹   rÆ   ÚSymIntrØ   ÚSymFloatrª   Útyper½   s   &rY   Úsym_node_sizer  þ   sm   € Ü�$—)‘)˜EÕ"¤U§\¡\´5·=±=Ð$A×BÒBÙÜ�d—i‘i Õ&¬¯©×7Ò7ÜØ<¼TÀ$Ç)Á)ÈEÕBRÓ=SÐ<TÐUó
ð 	
ñ r\   c                  ó"   € ] tR tRtR R ltRtR# )ÚInvalidNodeBasei  c               ó   € V ^8„  d   QhRR/# )rS   rV   rÃ   rW   )rX   s   "rY   rZ   ÚInvalidNodeBase.__annotate__	  s   € ÷ ñ ˜#ñ r\   c                	ó   € R # )zInvalid NoderW   r•   s   &rY   Ú__repr__ÚInvalidNodeBase.__repr__	  s   € Ùr\   rW   N)rs   rt   ru   rv   r
  ry   rW   r\   rY   r  r    s   † ÷ñ r\   r  c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ     s   € ÷ Iñ I˜Gð I¨ñ Ir\   c                ó6   € \        V P                  R R4      R8g  # )Ú	namespaceNÚ_c10d_functional)ÚgetattrrÀ   r½   s   &rY   Úis_not_collectiver    s   € Ü�4—;‘; ¨TÓ2Ð6HÑHÐHr\   c               ó    € V ^8„  d   QhRRRR/# )rS   Úgetitem_noderU   rV   úfx.Node | NonerW   )rX   s   "rY   rZ   rZ     s   € ÷ ñ ¨Gð ¸ñ r\   c                óª  € V P                   \        P                  8w  d   R# V P                  ^ ,          pV P                  ^,          p\	        V\
        P                  4      '       d   VP                  R8w  d   R# RVP                  9  d   R# VP                  R,          pW#9  d   R# W2,          p\	        V\
        P                  4      '       d   V# R# )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.
NÚcall_functionrÖ   )	rÀ   ÚoperatorÚgetitemrÕ   rÅ   ÚfxÚNodeÚoprÖ   )r  Ú	ho_resultr“   rÖ   Úoriginal_inputs   &    rY   Ú_get_ho_op_original_inputr    s¥   € ð ×Ñœh×.Ñ.Ô.ÙØ×!Ñ! !Õ$€IØ
×
Ñ
˜AÕ
€CÜ�i¤§¡×)Ò)¨Y¯\©\¸_Ô-LÙØ�y×'Ñ'Ô'ÙØ×Ñ˜hÕ'€Fà
ÔÙà•[€NÜ�.¤"§'¡'×*Ò*ØÐÙr\   c               ó    € V ^8„  d   QhRRRR/# )rS   rT   rU   rV   r  rW   )rX   s   "rY   rZ   rZ   .  s   € ÷ -ñ - ð -¨Nñ -r\   c                ó\  € V P                   \        P                  P                  P                  P
                  \        P                  P                  P                  P
                  39  d   R# V P                  ^ ,          p\        V\        P                  4      '       g   R# \        V4      # )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.
N)rÀ   rÆ   rç   rè   Úviewrê   ÚreshaperÕ   rÅ   r  r  r  )rT   Úsources   & rY   Ú_is_copy_node_bw_onlyr$  .  sl   € ð ‡{�{œ5Ÿ9™9Ÿ>™>×.Ñ.×6Ñ6¼¿	¹	¿¹×8NÑ8N×8VÑ8VÐWÔWÙØ�Y‰Y�q�\€FÜ�fœbŸg™g×&Ò&ÙÜ$ VÓ,Ð,r\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   rT   rU   Úenvúdict[fx.Node, Any]rV   r  rW   )rX   s   "rY   rZ   rZ   <  s&   € ÷ ñ Ø
ðà	ðð ñr\   c                óê   € \        V 4      pVe+   W!9   d%   \        W,          \        4      '       g	   W,          # \        V 4      pVe+   W!9   d%   \        W,          \        4      '       g	   W,          # R# )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  )rT   r&  r  s   && rY   Ú_find_input_for_invalid_outputr)  <  se   € ô +¨4Ó0€NàÒ"ØÔ!Ü˜3Õ.´×@Ò@àÕ"Ð"ä.¨tÓ4€NàÒ"ØÔ!Ü˜3Õ.´×@Ò@àÕ"Ð"Ùr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   [  s   € ÷ ñ  Gð °ñ r\   c                ó€  € V P                   ^,          p\        V\        P                  4      '       d2   VP                  R8X  d!   \        VP
                  \        4      '       g   \        RV 24      hV P                  P                  pVf   \        R4      h\        W!P
                  4      p\        V\        P                  4      '       g   \        R\        V4       24      h\        ;QJ d0    R VP                  P                   4       F  '       g   K   R# 	  R# ! R VP                  P                   4       4      # )z=Check if a control_deps node's subgraph has a sync operation.Úget_attrú%expected get_attr subgraph node, got ú'expected graph to have an owning_moduleúexpected GraphModule, got c              3  ót   "  € T F.  qP                   R 8H  ;'       d    VP                  \        9   x € K0  	  R# 5i©r  N)r  rÀ   r   rŠ   s   & rY   r�   Ú,_control_deps_has_sync_op.<locals>.<genexpr>j  s/   é € ð ÙCU¸a�‰�Ñ×9Ð9 A§H¡H´	Ñ$9Ô9ÓCUùs   ‚8œ8TF)rÕ   rÅ   r  r  r  rÀ   rÃ   rª   r÷   Úowning_moduler  ÚGraphModuler  Úanyrø   )rT   Úsg_nodeÚ
owning_modÚsg_mods   &   rY   Ú_control_deps_has_sync_opr9  [  sö   € à�i‰i˜�l€Gä�7œBŸG™G×$Ò$Ø�J‰J˜*Ô$Ü�w—~‘~¤s×+Ò+äÐDÀWÀIÐNÓOÐOØ—‘×)Ñ)€JØÒÜÐFÓGÐGÜ�Z§¡Ó0€FÜ�fœbŸn™n×-Ò-ÜÐ9¼$¸v»,¸ÐHÓIÐIß‹3ñ ØCIÇ<Á<×CUÒCUó�3Œ3ð Š3ð ˆ3ñ ØCIÇ<Á<×CUÒCUóó ð r\   c               ó    € V ^8„  d   QhRRRR/# )rS   Úcd_noderU   rV   zdict[int, fx.Node]rW   )rX   s   "rY   rZ   rZ   o  s   € ÷ Rñ R Gð RÐ0Bñ Rr\   c                óÆ   € V P                   R,          p\        V4       UUu/ uF1  w  r#\        V\        P                  4      '       g   K'  V^,           VbK3  	  upp# u uppi )z»Build a mapping from getitem indices to underlying dep nodes.

For a control_deps(additional_deps, subgraph, *deps), getitem index k
(k >= 1) corresponds to deps[k-1] which is args[k+1].
ºrS   NN)rÕ   rÉ   rÅ   r  r  )r;  ÚdepsÚiÚdeps   &   rY   Ú_build_see_through_maprA  o  sG   € ð �<‰<˜Õ€DÜ%.¨t¤_ÔQ¡_™6˜1¼
À3ÌÏÉ×8PŒJˆA��E�3ŠJ¡_ÒQÐQùÓQs   ¢$AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )rS   Úoriginal_sg_modrô   Úvalid_dep_indicesú	list[int]rV   z&tuple[fx.Graph, dict[int, int]] | NonerW   )rX   s   "rY   rZ   rZ   y  s&   € ÷ 1ñ 1Ø#ð1à ð1ð ,ñ1r\   c                óZ  aa€ V P                   P                  RR7      p\        V4      p\        \        V4       UUu. uF  w  rEWC9  g   K  VNK  	  upp4      oV P                   P                   Fm  pVP
                  R8X  g   K  \        ;QJ d)    V3R lVP                   4       F  '       g   K   RM	  RM! V3R lVP                   4       4      '       g   Kl   R# 	  \        P                  ! 4       p/ oV P                   P                   F6  pVP
                  R8X  g   VS9   d   K  VP                  VS3R	 l4      SV&   K8  	  V P                   P                  4       P                  ^ ,          p\        V\        4      '       dC   TP                  \        ;QJ d    . V3R
 lV 4       F  NK  	  5M! V3R
 lV 4       4      4       MQ\        V\        P                   4      '       d!   VS9   d   VP                  SV,          4       MVP                  V4       \        ;QJ d&    R VP                   4       F  '       g   K   RM	  RM! R VP                   4       4      p	\        V4       U
Uu/ uF  w  r«V^,           V
^,           bK  	  pp
pV	'       d   ^ V^ &   W|3# u uppi u upp
i )aK  Clone a control_deps subgraph, keeping only valid-dep placeholders.

Preserves any call_function nodes (the side-effecting operation) as long
as all placeholders they reference are in the valid set.  Returns
(new_graph, idx_remap) where idx_remap maps old getitem indices to new
ones, or None if the operation uses an invalid dep.
Úplaceholder©r  r  c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir^   rW   )r‹   ÚinpÚdropped_phss   & €rY   r�   Ú5_try_clone_subgraph_filtering_deps.<locals>.<genexpr>Œ  s   øé € ÐCÑ1B¨#˜+Ö%Ó1Bùs   ƒTFNÚoutputc                ó   € W,          # r^   rW   )ÚxÚ_envs   &&rY   r�   Ú4_try_clone_subgraph_filtering_deps.<locals>.<lambda>”  s   € ¸4¾7r\   c              3  óÌ   <"  € T FY  p\        V\        P                  4      '       d
   VS9   g   K,  \        V\        P                  4      '       d
   SV,          MTx € K[  	  R # 5ir^   )rÅ   r  r  )r‹   ÚitemÚsg_envs   & €rY   r�   rL  ™  sK   øé € ð á(�DÜ! $¬¯©×0Ò0°D¸F±Nô D¤
¨4´·±× 9Ò 9��t–¸tÔCÛ(ùs
   ƒ)A$±3A$c              3  ó>   "  € T F  qP                   R 8H  x € K  	  R# 5ir1  rH  rŠ   s   & rY   r�   rL  ¤  s   é € ÐA¹°1—t‘t˜Ö.»ùs   ‚)r÷   Ú
find_nodesr/   rÉ   rø   r  r5  Úall_input_nodesr  ÚGraphÚ	node_copyÚoutput_noderÕ   rÅ   ÚtuplerM  r  )rC  rD  Úorig_phsÚvalid_dep_setr?  ÚphrŒ   ÚsgÚorig_out_argÚpreserved_opÚnew_jÚold_iÚ	idx_remaprK  rT  s   &&           @@rY   Ú"_try_clone_subgraph_filtering_depsre  y  s  ù€ ð ×$Ñ$×/Ñ/°=Ð/ÓA€HÜÐ0Ó1€MÜÜ" 8Ô,ÔGÑ,‘�°Ñ0F�ˆÑ,ÒGó€Kð ×"Ñ"×(Ô(ˆØ�4‰4�?Ö"ß‹sÔC°×1BÒ1BÓC�s�sŠsÔC°×1BÒ1BÓC×CÔCÚñ )ô
 
�Š‹€BØ%'€FØ×"Ñ"×(Ô(ˆØ�4‰4�8Ô˜q KÔ/ÙØ—L‘L °6Ó$BÓCˆˆq‹	ñ )ð
 #×(Ñ(×4Ñ4Ó6×;Ñ;¸AÕ>€LÜ�,¤×&Ò&Ø
�	‰	ßŒEô á(ó�E‰Eô á(óó õ	
ô 
�L¤"§'¡'×	*Ò	*¨|¸vÔ/EØ
�	‰	�&˜Õ&Õ'à
�	‰	�,Ôç“3ÑA¸¿ºÓA—3—3’3ÑA¸¿ºÓAÓA€Lä1:Ð;LÔ1Mô!Ù1M¡ ˆ��	�5˜1•9ÒÑ1Mð ñ !÷ Øˆ	�!‰Øˆ=ÐùóG 	Hùó<!s   ½
J!
ÁJ!
É2J'c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rS   rT   rU   r&  r'  Ú	new_graphúfx.GraphrV   z%tuple[fx.Node, dict[int, int]] | NonerW   )rX   s   "rY   rZ   rZ   ­  s6   € ÷ Rñ RØ
ðRà	ðRð ðRð +ñ	Rr\   c           	     ó  aaa€ V P                   R,          o\        S4       UUu. uFP  w  r4\        V\        P                  4      '       g   K'  \        SP                  V4      \        4      '       d   KN  VNKR  	  pppV'       g   R# \        ;QJ d    . VV3R lV 4       F  NK  	  5M! VV3R lV 4       4      pV P                   ^ ,          p\        V\        \        34      '       g   \        R\        V4       24      h\        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      pV P                  P                  p	V	f   \        R4      hV P                   ^,          p
\        V
\        P                  4      '       d2   V
P                  R8X  d!   \        V
P                  \        4      '       g   \        RV
 24      h\!        WšP                  4      p\        V\        P"                  4      '       g   \        R	\        V4       24      h\%        Wµ4      pVe   Vw  rÞMŒ\        P&                  ! 4       p\)        \+        V4      4       Uu. uF  q=P-                  R
V 24      NK  	  ppVP/                  R.VO54       \        V4       UUu/ uF  w  ppV^,           V^,           bK  	  ppp\1        V	R4      p\3        V	V\        P"                  ! \4        P6                  P9                  4       V4      4       VP;                  V4      pVP=                  R\>        VV.VO5V P@                  R7      pV PB                  PE                  4       Vn!        RV PB                  9   d‰   \        V PB                  R,          \        4      '       db   V PB                  R,          oS^ ,          3\        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      ,           VPB                  R&   VV3# u uppi u upi u uppi )a%  Rebuild a control_deps node with only valid deps for graph extraction.

When a control_deps node mixes valid (forward) and invalid (backward) args,
this creates a new control_deps in new_graph with only the valid deps and a
matching subgraph.  Returns (new_node, idx_remap) where idx_remap maps old
getitem indices to new getitem indices, or None if no valid deps remain.

additional_deps (args[0]) and deps (args[2:]) are filtered independently --
additional_deps are ordering-only constraints and may reference nodes that
are not in the deps set.
r=  Nc              3  óD   <"  € T F  pSSV,          ,          x € K  	  R # 5ir^   rW   )r‹   r?  r>  r&  s   & €€rY   r�   Ú4_rebuild_control_deps_for_extract.<locals>.<genexpr>Ç  s   øé € Ð=Ñ+< a�S˜˜a�—\’\Ó+<ùs   ƒ z)expected tuple/list additional_deps, got c              3  óÈ   <"  € T FW  p\        V\        P                  4      '       g   K%  \        SP                  V4      \        4      '       d   KL  SV,          x € KY  	  R # 5ir^   )rÅ   r  r  rº   r  )r‹   Údr&  s   & €rY   r�   rk  Î  sE   øé € ð "á ˆAÜ�aœŸ™×!ô 	ä*4°S·W±W¸Q³ZÄ×*Qô 	ˆˆA�ŠÛ ùs   ƒ"A"ª"A"ÁA"r.  r,  r-  r/  Údep_Ú
cd_extractr  ©rÕ   rÌ   rå   c              3  ót   <"  € T F-  q^,           \        S4      8  g   K  SV^,           ,          x € K/  	  R# 5i)é   N)rÔ   )r‹   r?  Úorig_vals   & €rY   r�   rk  û  s.   øé € ð 4
Ù%6 ¸a½%Ä#ÀhÃ-Ñ:OŒOˆH�Q˜•U�OŠOÓ%6ùs   ƒ8 8)#rÕ   rÉ   rÅ   r  r  rº   r  r[  Úlistrª   r  r÷   r3  r  rÀ   rÃ   r  r4  re  rX  ÚrangerÔ   rG  rM  r   ÚsetattrrÆ   ÚnnÚModuler,  Úcreate_nodeÚcontrol_deps_hoprÌ   r¹   Úcopy)rT   r&  rg  r?  r@  rD  Únew_depsÚadditional_depsÚvalid_additional_depsr7  r6  rC  Úresultr_  rd  Úsg_placeholdersrb  rc  Úsg_nameÚnew_sg_nodeÚnew_cdr>  rs  s   &f&                  @@rY   Ú!_rebuild_control_deps_for_extractr„  ­  sE  ú€ ð  �9‰9�R�=€Dô   ”oôá%‰FˆAÜ�cœ2Ÿ7™7×#ô 	
ä,6°s·w±w¸s³|Ä_×,U÷ 	
ˆÙ%ð ñ ÷
 Ù÷ ŒuÕ=Ñ+<Ó=�u‰uÕ=Ñ+<Ó=Ó=€Hà—i‘i •l€OÜ�o¬¬t }×5Ò5ÜØ7¼¸_Ó8MÐ7NÐOó
ð 	
÷ "œEô "á ó"ŸE™Eô "á ó"ó Ðð —‘×)Ñ)€JØÒÜÐFÓGÐGà�i‰i˜�l€Gä�7œBŸG™G×$Ò$Ø�J‰J˜*Ô$Ü�w—~‘~¤s×+Ò+äÐDÀWÀIÐNÓOÐOÜ˜j¯.©.Ó9€OÜ�o¤r§~¡~×6Ò6ÜÐ9¼$¸Ó:OÐ9PÐQÓRÐRä/°ÓS€FØÒØ‰ˆˆIä�XŠX‹ZˆÜ?DÄSÈÃ]Ô?SÓTÑ?S¸!Ÿ>™>¨D°°¨*Ö5Ñ?SˆÐTØ
�	‰	�4Ð*˜/Ñ*Ô+ä5>Ð?PÔ5Qô
Ù5Q¡\ U¨EˆE�A�I�u˜q•yÒ Ñ5Qð 	ñ 
ô   
¨LÓ9€GÜˆJ˜¤§¢´·±·±Ó0AÀ2Ó!FÔGØ×$Ñ$ WÓ-€Kà×"Ñ"ØÜØ# [Ð<°8Ñ<Ø�Y‰Yð	 #ó €Fð —)‘)—.‘.Ó"€F„KØ�—	‘	Ôœj¨¯©°5Õ)9¼5×AÒAØ—9‘9˜UÕ#ˆØ& q�k˜^¯e¬eô 4
Ù%6ó4
¯e©eô 4
Ù%6ó4
ó /
õ 
ˆ�‰�EÑð �9ÐÐùóCùòT Uùó
s   ¥$O6Á"O6Á5O6ÉO<ÊPFc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )rS   Újoint_graphrh  r}   r|   ÚoutputsÚoutputs_descszlist[AOTOutput]Úsubgraphú
str | NoneÚignore_must_be_in_fw_bwrG   rV   rW   )rX   s   "rY   rZ   rZ     sW   € ÷ ñ Øðàðð ðð #ð	ð
 ðð "ðð ñr\   c                óz  a€ \         P                  ! 4       p/ o/ p/ pV F4  p	VP                  V	P                  4      p
V	P                  V
n        V
SV	&   K6  	  V P
                   EFÛ  p	V'       gS   \        V	4      '       d   VR8w  d   W‘9  d   \        SV	&   K5  \        V	4      '       d   VR8w  d   W‘9  d   \        SV	&   K^  V	S9   d   Kg  V	P                  R8X  d   \        SV	&   Kƒ  V	P                  R8X  Ed   V	P                  \        P                  J dj   V	P                  ^ ,          V9   dR   W‰P                  ^ ,          ,          pV	P                  ^,          pWË9   d   SW¼,          ,          SV	&   M	\        SV	&   EK  V	P                  \        P                  J d½   V	P                  ^ ,          V9   d¥   WyP                  ^ ,          ,          pV	P                  ^,          pWÍ9   dg   WÜ,          pVP                  R\        P                  SV	P                  ^ ,          ,          V3V	P                  R7      pV	P                  Vn        VSV	&   M	\        SV	&   EKö  \        P                   ! V	P                  / V	P"                  B pV Uu. uF<  p\%        V\         P&                  4      '       g   K%  \%        SV,          \(        4      NK>  	  pp\+        V4      '       dŸ   V	P                  \,        J d   VR8X  dM   \/        V	4      '       g<   \1        V	4      '       g+   \3        V	4      '       d   \5        V	4      W‰&   \        SV	&   EKà  \7        V	SV4      pVe   V^ ,          SV	&   V^,          Wy&   EK  \        SV	&   EK  V	P                  \,        J dT   VR8X  dM   \/        V	4      '       g<   \1        V	4      '       g+   \3        V	4      '       d   \5        V	4      W‰&   \        SV	&   EK~  VP9                  V	V3R l4      SV	&   EKš  V	P                  R8X  d   VP9                  V	V3R	 l4      SV	&   EKÇ  V	P                  R
8X  g   EKÛ  EKÞ  	  . p\;        W#4       EF¹  w  pp\%        V\         P&                  4      '       Ed�   VS9  d   \=        RV R24      h\%        SV,          \(        4      '       Ed2   RpVP                  \>        P@                  PB                  PD                  PF                  J d½   \        V4      '       d¬   \I        VP                  4      ^8¼  d’   \%        VP                  ^ ,          \         P&                  4      '       da   VP                  ^ ,          S9   dI   \%        SVP                  ^ ,          ,          \(        4      '       g   SVP                  ^ ,          ,          pVf   \K        VS4      pVe   VPM                  V4       EK~  \O        RV R24      hVPM                  SV,          4       EK¨  VPM                  V4       EK¼  	  VPQ                  \S        V4      4      pVVP                  R&   V Uu. uF@  p\%        V\         P&                  4      '       d   VP                  PU                  R4      MRNKB  	  upVP                  R&   VPW                  4        VPY                  4        V# u upi u upi )au  
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ÚforwardrG  r  rp  Nc                ó   <€ SV ,          # r^   rW   ©rO  r&  s   &€rY   r�   Ú4_extract_graph_with_inputs_outputs.<locals>.<lambda>�  ó	   ø€ ¸CÀ¾Fr\   r,  c                ó   <€ SV ,          # r^   rW   r�  s   &€rY   r�   r‘  “  r’  r\   rM  r©   z couldn't be found in envz was invalid, but is outputÚdescÚstack_traceÚoutput_stack_traces)-r  rX  rG  rÌ   r¹   rø   Ú_must_be_in_backwardÚInvalidNodeÚ_must_be_in_forwardr  rÀ   r  r  rÕ   ry  ÚpytreeÚarg_tree_leavesrÖ   rÅ   r  r  r5  rz  Ú_has_tag_is_backwardÚ_has_tag_must_be_in_backwardr9  rA  r„  rY  ÚzipÚRuntimeErrorrÆ   rç   rè   Úcopy_rê   rÔ   r)  Úappendrª   rM  r[  rº   Úeliminate_dead_codeÚlint)r†  r}   r‡  rˆ  r‰  r‹  rg  Ú_control_deps_idx_remapÚ_control_deps_see_throughrT   Únew_nodeÚdep_maprÍ   Úidx_mapÚnew_idxÚnew_getitemÚall_argsrO  Únew_cd_nodeÚoutput_valuesÚx_descÚreplacementÚoutÚvr&  s   &&&&&&                  @rY   Ú"_extract_graph_with_inputs_outputsr²    sw  ø€ ô$ —’“
€IØ"$€Cð
 >@Ðð DFÐó ˆØ×(Ñ(¨¯©Ó3ˆàŸ	™	ˆŒàˆˆD‹	ñ ð ×!Õ!ˆß&ä$ T×*Ò*Ø 
Ô*ØÔ&ä'��D‘	Ùô $ D×)Ò)Ø 	Ô)ØÔ&ä'��D‘	Ùà�3Œ;ñ Ø�W‰W˜Ô%Ü#ˆC�‹IØ�W‰W˜Õ'à—‘œx×/Ñ/Ó/Ø—I‘I˜a•LÐ$=Ô=à3·I±I¸aµLÕA�Ø—i‘i •l�Ø”>Ø # G¥LÕ 1�C˜’Iä +�C˜‘IÚà—‘œx×/Ñ/Ó/Ø—I‘I˜a•LÐ$;Ô;à1·)±)¸Aµ,Õ?�Ø—i‘i •l�Ø”>Ø%�l�GØ"+×"7Ñ"7Ø'Ü ×(Ñ(Ø! $§)¡)¨A¥,Õ/°Ð9Ø!ŸY™Yð	 #8ó #�Kð (,§y¡y�KÔ$Ø +�C˜’Iä +�C˜‘IÚä×-Ò-¨t¯y©yÐH¸D¿K¹KÑHˆHñ "óá!�AÜ˜a¤§¡×)ô 4”
˜3˜q�6¤?Ö3Ù!ð ð ô
 �8�}Š}Ø—;‘;Ô"2Ó2ð ! JÔ.ä0°×6Ò6Ü;¸D×AÒAä5°d×;Ò;ä:PÐQUÓ:VÐ1Ñ7Ü$/˜˜D™	Ú Ü"CØ˜c 9ó#�Kð #Ò.Ø$/°¥N˜˜D™	Ø8CÀA½Ð/Ñ5Ú Ü'��D‘	Úð —‘Ô/Ó/Ø 
Ô*ä(¨×.Ò.Ô2NÈt×2TÒ2Tä-¨d×3Ò3ä2HÈÓ2NÐ)Ñ/Ü'��D‘	Úà!×+Ñ+¨DÔ2BÓCˆC�ŒIØ�W‰W˜
Ô"à!×+Ñ+¨DÔ2BÓCˆC�ŒIØ�W‰W˜× Úñ[ "ð\ €MÜ˜×0‰	ˆˆ6Ü�aœŸ™×!Ó!Ø˜Œ|Ü" U¨1¨#Ð-FÐ#GÓHÐHÜ˜#˜a�&¤/×2Ó2ð #�ð —H‘H¤§	¡	§¡× 4Ñ 4× <Ñ <Ó<Ü,¨Q×/Ò/Ü˜AŸF™F› qÔ(Ü" 1§6¡6¨!¥9¬b¯g©g×6Ò6ØŸ™˜q�	 SÔ(Ü& s¨1¯6©6°!­9¥~´×GÒGà"% a§f¡f¨Q¥i¥.�Kð Ò&Ü"@ÀÀCÓ"H�KØÒ*Ø!×(Ñ(¨Ô5ÚÜ$ u¨Q¨CÐ/JÐ%KÓLÐLØ× Ñ   Q¥×(à× Ñ  ×#ñ= 1ð> ×
Ñ
œ5 Ó/Ó
0€CØ$€C‡H�HˆVÑñ
 ó'áˆAô &0°´2·7±7×%;Ò%;ˆ�‰�
‰
�=Ô!ÀÒEÙñ'€C‡H�HÐ"Ñ#ð
 ×!Ñ!Ô#Ø‡N�NÔØÐùòùòp's   Ê"Z3Ê.Z3Ø;AZ8c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   Ä  s   € ÷ ñ  Gð °ñ r\   c                óD  € \         P                  ;'       dŠ    \        V P                  \        P
                  P                  4      ;'       d#    \        V P                  4      '       * ;'       g2    V P                  \        P                  P                  P                  8H  # r^   )r   Úis_non_builtin_to_includerÅ   rÀ   rÆ   rÇ   rÈ   r   rç   Úhigher_orderÚ triton_kernel_wrapper_functionalr½   s   &rY   rµ  rµ  Ä  sn   € Ü×+Ñ+÷ ð Ü	�D—K‘K¤§¡×!6Ñ!6Ó	7×	WÐ	WÄ
È4Ï;É;Ó@WÔ<W÷ 	Rð 	RØ�;‰;œ%Ÿ)™)×0Ñ0×QÑQÑQðr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   Ë  s   € ÷ Xñ X˜Wð X¨ñ Xr\   c                ó‚   € V P                   R 8H  ;'       d*    \        V P                  P                  R4      \        4      # )rG  rå   )r  rÅ   r¹   rº   r   r½   s   &rY   Ú_is_backward_staterº  Ë  s-   € Ø�7‰7�mÑ#×WÐW¬
°4·9±9·=±=ÀÓ3GÌÓ(WÐWr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   Ï  s   € ÷ Cñ C˜wð C¨4ñ Cr\   c                ó@   € V P                   P                  R R4      R8H  # )Úpartitioner_tagNÚis_backward©r¹   rº   r½   s   &rY   rœ  rœ  Ï  s   € Ø�9‰9�=‰=Ð*¨DÓ1°]ÑBÐBr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   Ó  s   € ÷ Bñ B˜gð B¨$ñ Br\   c                ó@   € V P                   P                  R R4      R8H  # )r½  NÚ
is_forwardr¿  r½   s   &rY   Ú_has_tag_is_forwardrÃ  Ó  s   € Ø�9‰9�=‰=Ð*¨DÓ1°\ÑAÐAr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   ×  s   € ÷ Jñ J gð J°$ñ Jr\   c                ó@   € V P                   P                  R R4      R8H  # )r½  NÚmust_be_in_forwardr¿  r½   s   &rY   Ú_has_tag_must_be_in_forwardrÇ  ×  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5IÑIÐIr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   Û  s   € ÷ Kñ K wð K°4ñ Kr\   c                ó@   € V P                   P                  R R4      R8H  # )r½  NÚmust_be_in_backwardr¿  r½   s   &rY   r�  r�  Û  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5JÑJÐJr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   ß  s   € ÷ ñ ˜gð ¨$ñ r\   c                ó8  € \        V 4      '       d   R # \        V P                  \        P                  P
                  4      ;'       d!    V P                  P                  P                  p\        V 4      '       * ;'       d    \        V 4      '       * ;'       d    T# ©T)
rÇ  rÅ   rÀ   rÆ   rÇ   rÈ   rÊ   Ú
is_mutablerœ  r�  ©rT   rÎ  s   & rY   r™  r™  ß  s€   € Ü" 4×(Ò(Ùô 	�4—;‘;¤§
¡
× 5Ñ 5Ó6÷ 	+ð 	+Ø�K‰K×Ñ×*Ñ*ð ô
 ! Ó&Ô&÷ 	ð 	Ü,¨TÓ2Ô2÷	ð 	àðr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   î  s   € ÷ 5ñ 5˜wð 5¨4ñ 5r\   c                óþ   € \        V 4      '       d   R # \        V P                  \        P                  P
                  4      ;'       d!    V P                  P                  P                  p\        V 4      ;'       d    T# rÍ  )	r�  rÅ   rÀ   rÆ   rÇ   rÈ   rÊ   rÎ  rœ  rÏ  s   & rY   r—  r—  î  s_   € Ü# D×)Ò)Ùä�4—;‘;¤§
¡
× 5Ñ 5Ó6÷ 	+ð 	+Ø�K‰K×Ñ×*Ñ*ð ô   Ó%×4Ð4¨*Ð4r\   c               ó    € V ^8„  d   QhRRRR/# )rS   rå   r
   rV   zIterator[sympy.Basic]rW   )rX   s   "rY   rZ   rZ   ø  s   € ÷ Yñ Y°ð YÐ8Mñ Yr\   c              #  ó  "  € \        V \        4      '       d-   \        V 4      '       d   \        V P                  4      x € R # R # \        V \
        4      '       d   \        V 4      x € R # \        V \        P                  4      '       d   V x € R # \        V \        \        \        \        34      '       d   R # \        V \        \        34      '       d   V  F  p\        V4       R j  x€L
  K  	  R # \        V \        4      '       dP   \         P"                  ! V P%                  4       V P'                  4       4       F  p\        V4       R j  x€L
  K  	  R # \)        V 4      '       d$   \        V P+                  4       4       R j  x€L
  R # \        V \,        P.                  4      '       df   \        V P+                  4       4       R j  x€L
  \        V P1                  4       4       R j  x€L
  \        V P3                  4       4       R j  x€L
  R # V f   R # \        V \,        P4                  4      '       g   \7        V 4      '       d   R # \        V \8        4      '       d   R # \;        RV  R\=        V 4       24      h EL” EL2 Lü L» Lœ L}5i)Nz&cannot extract sympy expressions from Ú )rÅ   r!   r)   r%   rT   r$   ÚsympyÚBasicr§   ÚfloatrG   rÃ   r[  rt  Ú&_iter_input_exprs_without_replacementsÚdictÚ	itertoolsÚchainÚkeysÚvaluesr   ÚsizerÆ   ÚTensorÚstrideÚstorage_offsetÚ	Generatorr   r   rª   r  )rå   Úss   & rY   rØ  rØ  ø  s¹  é € ä�#”|×$Ò$Ü�s×ÒÜ'¨¯©Ó1Ô1ñ ä	�Cœ×	!Ò	!Ü# CÓ(Ô(Ü	�CœŸ™×	%Ò	%ØŒ	Ü	�Cœ#œu¤d¬CÐ0×	1Ò	1ÙÜ	�Cœ%¤˜×	'Ò	'ÛˆAÜ=¸aÓ@×@Ò@ó ä	�Cœ×	Ò	Ü—’ §¡£¨S¯Z©Z«\Ö:ˆAÜ=¸aÓ@×@Ò@ó ;ä	�s×	Ò	Ü9¸#¿(¹(»*ÓE×EÒEÜ	�CœŸ™×	&Ò	&Ü9¸#¿(¹(»*ÓE×EÐEÜ9¸#¿*¹*»,ÓG×GÐGÜ9¸#×:LÑ:LÓ:NÓO×OÒOØ	ŠÙÜ	�CœŸ™×	)Ò	)¬_¸S×-AÒ-AÙÜ	�CÔ)×	*Ò	*ÙäÐEÀcÀUÈ!ÌDÐQTËIÈ;ÐWÓXÐXò# Aò AáEáEÙGÙOùso   ‚C%J	Ã'I;Ã(A$J	ÅI>Å7J	ÆJÆAJ	ÇJÇ J	Ç(JÇ) J	È	JÈ
A2J	É>J	ÊJ	ÊJ	ÊJ	ÊJ	c               ó    € V ^8„  d   QhRRRR/# )rS   rå   r
   rV   zOrderedSet[sympy.Symbol]rW   )rX   s   "rY   rZ   rZ     s   € ÷ ñ ¨Cð Ð4Lñ r\   c                ót   € \        4       p\        V 4       F  pVP                  VP                  4       K   	  V# r^   )r/   rØ  Úupdater'   )rå   ÚsymbolsÚexprs   &  rY   Ú"_free_symbols_without_replacementsré    s/   € Ü(2«€GÜ6°sÖ;ˆØ�‰�t×(Ñ(Ö)ñ <à€Nr\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   Újoint_modulerô   Únum_fwd_outputsr§   rV   zEtuple[list[fx.Node], list[fx.Node], list[AOTOutput], list[AOTOutput]]rW   )rX   s   "rY   rZ   rZ      s)   € ÷ Jñ JØ ðJØ69ðJàJñJr\   c          
     ór  € \         P                  ! R  V P                  P                  RR7       4       !  p\         P                  ! \	        \        V P                  P                  RR7      4      4      P                  P                  RR.\        V4      ,          4      4      pVRV pW!R pVRV pW1R pWEWg3# )c              3  ó8   "  € T F  qP                   x € K  	  R # 5ir^   ©rÕ   ©r‹   rT   s   & rY   r�   Ú+_extract_fwd_bwd_outputs.<locals>.<genexpr>$  s   é € Ð	KÑ J˜�)Ž)Ó Jùó   ‚rM  rH  r”  N)	rš  r›  r÷   rV  ÚnextÚiterr¹   rº   rÔ   )rë  rì  r‡  rˆ  Úfwd_outputsÚbwd_outputsÚfwd_outputs_descsÚbwd_outputs_descss   &$      rY   Ú_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ÐØ%Ð&6Ð7ÐØÐ%6ÐIÐIr\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   Úsaved_valuesr|   rÌ   rÃ   rV   ÚNonerW   )rX   s   "rY   rZ   rZ   2  s!   € ÷ ñ  -ð °sð ¸tñ r\   c                ób   € V  F(  pVP                   V8X  g   K  V P                  V4        R # 	  R # r^   )rÌ   Úremove)rû  rÌ   Úsaved_values   && rY   Ú_remove_by_namer   2  s+   € Û#ˆØ×Ñ˜tÖ#Ø×Ñ Ô,Úó $r\   c               ó    € V ^8„  d   QhRRRR/# )rS   Úfwd_module_outputsz#list[fx.Node] | tuple[fx.Node, ...]rV   r§   rW   )rX   s   "rY   rZ   rZ   9  s   € ÷ ñ Ø;ðàñr\   c                óª   € \        V 4      p\        \        V 4      ^,
          RR4       F&  p\        W,          4      '       d   K  V^,           p V# 	  V# )rr  éÿÿÿÿ)rÔ   ru  r    )r  rÍ   r?  s   &  rY   Úfind_first_sym_noder  9  sT   € ô Ð Ó
!€CÜ”3Ð)Ó*¨QÕ.°°BÖ7ˆÜÐ-Õ0×1Ô1Ø�a•%ˆCØØ€Jñ	 8ð €Jr\   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )rS   r÷   útorch.fx.GraphrT   útorch.fx.NodeÚmaxr×  ÚminÚpositionr§   rV   rW   )rX   s   "rY   rZ   rZ   D  sL   € ÷ Kñ KØðKà
ðKð 
ðKð 
ð	Kð
 ðKð ñKr\   c           
     óÐ  € V P                  V4      ;_uu_ 4        V P                  \        P                  P                  P
                  P                  V3R 7      p\        P                  P                  P
                  P                  VP                  R,          4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V P                  X4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  VR.R3R 7      p\        P                  P                  P                  P                  VP                  R,          R.R4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V P                  X4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  V\        P                  3R 7      p\        P                  P                  P                  P                  VP                  R,          \        P                  4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V P                  X4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  Ws3R 7      p\        P                  P                  P                  P                  VP                  R,          V4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V P                  X4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  V3R 7      p	\        P                  P                  P                  P                  VP                  R,          4      V	P                  R&   \        V	P                  R,          4      V	P                  R&   RRR4       V P                  X	4      ;_uu_ 4        V P                  \        P                  P                  P                  P                   W’3R 7      p
\        P                  P                  P                  P!                  V	P                  R,          V4      V
P                  R&   \        V
P                  R,          4      V
P                  R&   RRR4       V P                  X
4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  V
\        P"                  3RV RVP$                   2R7      p\        P                  P                  P                  P                  V
P                  R,          \        P"                  4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V#   + '       g   i     EL�; i  + '       g   i     ELÂ; i  + '       g   i     ELÜ; i  + '       g   i     EL; i  + '       g   i     ELK; i  + '       g   i     EL‚; i  + '       g   i     X# ; i)	rï  rå   Útensor_metaNTÚfp8_scale_pos_Ú_rp  r  )Úinserting_afterr  rÆ   rç   rè   Úabsrê   r¹   r   ÚamaxÚprimsÚconvert_element_typeÚfloat64Ú	clamp_minÚ
reciprocalÚmulrß  Úfloat32rÌ   )r÷   rT   r	  r
  r  Úabs_nodeÚ	amax_nodeÚamax_64_nodeÚclamp_min_nodeÚreciprocal_nodeÚmul_nodeÚ
scale_nodes   &&&&&       rY   Úcalculate_quantization_scalingr!  D  s  € ð 
×	Ñ	˜t×	$Õ	$Ø×&Ñ&Ü�I‰I�N‰N×Ñ×&Ñ&Ø�ð 'ó 
ˆô  %Ÿy™yŸ~™~×1Ñ1×9Ñ9¸$¿)¹)ÀEÕ:JÓKˆ�‰�eÑÜ'>¸x¿}¹}ÈUÕ?SÓ'Tˆ�‰�mÑ$÷ 
%ð 
×	Ñ	˜x×	(Õ	(Ø×'Ñ'Ü�I‰I�N‰N×Ñ×'Ñ'Ø˜R˜D $Ð'ð (ó 
ˆ	ô !&§	¡	§¡× 3Ñ 3× ;Ñ ;Ø�M‰M˜%Õ  2 $¨ó!
ˆ	�‰�uÑô )@À	ÇÁÈuÕ@UÓ(Vˆ	�‰�}Ñ%÷ 
)ð 
×	Ñ	˜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Ø× Ñ  Õ'ó/
ˆ×Ñ˜]Ñ+÷ 
/ð 
×	Ñ	˜×	/Õ	/Ø×&Ñ&Ü�I‰I�N‰N×Ñ×%Ñ%Ø!Ð'ð 'ó 
ˆô  %Ÿy™yŸ~™~×1Ñ1×8Ñ8Ø× Ñ  Õ'¨ó 
ˆ�‰�eÑô (?¸x¿}¹}ÈUÕ?SÓ'Tˆ�‰�mÑ$÷ 
0ð 
×	Ñ	˜x×	(Õ	(Ø×(Ñ(Ü�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ˆ
�‰˜Ñ&÷ 
)ð Ð÷I 
%×	$Ð	$ú÷ 
)×	(Ð	(ú÷ 
*×	)Ð	)ú÷ 
-×	,Ð	,ú÷ 
/×	.Ð	.ú÷ 
0×	/Ð	/ú÷ 
)Ö	(ð ÐúsZ   šB;YÃ6CY0ÇCZËB<ZÎ/B;Z,ÒB<[ Õ(C*[ÙY-	Ù0Z	ÚZ	ÚZ)	Ú,Z=	Û [	Û[%	c               ó8   € V ^8„  d   QhRRRRRRRRRR	R
R	RRRR/# )rS   r÷   r  rT   r  r   Ú
quant_typeútorch.dtyper  r×  Ú	clamp_maxr  r§   rV   rW   )rX   s   "rY   rZ   rZ   ’  sb   € ÷ C!ñ C!ØðC!à
ðC!ð ðC!ð ð	C!ð
 ðC!ð ðC!ð ðC!ð ñC!r\   c           
     óî	  € V P                  V4      ;_uu_ 4        V P                  \        P                  P                  P
                  P                  V\        P                  3R 7      p\        P                  P                  P
                  P                  VP                  R,          \        P                  4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V P                  X4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  Wr3R 7      p\        P                  P                  P                  P                  VP                  R,          VP                  R,          4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V P                  X4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  W„3R 7      p	\        P                  P                  P                  P                  VP                  R,          V4      V	P                  R&   \        V	P                  R,          4      V	P                  R&   RRR4       V P                  X	4      ;_uu_ 4        V P                  \        P                  P                  P                  P                  W•3R 7      p
\        P                  P                  P                  P                  V	P                  R,          V4      V
P                  R&   \        V
P                  R,          4      V
P                  R&   RRR4       V P                  X
4      ;_uu_ 4        V P                  \        P                  P                  P
                  P                  W£3RV RVP                   2R7      p\        P                  P                  P
                  P                  V
P                  R,          V4      VP                  R&   \        VP                  R,          4      VP                  R&   RRR4       V#   + '       g   i     EL©; i  + '       g   i     ELÏ; i  + '       g   i     EL; i  + '       g   i     EL=; i  + '       g   i     X# ; i)rï  rå   r  NÚfp8_quant_pos_r  rp  )r  r  rÆ   rç   r  r  rê   r  r¹   r   rè   r  rß  r  r%  rÌ   )r÷   rT   r   r#  r  r%  r  Útarget_node_32Úscaled_target_nodeÚclamp_min_scaled_nodeÚclamp_max_scaled_nodeÚquant_activation_nodes   &&&&&&&     rY   Úperform_quantizationr-  ’  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Õ	2Ø %× 3Ñ 3Ü�I‰I�N‰N×$Ñ$×,Ñ,Ø$Ð0ð !4ó !
Ðô -2¯I©I¯N©N×,DÑ,D×,LÑ,LØ×#Ñ# EÕ*¨Ió-
Ð×"Ñ" 5Ñ)ô 5LØ!×&Ñ& uÕ-ó5
Ð×"Ñ" =Ñ1÷ 
3ð 
×	Ñ	Ð4×	5Õ	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÷ 
6ð 
×	Ñ	Ð4×	5Õ	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÷ 
6ð !Ð ÷u 
+×	*Ð	*ú÷ 
/×	.Ð	.ú÷ 
3×	2Ð	2ú÷ 
6×	5Ð	5ú÷ 
6Ö	5ð !Ð ús@   šCRÄCR'ÈB<R;ËB<SÎ<CS#ÒR$	Ò'R8	Ò;S	ÓS 	Ó#S4	c               ó    € V ^8„  d   QhRRRR/# )rS   Útensorútorch.TensorrV   r×  rW   )rX   s   "rY   rZ   rZ   Ø  s   € ÷ 9ñ 9 ,ð 9°5ñ 9r\   c                ó`   € V P                  4       pV P                  4       pW,          R,          # )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)r/  Únum_elementsr3  s   &  rY   Úcalculate_tensor_sizer5  Ø  s+   € ð —<‘<“>€LØ×&Ñ&Ó(€LàÕ'¨KÕ8Ð8r\   c               ó   € V ^8„  d   QhRR/# )rS   rV   zlist[torch.dtype]rW   )rX   s   "rY   rZ   rZ   é  s   € ÷ ñ Ð-ñ r\   c            	     ó  € \         P                  P                  P                  R ,          P	                  RR4      p V P                  R4       Uu. uF)  p\        \         VP                  R4      R,          4      NK+  	  p pV # u upi )Ú!activation_quantization_aten_passÚallowed_dtypesztorch.bfloat16Ú;Ú.r  )rÆ   Ú	_inductorr   Úpost_grad_fusion_optionsrº   Úsplitr  )r9  Údtypes     rY   Úget_allowed_dtypesr@  é  s}   € Ü—_‘_×+Ñ+×DÑDØ+õç	�cÐ
Ð,Ó-ð ð ;I×:NÑ:NÈsÔ:SóÙ:S°Œ”�u—{‘{ 3Ó'¨Õ+Ö,Ñ:Sð ð ð Ðùòs   Á/Bc               ó    € V ^8„  d   QhRRRR/# )rS   rT   r  rV   rG   rW   )rX   s   "rY   rZ   rZ   ó  s   € ÷ Gñ G˜-ð G¨Dñ Gr\   c                ó¢  € \        4       p\        V 4      '       d#   V P                  R ,          P                  V9  d   R# \        P
                  P                  P                  R,          P                  R^d4      p\        V P                  R ,          4      p\        P
                  P                  P                  R,          P                  RR4      '       g   W28¬  # \        P
                  P                  P                  R,          P                  RR4      '       d(   \        W28¬  4      ;'       g    \        W28¬  4      '       * # \        W28¬  4      # )rå   Fr8  Ú
size_in_mbÚskip_dynamo_guardsÚquantize_dynamic_shape)r@  r   r¹   r?  rÆ   r<  r   r=  rº   r5  r,   r+   )rT   r9  Úsize_thresholdrC  s   &   rY   Úshould_quantizerG  ó  s  € Ü'Ó)€NÜ˜d×#Ò# t§y¡y°Õ'7×'=Ñ'=À^Ô'SÙÜ—_‘_×+Ñ+×DÑDØ+õç	�cˆ,˜Óð ô ' t§y¡y°Õ'7Ó8€JÜ�?‰?×!Ñ!×:Ñ:Ø+õç	�cÐ
 Ó&ö'ð Ñ+Ð+ô �?‰?×!Ñ!×:Ñ:Ø/õ
ç
‰#Ð&¨Ó
.ö/ô )ØÑ,ó÷ Jð Jä+¨JÑ,HÓIÔIðJô
 )¨Ñ)EÓFÐFr\   c               ó   € V ^8„  d   QhRR/# )rS   rV   r$  rW   )rX   s   "rY   rZ   rZ     s   € ÷ 5ñ 5˜ñ 5r\   c                 óÄ   € \         P                  P                  P                  R ,          P	                  RR4      p \        \         V P                  R4      R,          4      # )r8  r#  ztorch.float8_e5m2r;  r  )rÆ   r<  r   r=  rº   r  r>  )r#  s    rY   Úget_quant_typerJ    sN   € Ü—‘×'Ñ'×@Ñ@Ø+õç	�cˆ,Ð+Ó,ð ô ”5˜*×*Ñ*¨3Ó/°Õ3Ó4Ð4r\   c               ó    € V ^8„  d   QhRRRR/# )rS   r?  r$  rV   ztuple[float, float]rW   )rX   s   "rY   rZ   rZ     s   € ÷ 	ñ 	˜;ð 	Ð+>ñ 	r\   c                ó^   € \         P                  ! V 4      pVP                  VP                  3# )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Æ   Úfinfor
  r	  )r?  Úinfos   & rY   Úcalculate_rangerO    s%   € ô �;Š;�uÓ€DØ�8‰8�T—X‘XÐÐr\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   r÷   r  rì  r§   rV   rü  rW   )rX   s   "rY   rZ   rZ   !  s+   € ÷ FGñ FG .ð FGÀ3ð FGÈtñ FGr\   c                óš  € V P                  R R7      ^ ,          pVP                  ^ ,          p\        4       p\        V4      w  rV\	        4       p. p. p	\        V4       EF·  w  r«W¡8  d   K  VP                  P                  RR4      '       g   K2  \        P                  P                  P                  R,          P                  RR4      '       dS   \        WVRV
4      p\        WWÄWVV
4      p\        V4      '       g   VP                  V4       EM V	P                  V4       MîV P!                  V4      ;_uu_ 4        V P#                  \        P$                  P&                  P(                  P*                  W´3RV
 R	VP,                   2R
7      p\        P$                  P&                  P(                  P+                  VP                  R,          V4      VP                  R&   \/        VP                  R,          4      VP                  R&   RRR4       XWz&   EKº  	  \        V4       UUu. uF  w  rëVP                  Wë4      NK  	  ppp\1        V4      pW‰,           pV'       d   VRV V,           VVR ,           pVP3                  ^ \5        V4      4       \6        R,          R;;,          ^,          uu&   R#   + '       g   i     L´; iu uppi )rM  rH  Úsaved_for_quantizationFr8  Úuse_scalingTçê-�™—q=r'  r  rp  rå   r  NÚinductorÚ%activation_quantization_fwd_aten_pass)rV  rÕ   rJ  rO  rÙ  rÉ   r¹   rº   rÆ   r<  r   r=  r!  r-  r    r¡  r  r  rç   r  r  rê   rÌ   r   r  Ú
update_argr[  r   )r÷   rì  rM  rõ  r#  r  r%  Úposition_to_quantÚtensor_scale_nodesÚsym_scale_nodesr  rT   r   Ú
quant_noder?  Úoutput_updated_argsrÍ   Úscale_nodess   &&                rY   Úquantize_activation_fwr^  !  so  € Ø×Ñ ÐÓ*¨1Õ-€FØ—+‘+˜a•.€KÜÓ!€JÜ*¨:Ó6Ñ€IÜ›ÐØ(*ÐØ%'€OÜ# K×0‰ˆð Ô%Ùà�9‰9�=‰=Ð1°5×9Ô9ä�‰×%Ñ%×>Ñ>Ø3õç‰c�- Ó&ö'ô <Ø ¨E°8ó�
ô
 2Ø ¸Èxó�
ô # :×.Ò.Ø&×-Ñ-¨jÖ9à#×*Ñ*¨:Õ6ð ×*Ñ*¨4×0Õ0Ø!&×!4Ñ!4ÜŸ	™	Ÿ™×<Ñ<×DÑDØ"Ð/Ø-¨h¨Z°q¸¿¹¸ÐDð "5ó "�Jô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÕ,¨jóð —O‘O EÑ*ô
 6MØ"Ÿ™¨Õ.ó6�J—O‘O MÑ2÷ 1ð +5ÐÔ'ñ[ 1ôd 7@ÀÔ6LôÙ6L©7¨1Ð×Ñ˜aÖ&Ñ6Lð ñ ô
 Ð1Ó
2€CØ$Õ6€Kßà  Ð%¨Õ3Ð6IÈ#È$Ð6OÕOð 	ð ×Ñ�aœÐ2Ó3Ô4ÜˆZÕÐ@×AÀQÕFÕA÷A 1×0üó&s   Ä;CJ4È'KÊ4Kc               ó    € V ^8„  d   QhRRRR/# )rS   r÷   r  rV   rü  rW   )rX   s   "rY   rZ   rZ   j  s"   € ÷ MGñ MG .ð MG°Tñ MGr\   c                óP  a	€ V P                    Uu. uF  qP                  R 8X  g   K  VNK  	  ppRpV EFç  pVP                  P                  RR4      '       g   K(  VP                  P	                  R4       VP                  P	                  R4      p\
        P                  P                  P                  R,          P                  RR4      '       Ed   V P                  V4      ;_uu_ 4        RVP                  P                  RR	4      ,           o	\        V	3R
 lV 4       4      pRRR4       V P                  X4      ;_uu_ 4        V P                  \
        P                  P                  P                   P"                  W3R7      p\
        P                  P                  P                   P#                  VP                  R,          V4      VP                  R&   \%        VP                  R,          4      VP                  R&   RRR4       V P                  V4      ;_uu_ 4        V P                  \
        P                  P&                  P(                  P*                  W53R7      p\
        P                  P&                  P(                  P+                  VP                  R,          VP                  R,          4      VP                  R&   \%        VP                  R,          4      VP                  R&   RRR4       V P                  X4      ;_uu_ 4        V P                  \
        P                  P                  P                   P"                  Wd3R7      p\
        P                  P                  P                   P#                  VP                  R,          V4      VP                  R&   \%        VP                  R,          4      VP                  R&   RRR4       MøV P                  V4      ;_uu_ 4        V P                  \
        P                  P                  P                   P"                  W3R\-        VP                  4      ,           R7      p\
        P                  P                  P                   P#                  VP                  R,          V4      VP                  R&   \%        VP                  R,          4      VP                  R&   RRR4       \/        VP0                  P3                  4       4       F%  pVX8w  g   K  Wƒ8w  g   K  VP5                  W4       K'  	  EKê  	  \6        R,          R;;,          ^,          uu&   R# u upi   + '       g   i     EL*; i  + '       g   i     ELa; i  + '       g   i     EL‡; i  + '       g   i     LÄ; i  + '       g   i     L×; i)rG  NrR  FÚdequant_typer8  rS  Ú
fp8_scale_Ú
fp8_quant_Ú c              3  óN   <"  € T F  pVP                   S8X  g   K  Vx € K  	  R # 5ir^   ©rÌ   )r‹   Ú	bwd_inputÚ
scale_names   & €rY   r�   Ú)quantize_activation_bw.<locals>.<genexpr>y  s&   øé € ð &á)2˜IØ$Ÿ>™>¨ZÑ7÷ "š	Û)2ùs   ƒ%›
%rï  rå   r  Údequant_rp  rU  Ú%activation_quantization_bwd_aten_pass)rø   r  r¹   rº   ÚpoprÆ   r<  r   r=  r  rÌ   r	   ró  r  rç   r  r  rê   r   rè   Údivrß  rÃ   rt  rî   rÜ  Úreplace_input_withr   )
r÷   rT   Ú	bw_inputsÚactivation_nodera  r   Údivided_target_node_32Údequant_noderì   rh  s
   &        @rY   Úquantize_activation_bwrs  j  sF  ø€ Ø"'§+¢+ÓJ¡+˜$·±¸MÑ1I—�¡+€IÐJØ€OÜˆØ�9‰9�=‰=Ð1°5×9Ô9Ø�I‰I�M‰MÐ2Ô3ØŸ9™9Ÿ=™=¨Ó8ˆLä�‰×%Ñ%×>Ñ>Ø3õç‰c�- Ó'÷(ð ×*Ñ*¨4×0Õ0à!-°·	±	×0AÑ0AÀ,ÐPRÓ0SÕ!S�JÜ!%ô &á)2ó&ó "�J÷ 1ð ×*Ñ*¨:×6Õ6Ø&+×&9Ñ&9ÜŸ	™	Ÿ™×<Ñ<×DÑDØ"Ð1ð ':ó '�Oô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÕ,¨lóð $×(Ñ(¨Ñ/ô
 ;RØ'×,Ñ,¨UÕ3ó;�O×(Ñ(¨Ñ7÷ 7ð ×*Ñ*¨?×;Õ;Ø-2×-@Ñ-@ÜŸ	™	Ÿ™×*Ñ*×1Ñ1Ø-Ð:ð .Aó .Ð*ô :?¿¹¿¹×9KÑ9K×9RÑ9RØ'×,Ñ,¨UÕ3°Z·_±_ÀUÕ5Kó:Ð*×/Ñ/°Ñ6ô 0Ð0F×0KÑ0KÈEÕ0RÓSð +×/Ñ/°Ñ>÷ <ð ×*Ñ*Ð+A×BÕBØ#(×#6Ñ#6ÜŸ	™	Ÿ™×<Ñ<×DÑDØ4ÐCð $7ó $�Lô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ2×7Ñ7¸Õ>Àóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Õ0ó8�L×%Ñ% mÑ4÷ CÐBð ×*Ñ*¨4×0Õ0Ø#(×#6Ñ#6ÜŸ	™	Ÿ™×<Ñ<×DÑDØ"Ð1Ø'¬#¨d¯i©i«.Õ8ð $7ó $�Lô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÕ,¨lóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Õ0ó8�L×%Ñ% mÑ4÷ 1ô ˜TŸZ™ZŸ_™_Ó.Ö/�Ø˜<Ö'¨DÖ,CØ×+Ñ+¨DÖ?ô 0ñM ôT ˆZÕÐ@×AÀQÕFÕAùòY K÷ 1×0Ð0ú÷ 7×6Ð6ú÷ <×;Ð;ú÷ C×Bú÷ 1×0úsJ   �U§UÃ,9UÅB<UÈ#CU.ÌB<VÏ/CVÕUÕU+Õ.U?ÖVÖV%c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rS   Ú
fwd_modulerô   Ú
bwd_moduleÚbwd_module_inputsúdict[str, fx.Node]rì  r§   rV   rü  rW   )rX   s   "rY   rZ   rZ   º  sA   € ÷ Xñ XØðXàðXð *ðXð ð	Xð
 
ñXr\   c                ó¢  a a€ \        R R V 3R lR7       \        S P                  V4       \        R R V 3R lR7       \        R R V3R lR7       S P                  P                  RR	7      ^ ,          P                  ^ ,          pV EF  pR
VP
                  9   g   K  V\        P                  ! RRVP
                  4      ,          pSP                  P                  V4      ;_uu_ 4        SP                  P                  VP
                  R7      pRRR4       VP                  R,          pXP                  P                  VP                  4       RVP                  R&   W‡P                  R&   VP                  V4       SP                  P                  V4       EK  	  \        P                  P                   P"                  R,          P%                  RR4      '       Ed   \'        SP                  P                  RR	7      4      p	V	R,          p
\)        V	4       F  p\+        V4      '       d   K  Tp
 M	  S P                  P                  RR	7      ^ ,          P                  ^ ,          pV F�  pRVP
                  9   g   K  SP                  P                  V
4      ;_uu_ 4        SP                  P                  VP
                  R7      pRRR4       XP                  P                  VP                  4       Tp
K‘  	  \-        SP                  4       \        R R V3R lR7       R#   + '       g   i     EL!; i  + '       g   i     Ly; i)Úartifactc                 ó   € R RRR/# )rÌ   Ú,before_activation_quantization_fwd_aten_passÚencodingÚstringrW   rW   r\   rY   r�   Ú5perform_fp8_activation_quantization.<locals>.<lambda>Â  ó   € ØÐBØ˜ñ
r\   c                 ó,   <€ S P                  R RRR7      # ©FT©Úprint_outputÚinclude_strideÚinclude_device©Úprint_readable©ru  s   €rY   r�   r  Æ  ó   ø€ ˜:×4Ñ4Ø¨tÀDð 5ô 
r\   ©Úmetadata_fnÚ
payload_fnc                 ó   € R RRR/# )rÌ   Ú+after_activation_quantization_fwd_aten_passr}  r~  rW   rW   r\   rY   r�   r  Ï  ó   € ØÐAØ˜ñ
r\   c                 ó,   <€ S P                  R RRR7      # r‚  r‡  r‰  s   €rY   r�   r  Ó  rŠ  r\   c                 ó   € R RRR/# )rÌ   Ú,before_activation_quantization_bwd_aten_passr}  r~  rW   rW   r\   rY   r�   r  Ú  r€  r\   c                 ó,   <€ S P                  R RRR7      # r‚  r‡  ©rv  s   €rY   r�   r  Þ  rŠ  r\   rM  rH  rc  z^fp8_quant_pos_\d+_rd  rf  Nra  TrR  r8  rS  rG  rb  c                 ó   € R RRR/# )rÌ   Ú+after_activation_quantization_bwd_aten_passr}  r~  rW   rW   r\   rY   r�   r    r�  r\   c                 ó,   <€ S P                  R RRR7      # r‚  r‡  r•  s   €rY   r�   r    rŠ  r\   r  )r   r^  r÷   rV  rÕ   rÌ   ÚreÚsubr  rG  r¹   ræ  Úreplace_all_uses_withÚ
erase_noderÆ   r<  r   r=  rº   rt  Úreversedr@   rs  )ru  rv  rw  rì  Úquant_fwd_module_outputsÚfwd_noderg  Úquant_bwd_inputra  Úquant_bwd_module_inputsÚbwd_input_locÚbw_inputÚscaled_fwd_module_outputsÚscale_bwd_inputs   ff&&          rY   Ú#perform_fp8_activation_quantizationr¦  º  s­  ù€ ô Øñ
ô
õ	ô ˜:×+Ñ+¨_Ô=äØñ
ô
õ	ô Øñ
ô
õ	ð  *×/Ñ/×:Ñ:¸hÐ:ÓGÈÕJ×OÑOÐPQÕRÐä,ˆØ˜8Ÿ=™=Ö(Ø)Ü—’Ð-¨r°8·=±=ÓAõˆIð ×!Ñ!×1Ñ1°)×<Õ<Ø",×"2Ñ"2×">Ñ">ÀHÇMÁMÐ">Ó"R�÷ =à$Ÿ>™>¨.Õ9ˆLØ× Ñ ×'Ñ'¨¯©Ô6Ø=AˆO× Ñ Ð!9Ñ:Ø3?× Ñ  Ñ0Ø×+Ñ+¨OÔ<Ø×Ñ×'Ñ'¨	×2ñ -ô ‡�×Ñ×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ˆHØ˜xŸ}™}Ö,à×%Ñ%×5Ñ5°m×DÕDØ&0×&6Ñ&6×&BÑ&BÈÏÉÐ&BÓ&V�O÷ Eà×$Ñ$×+Ñ+¨H¯M©MÔ:Ø /’ñ 2ô ˜:×+Ñ+Ô,äØñ
ô
÷	÷? =×<Ð<ú÷0 E×Dús   Ã+'L*Ê&'L>Ì*L;Ì>Mc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )rS   rû  r|   ru  rô   rv  r…   úOrderedSet[fx.Node] | Nonerì  r§   rV   rü  rW   )rX   s   "rY   rZ   rZ     sD   € ÷ '
ñ '
Øð'
àð'
ð ð'
ð "<ð	'
ð
 ð'
ð 
ñ'
r\   c                ó|  € V'       d   V Uu. uF  qUP                   NK  	  upM. pV  Uu/ uF  qUP                   VbK  	  pp\        P                  P                  P                  R ,          P                  RR4      '       d0   V  Uu/ uF#  pRVP                   9  g   K  VP                   VbK%  	  ppVP                  P                  RR7      ^ ,          P                  ^ ,          pVP                  P                  RR7       Uu/ uF  qUP                   VbK  	  p	pRp
V Fð  pVP                   V9   g   K  \        V4      '       g   K)  VP                   V9   d#   \        P                  RVP                   4       K\  RVP                  R	&   VP                  R
,          P                  VP                  R&   RW•P                   ,          P                  R	&   VP                  R
,          P                  W•P                   ,          P                  R&   Rp
Kò  	  V
'       d   \        WW”4       R# R# u upi u upi u upi u upi )r8  Úexclude_primalsFÚprimalsrM  rH  rG  z*Skipping quantization of static input %s: TrR  rå   ra  N)rÌ   rÆ   r<  r   r=  rº   r÷   rV  rÕ   rG  rI   Údebugr¹   r?  r¦  )rû  ru  rv  r…   rì  rT   Ústatic_input_namesÚsaved_values_namesr  rw  Úshould_perform_fp8_quants   &&&&&      rY   Úenable_activation_quantizationr°    só  € ÷ 'ñ  ;Ó;Ñ:�t�ŒÑ:Ò;àð ñ
 7CÓC±l¨dŸ)™) Tš/±lÐÐCÜ‡�×Ñ×6Ñ6Ø+õç	�cÐ
˜UÓ#ö$ñ )5ó
Ù(4 ¸	ÈÏÉÑ8RŒOˆD�I‰I�tŠO©ð 	ð 
ð $×)Ñ)×4Ñ4¸Ð4ÓAÀ!ÕD×IÑIÈ!ÕLÐà$.×$4Ñ$4×$?Ñ$?À=Ð$?Ô$QóÙ$Q˜D�	‰	�4ŠÑ$Qð ð ð  %ÐÛ"ˆØ�9‰9Ð*Ö*¬¸t×/DÔ/DØ�y‰yÐ.Ô.Ü—	‘	ÐFÈÏ	É	ÔRÙØ26ˆD�I‰IÐ.Ñ/Ø(,¯	©	°%Õ(8×(>Ñ(>ˆD�I‰I�nÑ%àJNÐŸi™iÕ(×-Ñ-Ð.FÑGØ@DÇ	Á	È%Õ@P×@VÑ@VÐŸi™iÕ(×-Ñ-¨nÑ=Ø'+Ò$ñ #÷  Ü+ØÐ$5ö	
ñ  ùò9 	<ùò Dùò
ùòs   �H*ªH/ÂH4ÂH4ÄH9r…   r‹  Úomit_aot_autograd_runtimec               ó<   € V ^8„  d   QhRRRRRRRRRR	R
RRRRRRR/	# )rS   rë  rô   rû  r|   Úsaved_sym_nodesÚsaved_opaque_nodeszlist[fx.Node] | Nonerì  r§   r…   r¨  r‹  rG   r±  rV   ú%tuple[fx.GraphModule, fx.GraphModule]rW   )rX   s   "rY   rZ   rZ   ?  sm   € ÷ y"ñ y"Ø ðy"àðy"ð #ðy"ð -ð	y"ð ðy"ð "<ðy"ð "ðy"ð  $ðy"ð +ñy"r\   c               ó  € \        WR7      w  r‰r«V P                  P                  RR7      p. \        \        V4      OpV'       d   . M. \        \
        V4      Op. \        \        V4      Op. \        \        V4      Op. \        \        V4      OpVf   . p\        V P                  VV,           V,           V,           V,           V	VRVR7      p\        P                  P                  4       pVP                  RR7       EF1  pVP                  '       gE   \        VVP                  4       \        VVP                  4       \        VVP                  4       KZ  V'       d“   \         ;QJ d&    R VP                   4       F  '       d   K   RM	  R	M! R VP                   4       4      '       dE   \        VVP                  4       \        VVP                  4       \        VVP                  4       Kô  \        V4      '       g   EK  \        VVP                  4       V'       d   EK)  \#        R
4      h	  \%        4       p. p. pV FK  p\'        V4      pV'       d%   VP)                  V4       VP+                  V4       K:  VP+                  V4       KM  	  \-        V P                  4      p\.        P0                  ! VW4       F™  pRVP2                  9  d   K  \5        VP2                  R,          4      \7        VP2                  R,          4      ,          V,
          p\9        VR R7       F$  pVV9  d   K  VP+                  VV,          4       K&  	  VV,          pK›  	  VP;                  4        VP=                  VV,           4       V'       Eg/   . p. p. pV F‹  p\?        VP2                  PA                  R4      \B        4      '       d   VP+                  V4       KE  VP2                  PA                  RR4      '       d   VP+                  V4       Kz  VP+                  V4       K�  	  VP;                  4        VP=                  VV,           4       \E        V4      p\G        V4       FN  w  p pV V8¼  g   K  VP2                  PA                  RR4      '       d   K3  \#        RV  RV R\E        V4       24      h	  \        V P                  Wß,           VV,           V,           V,           V,           T
\I        \E        V4      \E        V4      ,           \E        V4      ,           \E        V4      ,           4       U u. uF0  p V V8¼  d   V \E        V4      8  d   \K        V 4      M
\M        V 4      NK2  	  up ,           RVR7      p!\        V P                  VV,           V,           V,           V,           V,           V,           V	VRVR7      pM \        V P                  Wß,           W�,           V,           T
\I        \E        V4      \E        V4      ,           4       U u. uF  p \M        V 4      NK  	  up ,           RVR7      p!\        V P                  VV,           V,           V,           V	VRVR7      pVPN                   F%  pVPP                  R9   g   K  R	VP2                  R&   K'  	  \R        PT                  PW                  V V!4      p"\R        PT                  PW                  V V4      p#\X        PZ                  PA                  RR4       e   \]        VV"V#VV4       V"V#3# u up i u up i )a:  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ì  rG  rH  Nr�  )r‹  c              3  óÖ   "  € T F_  pVP                   \        P                  P                  P                  P
                  J ;'       d    \        VP                  4      ^ 8H  x € Ka  	  R# 5i©r   N)rÀ   rÆ   rç   r  Úwait_tensorrê   rÔ   rî   rŠ   s   & rY   r�   Ú+_extract_fwd_bwd_modules.<locals>.<genexpr>€  sW   é € ð )
ñ  �ð �H‰HœŸ	™	×2Ñ2×>Ñ>×FÑFÐF÷ "ð "Ü�A—G‘G“ Ñ!ô"ãùs   ‚AA)Á!A)FTz'backward_state_inputs must not be emptyrå   c                ó   € V P                   # r^   rf  )rã  s   &rY   r�   Ú*_extract_fwd_bwd_modules.<locals>.<lambda>²  s   € °1·6²6r\   r’   Úsaved_tensor_with_no_vc_checkzi=z, no_vc_check_start_idx=z, len(saved_values)=rŽ  Úautograd_backwardr8  )r  r,  )/rù  r÷   rV  Úfilterr?   r@   r>   r=   rº  r²  rÆ   ÚdistributedÚis_availablerî   r   rÌ   rï   rª   r/   r(   Úaddr¡  r&   rÚ  rÛ  r¹   ré  r'   r”   ÚclearÚextendrÅ   rº   r   rÔ   rÉ   ru  r9   r8   rø   r  r  Ú_lazy_graph_moduleÚ_make_graph_moduleÚinductor_configr=  r°  )$rë  rû  r³  r´  rì  r…   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_enabledrT   Ú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_graphru  rv  s$   &&&&$$$$                            rY   Ú_extract_fwd_bwd_modulesrÜ  ?  s°  € ô4 	! ÔOñ C€KÐ/ð  ×%Ñ%×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ˆà�z�zˆzÜ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÔ7ÜÐ.°·	±	Ö:÷
 !§S£Sñ )
ð —Z’Zó)
§S§S¢Sñ )
ð —Z’Zó)
÷ &
ò &
ô
 ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÔ7ÜÐ.°·	±	Ö:Ü ×%Õ%ä˜L¨$¯)©)Ô4ß(Ò(Ü$Ð%NÓOÐOñ- 7ô8 /9«l€MØ ÐØ Ðó  ˆÜ*¨4Ó0ˆßØ×Ñ˜fÔ%Ø#×*Ñ*¨4Ö0à#×*Ñ*¨4Ö0ñ  ô 3°<×3EÑ3EÓF€OÜ—’Ð 7¸ÖVˆØ˜Ÿ	™	Ô!Ùô /¨t¯y©y¸Õ/?Ó@Ü˜4Ÿ9™9 UÕ+Ó,õ-àõˆô
 ˜Ñ)9×:ˆAð ˜Ô'ÙØ#×*Ñ*¨?¸1Õ+=Ö>ñ ;ð 	˜Õ$Šñ- Wð6 ×ÑÔØ×ÑÐ2Ð5LÕLÔMç$Ð$ð &(Ð"Ø#%Ð Ø!ÐÛ ˆDä˜$Ÿ)™)Ÿ-™-¨Ó.Ô0@×AÒAØ$×+Ñ+¨DÖ1Ø—‘—‘Ð>À×FÒFØ(×/Ñ/°Ö5à*×1Ñ1°$Ö7ñ !ð 	×ÑÔØ×ÑÐ6Ð9QÕQÔRÜ #Ð$>Ó ?Ðô ! Ö.‰GˆAˆtØÐ)Ö)Ø—y‘y—}‘}Ð%DÀe×LÔLÜ(Ø˜Q˜CÐ7Ð8MÐ7NÐNbÔcfÐgsÓctÐbuÐvóð ñ /ô 7Ø×ÑØÕ2ØØõà"õ#ð !õ!ð õ	ð
 ô
 Ü˜Ó%ÜÐ.Ó/õ0äÐ,Ó-õ.ô ˜/Ó*õ+ôó	
ñ�Að Ð-Ô-°!´c¸,Ó6GÔ2Gô 4°AÔ6ä/°Ó2ò3ññ	
õð Ø$;ô+
ˆ	ô. 7Ø×ÑØØõà"õ#ð !õ!ð õ	ð
 %õ%ð $õ$ð ØØØ$;ô
‰	ô  7Ø×ÑØÕ2ØÕ&¨Õ8Øô œs <Ó0´3°Ó3GÕGÔHóáH�Aô +¨1Ö-ÙHñõð
 Ø$;ô
ˆ	ô 7Ø×ÑØØõà$õ%ð $õ$ð ØØØ$;ô

ˆ	ð —”ˆØ�7‰7Ð3Ö3Ø-1ˆD�I‰IÐ)Ó*ñ  ô ×&Ñ&×9Ñ9¸,È	ÓR€JÜ×&Ñ&×9Ñ9¸,È	ÓR€Jä×0Ñ0×4Ñ4Ø/°ó	
ð ò	ô
 	'ØØØØ'Øô	
ð �zÐ!Ð!ùòS
ùòFs   Ô.6\Ø\
Ústatic_lifetime_input_indicesc               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )rS   rë  rô   Ú_joint_inputsr
   rì  r§   rÝ  úlist[int] | Noner…   r¨  rV   rµ  rW   )rX   s   "rY   rZ   rZ   ;  sL   € ÷ j ñ j Ø ðj àðj ð ð	j ð
 $4ðj ð "<ðj ð +ñj r\   c          	     óœ  a€ . pRpV P                   P                   F:  p\        V4      '       g%   \        V4      '       g   \	        V4      '       g   K8  TpK<  	  Vf   \        R4      hV P                   P                   F,  p\        V4      '       g   VP                  V4       WvJ g   K,   M	  \        R V 4       4      p\        V 4      p	\        V 4      p
V	'       dQ   \        V P                   4      ^ ,          e&   \        P                  ! R4       \        V VVVR7      # \        V RR7      p \         P"                  '       g   \%        V 4       \'        V 4       \)        V 4       Vf   . p\+        WV4      p. p. p. p\,        P.                  P1                  4       oR R	 lpR
 R lpR V3R llpV P                   P                   EF–  pVP2                  V9  d   K  VP4                  R8X  d)   VP2                  R V P7                  4        4       9   d   KP  VP8                  \,        P:                  P<                  P>                  P@                  \,        P:                  P<                  PB                  P@                  \,        P:                  P<                  PB                  PD                  \,        P:                  PF                  PH                  P@                  \,        P:                  PF                  PJ                  P@                  \,        P:                  PF                  PL                  P@                  \,        P:                  PF                  PL                  PN                  39   d   EKŸ  \Q        V4      '       d   VP                  V4       EKÄ  V! V4      '       d   EKÕ  VPR                  PU                  R4      \V        PX                  8X  d8   \[        V4      '       d   VP                  V4       MVP                  V4       EK:  V! V4      '       d[   V	'       d   \        RV RVP8                   24      h\[        V4      '       d   VP                  V4       MVP                  V4       EK¢  \[        V4      '       d   VP                  V4       EKÇ  V! V4      '       g!   VP4                  R8X  d   \        RV R24      hVP\                   Uu. uF  pVP2                  V9  g   K  VNK  	  pp\^        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   VPa                  V4       EKq  \c        V4      '       d   EK…  VP                  V4       EK™  	  \e        \f        Pi                  V4      Pk                  4       4      p\e        \f        Pi                  V4      Pk                  4       4      pV Uu. uF  p\m        V4      '       d   K  VNK  	  pp\e        \f        Pi                  V4      Pk                  4       4      p\         Pn                  '       d   \o        V P                   V4      pVf   VPp                  p\s        V VVVVVR7      w  ppVP                   Pu                  \v        R7       VP                   Pu                  \v        R7       V	'       d.   V
'       d   \y        V VV\{        V4      4      w  pp\}        V4      p\         P~                  '       d   ^RI@H?p V! VVVV4       \ƒ        V4      p\ƒ        V4      p\…        VRR7      p\{        VP†                  4      ^ 8”  d   \…        VRR7      pVV3# u upi u upi )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 F#  qP                   R 8w  g   K  VP                  x € K%  	  R# 5i©rM  N©r  rÌ   rð  s   & rY   r�   Ú$default_partition.<locals>.<genexpr>g  s"   é € ð $Ù+�d¯w©w¸(Ñ/BŒ	ˆ�	Ž	›mùó   ‚-™-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               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   Ú'default_partition.<locals>.__annotate__�  s   € ÷ 
ñ 
˜ð 
 Dñ 
r\   c                óª   € R V P                   9   ;'       g>    \        V P                   P                  R4      \        P                  P
                  4      # )r  rå   )r¹   rÅ   rº   rÆ   Ú_subclassesÚ
FakeTensorr½   s   &rY   Ú	is_tensorÚ$default_partition.<locals>.is_tensor�  sB   € Ø §	¡	Ñ)÷ 
ð 
¬ZØ�I‰I�M‰M˜%Ó ¤%×"3Ñ"3×">Ñ">ó.
ð 	
r\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rê  ”  s   € ÷ 
ñ 
˜gð 
¨$ñ 
r\   c                óÒ   € \         ;QJ d&    R  V P                   4       F  '       d   K   RM	  RM! R  V P                   4       4      ;'       d    \        V P                  4      ^ 8„  # )c              3  óZ   "  € T F!  qP                   \        P                  8H  x € K#  	  R # 5ir^   )rÀ   r  r  rë   s   & rY   r�   Ú=default_partition.<locals>.is_multi_output.<locals>.<genexpr>–  s   é € ÐG¹J°D—‘œx×/Ñ/Ö/»Jùs   ‚)+FT)rï   rî   rÔ   r½   s   &rY   Úis_multi_outputÚ*default_partition.<locals>.is_multi_output”  sG   € ç‹CÑG¸D¿JºJÓG�C�CŠCÑG¸D¿JºJÓGÓG÷ $ð $Ü�D—J‘J“ !Ñ#ð	
r\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rê  š  s   € ÷ 
ñ 
˜ð 
 Dñ 
r\   c                óø   <€ V P                  R R7      ;'       da    V P                  R9  ;'       dJ    S'       * ;'       g;    V P                  \        P                  P
                  P                  P                  J# )F)Úimpure_random)rG  rM  )Ú	is_impurer  rÀ   rÆ   rç   r  rº  rê   )rT   rÐ  s   &€rY   rù  Ú$default_partition.<locals>.is_impureš  ss   ø€ ð �N‰N¨ˆNÓ/÷ 	ð 	Ø—‘ðñ÷	ð 	ð (Ô'÷ Uð UØ—;‘;¤e§i¡i×&@Ñ&@×&LÑ&L×&TÑ&TÐTð	
r\   r,  c              3  ó*   "  € T F	  w  rVx € K  	  R # 5ir^   rW   )r‹   Úkr±  s   &  rY   r�   rå  ¯  s   é € ð 3
Ù6‘$�!�AÓ6ùs   ‚r¸   z.Trying to apply AC on a graph with impure op: z, r  z	Expected z to be a tensorc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir^   )r    rŠ   s   & rY   r�   rå  Þ  s   é € Ð7¡ !Œ{˜1�~ˆ~£ùrò  F©r³  r´  rì  r…   )Úis_impure_node©Úenable_activation_offloading©r¾  )Dr÷   rø   rÃ  r?   r>   rª   r@   r¡  r/   rú   rý   r:   Ú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º   r0   Ú	MUST_SAVEr;   rî   rï   rÅ  r¾   rt  rÙ  ÚfromkeysrÜ  rð   Ú_sync_decision_cross_ranksr…   rÜ  r¢  r  Úfunctionalize_rng_opsrÔ   Ú#reordering_to_mimic_autograd_enginer  Ú,_activation_offloading.activation_offloadingrF   Úthread_graphsafe_rng_from_hopsr€   )rë  rß  rì  rÝ  r…   Úforward_nodesÚ	last_noderT   Úforward_node_namesÚgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsÚ	node_inforû  r³  r´  rî  rô  rù  rŒ   Úbackward_usagesÚ	fw_moduleÚ	bw_moduler  rÐ  s   &&$$$                  @rY   Údefault_partitionr$  ;  së  ø€ ð@ €MØ€IØ×"Ñ"×(Ô(ˆÜ˜t×$Ò$¬
°4×(8Ò(8Ô<OÐPT×<UÔ<UØŠIñ )ð ÒÜÐ9Ó:Ð:Ø×"Ñ"×(Ô(ˆÜ˜4× Ò Ø× Ñ  Ô&ØÕÙñ	 )ô
 $ñ $Ù+ó$ó Ðô "6°lÓ!CÐÜ%=¸lÓ%KÐ"ß!Ü × 2Ñ 2Ó3°AÕ6ÒBô �MŠMðLôô 7ØØØ /Ø.Kô	ð ô .¨lÐQUÔVˆä×:×:Ð:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ò,Ø(*Ð%ÜØ°_ó€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¡j °A·F±FÐBTÑ4TŸ1˜1¡jˆÐUß‹3Ñ7¡Ó7�3�3Š3Ñ7¡Ó7×7Ò7ð ×"Ñ" ?Ô3ÚÜ˜d×#Õ#Ø×Ñ ×%ñ} )ô@ œŸ™ lÓ3×8Ñ8Ó:Ó;€LÜœ4Ÿ=™=¨Ó9×>Ñ>Ó@ÓA€Oñ
 )óÙ(�Ô0GÈ×0M�ˆ™ð ð ô œ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   Ó
]Ó"]Ö>]	×]	g    €„.Ac               ó$   € V ^8„  d   QhRRRRRR/# )rS   r2  r§   r?  r$  rV   rW   )rX   s   "rY   rZ   rZ   +  s!   € ÷ "ñ "˜#ð " kð "°cñ "r\   c                ó&   € WP                   ,          # r^   )Úitemsize)r2  r?  s   &&rY   Ú_tensor_nbytesr(  +  s   € Ø—>‘>Õ!Ð!r\   c               ó    € V ^8„  d   QhRRRR/# rÿ   rW   )rX   s   "rY   rZ   rZ   /  s   € ÷ )ñ )�7ð )˜sñ )r\   c                óœ  a€ R  R loRV P                   9   Ed1   V P                   R,          p\        V\        4      '       d   ^# \        V\        \        34      '       d   \        V3R lV 4       4      # \        V\        4      '       d$   \        V3R lVP                  4        4       4      # \        V\        P                  4      '       d	   S! V4      # \        V\        P                  \        34      '       d4   \        P                  '       d   ^ # \        R\        V4       RV  R24      h\        R\        V4       RV  24      hV P                   R	8X  gc   \        V P"                  \        P$                  P&                  4      '       d1   \)        V P"                  P*                  P,                  4      ^ 8X  d   ^ # \        R
V  R24      h)c               ó    € V ^8„  d   QhRRRR/# )rS   rO  rÁ   rV   r§   rW   )rX   s   "rY   rZ   Ú_size_of.<locals>.__annotate__0  s   € ÷ Tñ T˜ð T Cñ Tr\   c                ó¤   € \        V \        P                  4      '       g   ^ # \        \	        V P                  4       RR7      V P                  4      # )r   é   ©Úfallback)rÅ   rÆ   rß  r(  r*   r2  r?  ©rO  s   &rY   Úobject_nbytesÚ_size_of.<locals>.object_nbytes0  s5   € Ü˜!œUŸ\™\×*Ò*ÙÜÔ/°·±³	ÀDÔIÈ1Ï7É7ÓSÐSr\   rå   c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir^   rW   ©r‹   rŒ   r2  s   & €rY   r�   Ú_size_of.<locals>.<genexpr>=  s   øé € Ð5±¨A‘} Q×'Ð'³ùó   ƒc              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir^   rW   r5  s   & €rY   r�   r6  ?  s   øé € Ð>±¨A‘} Q×'Ð'³ùr7  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¹   rÅ   r!   rt  r[  ÚsumrÙ  rÝ  rÆ   rß  ÚScriptObjectr   r   Ú(unsafe_treat_script_objects_as_zero_sizerŸ  r  r  rÀ   rÇ   rÈ   rÔ   rÊ   Úreturns)rT   rå   r2  s   & @rY   Ú_size_ofr=  /  sn  ø€ õTð
 �—	‘	ÕØ�i‰i˜ÕˆÜ�cœ<×(Ò(Ùô ˜œd¤E˜]×+Ò+ÜÔ5±Ó5Ó5Ð5Ü˜œT×"Ò"ÜÔ>°·±´Ó>Ó>Ð>Ü˜œUŸ\™\×*Ò*Ù  Ó%Ð%Ü˜œe×0Ñ0Ô2BÐC×DÒDô ×>×>Ð>ÙÜØ-¬d°3«i¨[¸	À$Àð HJð Jóð ô Ð3´D¸³I°;¸iÈÀvÐNÓOÐOØ‡w�w�*ÔÜ�4—;‘;¤§
¡
× 5Ñ 5×6Ò6Ü�—‘×#Ñ#×+Ñ+Ó,°Ô1áÜ
Ø
�ˆvÐdÐeóð r\   c               ó    € V ^8„  d   QhRRRR/# )rS   r÷   rh  rV   rü  rW   )rX   s   "rY   rZ   rZ   \  s   € ÷ Rñ R�hð R 4ñ Rr\   c           	     óN  € ^ RI Hp V! \        4      pV P                   F>  pVP                  R8X  g   K  W#P
                  P                  ;;,          ^,          uu&   K@  	  \        P                  R\        VP                  4       \        P                  ! ^4      RR7      4       R# )r   )r   r  ú%sT©r“   ÚreverseN)Úcollectionsr   r§   rø   r  rÀ   rs   rI   rN  r”   Úitemsr  Ú
itemgetter)r÷   r   ÚcntrT   s   &   rY   Ú
_count_opsrG  \  sk   € Ý'á%¤cÓ*€CØ—”ˆØ�7‰7�oÖ%Ø—‘×$Ñ$×%¨Õ*Õ%ñ ô ‡H�HˆT”6˜#Ÿ)™)›+¬8×+>Ò+>¸qÓ+AÈ4ÔPÖQr\   c               ó   € V ^8„  d   QhRR/# )rS   rV   z!list[torch._ops.OpOverloadPacket]rW   )rX   s   "rY   rZ   rZ   g  s   € ÷ ñ Ð8ñ r\   c                 ó¦  € . p \        \        P                  P                  4       F§  p\	        \        P                  P                  V4      p\        V\        P                  P                  4      '       g   KS  VP                  4        F@  p\        P                  P                  VP                  9   g   K.  V P                  V4        K¥  	  K©  	  V # r^   )ÚdirrÆ   rç   rè   r  rÅ   rÇ   ÚOpOverloadPacketÚop_overloadsrà   Ú	pointwiserÞ   r¡  )rç   Ú	attr_nameÚopoverloadpacketÚop_overloads       rY   Úpointwise_opsrQ  f  s�   € à-/€CÜœŸ™Ÿ™Ö(ˆ	Ü"¤5§9¡9§>¡>°9Ó=ÐÜÐ*¬E¯J©J×,GÑ,G×HÒHÙà+×8Ñ8Ö:ˆKÜ�y‰y×"Ñ" k×&6Ñ&6Ö6à—
‘
Ð+Ô,Úó	 ;ñ )ð €Jr\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   rÕ   útuple[Any, ...]Ú	depth_maprƒ   rV   zlist[tuple[fx.Node, int]]rW   )rX   s   "rY   rZ   rZ   w  s)   € ÷ Pñ PØ
ðPØ&8ðPàñPr\   c                ó  € V  Uu/ uFB  p\        V\        P                  P                  P                  4      '       g   K9  W!V,          bKD  	  pp\        VP                  4       \        P                  ! ^4      RR7      # u upi )rr  TrA  )	rÅ   rÆ   r  rT   r  r”   rD  r  rE  )rÕ   rT  rÎ   Ú
arg_depthss   &&  rY   Úsort_depthsrW  w  sk   € ñ (,óÙ'+ ¬z¸#¼u¿x¹x¿}¹}×?QÑ?Q×/RÔˆ�s�^Ò¡tð ð ô �*×"Ñ"Ó$¬(×*=Ò*=¸aÓ*@È$ÔOÐOùòs   …6A?Á A?c               ó    € V ^8„  d   QhRRRR/# )rS   Úgmrô   rV   rW   )rX   s   "rY   rZ   rZ   €  s   € ÷ Kñ K¨Nð K¸~ñ Kr\   c                óô  a
aa€ \         P                  ! 4       o/ o
V P                  P                  RR7       F  pSP	                  VV
3R l4      S
V&   K  	  \        V P                  P                  4       UUu/ uF  w  r!WbK	  	  uppoR V
VV3R llp\        \        \        V P                  P                  4      4      pRp\        P                  pV F1  pVP                   F  pSV,          V8  g   K  SV,          pTpK   	  K3  	  Vf   V # \        V P                  P                  4      RSV,            F\  pVP                  R8X  g   K  VP                  \        P                   P"                  P$                  P&                  J g   KT  V! V4       K^  	  \        V P                  P                  4      SV,          R  F  pV! V4       K  	  \        P                   P)                  V S4      p	V	# u uppi )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.
rG  rH  c                ó   <€ SV ,          # r^   rW   r�  s   &€rY   r�   Ú5reordering_to_mimic_autograd_engine.<locals>.<lambda>œ  s	   ø€ ¸¸A¾r\   c               ó    € V ^8„  d   QhRRRR/# ©rS   rT   rU   rV   rü  rW   )rX   s   "rY   rZ   Ú9reordering_to_mimic_autograd_engine.<locals>.__annotate__   s   € ÷ Dñ D 7ð D¨tñ Dr\   c                ó0  <€ V .p\        4       p\        V4      ^ 8”  dE   VP                  4       p W9   g   V S9   d   K/  VP                  V 4       WP                  ,          pKT  \        VV3R lR7      pV F  p SP                  V V3R l4      SV &   K  	  R# )r   c                ó   <€ SV ,          # r^   rW   )rŒ   Úorders   &€rY   r�   ÚSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>®  s	   ø€ À%ÈÆ(r\   r’   c                ó   <€ SV ,          # r^   rW   r�  s   &€rY   r�   rc  °  r’  r\   N)r/   rÔ   rl  rÃ  rW  r”   rY  )rT   Ú	cur_nodesÚinsertable_nodesr&  rg  rb  s   &  €€€rY   Úinsert_node_in_graphÚAreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph   sˆ   ø€ Ø�Fˆ	Ü0:³ÐÜ�)‹n˜qÔ Ø—=‘=“?ˆDØÔ'¨4°3¬;ÙØ× Ñ  Ô&ð ×-Ñ-Õ-ŠIô "Ð"2Ô8JÔKÐÛ$ˆDØ!×+Ñ+¨DÔ2BÓCˆC�‹Ió %r\   Nr  )r  rX  r÷   rV  rY  rÉ   rø   rt  rÀ  r@   ÚmathÚinfrî   r  rÀ   rÆ   rç   rè   r   rê   r4  )rY  rT   rÍ   rg  rË  Úfirst_node_in_bwdÚminimum_orderÚtangentrì   Únew_gmr&  rg  rb  s   &         @@@rY   r  r  €  s˜  ú€ ô. —’“
€IØ"$€Cð —‘×#Ñ# }Ð#Ö5ˆØ×'Ñ'¨Ô.>Ó?ˆˆD‹	ñ 6ô )2°"·(±(·.±.Ô(AÔBÑ(A™9˜3ˆTŠYÑ(AÒB€E÷Dò 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Ù  Ö&ñ Aô �R—X‘X—^‘^Ó$ UÐ+<Õ%=Ð%?Ó@ˆÙ˜TÖ"ñ Aô �X‰X×!Ñ! " iÓ0€FØ€Mùó[ Cs   Á9G4c               ó<   € V ^8„  d   QhRRRRRRRRRRR	R
RRRRRR/	# )rS   r"  útorch.fx.GraphModuler#  Úfw_noder  Úbw_nodeÚdeviceztorch.deviceÚ	rng_countr§   Úlast_fwd_inputÚlast_bwd_inputrV   z#tuple[torch.fx.Node, torch.fx.Node]rW   )rX   s   "rY   rZ   rZ   Î  sm   € ÷ X*ñ X*Ø#ðX*à#ðX*ð ðX*ð ð	X*ð
 ðX*ð ðX*ð "ðX*ð "ðX*ð )ñX*r\   c           	     ó^  € VP                   pVf   \        R4      hV P                  p	VP                  p
\        P                  P
                  P                  pV P                  P                  V4      ;_uu_ 4        V P                  P                  RV 24      p\        V4      P                  4       VP                  R&   TpRRR4       VP                  P                  V4      ;_uu_ 4        VP                  P                  RV 24      p\        V4      P                  4       VP                  R&   TpRRR4       \        VP                  4      pXVR&   V P                  P                  V4      ;_uu_ 4        V	P                  RVVP                  .VP                   O5VR7      pRRR4       VP#                  X4       V	P%                  V4       \        VP                  4      pXVR&   V
P'                  V4      ;_uu_ 4        V
P                  RVVP                  .VP                   O5VR7      pVP#                  V4       V
P%                  V4       RRR4       Wg3#   + '       g   i     EL¦; i  + '       g   i     ELH; i  + '       g   i     Lè; i  + '       g   i     Yg3# ; i)	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

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_stater  rG  rA   Úclone_stater¹   rÙ  rÖ   ry  rÀ   rÕ   r›  rœ  Úinserting_before)r"  r#  rq  rr  rs  rt  ru  rv  Ú
device_idxÚfw_graphÚbw_graphr  Úfwd_rng_stateÚbwd_rng_stateÚ	fw_kwargsÚfunctional_fw_nodeÚ
bwd_kwargsÚ
rng_outputs   &&&&&&&&          rY   Ú%apply_graphsafe_rng_functionalizationr‹  Î  sA  € ðL —‘€JØÒÜÐ:Ó;Ð;Ø�‰€HØ�‰€HÜ#(§<¡<×#9Ñ#9×#VÑ#VÐ ð 
�‰×	(Ñ	(¨×	8Õ	8Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆÜ$9¸&Ó$A×$MÑ$MÓ$Oˆ×Ñ˜5Ñ!Ø&ˆ÷ 
9ð 
�‰×	(Ñ	(¨×	8Õ	8Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆä$9¸&Ó$A×$MÑ$MÓ$Oˆ×Ñ˜5Ñ!Ø&ˆ÷	 
9ô �W—^‘^Ó$€IØ*€IˆkÑØ	�‰×	(Ñ	(¨×	1Õ	1Ø%×1Ñ1ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 2ó 
Ð÷ 
2ð ×!Ñ!Ð"4Ô5Ø×Ñ˜Ô ô �g—n‘nÓ%€JØ+€Jˆ{ÑØ	×	"Ñ	" 7×	+Õ	+Ø×)Ñ)ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 *ó 
ˆ
ð 	×%Ñ% jÔ1Ø×Ñ˜GÔ$÷ 
,ð Ð)Ð)÷M 
9×	8Ð	8ú÷ 
9×	8Ð	8ú÷ 
2×	1ú÷ 
,Ö	+ð Ð)Ð)ús3   Á;AIÃ-AI3Å9.JÈAJÉI0	É3J	ÊJ	ÊJ,	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rS   rë  rô   r"  r#  Únum_sym_nodesr§   rV   rµ  rW   )rX   s   "rY   rZ   rZ   )  sA   € ÷ Y ñ Y Ø ðY àðY ð ðY ð ð	Y ð
 +ñY r\   c                ó4  a'€ \         P                  ! 4       pR  R lpR R lo'R R lpV! V 4      pV! V4      pV! V4      p	/ p
V P                  P                   F‹  p\	        V4      '       g   K  \        V4      '       g   K)  VP                  V9  g   VP                  V	9  d   KM  W{P                  ,          pW‹P                  ,          pW›P                  ,          pRVRV/W¬&   K�  	  \        P                  P                  P                  p\        P                  P                  P                  pRpVP                  P                  R	R
7       F  pRVP                  9   g   K  Tp M	  Vf   \        R4      h. p\        \        VP                  P                  R	R
7      4      4      p\        \        VP                  P                  R	R
7      4      4      p\!        V'3R lV
P#                  4        4       4      pVP%                  \        P&                  ! R4      4       \)        V4      ^8„  p\        P*                  P,                  p\,        P.                  ;'       d?    V'       * ;'       d0    VP0                  '       * ;'       g    VP2                  P4                  p\7        V
P#                  4       4       EFO  w  ppVR,          pVR,          pS'! V4      pVP                  pVP                  pV'       d-   Ve)   \9        V4      '       d   \;        VVVVVVVV4      w  ppKm  VP=                  V4      ;_uu_ 4        VP?                  RVVP@                  .VPB                  O5VPD                  R7      pVP?                  R\F        PH                  V^ 3/ R7      pV! V4      VPJ                  R&   VP?                  R\F        PH                  V^3/ R7      p \L        PL                  ! VPJ                  4      V n%        VPO                  V 4       VPQ                  V4       VPS                  V4       RRR4       VP=                  V4      ;_uu_ 4        R\        V4       2p!VPU                  V!4      p"V! V4      V"PJ                  R&   RRR4       VP=                  V4      ;_uu_ 4        VP?                  RVX"VP@                  .VPB                  O5VPD                  R7      p VPO                  V 4       VPQ                  V4       RRR4       EKR  	  V'       d©   \        \W        VP                  P                  RR
7      4      4      p#V#PB                  ^ ,          p$\)        V$4      V,
          p%V$RV% \Y        V4      ,           V$V%R ,           p&VP                  P[                  V&4       VP                  PQ                  V#4       VP]                  4        VP]                  4        W3#   + '       g   i     EL»; i  + '       g   i     ELy; i  + '       g   i     EKa  ; i)c               ó    € V ^8„  d   QhRRRR/# )rS   Úgmodrô   rV   rx  rW   )rX   s   "rY   rZ   Ú+functionalize_rng_ops.<locals>.__annotate__D  s   € ÷ ñ ˜.ð Ð-?ñ r\   c                ó¬   € / pV P                   P                   F7  pVP                  R 8X  g   K  \        V4      '       g   K)  W!VP                  &   K9  	  V# )r  )r÷   rø   r  râ   rÌ   )r�  Úrandom_nodesrT   s   &  rY   Úget_rng_opsÚ*functionalize_rng_ops.<locals>.get_rng_opsD  sC   € Ø+-ˆØ—J‘J×$Ô$ˆDØ�w‰w˜/Ö)¬i¸¯o¬oØ*.˜TŸY™YÓ'ñ %ð Ðr\   c               ó    € V ^8„  d   QhRRRR/# )rS   rT   rU   rV   útorch.device | NonerW   )rX   s   "rY   rZ   r‘  K  s   € ÷ #ñ #˜ð #Ð%8ñ #r\   c                óT  € RV P                   9  d   R# V P                   R,          p\        V\        4      '       g   V3pV FN  p\        V\        P                  4      '       g   K%  \        VP                  4      '       g   KB  VP                  u # 	  \        P                  ! R4      # )zF
Check the example value of the node outputs to find the device type.
rå   NÚcpu)r¹   rÅ   r[  rÆ   rß  rC   rs  )rT   Ú
candidatesÚ	candidates   &  rY   Ú
get_deviceÚ)functionalize_rng_ops.<locals>.get_deviceK  s~   € ð ˜Ÿ	™	Ô!Ùà—Y‘Y˜uÕ%ˆ
Ü˜*¤e×,Ò,Ø$˜ˆJã#ˆIÜ˜)¤U§\¡\×2Ô2Ü)¨)×*:Ñ*:×;Ô;Ø$×+Ñ+Ò+ñ $ô
 �|Š|˜EÓ"Ð"r\   c               ó    € V ^8„  d   QhRRRR/# )rS   rs  r—  rV   r0  rW   )rX   s   "rY   rZ   r‘  ]  s   € ÷ 	@ñ 	@Ð%8ð 	@¸\ñ 	@r\   c                óF  € ^ RI Hp V! 4       pVf   \        R4      hT;_uu_ 4        V e6   \        V 4      '       d%   VP	                  \        V 4      4      uuRRR4       # VP	                  \        P                  ! 4       4      uuRRR4       #   + '       g   i     R# ; i)r   )Údetect_fake_modeNzfake_mode must not be None)Útorch._guardsr   rª   rC   Úfrom_tensorrB   rÆ   Úget_rng_state)rs  r   Ú	fake_modes   &  rY   Úget_sample_rng_stateÚ3functionalize_rng_ops.<locals>.get_sample_rng_state]  su   € Ý2á$Ó&ˆ	ØÒÜ Ð!=Ó>Ð>ßŠYØÒ!Ô&<¸V×&DÒ&DØ ×,Ñ,Ô-AÀ&Ó-IÓJ÷ ŠYð ×(Ñ(¬×)<Ò)<Ó)>Ó?÷ �Y�Y‹Yús   §/BÁ!#BÂB 	ÚfwdÚbwdNrG  rH  rm  zaCouldn't find tangent node in graph inputs. This is unexpected, please file a bug if you see thisc              3  óB   <"  € T F  pS! VR ,          4      x € K  	  R# 5i)r§  NrW   )r‹   Ú	node_pairrœ  s   & €rY   r�   Ú(functionalize_rng_ops.<locals>.<genexpr>‹  s"   øé € ð Ù6W¨‰
�9˜UÕ#×$Ð$Ó6Wùs   ƒr™  r  r{  rå   Úrng_state_output_rM  )/rÚ  Úcountr÷   rø   r¾   râ   rÌ   rÆ   r}  r~  Úrun_and_save_rng_stateÚrun_with_rng_staterV  rŸ  ró  r�  r/   rÝ  Údiscardrs  rÔ   r<  r   Úgraphsafe_rng_functionalizationÚfallback_randomÚtest_configsÚ*graphsafe_rng_func_ignores_fallback_randomrÉ   rC   r‹  r�  ry  rÀ   rÕ   rÖ   r  r  r¹   r{  r›  rœ  r¡  rG  rô  r[  rM  Ú	recompile)(rë  r"  r#  r�  Úuidr”  r¥  Újoint_graph_rng_opsÚfw_graph_rng_opsÚbw_graph_rng_opsÚrecomputable_rng_ops_maprT   Ú	base_noderq  rr  Úrun_and_save_rngr¯  Úbw_tangent_start_nodeÚfw_rng_state_outputsru  rv  ÚdevicesÚmulti_graphsafe_devicesÚ
ind_configÚ'use_rng_graphsafe_rng_functionalizationrt  rª  rs  rƒ  r„  rˆ  ÚstaterŠ  Ú
state_nameÚbw_rng_state_nodeÚfw_output_nodeÚ
fw_outputsÚsym_node_start_idxr‡  rœ  s(   &&&&                                   @rY   r  r  )  s…  ø€ ô2 �/Š/Ó
€Cõõ#õ$	@ñ & lÓ3ÐÙ" 9Ó-ÐÙ" 9Ó-ÐØ!ÐØ×"Ñ"×(Ô(ˆÜ˜$×Ô¤I¨d§O¤Oð �y‰yÐ 0Ô0°D·I±IÐEUÔ4UÙØ+¯I©IÕ6ˆIØ&§y¡yÕ1ˆGØ&§y¡yÕ1ˆGØ38¸'À5È'Ð2RÐ$Ó/ñ )ô —|‘|×-Ñ-×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ð RØ×&Ñ&×QÑQð ,ô !*Ð*B×*IÑ*IÓ*K× LÑˆ	�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 4ðH ×*Ñ*Ð+@×AÕAØ0´°c³°Ð<�
Ø$,×$8Ñ$8¸Ó$DÐ!Ù0DÀVÓ0LÐ!×&Ñ& uÑ-÷ Bð
 ×*Ñ*¨7×3Õ3Ø%×1Ñ1Ø#Ø&ð *ØŸ™ðð !Ÿ™ñð
 #Ÿ>™>ð 2ó 
�
ð ×-Ñ-¨jÔ9Ø×#Ñ# GÔ,÷ 4Ò3ñE !M÷j Üœd 9§?¡?×#=Ñ#=ÀÐ#=Ó#JÓKÓLˆØ#×(Ñ(¨Õ+ˆ
Ü  ›_¨}Õ<ÐàÐ*Ð*Ð+ÜÐ(Ó)õ*àÐ+Ð,Ð-õ.ð 	ð
 	�‰×Ñ˜wÔ'Ø�‰×"Ñ" >Ô2Ø×ÑÔØ×ÑÔØÐÐ÷S 4×3Ð3ú÷H B×AÐAú÷
 4×3Ñ3ús&   Ì<C/WÑ5W1Ò"AX×W.×1XØXc               ó    € V ^8„  d   QhRRRR/# ©rS   rë  rô   rV   rü  rW   )rX   s   "rY   rZ   rZ   	  s   € ÷ @ñ @¨ð @¸Dñ @r\   c                óF  € V P                   P                   F†  p\        VP                  \        P
                  P                  4      '       g   K9  VP                  P                  R8X  g   KV  \        V4      '       d   Ki  \        P                  VP                  R&   Kˆ  	  R# )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¾   r0   r  r¹   )rë  rT   s   & rY   r  r  	  sg   € ð ×"Ñ"×(Ô(ˆä�t—{‘{¤E§J¡J×$9Ñ$9×:Ô:Ø—‘×%Ñ%Ð);Ö;Ü" 4×(Ô(ä%5×%?Ñ%?ˆD�I‰I�kÓ"ó )r\   c               ó    € V ^8„  d   QhRRRR/# rÊ  rW   )rX   s   "rY   rZ   rZ   	  s   € ÷ 'ñ '¨>ð '¸dñ 'r\   c                óÖ   a€ R V3R lloV P                   P                   FD  p\        V4      '       g   K  \        V4      '       d   K)  \	        V4      '       d   K<  S! V4       KF  	  R# )a8  
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               ó    € V ^8„  d   QhRRRR/# r^  rW   )rX   s   "rY   rZ   Ú.force_save_effectful_ops.<locals>.__annotate__"	  s   € ÷ Hñ H 7ð H¨tñ Hr\   c                ó&  <€ V P                    F  pVP                  \        P                  J g   K#  S! V4       \	        VP
                  P                  R 4      \        \        34      '       d   Kb  \        P                  VP
                  R&   K�  	  R# )rå   r¸   N)rî   rÀ   r  r  rÅ   r¹   rº   r[  rt  r0   r  )rT   rì   Úmark_getitem_outputss   & €rY   rÑ  Ú6force_save_effectful_ops.<locals>.mark_getitem_outputs"	  s]   ø€ Ø—J”JˆDØ�{‰{œh×.Ñ.Õ.Ù$ TÔ*Ü! $§)¡)§-¡-°Ó"6¼Ä¸×FÔFÜ-=×-GÑ-G�D—I‘I˜kÓ*ó	 r\   N)r÷   rø   r   r¾   rœ  )rë  rT   rÑ  s   & @rY   r	  r	  	  sP   ø€ ÷Hð Hð ×"Ñ"×(Ô(ˆä˜D×!Ô!Ü" 4×(Ô(Ü(¨×.Ô.á  Ö&ó )r\   c               ó    € V ^8„  d   QhRRRR/# rÊ  rW   )rX   s   "rY   rZ   rZ   2	  s   € ÷ ñ ¨^ð Àñ r\   c                ó2  € \        4       p\        V P                  P                  4       Fé  pVP                  R 8X  d   K  VP
                  \        P                  P                  P                  P                  J pV'       d‘   \        V4      '       d#   VP                  VP                  ^ ,          4       \        V4      '       dK   VP                  ^ ,          V9   d1   \        P                   VP                  ^,          P"                  R&   Kä  Kæ  Kè   R# 	  R# )rM  r¸   N)r/   r�  r÷   rø   r  rÀ   rÆ   rç   rè   r   rê   r�  rÃ  rÕ   rÇ  r0   r  r¹   )rë  Úhas_mutation_in_bwrT   Úis_copy_s   &   rY   r
  r
  2	  sÃ   € ô 5?³LÐÜ˜×+Ñ+×1Ñ1Ö2ˆØ�7‰7�hÔÙà—;‘;¤%§)¡)§.¡.×"6Ñ"6×">Ñ">Ð>ˆßÜ+¨D×1Ò1Ø"×&Ñ& t§y¡y°¥|Ô4ä*¨4×0Ò0°T·Y±Y¸qµ\ÐEWÔ5WÜ1A×1KÑ1K�—	‘	˜!•×!Ñ! +Ó.ñ 6XÑ0ò ó! 3r\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rZ   I	  s   € ÷ Kñ K Wð K°ñ Kr\   c                ó  € V P                   \        P                  8w  d   R # V P                  ^ ,          p\	        V4      \
        P                  Jd   \        R\	        V4       24      hRVP                  9  ;'       d    V P                  R8H  # )Fz#expected parent to be fx.Node, got r  r  )
rÀ   r  r  rÕ   r  r  r  rª   r¹   r  )rT   Úparents   & rY   Úis_getitem_of_multi_outputrÚ  I	  sk   € Ø‡{�{”h×&Ñ&Ô&ÙØ�Y‰Y�q�\€FÜˆFƒ|œ2Ÿ7™7Ó"ÜÐBÄ4ÈÃ<À.ÐQÓRÐRØ §¡Ñ+×JÐJ°·±¸?Ñ0JÐJr\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   rë  rô   rè  rG   rV   rW   )rX   s   "rY   rZ   rZ   R	  s$   € ÷ 5ñ 5Ø ð5Ø;?ð5àñ5r\   c               óB  € V P                   P                   EF  p\        V4      '       Ed+   VP                   F„  p\        V4      '       g   K  RVP                  9   g   K)  RVP                  9   g   K<  VP                  R,          VP                  R,          8”  g   Kg  \
        P                  VP                  R&   K†  	  VP                  P                  RR4      '       dr   \        ;QJ d&    R VP                   4       F  '       g   K   RM	  RM! R VP                   4       4      '       g!   \
        P                  VP                  R&   EK:  EK=  EK@  RVP                  9  g   EKT  \        ;QJ d&    R VP                   4       F  '       g   K   RM	  RM! R VP                   4       4      '       g   EK¥  \        V4      '       d&   RVP                  ^ ,          P                  9   d   EKÛ  V'       g   EKæ  \
        P                  VP                  R&   EK  	  V # )zñ
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  ó8   "  € T F  p\        V4      x € K  	  R # 5ir^   ©r¾   rë   s   & rY   r�   Ú)cleanup_recompute_tags.<locals>.<genexpr>e	  s   é € ð EÙ1;¨”˜t×$Ð$³ùrò  Tc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir^   rà  rë   s   & rY   r�   rá  {	  s   é € Ð@±Z¨T”N 4×(Ð(³Zùrò  )r÷   rø   r¾   rî   r¹   r0   r  rº   r5  rÚ  rÕ   )rë  rè  rT   rì   s   &$  rY   r  r  R	  sw  € ð ×"Ñ"×(Õ(ˆÜ˜$×ÓØŸ
œ
�ä" 4×(Ô(Ø%¨¯©Ö2Ø%¨¯©Ö2ØŸ	™	 -Õ0°4·9±9¸]Õ3KÖKä-=×-GÑ-G�D—I‘I˜kÓ*ñ #ð �y‰y�}‰}Ð0°%×8Ò8ÇÃñ EØ15·²óEÇÇÂñ EØ15·²óE÷ Bò Bô& *:×)CÑ)C�—	‘	˜+Ô&ò'BÒ8ð*  §¡×*ß“Ñ@°T·Z²ZÓ@——’Ñ@°T·Z²ZÓ@×@Õ@ô +¨4×0Ò0°]ÀdÇiÁiÐPQÅl×FWÑFW×5Wç$Ò$ô &6×%?Ñ%?ˆD�I‰I�kÔ"ñW )ðX Ðr\   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )rS   r†  rh  r   r{   Úmin_cut_optionsr°   Údont_banr¨  rV   z)tuple[list[fx.Node], OrderedSet[fx.Node]]rW   )rX   s   "rY   rZ   rZ   Š	  sA   € ÷ v	&ñ v	&Øðv	&àðv	&ð #ðv	&ð )ð	v	&ð
 /ñv	&r\   c                ó”  aaaa=a>a?a@aAaBaCaDaEaFaGaHaIaJaKaL€ Sf   \        4       o\        4       oJ\        '       dV   \        R V P                   4       4      pV\        R SJP                   4       4      ,
          p\
        P                  RV4       R R lo>R R lo?R V>V?VJ3R	 lloB ^ R IoHR TBTTJ3R lloDR TDTTJ3R llpR TB3R lloCR TCTJ3R llpSHP                  ! 4       oI\        4       o=RTR T=TTITJ3R lllp	T P                   EFX  p
T
P                  R8X  d   K  T
SP                  9   d}   T
SP                  9  d6   SIP                  T
P                  R,           R\         P"                  RR7       M6SIP                  T
P                  R,           R\         P"                  RR7       K¤  \%        T
4      '       d7   SIP                  T
P                  R,           R\         P"                  RR7       Kë  \'        T
4      '       d   T	! T
R4       M\)        T
4      '       d
   T	! T
R4       T! T
4      pSP+                  T
4      '       d   T'       d	   T	! Y«4       R T
P,                  9  ;'       d    R!T
P,                  9  ;'       gH    R T
P,                  9   ;'       d1    \/        T
P,                  R ,          \0        P2                  4      '       * p\5        T
4      '       d   \7        \9        T
4      4      pR pM{T'       d_   \/        T
P,                  P;                  R 4      \<        \>        34      '       g   \A        T
4      '       d   R"pR pM(\         P"                  pR#pMT! T
SPB                  4      w  rÞT'       d\   T\         P"                  8X  g   T\D        8X  d<   SIP                  T
P                  R,           T
P                  R,           TR$T 2R7       M6SIP                  T
P                  R,           T
P                  R,           TR%7       T
PF                   FH  pSIP                  T
P                  R,           TP                  R,           \         P"                  R&R7       KJ  	  EK[  	  R' TBT3R( llpSPH                  '       EdX   SPJ                   EFF  pTPF                   Uu. uF-  pSP+                  T4      '       g   K  SPM                  T4      NK/  	  ppTPF                   Uu. uF  pSP+                  T4      '       g   K  TNK   	  pp\O        T4      ^ 8”  g   K�  T! T\Q        T4      4      p\S        TPF                  4       FŽ  pSP+                  T4      '       g   K  SPM                  T4      T8”  g   K4  SB! TT4      '       g   KE  TS=9   d   KN  \
        P                  R)TSPM                  T4      TTSPM                  T4      4       T	! T4       K�  	  EKI  	  SPT                  '       Ed   \        4       pT P                   EFc  pSP+                  T4      '       g   K  SPM                  T4      T3.pSPM                  T4      p\O        T4      ^ 8”  g   KT  \V        PX                  ! T4      w  ppTT9   d   K4  TP[                  T4       SPM                  T4      T^d,           8”  dR   \O        T4      ^ 8X  dB   \
        P                  R*TTSPM                  T4      SPM                  T4      4       T	! T4       Kõ  TPF                   F^  pSP+                  T4      '       g   K  SB! TT4      '       g   K-  TS=9  g   K6  \V        P\                  ! TSPM                  T4      T34       K`  	  EK$  	   SHP^                  ! SIR+R4      w  ppTw  p5oG\        4       p6TI3RM lT5 4        F"  w  oLp7T6P�                  TGTL3RN lT7 4       4       K$  	  \        4       p8T6 F@  w  p9p:T9R RU T:R RV 8w  d   \�        ROT9R RU  RPT:R RV  24      hT9R RU p-T8P[                  T-4       KB  	  \‘        T 4      oE\“        T P                  4       U;U
u/ uF  w  p;qªT;bK
  	  up
p;oF\•        TE3RQ lT8 4       TF3RR lRS7      p<T<S=3#   \         d   p\        R
4      ThR p?ii ; iu upi u upi   SHP`                   EdR   p\c        \d        Pf                  4      pR pR oAT Ph                  p  T e   T Pk                  R,R-R-R.7      M
\m        T 4      oA\o        R/R0 TA3R1 lR27       \q        R3R44      p\s        TR54      ;_uu_ 4       p!T!Pu                  SA4       R R R 4       M1  + '       g   i     M!; i  \v         d   pR6T R72p R p?MR p?ii ; iR8Py                  SHPz                  P|                  P                  SI4      4      o@\o        R/R9 T@3R: lR27       \�        SI4      p"T"'       Edá   / p#R+.p$R; R< lp%T" Fî  w  p&p'p(T$Pƒ                  T'4       T&R+8X  d,   T%! T'4      p)T#P…                  T). 4      Pƒ                  T(4       KJ  T'R8X  d,   T%! T&4      p)T#P…                  T). 4      Pƒ                  T(4       K|  T%! T&4      T%! T'4      8X  d,   T%! T&4      p)T#P…                  T). 4      Pƒ                  T(4       Kº  T%! T&4      p*T%! T'4      p+T#P…                  T+. 4      Pƒ                  R=T* 24       Kð  	  . p,T#P‡                  4        F8  w  p-p.T,Pƒ                  R>T- R?24       T. F  p/T,Pƒ                  R@T/ 24       K  	  K:  	  R8Py                  T,4      p0RAPy                  T$4      p1\‰        SI4      w  p2oKSK'       d   \o        R/RB TK3RC lR27       T'       d   RDT R82MRp3T2'       d   T3RET2 R82,          p3Rp4T'       d   RFp4\        RGT0 RHT1 R8T3 T4 24      Th\
        P                  RI4       \
        P                  RJ\‹        THTI3RK l4      4       \‰        SI4       h R p?i\v         dG    \
        P                  RI4       \
        P                  RJ\‹        THTI3RL l4      4       \‰        SI4       h i ; iu up
p;i )WNc              3  óÂ   "  € T FU  pVP                   R 8X  g   K  \        VP                  R4      '       g   K4  \        VP                  P                  4      x € KW  	  R# 5i)r  Ú_overloadpacketN)r  rß   rÀ   rÃ   rè  rð  s   & rY   r�   Ú solve_min_cut.<locals>.<genexpr>•	  sK   é € ð &
á)�Ø�w‰w˜/Ñ)ô -ä.5°d·k±kÐCT×.Uô -ŒC�—‘×+Ñ+×,Ð,Û)ùs   ‚AšA¸'Ac              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir^   )rÃ   ©r‹   r?  s   & rY   r�   ré  š	  s   é € ð 4
Ù5�qŒC��FˆFÓ5ùrò  z&Ops banned from re-materialization: %sc               ó$   € V ^8„  d   QhRRRRRR/# ©rS   ÚarU   ÚbrV   rG   rW   )rX   s   "rY   rZ   Ú#solve_min_cut.<locals>.__annotate__Ÿ	  s!   € ÷ ñ ¨Wð ¸ð ÀTñ r\   c                óx  € VP                   \        P                  P                  P                  8w  d   R # VP
                  ^ ,          p\        P                  P                  P                  V4      w  ppV F?  pVP                  V,          pWJ d    R# \        V\        4      '       g   K6  W9   g   K>   R# 	  R # ©FT)rÀ   rÆ   rç   r¶  Úauto_functionalizedrÕ   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsrÖ   rÅ   rt  )rî  rï  Ú
mutable_opÚmutable_arg_namesr  rÌ   rÎ   s   &&     rY   Ú!can_fuse_into_auto_functionalizedÚ8solve_min_cut.<locals>.can_fuse_into_auto_functionalizedŸ	  s“   € Ø�8‰8”u—y‘y×-Ñ-×AÑAÔAÙØ—V‘V˜A•Yˆ
ô ×#Ñ#×6Ñ6×GÑGàó
ñ	
ØØó
 &ˆDØ—(‘(˜4•.ˆCØ‹xÚÜ˜#œt×$Ô$Ø–8Úñ &ñ r\   c               ó$   € V ^8„  d   QhRRRRRR/# rí  rW   )rX   s   "rY   rZ   rð  ³	  s"   € ÷ ñ ¸'ð Àgð ÐRVñ r\   c                ó  € VP                   \        P                  P                  P                  8w  d   R # VP
                  R,          pV F5  pVP
                  R,          pVf   \        R4      hWC,          pWJ g   K4   R# 	  R # )FÚtensors_to_clonerÖ   zkwargs must not be NoneT)rÀ   rÆ   rç   r¶  r·  rÖ   rª   )rî  rï  rø  rÌ   rÖ   rÎ   s   &&    rY   Ú.can_fuse_into_triton_kernel_wrapper_functionalÚEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functional³	  sn   € Ø�8‰8”u—y‘y×-Ñ-×NÑNÔNÙØŸH™HÐ%7Õ8ÐÛ%ˆDØŸ(™( 8Õ,ˆFØŠ~Ü$Ð%>Ó?Ð?Ø•,ˆCØ�xÚñ &ñ r\   c               ó$   € V ^8„  d   QhRRRRRR/# rí  rW   )rX   s   "rY   rZ   rð  À	  s&   € ÷ Añ A�gð A 'ð A¨dñ Ar\   c                óž  <€ \        V4      \        P                  8X  d   R # S! W4      '       d   R # S! W4      '       d   R # V P                  \        P
                  J dF   V P                  ^ ,          P                  \        P                  P                  P                  J d   R# SP                  V 4      ;'       d    SP                  V4      # rö   )rE   rè   ÚcatrÀ   r  r  rÕ   rÆ   rç   r¶  r·  ra   )rî  rï  rù  rþ  Úop_typess   &&€€€rY   ra   Ú!solve_min_cut.<locals>.is_fusibleÀ	  sš   ø€ ô ˜1Ó¤§¡Ô)ÙÙ,¨Q×2Ò2ÙÙ9¸!×?Ò?Ùà�H‰Hœ×(Ñ(Ó(Ø—‘�q•	× Ñ Ü�y‰y×%Ñ%×FÑFóGñ
 Ø×"Ñ" 1Ó%×@Ð@¨(×*=Ñ*=¸aÓ*@Ð@r\   zANeed networkx installed to perform smart recomputation heuristicsc               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rð  Ú	  s   € ÷ ñ ¨ð °Dñ r\   c                ó`  <€ SP                  V 4      '       d   R # \        V .4      p\        V4      ^ 8”  dx   VP                  4       pVP                   FU  pSP                  V4      '       g   S! W#4      '       g    R# SP                  V4      '       g   KD  VP                  V4       KW  	  K‡  R # rò  )rm   r/   rÔ   rl  rî   rœ   rÃ  )rT   re  Úcurrì   ra   r   r  s   &   €€€rY   Úis_materialized_backwardsÚ0solve_min_cut.<locals>.is_materialized_backwardsÚ	  sˆ   ø€ Ø×Ñ˜D×!Ò!ÙÜ ˜vÓ&ˆ	Ü�)‹n˜qÔ Ø—-‘-“/ˆCØŸ	œ	�Ø ×/Ñ/°×5Ò5¹jÈ×>SÒ>SÚØ×#Ñ# D×)Ô)Ø—M‘M $Ö'ó	 "ñ r\   c               ó    € V ^8„  d   QhRRRR/# )rS   rT   rU   rV   rŠ  rW   )rX   s   "rY   rZ   rð  è	  s   € ÷ 9ñ 9 wð 9°:ñ 9r\   c                ó(  <€ V P                   R8w  d   R# V P                  \        P                  J d   R# V P                  P                  RR4      \        P                  8X  d   R# \        P                  '       d   SP                  V 4      '       d   R# V P                  \        P                  P                  \        P                  P                  39   d   R# SP                  '       d   SP!                  V 4      '       g   R# MESP#                  V 4      '       d   R# SP%                  V 4      '       d   R# \'        V 4      '       d   R# SP(                  '       d;   S! V 4      '       d-   \*        P-                  R	V \/        V P0                  4      4       R
# V P2                  R8  d"   V P2                  \        P4                  8”  d   R# SP6                  '       d8   \9        R V P:                   4       4      p\=        V 4      pV^,          V8  d   R# R# )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  ó|   "  € T F2  p\        V\        P                  4      '       g   K%  \        V4      x € K4  	  R # 5ir^   )rÅ   r  r  r=  rë  s   & rY   r�   ÚBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>
  s(   é € ð %Ù%. ´*¸QÄÇÁ×2H””˜—�£Yùs   ‚"<©<zreduction op)r  rÀ   r  r  r¹   rº   r0   r  r   Úrecompute_viewsrm   rè   Úlift_fresh_copyrê   Ú
lift_freshr´   rq   ri   re   rµ  r³   rI   r¬  r[  rî   Údist_from_bwÚmax_dist_from_bwrµ   r9  rÕ   r=  )rT   Úinput_tensors_sizeÚoutput_sizer  rä  r  s   &  €€€rY   Úshould_ban_recomputationÚ/solve_min_cut.<locals>.should_ban_recomputationè	  s™  ø€ à�7‰7�oÔ%ÙØ�;‰;œ(×*Ñ*Ó*ÙØ�9‰9�=‰=˜ dÓ+Ô/?×/IÑ/IÔIÙ%Ü×!×!Ð! h×&6Ñ&6°t×&<Ò&<ÙØ�;‰;œ4×/Ñ/×7Ñ7¼¿¹×9PÑ9PÐQÔQÙà×2×2Ð2Ø×+Ñ+¨D×1Ò1Ù6ð 2ð ×!Ñ! $×'Ò'Ù"Ø×,Ñ,¨T×2Ò2Ù-Ü(¨×.Ò.Ù'ð ×7×7Ð7Ñ<UØ÷=
ò =
ô �I‰IÐ5°t¼UÀ4Ç:Á:Ó=NÔOÙ-ð ×Ñ Ô$¨×):Ñ):¼V×=TÑ=TÔ)Tá*ð ×+×+Ð+Ü!$ñ %Ø%)§Y¢Yó%ó "Ðô # 4›.ˆKØ˜Q�Ð!3Ô3Ù%Ùr\   c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   rð  #
  s   € ÷ Fñ F˜gð F¨$ñ Fr\   c                óê   <a € S P                   R 8X  d   R# \        ;QJ d4    VV 3R lS P                   4       F  '       d   K   R'       * # 	  R'       * # ! VV 3R lS P                   4       4      '       * # )rG  Tc              3  ó6   <"  € T F  pS! SV4      x € K  	  R # 5ir^   rW   )r‹   rì   ra   rT   s   & €€rY   r�   Ú9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>'
  s   øé € ÐE¹*°$‘z $¨×-Ð-»*ùó   ƒF)r  rï   rî   )rT   ra   s   f€rY   Úis_materializedÚ&solve_min_cut.<locals>.is_materialized#
  sL   ù€ Ø�7‰7�mÔ#Ùç“3ÕE¸$¿*º*ÓE—3”3ÔEÐE’3ÔEÐE�3ÕE¸$¿*º*ÓEÓEÔEÐEr\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   rT   rU   r…   r~   rV   ztuple[float, str | None]rW   )rX   s   "rY   rZ   rð  )
  s$   € ÷ &$ñ &$Øð&$Ø4Gð&$à	!ñ&$r\   c           
     ó<  <€ \         P                  '       d	   W9   d   R# \        V 4      p\         P                  '       d*   SP	                  V 4      '       d   \
        P                  R3# \        V P                  R,          \        4      '       d:   \        V P                  R,          \        P                  4      '       g	   \        R3# \        VR\        \        V P                   ^d4      ^4      ,          ,          4      pS! V 4      '       d   VR3# V^,          R3# )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.
Nzview op (recompute_views=True)rå   z$SymFloat (non-SymInt symbolic value)gš™™™™™ñ?r¹  )r   Ú treat_parameters_as_free_to_saver=  r  rm   ri  rj  rÅ   r¹   r!   rÆ   r  ÚINT_INFr§   r	  r
  r  )rT   r…   Úmem_szr  r  s   && €€rY   Úget_node_weightÚ&solve_min_cut.<locals>.get_node_weight)
  sâ   ø€ ô ×3×3Ð3ØÔ3àˆNÜ˜$“ˆÜ×!×!Ð! h×&6Ñ&6°t×&<Ò&<ô —8‘8Ð=Ð=Ð=ä�d—i‘i Õ&¬×5Ò5ä˜dŸi™i¨Õ.´·±×=Ò=ÜÐ FÐFÐFô à�cœS¤ T×%6Ñ%6¸Ó!<¸aÓ@Õ@ÕAó
ˆñ ˜4× Ò Ø˜4�<Ðà˜A•:˜tÐ#Ð#r\   rd  c               ó$   € V ^8„  d   QhRRRRRR/# )rS   rT   rU   ÚreasonrÃ   rV   rG   rW   )rX   s   "rY   rZ   rð  T
  s!   € ÷ ñ ¨7ð ¸Cð Èñ r\   c                óx  <€ SP                  V 4      '       d   R # V S9   dp   \        V P                  \        P                  P
                  4      ;'       d    V P                  P                  R8H  p\        P                  '       g	   V'       g   R # \        V 4      '       d   R # RV P                  9   d4   \        V P                  R,          \        P                  4      '       d   R # SP                  V 4       SP                  RV P                  R,           \        P                   V'       d   RV 2MRR7       R# )	Fr  rå   r#  Ú_inzcannot recompute: zcannot recompute©Úcapacityr&  T)rm   rÅ   rÀ   rÆ   rÇ   rÈ   r  r   r  r¾   r¹   r  rÃ  Úadd_edgerÌ   ri  rj  )rT   r&  Úis_collectiveÚbanned_nodesrå  Únx_graphr  s   && €€€€rY   Úban_recomputation_if_allowedÚ3solve_min_cut.<locals>.ban_recomputation_if_allowedT
  sö   ø€ Ø×Ñ˜D×!Ò!ÙØ�8Ôô ˜4Ÿ;™;¬¯
©
×(=Ñ(=Ó>÷ @ð @Ø—K‘K×)Ñ)Ð-?Ñ?ð ô ×>×>Ð>ÇmÙô ˜$×ÒÙà�D—I‘IÔ¤*¨T¯Y©Y°uÕ-=¼u¿~¹~×"NÒ"NÙØ×Ñ˜Ôð
 	×ÑØØ�I‰I˜ÕÜ—X‘Xß4:Ð'¨ xÑ0Ð@Rð	 	ô 	
ñ r\   rM  Ú_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  rÓ   znon-tensor outputzcannot save: )r*  zdata dependencyc               ó$   € V ^8„  d   QhRRRRRR/# )rS   Ústart_nodesr|   Ú	max_ranger§   rV   rW   )rX   s   "rY   rZ   rð  à
  s!   € ÷ ñ ¨-ð ÀCð ÈCñ r\   c                óð  <€ . pV  F,  p\         P                  ! VS
P                  V4      VR34       K.  	  \        V4      ^ 8”  d±   \         P                  ! V4      w  rEpV'       g   S
P                  V4      # VP
                   Fl  pS
P                  V4      '       g   K  S
P                  V4      V8”  d   K4  S
P                  V4      VS	! WW4      3pW‚9  g   KV  \         P                  ! W(4       Kn  	  KÀ  V# )zl
Finds the first unfusible node in the chain of nodes starting from
`start_nodes` and returns its position.
T)ÚheapqÚheappushr«   rÔ   Úheappoprî   rœ   )r4  r5  Úsorted_nodesrŒ   r  rT   Únode_is_fusiblerì   rå   ra   r   s   &&       €€rY   Úfind_first_unfusibleÚ+solve_min_cut.<locals>.find_first_unfusibleà
  sÛ   ø€ ð
 9;ˆÛˆAÜ�NŠN˜<¨)×*@Ñ*@ÀÓ*CÀQÈÐ)MÖNñ ô �,Ó !Ô#Ü',§}¢}°\Ó'BÑ$ˆA�_ß"Ø ×-Ñ-¨dÓ3Ð3ØŸ
œ
�Ø×+Ñ+¨D×1Ô1Ø ×-Ñ-¨dÓ3°iÔ?Ù à!×.Ñ.¨tÓ4ØÙ" 4Ó.ð6�Cð
 Ö.ÜŸš |Ö9ó #ð Ðr\   z1used above/below fusible %s:(%s) -> %s -> %s:(%s)ztoo long %s %s %s %sr#  FTrƒ  rz  c                 ó   € R RRR/# )rÌ   Úmin_cut_failed_fx_graphr}  r~  rW   rW   r\   rY   r�   Úsolve_min_cut.<locals>.<lambda>]  s   € ØÐ5Ø ñ%r\   c                 ó   <€ S # r^   rW   )Úfx_graph_strs   €rY   r�   r@  a  s   ø€ ¡<r\   r‹  Úmin_cut_failed_graphz.txtÚwz(failed to write: Ú)Ú
c                 ó   € R RRR/# )rÌ   Úmin_cut_failed_edge_listr}  r~  rW   rW   r\   rY   r�   r@  n  s   € ØÐ2Ø˜Hñ!r\   c                 ó   <€ S # r^   rW   )Úedge_list_strs   €rY   r�   r@  r  s   ø€ ™}r\   c               ó    € V ^8„  d   QhRRRR/# )rS   Ú	node_namerÃ   rV   rW   )rX   s   "rY   rZ   rð  †  s   € ÷ !ñ !¨ð !°ñ !r\   c                óh   € R F+  pV P                  V4      '       g   K  V R\        V4      )  u # 	  V # )r(  N)r(  r1  )ÚendswithrÔ   )rL  Úsuffixs   & rY   Úget_base_nameÚ$solve_min_cut.<locals>.get_base_name†  s8   € Û-�FØ ×)Ñ)¨&×1Ô1Ø(¨¬C°«K¨<Ð8Ò8ñ .ð !Ð r\   zdepends on z  Ú:z    - z -> c                 ó   € R RRR/# )rÌ   Úmin_cut_failed_svgr}  r~  rW   rW   r\   rY   r�   r@  ±  s   € ØÐ 4Ø" Hñ)r\   c                 ó   <€ S # r^   rW   )Úsvg_contents   €rY   r�   r@  µ  s   ø€ ¡{r\   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   <€ R P                  S P                  P                  P                  S4      4      # ©rF  ©ÚjoinÚ	readwriteÚedgelistÚgenerate_edgelist©Únxr.  s   €€rY   r�   r@  Ü  ó#   ø€ ˜Ÿ	™	 "§,¡,×"7Ñ"7×"IÑ"IÈ(Ó"SÔTr\   c                 ól   <€ R P                  S P                  P                  P                  S4      4      # rX  rY  r^  s   €€rY   r�   r@  æ  r`  r\   c              3  ó8   <"  € T F  qSV,          3x € K  	  R # 5ir^   rW   )r‹   rŒ   r.  s   & €rY   r�   ré  î  s   øé € Ð8©i¨˜ �Õ$«iùs   ƒc              3  ó<   <"  € T F  qS9   g   K  SV3x € K  	  R # 5ir^   rW   )r‹   r±  Únon_reachableÚus   & €€rY   r�   ré  ï  s   øé € ÐA¡d °=Ñ.@”f�q˜!•f£dùs   ƒ�znode_in[:-3]=z != node_out[:-4]=c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir^   rW   ©r‹   rT   Úname_to_nodes   & €rY   r�   ré  þ  s   øé € Ð2©	 ˆ�d×	Ò	«	ùr  c                ó   <€ SV ,          # r^   rW   )rO  Únode_idxs   &€rY   r�   r@  þ  s	   ø€ À(È1Æ+r\   r’   )rd  éýÿÿÿéüÿÿÿ)Kr/   Úget_default_op_listrH   rø   rP   rI   rN  ÚnetworkxÚImportErrorrŸ  ÚDiGraphr  r€   r�   r+  rÌ   ri  rj  r¾   r?   r>   rœ   r¹   rÅ   rÆ   rß  r    r×  r  rº   r   r   r;   r…   r!  rî   r±   r–   r«   rÔ   r	  r[  r²   r7  r9  rÃ  r8  Úminimum_cutÚNetworkXUnboundedrG   r   Úhandlersr3  rˆ  rÃ   r   Ú_get_unique_pathÚopenÚwriteÚ	ExceptionrZ  r[  r\  r]  Ú_find_infinite_capacity_pathr¡  Ú
setdefaultrD  Úvisualize_min_cut_graphr   ræ  rª   Úget_name_to_noderÉ   r”   )Mr†  r   rä  rå  Újoint_module_opsÚops_ignoredÚer  r#  r/  rT   Ú
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_nodesrP  Ú	from_nodeÚto_noder&  ÚbaseÚ	from_baseÚto_baseÚconstraint_linesrL  ÚconstraintsÚcÚconstraints_strÚraw_path_strÚsvg_pathÚlocal_files_msgÚtlparse_msgÚ	reachableÚcutsetÚnbrsÚ	cut_nodesÚnode_inÚnode_outrÍ   rû  r-  rù  rþ  rJ  rB  ra   r  r  rh  rj  rd  r_  r.  r  rV  re  sM   &fff                                                         @@@@@@@@@@@@@@@@rY   Úsolve_min_cutr§  Š	  s_  ÿÿú€ ð ÒÜ“<ˆÜ"Ó$€HçÓÜ%ñ &
à#×)Ò)ó&
ó 
Ðð
 '¬ñ 4
Ø$×5Ò5ó4
ó *
õ 
ˆô 	�‰Ð9¸;ÔGõõ(÷Aò Að&Û÷ò ÷9ò 9÷vFð F÷&$ñ &$ðP �zŠz‹|€HÜ(2«€L÷õ ð@ ×!Õ!ˆØ�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Ù(¨Ô:ð ˜Ÿ™Ñ"×EÐE }¸D¿I¹IÑ'E÷Uð Uà�t—y‘yÑ ×SÐ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 "÷Xñ ð4 ×,×,Ñ,Ø"×4Õ4ˆIð &ŸOšOóá+�DØ×+Ñ+¨D×1ô -�	×&Ñ& tÖ,Ù+ð ð ð "+§¢óÙ!0˜°I×4LÑ4LÈT×4R—�¡ð ð ô �6‹{˜QŽÙ&:¸8ÄSÈÃ[Ó&QÐ#Ü! )§/¡/Ö2�Dà!×0Ñ0°×6Ô6Ø%×2Ñ2°4Ó8Ð;NÖNÙ& y°$×7Ô7à <Ô/Ù$ÜŸ™ØOØ%Ø%×2Ñ2°9Ó=Ø/Ø Ø%×2Ñ2°4Ó8ôñ 5°TÖ:ô! 3ñ 5ðP ×1×1Ñ1Ü'1£|ˆØ%×+Õ+ˆJØ×+Ñ+¨J×7Ò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�Dà!×0Ñ0°×6Ô6Ù& s¨D×1Ô1Ø ¨Ö4äŸš w°×1GÑ1GÈÓ1MÈtÐ0TÖUô &ñ7 ,ðFbØ!Ÿ~š~¨h¸À&ÓIÑˆ	�9ðF  )Ñ€Iˆ}Ü*4«,€FÜ8©iÖ8‰ˆˆ4Ø�‰ÕA¡dÓAÖAñ 9ô ",£€IÛ#Ñˆ�Ø�3�Bˆ<˜8 C R˜=Ô(Ü Ø ¨¨ ˜~Ð-?ÀÈÈ"À¸ÐOóð ð ˜C˜R�Lˆ	Ø�‰�iÖ ñ $ô $ KÓ0€Lä+4°[×5FÑ5FÔ+GÔHÑ+G™i˜c 4�c’	Ñ+GÒ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ˆßˆ8ð 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öñ% /7ð. +-ÐØ*:×*@Ñ*@Ö*BÑ&�	˜;Ø ×'Ñ'¨"¨Y¨K°qÐ(9Ô:Û$�AØ$×+Ñ+¨f°Q°C¨LÖ9ó %ñ +Cð
 #Ÿ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¸   Â%a& ÒbÒ=bÓ"b
Ô b
Ý*b à5qá&bá1a=á=bâqâ!)o-ãAeä!d<ä3eä;o-ä<eåeåo-åeåe*åe%å o-å%e*å*G=o-í(o-í8o-îAo-ï-qï:Aqc               ó    € V ^8„  d   QhRRRR/# )rS   r.  únx.DiGraph[str, dict[str, Any]]rV   z!list[tuple[str, str, str]] | NonerW   )rX   s   "rY   rZ   rZ     s   € ÷ ñ Ø-ðà&ñr\   c                óÒ  € \        R.4      p\        R. 3.4      pV'       dÅ   VP                  4       w  r4V P                  V4       F›  pWQ9   d   K  W,          V,          pVP	                  R^ 4      pV\
        P                  8X  g   V\        8X  g   KN  VP	                  RR4      pW5V3p	WI.,           p
VR8X  d   V
u # VP                  V4       VP                  WZ34       K�  	  KÌ  R# )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&  Úunknownr2  N)
r/   r   ÚpopleftÚ
successorsrº   ri  rj  r!  rÃ  r¡  )r.  r‡  ÚqueuerT   Ú	edge_pathÚneighborÚ	edge_datar*  r&  Únew_edgeÚnew_paths   &          rY   rx  rx    sÒ   € ô ˜(˜Ó$€Gô <AÀ8ÈRÀ.ÐAQÓ;R€Eç
ØŸ-™-›/‰ˆØ ×+Ñ+¨DÖ1ˆHØÔ"ÙØ � xÕ0ˆIØ —}‘} Z°Ó3ˆHàœ4Ÿ8™8Ô# x´7Ö':Ø"Ÿ™ x°Ó;�Ø ¨FÐ3�Ø$ zÕ1�Ø˜vÔ%Ø#’OØ—‘˜HÔ%Ø—‘˜hÐ1Ö2ó 2ñ r\   c               ó$   € V ^8„  d   QhRRRRRR/# )rS   Ú	base_namerÃ   Ú	extensionrV   rW   )rX   s   "rY   rZ   rZ   $  s!   € ÷ /ñ / ð /°ð /¸ñ /r\   c                óà   € V  V 2p\         P                  P                  V4      '       g   V# ^p\         P                  P                  V  RV V 24      '       d   V^,          pK7  V  RV V 2# )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  )ÚosÚpathÚexists)rµ  r¶  r¹  Úcounters   &&  rY   rt  rt  $  so   € ð
 ˆ[˜˜Ð$€DÜ�7‰7�>‰>˜$×ÒØˆà€GÜ
�'‰'�.‰.˜I˜; a¨ y°°Ð<×
=Ò
=Ø�1�ŠØˆ[˜˜'˜ 9 +Ð.Ð.r\   c               ó    € V ^8„  d   QhRRRR/# )rS   r.  r©  rV   ztuple[str | None, str | None]rW   )rX   s   "rY   rZ   rZ   3  s   € ÷ $!ñ $!Ø-ð$!à"ñ$!r\   c                óØ  € ^ RI p ^ RIpTP
                  P                  T 4      P                  4       pTP                  T4      ^ ,          pTP                  4        Fr  pYP                  4       ,          TP                  4       ,          R,          pTP                  \        T4      4       T\        R4      8X  g   Ka  TP                  R4       Kt  	  TP!                  4       P#                  R4      p\%        R	R
4      p\'        TR4      ;_uu_ 4       p	T	P)                  T4       RRR4       Y‡3#   \         d    \        P	                  RRR7       Ru # i ; i  + '       g   i     Y‡3# ; i)z~Visualize the min-cut graph to an SVG file.

Returns (path_to_svg, svg_content) tuple. Both are None if pydot is unavailable.
NzMInstall pydot to visualize the min-cut graph for debugging: pip install pydotT)Úexc_infor*  rj  Úredúutf-8Úmin_cut_failedú.svgrD  )NN)rn  Úpydotro  rI   rN  Únx_pydotÚto_pydotÚ	to_stringÚgraph_from_dot_dataÚ	get_edgesÚ
get_sourceÚget_destinationÚ	set_labelrÃ   r×  Ú	set_colorÚ
create_svgÚdecodert  ru  rv  )
r.  r_  rÃ  Ú
dot_formatÚ	dot_graphÚedger�  rV  rž  r�  s
   &         rY   rz  rz  3  s9  € ó ðÛð —‘×%Ñ% 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- ÄEÄ-$EÅEÅE)	c               ó   € V ^8„  d   QhRR/# )rS   rV   rK   rW   )rX   s   "rY   rZ   rZ   Z  s   € ÷ fñ f˜Wñ fr\   c                 óì  € . \         P                  N\         P                  N\         P                  N\         P                  N\         P
                  N\         P                  N\         P                  N\         P                  N\         P                  N\         P                  N\         P                  N\         P                  N\         P                  N\         P                  N\         P                  N\         P                   N\         P"                  N\         P$                  N\         P&                  N\         P(                  N\         P*                  N\         P,                  N\         P.                  N\         P0                  N\         P2                  N\         P4                  N\         P6                  N\         P8                  N\         P:                  N\         P<                  N\         P>                  N\         P@                  N\         PB                  N\         PD                  N\         PF                  N\         PH                  N\         PJ                  N\         PL                  N\         PN                  N\         PP                  N\         PR                  N\         PT                  N\         PV                  N\         PX                  N\         PZ                  N\         P\                  N\         P^                  N\         P`                  N\         Pb                  N\         Pd                  N\         Pf                  N\         Ph                  N\         Pj                  N\         Pl                  N\         Pn                  N\         Pp                  N\         Pr                  N\         Pt                  N\         Pv                  N\         Px                  N\         Pz                  N\         P|                  N\         P~                  N\         P€                  N\         P‚                  N\         P„                  N\         P†                  N\         Pˆ                  N\         PŠ                  N\         PŒ                  N\Ž        P�                  N\         P’                  N\         P”                  N\         P–                  N\         P˜                  Np \         P’                  \         P”                  \         Pš                  .pV\         Pœ                  \         Pž                  \         P                   \¢        P¤                  \         P¦                  \         P¨                  \         Pª                  \         P¬                  \         P®                  .	,          pTpV . \¢        P                  N\¢        P°                  N\¢        P²                  N\         P´                  N\         P˜                  N\         P¶                  N\¢        P¸                  N\¢        P€                  N\         P¸                  N\         Pº                  N\¢        P¤                  N\         P¬                  N\         P¼                  N\         Pœ                  N\         P¦                  N\         Pž                  N\         P¾                  N\         PÀ                  N\         PÂ                  N\         PÄ                  N\         PÆ                  N\         PÈ                  N\         PÊ                  N\         PÌ                  N\         PÎ                  N\         PÐ                  N\         PÒ                  N\         PÔ                  N\         P¨                  N\         PÖ                  N\         PØ                  N\         PÚ                  N\         PÜ                  N\         PÞ                  N\¢        Pà                  N\¢        Pâ                  N,          p V \         Pä                  \         Pæ                  .,          p W,          p V \é        4       ,          p V \         Pê                  .,          p T \ì         Uu. uF  p\ï        V4      NK  	  up,          p \ñ        V 4      p\ð        \ò        R \ô        3,          ,          ! \         Pö                  \         Pø                  \         Pú                  .4      p\         Pü                  \         Pþ                  \         EP                   \         EP                  \         EP                  \         EP                  \         EP                  \         EP
                  \         EP                  \         EP                  \         EP                  .pWE,          pE\        V\ñ        V4      V\ñ        V4      V4      # u upi ).)Šrè   rÃ  rš  rm  Úatan2r  r	  r
  ÚpowÚ	remainderÚfmodÚ__and__Ú__or__Ú__xor__Ú
__lshift__Ú
__rshift__ÚeqÚneÚgeÚgtÚleÚltr  Úbitwise_notÚceilÚfloorÚfracÚnegÚreluÚroundÚsiluÚtruncrI   Úlog10Úlog1pÚlog2ÚlgammaÚexpÚexpm1ÚerfÚerfcÚcosÚacosÚcoshÚsinÚasinÚsinhÚtanÚatanÚtanhÚatanhÚsqrtÚrsqrtr  ÚsigmoidÚsoftplusÚ	thresholdÚthreshold_backwardÚclampÚwhereÚlerpÚaddcmulÚgeluÚgelu_backwardr9  ÚmeanÚ_grad_sum_to_sizeÚsum_to_sizer  ÚtoÚtype_asr  r  ÚsqueezeÚ	unsqueezeÚrsubÚ_to_copyÚaliasr!  ÚsliceÚtr  Úbroadcast_in_dimÚexpandÚ
as_stridedÚpermuteÚselectr>  r  Úprepare_softmax_onlineÚcloneÚ	full_likeÚvarÚstdÚ_unsafe_viewr"  Úbroadcast_tensorsÚscalar_tensorÚonesÚ	new_zerosr  ÚarangeÚtriuÚvar_meanÚisinfr5  ÚfullÚzerosÚemptyÚ
empty_likeÚargmaxÚmaximumÚiotaÚ'_low_memory_max_pool_offsets_to_indicesr|  ÚgatherrQ  Ú
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_mmrK   )Údefault_recomputable_opsÚrecomputable_view_opsrO   ÚmrP   rN   rM   rL   s           rY   rm  rm  Z  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Ü×%Ò%Ü×)Ò)Ü× Ò Ü�ŠðÐð #Õ/€KÝØÜÐ(Ó)ØÜ�8ÓØóð ùò+ !Os   àe1c               ó    € V ^8„  d   QhRRRR/# )rS   r÷   rh  rV   rx  rW   )rX   s   "rY   rZ   rZ     s   € ÷ ñ ˜Hð Ð);ñ r\   c                óL   € / pV P                    F  pW!VP                  &   K  	  V# r^   )rø   rÌ   )r÷   rh  rT   s   &  rY   r{  r{    s'   € Ø')€LØ—”ˆØ"&�T—Y‘YÓñ àÐr\   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )rS   r†  rh  Úmemoryzlist[float]ÚruntimesÚ
max_memoryr×  r   r{   Úall_recomputable_banned_nodesr|   rV   z"tuple[float, list[int], list[int]]rW   )rX   s   "rY   rZ   rZ   
  sW   € ÷ -Tñ -TØð-Tàð-Tð ð-Tð ð	-Tð
 ð-Tð $1ð-Tð (ñ-Tr\   c           	     óæ  € \         P                  pVR 8X  d   \        WV4      # VR8X  d   \        WV4      # VR8X  d   \	        WV4      # VR8X  d   \        WV4      # VR8X  d\   \        P                  R4       \        P                  ! V VVVR7      p\	        VV\        VR7      P                  \        VR7      4      # \        V\        4      '       d   V! WW4V4      w  r‰R	W‰3# \        R
V 24      h)ÚgreedyÚilpÚdpr3   Ú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†  rJ  Ú 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_solverr4   r5   r2   r3   rI   Úwarningr1   Úinialize_from_graphr6   Úget_knee_point_memory_budgetrÅ   r   rŸ  )
r†  rG  rH  rI  r   rJ  ÚSOLVERrR  Úsaved_node_idxÚrecomp_node_idxs
   &&&&&&    rY   Ú#_optimize_runtime_with_given_memoryr\  
  s  € ô ×3Ñ3€FØ�ÔÜ˜v°Ó<Ð<Ø	�5ŒÜ˜F¨jÓ9Ð9Ø	�4ŒÜ˜6¨ZÓ8Ð8Ø	Ð3Ô	3Ü-¨fÀ
ÓKÐKØ	Ð-Ô	-Ü�‰ð?ô	
ô
 0×CÒCØ#Ø*GØ-3Ø-5ô	
Ðô ØØÜØ$7ôç*Ñ*Ü)Ø)ð +ó ó	
ð 		
ô 
�FÔ0×	1Ò	1Ù*0Ø Ð8Uó+
Ñ'ˆð �^Ð5Ð5äÐIÈ&ÈÐRÓSÐSr\   ©Úno_dispatchc               ó$   € V ^8„  d   QhRRRRRR/# )rS   rO  r0  r0  r§   rV   rW   )rX   s   "rY   rZ   rZ   >  s!   € ÷ 5ñ 5¨ð 5Àð 5Èñ 5r\   c                óì   a€ \        V P                  4      pR  V3R llpV Uu. uF
  qC! V4      NK  	  ppV P                  4        Uu. uF
  qC! V4      NK  	  ppV P                  W%R7      # u upi u upi )c               ó    € V ^8„  d   QhRRRR/# )rS   rm  ztorch.SymInt | intrV   r§   rW   )rX   s   "rY   rZ   Ú6_remove_symbols_without_guarding.<locals>.__annotate__A  s   € ÷ 7ñ 7Ð,ð 7°ñ 7r\   c                ó   <€ \        V SR 7      # )r/  )r*   )rm  r0  s   &€rY   Úrealize_symbolÚ8_remove_symbols_without_guarding.<locals>.realize_symbolA  s   ø€ Ü  ¨XÔ6Ð6r\   )rà  )rt  Úshaperà  Únew_empty_strided)rO  r0  rf  rd  rã  rà  s   &f    rY   Ú _remove_symbols_without_guardingrh  >  sp   ø€ Ü�—‘‹M€E÷7ð 7ñ ).Ó.© 1ˆ^˜AÖ©€EÐ.Ø)*¯©¬Ó4© Aˆn˜QÖ©€FÐ4Ø×Ñ˜uÐÓ4Ð4ùò /ùÚ4s   ¤A,ÁA1c               ó    € V ^8„  d   QhRRRR/# )rS   rT   rU   rV   r×  rW   )rX   s   "rY   rZ   rZ   I  s   € ÷ *Nñ *N˜7ð *N uñ *Nr\   c                óÜ  a aa	€ \         P                  pR  R lpVR8X  d   ^# VR8X  dm   \        4       ;_uu_ 4        ^ RIHp \
        P                  ! VS P                  S P                  34      w  oo	VP                  VV	V 3R l4      pVuuRRR4       # VR8X  d   ^ RI
Hp \
        P                  ! VS P                  S P                  34      w  oo	V! R	R
7      ;_uu_ 4       pS P                  ! S/ S	B  RRR4       XP                  4       p\        V^4      # \        V\         4      '       d	   V! S 4      # \#        RV 24      h  + '       g   i     R# ; i  + '       g   i     Ll; i)c               ó    € V ^8„  d   QhRRRR/# )rS   rO  r
   rV   rW   )rX   s   "rY   rZ   Ú&estimate_runtime.<locals>.__annotate__L  s   € ÷ 
ñ 
˜3ð 
 3ñ 
r\   c                ó  € \        V \        P                  4      '       dP   \        V P                  R ,          \        P
                  4      '       d   \        V P                  R ,          RR7      # \        V \        P                  4      '       dP   \        V P                  R ,          \        P                  4      '       d   \        V P                  R ,          RR7      # \        V \        P                  4      '       d4   \        V P                  R ,          \        P                  4      '       d   R# \        V \        P                  4      '       d4   \        V P                  R ,          \        P                  4      '       d   R# V # )rå   r.  r/  ç      ð?T)rÅ   r  r  r¹   rÆ   rß  rh  r  r*   r  rØ   r1  s   &rY   Úmaterialize_argÚ)estimate_runtime.<locals>.materialize_argL  sÛ   € Ü�aœŸ™×!Ò!¤j°·±¸µÄÇÁ×&MÒ&MÜ3°A·F±F¸5µMÈDÔQÐQÜ˜œ2Ÿ7™7×#Ò#¬
°1·6±6¸%µ=Ä%Ç,Á,×(OÒ(OÜ$ Q§V¡V¨E¥]¸TÔBÐBÜ˜œ2Ÿ7™7×#Ò#¬
°1·6±6¸%µ=Ä%Ç.Á.×(QÒ(QÙÜ˜œ2Ÿ7™7×#Ò#¬
°1·6±6¸%µ=Ä%Ç-Á-×(PÒ(PÙàˆHr\   ÚtestingÚprofile)Úbenchmarkerc                 ó(   <€ SP                   ! S / SB # r^   )rÀ   )rÕ   rÖ   rT   s   €€€rY   r�   Ú"estimate_runtime.<locals>.<lambda>a  s   ø€ °4·;²;ÀÐ3OÈÒ3Or\   NÚflops)ÚFlopCounterModeF)Údisplayz Not aware of runtime estimator: )r   Ú*activation_memory_budget_runtime_estimatorr^  Ú$torch._inductor.runtime.benchmarkingrs  rš  Útree_maprÕ   rÖ   Úbenchmark_gpuÚtorch.utils.flop_counterrw  rÀ   Úget_total_flopsr	  rÅ   r   rŸ  )
rT   ÚRUNTIME_MODEro  rs  Úmsrw  ÚmodeÚcounted_flopsrÕ   rÖ   s
   f       @@rY   Úestimate_runtimerƒ  I  s  ú€ Ü×DÑD€Lõ
ð �yÔ Ùà	˜Ô	"Ü�]�]ÝHä!Ÿ?š?¨?¸T¿Y¹YÈÏÉÐ<TÓU‰LˆD�&à×*Ñ*Ö+OÓPˆBØ÷ Š]ð 
˜Ô	 å<ä—’ ¸¿¹ÀDÇKÁKÐ8PÓQ‰ˆˆfÙ U×+Õ+¨tà�KŠK˜Ð( Ò(÷ ,ð ×,Ñ,Ó.ˆÜ�= !Ó$Ð$ä	�LÔ"8×	9Ò	9Ù˜DÓ!Ð!ô Ð=¸l¸^ÐLÓMÐM÷/ �]ˆ]ú÷ ,×+ús   ¼AEÃ$EÅE	ÅE+	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rS   r†  rh  r   r{   Úmemory_budgetr×  rV   r|   rW   )rX   s   "rY   rZ   rZ   v  s6   € ÷ F	ñ F	ØðF	àðF	ð ðF	ð ñ	F	r\   c                óô  a aaa a!a"a#a$a%a&a'a(a)a*a+a,€ V^8”  g   V^ 8  d   \        RV 24      h\        \        P                  \        P                  \        P
                  \        P                  \        P                  R7      p\        P                  '       d   \        VRRRRR7      pV^ 8X  d   SP                  # \        S SV4      w  rEV^8X  d   V# R R lo"S"! SP                  4      o)S"! V4      o'S'S)8:  d   V# R V'V)3R llpR	 V"V'V)3R
 llo#\        VRRRR7      p\        S SV4      w  r…S#! V4      o*S*V8  d   V# \        VRR7      o\        S SS4      w  ršS#! V	4      o S V8  d   V	# ^ RIHo$ \        V$3R lSP                   4       4      o&R V$V&3R llpV! V
4      pV Uu. uF6  pVP                  P!                  RR4      \"        P$                  8X  g   K4  VNK8  	  ppV Uu. uF  qÝV9  g   K  VNK  	  pp\'        V\(        RR7      o!\+        S!4      ^ 8X  d   V	# S! Uu. uF  qÖ! \)        V4      4      NK  	  upo(S! Uu. uF  p\-        V4      NK  	  upo,^ RIHo+ R VV V!V"V'V(V)V*V+V,3
R llo%\        P2                  '       Ed=   R V#V%V VV,3R llpV! R4      V! R4      .pV^ ,          R,          V^,          R,          8w  dç   V^ ,          V^,          3.pV'       dÌ   VP5                  4       w  ppV^ ,          V^ ,          ,
          R8  d%   VP7                  V4       VP7                  V4       K[  V! V^ ,          V^ ,          ,           ^,          4      pVR,          VR,          8w  d   VP7                  VV34       VR,          VR,          8w  g   K¾  VP7                  VV34       KÓ  TP9                  4        ^ RIHp V Uu. uF  pV^,          NK  	  ppV Uu. uF  pV^,          NK  	  ppVP?                  R0R7       VPA                  VVRR 7       \C        V4       F'  w  ppVPE                  VR! VVV,          3R"R1R#R$7       K)  	  VPG                  R%4       VPI                  R&4       VPK                  R'4       VPM                  R4       VPO                  4       pVPQ                  4        \R        PT                  ! 4       p\        PV                  e)   \        PV                  p\R        PX                  ! VRR(7       R)p\Z        P\                  P_                  4       '       dF   \Z        P\                  Pa                  4       '       d"   R*\Z        P\                  Pc                  4        2p\R        Pd                  Pg                  VR+V R,\i        4        R-24      pVPk                  V4       \l        Po                  R.V4       S%! VSS R/7      ^ ,          # u upi u upi u upi u upi u upi u upi )2rr  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               ó    € V ^8„  d   QhRRRR/# )rS   rû  r|   rV   r×  rW   )rX   s   "rY   rZ   Ú-choose_saved_values_set.<locals>.__annotate__›  s   € ÷ 6ñ 6°ð 6À%ñ 6r\   c                óB   € \        \        \        V 4      4      R ,          # ©ç    eÍÍA)r9  Úmapr=  )rû  s   &rY   Úestimate_activations_sizeÚ:choose_saved_values_set.<locals>.estimate_activations_size›  s   € Ü”3”x Ó.Ó/°#Õ5Ð5r\   c               ó    € V ^8„  d   QhRRRR/# )rS   Úszr×  rV   rW   )rX   s   "rY   rZ   rˆ  ¤  s   € ÷ :ñ : ð :¨%ñ :r\   c                ó2   <€ V R ,          SS,
          ,          # rŠ  rW   )r�  Úmax_act_sizeÚmin_act_sizes   &€€rY   Úget_normalized_sizeÚ4choose_saved_values_set.<locals>.get_normalized_size¤  s   ø€ Ø�S•˜\¨LÕ8Õ9Ð9r\   c               ó    € V ^8„  d   QhRRRR/# )rS   Úactivationsr|   rV   r×  rW   )rX   s   "rY   rZ   rˆ  §  s   € ÷ 
ñ 
 =ð 
°Uñ 
r\   c                ó>   <€ S! V 4      S,
          SS,
          ,          # r^   rW   )r—  r�  r’  r“  s   &€€€rY   Úget_mem_ratioÚ.choose_saved_values_set.<locals>.get_mem_ratio§  s"   ø€ Ù)¨+Ó6¸ÕEØ˜<Õ'õ
ð 	
r\   )r±   r²   r³   )r´   )Úget_node_storagec              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir^   rW   )r‹   rT   r›  s   & €rY   r�   Ú*choose_saved_values_set.<locals>.<genexpr>É  s   øé € ÐTÑCS¸4Ñ 0°× 6Ð 6ÓCSùr7  c               ó    € V ^8„  d   QhRRRR/# )rS   r-  r~   rV   r|   rW   )rX   s   "rY   rZ   rˆ  Ë  s   € ÷ 
ñ 
Ø)ð
à	ñ
r\   c                óª   <€ V  Uu. uFA  pVP                   \        R 4      8  g   K  S! V4      S9  g   \        V4      '       g   K?  VNKC  	  up# u upi rŠ  )r  r§   rµ  )r-  r?  r›  Úinput_storagess   & €€rY   Úget_recomputable_banned_nodesÚ>choose_saved_values_set.<locals>.get_recomputable_banned_nodesË  sZ   ø€ ñ
 "ó
á!�ð —‘¤ S£Ñ)ô	 ñ % QÓ'¨~Ô=Ü0°×3÷ ˆAÙ!ñ
ð 	
ùò 
s   †A§AÁAr¸   TrA  r]  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rS   r…  r×  r   r{   r†  rh  rV   ztuple[list[fx.Node], float]rW   )rX   s   "rY   rZ   rˆ  ø  s,   € ÷ 7.ñ 7.Øð7.Ø)1ð7.Ø@Hð7.à	$ñ7.r\   c                ó  <
€ S! 4       ;_uu_ 4        \        VSS\        V ^ 4      VS4      w  pppRRR4       \        4       pX F  p VP                  SV,          4       K  	  VP                  S4      '       g   \        R4      h\        VVSV4      w  r‰\        '       d:   \        TSXTXS U
u. uF  p
\        V
4      NK  	  up
SSVV SSS! V4      SSR7       VX3#   + '       g   i     L·; i  \         d     K¼  i ; iu up
i )r   Nz:dont_ban must be a subset of all_recomputable_banned_nodes)r†  rJ  Úsaved_node_idxsÚrecomputable_node_idxsÚexpected_runtimeÚmemories_banned_nodesÚ normalized_memories_banned_nodesÚruntimes_banned_nodesÚmin_cut_saved_valuesr…  r“  r’  Úsaved_values_act_sizeÚ&more_aggressive_saved_values_mem_ratioÚ/aggressive_recomputation_saved_values_mem_ratio)r\  r	  r/   rÃ  ÚBaseExceptionÚissubsetrª   r§  rH   r   r=  )r…  r   r†  r§  r¥  r¦  rå  rÍ   rû  r  r?  Úaggressive_optionsr®  rJ  r�  r’  r¨  r“  r­  r^  rª  s   &&&        €€€€€€€€€€rY   Úget_saved_values_knapsackÚ:choose_saved_values_set.<locals>.get_saved_values_knapsackø  s6  ø€ ñ �]�]ô
 4ØØ%Ø%Ü�M 1Ó%ØØ-óñ	Ø ØØ&÷	 ô )3«ˆÛ)ˆCðØ—‘Ð:¸3Õ?Ö@ñ *ð × Ñ Ð!>×?Ò?Ü ØLóð ô (ØØØØó	
‰ˆ÷ !Ó Ü4Ø'Ø.KØ /Ø'=Ø!1á)Fó'Ù)F A”H˜Q–KÑ)Fñ'ð 2GØ&;Ø%1Ø+Ø)Ø)Ù&?ÀÓ&MØ7]Ø@oõ#ð& Ð-Ð-Ð-÷i �]ûô$ !ô Úðüò*'s#   ‘CÁC2Â0DÃC/	Ã2DÄ Dc               ó    € V ^8„  d   QhRRRR/# )rS   rï  r×  rV   ztuple[float, float, float]rW   )rX   s   "rY   rZ   rˆ  3  s   € ÷ 	ñ 	 5ð 	Ð-Gñ 	r\   c                óT   <€ S! V SSR 7      w  rV \        S4      V,
          S! V4      3# ))r   r†  )r9  )rï  rû  r§  r™  r²  r†  r   rª  s   &  €€€€€rY   Úestimate_for_budgetÚ4choose_saved_values_set.<locals>.estimate_for_budget3  s=   ø€ Ù-FØ˜Y°Kô.Ñ*ˆLð ÜÐ)Ó*Ð-=Õ=Ù˜lÓ+ðð r\   rÓ   rn  :rr  NNgü©ñÒMbP?N)ÚfigsizeÚo)Úmarkerz.4fzoffset pointsÚcenter)Ú
textcoordsÚxytextÚhazMemory Budgetz Runtime of Recomputed Componentsz:Pareto Frontier of Memory Budget vs. Recomputation Runtime)Úexist_okrd  Ú_rank_Úmemory_budget_paretor  rÂ  z%Generated Pareto frontier curve at %s)r…  r   r†  )é
   é   )r   rÂ  )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	   r}   r§  Útorch._inductor.fx_utilsr›  r/   r¹   rº   r0   r  r”   r=  rÔ   rƒ  Útorch.utils._mode_utilsr^  Úvisualize_memory_budget_paretorl  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¹  rZ  r<   ÚsavefigrI   rV  )-r†  r   r…  rä  Úruntime_optimized_saved_valuesr  r”  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesr-  r¡  Úrecomputable_banned_nodesr?  Úmust_save_nodesrT   r¶  ÚoptionsÚbisectsÚlhsÚrhsÚmidÚpltrS  Úx_valuesÚy_valuesÚtxtÚfigÚfig_dirÚrank_suffixÚfig_namer±  r®  rJ  r�  r™  r›  r²  r   r’  r¨  r“  r­  r^  rª  s-   ff&                            @@@@@@@@@@@@@@rY   Úchoose_saved_values_setrò  v  s«  ÿÿ€ ð
 �qÔ˜M¨AÔ-ÜØXÐYfÐXgÐhó
ð 	
ô $Ü$×AÑAÜ#)×#KÑ#KÜ%+×%OÑ%OÜ &× EÑ EÜ×8Ñ8ô€Oô ×&×&Ð&Ü!ØØ"'Ø',Ø).Ø$)ô
ˆð ˜ÔØ×ÑÐä(5ØØØó)Ñ%Ð"ð ˜ÔØ-Ð-õ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Ðñ +óá*ˆAØ�6‰6�:‰:�k 5Ó)Ô-=×-GÑ-GÑG÷ 	
ˆÙ*ð ð ñ -ó!Ù,ˆa¸Ñ0H�ˆÑ,ð ð !ô %+Ø!¤x¸ô%Ð!ô Ð(Ó)¨QÔ.ð 5Ð4á2OóÙ2O¨QÐœH Q›KÖ(Ñ2OñÐñ ,IóÙ+H 4Ô˜ÖÑ+HñÐõ 4÷7.÷ 7.ñ 7.ôr ×,×,Ñ,÷	ô 	ñ ' sÓ+Ñ-@ÀÓ-EÐFˆà�1�:�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Õ*?Ó@�Ø�r•7˜c "�gÔ%Ø—N‘N C¨ :Ô.Ø�r•7˜c "�gÖ%Ø—N‘N C¨ :Ö.Ø�‰Œå'á(/Ó0© �D˜—G�G©ˆÐ0Ù(/Ó0© �D˜—G�G©ˆÐ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Ò0RØ"¤5×#4Ñ#4×#=Ñ#=Ó#?Ð"@ÐAˆKÜ—7‘7—<‘<ØÐ+¨K¨=¸Ô:LÓ:NÐ9OÈtÐTó
ˆð 	�‰�HÔÜ�‰Ð;¸XÔFñ %Ø#¨yÀkôàõ	ð 	ùò}ùò
!ùòùòùòz 1ùÚ0s0   Æ)1WÇWÇ+W!Ç8W!È(W&ÉW+ÏW0Ï&W5c               ó    € V ^8„  d   QhRRRR/# )rS   rÀ   r
   rV   rÃ   rW   )rX   s   "rY   rZ   rZ     s   € ÷ ñ ˜sð  sñ r\   c                ó�   € ^ RI Hp \        V 4      '       d
    V! V 4      # \	        V 4      #   \         d    \	        T 4      u # i ; i)a[  Stringify a node target stably across processes.

``str()`` on a plain Python-function target (e.g. ``torch.sym_not``) renders
its ``repr`` including the object's memory address (``<function sym_not at
0x...>``), which differs per process. That poisons cross-rank graph hashing.
Use FX's qualified name for callables so equal graphs hash equally.
)Ú_get_qualified_name)Útorch.fx.noderõ  Úcallablerw  rÃ   )rÀ   rõ  s   & rY   Ú_stable_target_strrø    sI   € õ 2ä�×Òð	Ù& vÓ.Ð.ô ˆv‹;Ðøô ô 	Ü�v“;Òð	ús   ™, ¬AÁAc               ó    € V ^8„  d   QhRRRR/# ©rS   r÷   r  rV   zdict[torch.fx.Node, str]rW   )rX   s   "rY   rZ   rZ   ‘  s   € ÷ $ñ $˜ð $Ð+Cñ $r\   c                ó¾  a€ / o\        \        V P                  4      4       EF6  pVP                  R8X  d…   VP                  P                  R4      p\        V\        P                  4      '       d$   R\        VP                  4      VP                  3pM[\        V\        P                  4      '       d   RpM8RpM5VP                  R8X  d   RpM!VP                  \        VP                  4      3p\        \!        V3R lVP"                   4       4      4      p\$        P&                  ! \        W434      P)                  R4      4      P+                  4       SV&   EK9  	  S# )	ai  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.
rG  rå   rM  c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir^   rW   )r‹   re  Úhashess   & €rY   r�   Ú_cone_hashes.<locals>.<genexpr>°  s   øé € Ð"A±j° 6¨!§9¢9³jùr  rÀ  )rG  Úsymint)rG  )rM  )r�  rt  rø   r  r¹   rº   rÅ   rÆ   rß  rÃ   r?  Úrequires_gradr  rø  rÀ   r[  r”   rî   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r÷   rT   rå   Úself_keyÚuser_hashesrý  s   &    @rY   Ú_cone_hashesr  ‘  s	  ø€ ð (*€FÜœ˜eŸk™kÓ*×+ˆØ�7‰7�mÔ#Ø—)‘)—-‘- Ó&ˆCÜ˜#œuŸ|™|×,Ò,ð "Ü˜Ÿ	™	“NØ×%Ñ%ð-‘ô
 ˜C¤§¡×.Ò.Ø4‘à+‘Ø�W‰W˜Ô Ø"‰HàŸ™Ô!3°D·K±KÓ!@ÐAˆHäœFÔ"A°d·j²jÓ"AÓAÓBˆÜ—~’~Ü�Ð'Ó(×/Ñ/°Ó8ó
ç
‰)‹+ð 	ˆtŒñ+ ,ð2 €Mr\   c               ó    € V ^8„  d   QhRRRR/# rú  rW   )rX   s   "rY   rZ   rZ   ¸  s#   € ÷ @Iñ @I ð @IÐ4Lñ @Ir\   c                ó  aa€ \        V 4      o\        P                  V P                  ^ 4      pV P                   F*  pVP                   F  pW;;,          ^,          uu&   K  	  K,  	  / oR VV3R llp^ p. pV P                   F9  pW,          ^ 8X  g   K  \
        P                  ! Wd! V4      WR34       V^,          pK;  	  . pV'       d˜   \
        P                  ! V4      w   r‰VP                  V	4       \        S4      SV	&   V	P                   FM  pW;;,          ^,          uu&   W,          ^ 8X  g   K&  \
        P                  ! Wd! V4      WS34       V^,          pKO  	  KŸ  \        V4       U
Uu/ uF  w  r¢VRV
 2bK  	  upp
# u upp
i )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.
c               ó    € V ^8„  d   QhRRRR/# )rS   rT   r  rV   rS  rW   )rX   s   "rY   rZ   Ú+_canonical_node_names.<locals>.__annotate__Ë  s   € ÷ Gñ G˜]ð G¨ñ Gr\   c                ót  <€ V P                   R 8X  d�   V P                  P                  R4      p\        V\        P
                  4      '       d#   \        VP                  4      VP                  3pM%\        V\        P                  4      '       d   RpMRp^ VSV ,          3# V P                   R8X  d   ^\        V P                  4      3# V P                   R8X  d   R# \        ;QJ d!    . V3R lV P                   4       F  NK  	  5M! V3R lV P                   4       4      p^\        V P                  4      V3# )rG  rå   r,  rM  c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir^   rW   )r‹   rŒ   Úcanonical_idxs   & €rY   r�   Ú@_canonical_node_names.<locals>._canonical_key.<locals>.<genexpr>ß  s   øé € Ð!QÑ<P°q -°×"2Ò"2Ó<Pùr  )rÿ  rW   )é   )r  r¹   rº   rÅ   rÆ   rß  rÃ   r?  r   r  rÀ   r[  rW  rø  )rT   rå   Úmeta_keyÚinput_indicesr  Úcones   &   €€rY   Ú_canonical_keyÚ-_canonical_node_names.<locals>._canonical_keyË  sï   ø€ Ø�7‰7�mÔ#Ø—)‘)—-‘- Ó&ˆCÜ˜#œuŸ|™|×,Ò,ô ˜Ÿ	™	“NØ×%Ñ%ð-‘ô ˜C¤§¡×.Ò.Ø&‘à�Ø�x  d¥Ð,Ð,Ø�W‰W˜
Ô"Ø”s˜4Ÿ;™;Ó'Ð(Ð(Ø�W‰W˜Ô ØˆKç!œEÔ!Q¸D×<PÒ<PÓ!QŸE™EÔ!Q¸D×<PÒ<PÓ!QÓQˆMØÔ)¨$¯+©+Ó6¸ÐFÐFr\   Únode_)r  rÙ  r  rø   rî   r7  r8  r9  r¡  rÔ   rÉ   )r÷   ÚindegrT   rì   r  r»  ÚreadyÚcanonical_orderr  r  r?  r  r  s   &          @@rY   Ú_canonical_node_namesr  ¸  sO  ù€ ô ˜Ó€Dä&*§m¡m°E·K±KÀÓ&C€EØ—”ˆØ—J”JˆDØ�K˜1Õ�Kó ñ ð /1€M÷Gñ Gð2 €GØ8:€EØ—”ˆØ�;˜!ÖÜ�NŠN˜5 >°$Ó#7¸Ð"GÔHØ�q�LŠGñ ð
 &(€Oç
Ü—M’M %Ó(‰	ˆˆ1Ø×Ñ˜sÔ#Ü  Ó/ˆ�cÑà—I”IˆDØ�K˜1Õ‹KØ�{˜aÖÜ—’˜u ~°dÓ';¸WÐ&KÔLØ˜1•’ó	 ô .7°Ô-GÔHÑ-G¡' !ˆD�E˜!˜�+ÒÑ-GÒHÐHùÓHs   Å0Fc               ó$   € V ^8„  d   QhRRRRRR/# )rS   r†  r  rû  zlist[torch.fx.Node]rV   rW   )rX   s   "rY   rZ   rZ   û  s)   € ÷ gñ gØðgØ/Bðgàñgr\   c           
     ó”  aaa€ ^ RI Ho R R lp\        P                  P	                  4       '       dV   \        P                  P                  4       '       d2   \        P                  P                  4       ^8”  d   V! V 4      '       g   V# \        V 4      oSP                  4        UUu/ uF  w  r4WCbK	  	  pppR VV3R llpV! V 4      '       Ed6   \        4       ;_uu_ 4        S! 4       ;_uu_ 4        V Uu. uF  pSV,          NK  	  up.p\        \        P                  P                  4       4       U	u. uF  p	. NK  	  p
p	\        P                  P                  W¨^ ,          4       . p/ p\        V
4       F…  w  rÞV Uu. uF  qõV,          NK  	  pp^ pV FK  p\        V4      pVV,          pV\        P                  P                  4       8X  g   K<  VVVP                  &   KM  	  VVR&   VP!                  V4       K‡  	  \        P"                  ! V\        P                  P$                  P'                  4       R7      p\        P                  P)                  V\        P                  P$                  P*                  P,                  R7       \/        \        P0                  ! V4      P3                  4       4      pR	V R
V 2o\5        RR V3R lR7       V
V,           Uu. uF  pVV,          NK  	  ppRRR4       RRR4       V# V# u uppi u upi u up	i u upi u upi   + '       g   i     L6; i  + '       g   i     T# ; i)r   )Úunset_fake_temporarilyc               ó    € V ^8„  d   QhRRRR/# ©rS   r†  r  rV   rG   rW   )rX   s   "rY   rZ   Ú0_sync_decision_cross_ranks.<locals>.__annotate__  s   € ÷ ñ  ^ð ¸ñ r\   c                óÔ   € V P                    FW  p\        VP                  \        P                  P
                  4      '       g   K9  VP                  P                  R9   g   KV   R# 	  R# )r  TF>   Úc10d_functionalr  )rø   rÅ   rÀ   rÆ   rÇ   rÈ   r  )r†  rT   s   & rY   Úhas_collectivesÚ3_sync_decision_cross_ranks.<locals>.has_collectives  sM   € Ø×%Ô%ˆDÜØ—‘œUŸZ™Z×2Ñ2÷ô à—+‘+×'Ñ'Ð+RÖRÚñ	 &ñ
 r\   c               ó    € V ^8„  d   QhRRRR/# r  rW   )rX   s   "rY   rZ   r     s   € ÷ ñ  Nð °tñ r\   c           	     óè  <a€ R  V3R lloRP                  V3R l\        V P                  V3R lR7       4       4      p\        P                  ! VP                  R4      4      P                  4       p\        \        P                  P                  4       4       Uu. uF  pRNK  	  pp\        4       ;_uu_ 4        S	! 4       ;_uu_ 4        \        P                  P                  WB4       \        V4       F<  w  rVV^ ,          V8w  g   K  \        P                  RV4        RRR4       RRR4       R	# 	  RRR4       RRR4       R
# u upi   + '       g   i     L; i  + '       g   i     R
# ; i)c               ó    € V ^8„  d   QhRRRR/# )rS   rŒ   r  rV   rÃ   rW   )rX   s   "rY   rZ   ÚH_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.__annotate__  s   € ÷ 	Kñ 	K˜mð 	K°ñ 	Kr\   c                ó²   <€ V P                   R 8X  d   SV ,           RV P                    2# SV ,           RV P                    R\        V P                  4       2# )rG  rR  )r  rø  rÀ   ©rŒ   Ú	canonicals   &€rY   Ú_node_hash_strÚJ_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>._node_hash_str  sT   ø€ ð �t‰t�}Ô$Ø# A�,˜ q¨¯©¨Ð/Ð/Ø •l�^ 1 Q§T¡T F¨!Ô,>¸q¿x¹xÓ,HÐ+IÐJÐJr\   Ú/c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir^   rW   )r‹   rŒ   r,  s   & €rY   r�   ÚE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>   s    øé € ð 
áJ�ñ ˜1×ÐÛJùr7  c                ó   <€ SV ,          # r^   rW   r*  s   &€rY   r�   ÚD_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<lambda>"  s	   ø€ ¸YÀq¾\r\   r’   rÀ  NzTSkipping sync decision cross rank due to different inputs between rank 0 and rank %sFT)rZ  r”   rø   r  r  r  r  ru  rÆ   rÁ  Úget_world_sizer^  Úall_gather_objectrÉ   rI   r¬  )
r†  Únode_strr}   r  Ú
all_inputsÚrankrO  r,  r+  r  s
   &      @€€rY   Úhas_same_nodesÚ2_sync_decision_cross_ranks.<locals>.has_same_nodes  s
  ù€ ÷	Kð 	Kð —8‘8ô 
ä˜K×-Ñ-Ô3IÕJó
ó 
ˆô —’ §¡°Ó 8Ó9×CÑCÓEˆÜ$)¬%×*;Ñ*;×*JÑ*JÓ*LÔ$MÓNÑ$M˜q“dÑ$Mˆ
ÐNÜ�]�]Ñ2×4Õ4ä×Ñ×/Ñ/°
ÔCÜ$ ZÖ0‘�Ø˜a•= AÖ%Ü—I‘IØnØôð !÷ 5�]‰]ñ 1÷ 5�]ñ ùò Oß4×4ú�]Ž]ñ ús<   ÂEÂ;E Ã;E	ÄE	Ä"E Ä4E	Ä6E ÅEÅE Å E1	z
total size)rs  rH  zpicked_rank_idx=z, saved_nodes of current rank=rz  c                 ó   € R RRR/# )rÌ   Ú)aot_joint_graph_sync_decision_cross_ranksr}  r~  rW   rW   r\   rY   r�   Ú,_sync_decision_cross_ranks.<locals>.<lambda>W  s   € ØÐGØ ñ%r\   c                 ó   <€ S # r^   rW   )Úsync_decision_cross_ranks_strs   €rY   r�   r<  [  s   ø€ Ñ#@r\   r‹  N)Útorch._subclasses.fake_tensorr  rÆ   rÁ  rÂ  rÜ  r3  r  rD  r^  ru  r4  rÉ   r=  rÝ  rÌ   r¡  r/  Údistributed_c10dÚ_get_object_coll_deviceÚ
all_reduceÚReduceOpÚMAXr§   ÚargminrS  r   )r†  rû  r#  rü  r±  Úreverse_canonicalr8  rO  Úobjectsr  Úsaved_ops_names_all_ranksÚsaved_sizesÚsaved_ops_with_sizesrÍ   Úsaved_ops_namesÚop_nameÚsaved_nodesÚ
saved_sizerT   Úsize_of_nodeÚsaved_sizes_tensorÚpicked_rank_idxrŒ   r+  r>  r  s   &&                     @@@rY   r  r  û  sú  ú€ õ Eõô 	×Ñ×&Ñ&×(Ò(Ü×Ñ×,Ñ,×.Ò.Ü×Ñ×,Ñ,Ó.°Ô2Ù˜K×(Ò(àÐä% kÓ2€IØ*3¯/©/Ô*;Ô<Ñ*;¡$ !˜šÑ*;ÐÑ<÷ñ ñ< �k×"Ó"Ü�]�]Ñ2×4Õ4ñ /;Ó;©l¨˜	 !Ÿ˜©lÑ;Ð<ˆGä!¤%×"3Ñ"3×"BÑ"BÓ"DÔEó:ÙE�q“ÑEð &ð :ô ×Ñ×/Ñ/Ð0IÐSTÍ:ÔVØ%'ˆKØ35Ð ä(1Ð2KÖ(LÑ$�á>MóÙ>M°7 g×.Ð.¹oð ð ð �
Û'�DÜ#+¨D£>�LØ ,Õ.�JØœe×/Ñ/×8Ñ8Ó:Ö:Ø:FÐ,¨T¯Y©YÓ7ñ	 (ð
 6@Ð$ \Ñ2Ø×"Ñ" :Ö.ñ )Mô "'§¢ØÜ×(Ñ(×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óÙ.X¨Ð! !×$Ð$Ñ.Xð ð ÷W 5�]ð^ Ðˆ<Ðùóa =ùòH <ùò:ùòùò>÷W 5×4ú�]Ž]ð^ Ðúsh   Â)L	Ã$L6Ã4L#	Ã9LÄ-L#	Ä8LÅA L#	ÆLÆ=L#	ÇDL#	Ë!LË3L#	Ë5L6ÌL#	Ì#L3Ì.L6Ì6M	c               ó$   € V ^8„  d   QhRRRRRR/# )rS   Úmodulerô   r¾  rG   rV   rW   )rX   s   "rY   rZ   rZ   e  s)   € ÷ Oñ OØðOØ)-ðOàñOr\   c           	     óœ  € ^ pV'       d   RMRp\        \        V P                  P                  RR7      4      4      pV P                  P                  R\        P
                  P                  P                  R7       EF  p\        WP                  ^ ,          P                  4      p\        V\        P                  4      '       g   KL  . pVP                  P                  RR7       F�  pW8P                  9   g   K  V P                  P                  V4      ;_uu_ 4        V P                  P!                  V RV 24      p	V^,          pVP"                  R,          V	P"                  R&   T	pVP%                  V	4       R	R	R	4       KŸ  	  V'       g   EK  V P                  P                  V4      ;_uu_ 4        V P                  P'                  R\        P
                  P                  P                  . VP                  OVO5/ 4      p
VP)                  V
R
R7       R	R	R	4       VP"                  P+                  R4      pV'       d=   Vw  rÍ. VOV Uu. uF  qîP"                  R,          NK  	  upO5pVV3X
P"                  R&   V P                  P-                  V4       EK!  	  V #   + '       g   i     EKÍ  ; i  + '       g   i     L¦; iu upi )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…  rG  rH  r  )r  rÀ   r  rå   NT)Úpropagate_metaÚeager_input_vals)ró  r�  r÷   rV  rÆ   rç   r¶  Úinvoke_subgraphr  rÕ   rÀ   rÅ   r  r4  rÌ   r  rG  r¹   r¡  ry  r›  rº   rœ  )rS  r¾  rt  Ú
rng_stringÚ
last_inputÚhop_noder‰  Únew_rng_inputsÚplaceholder_noderz  Únew_hop_node_with_fixed_argsÚ
eager_valsÚ
eager_argsÚeager_kwargsrJ  Únew_eager_argss   &&              rY   r  r  e  sZ  € ð< €Iß$/‘°_€JÜ”h˜vŸ|™|×6Ñ6¸-Ð6ÓHÓIÓJ€JØ—L‘L×+Ñ+Ø¤5§9¡9×#9Ñ#9×#IÑ#Ið ,÷ ˆô ˜6§=¡=°Õ#3×#:Ñ#:Ó;ˆÜ�h¤§¡×/Ô/Ø,.ˆNØ$,§N¡N×$=Ñ$=ÀÐ$=Ö$OÐ Ø×!6Ñ!6Ö6ð  Ÿ™×5Ñ5°j×AÕAØ$*§L¡L×$<Ñ$<Ø)˜l¨!¨I¨;Ð7ó%˜	ð " Q�˜	Ø0@×0EÑ0EÀeÕ0L˜	Ÿ™ uÑ-Ø%.˜
Ø&×-Ñ-¨iÔ8÷ BÑAñ	 %P÷ Š~à—\‘\×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ð\ €M÷I B×AÑAú÷ <×;üò" Es    ÄAJ!	Æ5A#J6ÉK	Ê!J3Ê6Kc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rS   rë  rô   rÝ  rE  rì  r§   rV   r{   rW   )rX   s   "rY   rZ   rZ   ·  s6   € ÷ Sñ SØ ðSà#,ðSð ðSð ñ	Sr\   c           	     óœ  aaaa€ \        V P                  4      o\        4       oV P                  P                   EF®  pVP                  R 8X  d$   RVP
                  9   d   SP                  V4       M"\        V4      '       d   SP                  V4       VS9   g   Kc  VP                  R8X  Ed   VP
                  \        J Ed
   VP                  R,          pVP                   Fã  pVP
                  \        P                  J d²   \        VP                  ^,          \        4      '       d‹   ^VP                  ^,          u;8:  d   \        V4      8:  db   M M^WEP                  ^,          ^,
          ,          p\        V\         P"                  4      '       d   VS9   d   SP                  V4       KÎ  KÐ  KÒ  SP                  V4       Kå  	  EK“  SP%                  VP                  4       EK±  	  \'        \)        \*        V P                  P                  4      4      p\'        \)        \,        V P                  P                  4      4      pWx,           p	\/        WR7      w  r«rÍSP1                  4       pSP%                  R V 4       4       \3        V P                  WšVR4      p\        V3R lVP                   4       4      o\        VV3R lV P                  P                   4       4      p\        V3R	 l\5        V4       4       4      p^ p/ pV P                  P                   F  pVS9   g   K  VVV&   V^,          pK  	  \7        V	SSVVVV4      # )
rG  Útangentsr  r=  r·  c              3  óV   "  € T F  qf   K  VP                   R8w  g   K  Vx € K!  	  R # 5i)NrM  rH  )r‹   r¹  s   & rY   r�   Ú!classify_nodes.<locals>.<genexpr>é  s"   é € ð ÙˆaŒ°A·D±D¸HÑ4D�Š“;ùs   ‚)Œ)Ÿ
)rŽ  c              3  ó–   <"  € T F>  pVP                   R 8w  g   K  VP                  S9   g   K)  SVP                  ,          x € K@  	  R# 5irã  rä  rg  s   & €rY   r�   rf  ï  sC   øé € ð 8á,ˆDØ�7‰7�hÑô 	 à#'§9¡9°Ñ#<ô 	 ˆ�T—Y‘Y×ÒÛ,ùs   ƒA	›A	®A	c              3  óL   <"  € T F  pVS9  g   K  VS9  g   K  Vx € K  	  R # 5ir^   rW   )r‹   rT   r€   r–   s   & €€rY   r�   rf  ô  s1   øé € ð 6á,ˆDØÐ(Ñ(ô 	à-1Ð9JÑ-J÷ 	ŠÛ,ùs   ƒ	$‘$š
$c              3  ó>   <"  € T F  w  rVS9   g   K  Vx € K  	  R # 5ir^   rW   )r‹   r?  ÚprÝ  s   &  €rY   r�   rf  ù  s!   øé € ð -Ù.‰dˆa°!Ð7TÑ2T�ŠÓ.ùs   ƒ“
)r{  r÷   r/   rø   r  rÀ   rÃ  r—  rz  rÕ   rî   r  r  rÅ   r§   rÔ   r  r  ræ  rt  rÀ  r?   r>   rù  r{  r²  rÉ   r{   )rë  rÝ  rì  rT   r>  rì   r@  rÊ  rÌ  r}   rõ  rö  r÷  rø  r�   Úforward_only_graphr‚   r…   Úfw_cntr„   rh  r€   r–   s   &f&                 @@@rY   r  r  ·  s¿  û€ ô
 $ L×$6Ñ$6Ó7€LÜ-7«\ÐØ×"Ñ"×(Õ(ˆØ�7‰7�mÔ#¨
°d·k±kÔ(AØ×!Ñ! $Õ'Ü! $×'Ò'Ø×!Ñ! $Ô'àÐ$Ö$Ø�w‰w˜/Õ)¨d¯k©kÔ=MÔ.Mð
 —y‘y •}�Ø ŸJœJ�DàŸ™¤x×'7Ñ'7Ó7Ü& t§y¡y°¥|´S×9Ò9Ø §¡¨1¥Ö:´°T³×:à"§9¡9¨Q¥<°!Õ#3Õ4˜Ü% c¬2¯7©7×3Ò3¸Ð?PÔ8PØ-×1Ñ1°$Ö7ñ 9QÑ3ð *×-Ñ-¨dÖ3ô 'ð "×(Ñ(¨¯©×4ñ9 )ô< œ¤
¨L×,>Ñ,>×,DÑ,DÓEÓF€MÜ!¤&Ô)<¸l×>PÑ>P×>VÑ>VÓ"WÓXÐØÕ3€Fä  ÔOñ C€KÐ/ð )×-Ñ-Ó/ÐØ×Ññ Ùóô ô <Ø×Ñ˜FÐ1BÀIóÐô .8ô 8à&×,Ò,ó8ó .Ðô
 ,6õ 6à ×&Ñ&×,Ò,ó6ó ,€Oô
 #-ô -Ü Ô.ó-ó #Ðð €FØ€HØ×"Ñ"×(Ô(ˆØÐ$Ö$Ø#ˆH�T‰NØ�a�KŠFñ )ô ØØØØØØØ#óð r\   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )rS   rë  rô   rß  r
   ÚcompilerrÃ   rì  r§   rÝ  rà  rV   rµ  rW   )rX   s   "rY   rZ   rZ     sL   € ÷ B ñ B Ø ðB àðB ð ðB ð
 ðB ð $4ðB ð +ñB r\   c          	     óJ  a(€ V P                   P                  4        V P                  4        V P                   p\        P                  '       d¯   \        WR7      w  rg p\        4       o(V Uu. uF  pVf   K	  VP                  R8w  g   K  VNK   	  p	pV	'       dH   V	P                  4       p
V
S(9   d   K!  S(P                  V
4       V	P                  V
P                  4       KO  R V(3R llp\        W[R7      pWÀn         V P                   p\        V 4      p\        V 4      pV'       d   \        V RR7      p \        P                   '       g   \#        V 4       \%        V 4       \'        V 4       Vf   . p\)        WV4      p\+        VP,                  4      ^ 8X  d   \/        V VVVVP0                  R	7      # \3        V P                   P4                  4       F•  p
V
P                  R8X  d   \7        R
4      V
n        K&  VP;                  V
4      '       g
   ^ V
n        KF  \7        R
4      V
n        V
P<                   F/  p\?        V
P8                  VP8                  ^,           4      V
n        K1  	  K—  	  \        P@                  pVP4                   FH  p
\C        V
PD                  PG                  RR4      \H        4      '       g   K5  V
PD                  R,          p M	  \        4       p. pVP4                   Fb  p
\K        V
4      pVe   VP                  V4       K%  V
P                  R8X  g   K8  VP;                  V
4      '       g   KQ  VPM                  V
4       Kd  	  \        V4      pV PO                  4        F�  w  pp\C        V\P        PR                  4      '       g   K(  VP                   VJg   K:  VP                   P4                   FI  p
\K        V
4      pVe   VP                  V4       K%  V
P                  R8X  g   K8  VPM                  V
4       KK  	  KŸ  	  \+        V4      ^8”  d   \U        R\W        V4       R24      hV'       dR   V'       d6   \U        R\+        V4       RV Uu. uF  pVPX                  NK  	  up R24      h\[        \]        V4      4      p\_        VVVR7      p\        P`                  '       d   \a        VV4      p\c        \e        R V4      4      p\c        \e        \f        V4      4      p\c        \e        R V4      4      p\i        V VVVVVP0                  R7      w  ppV'       d#   V'       d   \k        V VV\+        V4      4      w  pp\m        V4      p\        Pn                  '       d   ^RI8H7p V! VVVVP0                  4       \s        V4      p\s        V4      p\u        VRR7      p\u        VRR7      p\v        '       EdÒ   \W        V U u. uF  p \y        V 4      \{        V 4      3NK  	  up 4      p!\}        R V 4       4      R
,          p"\~        P�                  RV"4       \~        P�                  RV!4       \        R VP                   P4                   4       4      p#\        R VP                   P4                   4       4      p$V#V$,          p%\ƒ        \6        4      p&VP                   P4                   Ff  p
V
PX                  V%9   g   K  \…        V
P†                  R4      '       g   K4  V&\{        V
P†                  Pˆ                  4      ;;,          ^,          uu&   Kh  	  \~        P�                  R\+        V%4      \+        V#4      \+        V$4      4       \W        V&P‹                  4       \Œ        PŽ                  ! ^4      RR 7      p'\~        P�                  R!V'4       VV3# u upi u upi u up i )"a(  
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.
r·  NrM  c               ó    € V ^8„  d   QhRRRR/# rR   rW   )rX   s   "rY   rZ   Ú9min_cut_rematerialization_partition.<locals>.__annotate__J  s   € ÷ 	1ñ 	1 ð 	1¨Dñ 	1r\   c                ó   <€ V S9   # r^   rW   )rT   Úbackward_dependenciess   &€rY   Úpartition_keyÚ:min_cut_rematerialization_partition.<locals>.partition_keyJ  s   ø€ ØÐ0Ñ0Ð0r\   )Úextra_node_keyFrç  )rì  rÝ  r…   r‹  r…  r  z„torch.autograd.graph.region_activation_memory_budget: conflicting budgets within a single joint graph (including nested subgraphs): zD. Use a graph break to separate regions that need different budgets.z{torch.autograd.graph.region_activation_memory_budget: must cover the entire forward of a graph (including HOP bodies), but z÷ forward op(s) are unannotated. Wrap the whole forward in a single region; use a graph break to scope different budgets to different graphs. Note that a graph break inside the annotated region can also cause unannotated ops here. Unannotated ops: r;  )r…  c                óH   € \        V 4      ;'       d    \        V 4      '       * # r^   )r    rð   ©rŒ   s   &rY   r�   Ú5min_cut_rematerialization_partition.<locals>.<lambda>Á  s   € ”k !“n×GÐGÔ-DÀQÓ-GÔ)GÐGr\   c                óR   € \        V 4      '       * ;'       d    \        V 4      '       * # r^   )r    r;   rx  s   &rY   r�   ry  Æ  s   € œ[¨›^Ô+×EÐE´NÀ1Ó4EÔ0EÐEr\   rþ  r   r  Tc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir^   )r=  rë  s   & rY   r�   Ú6min_cut_rematerialization_partition.<locals>.<genexpr>ô  s   é € Ð'J¹\¸¬°¯¨»\ùrò  z'Theoretical Activations Stored: %.2f GBz,Theoretical Per Activation Storage Sizes: %sc              3  ó^   "  € T F#  qP                   R 8X  g   K  VP                  x € K%  	  R# 5ir1  rä  rð  s   & rY   r�   r|  ù  ó#   é € ð %
Ù"7˜$¿7¹7ÀoÑ;UŒIˆD�IŽIÓ"7ùræ  c              3  ó^   "  € T F#  qP                   R 8X  g   K  VP                  x € K%  	  R# 5ir1  rä  rð  s   & rY   r�   r|  ü  r~  ræ  rè  z# remat/fw/bw: %d/%d/%drA  zCount of Ops Rematerialized: %s)Hr÷   r¢  rµ  r   Úcserù  r/   r  rl  rÃ  rÅ  rW  rD   rú   rý   r  r  r  r	  r
  r  rÔ   r€   r$  r…   r�  rø   r§   r  rœ   rî   r
  Úactivation_memory_budgetrÅ   r¹   rº   r×  r.   r¡  r  r  r4  rŸ  r”   rÌ   ró  rô  rò  r  rt  rÀ  r;   rÜ  r  r  r  r  rF   r  rH   r=  rÃ   r9  rI   rN  r   rß   rÀ   rè  rD  r  rE  ))rë  rß  rn  rì  rÝ  ró   r  rö  rM  Úbackward_dependency_stackrT   rt  Ú	cse_graphr†  r  r  r   rì   r…  Úregion_budgetsÚunannotated_fw_opsÚbudgetÚall_budgetsrš  rï  rŒ   rû  r³  r´  r"  r#  r  r?  Úsorted_sizesÚtotal_activations_size_gbÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountsÚrematerialized_opsrs  s)   &&&$$                                   @rY   r  r    s¡  ø€ ðD ×Ñ×*Ñ*Ô,Ø×ÑÔà×Ñ€Dô ‡z‡z€zô  8Øô 
Ñˆ˜˜1ô 6@³\Ðñ &ó%
á%�Øô à&,§i¡i°8Ñ&;÷ ˆFÙ%ð 	"ð %
÷
 (Ø,×0Ñ0Ó2ˆDØÐ,Ô,ÙØ!×%Ñ% dÔ+Ø%×,Ñ,¨T×-AÑ-AÖB÷	1ð 	1ô ! ÔDˆ	Ø&ÔØ×$Ñ$€Kä!5°lÓ!CÐÜ%=¸lÓ%KÐ"ß!Ü-¨lÐQVÔWˆÜ×:×:Ð:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ò,Ø(*Ð%ÜØ°_ó€Iô ˆ9×&Ñ&Ó'¨1Ô,Ü ØØØ+Ø*GØ(1×(MÑ(Mô
ð 	
ô ˜×+Ñ+×1Ñ1Ö2ˆØ�7‰7�hÔÜ # C£ˆDÖØ×)Ñ)¨$×/Ò/Ø !ˆDÖä # C£ˆDÔØŸ
œ
�Ü$'¨×(9Ñ(9¸4×;LÑ;LÈqÕ;PÓ$Q�Ö!ó #ñ 3ô( ×3Ñ3€MØ×!Ô!ˆÜ�d—i‘i—m‘m O°TÓ:¼E×BÔBØ ŸI™I oÕ6ˆMÙñ "ô )3«€NØ(*ÐØ×!Ô!ˆÜ.¨tÓ4ˆØÒØ×Ñ˜vÖ&Ø�W‰W˜Ö'¨I×,DÑ,DÀT×,JÔ,JØ×%Ñ% dÖ+ñ "ô &0°Ó%?€KØ×,Ñ,Ö.‰ˆˆ3Ü�cœ2Ÿ>™>×*Ô*¨s¯y©yÀÕ/KØŸ	™	Ÿœ�Ü1°$Ó7�Ø’=Ø—O‘O AÖ&Ø—W‘W Ö/Ø&×-Ñ-¨dÖ3ó (ñ /ô ˆ;Ó˜!ÔÜðä! +Ó.Ð/ð 03ð4ó
ð 	
÷ ßÜðSäÐ)Ó*Ð+ð ,$ñ 6HÓ$HÑ5G° Q§V¤VÑ5GÑ$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¹l¸¤¨£¬S°«VÓ4¹lÑ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Ø”s˜4Ÿ;™;×6Ñ6Ó7×8¸AÕ=Õ8ñ *ô 	�‰Ø%Ü�ÓÜ�Ó Ü�Ó ô		
ô $Ø�L‰L‹N¤× 3Ò 3°AÓ 6Àô
Ðô 	�‰Ð2Ð4FÔGØ�iÐÐùòc%
ùòj %Iùò| Ls   Á,^Á7^Â
^Ñ^×
^ c               ó8   € V ^8„  d   QhRRRRRRRRRR	R
RRRRR/# )rS   Útracedrp  ÚfnamerÃ   ÚfignameÚ
clear_metarG   Úprogzstr | list[str] | NoneÚparse_stack_traceÚdot_graph_shaperŠ  rV   rü  rW   )rX   s   "rY   rZ   rZ     sX   € ÷ %'ñ %'Ø ð%'àð%'ð ð%'ð ð	%'ð
 !ð%'ð ð%'ð  ð%'ð 
ñ%'r\   c                ó¦  € V'       d[   \         P                  ! V P                  4      p\        P                  ! W4      p V P                  P
                   F
  p/ Vn        K  	  \        P                  P                  V4      w  ršV
'       g   R \        P                  ,           p
\        P                  RWš4       \        P                  ! V VVVR7      pVP!                  4       pV	 V
 2pV
P#                  R 4      pVR9   d   VP%                  V4       R# Vf   \'        VRV,           4      pV! V4       R# \'        VRV,           4      pV! WR7       R# )r;  zWriting FX graph to file: %s%s)r•  r–  NÚwrite_)r”  >   ÚdotÚraw)r{  Údeepcopyr÷   r  r4  rø   r¹   r¸  r¹  Úsplitextr   Útorch_compile_graph_formatrI   rN  r-   ÚFxGraphDrawerÚget_main_dot_graphÚlstriprv  r  )r�  r‘  r’  r“  r”  r•  r–  rg  rT   r–  ÚextÚgrO  Úgraph_formatÚwrite_methods   &&&&&&&        rY   Ú
draw_graphr¥    s  € ÷ Ü—M’M &§,¡,Ó/ˆ	Ü—’ Ó2ˆØ—L‘L×&Ô&ˆDØˆDŽIñ 'ä—‘× Ñ  Ó'�I€DßØ”F×5Ñ5Õ5ˆÜ‡H�HÐ-¨tÔ9Ü×"Ò"ØØØ+Ø'ô		€Að 	
×ÑÓ€AØˆf�S�EˆN€EØ—:‘:˜c“?€LØ�~Ô%ð 	
�‰�ŽØ	ŠÜ˜q (¨\Õ"9Ó:ˆÙ�UÖä˜q (¨\Õ"9Ó:ˆÙ�U×&r\   )NF)g      ì@rT  r   )r   )Nr   r^   )rr  )rU  )Úfx_graphTNFN)áÚ__conditional_annotations__Ú
__future__r   r{  r­   r  r7  rÚ  Úloggingri  r  r¸  Úos.pathr™  r  rC  r   r   Úcollections.abcr   r   Údataclassesr   r	   Útypingr
   r   r   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.streamsr   Ú$torch._functorch._aot_autograd.utilsr   Útorch._inductorr   rÈ  Ú!torch._inductor.custom_graph_passr   r   Ú.torch._inductor.fx_passes.control_dependenciesr   rz  r   Ú"torch._library.fake_class_registryr   Útorch._library.opaque_objectr   Útorch._library.utilsr   Útorch._loggingr   r   Útorch._logging._internalr   r?  r   Útorch._subclasses.meta_utilsr   Ú%torch.fx.experimental._backward_stater   Ú"torch.fx.experimental.proxy_tensorr    r!   Útorch.fx.experimental.sym_noder"   r#   r$   Ú%torch.fx.experimental.symbolic_shapesr%   r&   r'   r(   r)   r*   r+   r,   Útorch.fx.passesr-   Útorch.fx.tracebackr.   Útorch.utils._ordered_setr/   Útorch.utils.checkpointr0   rd  Ú-_activation_checkpointing.graph_info_providerr1   Ú"_activation_checkpointing.knapsackr2   r3   r4   r5   Ú,_activation_checkpointing.knapsack_evaluatorr6   Ú_aot_autograd.descriptorsr7   r8   r9   Ú_aot_autograd.functional_utilsr:   Ú_aot_autograd.graph_compiler;   Ú_aot_autograd.logging_utilsr<   Ú_aot_autograd.utilsr=   r>   r?   r@   rA   rB   rC   Úcompile_utilsrD   rE   rF   rn  r_  Údebug_partitionerrH   rx   Ú	getLoggerrs   rI   rç   rè   r  rK   r{   r°   r¾   rÏ   rÛ   râ   rð   rú   rý   r  r  r  r˜  r  r$  r)  r9  rA  re  r„  r²  rµ  rº  rœ  rÃ  rÇ  r�  r™  r—  rØ  ré  rù  r   r  r!  r-  r5  r@  rG  rJ  rO  r^  rs  r¦  r°  rÜ  r$  r§   r!  r(  r=  rG  ÚcacherQ  rW  r  r‹  r  r  r	  r
  rÚ  r  r§  rx  rt  rz  rm  r{  r\  rË  r^  rh  rƒ  rò  rø  r  r  r  r  r  r  r¥  )r§  s   @rY   Ú<module>rÕ     sÐ  øðß "Ð "ã Û Û Û Û Û Û Û Û 	Û Û 	Û ß *ß .ß *ß +Ñ +ã ã Û %Û Ý ß $Ð $ß <õõ =Ý @Ý 5÷÷õ @Ý 8Ý +ß 7Ý .Ý AÝ 6Ý ?ß Hß UÑ U÷	÷ 	ó 	õ )Ý <Ý /Ý 3å Ý L÷ó õ L÷ñ õ
 AÝ 7Ý ;÷÷ ñ ÷ IÑ H÷ Ûð %×6Ò6Ð �tÓ 6Ø×'Ó'¨Ó1€€^Ó 1à‡y‚y‡~‚~€Ø�	Š	�Š€ð ÷>ð >ó ð>ð2 ÷ ð  ó ð ðB ÷ð ó ðõõõSõ.õõõõ÷ñ õIñ Ó€õõ2-õõ>õ(Rõ1õhR÷jõDõXõCõBõJõKõõ5õYõBõJõ$õ÷Kõ\C!õL9õ"õGõ45õ	÷FGõRMG÷`X÷v'
ñTy"ð ?Cðy"ð %*ðy"ð ',÷y"ð y"ðxj ð
 7;ðj ð ?C÷j ñZ ˆc‹(€õ"õ)õZRð ‡‚ôó ðõ PõKõ\X*õvY õx@õ'õ<õ.Kõ5÷pv	&õrõB/õ$!õNfõRõ-Tõ` 0õ5õ*N÷ZF	õRõ$$õN@IõFgõTOõdSñlB ð 7;÷B ð B ÷J%'ñ %'r\   