Ë
    g^(h3 ã                   óì  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZmZ d dlmZmZmZmZ d dlZd dlZd dlZd dlmZ d dlmc mZ d dlmZ d dlmZ d dl m!Z!m"Z" d dl#m$Z$m%Z% d d	l&m'Z'm(Z(m)Z)m*Z* d d
l+m,Z, d dl-m.Z. d dl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z>m?Z? ddl@mAZAmBZB erd dlCZCe2jˆ                  ZEeFeGd<    ej�                  eI«      ZJej–                  eGd<   ej˜                  jš                  ZMej˜                  jœ                  ZNe G d„ d«      «       ZOe G d„ d«      «       ZPe G d„ d«      «       ZQdej¤                  deFfd„ZSd ej¨                  deFfd!„ZUd ej¨                  deFfd"„ZVdej¤                  deWfd#„ZX G d$„ d%«      ZY eY«       ZZ	 dnd&ej¶                  d'e\ej¤                     d(e\ej¤                     d)ee]   dej¶                  f
d*„Z^dej¤                  deFfd+„Z_dej¤                  deFfd,„Z`dej¤                  deFfd-„Zadej¤                  deFfd.„Zbdej¤                  deFfd/„Zcdej¤                  deFfd0„Zddej¤                  deFfd1„Zedej¤                  deFfd2„Zfd3ej¨                  dege\ej¤                     e\ej¤                     f   fd4„Zhd5e\ej¤                     d6e]fd7„Zid3ej¨                  d5e\ej¤                     d8e\ej¤                     d9eWdegej¨                  ej¨                  f   f
d:„Zjd3ej¨                  degej¨                  ej¨                  f   fd;„Zk eWd<«      Zld=eWdeWfd>„Zmdej¤                  deWfd?„Znd@ej¶                  fdA„Zo ejà                  d«      dB„ «       ZqdCerej¤                  eWf   de\egej¤                  eWf      fdD„ZsdEej¨                  dej¨                  fdF„ZtdGej.                  j¨                  dHej.                  j¨                  dIej.                  j¤                  dJej.                  j¤                  dKejê                  dLeWdMej.                  j¤                  dNej.                  j¤                  fdO„Zvd3ej¨                  dGej¨                  dHej¨                  dPeWdegej¨                  ej¨                  f   f
dQ„Zwd3ej¨                  dej¨                  fdR„Zx	 dnd&ej¶                  dSePdTeQdUee.ej¤                        fdV„ZydW„ ZzdeOfdX„Z{d@ej¶                  fdY„Z|d&ej¶                  dZe\e}   d[e\e}   d\e}dSePd]e\ej¤                     dege}e\eW   e\eW   f   fd^„Z~d d_lm€Z€ d`e�j                  daeWde�j                  fdb„Z‚dc„ Zƒ	 dod&ej¶                  dSePde\ej¤                     fdd„Z„	 dpd3ej¨                  degej¨                  ej¨                  f   fde„Z…	 	 	 	 	 dqdfej.                  j¨                  dge]dhe]dieFdjeee]e\e]   f      dkeFdlee]   ddfdm„Z†y)ré    N©Údefaultdict)Ú	dataclassÚreplace)ÚCallableÚOptionalÚTYPE_CHECKINGÚUnion)Ú(create_structured_trace_for_min_cut_info)ÚBackwardState)Úis_sym_nodeÚpy_sym_types)Úmagic_methodsÚmethod_to_operator)Úfind_symbol_binding_fx_nodesÚfree_symbolsÚhint_intÚis_symbol_binding_fx_node)Úgraph_drawer)Ú
OrderedSet)ÚCheckpointPolicyé   )Úconfig)ÚGraphInfoProvider)Údp_knapsackÚgreedy_knapsackÚilp_knapsack)ÚKnapsackEvaluator)Úget_aot_graph_name)Úget_cuda_generator_meta_valÚis_with_effects)Úfx_graph_cseÚget_aten_targetÚAOT_PARTITIONER_DEBUGÚlogc                   ó  — e Zd ZU dZee   ed<   ee   ed<   ee   ed<   ee   ed<   ee   ed<   dej                  fd„Z	dej                  fd	„Z
dej                  fd
„Zdej                  fd„Zdej                  fd„Zy)ÚOpTypesz8Class for keeping track of different operator categoriesÚfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsÚnodec                 ó0   — t        |«      | j                  v S ©N)r#   r(   ©Úselfr-   s     ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_functorch/partitioners.pyÚ
is_fusiblezOpTypes.is_fusibleF   s   € Ü˜tÓ$¨×(8Ñ(8Ð8Ð8ó    c                 ó0   — t        |«      | j                  v S r/   )r#   r)   r0   s     r2   Úis_compute_intensivezOpTypes.is_compute_intensiveI   s   € Ü˜tÓ$¨×(BÑ(BÐBÐBr4   c                 ó0   — t        |«      | j                  v S r/   )r#   r*   r0   s     r2   Ú	is_randomzOpTypes.is_randomL   s   € Ü˜tÓ$¨¯©Ð7Ð7r4   c                 ó0   — t        |«      | j                  v S r/   )r#   r+   r0   s     r2   Úis_viewzOpTypes.is_viewO   s   € Ü˜tÓ$¨¯©Ð5Ð5r4   c                 ó0   — t        |«      | j                  v S r/   )r#   r,   r0   s     r2   Úis_recomputablezOpTypes.is_recomputableR   s   € Ü˜tÓ$¨×(=Ñ(=Ð=Ð=r4   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__ÚfxÚNoder3   r6   r8   r:   r<   © r4   r2   r'   r'   <   sŽ   … áBà˜HÑ%Ó%Ø% hÑ/Ó/Ø˜8Ñ$Ó$Ø˜Ñ"Ó"Ø  Ñ*Ó*ð9˜rŸw™wó 9ðC¨¯©ó Cð8˜bŸg™gó 8ð6˜BŸG™Gó 6ð> B§G¡Gô >r4   r'   c                   óš  — e Zd ZU eej
                     ed<   eej
                     ed<   eej
                     ed<   eej
                     ed<   eej
                  e	f   ed<   e
j                  deej
                     fd„«       Zdej
                  defd	„Zdej
                  defd
„Zdej
                  defd„Zdej
                  de	fd„Zy)ÚNodeInfoÚinputsÚ_required_fw_nodesÚrequired_bw_nodesÚunclaimed_nodesÚfw_orderÚreturnc                 óF   ‡ — t        d„ ‰ j                  D «       ˆ fd„¬«      S )Nc              3   ó    K  — | ]  }|–— Œ y ­wr/   rD   ©Ú.0Úns     r2   ú	<genexpr>z-NodeInfo.required_fw_nodes.<locals>.<genexpr>c   s   è ø€ Ò0�1ŒQÑ0ùs   ‚c                 ó"   •— ‰j                   |    S r/   )rK   )rQ   r1   s    €r2   ú<lambda>z,NodeInfo.required_fw_nodes.<locals>.<lambda>c   s   ø€ ÀÇÁÈaÑ@P€ r4   ©Úkey)ÚsortedrH   ©r1   s   `r2   Úrequired_fw_nodeszNodeInfo.required_fw_nodes`   s!   ø€ äÙ0˜×/Ñ/Ô0Ó6Pô
ð 	
r4   rQ   c                 ó   — || j                   v S r/   )rH   ©r1   rQ   s     r2   Úis_required_fwzNodeInfo.is_required_fwf   s   € Ø�D×+Ñ+Ð+Ð+r4   c                 ó   — || j                   v S r/   )rI   r[   s     r2   Úis_required_bwzNodeInfo.is_required_bwi   s   € Ø�D×*Ñ*Ð*Ð*r4   c                 ó   — || j                   v S r/   )rJ   r[   s     r2   Úis_unclaimedzNodeInfo.is_unclaimedl   s   € Ø�D×(Ñ(Ð(Ð(r4   c                 óR   — || j                   v sJ d|› d�«       ‚| j                  |   S )NúNode z not in fw nodes!)rH   rK   r[   s     r2   Úget_fw_orderzNodeInfo.get_fw_ordero   s4   € Ø�D×+Ñ+Ñ+ÐI¨u°Q°CÐ7HÐ-IÓIÐ+Ø�}‰}˜QÑÐr4   N)r=   r>   r?   ÚlistrB   rC   rA   r   ÚdictÚintÚ	functoolsÚcached_propertyrY   Úboolr\   r^   r`   rc   rD   r4   r2   rF   rF   V   sÕ   … ð �—‘‰MÓØ" 2§7¡7Ñ+Ó+Ø! "§'¡'Ñ*Ó*Ø §¡Ñ(Ó(Ø�2—7‘7˜C�<Ñ Ó à×Ñð
 4¨¯©¡=ò 
ó ð
ð
, §¡ð ,¨Dó ,ð+ §¡ð +¨Dó +ð)˜bŸg™gð )¨$ó )ð ˜bŸg™gð  ¨#ô  r4   rF   c                   ó@   — e Zd ZU eed<   eed<   eed<   eed<   eed<   y)ÚMinCutOptionsÚban_if_used_far_apartÚban_if_long_fusible_chainsÚban_if_materialized_backwardÚban_if_not_in_allowlistÚban_if_reductionN)r=   r>   r?   ri   rA   rD   r4   r2   rk   rk   t   s    … àÓØ $Ó$Ø"&Ó&Ø!Ó!ØÔr4   rk   r-   rL   c                 óz   — | j                   j                  dd «      t        j                  t        j                  fv S )NÚ	recompute)ÚmetaÚgetr   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©r-   s    r2   Úmust_recomputerx   }   s5   € Ø�9‰9�=‰=˜ dÓ+Ü×'Ñ'Ü×)Ñ)ð0ð ð r4   Úfx_gc                 óT   — | j                   j                  D ]  }t        |«      sŒ y y)NTF)ÚgraphÚnodesrx   ©ry   r-   s     r2   Úhas_recomputable_opsr~   „   s+   € Ø—
‘
× Ñ ò ˆÜ˜$ÕÙðð r4   c                 óä   — | j                   j                  D ]W  }t        |«      sŒt        |j                  d«      sŒ&t
        j                  j                  |j                  j                  v sŒW y y)NÚtagsTF)	r{   r|   rx   ÚhasattrÚtargetÚtorchÚTagÚnondeterministic_seededr€   r}   s     r2   Úhas_recomputable_rng_opsr†   ‹   sU   € Ø—
‘
× Ñ ò ˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEáðð r4   c                 óÆ   — t        | j                  d   t        j                  t        j                  f«      ryt        | j                  d   t        j
                  «      sJ ‚y)NÚvalr   é   )Ú
isinstancers   rƒ   ÚSymIntÚSymBoolÚSymFloatrw   s    r2   Úsym_node_sizerŽ   –   sE   € Ü�$—)‘)˜EÑ"¤U§\¡\´5·=±=Ð$AÔBØÜ�d—i‘i Ñ&¬¯©Ô7Ð7Ð7Ør4   c                   ó   — e Zd Zd„ Zy)ÚInvalidNodeBasec                  ó   — y)NzInvalid NoderD   rX   s    r2   Ú__repr__zInvalidNodeBase.__repr__ž   s   € Ør4   N)r=   r>   r?   r’   rD   r4   r2   r�   r�   �   s   „ ór4   r�   Újoint_graphrG   ÚoutputsÚsubgraphc                 ó`  ‡
— t        j                  «       }i Š
|D ]3  }|j                  |j                  «      }|j                  |_        |‰
|<   Œ5 | j
                  D �]  }t        |«      r|dk7  r
t        ‰
|<   Œ|‰
v rŒ#|j                  dk(  r
t        ‰
|<   Œ<|j                  dk(  r‘t        j                  |j                  i |j                  ¤Ž}|D �cg c]/  }t        |t         j                  «      rt        ‰
|   t        «      ‘Œ1 }}t!        |«      r
t        ‰
|<   ŒÃ|j#                  |ˆ
fd„«      ‰
|<   ŒÜ|j                  dk(  r|j#                  |ˆ
fd„«      ‰
|<   �Œ|j                  dk(  s�Œ�Œ g }	|D ]s  }t        |t         j                  «      rF|‰
vrt%        d|› d	�«      ‚t        ‰
|   t        «      rJ d|› d
�«       ‚|	j'                  ‰
|   «       Œc|	j'                  |«       Œu |j)                  t+        |	«      «       |j-                  «        |j/                  «        |S c c}w )a‘  
    Given a graph, extracts out a subgraph that takes the specified nodes as
    inputs and returns the specified outputs.

    This includes specifying non-placeholder nodes as inputs.

    The general strategy is to initialize all inputs with proxies as we
    encounter them, and trace through the graph, only keeping values which take
    in valid proxies. Then, all dead code is eliminated.
    ÚbackwardÚplaceholderÚcall_functionc                 ó   •— ‰|    S r/   rD   ©ÚxÚenvs    €r2   rT   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>Õ   ó   ø€ ¸CÀ¹F€ r4   Úget_attrc                 ó   •— ‰|    S r/   rD   r›   s    €r2   rT   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>×   rž   r4   Úoutputrb   z couldn't be found in envz was invalid, but is output)rB   ÚGraphr˜   Únamers   r|   Ú_must_be_in_backwardÚInvalidNodeÚopÚpytreeÚarg_tree_leavesÚargsÚkwargsrŠ   rC   r�   ÚanyÚ	node_copyÚRuntimeErrorÚappendr¡   ÚtupleÚeliminate_dead_codeÚlint)r“   rG   r”   r•   Ú	new_graphr-   Únew_nodeÚall_argsrœ   Úoutput_valuesr�   s             @r2   Ú"_extract_graph_with_inputs_outputsr¶   ¥   s%  ø€ ô  —‘“
