§
    ž²Åjì ã                   ó¼  — 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m	Z	 d dl
mZmZ d dlmZmZmZmZmZmZmZm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!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l1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z; erd dl<Z<e0j=        Z>e?e@d<    ejA        eB¦  «        ZCejD        e@d<   ejE        jF        ZFejE        jG        ZGe G d„ d¦  «        ¦   «         ZHe G d„ d¦  «        ¦   «         ZIe G d„ d¦  «        ¦   «         ZJdejK        de?fd„ZLdejM        de?fd„ZNdejM        de?fd„ZOdejK        dePfd„ZQ G d „ d!¦  «        ZR eR¦   «         ZS	 dcd"ejT        d#eejK                 d$eejK                 d%eeU         dejT        f
d&„ZVdejK        de?fd'„ZWdejK        de?fd(„ZXdejK        de?fd)„ZYdejK        de?fd*„ZZdejK        de?fd+„Z[dejK        de?fd,„Z\dejK        de?fd-„Z]dejK        de?fd.„Z^d/ejM        deeejK                 eejK                 f         fd0„Z_d1eejK                 d2eUfd3„Z`d/ejM        d1eejK                 d4eejK                 d5ePdeejM        ejM        f         f
d6„Zad/ejM        deejM        ejM        f         fd7„Zb ePd8¦  «        Zcd9ePdePfd:„ZddejK        dePfd;„Zed<ejT        fd=„Zf ejg        d¦  «        d>„ ¦   «         Zhd?eejK        ePf         deeejK        ePf                  fd@„ZidAejM        dejM        fdB„Zjd/ejM        dCejM        dDejM        dEePdeejM        ejM        f         f
dF„Zkd/ejM        dejM        fdG„Zl	 dcd"ejT        dHeIdIeJfdJ„ZmdK„ ZndeHfdL„Zod<ejT        fdM„Zpd"ejT        dNeeq         dOeeq         dPeqdHeIdQeejK                 deeqeeP         eeP         f         fdR„Zrd dSlsmtZt dT„ Zu	 ddd"ejT        dHeIdeejK                 fdU„Zv	 ded/ejM        deejM        ejM        f         fdW„Zw	 	 	 	 	 dfd[ej        jM        d\eUd]eUd^e?d_eeeUeeU         f                  d`e?daeeU         ddfdb„ZxdS )gé    N©Údefaultdict)Ú	dataclassÚreplace)ÚCallableÚDictÚListÚOptionalÚSetÚTupleÚTYPE_CHECKINGÚUnion)Ú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)ÚCheckpointPolicyé   )Úconfig)Údp_knapsackÚgreedy_knapsackÚilp_knapsack)Úget_aot_graph_name)Ú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dS )ÚOpTypesz8Class for keeping track of different operator categoriesÚfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsÚnodec                 ó.   — t          |¦  «        | j        v S ©N)r"   r'   ©Úselfr,   s     úNC:\Projects\Historical\venv\Lib\site-packages\torch/_functorch/partitioners.pyÚ
is_fusiblezOpTypes.is_fusible>   s   € Ý˜tÑ$Ô$¨Ô(8Ð8Ð8ó    c                 ó.   — t          |¦  «        | j        v S r.   )r"   r(   r/   s     r1   Úis_compute_intensivezOpTypes.is_compute_intensiveA   s   € Ý˜tÑ$Ô$¨Ô(BÐBÐBr3   c                 ó.   — t          |¦  «        | j        v S r.   )r"   r)   r/   s     r1   Ú	is_randomzOpTypes.is_randomD   s   € Ý˜tÑ$Ô$¨¬Ð7Ð7r3   c                 ó.   — t          |¦  «        | j        v S r.   )r"   r*   r/   s     r1   Úis_viewzOpTypes.is_viewG   s   € Ý˜tÑ$Ô$¨¬Ð5Ð5r3   c                 ó.   — t          |¦  «        | j        v S r.   )r"   r+   r/   s     r1   Úis_recomputablezOpTypes.is_recomputableJ   s   € Ý˜tÑ$Ô$¨Ô(=Ð=Ð=r3   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__ÚfxÚNoder2   r5   r7   r9   r;   © r3   r1   r&   r&   4   s  € € € € € € àBÐBà�X”ÐÐÑØ˜xœ=Ð(Ð(Ñ(Ø�H”ÐÐÑØ�(ŒmÐÐÑØ˜(”mÐ#Ð#Ñ#ð9˜rœwð 9ð 9ð 9ð 9ðC¨¬ð Cð Cð Cð Cð8˜bœgð 8ð 8ð 8ð 8ð6˜BœGð 6ð 6ð 6ð 6ð> B¤Gð >ð >ð >ð >ð >ð >r3   r&   c                   óX  — 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dS )ÚNodeInfoÚinputsÚ_required_fw_nodesÚrequired_bw_nodesÚunclaimed_nodesÚfw_orderÚreturnc                 óJ   ‡ — t          d„ ‰ j        D ¦   «         ˆ fd„¬¦  «        S )Nc              3   ó   K  — | ]}|V — Œd S r.   rC   ©Ú.0Úns     r1   ú	<genexpr>z-NodeInfo.required_fw_nodes.<locals>.<genexpr>[   s"   è è € Ð0Ð0�1ˆQÐ0Ð0Ð0Ð0Ð0Ð0r3   c                 ó   •— ‰j         |          S r.   )rJ   )rP   r0   s    €r1   ú<lambda>z,NodeInfo.required_fw_nodes.<locals>.<lambda>[   s   ø€ ÀÄÈaÔ@P€ r3   ©Úkey)ÚsortedrG   ©r0   s   `r1   Úrequired_fw_nodeszNodeInfo.required_fw_nodesX   s:   ø€ åØ0Ð0˜Ô/Ð0Ñ0Ô0Ð6PÐ6PÐ6PÐ6Pð
ñ 
ô 
ð 	
r3   rP   c                 ó   — || j         v S r.   )rG   ©r0   rP   s     r1   Úis_required_fwzNodeInfo.is_required_fw^   s   € Ø�DÔ+Ð+Ð+r3   c                 ó   — || j         v S r.   )rH   rZ   s     r1   Úis_required_bwzNodeInfo.is_required_bwa   s   € Ø�DÔ*Ð*Ð*r3   c                 ó   — || j         v S r.   )rI   rZ   s     r1   Úis_unclaimedzNodeInfo.is_unclaimedd   s   € Ø�DÔ(Ð(Ð(r3   c                 óJ   — || j         v sJ d|› d�¦   «         ‚| j        |         S )NúNode z not in fw nodes!)rG   rJ   rZ   s     r1   Úget_fw_orderzNodeInfo.get_fw_orderg   s7   € Ø�DÔ+Ð+Ð+Ð+Ð-I°QÐ-IÐ-IÐ-IÑ+Ô+Ð+ØŒ}˜QÔÐr3   N)r<   r=   r>   r	   rA   rB   r@   r   r   ÚintÚ	functoolsÚcached_propertyrX   Úboolr[   r]   r_   rb   rC   r3   r1   rE   rE   N   s6  € € € € € € ð �”ŒMÐÐÑØ˜BœGœÐ$Ð$Ñ$Ø˜2œ7”|Ð#Ð#Ñ#Ø˜œ”\Ð!Ð!Ñ!Ø�2”7˜C�<Ô Ð Ð Ñ àÔð
 4¨¬¤=ð 
ð 
ð 
ñ Ôð
ð
, ¤ð ,¨Dð ,ð ,ð ,ð ,ð+ ¤ð +¨Dð +ð +ð +ð +ð)˜bœgð )¨$ð )ð )ð )ð )ð ˜bœgð  ¨#ð  ð  ð  ð  ð  ð  r3   rE   c                   óB   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dS )Ú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>   rf   r@   rC   r3   r1   rh   rh   l   sN   € € € € € € àÐÐÑØ $Ð$Ð$Ñ$Ø"&Ð&Ð&Ñ&Ø!Ð!Ð!Ñ!ØÐÐÑÐÐr3   rh   r,   rK   c                 óh   — | j                              dd ¦  «        t          j        t          j        fv S )NÚ	recompute)ÚmetaÚgetr   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©r,   s    r1   Úmust_recomputeru   u   s0   € ØŒ9�=Š=˜ dÑ+Ô+ÝÔ'ÝÔ)ð0ð ð r3   Úfx_gc                 óL   — d}| j         j        D ]}t          |¦  «        r dS ŒdS )NFT)ÚgraphÚnodesru   )rv   Úfoundr,   s      r1   Úhas_recomputable_opsr{   |   s<   € Ø€EØ”
Ô ð ð ˆÝ˜$ÑÔð 	Ø�4�4ð	àˆ5r3   c                 ó¬   — | j         j        D ]F}t          |¦  «        r5t          |j        d¦  «        r t
          j        j        |j        j        v r dS ŒGdS )NÚtagsTF)	rx   ry   ru   ÚhasattrÚtargetÚtorchÚTagÚnondeterministic_seededr}   )rv   r,   s     r1   Úhas_recomputable_rng_opsrƒ   „   s^   € Ø”
