§
    ž²Åj’°  ã                   óü  — 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	 d dl
mZmZmZmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lm Z  erd d
l!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl'm)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 e*j9        de*j:        de*j;        de*j<        de*j=        de*j>        diZ?	 	 dgd„Z@	 	 	 	 dhd„ZAdejB        jC        deeDef         fd„ZEdeeDef         d ejB        jC        ddddfd!„ZFd ejB        jC        fd"„ZG	 did$eeDeDf         d%eDd&eDd'eHfd(„ZId)eejB        jJ                 ddfd*„ZK	 	 djdddd#d+œd,ee         d-ee/         d.ee8         d/eeD         d0ee6         d1ee0         d2eHddfd3„ZLd4d5d6ejB        jJ        deHfd7„ZMd4d5d6ejB        jJ        deejN        j	                 fd8„ZOd4d5d6ejB        jJ        deHfd9„ZPd4d5d6ejB        jJ        deejQ                 fd:„ZRd4d5d6ejB        jJ        deHfd;„ZSd4d5d6ejB        jJ        deejQ                 fd<„ZTd ejB        jC        d=eejB        jJ        geejB        jJ        eHf         f         dejB        jC        fd>„ZUd?eejB        jJ                 deejB        jJ                 fd@„ZVd ejB        jC        fdA„ZW	 dkd?eejB        jJ                 deejB        jJ                 fdB„ZXd?eejB        jJ                 deYfdC„ZZd?eejB        jJ                 deejB        jJ                 fdD„Z[dEejB        jJ        dFejB        jJ        ddfdG„Z\d ejB        jC        dejN        j]        ddfdH„Z^dIejB        jJ        deejB        jC                 fdJ„Z_dejN        j]        dej`        fdK„ZadL„ Zbd ejB        jC        ddfdM„Zcd ejB        jC        dNddejN        j]        dOeeDef         ddf
dP„ZddQedReHdefdS„Zed ejB        jC        dejf        jg        jh        fdT„ZiedejN        j]        fdU„¦   «         ZjdVdWdeHfdX„ZkdVdWdeHfdY„ZldVdWdeHfdZ„ZmdVdWdeHfd[„Zndld\„Zod]„ Zpdmd_„Zq ejr        d`¬a¦  «        dedW         fdb„¦   «         ZsdceDdedW         fdd„ZtdedW         fde„Zudndf„ZvdS )oé    N)Úcontextmanager)Ú	Parameter)ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSetÚTupleÚTypeÚTYPE_CHECKINGÚUnion)Údetect_fake_mode)Ú
FakeTensor)ÚFunctionalTensor)Ú#first_call_function_nn_module_stack)Úinsert_deferred_runtime_asserts©ÚConstantAttrMap)ÚOperatorBase)ÚExportedProgram)ÚExportGraphSignature)ÚCustomObjArgumentÚ	InputKindÚ
OutputKind)Ú_register_pytree_nodeÚContextÚFlattenFuncÚFromDumpableContextFnÚ
GetAttrKeyÚKeyPathÚkeystrÚ
MappingKeyÚSequenceKeyÚToDumpableContextFnÚtree_flatten_with_pathÚUnflattenFuncÚ Úp_Úb_Úc_Úobj_ÚtokenÚreturnr   c                 óh  — ddl m}  |¦   «         }d„ | j        D ¦   «         }|                     ¦   «         D ]{\  }}||v rŒ
|}|                     d¦  «        �^ }	}
|	D ]}t          ||¦  «        }Œ|j                             |
d ¦  «         t          ||
|¦  «         | 	                    ||¦  «         Œ||S )Nr   r   c                 óT   — h | ]%}|j         t          j        k    ¯|j        °|j        ’Œ&S © ©Úkindr   ÚBUFFERÚ
persistentÚtarget©Ú.0Úspecs     úDC:\Projects\Historical\venv\Lib\site-packages\torch/_export/utils.pyú	<setcomp>z2_collect_and_set_constant_attrs.<locals>.<setcomp>L   ó;   € ð ð ð àØŒ9�	Ô(Ò(Ð(°´Ð(ð 	Œà(Ð(Ð(ó    ú.)
Ú(torch._export.passes.lift_constants_passr   Úinput_specsÚitemsÚsplitÚgetattrÚ_buffersÚpopÚsetattrÚadd)Úgraph_signatureÚ	constantsÚmodr   Úconstant_attrsÚnon_persistent_buffersÚnameÚvalueÚ_modÚatomsÚattrÚatoms               r;   Ú_collect_and_set_constant_attrsrT   B   sõ   € ð IÐHÐHÐHÐHÐHà$�_Ñ&Ô&€Nðð à#Ô/ðñ ô Ðð
 !—’Ñ(Ô(ð (ð (‰ˆˆeØÐ)Ð)Ð)ØàˆØ—z’z #‘”‰ˆ�Øð 	'ð 	'ˆDÝ˜4 Ñ&Ô&ˆDˆDàŒ×Ò˜$ Ñ%Ô%Ð%Ý��d˜EÑ"Ô"Ð"Ø×Ò˜5 $Ñ'Ô'Ð'Ð'ØÐr>   Úold_sigr   Únew_sigc                 ó†   — d„ | j         D ¦   «         }|j         D ]'}|j        t          j        k    r|j        |v rd|_        Œ(|S )Nc                 óT   — h | ]%}|j         t          j        k    ¯|j        °|j        ’Œ&S r2   r3   r8   s     r;   r<   zB_overwrite_signature_for_non_persistent_buffers.<locals>.<setcomp>d   r=   r>   F)rA   r4   r   r5   r7   r6   )rU   rV   rM   r:   s       r;   Ú/_overwrite_signature_for_non_persistent_buffersrY   `   sb   € ðð àÔ'ðñ ô Ðð Ô#ð $ð $ˆØŒ9�	Ô(Ò(Ð(¨T¬[Ð<RÐ-RÐ-RØ#ˆDŒOøØ€Nr>   rK   c                 óþ  — i }dt           j        j        dt          fd„}| j        j        D �]P}|j        }|j        }|j        dk    r{ || |¦  «        }t          |t           j
        j        ¦  «        rP|                     dd¬¦  «        D ]\  }}|||dz   |z   <   Œ|                     dd¬¦  «        D ]\  }}|||dz   |z   <   Œ|j        d	k    r0 || |¦  «        }t          |t           j        j        ¦  «        s|||<   |j        d
k    rst          |j        t           j        j        ¦  «        sO|j        D ]G}	|	j        d	k    r:t           j        j        j        D ]#}
|
dk    rŒ	|
|v r||
         ||	j                 |
<   Œ$ŒH�ŒR|S )a  
    Param/buffer metadata needs to be saved before lowering to aten IR
    because aten IR lifts them, as a result, automatic preservation doesn't work.
    This is intended to be called on the strict mode tracing right before lowering to
    aten IR OR run_decomposition pass.
    ÚmodelÚ	attr_namec                 óŠ   — |                      d¦  «        �^ }}| }|D ]}t          ||d ¦  «        }|€J ‚Œt          ||¦  «        S )Nr?   )rC   rD   )r[   r\   ÚprefixÚfieldÚtÚitems         r;   Ú_getattrz0_collect_param_buffer_metadata.<locals>._getattry   sW   € Ø"Ÿš¨Ñ-Ô-‰ˆ�ØˆØð 	!ð 	!ˆDÝ˜˜4 Ñ&Ô&ˆAØ�=�=�=�=å�q˜%Ñ Ô Ð r>   Úcall_moduleTF)ÚrecurseÚremove_duplicater?   Úget_attrÚcall_functionÚcustom)ÚtorchÚfxÚGraphModuleÚstrÚgraphÚnodesr7   ÚmetaÚopÚ
isinstanceÚnnÚModuleÚnamed_parametersÚnamed_buffersÚ_opsÚHigherOrderOperatorÚ_input_nodesÚproxyÚ_COPY_META_FIELDS)rK   Úparams_buffers_to_node_metarb   Únoder7   ro   Ú	submodulerN   Ú_ÚargÚentrys              r;   Ú_collect_param_buffer_metadatar�   p   sû  € ð #%Ðð!�œÔ,ð !½ð !ð !ð !ð !ð ”	”ð "Yñ "YˆØ”ˆØŒyˆØŒ7�mÒ#Ð#Ø ˜  fÑ-Ô-ˆIÝ˜)¥U¤X¤_Ñ5Ô5ð 	LØ(×9Ò9Ø °5ð  :ñ  ô  ð Lð L‘G�D˜!ð HLÐ/°¸±¸tÑ0CÑDÐDà(×6Ò6Ø °5ð  7ñ  ô  ð Lð L‘G�D˜!ð HLÐ/°¸±¸tÑ0CÑDÐDàŒ7�jÒ Ð Ø ˜  fÑ-Ô-ˆIÝ˜i­¬Ô)=Ñ>Ô>ð ;Ø6:Ð+¨FÑ3ð
 Œ7�oÒ%Ð%­jØŒK�œÔ7ñ/