€IØ
€Cð ò ˆØ×(Ñ(¨¯©Ó3ˆàŸ	™	ˆŒØˆˆDŠ	ð	ð ×!Ñ!ó ˆÜ Ô%¨(°jÒ*@Ü#ˆC�‰IØà�3‰;ð Ø�W‰W˜Ò%Ü#ˆC�ŠIØ�W‰W˜Ò'Ü×-Ñ-¨t¯y©yÐH¸D¿K¹KÑHˆHð "öàÜ˜a¤§¡Ô)ô ˜3˜q™6¤?Õ3ðˆHð ô
 �8Œ}Ü'��D‘	ØØ!×+Ñ+¨DÓ2BÓCˆC�ŠIØ�W‰W˜
Ò"Ø!×+Ñ+¨DÓ2BÓCˆC�‹IØ�W‰W˜Ô Ùð5ð6 €MØò 	$ˆÜ�aœŸ™Ô!Ø˜‰|Ü" U¨1¨#Ð-FÐ#GÓHÐHÜ!Ø�A‘œôð 6à�q�cÐ4Ð5ó6ð ð × Ñ   Q¡Õ(à× Ñ  Õ#ð	$ð ×Ñ”U˜=Ó)Ô*à×!Ñ!Ô#Ø‡N�NÔØÐùò9s   Ã4H+c                 óŠ   — | j                   dk(  xr3 dt        | j                  «      vxr t        | «       xr t	        | «       S ©Nr˜   Útangents)r¦   Ústrr‚   Ú_is_bwd_seed_offsetÚ_is_fwd_seed_offsetrw   s    r2   Ú
_is_primalr½   ì   sK   € à�‰�=Ñ ò 	*Øœc $§+¡+Ó.Ð.ò	*ä# DÓ)Ð)ò	*ô $ DÓ)Ð)ð	r4   c                 óR   — | j                   dk(  xr dt        | j                  «      v S r¸   ©r¦   rº   r‚   rw   s    r2   Ú_is_tangentrÀ   õ   s$   € Ø�7‰7�mÑ#ÒF¨
´c¸$¿+¹+Ó6FÐ(FÐFr4   c                 ó„   — | j                   dk(  xr0 dt        | j                  «      v xs dt        | j                  «      v S )Nr˜   Úbwd_seedÚbwd_base_offsetr¿   rw   s    r2   r»   r»   ù   ó=   € Ø�7‰7�mÑ#ò Ø”c˜$Ÿ+™+Ó&Ð&ÒOÐ*;¼sÀ4Ç;Á;Ó?OÐ*Oðr4   c                 ó„   — | j                   dk(  xr0 dt        | j                  «      v xs dt        | j                  «      v S )Nr˜   Úfwd_seedÚfwd_base_offsetr¿   rw   s    r2   r¼   r¼   ÿ   rÄ   r4   c                 óv   — | j                   dk(  xr) t        | j                  j                  d«      t        «      S )Nr˜   rˆ   )r¦   rŠ   rs   rt   r   rw   s    r2   Ú_is_backward_staterÉ     s*   € Ø�7‰7�mÑ#ÒW¬
°4·9±9·=±=ÀÓ3GÌÓ(WÐWr4   c                 ó@   — | j                   j                  dd «      dk(  S )NÚpartitioner_tagÚis_backward©rs   rt   rw   s    r2   Ú_has_tag_is_backwardrÎ   	  s   € Ø�9‰9�=‰=Ð*¨DÓ1°]ÑBÐBr4   c                 ó@   — | j                   j                  dd «      dk(  S )NrË   Úmust_be_in_backwardrÍ   rw   s    r2   Ú_has_tag_must_be_in_backwardrÑ     s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5JÑJÐJr4   c                 óL   — t        | «      xs t        | «      xr t        | «      S r/   )rÑ   rÎ   r!   rw   s    r2   r¤   r¤     s&   € Ü'¨Ó-ò Ü˜TÓ"Ò<¤°tÓ'<ðr4   Újoint_modulec                ó„   — t        j                  d„ | j                  j                  d¬«      D «       Ž }|d | }||d  }||fS )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr/   )r©   ©rP   r-   s     r2   rR   z+_extract_fwd_bwd_outputs.<locals>.<genexpr>  s   è ø€ Ò	K˜ˆ$�)�)Ñ	Kùs   ‚r¡   ©r¦   )r§   r¨   r{   Ú
find_nodes)rÓ   Únum_fwd_outputsr”   Úfwd_outputsÚbwd_outputss        r2   Ú_extract_fwd_bwd_outputsrÜ     sW   € ô ×$Ñ$Ù	K × 2Ñ 2× =Ñ =ÀÐ =Ó JÔ	Kð€Gð Ð*˜?Ð+€KØ˜/Ð*Ð+€KØ˜Ð#Ð#r4   Úsaved_valuesr£   c                 óV   — | D ]$  }|j                   |k(  sŒ| j                  |«        y  y r/   )r£   Úremove)rÝ   r£   Úsaved_values      r2   Ú_remove_by_namerá   "  s0   € Ø#ò ˆØ×Ñ˜tÓ#Ø×Ñ Ô,Ùñr4   Úsaved_sym_nodesrÙ   c                óZ  — t        | |¬«      \  }}| j                  j                  d¬«      }g t        t        |«      ¢}g t        t
        |«      ¢}g t        t        |«      ¢}	g t        t        |«      ¢}
g t        t        |«      ¢}t        | j                  ||z   |z   |
z   |d«      }|j                  d¬«      D ]a  }|j                  s-t        ||j                  «       t        ||j                  «       Œ<t        |«      sŒHt        ||j                  «       |rŒaJ ‚ t        «       }g }g }|D ]C  }t        |«      }|r#|j                  |«       |j!                  |«       Œ3|j!                  |«       ŒE t#        | j                  «      }t%        j&                  |||«      D ]]  }d|j(                  vrŒt+        |j(                  d   «      |z
  }t-        |d„ ¬«      D ]  }||vrŒ|j!                  ||   «       Œ ||z  }Œ_ |j/                  «        |j1                  ||z   «       t        | j                  ||	z   ||z   |z   d«      }t        | j                  ||z   |z   |
z   |z   |d«      }t2        j4                  j7                  | |«      }t2        j4                  j7                  | |«      }||fS )	N©rÙ   r˜   r×   r—   rˆ   c                 ó   — | j                   S r/   ©r£   )Úss    r2   rT   z*_extract_fwd_bwd_modules.<locals>.<lambda>e  s
   € °1·6±6€ r4   rU   Úforward)rÜ   r{   rØ   Úfilterr½   rÀ   r¼   r»   rÉ   r¶   Úusersrá   r£   r   r   Úaddr®   r   Ú	itertoolsÚchainrs   r   rW   ÚclearÚextendrB   Ú_lazy_graph_moduleÚ_make_graph_module)rÓ   rÝ   râ   rÙ   rÚ   rÛ   ÚplaceholdersÚprimal_inputsÚtangent_inputsÚfwd_seed_offset_inputsÚbwd_seed_offset_inputsÚbackward_state_inputsÚ	bwd_graphr-   Úsaved_symbolsÚsaved_sym_nodes_bindingÚsaved_sym_nodes_derivedÚsymbolÚsymbol_bindingsÚnew_symbolsrç   Ú	fwd_graphÚ
fwd_moduleÚ
bwd_modules                           r2   Ú_extract_fwd_bwd_modulesr  )  sã  € ô  8Ø oô Ñ€K�ð  ×%Ñ%×0Ñ0°MÐ0ÓB€LØ7”fœZ¨Ó6Ð7€MØ9”vœk¨<Ó8Ð9€NØIœvÔ&9¸<ÓHÐIÐØIœvÔ&9¸<ÓHÐIÐØGœfÔ%7¸ÓFÐGÐä2Ø×ÑØ˜,Ñ&¨Ñ7Ð:PÑPØØó	€Ið ×$Ñ$¨Ð$Ó6ò )ˆà�zŠzÜ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÕ7Ü Õ%ä˜L¨$¯)©)Ô4Ú(Ð(Ð(ð)ô /9«l€MØ ÐØ Ðð  ò 1ˆÜ*¨4Ó0ˆÙØ×Ñ˜fÔ%Ø#×*Ñ*¨4Õ0à#×*Ñ*¨4Õ0ð1ô 3°<×3EÑ3EÓF€OÜ—‘Ð 7¸À~ÓVò %ˆØ˜Ÿ	™	Ñ!ØÜ" 4§9¡9¨UÑ#3Ó4°}ÑDˆä˜Ñ)9Ô:ò 	?ˆAð ˜Ñ'ØØ#×*Ñ*¨?¸1Ñ+=Õ>ð	?ð 	˜Ñ$‰ð%ð" ×ÑÔØ×ÑÐ2Ð5LÑLÔMô 3Ø×ÑØÐ.Ñ.Ø�lÑ" _Ñ4Øó	€Iô 3Ø×ÑØØ
ñ	à
ñ	ð !ñ	!ð  ñ		 ð
 	Øó	€Iô ×&Ñ&×9Ñ9¸,È	ÓR€JÜ×&Ñ&×9Ñ9¸,È	ÓR€JØ�zÐ!Ð!r4   c                ó\  — t        | «      rt        | ||¬«      S t        t        t        | j
                  j                  «      «      }t        t        t        | j
                  j                  «      «      }||z   }t        | |¬«      \  }}t        | j
                  ||d«      }t        d„ |j                  D «       «      }	g }
g }| j
                  j                  D ]è  }|j                  |	vrŒt        |«      r|j                  |«       Œ/d|j                  vrA|j                  dk(  r2|j                   }t#        d„ |D «       «      sJ ‚|
j%                  |«       Œ~|j                   D �cg c]  }|j                  |	vsŒ|‘Œ }}d|j                  v r$t#        d„ |D «       «      r|j%                  |«       ŒØ|
j                  |«       Œê t        t&        j)                  |
«      j+                  «       «      }
t        t&        j)                  |«      j+                  «       «      }t-        | |
||¬«      S c c}w )	aÔ  
    Partitions the :attr:`joint_module` in a manner that closely resembles the
    behavior observed in the original ``.forward()`` and ``.backward()`` of the
    callable, i.e., the resulting forward graph contains those operators that
    are executed in the original ``.forward()`` callable passed to
    :func:`aot_function`.

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

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

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

    Returns:
        Returns the generated forward and backward Fx graph modules.
    rä   rè   c              3   óT   K  — | ]   }|j                   d k7  sŒ|j                  –— Œ" y­w©r¡   N©r¦   r£   rÖ   s     r2   rR   z$default_partition.<locals>.<genexpr>³  s$   è ø€ ò $Ø¸$¿'¹'ÀXÓ:Mˆ�	�	ñ$ùó   ‚(—(Útensor_metar™   c              3   óV   K  — | ]!  }|j                   t        j                  k(  –— Œ# y ­wr/   )r‚   ÚoperatorÚgetitem©rP   Úusers     r2   rR   z$default_partition.<locals>.<genexpr>Ã  s   è ø€ ÒI¸4�t—{‘{¤h×&6Ñ&6Õ6ÑIùs   ‚')c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr/   ©r   rO   s     r2   rR   z$default_partition.<locals>.<genexpr>É  s   è ø€ ò 2Ø#$”˜A—ñ2ùó   ‚©râ   rÙ   )r~   Ú#min_cut_rematerialization_partitionrd   ré   r½   r{   r|   r¼   rÜ   r¶   r   r£   r   r®   rs   r¦   rê   Úallrï   re   ÚfromkeysÚkeysr  )rÓ   Ú_joint_inputsrÙ   ró   rõ   rG   rÚ   rÛ   Úforward_only_graphÚforward_node_namesrÝ   râ   r-   rê   rQ   Úbackward_usagess                   r2   Údefault_partitionr  Œ  s  € ô4 ˜LÔ)Ü2Ø˜-¸ô
ð 	
ô œ¤
¨L×,>Ñ,>×,DÑ,DÓEÓF€MÜ!¤&Ô)<¸l×>PÑ>P×>VÑ>VÓ"WÓXÐØÐ3Ñ3€FÜ7Ø oô Ñ€K�ô <Ø×Ñ˜F K°óÐô $ñ $Ø0×6Ñ6ô$ó Ðð €LØ€Oà×"Ñ"×(Ñ(ò *ˆØ�9‰9Ð.Ñ.ØÜ�tÔð ×"Ñ" 4Õ(Ø $§)¡)Ñ+°·±¸?Ò0Jà—J‘JˆEÜÑIÀ5ÔIÔIÐIÐIØ×Ñ Õ&ð  Ÿ:™:öØ¨¯©Ð7IÒ)I’ðˆOð ð  §	¡	Ñ)¬cñ 2Ø(7ô2ô /ð  ×&Ñ& Õ7à×#Ñ# DÕ)ð;*ô< œŸ™ lÓ3×8Ñ8Ó:Ó;€LÜœ4Ÿ=™=¨Ó9×>Ñ>Ó@ÓA€Oä#ØØØ'Ø'ô	ð ùò)s   Å#H)Å7H)g    €„.AÚnumelc                 ó    — | |j                   z  S r/   )Úitemsize)r  Údtypes     r2   Ú_tensor_nbytesr  å  s   € Ø�5—>‘>Ñ!Ð!r4   c                 óV  ‡— dt         fd„Šd| j                  v r¸| j                  d   }t        |t        «      ryt        |t        t
        f«      rt        ˆfd„|D «       «      S t        |t        «      r"t        ˆfd„|j                  «       D «       «      S t        |t        j                  «      r ‰|«      S t        dt        |«      › d| › �«      ‚| j                  d	k(  s:| j                  t        j                  j                   j"                  j$                  u ry
t        d| › d�«      ‚)NrL   c                 ó–   — t        | t        j                  «      syt        t	        | j                  «       d¬«      | j                  «      S )Nr   é   ©Úfallback)rŠ   rƒ   ÚTensorr  r   r  r  ©rœ   s    r2   Úobject_nbytesz_size_of.<locals>.object_nbytesê  s1   € Ü˜!œUŸ\™\Ô*ØÜœh q§w¡w£y¸4Ô@À!Ç'Á'ÓJÐJr4   rˆ   r   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr/   rD   )rP   rQ   r'  s     €r2   rR   z_size_of.<locals>.<genexpr>÷  s   øè ø€ Ò5¨A‘} Q×'Ñ5ùó   ƒc              3   ó4   •K  — | ]  \  }} ‰|«      –— Œ y ­wr/   rD   )rP   Ú_rQ   r'  s      €r2   rR   z_size_of.<locals>.<genexpr>ù  s   øè ø€ Ò@©D¨A¨q‘} Q×'Ñ@ùó   ƒzUnknown metadata type z	 on node rŸ   r   rb   zO didn't have `val` metadata; we should always have `val` metadata on the nodes.)rf   rs   rŠ   r   rd   r¯   Úsumre   Úitemsrƒ   r%  r­   Útyper¦   r‚   ÚopsÚatenÚ_assert_scalarÚdefault)r-   rˆ   r'  s     @r2   Ú_size_ofr4  é  sú   ø€ ðKœCó Kð
 �—	‘	ÑØ�i‰i˜ÑˆÜ�cœ<Ô(Øô ˜œd¤E˜]Ô+ÜÓ5°Ô5Ó5Ð5Ü˜œTÔ"ÜÓ@°C·I±I³KÔ@Ó@Ð@Ü˜œUŸ\™\Ô*Ù  Ó%Ð%äÐ3´D¸³I°;¸iÈÀvÐNÓOÐOØ‡w�w�*Ò §¡¬u¯y©y¯~©~×/LÑ/L×/TÑ/TÑ TØÜ