Ô ð ð ˆå˜4Ñ Ô ð	å˜œ VÑ,Ô,ð	õ ”	Ô1°T´[Ô5EÐEÐEà�4�4øØˆ5r3   c                 óº   — t          | j        d         t          j        t          j        f¦  «        rdS t          | j        d         t          j        ¦  «        sJ ‚dS )NÚvalr   é   )Ú
isinstancerp   r€   ÚSymIntÚSymBoolÚSymFloatrt   s    r1   Úsym_node_sizer‹   �   sM   € Ý�$”)˜EÔ"¥U¤\µ5´=Ð$AÑBÔBð ØˆqÝ�d”i Ô&­¬Ñ7Ô7Ð7Ð7Ð7Øˆ1r3   c                   ó   — e Zd Zd„ ZdS )ÚInvalidNodeBasec                 ó   — dS )NzInvalid NoderC   rW   s    r1   Ú__repr__zInvalidNodeBase.__repr__—   s   € Øˆ~r3   N)r<   r=   r>   r�   rC   r3   r1   r�   r�   –   s#   € € € € € ðð ð ð ð r3   r�   Újoint_graphrF   ÚoutputsÚsubgraphc                 ó  ‡
— t          j        ¦   «         }i Š
|D ]-}|                     |j        ¦  «        }|j        |_        |‰
|<   Œ.| j        D ]Ü}t          |¦  «        r|dk    rt          ‰
|<   Œ"|‰
v rŒ'|j        dk    rt          ‰
|<   Œ=|j        dk    r`t          j
        |j        i |j        ¤Ž}ˆ
fd„|D ¦   «         }t          |¦  «        rt          ‰
|<   Œ‹|                     |ˆ
fd„¦  «        ‰
|<   Œ¨|j        dk    r|                     |ˆ
fd„¦  «        ‰
|<   ŒÐ|j        dk    r	 ŒÝg }|D ]�}	t          |	t           j        ¦  «        r\|	‰
vrt#          d	|	› d
�¦  «        ‚t          ‰
|	         t$          ¦  «        rJ d	|	› d�¦   «         ‚|                     ‰
|	         ¦  «         Œx|                     |	¦  «         ŒŽ|                     t+          |¦  «        ¦  «         |                     ¦   «          |                     ¦   «          |S )a‘  
    Given a graph, extracts out a subgraph that takes the specified nodes as
    inputs and returns the specified outputs.

    This includes specifying non-placeholder nodes as inputs.

    The general strategy is to initialize all inputs with proxies as we
    encounter them, and trace through the graph, only keeping values which take
    in valid proxies. Then, all dead code is eliminated.
    ÚbackwardÚplaceholderÚcall_functionc                 óz   •— g | ]7}t          |t          j        ¦  «        ¯t          ‰|         t          ¦  «        ‘Œ8S rC   )r‡   rA   rB   r�   )rO   ÚxÚenvs     €r1   ú
<listcomp>z6_extract_graph_with_inputs_outputs.<locals>.<listcomp>Æ   sI   ø€ ð ð ð àÝ˜a¥¤Ñ)Ô)ðÝ˜3˜qœ6¥?Ñ3Ô3ðð ð r3   c                 ó   •— ‰|          S r.   rC   ©r˜   r™   s    €r1   rS   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>Î   ó   ø€ ¸CÀ¼F€ r3   Úget_attrc                 ó   •— ‰|          S r.   rC   rœ   s    €r1   rS   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>Ð   r�   r3   Úoutputra   z couldn't be found in envz was invalid, but is output)rA   ÚGraphr•   Únamerp   ry   Ú_must_be_in_backwardÚInvalidNodeÚopÚpytreeÚarg_tree_leavesÚargsÚkwargsÚanyÚ	node_copyr‡   rB   ÚRuntimeErrorr�   Úappendr    ÚtupleÚeliminate_dead_codeÚlint)r�   rF   r‘   r’   Ú	new_graphr,   Únew_nodeÚall_argsÚoutput_valuesr˜   r™   s             @r1   Ú"_extract_graph_with_inputs_outputsrµ   ž   s  ø€ õ  ”‘
”
€IØ
€Cð ð ð ˆØ×(Ò(¨¬Ñ3Ô3ˆàœ	ˆŒØˆˆD‰	ˆ	àÔ!ð ð ˆÝ Ñ%Ô%ð 	¨(°jÒ*@Ð*@Ý#ˆC�‰IØà�3ˆ;ˆ;ð ØŒW˜Ò%Ð%Ý#ˆC�‰IˆIØŒW˜Ò'Ð'ÝÔ-¨t¬yÐH¸D¼KÐHÐHˆHðð ð ð à!ðñ ô ˆHõ
 �8‰}Œ}ð Ý'��D‘	ØØ!×+Ò+¨DÐ2BÐ2BÐ2BÐ2BÑCÔCˆC�‰IˆIØŒW˜
Ò"Ð"Ø!×+Ò+¨DÐ2BÐ2BÐ2BÐ2BÑCÔCˆC�‰IˆIØŒW˜Ò Ð ØøØ€MØð 	$ð 	$ˆÝ�a�œÑ!Ô!ð 	$Ø˜ˆ|ˆ|Ý"Ð#G¨1Ð#GÐ#GÐ#GÑHÔHÐHÝ!Ø�A”�ñô ð 6ð 6à5�qÐ5Ð5Ð5ñ6ô 6ð ð × Ò   Q¤Ñ(Ô(Ð(Ð(à× Ò  Ñ#Ô#Ð#Ð#Ø×Ò•U˜=Ñ)Ô)Ñ*Ô*Ð*à×!Ò!Ñ#Ô#Ð#Ø‡N‚NÑÔÐØÐr3   c                 ó„   — | j         dk    o5dt          | j        ¦  «        vot          | ¦  «         ot	          | ¦  «         S ©Nr•   Útangents)r¥   Ústrr   Ú_is_bwd_seed_offsetÚ_is_fwd_seed_offsetrt   s    r1   Ú
_is_primalr¼   å   sP   € àŒ�=Ò ð 	*Ø�c $¤+Ñ.Ô.Ð.ð	*å# DÑ)Ô)Ð)ð	*õ $ DÑ)Ô)Ð)ð	r3   c                 óD   — | j         dk    odt          | j        ¦  «        v S r·   ©r¥   r¹   r   rt   s    r1   Ú_is_tangentr¿   î   s#   € ØŒ7�mÒ#ÐF¨
µc¸$¼+Ñ6FÔ6FÐ(FÐFr3   c                 óp   — | j         dk    o+dt          | j        ¦  «        v pdt          | j        ¦  «        v S )Nr•   Úbwd_seedÚbwd_base_offsetr¾   rt   s    r1   rº   rº   ò   ó=   € ØŒ7�mÒ#ð Ø•c˜$œ+Ñ&Ô&Ð&ÐOÐ*;½sÀ4Ä;Ñ?OÔ?OÐ*Oðr3   c                 óp   — | j         dk    o+dt          | j        ¦  «        v pdt          | j        ¦  «        v S )Nr•   Úfwd_seedÚfwd_base_offsetr¾   rt   s    r1   r»   r»   ø   rÃ   r3   c                 ór   — | j         dk    o,t          | j                             d¦  «        t          ¦  «        S )Nr•   r…   )r¥   r‡   rp   rq   r   rt   s    r1   Ú_is_backward_staterÈ   þ   s,   € ØŒ7�mÒ#ÐW­
°4´9·=²=ÀÑ3GÔ3GÍÑ(WÔ(WÐWr3   c                 ó@   — | j                              dd ¦  «        dk    S )NÚpartitioner_tagÚis_backward©rp   rq   rt   s    r1   Ú_has_tag_is_backwardrÍ     s   € ØŒ9�=Š=Ð*¨DÑ1Ô1°]ÒBÐBr3   c                 ó@   — | j                              dd ¦  «        dk    S )NrÊ   Úmust_be_in_backwardrÌ   rt   s    r1   Ú_has_tag_must_be_in_backwardrÐ     s   € ØŒ9�=Š=Ð*¨DÑ1Ô1Ð5JÒJÐJr3   c                 ó\   — t          | ¦  «        pt          | ¦  «        ot          | ¦  «        S r.   )rÐ   rÍ   r    rt   s    r1   r£   r£   
  s/   € Ý'¨Ñ-Ô-ð Ý˜TÑ"Ô"Ð<¥°tÑ'<Ô'<ðr3   Újoint_modulec                ó”   — t          j        d„ | j                             d¬¦  «        D ¦   «         Ž }|d |…         }||d …         }||fS )Nc              3   ó$   K  — | ]}|j         V — Œd S r.   )r¨   ©rO   r,   s     r1   rQ   z+_extract_fwd_bwd_outputs.<locals>.<genexpr>  s$   è è € Ð	KÐ	K˜ˆ$Œ)Ð	KÐ	KÐ	KÐ	KÐ	KÐ	Kr3   r    ©r¥   )r¦   r§   rx   Ú
find_nodes)rÒ   Únum_fwd_outputsr‘   Úfwd_outputsÚbwd_outputss        r1   Ú_extract_fwd_bwd_outputsrÛ     sc   € õ Ô$Ø	KÐ	K Ô 2× =Ò =ÀÐ =Ñ JÔ JÐ	KÑ	KÔ	Kð€Gð Ð*˜?Ð*Ô+€KØ˜/Ð*Ð*Ô+€KØ˜Ð#Ð#r3   Úsaved_valuesr¢   c                 óV   — | D ]%}|j         |k    r|                      |¦  «          d S Œ&d S r.   )r¢   Úremove)rÜ   r¢   Úsaved_values      r1   Ú_remove_by_namerà     sI   € Ø#ð ð ˆØÔ˜tÒ#Ð#Ø×Ò Ñ,Ô,Ð,ØˆEˆEð $ðð r3   Úsaved_sym_nodesrØ   c                ó¾  — t          | |¬¦  «        \  }}| j                             d¬¦  «        }g t          t          |¦  «        ¢}g t          t
          |¦  «        ¢}g t          t          |¦  «        ¢}	g t          t          |¦  «        ¢}
g t          t          |¦  «        ¢}t          | j        ||z   |z   |
z   |d¦  «        }|                     d¬¦  «        D ]\}|j
        s+t          ||j        ¦  «         t          ||j        ¦  «         Œ4t          |¦  «        rt          ||j        ¦  «         |sJ ‚Œ]t          ¦   «         }g }g }|D ]S}t          |¦  «        }|r+|                     |¦  «         |                     |¦  «         Œ>|                     |¦  «         ŒTt#          | j        ¦  «        }t%          j        |||¦  «        D ]c}d|j        vrŒt+          |j        d         ¦  «        |z
  }t-          |d„ ¬¦  «        D ]"}||vrŒ|                     ||         ¦  «         Œ#||z  }Œd|                     ¦   «          |                     ||z   ¦  «         t          | j        ||	z   ||z   |z   d¦  «        }t          | j        ||z   |z   |
z   |z   |d¦  «        }t2          j                             | |¦  «        }t2          j                             | |¦  «        }||fS )	N©rØ   r•   rÖ   r”   r…   c                 ó   — | j         S r.   ©r¢   )Úss    r1   rS   z*_extract_fwd_bwd_modules.<locals>.<lambda>^  s   € °1´6€ r3   rT   Úforward)rÛ   rx   r×   Úfilterr¼   r¿   r»   rº   rÈ   rµ   Úusersrà   r¢   Úsetr   Úaddr­   r   Ú	itertoolsÚchainrp   r   rV   ÚclearÚextendrA   Ú_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                           r1   Ú_extract_fwd_bwd_modulesr  "  si  € õ  8Ø oð ñ  ô  Ñ€K�ð  Ô%×0Ò0°MÐ0ÑBÔB€LØ7•f�Z¨Ñ6Ô6Ð7€MØ9•v�k¨<Ñ8Ô8Ð9€NØI�vÕ&9¸<ÑHÔHÐIÐØI�vÕ&9¸<ÑHÔHÐIÐØG�fÕ%7¸ÑFÔFÐGÐå2ØÔØ˜,Ñ&¨Ñ7Ð:PÑPØØñ	ô €Ið ×$Ò$¨Ð$Ñ6Ô6ð )ð )ˆàŒzð 	)Ý˜L¨$¬)Ñ4Ô4Ð4Ý˜O¨T¬YÑ7Ô7Ð7Ð7Ý Ñ%Ô%ð 	)å˜L¨$¬)Ñ4Ô4Ð4Ø(Ð(Ð(Ð(øõ (+¡u¤u€MØ ÐØ Ðð  ð 1ð 1ˆÝ*¨4Ñ0Ô0ˆØð 	1Ø×Ò˜fÑ%Ô%Ð%Ø#×*Ò*¨4Ñ0Ô0Ð0Ð0à#×*Ò*¨4Ñ0Ô0Ð0Ð0õ 3°<Ô3EÑFÔF€OÝ”Ð 7¸À~ÑVÔVð %ð %ˆØ˜œ	Ð!Ð!ØÝ" 4¤9¨UÔ#3Ñ4Ô4°}ÑDˆå˜Ð)9Ð)9Ð:Ñ:Ô:ð 	?ð 	?ˆAð ˜Ð'Ð'ØØ#×*Ò*¨?¸1Ô+=Ñ>Ô>Ð>Ð>Ø˜Ñ$ˆˆð
 ×ÒÑÔÐØ×ÒÐ2Ð5LÑLÑMÔMÐMõ 3ØÔØÐ.Ñ.Ø�lÑ" _Ñ4Øñ	ô €Iõ 3ØÔØØ
ñ	à
ñ	ð !ñ	!ð  ñ		 ð
 	Øñ	ô 	€Iõ Ô&×9Ò9¸,È	ÑRÔR€JÝÔ&×9Ò9¸,È	ÑRÔR€JØ�zÐ!Ð!r3   c                ó^  ‡— t          | ¦  «        rt          | ||¬¦  «        S t          t          t          | j        j        ¦  «        ¦  «        }t          t          t          | j        j        ¦  «        ¦  «        }||z   }t          | |¬¦  «        \  }}t          | j        ||d¦  «        }d„ |j        D ¦   «         Šg }	g }
| j        j        D ]Ý}|j
        ‰vrŒt          |¦  «        r|
                     |¦  «         Œ1d|j        vrC|j        dk    r8|j        }t!          d„ |D ¦   «         ¦  «        sJ ‚|	                     |¦  «         Œ}ˆfd„|j        D ¦   «         }d|j        v r/t!          d„ |D ¦   «         ¦  «        r|
                     |¦  «         ŒÈ|	                     |¦  «         ŒÞt          t$                               |	¦  «                             ¦   «         ¦  «        }	t          t$                               |
¦  «                             ¦   «         ¦  «        }
t+          | |	|
|¬	¦  «        S )
aÔ  
    Partitions the :attr:`joint_module` in a manner that closely resembles the
    behavior observed in the original ``.forward()`` and ``.backward()`` of the
    callable, i.e., the resulting forward graph contains those operators that
    are executed in the original ``.forward()`` callable passed to
    :func:`aot_function`.

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

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

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

    Returns:
        Returns the generated forward and backward Fx graph modules.
    rã   rç   c                 ó2   — h | ]}|j         d k    ¯|j        ’ŒS ©r    ©r¥   r¢   rÕ   s     r1   ú	<setcomp>z$default_partition.<locals>.<setcomp>¬  s-   € ð ð ð Ø¸$¼'ÀXÒ:MÐ:MˆŒ	Ð:MÐ:MÐ:Mr3   Útensor_metar–   c              3   ó@   K  — | ]}|j         t          j        k    V — Œd S r.   )r   ÚoperatorÚgetitem©rO   Úusers     r1   rQ   z$default_partition.<locals>.<genexpr>¼  s,   è è € ÐIÐI¸4�t”{¥hÔ&6Ò6ÐIÐIÐIÐIÐIÐIr3   c                 ó&   •— g | ]}|j         ‰v¯|‘ŒS rC   rå   )rO   rP   Úforward_node_namess     €r1   rš   z%default_partition.<locals>.<listcomp>¿  s-   ø€ ð ð ð Ø¨¬Ð7IÐ)IÐ)I�Ð)IÐ)IÐ)Ir3   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r.   ©r   rN   s     r1   rQ   z$default_partition.<locals>.<genexpr>Â  s9   è è € ð 2ð 2Ø#$•˜A‘”ð2ð 2ð 2ð 2ð 2ð 2r3   ©rá   rØ   )r{   Ú#min_cut_rematerialization_partitionÚlistrè   r¼   rx   ry   r»   rÛ   rµ   r¢   r   r­   rp   r¥   ré   Úallrï   ÚdictÚfromkeysÚkeysr  )rÒ   Ú_joint_inputsrØ   ró   rõ   rF   rÙ   rÚ   Úforward_only_graphrÜ   rá   r,   ré   Úbackward_usagesr  s                 @r1   Údefault_partitionr  …  s�  ø€ õ4 ˜LÑ)Ô)ð 
Ý2Ø˜-¸ð
ñ 
ô 
ð 	
õ �¥
¨LÔ,>Ô,DÑEÔEÑFÔF€MÝ!¥&Õ)<¸lÔ>PÔ>VÑ"WÔ"WÑXÔXÐØÐ3Ñ3€FÝ7Ø oð ñ  ô  Ñ€K�õ <ØÔ˜F K°ñô Ððð Ø0Ô6ðñ ô Ðð €LØ€OàÔ"Ô(ð *ð *ˆØŒ9Ð.Ð.Ð.ØÝ�tÑÔð 	*ð ×"Ò" 4Ñ(Ô(Ð(Ð(Ø $¤)Ð+Ð+°´¸?Ò0JÐ0Jà”JˆEÝÐIÐIÀ5ÐIÑIÔIÑIÔIÐIÐIÐIØ×Ò Ñ&Ô&Ð&Ð&ðð ð ð Øœ:ðñ ô ˆOð  ¤	Ð)Ð)­cð 2ð 2Ø(7ð2ñ 2ô 2ñ /ô /Ð)ð  ×&Ò& Ñ7Ô7Ð7Ð7à×#Ò# DÑ)Ô)Ð)Ð)Ý�Ÿš lÑ3Ô3×8Ò8Ñ:Ô:Ñ;Ô;€LÝ�4Ÿ=š=¨Ñ9Ô9×>Ò>Ñ@Ô@ÑAÔA€Oå#ØØØ'Ø'ð	ñ ô ð r3   g    €„.AÚnumelc                 ó   — | |j         z  S r.   )Úitemsize)r  Údtypes     r1   Ú_tensor_nbytesr!  Þ  s   € Ø�5”>Ñ!Ð!r3   c                 ó4  ‡— dt           fd„Šd| j        v rä| j        d         }t          |t          ¦  «        rdS t          |t          t
          f¦  «        rt          ˆfd„|D ¦   «         ¦  «        S t          |t          ¦  «        r-t          ˆfd„|                     ¦   «         D ¦   «         ¦  «        S t          |t          j
        ¦  «        r ‰|¦  «        S t          dt          |¦  «        › d| › �¦  «        ‚| j        d	k    rd
S t          d| › d�¦  «        ‚)NrK   c                 ó¦   — t          | t          j        ¦  «        sdS t          t	          |                      ¦   «         d¬¦  «        | j        ¦  «        S )Nr   é   ©Úfallback)r‡   r€   ÚTensorr!  r   r  r   ©r˜   s    r1   Úobject_nbytesz_size_of.<locals>.object_nbytesã  sB   € Ý˜!�Uœ\Ñ*Ô*ð 	Ø�1Ý�h q§w¢w¡y¤y¸4Ð@Ñ@Ô@À!Ä'ÑJÔJÐJr3   r…   r   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r.   rC   )rO   rP   r)  s     €r1   rQ   z_size_of.<locals>.<genexpr>ð  s-   øè è € Ð5Ð5¨A�}�} QÑ'Ô'Ð5Ð5Ð5Ð5Ð5Ð5r3   c              3   ó4   •K  — | ]\  }} ‰|¦  «        V — Œd S r.   rC   )rO   Ú_rP   r)  s      €r1   rQ   z_size_of.<locals>.<genexpr>ò  s1   øè è € Ð@Ð@©D¨A¨q�}�} QÑ'Ô'Ð@Ð@Ð@Ð@Ð@Ð@r3   zUnknown metadata type z	 on node rž   r   ra   zO didn't have `val` metadata; we should always have `val` metadata on the nodes.)rc   rp   r‡   r   r  r®   Úsumr  Úitemsr€   r'  r¬   Útyper¥   )r,   r…   r)  s     @r1   Ú_size_ofr0  â  sH  ø€ ðK�Cð Kð Kð Kð Kð
 �”	ÐÐØŒi˜ÔˆÝ�c�<Ñ(Ô(ð 
	&Ø�1õ ˜�d¥E˜]Ñ+Ô+ð 	&ÝÐ5Ð5Ð5Ð5°Ð5Ñ5Ô5Ñ5Ô5Ð5Ý˜�TÑ"Ô"ð 	&ÝÐ@Ð@Ð@Ð@°C·I²I±K´KÐ@Ñ@Ô@Ñ@Ô@Ð@Ý˜�Uœ\Ñ*Ô*ð 	&Ø �= Ñ%Ô%Ð%åÐNµD¸±I´IÐNÐNÈÐNÐNÑOÔOÐOØ„w�*ÒÐØˆqÝ
Øe�ÐeÐeÐeñô ð r3   rx   c                 ó  — ddl m}  |t          ¦  «        }| j        D ]'}|j        dk    r||j        j        xx         dz  cc<   Œ(t                               dt          | 
                    ¦   «         d„ d¬¦  «        ¦  «         d S )	Nr   r   r–   r   z%sc                 ó   — | d         S ©Nr   rC   r(  s    r1   rS   z_count_ops.<locals>.<lambda>  s
   € °Q°q´T€ r3   T©rU   Úreverse)Úcollectionsr   rc   ry   r¥   r   r<   r$   ÚinforV   r.  )rx   r   Úcntr,   s       r1   Ú
_count_opsr9  ÿ  s–   € Ø'Ð'Ð'Ð'Ð'Ð'à%˜+¥cÑ*Ô*€CØ”ð +ð +ˆØŒ7�oÒ%Ð%Ø�”Ô$Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%øÝ‡H‚HˆT•6˜#Ÿ)š)™+œ+¨>¨>À4ÐHÑHÔHÑIÔIÐIÐIÐIr3   c                  óv  — g } t          t          j        j        ¦  «        D ]—}t	          t          j        j        |¦  «        }t          |t          j        j        ¦  «        sŒA|                     ¦   «         D ]A}t	          ||¦  «        }t          j	        j
        |j        v r|                      |¦  «          nŒBŒ˜| S r.   )Údirr€   ÚopsÚatenÚgetattrr‡   Ú_opsÚOpOverloadPacketÚ	overloadsr�   Ú	pointwiser}   r­   )r<  Ú	attr_nameÚopoverloadpacketÚoverloadÚop_overloads        r1   Úpointwise_opsrG  	  s´   € à
€CÝ�œœÑ(Ô(ð 
ð 
ˆ	Ý"¥5¤9¤>°9Ñ=Ô=ÐÝÐ*­E¬JÔ,GÑHÔHð 	Øà(×2Ò2Ñ4Ô4ð 	ð 	ˆHÝ!Ð"2°HÑ=Ô=ˆKÝŒyÔ" kÔ&6Ð6Ð6à—
’
Ð+Ñ,Ô,Ð,Ø�ð 7øð
 €Jr3   Ú	depth_mapc                 ój   ‡— ˆfd„| D ¦   «         }t          |                     ¦   «         d„ d¬¦  «        S )Nc                 ój   •— i | ]/}t          |t          j        j        j        ¦  «        ¯&|‰|         “Œ0S rC   )r‡   r€   rA   r,   rB   )rO   ÚargrH  s     €r1   ú
<dictcomp>zsort_depths.<locals>.<dictcomp>  sE   ø€ ð ð ð Ø #­z¸#½u¼x¼}Ô?QÑ/RÔ/RðØˆY�sŒ^ðð ð r3   c                 ó   — | d         S r3  rC   r(  s    r1   rS   zsort_depths.<locals>.<lambda>  s
   € °A°a´D€ r3   Tr4  )rV   r.  )r¨   rH  Ú
arg_depthss    ` r1   Úsort_depthsrO    sP   ø€ ðð ð ð Ø'+ðñ ô €Jõ �*×"Ò"Ñ$Ô$¨.¨.À$ÐGÑGÔGÐGr3   Úgmc                 ót  ‡
‡‡— t          j        ¦   «         Ši Š
| j                             d¬¦  «        D ]}‰                     |ˆ
fd„¦  «        ‰
|<   Œi Št          | j        j        ¦  «        D ]
\  }}|‰|<   Œˆ
ˆˆfd„}t          t          t          | j        j        ¦  «        ¦  «        }d}t          j        }|D ]"}|j        D ]}‰|         |k     r
‰|         }|}ŒŒ#|€| S t          | j        j        ¦  «        ‰|         d…         D ]} ||¦  «         Œt          j                              | ‰¦  «        }	|	S )aÃ  
    This pass finds the first bwd node in the graph (by looking at users of
    tangents) and then reorders the graph by walking from this node to all the
    way to the end of the graph. At each op in this 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.   rC   rœ   s    €r1   rS   z5reordering_to_mimic_autograd_engine.<locals>.<lambda>>  s   ø€ ¸¸A¼€ r3   c                 óX  •— | g}t          ¦   «         }t          |¦  «        dk    rO|                     ¦   «         } | |v s| ‰v rŒ0|                     | ¦  «         || j        z  }t          |¦  «        dk    °Ot          |ˆfd„¬¦  «        }|D ]} ‰                     | ˆfd„¦  «        ‰| <   Œd S )Nr   c                 ó   •— ‰|          S r.   rC   )rP   Úorders    €r1   rS   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>Q  s   ø€ À%ÈÄ(€ r3   rT   c                 ó   •— ‰|          S r.   rC   rœ   s    €r1   rS   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>S  r�   r3   )rê   ÚlenÚpoprë   Úall_input_nodesrV   r«   )r,   Ú	cur_nodesÚinsertable_nodesr™   r±   rU  s      €€€r1   Úinsert_node_in_graphzAreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graphD  sá   ø€ Ø�Fˆ	Ý™5œ5ÐÝ�)‰nŒn˜qÒ Ð Ø—=’=‘?”?ˆDØÐ'Ð'Ð'¨4°3¨;¨;ØØ× Ò  Ñ&Ô&Ð&ð ˜Ô-Ñ-ˆIõ �)‰nŒn˜qÒ Ð õ "Ð"2Ð8JÐ8JÐ8JÐ8JÐKÑKÔKÐØ$ð 	Dð 	DˆDØ!×+Ò+¨DÐ2BÐ2BÐ2BÐ2BÑCÔCˆC�‰IˆIð	Dð 	Dr3   N)rA   r¡   rx   r×   r«   Ú	enumeratery   r  rè   r¿   ÚmathÚinfré   r€   ÚGraphModule)rP  r,   Úidxr\  rô   Úfirst_node_in_bwdÚminimum_orderÚtangentr  Únew_gmr™   r±   rU  s             @@@r1   Ú#reordering_to_mimic_autograd_enginerf  "  s–  øøø€ õ. ”‘