ô /
Ð%ð Ô(ð Yð Y�Ø”6˜ZÒ'Ð'Ý!&¤¤Ô!Að Yð Y˜à  HÒ,Ð,Ø$Ø  D˜=˜=ØMQÐRWÌ[Ð7¸¼
ÔCÀEÑJøøùà&Ð&r>   r{   Úgmc                 óø  — |                       ¦   «         D ].}|                     dd¦  «         |                     dd¦  «         Œ/|j        j        D ]©}|j        dk    rœ|j        |j        v r@|j        |j                 }|| v r*| |                              ¦   «         D ]\  }}||j        |<   Œ|j        |j	        v r@|j	        |j                 }|| v r*| |                              ¦   «         D ]\  }}||j        |<   ŒŒªdS )zq
    Given that we collected param'buffer metadata before, we put them back in
    newly traced graph module
    Únn_module_stackNÚstack_traceÚplaceholder)
ÚvaluesrF   rm   rn   rp   r7   Úinputs_to_parametersrB   ro   Úinputs_to_buffers)	r{   r‚   rV   Úmetadatar|   Ú
param_nameÚkÚvÚbuffer_names	            r;   Ú)_populate_param_buffer_metadata_to_new_gmr�   ©   s.  € ð 0×6Ò6Ñ8Ô8ð *ð *ˆØ�ŠÐ&¨Ñ-Ô-Ð-Ø�Š�] DÑ)Ô)Ð)Ð)à””ð )ð )ˆØŒ7�mÒ#Ð#ØŒ{˜gÔ:Ð:Ð:Ø$Ô9¸$¼+ÔF�
ØÐ!<Ð<Ð<Ø ;¸JÔ G× MÒ MÑ OÔ Oð )ð )™˜˜1Ø'(˜œ	 !™˜ØŒ{˜gÔ7Ð7Ð7Ø%Ô7¸¼ÔD�ØÐ"=Ð=Ð=Ø ;¸KÔ H× NÒ NÑ PÔ Pð )ð )™˜˜1Ø'(˜œ	 !™˜øð)ð )r>   c                 ó¼   — d„ | j         j        D ¦   «         }t          | ¦  «        }|�|j        S |D ]*}t	          |t
          j        ¦  «        r|j        j        c S Œ+d S )Nc                 ó^   — g | ]*}|j                              d d¦  «        ®|j         d          ‘Œ+S )ÚvalN)ro   Úget©r9   r|   s     r;   ú
<listcomp>z*_get_shape_env_from_gm.<locals>.<listcomp>Æ   s?   € ð ð ð àØŒ9�=Š=˜ Ñ%Ô%Ð1ð 	Œ	�%Ôà1Ð1Ð1r>   )rm   rn   Ú_detect_fake_mode_from_gmÚ	shape_envrq   ri   ÚSymIntr|   )r‚   ÚvalsÚ	fake_moder�   s       r;   Ú_get_shape_env_from_gmr›   Å   s…   € ðð à”H”Nðñ ô €Dõ *¨"Ñ-Ô-€IØÐØÔ"Ð"Øð $ð $ˆÝ�a�œÑ&Ô&ð 	$Ø”6Ô#Ð#Ð#Ð#ð	$ð$ð $r>   FÚname_mapÚ	orig_namerN   Úis_placeholderc                 ó„  — ||                       ¦   «         v ržt          j        d|¦  «        }|r:|s8|                     d¦  «        t	          |                     d¦  «        ¦  «        }}nd}|› d|dz   › �x}|                       ¦   «         v r%|dz  }|› d|dz   › �x}|                       ¦   «         v °%|| |<   n|| |<   | |         S )a  
    Renames nodes to avoid name collisions, with suffixing.
    name_map: map from original name to new name
    orig_name: mapping key
    name: candidate name (potentially suffixed, e.g. mul_2)
    is_placeholder: if the node is a placeholder, avoid detecting suffix
    z
(.*)_(\d+)é   é   r   r~   )r‡   ÚreÚmatchÚgroupÚint)rœ   r�   rN   rž   r£   ÚnÚdup_names          r;   Ú_rename_without_collisionsr¨   Ô   sì   € ð ˆx�ŠÑ Ô Ð Ð õ ”˜¨Ñ-Ô-ˆØð 	˜ð 	Ø—k’k !‘n”n¥c¨%¯+ª+°a©.¬.Ñ&9Ô&9�!ˆDˆDàˆAØ"Ð,Ð, Q¨¡UÐ,Ð,Ð,ˆx°·²Ñ1BÔ1BÐBÐBØ�‰FˆAð #Ð,Ð, Q¨¡UÐ,Ð,Ð,ˆx°·²Ñ1BÔ1BÐBÐBà&ˆ�ÑÐà"ˆ�ÑØ�IÔÐr>   Úinput_placeholdersc                 óà  — dt           dt          fd„}dd l}ddlm} ddlm} t          |¦  «        t          | ¦  «        k    r0t          dt          | ¦  «        › dt          |¦  «        › d	�¦  «        ‚i }t          || ¦  «        D �]ç\  \  }}	}
|
j
                             d
¦  «        }t          |t          ¦  «        �rEt          |	t          j        ¦  «        s+t          d ||¦  «        › dt!          |	¦  «        › �¦  «        ‚t          |j        ¦  «        t          |	j        ¦  «        k    r,t          d ||¦  «        › d|j        › d|	j        › d	�¦  «        ‚t%          t          |	j        |j        ¦  «        ¦  «        D �]\  }\  }}t          |t          j        ¦  «        �rt          |j        j        j        ¦  «        dk    �rát/          t1          |j        j        j        ¦  «        ¦  «        }||v rJ|j        j                             |¦  «        }||k    r$t          d ||¦  «        › d|› d|› d|› �¦  «        ‚nÐt          |t          j        ¦  «        r|j        j        j        sn¤t          |j        j        |j        ¦  «        rt9          |¦  «        ||<   nr ||                     |j        j        |¦  «        |¦  «        }|€.t          d|
j        › d|› d|› d|j        j        › d|› d�¦  «        ‚t9          |d         ¦  «        ||<   |j        j        |v rˆ |||j        j                 ¦  «        \  }}|dk    r*||k     r$t          d ||¦  «        › d|› d|› d|› �¦  «        ‚|t>          j         k     r*||k    r$t          d ||¦  «        › d|› d|› d|› �¦  «        ‚�Œ(||k    rQt          |t          j        ¦  «        r|j        j        j        s�Œ[t          d ||¦  «        › d|› d|› d|› �¦  «        ‚�Œ��Œ~t          |t8          tB          t          f¦  «        rGt!          |	¦  «        t!          |¦  «        k    s|	|k    r!t          d ||¦  «        › d|› d|	› �¦  «        ‚�Œéd S )NÚkey_pathr/   c                 ó,  — | d         }t          |t          ¦  «        sJ ‚|j        dk    rdt          | dd…         ¦  «        › �S | d         }t          |t          ¦  «        sJ ‚t          |¦  «        dd…         }|› t          | dd…         ¦  «        › �S )z�For a given index into the flat_args, return a human readable string
        describing how to access it, e.g. "*args["foo"][0].bar"
        r   z*argsr    Néÿÿÿÿr¡   )rq   r%   Úidxr#   r$   rl   )r«   Úargs_kwargs_key_pathÚ	kwarg_keyrN   s       r;   Ú