Ø
�ˆvÐdÐeóð r4   r{   c                 ó  — ddl m}  |t        «      }| j                  D ]3  }|j                  dk(  sŒ||j
                  j                  xx   dz  cc<   Œ5 t        j                  dt        |j                  «       d„ d¬«      «       y )	Nr   r   r™   r   z%sc                 ó   — | d   S ©Nr   rD   r&  s    r2   rT   z_count_ops.<locals>.<lambda>  s
   € °Q°q±T€ r4   T©rV   Úreverse)Úcollectionsr   rf   r|   r¦   r‚   r=   r%   ÚinforW   r.  )r{   r   Úcntr-   s       r2   Ú
_count_opsr=    sg   € Ý'á%¤cÓ*€CØ—‘ò +ˆØ�7‰7�oÓ%Ø�—‘×$Ñ$Ó%¨Ñ*Ô%ð+ô ‡H�HˆT”6˜#Ÿ)™)›+©>À4ÔHÕIr4   c                  ó   — g } t        t        j                  j                  «      D ]¥  }t	        t        j                  j                  |«      }t        |t        j                  j                  «      sŒL|j                  «       D ]G  }t	        ||«      }t        j                  j                  |j                  v sŒ6| j                  |«        Œ¥ Œ§ | S r/   )Údirrƒ   r0  r1  ÚgetattrrŠ   Ú_opsÚOpOverloadPacketÚ	overloadsr„   Ú	pointwiser€   r®   )r0  Ú	attr_nameÚopoverloadpacketÚoverloadÚop_overloads        r2   Úpointwise_opsrI    s¤   € à
€CÜœŸ™Ÿ™Ó(ò 
ˆ	Ü"¤5§9¡9§>¡>°9Ó=ÐÜÐ*¬E¯J©J×,GÑ,GÔHØà(×2Ñ2Ó4ò 	ˆHÜ!Ð"2°HÓ=ˆKÜ�y‰y×"Ñ" k×&6Ñ&6Ò6à—
‘
Ð+Ô,Ùñ	ð
ð €Jr4   Ú	depth_mapc                 óÊ   — | D �ci c]7  }t        |t        j                  j                  j                  «      sŒ2|||   “Œ9 }}t        |j                  «       d„ d¬«      S c c}w )Nc                 ó   — | d   S r7  rD   r&  s    r2   rT   zsort_depths.<locals>.<lambda>&  s
   € °A°a±D€ r4   Tr8  )rŠ   rƒ   rB   r-   rC   rW   r.  )r©   rJ  ÚargÚ
arg_depthss       r2   Úsort_depthsrO  "  s[   € à'+öØ #¬z¸#¼u¿x¹x¿}¹}×?QÑ?QÕ/RˆˆY�s‰^Ñð€Jð ô �*×"Ñ"Ó$©.À$ÔGÐGùòs
   …3A ¹A Úgmc                 óŽ  ‡
‡‡— t        j                  «       Ši Š
| j                  j                  d¬«      D ]  }‰j	                  |ˆ
fd„«      ‰
|<   Œ i Št        | j                  j                  «      D ]
  \  }}|‰|<   Œ ˆ
ˆˆfd„}t        t        t        | j                  j                  «      «      }d}t        j                  }|D ]#  }|j                  D ]  }‰|   |k  sŒ‰|   }|}Œ Œ% |€| S t        | j                  j                  «      ‰|   d D ]
  } ||«       Œ t        j                   j                  | ‰«      }	|	S )aÃ  
    This pass finds the first bwd node in the graph (by looking at users of
    tangents) and then reorders the graph by walking from this node to all the
    way to the end of the graph. At each op in this traveral, we insert this op
    in a new graph and try to bring only the relevant subgraph from the other
    non-bwd edges relevant for this op. This closely mimics the behavior of
    autograd engine.

    Why is this pass required in the first place?

    This is an artifact of how partitioners work today. The starting point of
    partitioner is a joint graph, which is fwd and then bwd graph. In the case
    of checkpointing, we keep portions of fwd graph in their original place in
    the joint graph, while obtaining a bwd graph. As a result, the resulting bwd
    graph has copies of recomputed fwd subgraphs followed by the original bwd
    graph. If we run this naively, this leads to bad memory footprint, because
    the fwd subgraphs are live for way longer duration than necessary. This pass
    reorders the operations such that we prioritize the ops for the original bwd
    graph while only realizing those ops from the fwd graph that are necessary
    at any given point in the graph.
    r˜   r×   c                 ó   •— ‰|    S r/   rD   r›   s    €r2   rT   z5reordering_to_mimic_autograd_engine.<locals>.<lambda>E  s   ø€ ¸¸A¹€ r4   c                 ó*  •— | g}t        «       }t        |«      dkD  rH|j                  «       } | |v s| ‰v rŒ'|j                  | «       || j                  z  }t        |«      dkD  rŒHt        |ˆfd„¬«      }|D ]  } ‰j                  | ˆfd„«      ‰| <   Œ y )Nr   c                 ó   •— ‰|    S r/   rD   )rQ   Úorders    €r2   rT   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>X  s   ø€ À%ÈÁ(€ r4   rU   c                 ó   •— ‰|    S r/   rD   r›   s    €r2   rT   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>Z  rž   r4   )r   ÚlenÚpoprë   Úall_input_nodesrW   r¬   )r-   Ú	cur_nodesÚinsertable_nodesr�   r²   rU  s      €€€r2   Úinsert_node_in_graphzAreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graphK  s¢   ø€ Ø�Fˆ	Ü0:³ÐÜ�)‹n˜qÒ Ø—=‘=“?ˆDØÐ'Ñ'¨4°3©;ØØ× Ñ  Ô&ð ˜×-Ñ-Ñ-ˆIô �)‹n˜qÓ ô "Ð"2Ó8JÔKÐØ$ò 	DˆDØ!×+Ñ+¨DÓ2BÓCˆC�ŠIñ	Dr4   N)rB   r¢   r{   rØ   r¬   Ú	enumerater|   rd   ré   rÀ   ÚmathÚinfrê   rƒ   ÚGraphModule)rP  r-   Úidxr\  rô   Úfirst_node_in_bwdÚminimum_orderÚtangentr  Únew_gmr�   r²   rU  s             @@@r2   Ú#reordering_to_mimic_autograd_enginerf  )  sL  ú€ ô. —‘“
€IØ"$€Cð —‘×#Ñ# }Ð#Ó5ò @ˆØ×'Ñ'¨Ó.>Ó?ˆˆDŠ	ð@ð €EÜ˜rŸx™xŸ~™~Ó.ò ‰	ˆˆTØˆˆdŠðöDô$ œ&¤¨b¯h©h¯n©nÓ=Ó>€NØÐÜ—H‘H€MØ!ò )ˆØ—M‘Mò 	)ˆDØ�T‰{˜]Ó*Ø % d¡�Ø$(Ñ!ñ	)ð)ð Ð Øˆ	ô �R—X‘X—^‘^Ó$ UÐ+<Ñ%=Ð%?Ð@ò #ˆÙ˜TÕ"ð#ô �X‰X×!Ñ! " iÓ0€FØ€Mr4   Ú	fw_moduleÚ	bw_moduleÚfw_nodeÚbw_nodeÚdeviceÚ	rng_countÚlast_fwd_inputÚlast_bwd_inputc                 óœ  — |j                   }|€J ‚| j                  }	|j                  }
t        j                  j                  j
                  }| j                  j                  |«      5  | j                  j                  d|› �«      }t        |«      |j                  d<   |}ddd«       |j                  j                  |«      5  |j                  j                  d|› �«      }t        |«      |j                  d<   |}ddd«       t        |j                  «      }|d<   | j                  j                  |«      5  |	j                  d||j                  g|j                  ¢­|¬«      }ddd«       |j                  «       |	j!                  |«       t        |j                  «      }|d<   |
j#                  |«      5  |
j                  d||j                  g|j                  ¢­|¬«      }|j                  |«       |
j!                  |«       ddd«       ||fS # 1 sw Y   �ŒzxY w# 1 sw Y   �Œ+xY w# 1 sw Y   ŒÌxY w# 1 sw Y   ||fS xY w)a%  
    Note [CUDA Graph Safe RNG Functionalization]

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

    For each RNG operation's forward/backward pair:

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

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

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

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

    This function modifies both forward and backward computation graphs by:

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

    For more details: https://github.com/pytorch/pytorch/issues/113541
    NÚfwd_rng_state_rˆ   Úbwd_rng_state_Ú	rng_stater™   ©r©   rª   )Úindexr{   rƒ   Ú_primsÚ	rng_primsÚgraphsafe_run_with_rng_stateÚinserting_afterr˜   r    rs   re   rª   Úcreate_noder‚   r©   Úreplace_all_uses_withÚ
erase_nodeÚinserting_before)rg  rh  ri  rj  rk  rl  rm  rn  Ú
device_idxÚfw_graphÚbw_graphrw  Úfwd_rng_stateÚbwd_rng_stateÚ	fw_kwargsÚfunctional_fw_nodeÚ
bwd_kwargsÚ
rng_outputs                     r2   Ú%apply_graphsafe_rng_functionalizationr†  s  s2  € ðR —‘€JØÐ!Ð!Ð!Ø�‰€HØ�‰€HÜ#(§<¡<×#9Ñ#9×#VÑ#VÐ ð 
�‰×	(Ñ	(¨Ó	8ñ 'Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆÜ$?À
Ó$Kˆ×Ñ˜5Ñ!Ø&ˆ÷'ð 
�‰×	(Ñ	(¨Ó	8ñ 'Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆä$?À
Ó$Kˆ×Ñ˜5Ñ!Ø&ˆ÷	'ô �W—^‘^Ó$€IØ*€IˆkÑØ	�‰×	(Ñ	(¨Ó	1ñ 
Ø%×1Ñ1ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 2ó 
Ð÷
ð ×!Ñ!Ð"4Ô5Ø×Ñ˜Ô ô �g—n‘nÓ%€JØ+€Jˆ{ÑØ	×	"Ñ	" 7Ó	+ñ %Ø×)Ñ)ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 *ó 
ˆ
ð 	×%Ñ% jÔ1Ø×Ñ˜GÔ$÷%ð ˜>Ð)Ð)÷M'ñ 'ú÷'ñ 'ú÷
ð 
ú÷%ð ˜>Ð)Ð)ús1   Á(9HÃ9H&Ä:.H3Æ=AH?ÈH#È&H0È3H<È?IÚnum_sym_nodesc                 ó  ‡'— t        j                  «       }d„ }dt        t        j                     fd„Š'dt        t        j                     fd„} || «      } ||«      } ||«      }	i }
| j
                  j                  D ]‹  }t        |«      sŒt        |j                  d«      sŒ&t        j                  j                  |j                  j                  v sŒW||j                     }||j                     }|	|j                     }||dœ|
|<   Œ� t        j                  j                  j                   }t        j                  j                  j"                  }d }|j
                  j%                  d¬	«      D ]  }d
|j                  v sŒ|} n |€t'        d«      ‚g }t)        t+        |j
                  j%                  d¬	«      «      «      }t)        t+        |j
                  j%                  d¬	«      «      «      }t-        ˆ'fd„|
j/                  «       D «       «      }|j1                  t        j                  d«      «       t3        |«      dkD  }t        j4                  j6                  }t6        j8                  xr* | xr% |j:                   xs |j<                  j>                  }tA        |
jC                  «       «      D �]ì  \  }\  }}|d   }|d   } ‰'|«      }|j
                  }|j
                  }|r'|�%|jD                  dk(  rtG        ||||||||«      \  }}Œ]|jI                  |«      5  |jK                  d||j                  g|jL                  ¢­|jN                  ¬«      }|jK                  dtP        jR                  |dfi ¬«      }|jK                  dtP        jR                  |dfi ¬«      } |jU                  | «       |jW                  |«       |jY                  |«       d d d «       |jI                  |«      5  dt)        |«      › �}!|j[                  |!«      }" ||«      |"j\                  d<   d d d «       |jI                  |«      5  |jK                  d|"|j                  g|jL                  ¢­|jN                  ¬«      } |jU                  | «       |jW                  |«       d d d «       �Œï |r˜t)        t_        |j
                  j%                  d¬	«      «      «      }#|#jL                  d   }$t3        |$«      |z
  }%|$d |% ta        |«      z   |$|%d  z   }&|j
                  jc                  |&«       |j
                  jW                  |#«       |je                  «        |je                  «        ||fS # 1 sw Y   �Œ�xY w# 1 sw Y   �ŒLxY w# 1 sw Y   �ŒÒxY w)Nc                 ó  — i }| j                   j                  D ]i  }|j                  dk(  sŒt        |j                  d«      sŒ*t
        j                  j                  |j                  j                  v sŒ[|||j                  <   Œk |S )Nr™   r€   )
r{   r|   r¦   r�   r‚   rƒ   r„   r…   r€   r£   )ÚgmodÚrandom_nodesr-   s      r2   Úget_rng_opsz*functionalize_rng_ops.<locals>.get_rng_opsë  sl   € ØˆØ—J‘J×$Ñ$ò 	/ˆDà—‘˜?Ó*Ü˜DŸK™K¨Õ0Ü—I‘I×5Ñ5¸¿¹×9IÑ9IÒIà*.�˜TŸY™YÒ'ð	/ð Ðr4   rL   c                 ó   — d| j                   vry| j                   d   }t        |t        «      s|f}|D ]D  }t        |t        j                  «      sŒ|j
                  j                  dk(  sŒ8|j
                  c S  t        j
                  d«      S )zV
        Check the example value of the node outputs to find the device type.
        rˆ   NÚcudaÚcpu)rs   rŠ   r¯   rƒ   r%  rk  r/  )r-   Ú
candidatesÚ	candidates      r2   Ú
get_devicez)functionalize_rng_ops.<locals>.get_deviceö  s€   € ð ˜Ÿ	™	Ñ!Øà—Y‘Y˜uÑ%ˆ
Ü˜*¤eÔ,Ø$˜ˆJà#ò 	,ˆIÜ˜)¤U§\¡\Õ2Ø×#Ñ#×(Ñ(¨FÓ2Ø$×+Ñ+Ò+ð	,ô
 �|‰|˜EÓ"Ð"r4   rk  c                 óˆ   — | �-| j                   dk(  rt        j                  j                  «       S t        j                  «       S )NrŽ  )r/  rƒ   rŽ  Úget_rng_state)rk  s    r2   Úget_sample_rng_statez3functionalize_rng_ops.<locals>.get_sample_rng_state  s5   € ØÐ &§+¡+°Ò"7Ü—:‘:×+Ñ+Ó-Ð-Ü×"Ñ"Ó$Ð$r4   r€   )ÚfwdÚbwdr˜   r×   rd  zaCouldn't find tangent node in graph inputs. This is unexpected, please file a bug if you see thisc              3   ó4   •K  — | ]  } ‰|d    «      –— Œ y­w)r–  NrD   )rP   Ú	node_pairr’  s     €r2   rR   z(functionalize_rng_ops.<locals>.<genexpr>/  s    øè ø€ ò Ø)2‰