”
€IØ"$€Cð ”×#Ò# }Ð#Ñ5Ô5ð @ð @ˆØ×'Ò'¨Ð.>Ð.>Ð.>Ð.>Ñ?Ô?ˆˆD‰	ˆ	à€EÝ˜rœxœ~Ñ.Ô.ð ð ‰	ˆˆTØˆˆd‰ˆðDð Dð Dð Dð Dð Dð Dõ$ �&¥¨b¬h¬nÑ=Ô=Ñ>Ô>€NØÐÝ”H€MØ!ð )ð )ˆØ”Mð 	)ð 	)ˆDØ�TŒ{˜]Ò*Ð*Ø % d¤�Ø$(Ð!øð	)ð Ð Øˆ	õ �R”X”^Ñ$Ô$ UÐ+<Ô%=Ð%?Ð%?Ô@ð #ð #ˆØÐ˜TÑ"Ô"Ð"Ð"õ ŒX×!Ò! " iÑ0Ô0€FØ€Mr3   Ú	fw_moduleÚ	bw_moduleÚnum_sym_nodesc                 ó(  — t          j        ¦   «         }d„ }d„ }d„ } || ¦  «        } ||¦  «        }	 ||¦  «        }
i }| j        j        D ]r}t	          |¦  «        rat          |j        d¦  «        rLt          j        j	        |j        j
        v r/||j                 }|	|j                 }|
|j                 }||dœ||<   Œst          j        j        j        }t          j        j        j        }d }|j                             d¬¦  «        D ]}d|j        v r|} nŒ|€t#          d	¦  «        ‚g }|                     ¦   «         D �]ú\  }}|d
         }|d         }|j        }|                     |¦  «        5  |                     d||j        g|j        ¢R |j        ¬¦  «        }|                     dt.          j        |dfi ¬¦  «        }|                     dt.          j        |dfi ¬¦  «        }|                     |¦  «         |                     |¦  «         |                     |¦  «         d d d ¦  «         n# 1 swxY w Y   |j        }|                     |¦  «        5  dt9          |¦  «        › �}|                     |¦  «        } | ||¦  «        ¦  «        |j        d<   d d d ¦  «         n# 1 swxY w Y   |                     |¦  «        5  |                     d|||j        g|j        ¢R |j        ¬¦  «        }|                     |¦  «         |                     |¦  «         d d d ¦  «         n# 1 swxY w Y   �Œüt9          t?          |j                             d¬¦  «        ¦  «        ¦  «        }|j        d         }tA          |¦  «        |z
  }|d |…         tC          |¦  «        z   ||d …         z   }|j         "                    |¦  «         |j                             |¦  «         | #                    ¦   «          | #                    ¦   «          ||fS )Nc                 ó¶   — i }| j         j        D ]I}|j        dk    r<t          |j        d¦  «        r't
          j        j        |j        j        v r
|||j	        <   ŒJ|S )Nr–   r}   )
rx   ry   r¥   r~   r   r€   r�   r‚   r}   r¢   )ÚgmodÚrandom_nodesr,   s      r1   Úget_rng_opsz*functionalize_rng_ops.<locals>.get_rng_ops‡  sd   € ØˆØ”JÔ$ð 	/ð 	/ˆDà”˜?Ò*Ð*Ý˜DœK¨Ñ0Ô0ð +å”IÔ5¸¼Ô9IÐIÐIà*.�˜TœYÑ'øØÐr3   c                 óÊ   — d| j         vrdS | j         d         }t          |t          ¦  «        s|f}|D ]/}t          |t          j        ¦  «        r|j        j        dk    r dS Œ0dS )zV
        Check the example value of the node outputs to find the device type.
        r…   NÚcudaÚcpu)rp   r‡   r®   r€   r'  Údevicer/  )r,   Ú
candidatesÚ	candidates      r1   Ú
get_devicez)functionalize_rng_ops.<locals>.get_device’  s|   € ð ˜œ	Ð!Ð!Ø�4à”Y˜uÔ%ˆ
Ý˜*¥eÑ,Ô,ð 	'Ø$˜ˆJà#ð 	"ð 	"ˆIÝ˜)¥U¤\Ñ2Ô2ð "ØÔ#Ô(¨FÒ2Ð2Ø!˜6˜6øàˆur3   c                 óp   — | dk    rt           j                             ¦   «         S t          j        ¦   «         S )Nrp  )r€   rp  Úget_rng_state)rr  s    r1   Úget_sample_rng_statez3functionalize_rng_ops.<locals>.get_sample_rng_state¤  s0   € Ø�VÒÐÝ”:×+Ò+Ñ-Ô-Ð-ÝÔ"Ñ$Ô$Ð$r3   r}   )ÚfwdÚbwdr•   rÖ   rd  zaCouldn't find tangent node in graph inputs. This is unexpected, please file a bug if you see thisry  rz  r–   )r¨   r©   r   r   Úrng_state_output_r…   r    )$rì   Úcountrx   ry   ru   r~   r   r€   r�   r‚   r}   r¢   Ú_primsÚ	rng_primsÚrun_and_save_rng_stateÚrun_with_rng_stater×   r¬   r.  Úinserting_beforeÚcreate_noder¨   r©   r
  r  Úreplace_all_uses_withÚ