get_keystrz6_check_input_constraints_for_graph.<locals>.get_keystrô   s¥   € ð  (¨œ{ÐÝÐ.µÑ<Ô<Ð<Ð<Ð<ØÔ# qÒ(Ð(Ø1�6 (¨1¨2¨2¤,Ñ/Ô/Ð1Ð1Ð1à  œˆIÝ˜i­Ñ4Ô4Ð4Ð4Ð4Ý�y‘>”> ! B $Ô'ˆDØÐ2�F 8¨A¨B¨B¤<Ñ0Ô0Ð2Ð2Ð2r>   r   )Ú_convert_range_to_int)Ú	try_solvez&Unexpected number of inputs (expected z, got ú)r’   zExpected input at z to be a tensor, but got z,Unexpected number of dimensions in input at z.shape (expected r    z.shape[z] to be equal to z
, but got zExpected input z] = z to be of the form z, where z is an integerr¡   z] to be >= z] to be <= z to be equal to )"r"   rl   ÚsympyÚ@torch._export.passes.add_runtime_assertions_for_constraints_passr²   Útorch.utils._sympy.solver³   ÚlenÚRuntimeErrorÚzipro   r“   rq   r   ri   ÚTensorÚtypeÚshapeÚ	enumerater˜   r|   ÚexprÚfree_symbolsÚnextÚiterÚsubsÚ	is_numberÚSymbolr¥   ÚEqrN   ÚmathÚinfÚfloat)r©   Úflat_args_with_pathÚrange_constraintsr±   rµ   r²   r³   Úunification_mapr«   r   r|   Únode_valÚjÚarg_dimÚnode_dimÚsymbolÚexisting_dimÚsolutionÚmin_valÚmax_vals                       r;   Ú"_check_input_constraints_for_graphrÖ   ñ   s?  € ð3�Wð 3­ð 3ð 3ð 3ð 3ð" €L€L€Lðð ð ð ð ð ð 3Ð2Ð2Ð2Ð2Ð2å
ÐÑÔ¥3Ð'9Ñ#:Ô#:Ò:Ð:ÝðTÝÐ/Ñ0Ô0ðTð TÝ8;Ð<OÑ8PÔ8PðTð Tð Tñ
ô 
ð 	
ð 02€OÝ!$Ð%8Ð:LÑ!MÔ!Mð [ñ [Ñ‰ˆ�3˜Ø”9—=’= Ñ'Ô'ˆÝ�h¥
Ñ+Ô+ñ Y	Ý˜c¥5¤<Ñ0Ô0ð Ý"Øc¨¨°HÑ)=Ô)=ÐcÐcÕX\Ð]`ÑXaÔXaÐcÐcñô ð õ �8”>Ñ"Ô"¥c¨#¬)¡n¤nÒ4Ð4Ý"ðDÀ:À:ÈhÑCWÔCWð Dð DØ!)¤ðDð DØ7:´yðDð Dð Dñô ð õ
 +4µC¸¼	À8Ä>Ñ4RÔ4RÑ*SÔ*Sð Hñ HÑ&�Ñ&�G˜Xõ ˜x­¬Ñ6Ô6ñEå˜HœMÔ.Ô;Ñ<Ô<ÀÒAÑAå!¥$ x¤}Ô'9Ô'FÑ"GÔ"GÑHÔH�FØ Ð0Ð0Ø'/¤}Ô'9×'>Ò'>¸Ñ'OÔ'O˜Ø" lÒ2Ð2Ý".ð!E°Z°ZÀÑ5IÔ5Ið !Eð !EÐRSð !Eð !EØ#/ð!Eð !EØ;Bð!Eð !Eñ#ô #ð ð 3õ ' wµ´Ñ=Ô=ðOà$+¤LÔ$5Ô$?ðOð !å)¨(¬-Ô*<¸e¼lÑKÔKð Oõ
 ;>¸g¹,¼, °Ñ 7Ð 7à+4¨9Ø$)§H¢H¨X¬]Ô-?ÀÑ$IÔ$IÈ6ñ,"ô ," ð $,Ð#3Ý*6ð)j¸$¼)ð )jð )jÈAð )jð )jÐSZð )jð )jØ7?´}Ô7Ið)jð )jØSYð)jð )jð )jñ+&ô +&ð %&õ
 ?BÀ(È1Ä+Ñ>NÔ>N O°FÑ$;à”}Ô)Ð->Ð>Ð>Ø+@Ð+@Ø-¨h¬mÔ.@ÔAñ,ô ,Ñ(˜ ð # Qš;˜;Ø&¨Ò0Ð0Ý&2ð%D¸¸ÀHÑ9MÔ9Mð %Dð %DÐVWð %Dð %DØ'.ð%Dð %DØ:Að%Dð %Dñ'"ô '"ð !"ð #¥T¤XÒ-Ð-Ø&¨Ò0Ð0Ý&2ð%D¸¸ÀHÑ9MÔ9Mð %Dð %DÐVWð %Dð %DØ'.ð%Dð %DØ:Að%Dð %Dñ'"ô '"ð !"ùð
  (Ò*Ð*å& xµ´Ñ>Ô>ð%à$,¤MÔ$6Ô$@ð%ñ %Ý*ð=°°¸HÑ1EÔ1Eð =ð =Èað =ð =Ø'ð=ð =Ø3:ð=ð =ñô ð ñ +ñ{HõR ˜¥3­­sÐ"3Ñ4Ô4ð 	Ý�C‰yŒy�D ™NœNÒ*Ð*¨c°Xªo¨oÝ"Øh¨¨°HÑ)=Ô)=ÐhÐhÈxÐhÐhÐcfÐhÐhñô ð ùðs[ð [r>   )Úserialized_type_nameÚto_dumpable_contextÚfrom_dumpable_contextÚreturn_none_fieldsÚclsÚ
flatten_fnÚunflatten_fnr×   rØ   rÙ   rÚ   c          	      óÚ  ‡ ‡‡— t          j        ‰ ¦  «        sJ d‰ › �¦   «         ‚dt          dt          t          t                   t
          f         fˆfd„}dt          t                   dt
          dt          fˆ fd„}dt          dt          t          t                   t
          f         fˆfd„}	‰�‰n|Š|�|n|}|d u |d u z  rt          d	‰ › d
�¦  «        ‚t          ‰ ‰|||	||¬¦  «         d S )Nz7Only dataclasses can be registered with this function: Úobjr/   c                 ó
  •— g }g }g }t          j        | ¦  «        D ]b}|j        t          | |j        ¦  «        }}|€‰r+|                     |¦  «         |                     |¦  «         ŒM|                     |¦  «         Œc|||gfS ©N)ÚdataclassesÚfieldsrN   rD   Úappend)rß   Ú	flattenedÚ