�9˜UÑ#×$ñùr,  r�  r   r–  r—  rŽ  r™   rs  r   Úrng_state_output_rˆ   r¡   )3rì   Úcountr   rƒ   rk  r{   r|   rx   r�   r‚   r„   r…   r€   r£   ru  rv  Úrun_and_save_rng_stateÚrun_with_rng_staterØ   r­   ÚnextÚreversedr   ÚvaluesÚdiscardrW  Ú	_inductorr   Úgraphsafe_rng_functionalizationÚfallback_randomÚtest_configsÚ*graphsafe_rng_func_ignores_fallback_randomr]  r.  r/  r†  r|  ry  r©   rª   r
  r  rz  r{  r®   r˜   rs   Úiterr¯   r¡   Ú	recompile)(rÓ   rg  rh  r‡  ÚuidrŒ  r•  Újoint_graph_rng_opsÚfw_graph_rng_opsÚbw_graph_rng_opsÚrecomputable_rng_ops_mapr-   Ú	base_noderi  rj  Úrun_and_save_rngr�  Úbw_tangent_start_nodeÚfw_rng_state_outputsrm  rn  ÚdevicesÚmulti_cuda_devicesÚ
ind_configÚ'use_rng_graphsafe_rng_functionalizationrl  r™  rk  r~  r  rƒ  Ústater…  Ú
state_nameÚbw_rng_state_nodeÚfw_output_nodeÚ
fw_outputsÚsym_node_start_idxr”   r’  s(                                          @r2   Úfunctionalize_rng_opsr¼  Ð  s  ø€ ô2 �/‰/Ó
€Cò	ð#œH¤U§\¡\Ñ2ó #ð$%¤X¬e¯l©lÑ%;ó %ñ & lÓ3ÐÙ" 9Ó-ÐÙ" 9Ó-ÐØ!ÐØ×"Ñ"×(Ñ(ò 	Sˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEà+¨D¯I©IÑ6ˆIØ& t§y¡yÑ1ˆGØ& t§y¡yÑ1ˆGØ:AÈ'Ñ2RÐ$ YÒ/ð	Sô —|‘|×-Ñ-×DÑDÐÜŸ™×/Ñ/×BÑBÐà ÐØ—‘×*Ñ*¨mÐ*Ó<ò ˆØ˜Ÿ	™	Ò!Ø$(Ð!Ùðð Ð$ÜØoó
ð 	
ð Ðäœ( 9§?¡?×#=Ñ#=ÀÐ#=Ó#OÓPÓQ€NÜœ( 9§?¡?×#=Ñ#=ÀÐ#=Ó#OÓPÓQ€Näó Ø6N×6UÑ6UÓ6Wôó €Gð ‡O�O”E—L‘L Ó'Ô(ô ˜W›¨Ñ)Ðô —‘×'Ñ'€Jä×.Ñ.ò 	
Ø"Ð"ò	
ð ×*Ñ*Ð*ò RØ×&Ñ&×QÑQð ,ô .7Ø ×&Ñ&Ó(ó.ó D-Ñ)ˆ	Ñ)�I˜yð ˜EÑ"ˆØ˜EÑ"ˆÙ˜GÓ$ˆà—?‘?ˆØ—?‘?ˆñ 4ØÐ"Ø—‘˜vÒ%ä-RØØØØØØØØó	.Ñ*ˆN™Nð ×*Ñ*¨7Ó3ñ 3Ø%-×%9Ñ%9Ø#Ø$Ø!Ÿ.™.Ð8¨7¯<©<Ñ8Ø"Ÿ>™>ð	 &:ó &Ð"ð !×,Ñ,Ø#Ü×$Ñ$Ø,¨aÐ0Øð	 -ó �ð &×1Ñ1Ø#Ü×$Ñ$à*Øðð ð 2ó �
ð ×-Ñ-¨jÔ9Ø×#Ñ# GÔ,Ø$×+Ñ+¨EÔ2÷13ð6 ×*Ñ*Ð+@ÓAñ MØ0´°c³°Ð<�
Ø$,×$8Ñ$8¸Ó$DÐ!Ù0DÀVÓ0LÐ!×&Ñ& uÑ-÷Mð
 ×*Ñ*¨7Ó3ñ 	-Ø%×1Ñ1Ø#Ø&Ø+¨W¯^©^ÐK¸g¿l¹lÑKØ"Ÿ>™>ð	 2ó �
ð ×-Ñ-¨jÔ9Ø×#Ñ# GÔ,÷	-ñ 	-ðwD-ñR Üœd 9§?¡?×#=Ñ#=ÀÐ#=Ó#JÓKÓLˆØ#×(Ñ(¨Ñ+ˆ
Ü  ›_¨}Ñ<ÐàÐ*Ð*Ð+ÜÐ(Ó)ñ*àÐ+Ð,Ð-ñ.ð 	ð
 	�‰×Ñ˜wÔ'Ø�‰×"Ñ" >Ô2Ø×ÑÔØ×ÑÔØ�iÐÐ÷w3ñ 3ú÷6Mñ Mú÷
	-ñ 	-ús&   Ì&B5U&Ï45U3ÑAV Õ&U0	Õ3U=	Ö V
	c                 ó¶  — | j                   j                  D ]¿  }t        |«      sŒ|j                  D ]K  }t        |«      sŒ|j                  d   |j                  d   kD  sŒ/t
        j                  |j                  d<   ŒM |j                  j                  dd«      sŒ†t        d„ |j                  D «       «      rŒ£t
        j                  |j                  d<   ŒÁ | S )a  
    If there are two consecutive checkpointed blocks with no operator in
    between, we would still want to stash the tensor at the boundary of
    checkpointed blocks. The following pass makes the last output node
    non-recomputable to allow for that.
    Úac_graph_idrr   Úhas_backward_hookFc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr/   )rx   r  s     r2   rR   z)cleanup_recompute_tags.<locals>.<genexpr>ª  s   è ø€ ò EØ)-”˜t×$ñEùr  )	r{   r|   rx   rê   rs   r   Ú	MUST_SAVErt   r«   )rÓ   r-   r  s      r2   Úcleanup_recompute_tagsrÂ  ›  sÂ   € ð ×"Ñ"×(Ñ(ò DˆÜ˜$ÕØŸ
™
ò H�ä" 4Õ(ØŸ	™	 -Ñ0°4·9±9¸]Ñ3KÓKä-=×-GÑ-G�D—I‘I˜kÒ*ðHð �y‰y�}‰}Ð0°%Õ8Äñ EØ15·±ôEõ Bô& *:×)CÑ)C�—	‘	˜+Ò&ð7Dð8 Ðr4   Ú	node_infoÚmin_cut_optionsÚdont_banc                 óÔ  ‡‡‡‡%‡&‡'‡(‡)‡*‡+‡,‡-‡.‡/‡0— ‰€
t        «       Št        «       Š/t        rQt        d„ | j                  D «       «      }|t        d„ ‰/j                  D «       «      z
  }t
        j                  d|«       d„ Š&d„ Š'ˆ&ˆ'ˆ/fd„Š(	 dd l}ˆ(ˆˆ/fd	„Š*ˆ*ˆˆ/fd
„}ˆ(fd„Š)dt        fˆ)ˆ/fd„}	|j                  «       Š.t        «       Š%ˆ%ˆˆ.ˆ/fd„}
| j                  D �]A  }|j                  dk(  rŒ|‰j                  v rm|‰j                  vr0‰.j                  |j                   dz   dt"        j$                  ¬«       Œ`‰.j                  |j                   dz   dt"        j$                  ¬«       t'        |«      r0‰.j                  |j                   dz   dt"        j$                  ¬«       ŒÊt)        |«      st+        |«      r |
|«       ‰j-                  |«      r ||«      r |
|«       d|j.                  vxr d|j.                  vxs8 d|j.                  v xr( t1        |j.                  d   t2        j4                  «       }t7        |«      rt        t9        |«      «      }nF|r<t1        |j.                  j;                  d«      t<        «      rdnt"        j$                  }n |	|«      }‰.j                  |j                   dz   |j                   dz   |¬«       |j>                  D ]>  }‰.j                  |j                   dz   |j                   dz   t"        j$                  ¬«       Œ@ �ŒD dt@        tB        jD                     dtF        dtF        fˆ(ˆfd„}‰jH                  �r(‰jJ                  D �]  }|j>                  D �cg c]$  }‰j-                  |«      r‰jM                  |«      ‘Œ& }}|j>                  D �cg c]  }‰j-                  |«      sŒ|‘Œ }}tO        |«      dkD  sŒw ||tQ        |«      «      }tS        |j>                  «      D ]x  }‰j-                  |«      sŒ‰jM                  |«      |kD  sŒ* ‰(||«      sŒ4|‰%v rŒ9t
        j                  d|‰jM                  |«      ||‰jM                  |«      «        |
|«       Œz �Œ ‰jT                  �r^t        «       }| j                  D �]D  }‰j-                  |«      sŒ‰jM                  |«      |fg}‰jM                  |«      }tO        |«      dkD  sŒJtW        jX                  |«      \  }}||v rŒ,|j[                  |«       ‰jM                  |«      |dz   kD  rNtO        |«      dk(  r@t
        j                  d||‰jM                  |«      ‰jM                  |«      «        |
|«       ŒÝ|j>                  D ]J  }‰j-                  |«      sŒ ‰(||«      sŒ|‰%vsŒ$tW        j\                  |‰jM                  |«      |f«       ŒL tO        |«      dkD  rŒû�ŒG 	 |j_                  ‰.dd«      \  }}|\  }Š-t        «       }ˆ.fd „|D «       D ]   \  Š0}|jm                  ˆ-ˆ0fd!„|D «       «       Œ" t        «       }|D ](  \  } }!| d d" |!d d# k(  sJ ‚| d d" }"|j[                  |"«       Œ* to        | «      Š+tq        | j                  «      D �#�ci c]  \  }#}||#“Œ
 c}}#Š,ts        ˆ+fd$„|D «       ˆ,fd%„¬&«      }$|$‰%fS # t        $ r}t        d«      |‚d }~ww xY wc c}w c c}w # t`        $ ri t
        j                  d«       t
        j                  djc                  |jd                  jf                  ji                  ‰.«      «      «       tk        ‰.«       ‚ w xY wc c}}#w )'Nc              3   ó¤   K  — | ]H  }|j                   d k(  r7t        |j                  d«      r!t        |j                  j                  «      –— ŒJ y­w)r™   Ú_overloadpacketN)r¦   r�   r‚   rº   rÈ  rÖ   s     r2   rR   z solve_min_cut.<locals>.<genexpr>Ì  sA   è ø€ ò &
àØ�w‰w˜/Ò)¬g°d·k±kÐCTÔ.Uô �—‘×+Ñ+×,ñ&
ùs   ‚AAc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr/   )rº   ©rP   Úis     r2   rR   z solve_min_cut.<locals>.<genexpr>Ñ  s   è ø€ ò 4
ØŒC��Fñ4
ùr  z&Ops banned from re-materialization: %sc                 óD  — |j                   t        j                  j                  j                  k7  ry|j
                  d   }t        j                  j                  j                  |«      \  }}|D ].  }|j                  |   }| |u r yt        |t        «      sŒ)| |v sŒ. y y©NFr   T)r‚   rƒ   r0  Úhigher_orderÚauto_functionalizedr©   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsrª   rŠ   rd   )ÚaÚbÚ