erase_noder­   Únextr•   rp   ÚiterrW  r®   r    Ú	recompile) rÒ   rg  rh  ri  Úuidrn  ru  rx  Újoint_graph_rng_opsÚfw_graph_rng_opsÚbw_graph_rng_opsÚrecomputable_rng_ops_mapr,   Ú	base_nodeÚfw_nodeÚbw_nodeÚrun_and_save_rngr€  Úbw_tangent_start_nodeÚfw_rng_state_outputsÚ	node_pairÚfw_graphÚfunctional_fw_nodeÚstateÚ
rng_outputÚbw_graphÚ
state_nameÚbw_rng_state_nodeÚfw_output_nodeÚ
fw_outputsÚsym_node_start_idxr‘   s                                    r1   Úfunctionalize_rng_opsrž  l  s‚  € õ2 Œ/Ñ
Ô
€Cð	ð 	ð 	ðð ð ð$%ð %ð %ð &˜+ lÑ3Ô3ÐØ"�{ 9Ñ-Ô-ÐØ"�{ 9Ñ-Ô-ÐØ!ÐØÔ"Ô(ð 	Sð 	Sˆå˜4Ñ Ô ð	Så˜œ VÑ,Ô,ð	Sõ ”	Ô1°T´[Ô5EÐEÐEà+¨D¬IÔ6ˆIØ& t¤yÔ1ˆGØ& t¤yÔ1ˆGØ:AÈ'Ð2RÐ2RÐ$ YÑ/øå”|Ô-ÔDÐÝœÔ/ÔBÐØ ÐØ”×*Ò*¨mÐ*Ñ<Ô<ð ð ˆØ˜œ	Ð!Ð!Ø$(Ð!ØˆEð "ð Ð$ÝØoñ
ô 
ð 	
ð ÐØ 8× >Ò >Ñ @Ô @ð /)ñ /)Ñˆ	�9à˜EÔ"ˆØ˜EÔ"ˆØ”?ˆØ×&Ò& wÑ/Ô/ð 	/ð 	/Ø!)×!5Ò!5ØØ Ø”nÐ4 w¤|Ð4Ð4Ø”~ð	 "6ñ "ô "Ðð ×(Ò(ØÝÔ Ø(¨!Ð,Øð	 )ñ ô ˆEð "×-Ò-ØÝÔ à&Øðð ð .ñ ô ˆJð ×)Ò)¨*Ñ5Ô5Ð5Ø×Ò Ñ(Ô(Ð(Ø ×'Ò'¨Ñ.Ô.Ð.ð1	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð6 ”?ˆØ×&Ò&Ð'<Ñ=Ô=ð 	Vð 	VØ8­T°#©Y¬YÐ8Ð8ˆJØ (× 4Ò 4°ZÑ @Ô @ÐØ,@Ð,@ÀÀÈGÑATÔATÑ,UÔ,UÐÔ" 5Ñ)ð	Vð 	Vð 	Vñ 	Vô 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vøøøð 	Vð 	Vð 	Vð 	Vð
 ×&Ò& wÑ/Ô/ð 		)ð 		)Ø!×-Ò-ØØ"Ø'¨¬ÐG¸'¼,ÐGÐGØ”~ð	 .ñ ô ˆJð ×)Ò)¨*Ñ5Ô5Ð5Ø×Ò Ñ(Ô(Ð(ð		)ð 		)ð 		)ñ 		)ô 		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)øøøð 		)ð 		)ð 		)ð 		)ùõ �$˜yœ×9Ò9¸XÐ9ÑFÔFÑGÔGÑHÔH€NØÔ$ QÔ'€JÝ˜Z™œ¨=Ñ8ÐàÐ&Ð&Ð&Ô'Ý
Ð$Ñ
%Ô
%ñ	&à
Ð'Ð(Ð(Ô
)ñ	*ð ð
 „O×Ò˜7Ñ#Ô#Ð#Ø„O×Ò˜~Ñ.Ô.Ð.Ø×ÒÑÔÐØ×ÒÑÔÐØ�iÐÐs9   Å1B6H3È3H7	È:H7	ÉAJ*Ê*J.	Ê1J.	Ë
AL.Ì.L2	Ì5L2	c                 ón  — | j         j        D ]§}t          |¦  «        r–|j        D ]A}t          |¦  «        r0|j        d         |j        d         k    rt
          j        |j        d<   ŒB|j                             dd¦  «        r2t          d„ |j        D ¦   «         ¦  «        s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_idro   Úhas_backward_hookFc              3   ó4   K  — | ]}t          |¦  «        V — Œd S r.   )ru   r  s     r1   rQ   z)cleanup_recompute_tags.<locals>.<genexpr>  sC   è è € ð Eð EØ)-•˜tÑ$Ô$ðEð Eð Eð Eð Eð Er3   )	rx   ry   ru   ré   rp   r   Ú	MUST_SAVErq   rª   )rÒ   r,   r  s      r1   Úcleanup_recompute_tagsr¤  	  sâ   € ð Ô"Ô(ð Dð DˆÝ˜$ÑÔð 	DØœ
ð Hð H�å" 4Ñ(Ô(ðHàœ	 -Ô0°4´9¸]Ô3KÒKÐKå-=Ô-G�D”I˜kÑ*øØŒy�}Š}Ð0°%Ñ8Ô8ð DÅð Eð EØ15´ðEñ Eô Eñ Bô Bð Dõ& *:Ô)C�”	˜+Ñ&øØÐr3   Ú	node_infoÚmin_cut_optionsc                 óÚ  ‡‡‡‡$‡%‡&‡'‡(‡)‡*‡+‡,‡-‡.‡/— ‰€t          ¦   «         Št          ¦   «         Š.t          r@d„ | j        D ¦   «         }|d„ ‰.j        D ¦   «         z
  }t
                               d|¦  «         d„ Š%d„ Š&ˆ%ˆ&ˆ.fd„Š'	 dd l}n"# t          $ r}t          d¦  «        |‚d }~ww xY wˆ'ˆˆ.fd	„Š)ˆ)ˆˆ.fd
„}ˆ'fd„Š(dt          fˆ(ˆ.fd„}	|                     ¦   «         Š-t          ¦   «         Š$ˆ$ˆˆ-ˆ.fd„}
| j        D �]}|j        dk    rŒ|‰j        v r^|‰j        vr+‰-                     |j        dz   dt"          j        ¬¦  «         ŒL‰-                     |j        dz   dt"          j        ¬¦  «         t'          |¦  «        r+‰-                     |j        dz   dt"          j        ¬¦  «         Œ°t)          |¦  «        st+          |¦  «        r |
|¦  «         ‰                     |¦  «        r ||¦  «        r |
|¦  «         d|j        vod|j        vp.d|j        v o%t1          |j        d         t2          j        ¦  «         }t7          |¦  «        rt          t9          |¦  «        ¦  «        }nI|r<t1          |j                             d¦  «        t<          ¦  «        rdnt"          j        }n |	|¦  «        }‰-                     |j        dz   |j        dz   |¬¦  «         |j        D ]4}‰-                     |j        dz   |j        dz   t"          j        ¬¦  «         Œ5�Œ dt@          tB          j"                 dtF          dtF          fˆ'ˆfd„}‰j$        �r‰j%        D ]ú}ˆfd„|j        D ¦   «         }ˆfd„|j        D ¦   «         }tM          |¦  «        dk    r¿ ||tO          |¦  «        ¦  «        }tQ          |j        ¦  «        D ]‘}‰                     |¦  «        rz‰ )                    |¦  «        |k    ra ‰'||¦  «        rU|‰$v rŒAt
                               d|‰ )                    |¦  «        ||‰ )                    |¦  «        ¦  «          |
|¦  «         Œ’Œû‰j*        �rŽt          ¦   «         }| j        D �]w}‰                     |¦  «        sŒ‰ )                    |¦  «        |fg}‰ )                    |¦  «        }tM          |¦  «        dk    �rtW          j,        |¦  «        \  }}||v rŒ0| -                    |¦  «         ‰ )                    |¦  «        |dz   k    rctM          |¦  «        dk    rPt
                               d||‰ )                    |¦  «        ‰ )                    |¦  «        ¦  «          |
|¦  «         nm|j        D ]Q}‰                     |¦  «        r: ‰'||¦  «        r.|‰$vr*tW          j.        |‰ )                    |¦  «        |f¦  «         ŒRtM          |¦  «        dk    �°�Œy	 | /                    ‰-dd¦  «        \  }}n‚# t`          $ ru t
                               d ¦  «         t
                               d! 1                    |j2        j3         4                    ‰-¦  «        ¦  «        ¦  «         tk          ‰-¦  «         ‚ w xY w|\  }Š,t          ¦   «         }ˆ-fd"„|D ¦   «         D ]'\  Š/}| 6                    ˆ,ˆ/fd#„|D ¦   «         ¦  «         Œ(t          ¦   «         }|D ]<\  } }!| d d$…         |!d d%…         k    sJ ‚| d d$…         }"| -                    |"¦  «         Œ=to          | ¦  «        Š*d&„ tq          | j        ¦  «        D ¦   «         Š+ts          ˆ*fd'„|D ¦   «         ˆ+fd(„¬)¦  «        }#|#‰$fS )*Nc                 ó€   — h | ];}|j         d k    ¯t          |j        d¦  «        ¯"t          |j        j        ¦  «        ’Œ<S )r–   Ú_overloadpacket)r¥   r~   r   r¹   r©  rÕ   s     r1   r  z solve_min_cut.<locals>.<setcomp>:  sN   € ð 
ð 
ð 
àØŒw˜/Ò)Ð)­g°d´kÐCTÑ.UÔ.UÐ)õ �”Ô+Ñ,Ô,à)Ð)Ð)r3   c                 ó,   — h | ]}t          |¦  «        ’ŒS rC   )r¹   ©rO   Úis     r1   r  z solve_min_cut.<locals>.<setcomp>?  s   € Ð)TÐ)TÐ)T°Q­#¨a©&¬&Ð)TÐ)TÐ)Tr3   z&Ops banned from re-materialization: %sc                 ó  — |j         t          j        j        j        k    rdS |j        d         }t          j        j                             |¦  «        \  }}|D ]2}|j	        |         }| |u r dS t          |t          ¦  «        r| |v r dS Œ3dS ©NFr   T)r   r€   r<  Úhigher_orderÚauto_functionalizedr¨   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsr©   r‡   r  )ÚaÚbÚ
mutable_opÚmutable_arg_namesr,  r¢   rK  s          r1   Ú!can_fuse_into_auto_functionalizedz8solve_min_cut.<locals>.can_fuse_into_auto_functionalizedB  s�   € ØŒ8•u”yÔ-ÔAÒAÐAØ�5Ø”V˜A”Yˆ
õ Ô#Ô6×GÒGÈ
ÑSÔSñ	
ØØà%ð 	 ð 	 ˆDØ”(˜4”.ˆCØ�CˆxˆxØ�t�tÝ˜#�tÑ$Ô$ð  Ø˜�8�8Ø˜4˜4øØˆur3   c                 ó    — |j         t          j        j        j        k    rdS |j        d         }|D ]}|j        d         |         }| |u r dS ŒdS )NFÚtensors_to_cloner©   T)r   r€   r<  r¯  Ú triton_kernel_wrapper_functionalr©   )r´  rµ  r·  r¢   rK  s        r1   Ú.can_fuse_into_triton_kernel_wrapper_functionalzEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functionalS  sd   € ØŒ8•u”yÔ-ÔNÒNÐNØ�5ØœHÐ%7Ô8ÐØ%ð 	ð 	ˆDØ”(˜8Ô$ TÔ*ˆCØ�CˆxˆxØ�t�tð àˆur3   c                 óH  •— t          |¦  «        t          j        k    rdS  ‰| |¦  «        rdS  ‰| |¦  «        rdS | j        t          j        u r*| j        d         j        t          j        j	        j
        u rdS ‰                     | ¦  «        o‰                     |¦  «        S )NTr   F)r"   r=  Úcatr   r
  r  r¨   r€   r<  r¯  r»  r2   )r´  rµ  r¸  r¼  Úop_typess     €€€r1   r2   z!solve_min_cut.<locals>.is_fusible]  s´   ø€ õ ˜1ÑÔ¥¤Ò)Ð)Ø�4Ø,Ð,¨Q°Ñ2Ô2ð 	Ø�4Ø9Ð9¸!¸QÑ?Ô?ð 	Ø�4àŒH�Ô(Ð(Ð(Ø”�q”	Ô ÝŒyÔ%ÔFðGð Gð
 �5Ø×"Ò" 1Ñ%Ô%Ð@¨(×*=Ò*=¸aÑ*@Ô*@Ð@r3   r   zANeed networkx installed to perform smart recomputation heuristicsc                 ó`  •— ‰                      | ¦  «        rdS | h}t          |¦  «        dk    r|                     ¦   «         }|j        D ]P}‰                     |¦  «        s ‰||¦  «        s dS ‰                      |¦  «        r|                     |¦  «         ŒQt          |¦  «        dk    °dS r®  )r9   rW  rX  ré   r[   rë   )r,   rZ  Úcurr  r2   r¥  r¿  s       €€€r1   Úis_materialized_backwardsz0solve_min_cut.<locals>.is_materialized_backwardsw  sÇ   ø€ Ø×Ò˜DÑ!Ô!ð 	Ø�5Ø�Fˆ	Ý�)‰nŒn˜qÒ Ð Ø—-’-‘/”/ˆCØœ	ð (ð (�Ø ×/Ò/°Ñ5Ô5ð  ¸j¸jÈÈdÑ>SÔ>Sð  Ø˜4˜4Ø×#Ò# DÑ)Ô)ð (Ø—M’M $Ñ'Ô'Ð'øõ �)‰nŒn˜qÒ Ð ð ˆur3   c                 ó  •— | j         dk    rdS | j        t          j        k    rdS | j                             dd ¦  «        t          j        k    rdS t          j	        r‰ 
                    | ¦  «        rdS | j        t          j        j        t          j        j        fv rdS ‰j        r‰                     | ¦  «        sdS n,‰                     | ¦  «        s‰                     | ¦  «        rdS ‰j        r; ‰| ¦  «        r0t(                               d| t-          | j        ¦  «        ¦  «         dS | j        dk     r| j        t          j        k    rdS ‰j        r6t7          d„ | j        D ¦   «         ¦  «        }t;          | ¦  «        }|dz  |k     S dS )	Nr–   Fro   Tzmaterialized backwards: %s %siè  c              3   óh   K  — | ]-}t          |t          j        ¦  «        ¯t          |¦  «        V — Œ.d S r.   )r‡   rA   rB   r0  r«  s     r1   rQ   zBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>°  sM   è è € ð %ð %Ø !µ*¸QÅÄÑ2HÔ2Hð%Ý˜‘”ð%ð %ð %ð %ð %ð %r3   r†   )r¥   r   r
  r  rp   rq   r   r£  r   Úrecompute_viewsr9   r=  Úlift_fresh_copyÚdefaultÚ
lift_freshrl   r;   r7   r5   rk   r$   Údebugr®   ré   Údist_from_bwÚmax_dist_from_bwrm   r-  r¨   r0  )r,   Úinput_tensors_sizeÚoutput_sizerÂ  r¦  r¿  s      €€€r1   Úshould_ban_recomputationz/solve_min_cut.<locals>.should_ban_recomputation…  sÁ  ø€ ØŒ7�oÒ%Ð%Ø�5ØŒ;�(Ô*Ò*Ð*Ø�5ØŒ9�=Š=˜ dÑ+Ô+Õ/?Ô/IÒIÐIØ�4ÝÔ!ð 	 h×&6Ò&6°tÑ&<Ô&<ð 	Ø�5ØŒ;�4Ô/Ô7½¼Ô9PÐQÐQÐQØ�5àÔ2ð 	Ø×+Ò+¨DÑ1Ô1ð Ø�tðð ×!Ò! $Ñ'Ô'ð ¨8×+HÒ+HÈÑ+NÔ+Nð Ø�tð Ô7ð 	Ð<UÐ<UØñ=
ô =
ð 	õ �IŠIÐ5°t½UÀ4Ä:Ñ=NÔ=NÑOÔOÐOØ�4ð Ô˜tÒ#Ð#¨Ô(9½FÔ<SÒ(SÐ(SØ�4ð Ô+ð 	8Ý!$ð %ð %Ø%)¤Yð%ñ %ô %ñ "ô "Ðõ # 4™.œ.ˆKØ ‘?Ð%7Ò7Ð7Øˆur3   c                 ód   •‡ — ‰ j         dk    rdS t          ˆˆ fd„‰ j        D ¦   «         ¦  «         S )Nr•   Tc              3   ó0   •K  — | ]} ‰‰|¦  «        V — Œd S r.   rC   )rO   r  r2   r,   s     €€r1   rQ   z9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>»  s/   øè è € ÐEÐE°$�z�z $¨Ñ-Ô-ÐEÐEÐEÐEÐEÐEr3   )r¥   r  ré   )r,   r2   s   `€r1   Úis_materializedz&solve_min_cut.<locals>.is_materialized·  sA   øø€ ØŒ7�mÒ#Ð#Ø�4åÐEÐEÐEÐEÐE¸$¼*ÐEÑEÔEÑEÔEÐEÐEr3   rK   c           
      ó¤  •— t          | ¦  «        }t          j        r!‰                     | ¦  «        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   é   )r0  r   rÅ  r9   r^  r_  r‡   rp   r   r€   rˆ   ÚINT_INFrc   ÚmaxÚminrÊ  )r,   Úmem_szrÑ  r¿  s     €€r1   Úget_node_weightz&solve_min_cut.<locals>.get_node_weight½  sÁ   ø€ Ý˜$‘”ˆÝÔ!ð 	 h×&6Ò&6°tÑ&<Ô&<ð 	õ ”8ˆOå�d”i Ô&­Ñ5Ô5ð 	å˜dœi¨Ô.µ´Ñ=Ô=ð Ý�õ �V˜s¥c­#¨dÔ.?ÀÑ*EÔ*EÀqÑ&IÔ&IÑIÑJÑKÔKˆØˆ?˜4Ñ Ô ð 	ØˆMà˜A‘:Ðr3   c                 óB  •— ‰                      | ¦  «        rdS | ‰v rdS t          | ¦  «        rdS d| j        v r't          | j        d         t          j        ¦  «        rdS ‰                     | ¦  «         ‰                     d| j        dz   t          j
        ¬¦  «         dS )NFr…   ÚsourceÚ_in©ÚcapacityT)r9   ru   rp   r‡   r€   rŠ   rë   Úadd_edger¢   r^  r_  )r,   Úbanned_nodesÚdont_banÚnx_graphr¿  s    €€€€r1   Úban_recomputation_if_allowedz3solve_min_cut.<locals>.ban_recomputation_if_allowedÙ  s®   ø€ Ø×Ò˜DÑ!Ô!ð 	Ø�5Ø�8ÐÐØ�5õ ˜$ÑÔð 	Ø�5à�D”IÐÐ¥*¨T¬Y°uÔ-=½u¼~Ñ"NÔ"NÐØ�5à×Ò˜ÑÔÐð
 	×Ò˜( D¤I°Ñ$5ÅÄÐÑIÔIÐIØˆtr3   r    rÜ  ÚsinkrÝ  Ú_outr…   r  ç        Ústart_nodesÚ	max_rangec           
      óò  •— g }| D ]-}t          j        |‰	                     |¦  «        |df¦  «         Œ.t          |¦  «        dk    r°t          j        |¦  «        \  }}}|s‰	                     |¦  «        S |j        D ]f}‰	                     |¦  «        rO‰	                     |¦  «        |k    rŒ1t          j        |‰	                     |¦  «        | ‰||¦  «        f¦  «         Œgt          |¦  «        dk    °°|S )z„
        Finds the first unfusible node in the chain of nodes starting from
        `start_nodes` and returns its position.
        Tr   )ÚheapqÚheappushrb   rW  Úheappopré   r[   )