flat_namesÚ
none_namesÚfrN   r’   rÚ   s          €r;   Údefault_flatten_fnz=register_dataclass_as_pytree_node.<locals>.default_flatten_fn�  sŸ   ø€ Øˆ	Øˆ
Øˆ
ÝÔ# CÑ(Ô(ð 	(ð 	(ˆAØœ¥¨¨Q¬VÑ 4Ô 4�#ˆDØˆÐ"4ˆØ× Ò  Ñ%Ô%Ð%Ø×!Ò! $Ñ'Ô'Ð'Ð'à×!Ò! $Ñ'Ô'Ð'Ð'Ø˜: zÐ2Ð2Ð2r>   r‡   Úcontextc           
      óˆ   •— |\  }} ‰di t          t          || ¦  «        ¦  «        ¤t                                |¦  «        ¤ŽS )Nr2   )Údictrº   Úfromkeys)r‡   rê   ræ   rç   rÛ   s       €r;   Údefault_unflatten_fnz?register_dataclass_as_pytree_node.<locals>.default_unflatten_fnŽ  sF   ø€ Ø!(Ñˆ
�JØˆsÐPÐP•T�#˜j¨&Ñ1Ô1Ñ2Ô2ÐPµd·m²mÀJÑ6OÔ6OÐPÐPÐPr>   c                 ó^   •—  ‰| ¦  «        \  }\  }}d„ t          ||¦  «        D ¦   «         |fS )Nc                 ó6   — g | ]\  }}t          |¦  «        |f‘ŒS r2   )r$   )r9   rŒ   r�   s      r;   r•   z[register_dataclass_as_pytree_node.<locals>.default_flatten_fn_with_keys.<locals>.<listcomp>”  s'   € ÐJÐJÐJ¡t q¨!•˜A‘” Ð"ÐJÐJÐJr>   )rº   )rß   rå   ræ   rç   rÜ   s       €r;   Údefault_flatten_fn_with_keyszGregister_dataclass_as_pytree_node.<locals>.default_flatten_fn_with_keys’  s=   ø€ Ø.8¨j¸©o¬oÑ+ˆ	Ñ+�J 
ØJÐJ­s°:¸yÑ/IÔ/IÐJÑJÔJÈJÐVÐVr>   z7Both to_dumpable_context and from_dumpable_context for z must be None or registered.)r×   Úflatten_with_keys_fnrØ   rÙ   )	râ   Úis_dataclassr   r   r	   r   r   Ú
ValueErrorr   )
rÛ   rÜ   rÝ   r×   rØ   rÙ   rÚ   ré   rî   rñ   s
   ``    `   r;   Ú!register_dataclass_as_pytree_noderõ   s  s–  øøø€ õ Ô#Øñô ð Gð GàFÀÐFÐFñGô Gð ð3¥ð 3­­dµ3¬i½Ð.@Ô(Að 3ð 3ð 3ð 3ð 3ð 3ðQ¥X­c¤]ð Q½Wð QÍð Qð Qð Qð Qð Qð QðW­#ð Wµ%½½S¼	Å7Ð8JÔ2Kð Wð Wð Wð Wð Wð Wð  *Ð5��Ð;M€JØ#/Ð#;�<�<ÐAU€Là˜tÐ#Ð(=ÀÐ(EÑFð 
Ýð%Àcð %ð %ð %ñ
ô 
ð 	
õ
 ØØØØ1Ø9Ø/Ø3ðñ ô ð ð ð r>   Úprogramr   r|   c                 ó(   — |j         | j        j        v S )zM
    Checks if the given node is a parameter within the exported program
    )rN   rI   rˆ   ©rö   r|   s     r;   Úis_paramrù   ª  s   € ð
 Œ9˜Ô/ÔDÐDÐDr>   c                 ón   — t          | |¦  «        r$| j        j        |j                 }| j        |         S dS )z£
    Returns the parameter associated with the given node in the exported program.
    Returns None if the node is not a parameter within the exported program
    N)rù   rI   rˆ   rN   Ú
state_dict)rö   r|   Úparameter_names      r;   Ú	get_paramrý   ²  s;   € õ �˜ÑÔð 2Ø Ô0ÔEÀdÄiÔPˆØÔ! .Ô1Ð1àˆ4r>   c                 ó(   — |j         | j        j        v S )zJ
    Checks if the given node is a buffer within the exported program
    )rN   rI   r‰   rø   s     r;   Ú	is_bufferrÿ   Â  s   € ð
 Œ9˜Ô/ÔAÐAÐAr>   c                 ó¤   — t          | |¦  «        r?| j        j        |j                 }|| j        j        v r| j        |         S | j        |         S dS )z�
    Returns the buffer associated with the given node in the exported program.
    Returns None if the node is not a buffer within the exported program
    N)rÿ   rI   r‰   rN   rM   rJ   rû   )rö   r|   rŽ   s      r;   Ú
get_bufferr  Ê  sZ   € õ �˜$ÑÔð 3ØÔ-Ô?ÀÄ	ÔJˆØ˜'Ô1ÔHÐHÐHØÔ$ [Ô1Ð1àÔ% kÔ2Ð2àˆ4r>   c                 ó(   — |j         | j        j        v S )zZ
    Checks if the given node is a lifted tensor constant within the exported program
    )rN   rI   Ú!inputs_to_lifted_tensor_constantsrø   s     r;   Úis_lifted_tensor_constantr  Ý  s   € ð Œ9˜Ô/ÔQÐQÐQr>   c                 ón   — t          | |¦  «        r$| j        j        |j                 }| j        |         S dS )z½
    Returns the lifted tensor constant associated with the given node in the exported program.
    Returns None if the node is not a lifted tensor constant within the exported program
    N)r  rI   r  rN   rJ   )rö   r|   Úlifted_tensor_names      r;   Úget_lifted_tensor_constantr  è  sB   € õ ! ¨$Ñ/Ô/ð 5Ø$Ô4ÔVØŒIô
Ðð Ô Ð!3Ô4Ð4àˆ4r>   Únode_call_backc                 óÞ   ‡— ddl m} i Šd}| j        j        D ]} ||¦  «        r|dz  }|‰|<   Œ || | ˆfd„dd¬¦  «        }| j        j        |j        _        |                     ¦   «          |S )a;  
    sequential_split creates a new graph module that splits the input graph module into multiple submodules
    based on the node_call_back. It doesn't mutate the input graph module. The node_call_back should return
    True if the node is a delimiter.  Delimiter will be the first node in the next submodule.
    r   )Úsplit_moduler    c                 ó   •— ‰|          S rá   r2   )r|   Ú	split_maps    €r;   ú<lambda>z"sequential_split.<locals>.<lambda>  s   ø€ �Y˜t”_€ r>   T)Úkeep_original_orderÚkeep_original_node_name)Útorch.fx.passes.split_moduler
  rm   rn   Ú_codegenÚ	recompile)r‚   r  r
  Úsplit_idr|   Únew_gmr  s         @r;   Úsequential_splitr  ú  s°   ø€ ð :Ð9Ð9Ð9Ð9Ð9à€IØ€HØ””ð #ð #ˆØˆ>˜$ÑÔð 	Ø˜‰MˆHØ"ˆ	�$‰ˆàˆ\Ø
Ø
Ø$Ð$Ð$Ð$Ø Ø $ðñ ô €Fð œHÔ-€F„LÔØ
×ÒÑÔÐØ€Mr>   rn   c                 ó    ‡— ˆfd„| D ¦   «         S )z:Returns the nodes that match the node_call_back as a list.c                 ó*   •— g | ]} ‰|¦  «        ¯|‘ŒS r2   r2   )r9   r|   r  s     €r;   r•   z nodes_filter.<locals>.<listcomp>  s(   ø€ Ð;Ð;Ð;�T n n°TÑ&:Ô&:Ð;ˆDÐ;Ð;Ð;r>   r2   ©rn   r  s    `r;   Únodes_filterr    s   ø€ à;Ð;Ð;Ð;˜UÐ;Ñ;Ô;Ð;r>   c           	      ó€  — ddl m}m} ddlm} t
          j        j        j        ssd} || t          j
        ||¬¦  «        ¦  «        5  t          | ¦  «        }|r(t          | |dt          | j        ¦  «        › �d¬¦  «         d d d ¦  «         n# 1 swxY w Y   |                      ¦   «           || ¦  «        |_        | |fS )	Nr   )Ú_node_metadata_hookÚ_set_node_metadata_hook)Ú_graph_output_nameszUFile "torch/fx/passes/runtime_assert.py", line 24, in insert_deferred_runtime_asserts)r…   zexported program: T)Úexport)Ú(torch._export.passes._node_metadata_hookr  r  Ú4torch._functorch._aot_autograd.input_output_analysisr  ri   Ú_dynamoÚconfigÚdo_not_emit_runtime_assertsÚ	functoolsÚpartialr›   r   r   rm   r  Úuser_outputs)r‚   rI   r  r  r  r…   r—   s          r;   Úapply_runtime_assertion_passr'    sS  € ðð ð ð ð ð ð ð ð YÐXÐXÐXÐXÐXåŒ=ÔÔ;ð ð1ð 	ð %Ð$Ø•	Ô!Ð"5À;ÐOÑOÔOñ
ô 
ð 
	ð 
	õ /¨rÑ2Ô2ˆIØð Ý/ØØØXÕ)LÈRÌXÑ)VÔ)VÐXÐXØð	ñ ô ð ð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð ‡L‚L�N„N€NØ#6Ð#6°rÑ#:Ô#:€OÔ ØˆÐÐs   Á:BÂBÂBc                 óf   — t          | |r|nd„ ¦  «        }t          |¦  «        dk    r|d         S dS )z­
    Returns the first node that matches the node_call_back. If no node matches, returns None.
    When node_call_back is None, returns the first node in the node list.
    c                 ó   — dS )NTr2   ©r|   s    r;   r  znodes_first.<locals>.<lambda>B  s   € ÐQU€ r>   r   N)r  r¸   )rn   r  Úrets      r;   Únodes_firstr,  ;  s=   € õ �u°ÐU˜n˜nÐDUÐDUÑ
VÔ
V€CÝ
ˆ3�x„x�!‚|€|Ø�1ŒvˆØˆ4r>   c                 ó<   — t          t          | |¦  «        ¦  «        S )z:Returns the number of nodes that match the node_call_back.)r¸   r  r  s     r;   Únodes_countr.  H  s   € å�|˜E >Ñ2Ô2Ñ3Ô3Ð3r>   c                 ó&   — | D ]} ||¦  «         Œ| S )z¦
    Sequentially visit the nodes list and invoke node_call_back on each element.
    Returns the nodes list after the node_call_back is invoked on each element.
    r2   )rn   r  r|   s      r;   Ú	nodes_mapr0  M  s+   € ð
 ð ð ˆØˆ�tÑÔÐÐØ€Lr>   Úold_nodeÚnew_nodec                 ó–   — |                       |¦  «         | j                             ¦   «          | j                             | ¦  «         dS )z5
    Replace all uses of old_node with new_node.
    N)Úreplace_all_uses_withÚusersÚclearrm   Ú
erase_node)r1  r2  s     r;   Únode_replace_r8  W  sH   € ð ×"Ò" 8Ñ,Ô,Ð,Ø„N×ÒÑÔÐØ„N×Ò˜hÑ'Ô'Ð'Ð'Ð'r>   c                 óÐ   — t          |t          j        j        ¦  «        rBt	          |d¦  «        r4d|j        v r-| j                             d|j        d         i¦  «         d S d S d S d S )Nro   rh   )rq   ri   rj   rk   Úhasattrro   Úupdate)r‚   rK   s     r;   Ú_update_gm_meta_if_possibler<  `  s|   € å�3�œÔ,Ñ-Ô-ð7å�C˜Ñ Ô ð7ð ˜œÐ Ð à
Œ�Š˜ #¤(¨8Ô"4Ð5Ñ6Ô6Ð6Ð6Ð6ð7ð 7ð 7ð 7ð !Ð r>   Úcall_mod_nodec           
      óÚ  ‡— | j         dk    sJ ‚| j        j        }|€J ‚t          | j        t
          ¦  «        sJ ‚t          || j        ¦  «        }d„ |j        j        D ¦   «         }d„ |j        j        D ¦   «         }d„ |j        j        D ¦   «         }t          || j	        ¦  «        D ]6\  }}t          |t          j        j        ¦  «        sJ ‚t          ||¦  «         Œ7|j                             | ¦  «        5  |D ]¯}|j                             |¦  «        }	|j         dk    rx|	j        }
t!          ||
¦  «        r1d}d|› �}
t!          ||
¦  «        r|dz  }d|› �}
t!          ||
¦  «        °|
|	_        t#          ||	j        t          ||j        ¦  «        ¦  «         t          ||	¦  «         Œ°t%          |¦  «        d	k    �rSt%          |¦  «        dk    rt%          |d	         j	        ¦  «        dk    sJ ‚|d	         j	        d	         Št          ‰t          j        j        ¦  «        r*‰j                             ¦   «          t          | ‰¦  «         nÞt          ‰t*          t,          f¦  «        rˆ‰D ]"}|j                             |d	         ¦  «         Œ#t1          t+          | j                             ¦   «         ¦  «        d
„ ¦  «        }t5          |ˆfd„¦  «         | j                             | ¦  «         n:t9          dt;          ‰¦  «        › d�¦  «        ‚| j                             | ¦  «         ddd¦  «         n# 1 swxY w Y   |                     ¦   «          |                     ¦   «          |S )z‘
    Inline the submodule of the given node into the parent module.
    Note: we only support the case where submodule takes tensors inputs.
    rc   Nc              3   ó0   K  — | ]}|j         d k    ¯|V — ŒdS )r†   N©rp   r”   s     r;   ú	<genexpr>znode_inline_.<locals>.<genexpr>u  s.   è è € Ð