mutable_opÚmutable_arg_namesr+  r£   rM  s          r2   Ú!can_fuse_into_auto_functionalizedz8solve_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È
ÓSñ	
ØØà%ò 	 ˆDØ—(‘(˜4‘.ˆCØ�C‰xÙÜ˜#œtÕ$Ø˜’8Ùð	 ð r4   c                 óÄ   — |j                   t        j                  j                  j                  k7  ry|j
                  d   }|D ]  }|j
                  d   |   }| |u sŒ y y)NFÚtensors_to_clonerª   T)r‚   rƒ   r0  rÎ  Ú triton_kernel_wrapper_functionalrª   )rÓ  rÔ  rÖ  r£   rM  s        r2   Ú.can_fuse_into_triton_kernel_wrapper_functionalzEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functionalç  sb   € Ø�8‰8”u—y‘y×-Ñ-×NÑNÒNØØŸH™HÐ%7Ñ8ÐØ%ò 	ˆDØ—(‘(˜8Ñ$ TÑ*ˆCØ�CŠxÙð	ð r4   c                 ób  •— t        |«      t        j                  k(  ry ‰| |«      ry ‰| |«      ry| j                  t        j
                  u r>| j                  d   j                  t        j                  j                  j                  u ry‰j                  | «      xr ‰j                  |«      S )NTr   F)r#   r1  Úcatr‚   r
  r  r©   rƒ   r0  rÎ  rÚ  r3   )rÓ  rÔ  r×  rÛ  Úop_typess     €€€r2   r3   z!solve_min_cut.<locals>.is_fusibleñ  s•   ø€ ô ˜1Ó¤§¡Ò)ØÙ,¨Q°Ô2ØÙ9¸!¸QÔ?Øà�H‰Hœ×(Ñ(Ñ(Ø—‘�q‘	× Ñ Ü�y‰y×%Ñ%×FÑFñGð
 Ø×"Ñ" 1Ó%Ò@¨(×*=Ñ*=¸aÓ*@Ð@r4   r   zANeed networkx installed to perform smart recomputation heuristicsc                 ó<  •— ‰j                  | «      ryt        | g«      }t        |«      dkD  ro|j                  «       }|j                  D ]A  }‰j                  |«      s ‰||«      s y‰j                  |«      sŒ1|j                  |«       ŒC t        |«      dkD  rŒoyrÍ  )r:   r   rW  rX  rê   r\   rë   )r-   rZ  Úcurr  r3   rÃ  rÞ  s       €€€r2   Úis_materialized_backwardsz0solve_min_cut.<locals>.is_materialized_backwards  s‘   ø€ Ø×Ñ˜DÔ!ØÜ ˜vÓ&ˆ	Ü�)‹n˜qÒ Ø—-‘-“/ˆCØŸ	™	ò (�Ø ×/Ñ/°Ô5¹jÈÈdÔ>SÙØ×#Ñ# DÕ)Ø—M‘M $Õ'ð	(ô �)‹n˜qÓ ð r4   c                 óT  •— | j                   dk7  ry| j                  t        j                  k(  ry| j                  j                  dd «      t        j                  k(  ryt        j                  r‰j                  | «      ry| j                  t        j                  j                  t        j                  j                  fv ry‰j                  r‰j!                  | «      s$y‰j#                  | «      s‰j%                  | «      ry‰j&                  r3 ‰| «      r+t(        j+                  d| t-        | j.                  «      «       y| j0                  dk  r| j0                  t        j2                  kD  ry‰j4                  r/t7        d„ | j8                  D «       «      }t;        | «      }|dz  |k  S y)	Nr™   Frr   Tzmaterialized backwards: %s %siè  c              3   óh   K  — | ]*  }t        |t        j                  «      sŒt        |«      –— Œ, y ­wr/   )rŠ   rB   rC   r4  rÊ  s     r2   rR   zBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>D  s&   è ø€ ò %Ø !´*¸QÄÇÁÕ2H”˜—ñ%ùs   ‚2¢2r‰   )r¦   r‚   r
  r  rs   rt   r   rÁ  r   Úrecompute_viewsr:   r1  Úlift_fresh_copyr3  Ú
lift_freshro   r<   r8   r6   rn   r%   Údebugr¯   rê   Údist_from_bwÚmax_dist_from_bwrp   r-  r©   r4  )r-   Úinput_tensors_sizeÚoutput_sizerá  rÄ  rÞ  s      €€€r2   Úshould_ban_recomputationz/solve_min_cut.<locals>.should_ban_recomputation  sc  ø€ Ø�7‰7�oÒ%ØØ�;‰;œ(×*Ñ*Ò*ØØ�9‰9�=‰=˜ dÓ+Ô/?×/IÑ/IÒIØÜ×!Ò! h×&6Ñ&6°tÔ&<ØØ�;‰;œ4×/Ñ/×7Ñ7¼¿¹×9PÑ9PÐQÑQØà×2Ò2Ø×+Ñ+¨DÔ1Øà×!Ñ! $Ô'¨8×+HÑ+HÈÔ+NØð ×7Ò7Ñ<UØô=
ô �I‰IÐ5°t¼UÀ4Ç:Á:Ó=NÔOØð ×Ñ˜tÒ#¨×(9Ñ(9¼F×<SÑ<SÒ(SØð ×+Ò+Ü!$ñ %Ø%)§Y¡Yô%ó "Ðô # 4›.ˆKØ ‘?Ð%7Ñ7Ð7Ør4   c                 óf   •‡ — ‰ j                   dk(  ryt        ˆˆ fd„‰ j                  D «       «       S )Nr˜   Tc              3   ó0   •K  — | ]  } ‰‰|«      –— Œ y ­wr/   rD   )rP   r  r3   r-   s     €€r2   rR   z9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>O  s   øè ø€ ÒE°$‘z $¨×-ÑEùs   ƒ)r¦   r  rê   )r-   r3   s   `€r2   Úis_materializedz&solve_min_cut.<locals>.is_materializedK  s*   ù€ Ø�7‰7�mÒ#ØäÔE¸$¿*¹*ÔEÓEÐEÐEr4   rL   c           
      óŒ  •— t        | «      }t        j                  r!‰j                  | «      rt        j
                  S t        | j                  d   t        «      r-t        | j                  d   t        j                  «      st        S t        |dt        t        | j                  d«      d«      z  z  «      } ‰| «      r|S |dz  S )Nrˆ   gš™™™™™ñ?éd   r   é   )r4  r   rä  r:   r^  r_  rŠ   rs   r   rƒ   r‹   ÚINT_INFrf   ÚmaxÚminrè  )r-   Úmem_szrï  rÞ  s     €€r2   Úget_node_weightz&solve_min_cut.<locals>.get_node_weightQ  s�   ø€ Ü˜$“ˆÜ×!Ò! h×&6Ñ&6°tÔ&<ô —8‘8ˆOä�d—i‘i Ñ&¬Ô5ä˜dŸi™i¨Ñ.´·±Ô=Ü�ô �V˜s¤c¬#¨d×.?Ñ.?ÀÓ*EÀqÓ&IÑIÑJÓKˆÙ˜4Ô ØˆMà˜A‘:Ðr4   c                 ó8  •— ‰j                  | «      ry| ‰v ryt        | «      ryd| j                  v r(t        | j                  d   t        j
                  «      ry‰j                  | «       ‰j                  d| j                  dz   t        j                  ¬«       y)NFrˆ   ÚsourceÚ_in©ÚcapacityT)r:   rx   rs   rŠ   rƒ   r�   rë   Úadd_edger£   r^  r_  )r-   Úbanned_nodesrÅ  Únx_graphrÞ  s    €€€€r2   Úban_recomputation_if_allowedz3solve_min_cut.<locals>.ban_recomputation_if_allowedm  s†   ø€ Ø×Ñ˜DÔ!ØØ�8ÑØô ˜$ÔØà�D—I‘IÑ¤*¨T¯Y©Y°uÑ-=¼u¿~¹~Ô"NØà×Ñ˜Ôð
 	×Ñ˜( D§I¡I°Ñ$5ÄÇÁÐÔIØr4   r¡   rú  Úsinkrû  Ú_outrˆ   r  ç        Ústart_nodesÚ	max_rangec                 óØ  •— g }| D ]*  }t        j                  |‰
j                  |«      |df«       Œ, t        |«      dkD  r©t        j                  |«      \  }}}|s‰
j                  |«      S |j
                  D ]_  }‰
j                  |«      sŒ‰
j                  |«      |kD  rŒ*‰
j                  |«      | ‰	||«      f}||vsŒJt        j                  ||«       Œa t        |«      dkD  rŒ©|S )z„
        Finds the first unfusible node in the chain of nodes starting from
        `start_nodes` and returns its position.
        Tr   )ÚheapqÚheappushrc   rW  Úheappoprê   r\   )r  r  Úsorted_nodesrQ   r+  r-   Únode_is_fusibler  rˆ   r3   rÃ  s            €€r2   Úfind_first_unfusiblez+solve_min_cut.<locals>.find_first_unfusibleÈ  sû   ø€ ð
 9;ˆØò 	OˆAÜ�N‰N˜<¨)×*@Ñ*@ÀÓ*CÀQÈÐ)MÕNð	Oô �,Ó !Ò#Ü',§}¡}°\Ó'BÑ$ˆAˆt�_Ù"Ø ×-Ñ-¨dÓ3Ð3ØŸ
™
ò 
:�Ø×+Ñ+¨DÕ1Ø ×-Ñ-¨dÓ3°iÒ?Ø à!×.Ñ.¨tÓ4ØÙ" 4¨Ó.ð6�Cð
  ,Ò.ÜŸ™ |°SÕ9ð
:ô	 �,Ó !Ó#ð Ðr4   z1used above/below fusible %s:(%s) -> %s -> %s:(%s)rñ  ztoo long %s %s %s %srù  z-Failed to compute min-cut on following graph:ú
c              3   ó,   •K  — | ]  }|‰|   f–— Œ y ­wr/   rD   )rP   rQ   rÿ  s     €r2   rR   z solve_min_cut.<locals>.<genexpr>:  s   øè ø€ Ò8¨�Q˜ ™Ô$Ñ8ùs   ƒc              3   ó0   •K  — | ]  }|‰v sŒ‰|f–— Œ y ­wr/   rD   )rP   ÚvÚnon_reachableÚus     €€r2   rR   z solve_min_cut.<locals>.<genexpr>;  s   øè ø€ ÒA ¨a°=Ò.@�q˜!”fÑAùs   ƒ	�	éýÿÿÿéüÿÿÿc              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wr/   rD   ©rP   r-   Úname_to_nodes     €r2   rR   z solve_min_cut.<locals>.<genexpr>G  s   øè ø€ Ò2 ˆ�dÕ	Ñ2ùs   ƒc                 ó   •— ‰|    S r/   rD   )rœ   Únode_idxs    €r2   rT   zsolve_min_cut.<locals>.<lambda>G  s   ø€ À(È1Á+€ r4   rU   ):r   Úget_default_op_listr$   r|   r,   r%   r;  ÚnetworkxÚImportErrorr­   ÚfloatÚDiGraphr¦   rI   rG   rý  r£   r^  r_  rx   r½   r¼   r\   rs   rŠ   rƒ   r%  r   rŽ   rt   r   rê   rd   rB   rC   rf   rl   rY   rc   rW  rô  r¯   rm   r  r	  rë   r  Úminimum_cutÚ	ExceptionÚjoinÚ	readwriteÚedgelistÚgenerate_edgelistÚvisualize_min_cut_graphÚupdateÚget_name_to_noder]  rW   )1r“   rÃ  rÄ  rÅ  Újoint_module_opsÚops_ignoredÚnxÚerì  r÷  r   r-   Úis_non_tensor_nodeÚweightr  r  Ú	used_nodeÚordersÚfw_usersÚfirst_unfusible_useÚvisitedÚ
start_nodeÚfusibleÚstart_orderr+  rà  Ú	cut_valueÚ	partitionÚ	reachableÚcutsetÚnbrsÚ	cut_nodesÚnode_inÚnode_outÚ	node_namera  rÝ   rþ  r×  rÛ  r3   rï  rá  r  r  r  rÿ  rÞ  r  s1    ```                                 @@@@@@@@@@@@r2   Úsolve_min_cutr?  Á  só  ÿþ€ ð ÐÜ“<ˆÜ"Ó$€HåÜ%ñ &
à#×)Ñ)ô&
ó 
Ðð
 '¬ñ 4
Ø$×5Ñ5ô4
ó *
ñ 
ˆô 	�‰Ð9¸;ÔGòò"öAð&Ûöö0ôdFð¤ö ð2 �z‰z‹|€HÜ(2«€L÷ð* ×!Ñ!ó 3XˆØ�7‰7�hÒØà�9×.Ñ.Ñ.Ø˜9×+Ñ+Ñ+Ø×!Ñ! $§)¡)¨eÑ"3°VÄdÇhÁhÐ!ÔOØð ×Ñ˜dŸi™i¨&Ñ0°&Ä4Ç8Á8ÐÔLä˜$Ôð
 ×Ñ˜dŸi™i¨%Ñ/°Ä$Ç(Á(ÐÔKØä�dÔÔ2°4Ô8Ù(¨Ô.ð
 ×#Ñ# DÔ)Ñ.FÀtÔ.LÙ(¨Ô.ð ˜Ÿ™Ð"ÒE }¸D¿I¹IÐ'EòUà�t—y‘yÐ ÒS¬°D·I±I¸eÑ4DÄeÇlÁlÓ)SÐ%Sð 	ô �tÔÜœ=¨Ó.Ó/‰FÙä! $§)¡)§-¡-°Ó"6¼ÔF‘ÌDÏHÉHñ ñ % TÓ*ˆFà×Ñ˜$Ÿ)™) eÑ+¨T¯Y©Y¸Ñ-?È&ÐÔQØ—J‘Jò 	XˆDØ×Ñ˜dŸi™i¨&Ñ0°$·)±)¸eÑ2CÌdÏhÉhÐÕWò	Xðe3XðL¬$¬r¯w©w©-ð ÄCð ÌCö ð4 ×,Ó,Ø"×4Ñ4ó 	;ˆIð &ŸO™OöàØ×+Ñ+¨DÔ1ð ×&Ñ& tÕ,ðˆFð ð "+§¡öØ°I×4LÑ4LÈTÕ4R’ðˆHð ô �6‹{˜Q‹Ù&:¸8ÄSÈÃ[Ó&QÐ#Ü! )§/¡/Ó2ò ;�Dà!×0Ñ0°Õ6Ø%×2Ñ2°4Ó8Ð;NÓNÙ& y°$Õ7à <Ñ/Ø$ÜŸ™ØOØ%Ø%×2Ñ2°9Ó=Ø/Ø Ø%×2Ñ2°4Ó8ôñ 5°TÕ:ò!;ð	;ðP ×1Ó1Ü'1£|ˆØ%×+Ñ+ó !	VˆJØ×+Ñ+¨JÔ7Øà×'Ñ'¨
Ó3°ZÐ@ð2ˆGð $×0Ñ0°Ó<ˆKÜ�g“, Ó"ÜŸ™ wÓ/‘��3Ø˜'‘>ØØ—‘˜CÔ ð ×*Ñ*¨3Ó/°+ÀÑ2CÒCÜ˜G›¨Ò)ä—H‘HØ.ØØ"Ø!×.Ñ.¨sÓ3Ø!×.Ñ.¨zÓ:ôñ 1°Ô5ØàŸI™Iò V�Dà!×0Ñ0°Õ6Ù& s¨DÕ1Ø ¨Ò4äŸ™ w°×1GÑ1GÈÓ1MÈtÐ0TÕUðVô) �g“, Õ"ð!	VðFØ!Ÿ~™~¨h¸À&ÓIÑˆ	�9ð  )Ñ€Iˆ}Ü*4«,€FÛ8¨iÔ8ò B‰ˆˆ4Ø�‰ÔA dÔAÕAðBô ",£€IØ#ò !Ñˆ�Ø�s˜ˆ|˜x¨¨˜}Ò,Ð,Ð,Ø˜C˜R�Lˆ	Ø�‰�iÕ ð!ô
 $ KÓ0€Lä+4°[×5FÑ5FÓ+G×H™i˜c 4��c‘	ÓH€HÜÛ2¨	Ô2Ó8Mô€Lð ˜Ð%Ð%øôG
 ò ÜØOó
àð	ûðüò|ùò
øôR ò Ü�‰Ð@ÔAÜ�‰�—‘˜2Ÿ<™<×0Ñ0×BÑBÀ8ÓLÓMÔNÜ Ô)Øð	üó& Is=   Â[ Í7)[%Î0[*Ï[*×-[/ Ú]$Û	["Û[Û["Û/A2]!c                 óÆ  — dd l }dd l}|j                  j                  | «      j	                  «       }|j                  |«      d   }|j                  «       D ]c  }| |j                  «          |j                  «          d   }|j                  t        |«      «       |t        d«      k(  sŒS|j                  d«       Œe t        j                  d«       |j                  d«       y )Nr   rü  r_  Úredz2Visualizing the failed graph to min_cut_failed.svgzmin_cut_failed.svg)r  ÚpydotÚnx_pydotÚto_pydotÚ	to_stringÚgraph_from_dot_dataÚ	get_edgesÚ
get_sourceÚget_destinationÚ	set_labelrº   r  Ú	set_colorr%   r;  Ú	write_svg)rÿ  r*  rB  Ú
dot_formatÚ	dot_graphÚedger-  s          r2   r%  r%  L  s¼   € ÛÛà—‘×%Ñ% hÓ/×9Ñ9Ó;€JØ×)Ñ)¨*Ó5°aÑ8€IØ×#Ñ#Ó%ò "ˆØ˜$Ÿ/™/Ó+Ñ,¨T×-AÑ-AÓ-CÑDÀZÑPˆà�‰”s˜6“{Ô#à”U˜5“\Ó!Ø�N‰N˜5Õ!ð"ô ‡H�HÐAÔBØ×ÑÐ,Õ-r4   c                  ó4  — g t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j
                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                   ‘t         j"                  ‘t         j$                  ‘t         j&                  ‘t         j(                  ‘t         j*                  ‘t         j,                  ‘t         j.                  ‘t         j0                  ‘t         j2                  ‘t         j4                  ‘t         j6                  ‘t         j8                  ‘t         j:                  ‘t         j<                  ‘t         j>                  ‘t         j@                  ‘t         jB                  ‘t         jD                  ‘t         jF                  ‘t         jH                  ‘t         jJ                  ‘t         jL                  ‘t         jN                  ‘t         jP                  ‘t         jR                  ‘t         jT                  ‘t         jV                  ‘t         jX                  ‘t         jZ                  ‘t         j\                  ‘t         j^                  ‘t         j`                  ‘t         jb                  ‘t         jd                  ‘t         jf                  ‘t         jh                  ‘t         jj                  ‘t         jl                  ‘t         jn                  ‘t         jp                  ‘t         jr                  ‘t         jt                  ‘t         jv                  ‘t         jx                  ‘t         jz                  ‘t         j|                  ‘t         j~                  ‘t         j€                  ‘t         j‚                  ‘t         j„                  ‘t         j†                  ‘t         jˆ                  ‘t         jŠ                  ‘t         jŒ                  ‘tŽ        j�                  ‘t         j’                  ‘t         j”                  ‘t         j–                  ‘t         j˜                  ‘} t         j’                  t         j”                  t         jš                  g}|t         jœ                  t         jž                  t         j                   t¢        j¤                  t         j¦                  t         j¨                  t         jª                  t         j¬                  gz  }|}| g t¢        j                  ‘t¢        j®                  ‘t         j°                  ‘t         j˜                  ‘t         j²                  ‘t¢        j´                  ‘t¢        j€                  ‘t         j´                  ‘t         j¶                  ‘t¢        j¤                  ‘t         j¬                  ‘t         j¸                  ‘t         jœ                  ‘t         j¦                  ‘t         jž                  ‘t         jº                  ‘t         j¼                  ‘t         j¾                  ‘t         jÀ                  ‘t         jÂ                  ‘t         jÄ                  ‘t         jÆ                  ‘t         jÈ                  ‘t         jÊ                  ‘t         jÌ                  ‘t         jÎ                  ‘t         jÐ                  ‘t         j¨                  ‘t         jÒ                  ‘t         jÔ                  ‘t         jÖ                  ‘t         jØ                  ‘t         jÚ                  ‘t¢        jÜ                  ‘t¢        jÞ                  ‘z  } | t         jà                  t         jâ                  gz  } | |z  } | tå        «       z  } | t         jæ                  gz  } | tè        D �cg c]  }të        |«      ‘Œ c}z  } tí        | «      }tí        t         jî                  t         jð                  t         jò                  g«      }t         jô                  t         jö                  t         jø                  t         jú                  t         jü                  t         jþ                  t         �j                   t         �j                  t         �j                  t         �j                  t         �j                  g}||z  }�t        |tí        |«      |tí        |«      |«      S c c}w r/   )†r1  rë   ÚsubÚdivÚatan2Úmulrô  rõ  ÚpowÚ	remainderÚfmodÚ__and__Ú__or__Ú__xor__Ú