rç  rè  Úsorted_nodesrP   r,  r,   Únode_is_fusibler  r2   r¥  s
           €€r1   Úfind_first_unfusiblez+solve_min_cut.<locals>.find_first_unfusible4  s&  ø€ ð
 9;ˆØð 	Oð 	OˆAÝŒN˜<¨)×*@Ò*@ÀÑ*CÔ*CÀQÈÐ)MÑNÔNÐNÐNå�,ÑÔ !Ò#Ð#Ý',¤}°\Ñ'BÔ'BÑ$ˆAˆt�_Ø"ð 4Ø ×-Ò-¨dÑ3Ô3Ð3Øœ
ð ð �Ø×+Ò+¨DÑ1Ô1ð Ø ×-Ò-¨dÑ3Ô3°iÒ?Ð?Ø Ý”NØ$Ø"×/Ò/°Ñ5Ô5°t¸Z¸ZÈÈdÑ=SÔ=SÐTñô ð øõ �,ÑÔ !Ò#Ð#ð Ðr3   c                 ód   •— g | ],}‰                      |¦  «        ¯‰                     |¦  «        ‘Œ-S rC   )r[   rb   ©rO   r  r¥  s     €r1   rš   z!solve_min_cut.<locals>.<listcomp>M  sK   ø€ ð ð ð àØ×+Ò+¨DÑ1Ô1ðØ×&Ò& tÑ,Ô,ðð ð r3   c                 ó>   •— g | ]}‰                      |¦  «        ¯|‘ŒS rC   )r[   rñ  s     €r1   rš   z!solve_min_cut.<locals>.<listcomp>R  s<   ø€ ð ð ð Ø°I×4LÒ4LÈTÑ4RÔ4RðØðð ð r3   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V — Œd S r.   rC   )rO   rP   râ  s     €r1   rQ   z solve_min_cut.<locals>.<genexpr>¡  s,   øè è € Ð8Ð8¨�Q˜ œÐ$Ð8Ð8Ð8Ð8Ð8Ð8r3   c              3   ó(   •K  — | ]}|‰v ¯‰|fV — Œd S r.   rC   )rO   ÚvÚnon_reachableÚus     €€r1   rQ   z solve_min_cut.<locals>.<genexpr>¢  s1   øè è € ÐAÐA ¨a°=Ð.@Ð.@�q˜!�fÐ.@Ð.@Ð.@Ð.@ÐAÐAr3   éýÿÿÿéüÿÿÿc                 ó   — i | ]\  }}||“Œ	S rC   rC   )rO   ra  r,   s      r1   rL  z!solve_min_cut.<locals>.<dictcomp>¬  s   € ÐHÐHÐH™i˜c 4��cÐHÐHÐHr3   c              3   ó(   •K  — | ]}‰|         V — Œd S r.   rC   ©rO   r,   Úname_to_nodes     €r1   rQ   z solve_min_cut.<locals>.<genexpr>®  s(   øè è € Ð2Ð2 ˆ�dÔ	Ð2Ð2Ð2Ð2Ð2Ð2r3   c                 ó   •— ‰|          S r.   rC   )r˜   Únode_idxs    €r1   rS   zsolve_min_cut.<locals>.<lambda>®  s   ø€ À(È1Ä+€ r3   rT   ):rê   Úget_default_op_listr#   ry   r+   r$   r7  ÚnetworkxÚImportErrorr¬   ÚfloatÚDiGraphr¥   rH   rF   rß  r¢   r^  r_  ru   r¼   r»   r[   rp   r‡   r€   r'  r   r‹   rq   r   ré   r	   rA   rB   rc   ri   rX   rW  rÖ  r®   rb   rj   rê  rì  rë   rë  Úminimum_cutÚ	ExceptionÚjoinÚ	readwriteÚedgelistÚgenerate_edgelistÚvisualize_min_cut_graphÚupdateÚget_name_to_noder]  rV   )0r�   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_namerÜ   rà  r¸  r¼  r2   rÑ  rÂ  rþ  r   r÷  râ  r¿  rø  s0    ```                                @@@@@@@@@@@@r1   Úsolve_min_cutr&  /  sx	  øøøøøøøøøøøøøøø€ ð ÐÝ‘5”5ˆÝ"Ñ$Ô$€Håð Hð
ð 
à#Ô)ð
ñ 
ô 
Ðð
 'Ð)TÐ)T¸(Ô:SÐ)TÑ)TÔ)TÑTˆÝ�ŠÐ9¸;ÑGÔGÐGðð ð ð"ð ð ðAð Að Að Að Að Að Að&ØÐÐÐÐøÝð ð ð ÝØRñ
ô 
àð	øøøøðøøøð
ð ð ð ð ð ð ð0ð 0ð 0ð 0ð 0ð 0ð 0ðdFð Fð Fð Fð Fð¥ð ð ð ð ð ð ð ð2 �zŠz‰|Œ|€HÝ‘5”5€Lðð ð ð ð ð ð ð ð* Ô!ð 3Xñ 3XˆØŒ7�hÒÐØà�9Ô.Ð.Ð.Ø˜9Ô+Ð+Ð+Ø×!Ò! $¤)¨eÑ"3°VÅdÄhÐ!ÑOÔOÐOØð ×Ò˜dœi¨&Ñ0°&Å4Ä8ÐÑLÔLÐLå˜$ÑÔð 	ð
 ×Ò˜dœi¨%Ñ/°Å$Ä(ÐÑKÔKÐKØå�dÑÔð 	/Õ2°4Ñ8Ô8ð 	/Ø(Ð(¨Ñ.Ô.Ð.ð
 ×#Ò# DÑ)Ô)ð 	/Ð.FÐ.FÀtÑ.LÔ.Lð 	/Ø(Ð(¨Ñ.Ô.Ð.ð ˜œÐ"ÐE }¸D¼IÐ'EðUà�t”yÐ ÐS­°D´I¸eÔ4DÅeÄlÑ)SÔ)SÐ%Sð 	õ �tÑÔð 	+Ý�=¨Ñ.Ô.Ñ/Ô/ˆFˆFØð 	+å! $¤)§-¢-°Ñ"6Ô"6½ÑFÔFÐT��ÍDÌHð ˆFð %�_ TÑ*Ô*ˆFà×Ò˜$œ) eÑ+¨T¬Y¸Ñ-?È&ÐÑQÔQÐQØ”Jð 	Xð 	XˆDØ×Ò˜dœi¨&Ñ0°$´)¸eÑ2CÍdÌhÐÑWÔWÐWÐWñ	Xð(­$­r¬w¬-ð ÅCð ÍCð ð ð ð ð ð ð ð. Ô,ñ ;Ø"Ô4ð 	;ð 	;ˆIðð ð ð à%œOðñ ô ˆFð
ð ð ð Ø!*¤ðñ ô ˆHõ �6‰{Œ{˜QŠˆØ&:Ð&:¸8ÅSÈÁ[Ä[Ñ&QÔ&QÐ#Ý! )¤/Ñ2Ô2ð ;ð ;�Dà!×0Ò0°Ñ6Ô6ð;à%×2Ò2°4Ñ8Ô8Ð;NÒNÐNØ&˜J y°$Ñ7Ô7ð Oð   <Ð/Ð/Ø$ÝŸšØOØ%Ø%×2Ò2°9Ñ=Ô=Ø/Ø Ø%×2Ò2°4Ñ8Ô8ñô ð ð 5Ð4°TÑ:Ô:Ð:øøð Ô1ñ !VÝ‘%”%ˆØ%Ô+ð 	Vñ 	VˆJØ×+Ò+¨JÑ7Ô7ð ØØ!×.Ò.¨zÑ:Ô:¸JÐGÐHˆGØ#×0Ò0°Ñ<Ô<ˆKÝ�g‘,”, Ò"Ñ"Ýœ wÑ/Ô/‘��3Ø˜'�>�>ØØ—’˜CÑ Ô Ð ð ×*Ò*¨3Ñ/Ô/°+ÀÑ2CÒCÐCÝ˜G™œ¨Ò)Ð)å—H’HØ.ØØ"Ø!×.Ò.¨sÑ3Ô3Ø!×.Ò.¨zÑ:Ô:ñô ð ð 1Ð0°Ñ5Ô5Ð5ØàœIð Vð V�Dà!×0Ò0°Ñ6Ô6ðVà&˜J s¨DÑ1Ô1ðVð !¨Ð4Ð4åœ w°×1GÒ1GÈÑ1MÔ1MÈtÐ0TÑUÔUÐUøõ5 �g‘,”, Ò"Ñ"ùð8Ø!Ÿ~š~¨h¸À&ÑIÔIÑˆ	�9�9øÝð ð ð Ý�ŠÐ@ÑAÔAÐAÝ�Š�—’˜2œ<Ô0×BÒBÀ8ÑLÔLÑMÔMÑNÔNÐNÝ Ñ)Ô)Ð)Øð	øøøð  )Ñ€Iˆ}Ý#&¡5¤5€FØ8Ð8Ð8Ð8¨iÐ8Ñ8Ô8ð Bð B‰ˆˆ4Ø�ŠÐAÐAÐAÐAÐA dÐAÑAÔAÑAÔAÐAÐAå‘”€IØ#ð !ð !Ñˆ�Ø�s˜�sŒ|˜x¨¨¨œ}Ò,Ð,Ð,Ð,Ø˜C˜R˜C”Lˆ	Ø�Š�iÑ Ô Ð Ð å# KÑ0Ô0€LàHÐH­9°[Ô5FÑ+GÔ+GÐHÑHÔH€HÝØ2Ð2Ð2Ð2¨	Ð2Ñ2Ô2Ð8MÐ8MÐ8MÐ8Mðñ ô €Lð ˜Ð%Ð%s%   ÂB Â
B'ÂB"Â"B'×)X ØA?Zc                 ó4  — dd l }dd l}|j                             | ¦  «                             ¦   «         }|                     |¦  «        d         }|                     ¦   «         D ]„}| |                     ¦   «                  |                     ¦   «                  d         }| 	                    t          |¦  «        ¦  «         |t          d¦  «        k    r|                     d¦  «         Œ…t                               d¦  «         |                     d¦  «         d S )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$   r7  Ú	write_svg)râ  r  r)  Ú
dot_formatÚ	dot_graphÚedger  s          r1   r  r  ³  sÿ   € ØÐÐÐØ€L€L€Là”×%Ò% hÑ/Ô/×9Ò9Ñ;Ô;€JØ×)Ò)¨*Ñ5Ô5°aÔ8€IØ×#Ò#Ñ%Ô%ð "ð "ˆØ˜$Ÿ/š/Ñ+Ô+Ô,¨T×-AÒ-AÑ-CÔ-CÔDÀZÔPˆà�Š•s˜6‘{”{Ñ#Ô#Ð#à•U˜5‘\”\Ò!Ð!Ø�NŠN˜5Ñ!Ô!Ð!øÝ‡H‚HÐAÑBÔBÐBØ×ÒÐ,Ñ-Ô-Ð-Ð-Ð-r3   c                  ó6  — g t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j	        ‘t           j
        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j        ‘t           j         ‘t           j!        ‘t           j"        ‘t           j#        ‘t           j$        ‘t           j%        ‘t           j&        ‘t           j'        ‘t           j(        ‘t           j)        ‘t           j*        ‘t           j+        ‘t           j,        ‘t           j-        ‘t           j.        ‘t           j/        ‘t           j0        ‘t           j1        ‘t           j2        ‘t           j3        ‘t           j4        ‘t           j5        ‘t           j6        ‘t           j7        ‘t           j8        ‘t           j9        ‘t           j:        ‘t           j;        ‘t           j<        ‘t           j=        ‘t           j>        ‘t           j?        ‘t           j@        ‘t           jA        ‘t           jB        ‘t           jC        ‘t           jD        ‘t           jE        ‘t           jF        ‘tŽ          jH        ‘t           jI        ‘t           jJ        ‘t           jK        ‘t           jL        ‘} t           jI        t           jJ        t           jM        g}|t           jN        t           jO        t           jP        t¢          jR        t           jS        t           jT        t           jU        t           jV        gz  }|}| g t¢          j        ‘t¢          jW        ‘t           jX        ‘t           jL        ‘t           jY        ‘t¢          jZ        ‘t¢          j@        ‘t           jZ        ‘t           j[        ‘t¢          jR        ‘t           jV        ‘t           j\        ‘t           jN        ‘t           jS        ‘t           jO        ‘t           j]        ‘t           j^        ‘t           j_        ‘t           j`        ‘t           ja        ‘t           jb        ‘t           jc        ‘t           jd        ‘t           je        ‘t           jf        ‘t           jg        ‘t           jh        ‘t           jT        ‘t           ji        ‘t           jj        ‘t           jk        ‘t           jl        ‘t           jm        ‘t¢          jn        ‘t¢          jo        ‘z  } | t           jp        t           jq        gz  } | |z  } | tå          ¦   «         z  } | t           js        gz  } | d„ tè          D ¦   «         z  } të          | ¦  «        }t           jv        t           jw        t           jx        g}t           jy        t           jz        t           j{        t           j|        t           j}        t           j~        t           j        t           j€        t           j�        t           j‚        t           jƒ        g}|të          |¦  «        z  }�t	          të          |¦  «        të          |¦  «        të          |¦  «        të          |¦  «        të          |¦  «        ¦  «        S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS rC   )r   )rO   Úms     r1   rš   z'get_default_op_list.<locals>.<listcomp>M  s!   € Ð NÐ NÐ N¸1Õ!3°AÑ!6Ô!6Ð NÐ NÐ Nr3   )…r=  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_indicesÚindexÚgatherrG  Ú