KÐ
K�D°$´'¸]Ò2JÐ2Jˆ4Ð2JÐ2JÐ2JÐ2JÐ
KÐ
Kr>   c              3   ó,   K  — | ]}|j         d v¯|V — ŒdS ))r†   ÚoutputNr@  r”   s     r;   rA  znode_inline_.<locals>.<genexpr>v  s8   è è € ð ð Ø¨t¬wÐ>WÐ/WÐ/WˆÐ/WÐ/WÐ/WÐ/Wðð r>   c                 ó(   — g | ]}|j         d k    ¯|‘ŒS )rC  r@  r”   s     r;   r•   z node_inline_.<locals>.<listcomp>y  s$   € ÐIÐIÐI�t°T´WÀÒ5HÐ5HˆdÐ5HÐ5HÐ5Hr>   rf   r    Úsubmod_r   c                 óB   — | j         dk    o| j        t          j        k    S )Nrg   )rp   r7   ÚoperatorÚgetitemr*  s    r;   r  znode_inline_.<locals>.<lambda>   s"   €  ¤¨OÒ!;ð "8Øœ¥xÔ'7Ò7ð r>   c                 óF   •— t          | ‰| j        d                  ¦  «        S )Nr    )r8  Úargs)Úget_item_nodeÚ
new_outputs    €r;   r  znode_inline_.<locals>.<lambda>¦  s$   ø€ ­-Ø%Ø" =Ô#5°aÔ#8Ô9ñ+ô +€ r>   zUnsupported output type z2. Expect it to be a Node or a list/tuple of Nodes.) rp   rm   Úowning_modulerq   r7   rl   rD   rn   rº   rJ  ri   rj   ÚNoder8  Úinserting_beforeÚ	node_copyr:  rG   r¸   r5  r6  ÚlistÚtuplerF   r  Úkeysr0  r7  ÚNotImplementedErrorr¼   Údelete_all_unused_submodulesr  )r=  r‚   Úsub_gmÚphsÚbodyrC  Úphr   r|   r2  Únew_target_nameÚiÚget_item_usersrL  s                @r;   Únode_inline_r]  i  sé  ø€ ð
 Ô˜}Ò,Ð,Ð,Ð,Ø	Ô	Ô	*€BØˆ>ˆ>ˆ>å�mÔ*­CÑ0Ô0Ð0Ð0Ð0Ý�R˜Ô-Ñ.Ô.€Fà
KÐ
K˜FœLÔ.Ð
KÑ
KÔ
K€Cðð ØœÔ+ðñ ô €Dð JÐI˜vœ|Ô1ÐIÑIÔI€Få�s˜MÔ.Ñ/Ô/ð ð ‰ˆˆCÝ˜#�uœxœ}Ñ-Ô-Ð-Ð-Ð-Ý�b˜#ÑÔÐÐà	Œ×	"Ò	" =Ñ	1Ô	1ð 2:ð 2:Øð 	*ð 	*ˆDØ”x×)Ò)¨$Ñ/Ô/ˆHØŒw˜*Ò$Ð$Ø"*¤/�Ý˜2˜Ñ/Ô/ð 8à�AØ&3° m m�OÝ! " oÑ6Ô6ð 8Ø˜Q™˜Ø*7°A¨-¨-˜õ " " oÑ6Ô6ð 8ð #2�”Ý˜˜HœO­W°V¸T¼[Ñ-IÔ-IÑJÔJÐJÝ˜$ Ñ)Ô)Ð)Ð)åˆv‰;Œ;˜Š?‰?Ý�v‘;”; !Ò#Ð#­¨F°1¬I¬NÑ(;Ô(;¸qÒ(@Ð(@Ð(@Ð@Ø œœ¨Ô*ˆJå˜*¥e¤h¤mÑ4Ô4ð ð Ô ×&Ò&Ñ(Ô(Ð(Ý˜m¨ZÑ8Ô8Ð8Ð8Ý˜J­­u¨Ñ6Ô6ð à&ð .ð .�DØ”J—N’N 6¨!¤9Ñ-Ô-Ð-Ð-õ ".Ý˜Ô,×1Ò1Ñ3Ô3Ñ4Ô4ð8ð 8ñ"ô "�õ Ø"ðð ð ð ñô ð ð Ô#×.Ò.¨}Ñ=Ô=Ð=Ð=å)Øs­t°JÑ/?Ô/?ÐsÐsÐsñô ð ð Ô×*Ò*¨=Ñ9Ô9Ð9ðe2:ð 2:ð 2:ñ 2:ô 2:ð 2:ð 2:ð 2:ð 2:ð 2:ð 2:øøøð 2:ð 2:ð 2:ð 2:ðh ×#Ò#Ñ%Ô%Ð%Ø‡L‚L�N„N€NØ€Is   Ã8H4L8Ì8L<Ì?L<c                 ór  — t          j        | j        ¦  «        }|j        d         }dt          j        i}g }|                     ¦   «         D ]X\  }}d„ t          |j        |¦  «        D ¦   «         }|D ]1}|dk    rŒ	| 	                    t          j        ||¦  «        ¦  «         Œ2ŒYt          j        |¬¦  «        S )zÅ
    Get source code and parse argument names using AST. The function returns
    a signature of the forward() function.

    # TODO: Directly provide inspect.signature compatible TS-d module.
    r   rJ  c                 ó   — g | ]	}|j         ‘Œ
S r2   )r   )r9   Úas     r;   r•   z:_get_torch_jit_trace_forward_signature.<locals>.<listcomp>È  s   € ÐMÐMÐM 1˜œÐMÐMÐMr>   Úself)Ú
parameters)ÚastÚparseÚcoderX  r   ÚPOSITIONAL_OR_KEYWORDrB   rD   rJ  rä   ÚinspectÚ	Signature)	rK   Úast_modÚast_func_defÚarg_type_mapÚ
param_listÚarg_typeÚ
param_typeÚarg_name_listÚarg_names	            r;   Ú&_get_torch_jit_trace_forward_signaturerq  ¸  s×   € õ Œi˜œÑ!Ô!€GØ$+¤L°¤O€Lð �IÔ;Ð<€Lð €JØ ,× 2Ò 2Ñ 4Ô 4ð Gð GÑˆ�*ØMÐM­°Ô0AÀ8Ñ(LÔ(LÐMÑMÔMˆØ%ð 	Gð 	GˆHØ˜6Ò!Ð!ØØ×Ò�gÔ/°¸*ÑEÔEÑFÔFÐFÐFð	Gõ
 Ô¨
Ð3Ñ3Ô3Ð3r>   c                 óV  — t          | t          j        j        t          j        j        f¦  «        rOt          | ¦  «        }t          |j        ¦  «        t          |¦  «        t          |¦  «        z   k    s
J d¦   «         ‚nt          j	        | j
        ¦  «        } |j        |i |¤Žj        S )NzyArguments other than POSITIONAL_OR_KEYWORD kinds in forward() are not supported in _get_torch_jit_trace_forward_signature)rq   ri   ÚjitÚScriptModuleÚTracedModulerq  r¸   rb  rg  Ú	signatureÚforwardÚbindÚ	arguments)rK   Ú	fake_argsÚfake_kwargsÚsigs       r;   Ú_bind_signature_to_inputsr}  Ñ  s    € Ý�#�œ	Ô.µ´	Ô0FÐGÑHÔHð 	-Ý4°SÑ9Ô9ˆõ �3”>Ñ"Ô"¥c¨)¡n¤nµs¸;Ñ7GÔ7GÑ&GÒGÐGÐGðJñ HÔGÐGÐGõ
 Ô ¤Ñ,Ô,ˆàˆ3Œ8�YÐ. +Ð.Ð.Ô8Ð8r>   c                 ó
  — g }| j         j        D �]D}|j        dk    �r5t          |j        t
          j        j        ¦  «        �r|j        j        dk    ra|j	        \  }}}}| 
                    t          | |j        ¦  «        |f¦  «         | 
                    t          | |j        ¦  «        |f¦  «         Œ¥|j        j        dk    rG|j	        d         |j	        dd…         }}| 
                    t          | |j        ¦  «        |f¦  «         Œü|j        j        dk    r8|j	        \  }	}
}| 
                    t          | |	j        ¦  «        |
|z   f¦  «         �ŒF|D ]«\  }}i }t          |j         j        ¦  «        D ]g\  }}|t          |¦  «        k     r/||         j        ||j        <   ||         j        x|_        |_        ŒGt          ||j        |j        ¦  «        |_        Œht!          |¦  «         |                     ¦   «          Œ¬dS )a0  
    Propagate placeholder names from the top-level graph into HigherOrderOp subgraphs,
    and handle collisions with non-placeholders by count suffixing.
    Different HOO subgraph types have different input schemas, so we first enumerate them
    and gather the top-level named placeholder nodes.
    rg   ÚcondÚwrap_with_set_grad_enabledr    r¡   NÚmap_impl)rm   rn   rp   rq   r7   ri   rv   rw   Ú_nameÚ_argsrä   rD   r¾   r¸   rN   r¨   Ú_name_hoo_subgraph_placeholdersr  )r‚   Úsubgraph_ph_tuplesr|   r~   Ú