__lshift__Ú
__rshift__ÚeqÚneÚgeÚgtÚleÚltÚabsÚbitwise_notÚceilÚfloorÚfracÚnegÚreluÚroundÚsiluÚtruncr%   Úlog10Úlog1pÚlog2ÚlgammaÚexpÚexpm1ÚerfÚerfcÚcosÚacosÚcoshÚsinÚasinÚsinhÚtanÚatanÚtanhÚatanhÚsqrtÚrsqrtÚ
reciprocalÚsigmoidÚsoftplusÚ	thresholdÚthreshold_backwardÚclampÚwhereÚlerpÚaddcmulÚgeluÚgelu_backwardr-  ÚmeanÚ_grad_sum_to_sizeÚsum_to_sizeÚamaxÚtoÚtype_asr
  r  ÚsqueezeÚ	unsqueezeÚrsubÚ_to_copyÚaliasÚviewÚsliceÚtÚprimsÚbroadcast_in_dimÚexpandÚ
as_stridedÚpermuteÚselectÚconvert_element_typeÚcloneÚ	full_likeÚvarÚstdÚ_unsafe_viewÚreshapeÚbroadcast_tensorsÚscalar_tensorÚonesÚ	new_zerosrå  ÚarangeÚtriuÚvar_meanÚisinfr«   ÚfullÚzerosÚemptyÚ
empty_likeÚargmaxÚmaximumÚiotaÚ)_low_memory_max_pool2d_offsets_to_indicesrt  ÚgatherrI  Ú
zeros_liker   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_mmr'   )Údefault_recomputable_opsÚrecomputable_view_opsr+   Úmr,   r*   r)   r(   s           r2   r  r  ]  sx  € ðL0Ü�‰ðL0ä�‰ðL0ô 	�‰ðL0ô 	�
‰
ð	L0ô
 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�	‰	ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô  	�‰ð!L0ô" 	�‰ð#L0ô$ 	�‰ð%L0ô& 	�‰ð'L0ô( 	�‰ð)L0ô* 	�‰ð+L0ô, 	�‰ð-L0ô. 	×Ñð/L0ô0 	�	‰	ð1L0ô2 	�
‰
ð3L0ô4 	�	‰	ð5L0ô6 	�‰ð7L0ô8 	�	‰	ð9L0ô: 	�
‰
ð;L0ô< 	�	‰	ð=L0ô> 	�
‰
ð?L0ô@ 	�‰ðAL0ôB 	�
‰
ðCL0ôD 	�
‰
ðEL0ôF 	�	‰	ðGL0ôH 	�‰ðIL0ôJ 	�‰ðKL0ôL 	�
‰
ðML0ôN 	�‰ðOL0ôP 	�	‰	ðQL0ôR 	�‰ðSL0ôT 	�	‰	ðUL0ôV 	�	‰	ðWL0ôX 	�‰ðYL0ôZ 	�	‰	ð[L0ô\ 	�	‰	ð]L0ô^ 	�‰ð_L0ô` 	�	‰	ðaL0ôb 	�	‰	ðcL0ôd 	�
‰
ðeL0ôf 	�	‰	ðgL0ôh 	�
‰
ðiL0ôj 	�‰ðkL0ôl 	�‰ðmL0ôn 	�‰ðoL0ôp 	�‰ðqL0ôr 	×ÑðsL0ôt 	�
‰
ðuL0ôv 	�
‰
ðwL0ôx 	�	‰	ðyL0ôz 	�‰ð{L0ô| 	�	‰	ð}L0ô~ 	×ÑðL0ô@ 	�‰ðAL0ôB 	�	‰	ðCL0ôD 	×ÑðEL0ôF 	×ÑðGL0ôH 	�	‰	ðIL0ôJ 	�‰ðKL0ôL 	�‰ðML0ôN 	×ÑðOL0ôP 	�‰ðQL0ôR 	�‰ðSL0ôT 	�	‰	ðUL0ôV 	�‰ðWL0ÐôZ "Ÿ\™\¬4¯>©>¼4¿:¹:ÐFÐØÜ�	‰	Ü�
‰
Ü�‰Ü×ÑÜ�‰Ü�‰Ü�‰Ü�‰ð	ñ 	Ðð %€HØð $!Ü�	‰	ð$!ä×"Ñ"ð$!ô 	�
‰
ð$!ô 	�‰ð	$!ô
 	�‰ð$!ô 	�	‰	ð$!ô 	�	‰	ð$!ô 	�‰ð$!ô 	�‰ð$!ô 	×Ñð$!ô 	�‰ð$!ô 	×Ñð$!ô 	�	‰	ð$!ô 	�‰ð$!ô 	�
‰
ð$!ô  	�‰ð!$!ô" 	×Ñð#$!ô$ 	×Ñð%$!ô& 	�	‰	ð'$!ô( 	�‰ð)$!ô* 	×Ñð+$!ô, 	�‰ð-$!ô. 	�	‰	ð/$!ô0 	�‰ð1$!ô2 	�
‰
ð3$!ô4 	�‰ð5$!ô6 	�	‰	ð7$!ô8 	�‰ð9$!ô: 	�
‰
ð;$!ô< 	�
‰
ð=$!ô> 	�‰ð?$!ô@ 	�‰ðA$!ôB 	�‰ðC$!ôD 	�
‰
ðE$!ôF 	×7Ñ7ðG$!ñ $ÐðL ¤§¡¬T¯[©[Ð 9Ñ9ÐØ Ñ(Ðà¤£Ñ/ÐàÜ�‰ð!ñ Ðð ÄÖ N¸1Ô!3°AÕ!6Ò NÑNÐÜ!Ð":Ó;ÐäœT×0Ñ0´$·.±.Ä$Ç/Á/ÐRÓS€Jä�‰Ü×ÑÜ×!Ñ!Ü�‰Ü�
‰
Ü×0Ñ0Ü×4Ò4Ü×%Ò%Ü×)Ò)Ü× Ò Ü�ŠðÐð # ZÑ/€KÝØÜÐ(Ó)ØÜ�8ÓØóð ùò' !Os   ß(dc                 óJ   — i }| j                   D ]  }|||j                  <   Œ |S r/   )r|   r£   )r{   r  r-   s      r2   r'  r'    s.   € Ø€LØ—‘ò 'ˆØ"&ˆ�T—Y‘YÒð'àÐr4   ÚmemoryÚruntimesÚ
max_memoryÚall_recomputable_banned_nodesc                 ó¦  — t         j                  }|dk(  rt        |||«      S |dk(  rt        |||«      S |dk(  rt	        |||«      S |dk(  rZt
        j                  d«       t        j                  | |||¬«      }t	        ||t        |¬«      j                  t        |¬«      «      S t        |«      r ||| |||«      \  }}	d	||	fS t        d
|› �«      ‚)NÚgreedyÚilpÚdpÚ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“   rÎ  Ú recorded_knapsack_input_memoriesÚ recorded_knapsack_input_runtimes)Úgraph_info_provider)Úknapsack_algoÚmax_mem_budgetr  z,Not aware of memory budget knapsack solver: )r   Úactivation_memory_budget_solverr   r   r   r%   Úwarningr   Úinialize_from_graphr   Úget_knee_point_memory_budgetÚcallabler­   )
r“   rË  rÌ  rÍ  rÃ  rÎ  ÚSOLVERrÖ  Úsaved_node_idxÚrecomp_node_idxs
             r2   Ú#_optimize_runtime_with_given_memoryrá  	  s  € ô ×3Ñ3€FØ�ÒÜ˜v x°Ó<Ð<Ø	�5ŠÜ˜F H¨jÓ9Ð9Ø	�4ŠÜ˜6 8¨ZÓ8Ð8Ø	Ð-Ò	-Ü�‰ð?ô	
ô
 0×CÑCØ#Ø*GØ-3Ø-5ô	
Ðô ØØÜØ$7ôç*Ñ*Ü)Ø)ð +ó ó	
ð 		
ô 
�&Ô	Ù*0Ø�K ¨YÐ8Uó+
Ñ'ˆ˜ð �^ _Ð5Ð5äÐIÈ&ÈÐRÓSÐSr4   ©Úno_dispatchrœ   r$  c                 óâ   ‡— t        | j                  «      }ˆfd„}|D �cg c]
  } ||«      ‘Œ }}| j                  «       D �cg c]
  } ||«      ‘Œ }}| j                  ||¬«      S c c}w c c}w )Nc                 ó   •— t        | ‰¬«      S )Nr#  )r   )Údr$  s    €r2   Úrealize_symbolz8_remove_symbols_without_guarding.<locals>.realize_symbol>  s   ø€ Ü˜ HÔ-Ð-r4   )Ústride)rd   Úshaperè  Únew_empty_strided)rœ   r$  ré  rç  rç   rè  s    `    r2   Ú _remove_symbols_without_guardingrë  ;  sk   ø€ Ü�—‘‹M€Eô.ð ).Ö. 1‰^˜AÕÐ.€EÐ.Ø)*¯©«Ö4 A‰n˜QÕÐ4€FÐ4Ø×Ñ˜u¨VÐÓ4Ð4ùò /ùÚ4s    A'ÁA,c                 óF  ‡ ‡‡	— t         j                  }d„ }|dk(  ry|dk(  rat        «       5  ddlm} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	|j                  ˆˆ	ˆ fd„«      }|cd d d «       S |dk(  rudd	l
m} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	 |d
¬«      5 } ‰ j                  ‰i ‰	¤Ž d d d «       j                  «       }t        |d«      S t        d|› �«      ‚# 1 sw Y   y xY w# 1 sw Y   Œ?xY w)Nc                 óz  — t        | t        j                  «      rAt        | j                  d   t        j
                  «      rt        | j                  d   d¬«      S t        | t        j                  «      rAt        | j                  d   t        j                  «      rt        | j                  d   d¬«      S t        | t        j                  «      r(t        | j                  d   t        j                  «      ryt        | t        j                  «      r(t        | j                  d   t        j                  «      ry| S )Nrˆ   r"  r#  ç      ð?T)rŠ   rB   rC   rs   rƒ   r%  rë  r‹   r   r�   rŒ   r&  s    r2   Úmaterialize_argz)estimate_runtime.<locals>.materialize_argI  sÃ   € Ü�aœŸ™Ô!¤j°·±¸±ÄÇÁÔ&MÜ3°A·F±F¸5±MÈDÔQÐQÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç,Á,Ô(OÜ˜AŸF™F 5™M°DÔ9Ð9Ü˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç.Á.Ô(QØÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç-Á-Ô(PØàˆHr4   Útestingr   Úprofiler   )Úbenchmarkerc                  ó(   •—  ‰j                   ‰ i ‰¤ŽS r/   )r‚   )r©   rª   r-   s   €€€r2   rT   z"estimate_runtime.<locals>.<lambda>]  s   ø€ °;°4·;±;ÀÐ3OÈÑ3O€ r4   Úflops)ÚFlopCounterModeF)Údisplayz Not aware of runtime estimator: )r   Ú*activation_memory_budget_runtime_estimatorrã  Ú$torch._inductor.runtime.benchmarkingrò  r§   Útree_mapr©   rª   Úbenchmark_gpuÚtorch.utils.flop_counterrõ  r‚   Úget_total_flopsrô  r­   )