zeros_liker   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*   r+   r)   r(   r'   s          r1   r  r  Ä  sl  € ð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ðG$!ñ $ÐðL ¥¤­T¬[Ð 9Ñ9ÐØ Ñ(Ðà¥¡¤Ñ/ÐàÝŒð!ñ Ðð Ð NÐ NÅÐ NÑ NÔ NÑNÐÝÐ3Ñ4Ô4ÐåÔ%¥t¤~µt´ÐG€JåŒÝÔÝÔ!ÝŒÝŒ
ÝÔ0ÝÔ4ÝÔ%ÝÔ)ÝÔ ÝŒðÐð #¥S¨¡_¤_Ñ4€KÞÝˆKÑÔÝÐ!Ñ"Ô"ÝˆJ‰ŒÝˆH‰ŒÝÐÑÔñô ð r3   c                 ó2   — i }| j         D ]}|||j        <   Œ|S r.   )ry   r¢   )rx   rþ  r,   s      r1   r  r  i  s-   € Ø€LØ”ð 'ð 'ˆØ"&ˆ�T”YÑÐØÐr3   Ú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 t          |¦  «        r ||| |||¦  «        \  }}d||fS t          d|› �¦  «        ‚)NÚgreedyÚilpÚdpræ  z,Not aware of memory budget knapsack solver: )r   Úactivation_memory_budget_solverr   r   r   Úcallabler¬   )	r�   r´  rµ  r¶  r¥  r·  ÚSOLVERÚsaved_node_idxÚrecomp_node_idxs	            r1   Ú#_optimize_runtime_with_given_memoryrÁ  p  s¸   € õ Ô3€FØ�ÒÐÝ˜v x°Ñ<Ô<Ð<Ø	�5ŠˆÝ˜F H¨jÑ9Ô9Ð9Ø	�4ŠˆÝ˜6 8¨ZÑ8Ô8Ð8Ý	�&Ñ	Ô	ð TØ*0¨&Ø�K ¨YÐ8Uñ+
ô +
Ñ'ˆ˜ð �^ _Ð5Ð5åÐRÈ&ÐRÐRÑSÔSÐSr3   ©Úno_dispatchc                 óL  ‡ ‡‡	— t           j        }d„ }|dk    rdS |dk    rnt          ¦   «         5  ddlm} t          j        |‰ j        ‰ j        f¦  «        \  ŠŠ	| 	                    ˆˆ	ˆ fd„¦  «        }|cd d d ¦  «         S # 1 swxY w Y   d S |dk    rdd	l
m} t          j        |‰ j        ‰ j        f¦  «        \  ŠŠ	 |d
¬¦  «        5 } ‰ j        ‰i ‰	¤Ž d d d ¦  «         n# 1 swxY w Y   |                     ¦   «         }t          |d¦  «        S t          d|› �¦  «        ‚)Nc                 ó  ‡— t          | t          j        ¦  «        r‡t          | j        d         t          j        ¦  «        rbt          | j        d         j        ¦  «        }d„ Šˆfd„|D ¦   «         }| j        d                              || j        d         j	        ¬¦  «        S t          | t          j        ¦  «        rAt          | j        d         t          j
        ¦  «        rt          | j        d         d¬¦  «        S t          | t          j        ¦  «        r't          | j        d         t          j        ¦  «        rdS t          | t          j        ¦  «        r't          | j        d         t          j        ¦  «        rd	S | S )