true_graphÚfalse_graphÚ	cond_argsÚsubgraphrW  Ú
body_graphÚarrayrJ  Úhoo_phsrœ   r[  s                  r;   r„  r„  à  s  € ð RTÐØ””ð ñ ˆØŒ7�oÒ%Ñ%­*ØŒK�œÔ7ñ+
ô +
Ñ%ð Œ{Ô  FÒ*Ð*Ø8<¼
Ñ5��:˜{¨IØ"×)Ò)­7°2°zÔ7HÑ+IÔ+IÈ9Ð*UÑVÔVÐVØ"×)Ò)­7°2°{Ô7IÑ+JÔ+JÈIÐ*VÑWÔWÐWÐWØ”Ô"Ð&BÒBÐBØ $¤
¨1¤¨t¬z¸!¸"¸"¬~˜#�Ø"×)Ò)­7°2°x´Ñ+GÔ+GÈÐ*MÑNÔNÐNÐNØ”Ô" jÒ0Ð0Ø*.¬*Ñ'�
˜E 4Ø"×)Ò)Ý˜R Ô!2Ñ3Ô3°U¸T±\ÐBñô ð ùð
 0ð ð Ñˆ�'Ø#%ˆÝ  ¤Ô!5Ñ6Ô6ð 	Wð 	W‰GˆAˆtØ•3�w‘<”<ÒÐØ&-¨a¤j¤o�˜œÑ#Ø*1°!¬*¬/Ð9�”	˜DœK˜Kå6°xÀÄÈDÌIÑVÔV�”	�	õ 	(¨Ñ1Ô1Ð1Ø×ÒÑÔÐÐðð r>   Úexport_graph_signaturerJ   c           
      ó(  ‡— d„ }d„ Ši }t          |||¦  «        }	t          |	¦  «        \  }
}d„ |j        D ¦   «         }t          |
|¦  «        D ]T\  \  }}}|rJt	          ||t
          t          j                 d                     ˆfd„|D ¦   «         ¦  «        z   d¬¦  «         ŒU|j        D ]˜}|j	        t          j        k    rŒ|j	        t          j
        k    rd}n" ||j        ¦  «                             ¦   «         }t          j        d	d|¦  «        }t	          ||j        j        t
          |j	                 |z   d¬¦  «         Œ™| j        j        D ])}|j        d
k    rŒt	          ||j        |j        ¦  «         Œ*| j        j        D ]„}|j        d
k    r\|j        |v sJ ‚||j                 x|_        |_        t)          |j        d         t,          ¦  «        r|j        |j        d         _        Œi|j        |v r||j                 |_        Œ…t/          | ¦  «         |                      ¦   «          |j        D ]f}|j        j        |v sJ ‚||j        j                 |j        _        |j	        t          j        k    r#|j        |v r||j                 dd…         |_        Œg|j        D ]\}|j        j        |v r||j        j                 |j        _        |j	        t6          j        k    r|j        |v r||j                 |_        Œ]t;          |                     ¦   «         ¦  «        D ]q}||         }||v rct)          |t>          j         ¦  «        sI||         }||k    r;t          j!        d|¦  «        r&|t
          t          j                 |z   k    r|||<   ||= ŒrdS )aQ  
    This pass is run at the end of _export_non_strict() to assign better placeholder node names:
        - User inputs:
            These follow the signature of mod.forward(), e.g. forward(x, y) produces nodes x, y.
            For nested inputs from dictionaries, lists, tuples, or dataclasses,
            the names are a concatenation of the path to the tensor.
                e.g. x = {
                    'a': torch.randn(),
                    'b': [torch.randn(), torch.randn()]
                }
            produces nodes x_a, x_b_0, x_b_1.
        - Parameters/buffers/constants/custom objects:
            These follow the FQN of the object, prefixed by "p", "b", "c", "obj" respectively.
                e.g. self.bar.l0.weight produces "p_bar_l0_weight".
        - Effect tokens:
            These are named token, token_1, ...
    c                 óä   — |                       d¦  «        r| t          d¦  «        d …         } n,|                       d¦  «        r| t          d¦  «        d …         } t          j        dd| ¦  «        } | S )NÚ