r-   ÚRUNTIME_MODErï  rò  Úmsrõ  ÚmodeÚcounted_flopsr©   rª   s
   `       @@r2   Úestimate_runtimer  F  s  ú€ Ü×DÑD€Lò
ð �yÒ Øà	˜Ò	"Ü‹]ñ 	ÝHä!Ÿ?™?¨?¸T¿Y¹YÈÏÉÐ<TÓU‰LˆD�&Ø×*Ñ*Õ+OÓPˆBØ÷	ñ 	ð 
˜Ò	 å<ä—‘ ¸¿¹ÀDÇKÁKÐ8PÓQ‰ˆˆfÙ UÔ+ð 	)¨tØˆD�K‰K˜Ð( Ò(÷	)à×,Ñ,Ó.ˆÜ�= !Ó$Ð$äÐ=¸l¸^ÐLÓMÐM÷#	ð 	ú÷	)ð 	)ús   ¬ADÃDÄDÄD c                 ó²
  ‡ ‡‡‡‡ ‡!‡"‡#‡$‡%‡&‡'‡(‡)— |dkD  s|dk  rt        d|› �«      ‚t        t        j                  t        j                  t        j
                  t        j                  t        j                  ¬«      }t        j                  rt        |dddd¬«      }|dk(  r‰j                  S t        ‰ ‰|«      \  }}|dk(  r|S dt        t        j                     dt        fd	„Š  ‰ ‰j                  «      Š' ‰ |«      Š%‰%‰'k  r|S ˆ%ˆ'fd
„}dt        t        j                     fˆ ˆ%ˆ'fd„Š!t        |ddd¬«      }t        ‰ ‰|«      \  }} ‰!|«      |k  r|S t        |d¬«      Št        ‰ ‰‰«      \  }	}
 ‰!|	«      |k  r|	S ddlmŠ" t%        ˆ"fd„‰j                  D «       «      Š$dt$        t        j                     dt        t        j                     fˆ"ˆ$fd„} ||
«      }t'        |d„ ¬«      }t'        |t(        d¬«      Št+        ‰«      dk(  r‰j                  S ‰D �cg c]  } |t)        |«      «      ‘Œ c}Š&‰D �cg c]  }t-        |«      ‘Œ c}Š)ddlmŠ( ˆˆˆ&ˆ(ˆ)fd„Š#t        j2                  �rÂˆ!ˆ#ˆ ˆˆ)fd„} |d«       |d«      g}|d   dd  |d   dd  k7  r¤|d   |d   fg}|r—|j5                  «       \  }}|d   |d   z
  dk  r#|j7                  |«       |j7                  |«       ŒF ||d   |d   z   dz  «      }|dd  |dd  k7  r|j7                  ||f«       |dd  |dd  k7  r|j7                  ||f«       |rŒ—|j9                  «        dd lm} |D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }}|j?                  d¬«       |jA                  ||d ¬!«       tC        |«      D ]"  \  }}|jE                  |d"›|||   fd#d$d%¬&«       Œ$ |jG                  d'«       |jI                  d(«       |jK                  d)«       |jM                  d«       |jO                  «       }|jQ                  «        tS        jT                  «       }t        jV                  �'t        jV                  }tS        jX                  |d¬*«       d+}tZ        j\                  j_                  «       r?tZ        j\                  ja                  «       r!d,tZ        j\                  jc                  «       › �}tR        jd                  jg                  |d-|› d.ti        «       › d/�«      }|jk                  |«       tl        jo                  d0|«        ‰#|‰‰ ¬1«      d   S c c}w c c}w c c}w c c}w )2Nr   r   zJThe valid ranges for memory budget are 0 <= m <= 1. The provided value is )rl   rm   rn   ro   rp   F)rl   rm   rn   ro   rÝ   rL   c                 ó:   — t        t        t        | «      «      dz  S ©Nç    eÍÍA)r-  Úmapr4  )rÝ   s    r2   Úestimate_activations_sizez:choose_saved_values_set.<locals>.estimate_activations_size’  s   € Ü”3”x Ó.Ó/°#Ñ5Ð5r4   c                 ó   •— | dz  ‰‰z
  z  S r  rD   )ÚszÚmax_act_sizeÚmin_act_sizes    €€r2   Úget_normalized_sizez4choose_saved_values_set.<locals>.get_normalized_size›  s   ø€ Ø�S‘˜\¨LÑ8Ñ9Ð9r4   Úactivationsc                 ó&   •—  ‰| «      ‰z
  ‰‰z
  z  S r/   rD   )r  r  r
  r  s    €€€r2   Úget_mem_ratioz.choose_saved_values_set.<locals>.get_mem_ratiož  s"   ø€ Ù)¨+Ó6¸ÑEØ˜<Ñ'ñ
ð 	
r4   )rl   rm   rn   )ro   )Úget_node_storagec              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr/   rD   )rP   r-   r  s     €r2   rR   z*choose_saved_values_set.<locals>.<genexpr>¼  s   øè ø€ ÒT¸4Ñ 0°× 6ÑTùr)  rþ  c                 ór   •— | D �cg c]&  }|j                   t        d«      k  r ‰|«      ‰vr|‘Œ( c}S c c}w r  )rè  rf   )rþ  rË  r  Úinput_storagess     €€r2   Úget_recomputable_banned_nodesz>choose_saved_values_set.<locals>.get_recomputable_banned_nodes¾  sD   ø€ ð
 "ö
àð —‘¤ S£Ò)Ù$ QÓ'¨~Ñ=ò ò
ð 	
ùò 
s   †+4c                 ó   — | j                   S r/   ræ   r&  s    r2   rT   z)choose_saved_values_set.<locals>.<lambda>Í  s   € ÐPQ×PVÑPV€ r4   rU   Tr8  râ  c           
      ód  •—  ‰«       5  t        |‰‰t        | d«      |‰«      \  }}}d d d «       t        «       }D ]  }	 |j                  ‰|   «       Œ |j                  ‰«      sJ ‚t        ||‰
|«      \  }}	t        rt        |‰|‰‰|¬«       |fS # 1 sw Y   ŒpxY w# t        $ r Y Œrw xY w)Nr   )r“   rÎ  Úsaved_node_idxsÚrecomputable_node_idxsÚexpected_runtimeÚmemories_banned_nodesÚruntimes_banned_nodesÚmin_cut_saved_values)	rá  rô  r   rë   ÚBaseExceptionÚissubsetr?  r$   r   )Úmemory_budgetrÃ  r“   r  r  r  rÅ  ra  rÝ   r+  Úaggressive_optionsrÎ  r  rã  r  s             €€€€€r2   Úget_saved_values_knapsackz:choose_saved_values_set.<locals>.get_saved_values_knapsackà  sõ   ø€ Ù‹]ñ 	ô
 4ØØ%Ø%Ü�M 1Ó%ØØ-óñ	Ø ØØ&÷		ô )3«ˆØ)ò 	ˆCðØ—‘Ð:¸3Ñ?Õ@ð	ð × Ñ Ð!>Ô?Ð?Ð?ä'ØØØØó	
‰ˆ�aõ !Ü4Ø'Ø.KØ /Ø'=Ø!1Ø&;Ø&;Ø%1õ	ð Ð-Ð-Ð-÷Q	ð 	ûô$ !ò Ùðús   ‰BÁ B#ÂB Â#	B/Â.B/c                 óN   •—  ‰| ‰‰¬«      \  }}| t        ‰«      |z
   ‰|«      fS )N)rÃ  r“   )r-  )rÔ  rÝ   r  r  r!  r“   rÃ  r  s      €€€€€r2   Úestimate_for_budgetz4choose_saved_values_set.<locals>.estimate_for_budget  s@   ø€ Ù-FØ˜Y°Kô.Ñ*ˆLÐ*ð ÜÐ)Ó*Ð-=Ñ=Ù˜lÓ+ðð r4   r  rî  gü©ñÒMbP?rò  )é
   é   )ÚfigsizeÚo)Úmarkerz.4fzoffset points)r   r$  Úcenter)Ú
textcoordsÚxytextÚhazMemory Budgetz Runtime of Recomputed Componentsz:Pareto Frontier of Memory Budget vs. Recomputation Runtime)Úexist_okÚ Ú_rank_Úmemory_budget_paretor+  z.svgz%Generated Pareto frontier curve at %s)r  rÃ  r“   )8r­   rk   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   rG   r?  rd   rB   rC   r  Útorch._inductor.fx_utilsr  r   rW   r4  rW  r  Útorch.utils._mode_utilsrã  Úvisualize_memory_budget_paretorX  r®   ÚsortÚmatplotlib.pyplotÚpyplotÚfigureÚplotr]  ÚannotateÚxlabelÚylabelÚtitleÚgridÚgcfÚshowÚosÚgetcwdÚmemory_budget_pareto_dirÚmakedirsrƒ   ÚdistributedÚis_availableÚis_initializedÚget_rankÚpathr!  r   Úsavefigr%   rÚ  )*r“   rÃ  r  rÄ  Úruntime_optimized_saved_valuesr+  r  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesrþ  r  Úrecomputable_banned_nodesrË  r-   r#  ÚoptionsÚbisectsÚlhsÚrhsÚmidÚpltÚitemÚx_valuesÚy_valuesÚtxtÚfigÚfig_dirÚrank_suffixÚfig_namer   rÎ  r  r  r  r!  r  r
  r  r  rã  r  s*   ``                            @@@@@@@@@@@@r2   Úchoose_saved_values_setrc  m  so  ÿý€ ð
 �qÒ˜M¨AÒ-ÜØXÐYfÐXgÐhó
ð 	
ô $Ü$×AÑAÜ#)×#KÑ#KÜ%+×%OÑ%OÜ &× EÑ EÜ×8Ñ8ô€Oô ×&Ò&Ü!ØØ"'Ø',Ø).Ø$)ô
ˆð ˜ÒØ×ÑÐä(5ØØØó)Ñ%Ð" Að ˜ÒØ-Ð-ð6´´R·W±W±ð 6Ä%ó 6ñ -¨Y×-=Ñ-=Ó>€LÙ,Ð-KÓL€Là�|Ò#Ø-Ð-õ:ð
¤4¬¯©¡=÷ 
ô
 &ØØ#Ø#(Ø%*ô	Ðô '4Ø�YÐ 7ó'Ñ#Ð  !ñ Ð1Ó2°]ÒBØ+Ð+ä ØØ %ôÐô ;HØ�YÐ 2ó;Ñ7Ð)¨<ñ Ð:Ó;¸mÒKØ4Ð4å9äÓTÀ9×CSÑCSÔTÓT€Nð
Ü ¤§¡Ñ)ð
ä	Œb�g‰g‰ö
ñ !>¸lÓ KÐä &Ð'@ÑFVÔ WÐô %+Ø!¤x¸ô%Ð!ô Ð(Ó)¨QÒ.Ø×ÑÐà2OöØ-.ÑœH Q›KÕ(òÐð ,IöØ#'Ô˜ÕòÐõ 4÷).ð ).ôV ×,Ó,÷	ð 	ñ ' sÓ+Ñ-@ÀÓ-EÐFˆà�1‰:�a�bˆ>˜W Q™Z¨¨˜^Ò+Ø ™
 G¨A¡JÐ/Ð0ˆGÙØ"Ÿ;™;›=‘��SØ�q‘6˜C ™F‘? TÒ)Ø—N‘N 3Ô'Ø—N‘N 3Ô'ØÙ)¨3¨q©6°C¸±F©?¸aÑ*?Ó@�Ø�q�r�7˜c ! "˜gÒ%Ø—N‘N C¨ :Ô.Ø�q�r�7˜c ! "˜gÒ%Ø—N‘N C¨ :Ô.ò ð 	�‰Œå'à(/Ö0 �D˜“GÐ0ˆÐ0Ø(/Ö0 �D˜“GÐ0ˆÐ0ð 	�
‰
˜7ˆ
Ô#Ø�‰�˜8¨CˆÔ0ô   Ó)ò 	‰FˆAˆsØ�L‰LØ�s�)Ø�h˜q‘kÐ"Ø*ØØð õ ð	ð 	�
‰
�?Ô#Ø�
‰
Ð5Ô6Ø�	‰	ÐNÔOØ�‰�ŒØ�g‰g‹iˆØ�‰Œ
Ü—)‘)“+ˆÜ×*Ñ*Ð6Ü×5Ñ5ˆGÜ�K‰K˜¨$Õ/ØˆÜ×Ñ×)Ñ)Ô+´×0AÑ0A×0PÑ0PÔ0RØ"¤5×#4Ñ#4×#=Ñ#=Ó#?Ð"@ÐAˆKÜ—7‘7—<‘<ØÐ+¨K¨=¸Ô:LÓ:NÐ9OÈtÐTó
ˆð 	�‰�HÔÜ�‰Ð;¸XÔFñ %Ø#¨yÀkôàñ	ð 	ùòyùòùò^ 1ùÚ0s   È!UÉ U
ÍUÍ/Uc          	      óÊ  ‡— | j                   j                  «        | j                  «        | j                   }t        j                  rt        |«      }|| _         | j                   }t        | «      }t        | «      }|rt        | «      } ˆfd„}	 |	| «      }
t        |
j                  «      dk(  rt        | |‰¬«      S t        | j                   j                  «      D ]„  }|j                  dk(  rt        d«      |_        Œ#|
j#                  |«      sd|_        Œ<t        d«      |_        |j$                  D ]*  }t'        |j                   |j                   dz   «      |_        Œ, Œ† t        j(                  }|j                  D ]=  }t+        |j,                  j/                  dd«      t0        «      sŒ.|j,                  d   } n t3        ||
|¬	«      }t5        t7        t8        |«      «      }t5        t7        d
„ |«      «      }t;        | ||‰¬«      \  }}|r|rt=        | ||t        |«      «      \  }}t?        |«      }t@        �rŸtC        |D �cg c]  }tE        |«      tG        |«      f‘Œ c}«      }tI        d„ |D «       «      dz  }tJ        jM                  d|«       tJ        jM                  d|«       tO        d„ |j                   j                  D «       «      }tO        d„ |j                   j                  D «       «      }||z  }tQ        t        «      }|j                   j                  D ]R  }|jR                  |v sŒtU        |jV                  d«      sŒ)|tG        |jV                  jX                  «      xx   dz  cc<   ŒT tJ        jM                  dt        |«      t        |«      t        |«      «       tC        |j[                  «       d„ d¬«      }tJ        jM                  d|«       ||fS c c}w )ax  
    Partitions the joint graph such that the backward recomputes the forward.
    Recomputing helps in trading off memory bandwidth with computation.

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

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

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

    Returns:
        Returns the generated forward and backward Fx graph modules.
    c                 óš  •‡‡‡— t        | j                  «      Št        «       Š| j                  j                  D ]m  }|j                  dk(  r d|j
                  v r‰j                  |«       nt        |«      r‰j                  |«       |‰v sŒS‰j                  |j                  «       Œo t        t        t        | j                  j                  «      «      }t        t        t        | j                  j                  «      «      }||z   }t        | ‰¬«      \  }}‰j                  d„ |D «       «       t        | j                  ||d«      }t        ˆfd„|j                  D «       «      Št        ˆˆfd„| j                  j                  D «       «      }d}	i }
| j                  j                  D ]  }|‰v sŒ|	|
|<   |	d	z  }	Œ t!        |‰‰||
«      S )
Nr˜   r¹   rä   c              3   óF   K  — | ]  }|€Œ|j                   dk7  sŒ|–— Œ y ­w)Nr¡   r×   )rP   r'  s     r2   rR   zNmin_cut_rematerialization_partition.<locals>.classify_nodes.<locals>.<genexpr>ž  s$   è ø€ ò !
Ø a¡m¸¿¹ÀÓ8HŒAñ!
ùs   ‚!Š!š!rè   c              3   óZ   •K  — | ]"  }|j                   d k7  r‰|j                     –— Œ$ y­wr  r  r  s     €r2   rR   zNmin_cut_rematerialization_partition.<locals>.classify_nodes.<locals>.<genexpr>¤  s.   øè ø€ ò <
àØ�w‰w˜(Ò"ð ˜Ÿ™Õ#ñ<
ùs   ƒ(+c              3   ó2   •K  — | ]  }|‰vr|‰vr|–— Œ y ­wr/   rD   )rP   r-   rI   rY   s     €€r2   rR   zNmin_cut_rematerialization_partition.<locals>.classify_nodes.<locals>.<genexpr>©  s*   øè ø€ ò :
àØÐ,Ñ,°Ð=NÑ1Nô ñ:
ùs   ƒr   r   )r'  r{   r   r|   r¦   r‚   rë   r¤   r&  rê   rd   ré   r½   r¼   rÜ   r¶   rF   )rÓ   r-   ró   rõ   rG   rÚ   rÛ   r  rJ   Úfw_cntrK   r  rI   rY   rÙ   s              @@@€r2   Úclassify_nodesz;min_cut_rematerialization_partition.<locals>.classify_nodesŠ  sË  û€ Ü'¨×(:Ñ(:Ó;ˆÜ1;³ÐØ ×&Ñ&×,Ñ,ò 	5ˆDØ�w‰w˜-Ò'¨J¸$¿+¹+Ñ,EØ!×%Ñ% dÕ+Ü% dÔ+Ø!×%Ñ% dÔ+àÐ(Ò(Ø!×(Ñ(¨¯©Õ4ð	5ô œV¤J°×0BÑ0B×0HÑ0HÓIÓJˆÜ!%ÜÔ&¨×(:Ñ(:×(@Ñ(@ÓAó"
Ðð Ð!7Ñ7ˆÜ#;Ø¨/ô$
Ñ ˆ�[ð 	× Ñ ñ !
Ø"ô!
ô 	
ô @Ø×Ñ ¨°Yó
Ðô 2<ó <
à*×0Ñ0ô<
ó 2
Ðô
 0:ô :
à$×*Ñ*×0Ñ0ô:
ó 0
ˆð
 ˆØˆØ ×&Ñ&×,Ñ,ò 	ˆDØÐ(Ò(Ø!'�˜‘Ø˜!‘‘ð	ô ØÐ%Ð'8¸/È8ó
ð 	
r4   r   rä   r¡   r  r   r  N)r  c                 ó   — t        | «       S r/   r  )rQ   s    r2   rT   z5min_cut_rematerialization_partition.<locals>.<lambda>Ø  s   € ¬[¸«^Ð);€ r4   r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr/   )r4  rÊ  s     r2   rR   z6min_cut_rematerialization_partition.<locals>.<genexpr>í  s   è ø€ Ò'J¸¬°¯Ñ'Jùr  z'Theoretical Activations Stored: %.2f GBz,Theoretical Per Activation Storage Sizes: %sc              3   óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­w©r™   Nr  rÖ   s     r2   rR   z6min_cut_rematerialization_partition.<locals>.<genexpr>ò  ó$   è ø€ ò %
Ø¸4¿7¹7ÀoÓ;UˆD�I�Iñ%
ùr  c              3   óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­wrn  r  rÖ   s     r2   rR   z6min_cut_rematerialization_partition.<locals>.<genexpr>õ  ro  r  rÈ  z# remat/fw/bw: %d/%d/%dc                 ó   — | d   S r7  rD   r&  s    r2   rT   z5min_cut_rematerialization_partition.<locals>.<lambda>  s
   € À!ÀAÁ$€ r4   Tr8  zCount of Ops Rematerialized: %s).r{   r°   r¨  r   Úcser"   r~   r†   rÂ  rW  rI   r  rŸ  r|   r¦   rf   rè  r\   rê   rõ  Úactivation_memory_budgetrŠ   rs   rt   r  rc  rd   ré   r   r  r¼  rf  r$   rW   r4  rº   r-  r%   r;  r   r   r£   r�   r‚   rÈ  r.  )rÓ   r  ÚcompilerrÙ   ry   Ú	cse_graphr“   Úgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsrj  rÃ  r-   r  r  rÝ   râ   rg  rh  rË  Úsorted_sizesÚtotal_activations_size_gbÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountsÚrematerialized_opss      `                      r2   r  r  Y  s†  ø€ ðB ×Ñ×*Ñ*Ô,Ø×ÑÔà×Ñ€Dô ‡z‚zÜ  Ó&ˆ	Ø&ˆÔØ×$Ñ$€Kä!5°lÓ!CÐÜ%=¸lÓ%KÐ"Ù!Ü-¨lÓ;ˆô,