Nr…   c                 ó$   — t          | d¬¦  «        S )Nr$  r%  )r   )Úds    r1   Úrealize_symbolzAestimate_runtime.<locals>.materialize_arg.<locals>.realize_symbol’  s   € Ý ¨DÐ1Ñ1Ô1Ð1r3   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rC   rC   )rO   ræ   rÈ  s     €r1   rš   z=estimate_runtime.<locals>.materialize_arg.<locals>.<listcomp>•  s#   ø€ Ð6Ð6Ð6¨1�^�^ AÑ&Ô&Ð6Ð6Ð6r3   r  )Ústrider$  r%  g      ð?T)r‡   rA   rB   rp   r€   r'  r  ÚshapeÚnew_empty_stridedrÊ  rˆ   r   rŠ   r‰   )r˜   rË  rÈ  s     @r1   Úmaterialize_argz)estimate_runtime.<locals>.materialize_argŽ  sS  ø€ Ý�a�œÑ!Ô!ð 	¥j°´¸´ÅÄÑ&MÔ&Mð 	Ý˜œ œÔ,Ñ-Ô-ˆEð2ð 2ð 2ð 7Ð6Ð6Ð6°Ð6Ñ6Ô6ˆEØ”6˜%”=×2Ò2Ø˜aœf ]Ô3Ô:ð 3ñ ô ð õ ˜�2œ7Ñ#Ô#ð 	­
°1´6¸%´=Å%Ä,Ñ(OÔ(Oð 	Ý˜AœF 5œM°DÐ9Ñ9Ô9Ð9Ý˜�2œ7Ñ#Ô#ð 	­
°1´6¸%´=Å%Ä.Ñ(QÔ(Qð 	Ø�3Ý˜�2œ7Ñ#Ô#ð 	­
°1´6¸%´=Å%Ä-Ñ(PÔ(Pð 	Ø�4àˆHr3   Útestingr   Úprofiler   )Úbenchmarkerc                  ó   •—  ‰j         ‰ i ‰¤ŽS r.   )r   )r¨   r©   r,   s   €€€r1   rS   z"estimate_runtime.<locals>.<lambda>ª  s   ø€ °;°4´;ÀÐ3OÈÐ3OÐ3O€ r3   Ú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
   `       @@r1   Úestimate_runtimerß  ‹  sî  øøø€ ÝÔD€Lðð ð ð( �yÒ Ð Øˆqà	˜Ò	"Ð	"Ý‰]Œ]ð 	ð 	ØHÐHÐHÐHÐHÐHå!œ?¨?¸T¼YÈÌÐ<TÑUÔU‰LˆD�&Ø×*Ò*Ð+OÐ+OÐ+OÐ+OÐ+OÐ+OÑPÔPˆBØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 
˜Ò	 Ð	 à<Ð<Ð<Ð<Ð<Ð<å” ¸¼ÀDÄKÐ8PÑQÔQ‰ˆˆfØˆ_ UÐ+Ñ+Ô+ð 	)¨tØˆDŒK˜Ð( Ð(Ð(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)à×,Ò,Ñ.Ô.ˆÝ�= !Ñ$Ô$Ð$åÐL¸lÐLÐLÑMÔMÐMs$   ¯ABÂBÂ	BÃC%Ã%C)Ã,C)c                 ó*  ‡‡‡‡‡‡‡‡ ‡!‡"‡#— |dk    s|dk     rt          d|› �¦  «        ‚t          t          j        t          j        t          j        t          j        t          j        ¬¦  «        }t          j        rt          |dddd¬¦  «        }|dk    r|j
        S t          | ||¦  «        \  }}|dk    r|S 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Š ˆ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 ˆfd„‰D ¦   «         Š d„ ‰D ¦   «         Š#ddlmŠ" ˆˆˆ ˆ"ˆ#fd„}t          j        �ržg }t3          ddd¦  «        D ]G} ||dz  || ¬¦  «        \  }}|                     |t7          ‰#¦  «        |z
   ||¦  «        f¦  «         ŒHdd lm} d„ |D ¦   «         }d „ |D ¦   «         }|                     d!¬"¦  «         |                     ||d#¬$¦  «         tA          |¦  «        D ])\  }}| !                    |d%›|||         fd&d'd(¬)¦  «         Œ*| "                    d*¦  «         | #                    d+¦  «         | $                    d,¦  «         | %                    d¦  «         | &                    ¦   «         }| '                    ¦   «          d-tQ          ¦   «         › d.�}| )                    |¦  «         tT           +                    d/|¦  «          |||| ¬0¦  «        d         S )1Nr   r   zJThe valid ranges for memory budget are 0 <= m <= 1. The provided value is )ri   rj   rk   rl   rm   F)ri   rj   rk   rl   rÜ   rK   c                 óL   — t          t          t          | ¦  «        ¦  «        dz  S ©Nç    eÍÍA)r-  Úmapr0  )rÜ   s    r1   Úestimate_activations_sizez:choose_saved_values_set.<locals>.estimate_activations_sizeß  s   € Ý•3•x Ñ.Ô.Ñ/Ô/°#Ñ5Ð5r3   c                 ó   •— | dz  ‰‰z
  z  S râ  rC   )ÚszÚmax_act_sizeÚmin_act_sizes    €€r1   Úget_normalized_sizez4choose_saved_values_set.<locals>.get_normalized_sizeè  s   ø€ Ø�S‘˜\¨LÑ8Ñ9Ð9r3   Úactivationsc                 ó,   •—  ‰| ¦  «        ‰z
  ‰‰z
  z  S r.   rC   )rë  rå  rè  ré  s    €€€r1   Úget_mem_ratioz.choose_saved_values_set.<locals>.get_mem_ratioë  s(   ø€ Ø)Ð)¨+Ñ6Ô6¸ÑEØ˜<Ñ'ñ
ð 	
r3   )ri   rj   rk   )rl   )Úget_node_storagec                 ó&   •— h | ]} ‰|¦  «        ’ŒS rC   rC   )rO   r,   rî  s     €r1   r  z*choose_saved_values_set.<locals>.<setcomp>	  s%   ø€ ÐJÐJÐJ°Ð&Ð& tÑ,Ô,ÐJÐJÐJr3   rà  c                 ó"   •— ˆˆfd„| D ¦   «         S )Nc                 ó^   •— g | ])}|j         t          d ¦  «        k     r ‰|¦  «        ‰v¯'|‘Œ*S )rã  )rÊ  rc   )rO   r¬  rî  Úinput_storagess     €€r1   rš   zRchoose_saved_values_set.<locals>.get_recomputable_banned_nodes.<locals>.<listcomp>  sP   ø€ ð 
ð 
ð 
àð ”¥ S¡¤Ò)Ð)Ø$Ð$ QÑ'Ô'¨~Ð=Ð=ð ð
 >Ð=Ð=r3   rC   )rà  rî  rò  s    €€r1   Úget_recomputable_banned_nodesz>choose_saved_values_set.<locals>.get_recomputable_banned_nodes  s3   ø€ ð
ð 
ð 
ð 
ð 
à!ð
ñ 
ô 
ð 	
r3   c                 ó   — | j         S r.   rå   r(  s    r1   rS   z)choose_saved_values_set.<locals>.<lambda>  s
   € ÐPQÔPV€ r3   rT   Tr4  c                 ó@   •— g | ]} ‰t          |¦  «        ¦  «        ‘ŒS rC   ©r0  )rO   r¬  rê  s     €r1   rš   z+choose_saved_values_set.<locals>.<listcomp>#  s8   ø€ ð ð ð Ø-.ÐÐ�H Q™KœKÑ(Ô(ðð ð r3   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rC   )rß  rÕ   s     r1   rš   z+choose_saved_values_set.<locals>.<listcomp>&  s.   € ð ð ð Ø#'Õ˜ÑÔðð ð r3   rÂ  c                 óV  •‡‡—  ‰¦   «         5  t          |‰‰t          | d¦  «        |‰¦  «        \  }}}t          rét          ‰¦  «        Šˆfd„t          t	          ‰‰‰¦  «        ¦  «        D ¦   «         }d„ |j        D ¦   «         }d„ |j        D ¦   «         }dt          j        › dt          t          j        d¦  «        › d|› d|› d	d
 	                    |¦  «        › d|› d|› d|› d�Št          j                             dˆfd„¬¦  «         t                               ‰¦  «         d d d ¦  «         n# 1 swxY w Y   t          ¦   «         }	|D ].}
	 |	                     ‰|
         ¦  «         Œ# t"          $ r Y Œ+w xY w|	                     ‰¦  «        sJ ‚t'          ||‰|	¦  «        \  }}||fS )Nr   c                 óz   •— g | ]7\  }\  }}}d |› d|› d|‰z  › d|j         › d|j        › d|j        › d|j        › �‘Œ8S )z
			z, )r¥   r   rp   r¨   )rO   r   r´  Úruntimer,   Úmax_runtimes        €r1   rš   zNchoose_saved_values_set.<locals>.get_saved_values_knapsack.<locals>.<listcomp>=  s€   ø€ ð 	!ð 	!ð 	!á6˜Ñ6 ¨°ð ~˜uÐ}Ð}¨Ð}Ð}°'¸KÑ2GÐ}Ð}È4Ì7Ð}Ð}ÐVZÔVaÐ}Ð}ÐeiÔenÐ}Ð}ÐrvÔr{Ð}Ð}ð	!ð 	!ð 	!r3   c                 ó   — g | ]	}|j         ‘Œ
S rC   rå   rÕ   s     r1   rš   zNchoose_saved_values_set.<locals>.get_saved_values_knapsack.<locals>.<listcomp>G  s   € Ð$MÐ$MÐ$M°4 T¤YÐ$MÐ$MÐ$Mr3   c                 ó>   — g | ]}|j         D ]}|j        |j        f‘ŒŒS rC   )rY  r¢   )rO   r,   Úinps      r1   rš   zNchoose_saved_values_set.<locals>.get_saved_values_knapsack.<locals>.<listcomp>H  sK   € ð %ð %ð %àØ#Ô3ð%ð %ð ð ”X˜tœyÐ)ð%ð %ð %ð %r3   zQ
Activation Checkpointing - Knapsack Problem Summary:
    Input:
        Solver: z
        Max Memory: z
        Graph Nodes: z
        Graph Edges: zC
        (Index, Memory, Runtime, Node.Op, Node.Target, Metadata): Ú z'
    Output:
        Expected Runtime: z
        Saved Nodes: z
        Recomputable Nodes: z
            Úartifactc                  ó   •— ‰ S r.   rC   )Úknapsack_summarys   €r1   rS   zLchoose_saved_values_set.<locals>.get_saved_values_knapsack.<locals>.<lambda>\  s   ø€ Ð'7€ r3   )r¢   Ú
payload_fn)rÁ  rÖ  r#   r]  Úzipry   r   r¼  Úactivation_memory_budgetr  r€   Ú_loggingÚtrace_structuredr$   r7  rê   rë   ÚBaseExceptionÚissubsetr&  )Úmemory_budgetr¥  r�   Úexpected_runtimeÚsaved_node_idxsÚrecomputable_node_idxsÚinput_summaryÚjoint_graph_nodesÚjoint_graph_edgesrá  ra  rÜ   r,  r  rû  Úaggressive_optionsr·  Úmemories_banned_nodesrÃ  Úruntimes_banned_nodess                @@€€€€€r1   Úget_saved_values_knapsackz:choose_saved_values_set.<locals>.get_saved_values_knapsack+  sÍ  øøø€ Øˆ[‰]Œ]ð 2	+ð 2	+õ
 4ØØ%Ø%Ý�M 1Ñ%Ô%ØØ-ñô ñ	Ø ØØ&õ %ð %+Ý!Ø)ñô �ð	!ð 	!ð 	!ð 	!å:CÝØ1Ø1Ø9ñô ñ;ô ;ð	!ñ 	!ô 	!�ð %NÐ$M¸;Ô;LÐ$MÑ$MÔ$MÐ!ð%ð %à +Ô 1ð%ñ %ô %Ð!ð
$õ Ô7ð$ð $õ �Ô8¸!Ñ<Ô<ð	$ð $ð
 (ð$ð $ð (ð$ð $ð DFÇ7Â7È=ÑCYÔCYð$ð $ð ,ð$ð $ð &ð$ð $ð 4ð$ð $ð $Ð õ ”×/Ò/Ø#Ø7Ð7Ð7Ð7ð 0ñ ô ð õ —’Ð)Ñ*Ô*Ð*ðe2	+ð 2	+ð 2	+ñ 2	+ô 2	+ð 2	+ð 2	+ð 2	+ð 2	+ð 2	+ð 2	+øøøð 2	+ð 2	+ð 2	+ð 2	+õf ‘5”5ˆØ)ð 	ð 	ˆCðØ—’Ð:¸3Ô?Ñ@Ô@Ð@Ð@øÝ ð ð ð Ø�ðøøøð × Ò Ð!>Ñ?Ô?Ð?Ð?Ð?å'ØØØØñ	
ô 
‰ˆ�að Ð-Ð-Ð-s$   ŽDD1Ä1D5Ä8D5ÅE+Å+
E8Å7E8rÓ  éÿÿÿÿéûÿÿÿ)r¥  r�   c                 ó   — g | ]
}|d          ‘ŒS )rÔ  rC   ©rO   Úitems     r1   rš   z+choose_saved_values_set.<locals>.<listcomp>�  ó   € Ð0Ð0Ð0 �D˜”GÐ0Ð0Ð0r3   c                 ó   — g | ]
}|d          ‘ŒS ©r   rC   r  s     r1   rš   z+choose_saved_values_set.<locals>.<listcomp>‚  r  r3   )é
   é   )ÚfigsizeÚo)Úmarkerz.2fzoffset points)r   r  Úcenter)Ú
textcoordsÚxytextÚhazMemory Budgetz Runtime of Recomputed Componentsz:Pareto Frontier of Memory Budget vs. Recomputation RuntimeÚmemory_budget_pareto_z.pngz%Generated Pareto frontier curve at %s)r
  r¥  r�   ),r¬   rh   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   rF   r&  r	   rA   rB   r  Útorch._inductor.fx_utilsrî  r   rV   r0  rW  Útorch.utils._mode_utilsrÃ  Úvisualize_memory_budget_paretoÚranger­   r-  Úmatplotlib.pyplotÚpyplotÚfigureÚplotr]  ÚannotateÚxlabelÚylabelÚtitleÚgridÚgcfÚshowr   Úsavefigr$   Úwarning)$r�   r¥  r
  r¦  Úruntime_optimized_saved_valuesr,  rí  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesrà  ró  Úrecomputable_banned_nodesr  ÚoptionsÚsweep_memory_budgetrÜ   r  ÚpltÚx_valuesÚy_valuesr¬  ÚtxtÚfigÚfig_namer  r·  rå  rî  rê  rò  rè  r  ré  rÃ  r  s$                            @@@@@@@@@@@r1   Úchoose_saved_values_setrK  º  sç  øøøøøøøøøøø€ ð
 �qÒÐ˜M¨AÒ-Ð-ÝØhÐYfÐhÐhñ
ô 
ð 	
õ $Ý$ÔAÝ#)Ô#KÝ%+Ô%OÝ &Ô EÝÔ8ðñ ô €Oõ Ô&ð 
Ý!ØØ"'Ø',Ø).Ø$)ð
ñ 
ô 
ˆð ˜ÒÐØÔÐå(5ØØØñ)ô )Ñ%Ð" Að ˜ÒÐØ-Ð-ð6µµR´W´ð 6Å%ð 6ð 6ð 6ð 6ð -Ð,¨YÔ-=Ñ>Ô>€LØ,Ð,Ð-KÑLÔL€Là�|Ò#Ð#Ø-Ð-ð:ð :ð :ð :ð :ð :ð
¥4­¬¤=ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
õ
 &ØØ#Ø#(Ø%*ð	ñ ô Ðõ '4Ø�YÐ 7ñ'ô 'Ñ#Ð  !ð €}Ð1Ñ2Ô2°]ÒBÐBØ+Ð+å ØØ %ðñ ô Ðõ ;HØ�YÐ 2ñ;ô ;Ñ7Ð)¨<ð €}Ð:Ñ;Ô;¸mÒKÐKØ4Ð4à9Ð9Ð9Ð9Ð9Ð9àJÐJÐJÐJ¸Ô9IÐJÑJÔJ€Nð	
µC½¼´Lð 	
ÅTÍ"Ì'Ä]ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð !>Ð =¸lÑ KÔ KÐå &Ð'@ÐFVÐFVÐ WÑ WÔ WÐõ %+Ø!¥x¸ð%ñ %ô %Ð!õ Ð(Ñ)Ô)¨QÒ.Ð.ØÔÐðð ð ð Ø2Oðñ ô Ððð Ø+Hðñ ô Ðð 4Ð3Ð3Ð3Ð3Ð3ðD.ð D.ð D.ð D.ð D.ð D.ð D.ð D.ð D.õL Ô,ñ )GØˆÝ#(¨¨b°"Ñ#5Ô#5ð 
	ð 
	ÐØ-FÐ-FØ# cÑ)°YÈKð.ñ .ô .Ñ*ˆLÐ*ð �NŠNà'ÝÐ-Ñ.Ô.Ð1AÑAØ!�M ,Ñ/Ô/ðñô ð ð ð 	(Ð'Ð'Ð'Ð'Ð'à0Ð0¨Ð0Ñ0Ô0ˆØ0Ð0¨Ð0Ñ0Ô0ˆð 	�
Š
˜7ˆ
Ñ#Ô#Ð#Ø�Š�˜8¨CˆÑ0Ô0Ð0õ   Ñ)Ô)ð 	ð 	‰FˆAˆsØ�LŠLØ��Ø�h˜q”kÐ"Ø*ØØð ñ ô ð ð ð 	�
Š
�?Ñ#Ô#Ð#Ø�
Š
Ð5Ñ6Ô6Ð6Ø�	Š	ÐNÑOÔOÐOØ�Š�‰ŒˆØ�gŠg‰iŒiˆØ�Š‰
Œ
ˆ
ØEÕ+=Ñ+?Ô+?ÐEÐEÐEˆØ�Š�HÑÔÐÝ�ŠÐ;¸XÑFÔFÐFð %Ð$Ø#¨yÀkðñ ô àô	ð 	r3   Úinductorc                óÊ  ‡— | 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¦  «        |_        Œ"|
                     |¦  «        sd|_        Œ?t          d¦  «        |_        |j        D ]$}t'          |j        |j        dz   ¦  «        |_        Œ%Œ€t          j        }|j        D ]?}t+          |j                             dd¦  «        t0          ¦  «        r|j        d         } nŒ@t3          ||
|¬	¦  «        }t5          t7          t8          |¦  «        ¦  «        }t5          t7          d
„ |¦  «        ¦  «        }t;          | ||‰¬¦  «        \  }}|r$|r"t=          | ||t          |¦  «        ¦  «        \  }}t?          |¦  «        }t@          �rˆtC          d„ |D ¦   «         ¦  «        }tE          d„ |D ¦   «         ¦  «        dz  }tF           $                    d|¦  «         tF           $                    d|¦  «         d„ |j         j        D ¦   «         }d„ |j         j        D ¦   «         }||z  }tK          t          ¦  «        }|j         j        D ]G}|j&        |v r<tO          |j(        d¦  «        r'|tS          |j(        j*        ¦  «        xx         dz  cc<   ŒHtF           $                    dt          |¦  «        t          |¦  «        t          |¦  «        ¦  «         tC          | +                    ¦   «         d„ d¬¦  «        }tF           $                    d|¦  «         ||fS )ax  
    Partitions the joint graph such that the backward recomputes the forward.
    Recomputing helps in trading off memory bandwidth with computation.

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

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

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

    Returns:
        Returns the generated forward and backward Fx graph modules.
    c                 ó\  •‡‡‡— t          | j        ¦  «        Št          ¦   «         Š| j        j        D ]s}|j        dk    rd|j        v r‰                     |¦  «         n$t          |¦  «        r‰                     |¦  «         |‰v r|j        D ]}‰                     |¦  «         ŒŒtt          t          t          | j        j        ¦  «        ¦  «        }t          t          t          | j        j        ¦  «        ¦  «        }||z   }t          | ‰¬¦  «        \  }}‰                     d„ |D ¦   «         ¦  «         t          | j        ||d¦  «        }ˆfd„|j        D ¦   «         Šˆˆfd„| j        j        D ¦   «         }	d}
i }| j        j        D ]}|‰v r
|
||<   |
d	z  }
Œt!          |‰‰|	|¦  «        S )
Nr•   r¸   rã   c              3   ó4   K  — | ]}|®|j         dk    ¯|V — Œd S )Nr    rÖ   )rO   r   s     r1   rQ   zNmin_cut_rematerialization_partition.<locals>.classify_nodes.<locals>.<genexpr>í  s;   è è € ð !
ð !
Ø a m¸¼ÀÒ8HÐ8HˆAÐ8HÐ8HÐ8HÐ8Hð!
ð !
r3   rç   c                 ó@   •— h | ]}|j         d k    ¯‰|j                 ’ŒS r  r  rý  s     €r1   r  zNmin_cut_rematerialization_partition.<locals>.classify_nodes.<locals>.<setcomp>ó  s7   ø€ ð +
ð +
ð +
àØŒw˜(Ò"Ð"ð ˜œÔ#à"Ð"Ð"r3   c                 ó$   •— h | ]}|‰v¯|‰v¯
|’ŒS rC   rC   )rO   r,   rH   rX   s     €€r1   r  zNmin_cut_rematerialization_partition.<locals>.classify_nodes.<locals>.<setcomp>ø  s:   ø€ ð 
ð 
ð 
àØÐ,Ð,Ð,°Ð=NÐ1NÐ1Nð à1NÐ1NÐ1Nr3   r   r   )r  rx   rê   ry   r¥   r   rë   r£   ré   r  rè   r¼   r»   rÛ   r  rµ   rE   )rÒ   r,   r  ró   rõ   rF   rÙ   rÚ   r  rI   Úfw_cntrJ   rþ  rH   rX   rØ   s               @@@€r1   Úclassify_nodesz;min_cut_rematerialization_partition.<locals>.classify_nodesØ  s=  øøøø€ Ý'¨Ô(:Ñ;Ô;ˆÝ™EœEÐØ Ô&Ô,ð 	0ð 	0ˆDØŒw˜-Ò'Ð'¨J¸$¼+Ð,EÐ,EØ!×%Ò% dÑ+Ô+Ð+Ð+Ý% dÑ+Ô+ð ,Ø!×%Ò% dÑ+Ô+Ð+àÐ(Ð(Ð(Ø œJð 0ð 0�DØ%×)Ò)¨$Ñ/Ô/Ð/Ð/øå�V¥J°Ô0BÔ0HÑIÔIÑJÔJˆÝ!%ÝÕ&¨Ô(:Ô(@ÑAÔAñ"
ô "
Ðð Ð!7Ñ7ˆÝ#;Ø¨/ð$
ñ $
ô $
Ñ ˆ�[ð 	× Ò ð !
ð !
Ø"ð!
ñ !
ô !
ñ 	
ô 	
ð 	
õ @ØÔ ¨°Yñ
ô 
Ðð+
ð +
ð +
ð +
à*Ô0ð+
ñ +
ô +
Ðð

ð 
ð 
ð 
ð 
à$Ô*Ô0ð
ñ 
ô 
ˆð
 ˆØˆØ Ô&Ô,ð 	ð 	ˆDØÐ(Ð(Ð(Ø!'�˜‘Ø˜!‘�øÝØÐ%Ð'8¸/È8ñ
ô 
ð 	
r3   r   rã   r    rã  r   r
  N)r
  c                 ó"   — t          | ¦  «         S r.   r  )rP   s    r1   rS   z5min_cut_rematerialization_partition.<locals>.<lambda>'  s   € ­[¸©^¬^Ð);€ r3   r  c                 óJ   — g | ] }t          |¦  «        t          |¦  «        f‘Œ!S rC   )r0  r¹   r«  s     r1   rš   z7min_cut_rematerialization_partition.<locals>.<listcomp>:  s)   € ÐKÐKÐK¸¥¨¡¤­S°©V¬VÐ4ÐKÐKÐKr3   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r.   rö  r«  s     r1   rQ   z6min_cut_rematerialization_partition.<locals>.<genexpr>=  s(   è è € Ð'JÐ'J¸­°©¬Ð'JÐ'JÐ'JÐ'JÐ'JÐ'Jr3   z'Theoretical Activations Stored: %.2f GBz,Theoretical Per Activation Storage Sizes: %sc                 ó2   — h | ]}|j         d k    ¯|j        ’ŒS ©r–   r  rÕ   s     r1   r  z6min_cut_rematerialization_partition.<locals>.<setcomp>B  ó-   € ð 
ð 
ð 
Ø¸4¼7ÀoÒ;UÐ;UˆDŒIÐ;UÐ;UÐ;Ur3   c                 ó2   — h | ]}|j         d k    ¯|j        ’ŒS rX  r  rÕ   s     r1   r  z6min_cut_rematerialization_partition.<locals>.<setcomp>E  rY  r3   r©  z# remat/fw/bw: %d/%d/%dc                 ó   — | d         S r3  rC   r(  s    r1   rS   z5min_cut_rematerialization_partition.<locals>.<lambda>T  s
   € À!ÀAÄ$€ r3   Tr4  zCount of Ops Rematerialized: %s),rx   r¯   r‡  r   Úcser!   r{   rƒ   r¤  rW  rH   r  Úreversedry   r¥   rc   rÊ  r[   ré   r×  r  r‡   rp   rq   r  rK  r  rè   r   r  rž  rf  r#   rV   r-  r$   rÉ  r   r¢   r~   r   r¹   r©  r.  )rÒ   r  ÚcompilerrØ   rv   Ú	cse_graphr�   Úgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsrS  r¥  r,   r  r
  rÜ   rá   rg  rh  Úsorted_sizesÚtotal_activations_size_gbÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountsÚrematerialized_opss      `                     r1   r  r  §  s[  ø€ ðB Ô×*Ò*Ñ,Ô,Ð,Ø×ÒÑÔÐàÔ€Dõ „zð 'Ý  Ñ&Ô&ˆ	Ø&ˆÔØÔ$€Kå!5°lÑ!CÔ!CÐÝ%=¸lÑ%KÔ%KÐ"Ø!ð <Ý-¨lÑ;Ô;ˆð-
ð -
ð -
ð -
ð -
ð^ �˜|Ñ,Ô,€Iõ
 ˆ9Ô&Ñ'Ô'¨1Ò,Ð,Ý Ø˜-¸ð
ñ 
ô 
ð 	
õ ˜Ô+Ô1Ñ2Ô2ð Rð RˆØŒ7�hÒÐÝ # C¡¤ˆDÔÐØ×)Ò)¨$Ñ/Ô/ð 	RØ !ˆDÔÐå # C¡¤ˆDÔØœ
ð Rð R�Ý$'¨Ô(9¸4Ô;LÈqÑ;PÑ$QÔ$Q�Ô!Ð!ðRõ Ô3€MØÔ!ð ð ˆÝ�d”i—m’m O°TÑ:Ô:½EÑBÔBð 	Ø œI oÔ6ˆMØˆEð	õ +ØØØ#ðñ ô €Lõ �6¥+¨|Ñ<Ô<Ñ=Ô=€OÝ�Ð;Ð;¸\ÑJÔJÑKÔK€Lõ 4ØØØ'Ø'ð	ñ ô Ñ€Iˆyð "ð Ø)ð 	Ý#8Ø˜i¨µC¸Ñ4HÔ4Hñ$ô $Ñ ˆI�yõ 4°IÑ>Ô>€Iåñ IåÐKÐK¸lÐKÑKÔKÑLÔLˆõ %(Ð'JÐ'J¸\Ð'JÑ'JÔ'JÑ$JÔ$JÈSÑ$PÐ!Ý�	Š	Ð;Ð=VÑWÔWÐWõ 	�	Š	Ð@À,ÑOÔOÐOð
ð 
Ø"+¤/Ô"7ð
ñ 
ô 
ˆð
ð 
Ø"+¤/Ô"7ð
ñ 
ô 
ˆð &¨Ñ7ˆå!,­SÑ!1Ô!1ˆØ”OÔ)ð 	>ð 	>ˆDØŒy˜KÐ'Ð'­G°D´KÐARÑ,SÔ,SÐ'Ø•s˜4œ;Ô6Ñ7Ô7Ð8Ð8Ô8¸AÑ=Ð8Ð8Ñ8øÝ�	Š	Ø%Ý�ÑÔÝ�Ñ Ô Ý�Ñ Ô ñ		
ô 	
ð 	
õ $ F§L¢L¡N¤N¸¸ÐPTÐUÑUÔUÐÝ�	Š	Ð3Ð5GÑHÔHÐHØ�iÐÐr3   Úfx_graphTFÚtracedÚfnameÚfignameÚ
clear_metaÚprogÚparse_stack_traceÚdot_graph_shapec                 ó  — |rDt          j        | j        ¦  «        }t          j        | |¦  «        } | j        j        D ]	}i |_        Œ
t          j         	                    |¦  «        \  }	}
|
sdt          j        z   }
t                               d|	|
¦  «         t          j        | |||¬¦  «        }|                     ¦   «         }t#          |d|
                     d¦  «        z   ¦  «        }|	› |