L__self___Úself_ú[^a-zA-Z0-9]r~   )Ú
startswithr¸   r¢   Úsub©Úxs    r;   Ú_strip_namez,placeholder_naming_pass.<locals>._strip_name%  sp   € Ø�<Š<˜Ñ%Ô%ð 	"Ø•#�lÑ#Ô#Ð%Ð%Ô&ˆAˆAØ�\Š\˜'Ñ"Ô"ð 	"Ø•#�g‘,”,�.�.Ô!ˆAÝŒF�? C¨Ñ+Ô+ˆØˆr>   c                 óN  — t          | t          ¦  «        r*t          j        ddt	          | j        ¦  «        ¦  «        } | S t          | t          ¦  «        rt	          | j        ¦  «        S t          | t          ¦  «        r| j	        S t          dt          | ¦  «        › d| › �¦  «        ‚)Nr’  r~   zPytree key of type z not handled for )rq   r$   r¢   r”  rl   Úkeyr%   r®   r!   rN   r¹   r¼   r•  s    r;   Ú_extract_pytree_keyz4placeholder_naming_pass.<locals>._extract_pytree_key-  s•   € Ý�a�Ñ$Ô$ð 	TÝ”�¨­S°´©Z¬ZÑ8Ô8ˆAØˆHÝ˜�;Ñ'Ô'ð 	TÝ�q”u‘:”:ÐÝ˜�:Ñ&Ô&ð 	TØ”6ˆMåÐRµT¸!±W´WÐRÐRÈqÐRÐRÑSÔSÐSr>   c                 óP   — g | ]#}|j         t          j        k    ¯|j        j        ‘Œ$S r2   )r4   r   Ú
USER_INPUTr   rN   r8   s     r;   r•   z+placeholder_naming_pass.<locals>.<listcomp>>  s6   € ð ð ð àØŒ9�	Ô,Ò,Ð,ð 	ŒŒà,Ð,Ð,r>   r~   c              3   óR   •K  — | ]!} ‰|¦  «                              ¦   «         V — Œ"d S rá   )Úlower)r9   r–  rš  s     €r;   rA  z*placeholder_naming_pass.<locals>.<genexpr>K  s;   øè è € ÐLÐL¸aÐ.Ð.¨qÑ1Ô1×7Ò7Ñ9Ô9ÐLÐLÐLÐLÐLÐLr>   T)rž   r)   r’  r†   r’   é   Nz
arg(\d+)_1)"r}  r'   rA   rº   r¨   Úplaceholder_prefixesr   rœ  Újoinr4   ÚTOKENr7   rž  r¢   r”  r   rN   rm   rn   rp   rq   ro   r   r„  r  Ú
CUSTOM_OBJÚoutput_specsr   ÚUSER_INPUT_MUTATIONrQ  rS  ri   r»   r£   )r‚   r�  rK   rz  r{  Úfake_params_buffersrJ   r—  rœ   Úcombined_argsrÊ   r~   Úuser_input_namesÚarg_pathr   Úuser_input_namer:   Ú	base_namer|   rN   ÚconstantÚnew_namerš  s                         @r;   Úplaceholder_naming_passr®  
  s  ø€ ð6ð ð ð	Tð 	Tð 	Tð  "€Hõ .¨c°9¸kÑJÔJ€Må3°MÑBÔBÑÐ˜ðð à*Ô6ðñ ô Ðõ -0Ð0CÐEUÑ,VÔ,Vð ð Ñ(‰ˆ�3˜Øð 	Ý&ØØÝ$¥YÔ%9Ô:Ø—(’(ÐLÐLÐLÐLÀ8ÐLÑLÔLÑLÔLñMà#ðñ ô ð øð 'Ô2ð 
ð 
ˆØŒ9�	Ô,Ò,Ð,ØØŒ9�	œÒ'Ð'ØˆIˆIà#˜ D¤KÑ0Ô0×6Ò6Ñ8Ô8ˆIÝ”F˜?¨C°Ñ;Ô;ˆ	å"ØØŒHŒMÝ  ¤Ô+¨iÑ7Øð		
ñ 	
ô 	
ð 	
ð 	
ð ””ð Cð CˆØŒ7�mÒ#Ð#ØÝ" 8¨T¬Y¸¼	ÑBÔBÐBÐBð ””ð 	,ð 	,ˆØŒ7�mÒ#Ð#Ø”9 Ð(Ð(Ð(Ð(Ø&.¨t¬yÔ&9Ð9ˆDŒI˜œõ ˜$œ) EÔ*Õ,=Ñ>Ô>ð 2Ø(,¬	�”	˜%Ô Ô%øØŒY˜(Ð"Ð"Ø  ¤Ô+ˆDŒIøõ $ BÑ'Ô'Ð'ð ‡L‚L�N„N€Nð 'Ô2ð 4ð 4ˆØŒxŒ} Ð(Ð(Ð(Ð(Ø  ¤¤Ô/ˆŒŒàŒI�Ô-Ò-Ð-°$´+ÀÐ2IÐ2Ià" 4¤;Ô/°°°Ô3ˆDŒKøà&Ô3ð 0ð 0ˆØŒ8Œ=˜HÐ$Ð$Ø$ T¤X¤]Ô3ˆDŒHŒMØŒ9�
Ô6Ò6Ð6¸4¼;È(Ð;RÐ;RØ" 4¤;Ô/ˆDŒKøõ �Y—^’^Ñ%Ô%Ñ&Ô&ð $ð $ˆØ˜T”?ˆØ�8ÐÐ¥JØ•e”lñ%
ô %
Ðð   ”~ˆHà˜DÒ Ð Ý”H˜]¨DÑ1Ô1ð !àÕ 4µYÔ5IÔ JÈTÑ QÒQÐQà&.�	˜(Ñ#Ø˜d�Oøð$ð $r>   rû   Úin_placec                 óD  — |rB|                       ¦   «         D ]+\  }}t          |d¦  «        rt          | |         d¦  «         Œ,| S i }|                       ¦   «         D ]D\  }}t          |d¦  «        r*|                     ¦   «                              ¦   «         ||<   Œ?|||<   ŒE|S )zÍ
    If `in_place` is false, return a new copy of `state_dict` with "proxy" removed from `v.__dict__`.
    `v` is the values in the dictionary.
    If `in_place` is true, modify `state_dict` in place.
    ry   )rB   r:  ÚdelattrÚdetachÚclone)rû   r¯  rŒ   r�   Únew_state_dicts        r;   Úremove_proxy_from_state_dictrµ  ›  sÂ   € ð ð Ø×$Ò$Ñ&Ô&ð 	0ð 	0‰DˆAˆqÝ�q˜'Ñ"Ô"ð 0Ý˜
 1œ wÑ/Ô/Ð/øØÐàˆØ×$Ò$Ñ&Ô&ð 	&ð 	&‰DˆAˆqÝ�q˜'Ñ"Ô"ð &Ø$%§H¢H¡J¤J×$4Ò$4Ñ$6Ô$6�˜qÑ!Ð!à$%�˜qÑ!Ð!ØÐr>   c                 óü  — g }g }| j         j        D ]Ú}|j        dk    rHd|j        v r?|j        d         }|�/t	          |t
          j        ¦  «        r|                     |¦  «         ŒUt          |¦  «        dk    rrd|j        v s	d|j        v r`d}d|j        v r|j        d         }nd|j        v r|j        d         }|�/t	          |t
          j        ¦  «        r|                     |¦  «         ŒÛt          ||z   ¦  «        S )a  
    For a given graph module, we look at the "val" of placeholder nodes to find the fake inputs.
    Additionally, if gm doesn't have placeholders, we further look at the "example_value" or "val" of other nodes.
    If no fake mode is found, we return None for fake_mode.
    r†   r’   Nr   Úexample_value)
rm   rn   rp   ro   rq   ri   r»   rä   r¸   r   )r‚   Ú	fake_inpsÚ	fake_valsr|   Úfake_vals        r;   r–   r–   °  s  € ð %'€IØ$&€IØ””ð +ð +ˆØŒ7�mÒ#Ð#¨°´Ð(:Ð(:Ø”y Ô'ˆHØÐ#­
°8½U¼\Ñ(JÔ(JÐ#Ø× Ò  Ñ*Ô*Ð*øÝ�‰^Œ^˜qÒ Ð Ø˜tœyÐ(Ð(¨E°T´YÐ,>Ð,>àˆHØ $¤)Ð+Ð+Øœ9 _Ô5��Ø˜$œ)Ð#Ð#Øœ9 UÔ+�ØÐ#­
°8½U¼\Ñ(JÔ(JÐ#Ø× Ò  Ñ*Ô*Ð*øå˜I¨	Ñ1Ñ2Ô2Ð2r>   c              #   ó
  K  — t          | j        ¦  «        }t          | j        ¦  «        }| j                             ¦   «          | j                             ¦   «          	 d V — || _        || _        d S # || _        || _        w xY wrá   )rì   Ú_state_dict_hooksÚ_state_dict_pre_hooksr6  )rK   Ústate_dict_hooksÚstate_dict_pre_hookss      r;   Ú_disable_load_state_dict_hooksrÀ  Î  s•   è è € å,0°Ô1FÑ,GÔ,GÐÝ04°SÔ5NÑ0OÔ0OÐØÔ×ÒÑ!Ô!Ð!ØÔ×#Ò#Ñ%Ô%Ð%ð9Øˆˆˆà 0ˆÔØ$8ˆÔ!Ð!Ð!øð !1ˆÔØ$8ˆÔ!Ð8Ð8Ð8Ð8s   ÁA2 Á2Brp   r   c                 óÈ   — t           j                             |                      ¦   «         t           j        j        j        ¦  «        pt           j        j        j        | j        v S rá   )ri   Ú_CÚ%_dispatch_has_kernel_for_dispatch_keyrN   ÚDispatchKeyÚCompositeImplicitAutogradÚ
py_kernelsr@  s    r;   Ú
_is_cia_oprÇ  Û  sK   € åŒ×6Ò6Ø�GŠG‰IŒI•u”xÔ+ÔEñ	
ô 	
ð 	Kõ Œ8ÔÔ9¸R¼]ÐJð	r>   c                 ó>   — t          | ¦  «        ot          | ¦  «        S rá   )Ú_check_valid_to_preserverÇ  r@  s    r;   Ú_is_preservable_cia_oprÊ  ä  s   € Ý# BÑ'Ô'Ð:­J°r©N¬NÐ:r>   c                 ód   — |                       ¦   «                              d¦  «        d         dk    S )Nú::r   Úaten)rN   rC   r@  s    r;   Ú_is_aten_oprÎ  è  s&   € Ø�7Š7‰9Œ9�?Š?˜4Ñ Ô  Ô# vÒ-Ð-r>   c                 ó"   — t          | ¦  «         S rá   )rÎ  r@  s    r;   Ú_is_custom_oprÐ  ì  s   € Ý˜2‰ŒÐÐr>   c            	      óÈ  — t           j                             d¦  «        } | D ]¿}t          |                     d¦  «        ¦  «        \  }}|                     d¦  «        }t          |¦  «        dk    st          |¦  «        dk    sJ ‚|d         }d}t          |¦  «        dk    r|d         }t          t          t          t           j        |¦  «        |¦  «        |¦  «        }ŒÀdS )	z�
    Utility function to query C++ dispatcher to get the all
    possible CIA ops and populate them into torch.ops namespace
    rÅ  rÌ  r?   r    r¡   r   ÚdefaultN)ri   rÂ  Ú,_dispatch_get_registrations_for_dispatch_keyrR  rC   r¸   rD   Úops)Úcia_opsrp   Ú	namespaceÚop_nameÚ
split_listÚop_overload_namer~   s          r;   Ú_materialize_cpp_cia_opsrÚ  ò  sã   € õ
 Œh×CÒCØ#ñô €Gð
 ð 
Wð 
WˆÝ" 2§8¢8¨D¡>¤>Ñ2Ô2Ñˆ	�7Ø—]’] 3Ñ'Ô'ˆ
å�:‰Œ !Ò#Ð#¥s¨:¡¤¸!Ò';Ð';Ð';Ð;Ø˜Q”-ˆØ$ÐÝˆz‰?Œ?˜aÒÐØ)¨!œ}Ðå•G�G¥E¤I¨yÑ9Ô9¸7ÑCÔCÐEUÑVÔVˆˆð
Wð 
Wr>   c                  ó   — t           S )z]
    This is an special marker that tells our infra that we shouldn't decompose this op.
    )ÚNotImplemented)rJ  Úkwargss     r;   Ú_special_op_to_preserve_ciarÞ  	  s
   € õ Ðr>   Úop_overloadc                 óH  — ddl m}  || ¦  «        rdS | t          j        v rdS t	          | d¦  «        sdS t          d„ | j        j        D ¦   «         ¦  «        }|dk    p| j        j        }|rdS t          j
                             |                      ¦   «         ¦  «        sdS dS )Nr   )Ú#_should_decompose_because_unsafe_opFÚ_schemac                 ó    — g | ]}|j         ®	|‘ŒS rá   )Ú
alias_info)r9   r[  s     r;   r•   z,_check_valid_to_preserve.<locals>.<listcomp>   s   € ÐNÐNÐNˆq°Q´\Ð5MˆÐ5MÐ5MÐ5Mr>   T)Útorch._decomprá  r   Úmetadata_fnsr:  r¸   râ  ry  Ú
is_mutableri   rÂ  Ú_dispatch_has_kernelrN   )rß  rá  rä  Úis_mutating_or_aliasings       r;   rÉ  rÉ    sÏ   € ØAÐAÐAÐAÐAÐAà*Ð*¨;Ñ7Ô7ð ØˆuØÕ&Ô3Ð3Ð3Øˆuå�; 	Ñ*Ô*ð ØˆuåØNÐN�KÔ'Ô1ÐNÑNÔNñô €Jð )¨AšoÐO°Ô1DÔ1OÐàð ØˆuåŒ8×(Ò(¨×)9Ò)9Ñ);Ô);Ñ<Ô<ð Øˆuàˆ4r>   r    )Úmaxsizec                  ó    — t          d¦  «        S )NrÍ  )Ú(_collect_all_valid_cia_ops_for_namespacer2   r>   r;   Ú-_collect_all_valid_cia_ops_for_aten_namespacerí  .  s   € å3°FÑ;Ô;Ð;r>   rÖ  c                 ój  — t          ¦   «          t          t          j        | ¦  «        sJ ‚t	          t          j        | ¦  «        }t          ¦   «         }|D ]]}t	          ||¦  «        }|                     ¦   «         D ]6}t	          ||¦  «        }t          |¦  «        r|                     |¦  «         Œ7Œ^|S rá   )	rÚ  r:  ri   rÔ  rD   ÚsetÚ	overloadsrÊ  rH   )rÖ  Úop_namespacerÕ  rp   Ú	op_packetÚoverloadrß  s          r;   rì  rì  3  s¹   € åÑÔÐõ •5”9˜iÑ(Ô(Ð(Ð(Ð(Ý�5œ9 iÑ0Ô0€LÝ‰eŒe€GØð )ð )ˆÝ˜L¨"Ñ-Ô-ˆ	Ø!×+Ò+Ñ-Ô-ð 	)ð 	)ˆHÝ! )¨XÑ6Ô6ˆKÝ% kÑ2Ô2ð )Ø—’˜KÑ(Ô(Ð(øð	)ð €Nr>   c                  óž   — t          ¦   «         } t          j        j        D ],}|dk    r| t	          |¦  «        z  } Œ| t          ¦   «         z  } Œ-| S )a  
    This is an util function that gets the all CIA functional ops.

    The algorithm is in 2 steps:
      1. We first query C++ dispatcher to get the list of CIA ops
         and then we call getattr on torch.ops.aten to lazily populate
         them.

      2. Sometimes, handful of ops have CIA registered in python dispatcher
         but not on the C++ side, these can't be caught at the first step.
         So we walk again to get the final list.

    Note that the output of this function should never be modified
    rÍ  )rï  ri   rÔ  Ú_dirrì  rí  )rÕ  Úop_namespace_names     r;   Ú_collect_all_valid_cia_opsr÷  D  s\   € õ ‰eŒe€GÝ"œYœ^ð Gð GÐà Ò&Ð&ØÕ?Ð@QÑRÔRÑRˆGˆGàÕDÑFÔFÑFˆGˆGØ€Nr>   c                 óà   — t           j        j        j        }|| j        v r7t          | j        |         t           j        j        ¦  «        s| j        |         S d„ }t          j        || ¬¦  «        S )Nc                  ó  — |d         }|d= t           j        j        j        }t           j                             |                     ¦   «         t           j        j        j        ¦  «        r |j        |g| ¢R i |¤ŽS t          d|› d�¦  «        ‚)NÚkernelz	Expected z) to have CompositeImplicitAutograd kernel)ri   rÂ  rÄ  rÅ  rÃ  rN   Ú_op_dkÚAssertionError)rJ  rÝ  rú  Údks       r;   Ú_special_op_to_decompose_ciaz9_get_decomp_for_cia.<locals>._special_op_to_decompose_ciah  s–   € Ø˜Ô!ˆØ�8Ðõ ŒXÔ!Ô;ˆÝŒ8×9Ò9Ø�KŠK‰MŒM�5œ8Ô/ÔIñ
ô 
ð 	ð !�6”= Ð5 dÐ5Ð5Ð5¨fÐ5Ð5Ð5å ØM˜FÐMÐMÐMñô ð r>   )rú  )ri   rÂ  rÄ  rÅ  rÆ  rq   r$  r%  )rp   rý  rþ  s      r;   Ú_get_decomp_for_ciarÿ  ]  sn   € õ 
ŒÔ	Ô	7€BØ	ˆRŒ]ÐÐ¥:¨b¬m¸BÔ.?ÅÄÔAUÑ#VÔ#VÐØŒ}˜RÔ Ð ðð ð õ ÔÐ9À"ÐEÑEÔEÐEr>   )r/   r   )rU   r   rV   r   )F)NNrá   )r/   N)rß  r   )rp   r   )wrc  râ   r$  rg  rÇ   rG  r¢   Ú
contextlibr   r   Útypingr   r   r   r   r	   r
   r   r   r   r   r   ri   Útorch._guardsr   Útorch._subclasses.fake_tensorr   Ú#torch._subclasses.functional_tensorr   Útorch.fx._utilsr   Útorch.fx.passes.runtime_assertr   r@   r   Ú
torch._opsr   Útorch.exportr   Útorch.export.graph_signaturer   r   r   r   Útorch.utils._pytreer   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   rœ  Ú	PARAMETERr5   ÚCONSTANT_TENSORr£  r¢  r   rT   rY   rj   rk   rl   r�   r�   r›   Úboolr¨   rN  rÖ   rõ   rù   rr   rý   rÿ   r»   r  r  r  r  r  r'  r,  r¥   r.  r0  r8  rs   r<  r]  rh  rq  r}  r„  r®  rµ  Ú_subclassesÚfake_tensorÚFakeTensorModer–   rÀ  rÇ  rÊ  rÎ  rÐ  rÚ  rÞ  rÉ  Ú	lru_cacherí  rì  r÷  rÿ  r2   r>   r;   ú<module>r     se
  ðà 
€
€
€
Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð €€€Ø *Ð *Ð *Ð *Ð *Ð *Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø @Ð @Ð @Ð @Ð @Ð @Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø JÐ JÐ JÐ JÐ JÐ Jð ð BØHÐHÐHÐHÐHÐHØ'Ð'Ð'Ð'Ð'Ð'Ø,Ð,Ð,Ð,Ð,Ð,ØAÐAÐAÐAÐAÐAà QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ Qðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð" Ô˜"ØÔ˜ØÔ�dØÔ˜tØÔ˜&Ø„O�WðÐ ðàðð ð ð ð<Ø#ðØ.Dðð ð ð ð 6'¨¬Ô(<ð 6'ÀÀcÈ3ÀhÄð 6'ð 6'ð 6'ð 6'ðr)Ø!% c¨3 h¤ð)àŒÔð)ð $ð)ð 
ð	)ð )ð )ð )ð8$˜uœxÔ3ð $ð $ð $ð $ð& !ð	ð Ø�3˜�8Œnðàðð ðð ð	ð ð ð ð:Ø˜UœXœ]Ô+ðà	ðð ð ð ðH )-Ø,0ð4ð
 +/Ø9=Ø=AØ$ð4ð 4ð 4Ø	ˆcŒð4à˜Ô%ð4ð ˜=Ô)ð4ð
 # 3œ-ð4ð "Ð"5Ô6ð4ð $Ð$9Ô:ð4ð ð4ð 
ð4ð 4ð 4ð 4ðnEÐ'ð E¨u¬x¬}ð EÀð Eð Eð Eð EðØðà
Œ(Œ-ðð ˆeŒhÔ Ô!ðð ð ð ð BÐ(ð B°´´ð BÀ$ð Bð Bð Bð BðØðà
Œ(Œ-ðð ˆeŒlÔðð ð ð ð&RØðRà
Œ(Œ-ðRð 
ðRð Rð Rð RðØðà
Œ(Œ-ðð ˆeŒlÔðð ð ð ð$ØŒÔðà˜eœhœm˜_¨e°E´H´MÀ4Ð4GÔ.HÐHÔIðð „XÔðð ð ð ð><˜˜UœXœ]Ô+ð <ÀÀUÄXÄ]Ô@Sð <ð <ð <ð <ð
 U¤XÔ%9ð ð ð ð ð< 04ð
ð 
Ø�””Ôð
àˆeŒhŒmÔð
ð 
ð 
ð 
ð4�t˜EœHœMÔ*ð 4¸sð 4ð 4ð 4ð 4ð
�T˜%œ(œ-Ô(ð ¸TÀ%Ä(Ä-Ô=Pð ð ð ð ð(˜EœHœMð (°U´X´]ð (Àtð (ð (ð (ð (ð7 E¤HÔ$8ð 7¸u¼x¼ð 7ÐSWð 7ð 7ð 7ð 7ðL ¤¤ð L°(¸5¼8Ô;OÔ2Pð Lð Lð Lð Lð^4°´´ð 4ÀGÔDUð 4ð 4ð 4ð 4ð29ð 9ð 9ð'¨¬Ô(<ð 'Àð 'ð 'ð 'ð 'ðTN$ØŒÔðN$à2ðN$ð 
ŒŒðN$ð �C˜�HŒ~ðN$ð 
ðN$ð N$ð N$ð N$ðb¨Tð ¸Tð Àdð ð ð ð ð*3ØŒÔð3à
ÔÔ"Ô1ð3ð 3ð 3ð 3ð< ð	9¨¬¬ð 	9ð 	9ð 	9ñ „ð	9ð�>ð  dð ð ð ð ð;˜~ð ;°$ð ;ð ;ð ;ð ;ð.�Nð . tð .ð .ð .ð .ð�nð ¨ð ð ð ð ðWð Wð Wð Wð.ð ð ðð ð ð ð4 €Ô˜QÐÑÔð<°s¸>Ô7Jð <ð <ð <ñ  Ôð<ð¸ð ÀÀNÔ@Sð ð ð ð ð" C¨Ô$7ð ð ð ð ð2Fð Fð Fð Fð Fð Fr>   