ñ\ ˜|Ó,€Iô
 ˆ9×&Ñ&Ó'¨1Ò,Ü Ø˜-¸ô
ð 	
ô ˜×+Ñ+×1Ñ1Ó2ò RˆØ�7‰7�hÒÜ # C£ˆDÕØ×)Ñ)¨$Ô/Ø !ˆDÕä # C£ˆDÔØŸ
™
ò R�Ü$'¨×(9Ñ(9¸4×;LÑ;LÈqÑ;PÓ$Q�Õ!ñRðRô ×3Ñ3€MØ×!Ñ!ò ˆÜ�d—i‘i—m‘m O°TÓ:¼EÕBØ ŸI™I oÑ6ˆMÙðô +ØØØ#ô€Lô œ6¤+¨|Ó<Ó=€OÜœÑ;¸\ÓJÓK€Lô 4ØØØ'Ø'ô	Ñ€Iˆyñ "Ù)Ü#8Ø˜i¨´C¸Ó4Hó$Ñ ˆI�yô 4°IÓ>€Iæä¸lÖK¸¤¨£¬S°«VÒ4ÒKÓLˆô %(Ñ'J¸\Ô'JÓ$JÈSÑ$PÐ!Ü�‰Ð:Ð<UÔVô 	�‰Ð?ÀÔNÜ$ñ %
Ø"+§/¡/×"7Ñ"7ô%
ó 
ˆô %ñ %
Ø"+§/¡/×"7Ñ"7ô%
ó 
ˆð &¨Ñ7ˆä!,¬SÓ!1ˆØ—O‘O×)Ñ)ò 	>ˆDØ�y‰y˜KÒ'¬G°D·K±KÐARÕ,SØ”s˜4Ÿ;™;×6Ñ6Ó7Ó8¸AÑ=Ô8ð	>ô 	�‰Ø%Ü�ÓÜ�Ó Ü�Ó ô		
ô $ F§L¡L£N¹ÐPTÔUÐÜ�‰Ð2Ð4FÔGØ�iÐÐùò9 Ls   ÉO ÚtracedÚfnameÚfignameÚ
clear_metaÚprogÚparse_stack_traceÚdot_graph_shapec                 ó  — |rWt        j                  | j                  «      }t        j                  | |«      } | j                  j
                  D ]	  }i |_        Œ t        j                  j                  |«      \  }	}
|
sdt        j                  z   }
t        j                  d|	|
«       t        j                  | |||¬«      }|j!                  «       }t#        |d|
j%                  d«      z   «      }|	› |
› �}|€	 ||«       y  |||¬«       y )Nú.zWriting FX graph to file: %s%s)r„  r…  Úwrite_)rƒ  )ÚcopyÚdeepcopyr{   rB   r`  r|   rs   rF  rN  Úsplitextr   Útorch_compile_graph_formatr%   r;  r   ÚFxGraphDrawerÚget_main_dot_graphr@  Úlstrip)r  r€  r�  r‚  rƒ  r„  r…  r²   r-   ÚbaseÚextÚgrœ   Úwrite_methods                 r2   Ú
draw_graphr”  	  sî   € ñ Ü—M‘M &§,¡,Ó/ˆ	Ü—‘ ¨	Ó2ˆØ—L‘L×&Ñ&ò 	ˆDØˆD�Ið	ä—‘× Ñ  Ó'�I€Dˆ#ÙØ”F×5Ñ5Ñ5ˆÜ‡H�HÐ-¨t°SÔ9Ü×"Ñ"ØØØ+Ø'ô		€Að 	
×ÑÓ€AÜ˜1˜h¨¯©°C«Ñ8Ó9€LØˆf�S�EˆN€EØ€|Ù�UÕá�U Ö&r4   r/   )r   )Úinductor)Úfx_graphTNFN)‡r‰  rg   r  rì   Úloggingr^  r
  rF  Úos.pathr:  r   Údataclassesr   r   Útypingr   r   r	   r
   rƒ   Útorch._inductor.inductor_primsÚtorch.distributedÚtorch.fxrB   Útorch.utils._pytreeÚutilsÚ_pytreer§   Ú;torch._functorch._activation_checkpointing.ac_logging_utilsr   Ú%torch.fx.experimental._backward_stater   Ú"torch.fx.experimental.proxy_tensorr   r   Útorch.fx.experimental.sym_noder   r   Ú%torch.fx.experimental.symbolic_shapesr   r   r   r   Útorch.fx.passesr   Útorch.utils._ordered_setr   Útorch.utils.checkpointr   r.  r   Ú-_activation_checkpointing.graph_info_providerr   Ú"_activation_checkpointing.knapsackr   r   r   Ú,_activation_checkpointing.knapsack_evaluatorr   Ú_aot_autograd.logging_utilsr   Ú_aot_autograd.utilsr    r!   Úcompile_utilsr"   r#   ÚsympyÚdebug_partitionerr$   ri   rA   Ú	getLoggerr=   r%   ÚLoggerr0  r1  rš  r'   rF   rk   rC   rx   r`  r~   r†   rf   rŽ   r�   r¥   r¢   rd   rº   r¶   r½   rÀ   r»   r¼   rÉ   rÎ   rÑ   r¤   r¯   rÜ   rá   r  r  ró  r  r4  r=  Ú	lru_cacherI  re   rO  rf  rk  r†  r¼  rÂ  r?  r%  r  r'  r  rá  r8  rã  r%  rë  r  rc  r  r”  rD   r4   r2   ú<module>r´     sJ  ðä Û Û Û Û Û Û Û 	Û Ý #ß *ß ;Ó ;ã Û %Û Ý ß $Ð $õõ @ß Hß L÷ó õ )Ý /Ý 3å Ý L÷ñ õ
 LÝ ;ß Mß 8ñ Ûð %×6Ñ6Ð �tÓ 6Ø'�g×'Ñ'¨Ó1€€W‡^�^Ó 1à‡y�y‡~�~€Ø�	‰	�‰€ð ÷>ð >ó ð>ð2 ÷ ð  ó ð ð: ÷ð ó ðð˜Ÿ™ð  Tó ð˜rŸ~™~ð °$ó ð 2§>¡>ð °dó ð˜Ÿ™ð  Có ÷ñ ñ
 Ó€ð #ñ	DØ—‘ðDà�—‘‰MðDð �"—'‘'‰]ðDð �s‰mð	Dð
 ‡X�XóDðN�R—W‘Wð  ó ðG�b—g‘gð G $ó Gð˜bŸg™gð ¨$ó ð˜bŸg™gð ¨$ó ðX˜RŸW™Wð X¨ó XðC˜rŸw™wð C¨4ó CðK r§w¡wð K°4ó Kð˜rŸw™wð ¨4ó ð$Ø—.‘.ð$à
ˆ4�—‘‰=˜$˜rŸw™w™-Ð'Ñ(ó$ð $ r§w¡w¡-ð °só ð`"Ø—.‘.ð`"à�r—w‘w‘-ð`"ð ˜"Ÿ'™'‘]ð`"ð
 ð`"ð ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*ó`"ðFSØ—.‘.ðSà
ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*óSñl ˆc‹(€ð"˜#ð "¨ó "ð�2—7‘7ð ˜só ð:J�b—h‘hó Jð €×Ñ�TÓñó ðð"H  b§g¡g¨s lÑ!3ð H¸¸UÀ2Ç7Á7ÈCÀ<Ñ=PÑ8Qó HðG¨B¯N©Nð G¸r¿~¹~ó GðTZ*Ø�x‰x×#Ñ#ðZ*à�x‰x×#Ñ#ðZ*ð �X‰X�]‰]ðZ*ð �X‰X�]‰]ð	Z*ð
 �L‰LðZ*ð ðZ*ð —H‘H—M‘MðZ*ð —H‘H—M‘MóZ*ðzH Ø—.‘.ðH à�~‰~ðH ð �~‰~ðH ð ð	H ð
 ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*óH ðV#¨¯©ð #¸B¿N¹Nó #ðT /3ñ	H&Ø—‘ðH&àðH&ð #ðH&ð �z "§'¡'Ñ*Ñ+ó	H&òV.ð"b˜Wó bðJ˜BŸH™Hó ð+TØ—‘ð+Tà�‰Kð+Tð �5‰kð+Tð ð	+Tð
 ð+Tð $(¨¯©¡=ð+Tð ˆ5�$�s‘)˜T #™YÐ&Ñ'ó+Tõ\ 0ð5¨¯ªð 5Àð 5ÈÏÊó 5ò$NðT ñi	Ø—‘ði	àði	ð 
ˆ"�'‰'�]ó	i	ð^ ñm Ø—.‘.ðm ð ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*óm ðf ØØ,0Ø#Ø%)ñ'Ø�H‰H× Ñ ð'àð'ð ð'ð ð	'ð
 �5˜˜d 3™i˜Ñ(Ñ
)ð'ð ð'ð ˜c‘]ð'ð 
ô'r4   