› �}|€ ||¦  «         d S  |||¬¦  «         d S )Nú.zWriting FX graph to file: %s%s)ro  rp  Úwrite_)rn  )ÚcopyÚdeepcopyrx   rA   r`  ry   rp   ÚosÚpathÚsplitextr   Útorch_compile_graph_formatr$   r7  r   ÚFxGraphDrawerÚget_main_dot_graphr>  Úlstrip)rj  rk  rl  rm  rn  ro  rp  r±   r,   ÚbaseÚextÚgr˜   Úwrite_methods                 r1   Ú
draw_graphr�  Y  s'  € ð ð Ý”M &¤,Ñ/Ô/ˆ	Ý” ¨	Ñ2Ô2ˆØ”LÔ&ð 	ð 	ˆDØˆDŒIˆIÝ”× Ò  Ñ'Ô'�I€Dˆ#Øð 6Ø•FÔ5Ñ5ˆÝ‡H‚HÐ-¨t°SÑ9Ô9Ð9ÝÔ"ØØØ+Ø'ð		ñ 	ô 	€Að 	
×ÒÑÔ€AÝ˜1˜h¨¯ª°C©¬Ñ8Ñ9Ô9€LØˆN�SˆNˆN€EØ€|Øˆ�UÑÔÐÐÐàˆ�U Ð&Ñ&Ô&Ð&Ð&Ð&r3   r.   r  )rL  )ri  TNFN)yrt  rd   rê  rì   Úloggingr^  r
  rv  r6  r   Údataclassesr   r   Útypingr   r   r	   r
   r   r   r   r   r€   Útorch._inductor.inductor_primsÚtorch.fxrA   Útorch.utils._pytreeÚutilsÚ_pytreer¦   Ú%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.checkpointr   rÿ  r   Ú"_activation_checkpointing.knapsackr   r   r   Ú_aot_autograd.logging_utilsr   Ú_aot_autograd.utilsr    Úcompile_utilsr!   r"   ÚsympyÚdebug_partitionerr#   rf   r@   Ú	getLoggerr<   r$   ÚLoggerr<  r=  rƒ  r&   rE   rh   rB   ru   r`  r{   rƒ   rc   r‹   r�   r¤   r¡   r¹   rµ   r¼   r¿   rº   r»   rÈ   rÍ   rÐ   r£   rÛ   rà   r  r  rÕ  r!  r0  r9  Ú	lru_cacherG  rO  rf  rž  r¤  r&  r  r  r  r  rÁ  r.  rÃ  rß  rK  r  r�  rC   r3   r1   ú<module>r™     s‰
  ðà €€€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ Sà €€€Ø %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð ð ð ð ð )Ð (Ð (Ð (Ð (Ð (Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð
 <Ð ;Ð ;Ð ;Ð ;Ð ;Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ð ð Ø€L€L€Lð %Ô6Ð �tÐ 6Ð 6Ñ 6Ø'�gÔ'¨Ñ1Ô1€€W„^Ð 1Ð 1Ñ 1à„y„~€ØŒ	Œ€ð ð>ð >ð >ð >ð >ñ >ô >ñ „ð>ð2 ð ð  ð  ð  ð  ñ  ô  ñ „ð ð: ðð ð ð ð ñ ô ñ „ðð˜œð  Tð ð ð ð ð˜rœ~ð °$ð ð ð ð ð 2¤>ð °dð ð ð ð ð˜œð  Cð ð ð ð ðð ð ð ð ñ ô ð ð
 ˆoÑÔ€ð #ð	Dð DØ”ðDà�”ŒMðDð �"”'Œ]ðDð �sŒmð	Dð
 „XðDð Dð Dð DðN�R”Wð  ð ð ð ð ðG�b”gð G $ð Gð Gð Gð Gð˜bœgð ¨$ð ð ð ð ð˜bœgð ¨$ð ð ð ð ðX˜RœWð X¨ð Xð Xð Xð XðC˜rœwð C¨4ð Cð Cð Cð CðK r¤wð K°4ð Kð Kð Kð Kð˜rœwð ¨4ð ð ð ð ð$Ø”.ð$à
ˆ4�”Œ=˜$˜rœwœ-Ð'Ô(ð$ð $ð $ð $ð $ r¤w¤-ð °sð ð ð ð ð`"Ø”.ð`"à�r”w”-ð`"ð ˜"œ'”]ð`"ð
 ð`"ð ˆ2Œ>˜2œ>Ð)Ô*ð`"ð `"ð `"ð `"ðFSØ”.ðSà
ˆ2Œ>˜2œ>Ð)Ô*ðSð Sð Sð Sðl ˆ#ˆc‰(Œ(€ð"˜#ð "¨ð "ð "ð "ð "ð�2”7ð ˜sð ð ð ð ð:J�b”hð Jð Jð Jð Jð €Ô�TÑÔðð ñ Ôðð"H  b¤g¨s lÔ!3ð H¸¸UÀ2Ä7ÈCÀ<Ô=PÔ8Qð Hð Hð Hð HðG¨B¬Nð G¸r¼~ð Gð Gð Gð GðTZ Ø”.ðZ àŒ~ðZ ð Œ~ðZ ð ð	Z ð
 ˆ2Œ>˜2œ>Ð)Ô*ðZ ð Z ð Z ð Z ðz#¨¬ð #¸B¼Nð #ð #ð #ð #ðT ð	A&ð A&Ø”ðA&àðA&ð #ðA&ð A&ð A&ð A&ðH.ð .ð .ð"b˜Wð bð bð bð bðJ˜BœHð ð ð ð ðTØ”ðTà�ŒKðTð �5ŒkðTð ð	Tð
 ðTð $(¨¬¤=ðTð ˆ5�$�s”)˜T #œYÐ&Ô'ðTð Tð Tð Tð0 0Ð /Ð /Ð /Ð /Ð /ð,Nð ,Nð ,Nðd ðj	ð j	Ø”ðj	àðj	ð 
ˆ"Œ'„]ð	j	ð j	ð j	ð j	ð` ðo ð o Ø”.ðo ð ˆ2Œ>˜2œ>Ð)Ô*ðo ð o ð o ð o ðj ØØ,0Ø#Ø%)ð'ð 'ØŒHÔ ð'àð'ð ð'ð ð	'ð
 �5˜˜d 3œi˜Ô(Ô
)ð'ð ð'ð ˜c”]ð'ð 
ð'ð 'ð 'ð 'ð 'ð 'r3   