ó
    Eñimì  ã                   ó&  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJrJr  S SKJr  S SKJrJr  S SKJrJrJrJr  S SKrS SKJr  S SKJrJr  S S	KJr  S S
KJ r   S SK!J"r"  S SK#J$r$  \(       a  S SK%r%S SK&J'r'  S SK(J)r)  S SK*J+r+  S SK,J-r-  S SK,J.r.J/r/J0r0  S SK1J2r2J3r3  S SK4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArA  \/R„                  S\/R†                  S\/Rˆ                  S\/RŠ                  S\/RŒ                  S\/RŽ                  S0rHSqI  SƒS jrJS\R–                  R˜                  4S jrM  S„S  jrN    S…S" jrOS\R–                  R˜                  S\P\Q\4   4S# jrRS$ rSS%\P\Q\4   S&\R–                  R˜                  S!SSS4S' jrTS&\R–                  R˜                  4S( jrU S†S)\P\Q\Q4   S*\P\Q\V4   S+\W\Q   S,\QS-\QS.\X4S/ jjrYS0\;S\Q4S1 jrZ S‡S2\\V\R¶                  4   S3\VS4\;S5\\V   SS4
S6 jjr\S7\]\R–                  R¼                     SS4S8 jr_  SˆSSSSS9.S:\`\   S;\\8   S<\\A   S=\\Q   S>\\?   S?\\9   S@\XSS4SA jjjraSBSCSD\R–                  R¼                  S\X4SE jrbSBSCSD\R–                  R¼                  S\\RÆ                  R"                     4SF jrdSBSCSD\R–                  R¼                  S\X4SG jreSBSCSD\R–                  R¼                  S\\RÌ                     4SH jrgSBSCSD\R–                  R¼                  S\X4SI jrhSBSCSD\R–                  R¼                  S\\RÌ                     4SJ jriS&\R–                  R˜                  SK\\R–                  R¼                  /\\R–                  R¼                  \X4   4   S\R–                  R˜                  4SL jrjSM\]\R–                  R¼                     S\]\R–                  R¼                     4SN jrk\SO 5       rlS&\R–                  R˜                  SS4SP jrmS&\R–                  R˜                  4SQ jrn S‡SM\]\R–                  R¼                     S\\R–                  R¼                     4SR jjroSM\]\R–                  R¼                     S\V4SS jrpSM\]\R–                  R¼                     S\]\R–                  R¼                     4ST jrqSU\R–                  R¼                  SV\R–                  R¼                  SS4SW jrrS&\R–                  R˜                  S\RÆ                  Ræ                  SS4SX jrtSY\R–                  R¼                  S\\R–                  R˜                     4SZ jruS\RÆ                  Ræ                  S\Rì                  4S[ jrwS\ rxS] ryS&\R–                  R˜                  SS4S^ jrzS&\R–                  R˜                  S)\P\Q\Q4   S_\P\Q\4   SS4S` jr{S&\R–                  R˜                  SaSS\RÆ                  Ræ                  Sb\P\Q\4   SS4
Sc jr|Sd\PSe\XS\P4Sf jr}S&\R–                  R˜                  S\\Rü                  Rþ                  R8                     4Sg jr€\S\RÆ                  Ræ                  4Sh j5       r�SiSjS\X4Sk jr‚SiSjS\X4Sl jrƒSiSjS\X4Sm jr„SiSjS\X4Sn jr…S‰So jr†Sp r‡SŠSq jrˆ\GR                  " SrSs9S\WSj   4St j5       rŠSu\GR                  GR                  S\WSj   4Sv jr�S\WSj   4Sw jrŽS‹Sx jr�\Sy 5       r�Sz\S\RÆ                  Ræ                  S\P\Q\\RÌ                  \RÆ                  R"                  4   4   4S{ jr‘S:\`\RÆ                  Ræ                     SS4S| jr’S:\`\RÆ                  Ræ                     SS4S} jr“S~ r”S r• " S€ S�\RÆ                  Ræ                  5      r–S‚ r—g)Œé    N)Údefaultdict)ÚCallableÚIterable)Úcontextmanager)ÚismethodÚ	Parameter)ÚAnyÚOptionalÚTYPE_CHECKINGÚUnion)Údetect_fake_mode)Ú
FakeTensorÚFakeTensorMode)ÚFunctionalTensor)Ú#first_call_function_nn_module_stack)ÚPreDispatchTorchFunctionMode)Úinsert_deferred_runtime_asserts©ÚConstantAttrMap)ÚOperatorBase)ÚExportedProgram)ÚExportGraphSignature)ÚCustomObjArgumentÚ	InputKindÚ
OutputKind)Ú_deregister_pytree_flatten_specÚregister_pytree_flatten_spec)Ú_deregister_pytree_nodeÚ_register_pytree_nodeÚContextÚFlattenFuncÚFromDumpableContextFnÚ
GetAttrKeyÚKeyPathÚkeystrÚ
MappingKeyÚSequenceKeyÚToDumpableContextFnÚtree_flatten_with_pathÚUnflattenFuncÚ Úp_Úb_Úc_Úobj_ÚtokenFÚreturnc                 óà  • SSK Jn  U" 5       nU R                   Vs1 s HB  nUR                  [        R
                  :X  d  M#  UR                  (       a  M6  UR                  iMD     nnUR                  5        Hn  u  pxXv;   a  M  Un	UR                  S5      Gt p«U
 H  n[        Xœ5      n	M     U	R                  R                  US 5        [        X›U5        UR                  X‡5        Mp     U$ s  snf )Nr   r   Ú.)Ú(torch._export.passes.lift_constants_passr   Úinput_specsÚkindr   ÚBUFFERÚ
persistentÚtargetÚitemsÚsplitÚgetattrÚ_buffersÚpopÚsetattrÚadd)Úgraph_signatureÚ	constantsÚmodr   Úconstant_attrsÚspecÚnon_persistent_buffersÚnameÚvalueÚ_modÚatomsÚattrÚatoms                ÚP/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_export/utils.pyÚ_collect_and_set_constant_attrsrN   D   sÝ   € õ Iá$Ó&€Nð $×/Ò/óâ/ˆDØ�9‰9œ	×(Ñ(Ñ(ó 	à15·µó 	ˆ�ŒÙ/ð ð ð
 !—‘Ö(‰ˆØÓ)ÙàˆØ—z‘z #“‰ˆÛˆDÜ˜4Ó&ŠDñ ð 	�‰×Ñ˜$ Ô%Ü�˜EÔ"Ø×Ñ˜5Ö'ñ )ð Ðùò#s   œ"C+ÁC+ÁC+rC   c                 ór  • SSK JnJn  [        5       nU R                  R
                   Hú  nUR                  S:X  d  M  [        R                  R                  R                  XR                  5      n[        U[        R                  5      (       d  Mi  UR                  U;  d  M{  UR                  U;  d  M�  [        R                  R                  R                  XR                  5        U" XpUR                  UR                  S5        UR!                  UR                  5        Mü     U R#                  5         U$ )Nr   )Ú_assign_attrÚ	_AttrKindÚget_attrF)Útorch.export.unflattenrP   rQ   ÚsetÚgraphÚnodesÚopÚtorchÚfxÚgraph_moduleÚ	_get_attrr9   Ú
isinstanceÚTensorÚ	_del_attrr7   r@   Ú	recompile)rC   Ú
state_dictrF   rP   rQ   Útemp_registered_constantsÚnoder9   s           rM   Ú_register_constants_as_buffersrc   b   sÎ   € ÷ ?ä #£Ðà—	‘	—”ˆØ�7‰7�jÕ Ü—X‘X×*Ñ*×4Ñ4°S¿+¹+ÓFˆFÜ˜&¤%§,¡,×/Ó/ð —K‘K zÕ1Ø—K‘KÐ'=Õ=ä—H‘H×)Ñ)×3Ñ3°C¿¹ÔEÙ  ¨d¯k©k¸9×;KÑ;KÈUÔSØ-×1Ñ1°$·+±+Ö>ñ  ð ‡M�M„Oà$Ð$ó    r   c                 ó@  • U R                    H1  nUR                  U;   d  M  [        R                  Ul        S Ul        M3     U R                   HL  nUR                  [        R                  :X  d  M#  UR                  U;   d  M5  [        SUR                   S35      e   U $ )Nz	Constant z< is mutated in the forward method. Pls register it as buffer)
r5   r9   r   ÚCONSTANT_TENSORr6   r8   Úoutput_specsr   ÚBUFFER_MUTATIONÚRuntimeError)Úsigra   rE   s      rM   Ú7_override_graph_signature_for_temp_registered_constantsrk   |   s‰   € ð —”ˆØ�;‰;Ð3Õ3Ü!×1Ñ1ˆDŒIØ"ˆDŽOñ  ð
 × Ô ˆà�I‰Iœ×3Ñ3Õ3Ø—‘Ð8Õ8äØ˜DŸK™K˜=Ð(dÐeóð ñ !ð €Jrd   Únew_sigc                 óZ  • U R                    Vs1 s HB  nUR                  [        R                  :X  d  M#  UR                  (       a  M6  UR
                  iMD     nnUR                    H<  nUR                  [        R                  :X  d  M#  UR
                  U;   d  M5  SUl        M>     U$ s  snf )NF)r5   r6   r   r7   r8   r9   )Úold_sigrl   rE   rF   s       rM   Ú/_overwrite_signature_for_non_persistent_buffersro   �   s‘   € ð ×'Ò'óâ'ˆDØ�9‰9œ	×(Ñ(Ñ(ó 	à15·µó 	ˆ�ŒÙ'ð ð ð ×#Ô#ˆØ�9‰9œ	×(Ñ(Õ(¨T¯[©[Ð<RÕ-RØ#ˆDŽOñ $ð €Nùòs   �"B(µB(ÁB(c                 óÎ  • 0 nS[         R                  R                  S[        4S jnU R                  R
                   GH¢  nUR                  nUR                  nUR                  S:X  aw  U" X5      n[        U[         R                  R                  5      (       aF  UR                  SSS9 H  u  pxXQUS-   U-   '   M     UR                  SSS9 H  u  pxXQUS-   U-   '   M     UR                  S	:X  a5  U" X5      n[        U[         R                  R                  5      (       d  XQU'   UR                  S
:X  d  Mú  [        UR                  [         R                  R                  5      (       a  GM0  UR                    Hb  n	U	R                  S	:X  d  M  [         R                  R"                  R$                   H%  n
U
S:X  a  M  X¥;   d  M  XZ   XR                     U
'   M'     Md     GM¥     U$ )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                 ó’   • UR                  S5      Gt p#U nU H"  n[        XES 5      nUb  M  [        SU< S35      e   [        XC5      $ )Nr3   z
attribute z not found in path)r;   r<   ÚAssertionError)rq   rr   ÚprefixÚfieldÚtÚitems         rM   Ú_getattrÚ0_collect_param_buffer_metadata.<locals>._getattr©   sT   € Ø"Ÿ™¨Ó-‰ˆØˆÛˆDÜ˜ Ó&ˆAØ‹yÜ$ z°$±Ð9KÐ%LÓMÐMñ ô
 �qÓ Ð rd   Úcall_moduleTF)ÚrecurseÚremove_duplicater3   rR   Úcall_functionÚcustom)rX   rY   ÚGraphModuleÚstrrU   rV   r9   ÚmetarW   r\   ÚnnÚModuleÚnamed_parametersÚnamed_buffersÚ_opsÚHigherOrderOperatorÚ_input_nodesÚproxyÚ_COPY_META_FIELDS)rC   Úparams_buffers_to_node_metary   rb   r9   r‚   Ú	submodulerG   Ú_ÚargÚentrys              rM   Ú_collect_param_buffer_metadatar‘       s®  € ð #%Ðð!œŸ™×,Ñ,ð !¼ô !ð —	‘	—•ˆØ—‘ˆØ�y‰yˆØ�7‰7�mÓ#Ù  Ó-ˆIÜ˜)¤U§X¡X§_¡_×5Ñ5Ø(×9Ñ9Ø °5ð  :ó  ‘G�Dð HL°¸±¸tÑ0CÓDñ ð
  )×6Ñ6Ø °5ð  7ó  ‘G�Dð HL°¸±¸tÑ0CÓDñ ð
 �7‰7�jÓ Ù  Ó-ˆIÜ˜i¬¯©×)=Ñ)=×>Ñ>Ø6:¨FÑ3ð
 �7‰7�oÕ%¬jØ�K‰KœŸ™×7Ñ7÷/
ô /
ð ×(Ô(�Ø—6‘6˜ZÕ'Ü!&§¡§¡×!AÔ!A˜à  HÓ,Ù$Ø �=ØMQÉ[Ð7¿
¹
ÑCÀEÓJó "Bô )ñ7  ðH 'Ð&rd   c                  ó\  • [         R                  R                  5       (       d  g [         R                  R	                  5       n U  Vs/ s H  n[        U[        5      (       d  M  UPM     nn[        U5      S:”  a  [        S[        U5       35      e[        U5      S:X  a  g US   nU$ s  snf )Né   z6Expected only one PreDispatchTorchFunctionMode, found r   )	rX   Ú_CÚ_is_torch_function_mode_enabledÚ	overridesÚ _get_current_function_mode_stackr\   r   Úlenrt   )Útorch_function_mode_stackÚmodeÚpre_dispatch_tf_modess      rM   Ú+_maybe_find_pre_dispatch_tf_mode_for_exportrœ   Ú   s­   € Ü�8‰8×3Ñ3×5Ñ5Øä %§¡× PÑ PÓ RÐñ .óâ-ˆDÜ�dÔ8×9÷ 	Ù-ð ð ô Ð Ó! AÓ%ÜØDÄSÐI^ÓE_ÐD`Ðaó
ð 	
ô Ð Ó! QÓ&Øà  Ñ#€DØ€Kùòs   ÁB)Á$B)rŒ   Úgmc                 ód  • U R                  5        H'  nUR                  SS5        UR                  SS5        M)     UR                  R                   HÛ  nUR                  S:X  d  M  UR
                  UR                  ;   aG  UR                  UR
                     nXP;   a)  X   R                  5        H  u  pgXtR                  U'   M     UR
                  UR                  ;   d  M’  UR                  UR
                     nX€;   d  M²  X   R                  5        H  u  pgXtR                  U'   M     MÝ     g)ze
Given that we collected param'buffer metadata before, we put them back in
newly traced graph module
Únn_module_stackNÚstack_traceÚplaceholder)
Úvaluesr>   rU   rV   rW   r9   Úinputs_to_parametersr:   r‚   Úinputs_to_buffers)	rŒ   r�   rl   Úmetadatarb   Ú
param_nameÚkÚvÚbuffer_names	            rM   Ú)_populate_param_buffer_metadata_to_new_gmrª   ò   sô   € ð 0×6Ñ6Ö8ˆØ�‰Ð&¨Ô-Ø�‰�] DÖ)ñ 9ð —‘—”ˆØ�7‰7�mÕ#Ø�{‰{˜g×:Ñ:Ó:Ø$×9Ñ9¸$¿+¹+ÑF�
ØÓ<Ø ;Ñ G× MÑ MÖ O™˜Ø'(Ÿ	™	 !›ñ !Pà�{‰{˜g×7Ñ7Õ7Ø%×7Ñ7¸¿¹ÑD�ØÕ=Ø ;Ñ H× NÑ NÖ P™˜Ø'(Ÿ	™	 !›ó !Qò rd   c                 óf  • U R                   R                   Vs/ s H1  nUR                  R                  SS 5      c  M"  UR                  S   PM3     nn[	        U 5      nUb  UR
                  $ U H:  n[        U[        R                  5      (       d  M$  UR                  R
                  s  $    g s  snf )NÚval)
rU   rV   r‚   ÚgetÚ_detect_fake_mode_from_gmÚ	shape_envr\   rX   ÚSymIntrb   )r�   rb   ÚvalsÚ	fake_moder¨   s        rM   Ú_get_shape_env_from_gmr³     s—   € ð —H‘H—N’Nóâ"ˆDØ�9‰9�=‰=˜ Ó%ó 	ˆ�	‰	�%ÔÙ"ð 	ð ô *¨"Ó-€IØÑØ×"Ñ"Ð"ÛˆÜ�aœŸ™×&Ó&Ø—6‘6×#Ñ#Ò#ò ùòs
   ™!B.¾B.Úname_mapÚfind_availableÚ
used_namesÚ	orig_namerG   Úis_placeholderc                 ó¨  • [         R                  " SU5      nUnU(       a*  U(       d#  UR                  S5      UR                  S5      p˜UnUn
X¢;   a  U SX   S-    3n
[         R                  " SU
5      nU(       a?  UR                  S5      UR                  S5      p˜[        U	5      X   :”  a  [        U	5      X'   X U'   UR	                  U
5        X   $ )aI  
Renames nodes to avoid name collisions, with suffixing.
name_map: map from original name to new name
find_available: map prefix to available suffix
used_names: cache of used names
orig_name: mapping key
name: candidate name (potentially suffixed, e.g. mul_2)
is_placeholder: if the node is a placeholder, avoid detecting suffix
ú
(.*)_(\d+)r“   é   rŽ   )ÚreÚmatchÚgroupÚintr@   )r´   rµ   r¶   r·   rG   r¸   r½   Úkeyru   ÚnÚnew_names              rM   Ú_rename_without_collisionsrÃ     sÀ   € ô" �HŠH�] DÓ)€EØ
€Cæ–^Ø—K‘K “N E§K¡K°£N�Øˆà€HØÓØ�U˜!˜NÑ/°!Ñ3Ð4Ð5ˆä�HŠH�] HÓ-€EÞØ—K‘K “N E§K¡K°£N�Üˆq‹6�NÑ*Ó*Ü%(¨£VˆNÑ"à"ˆYÑØ‡N�N�8ÔàÑÐrd   Úkey_pathc                 ó|  • U S   n[        U[        5      (       d!  [        S[        U5      R                   35      eUR
                  S:X  a  S[        U SS 5       3$ U S   n[        U[        [        45      (       d!  [        S[        U5      R                   35      e[        U5      SS nU [        U SS 5       3$ )	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expected SequenceKey, got z*argsr“   Nz'expected GetAttrKey or MappingKey, got éÿÿÿÿr»   )
r\   r'   rt   ÚtypeÚ__name__Úidxr%   r#   r&   r�   )rÄ   Úargs_kwargs_key_pathÚ	kwarg_keyrG   s       rM   Ú
get_keystrrÌ   E  sÓ   € ð $ A™;ÐÜÐ*¬K×8Ñ8ÜØ(¬Ð.BÓ)C×)LÑ)LÐ(MÐNó
ð 	
ð ×Ñ 1Ó$Ø”v˜h q r˜lÓ+Ð,Ð-Ð-à˜Q‘Kˆ	Ü˜)¤j´*Ð%=×>Ñ>Ü Ø9¼$¸y»/×:RÑ:RÐ9SÐTóð ô �9‹~˜a Ð#ˆØ�œ˜x¨¨˜|Ó,Ð-Ð.Ð.rd   Úsymintr�   ÚkeypathÚic                 ó€  • SSK Jn  [        U[        R                  5      (       a%  UR
                  R                  R                  (       a  [        X5      (       a  g SS KnSSK	J
n  SSKJn	  [        U [        R                  5      (       Ga3  [        U R
                  R                  R                  5      S:X  Ga  [        [!        U R
                  R                  R                  5      5      n
X£;   aV  U R
                  R                  R#                  U5      nX:w  a+  [%        U5      nUb	  USU S3-  n['        SU S	U S
U 35      eOÁ[        U R
                  R                  UR(                  5      (       a  [+        U5      X:'   O„U	" UR,                  " U R
                  R                  U5      U
5      nUcC  [%        U5      nUb	  USU S3-  n['        SU SU SU R
                  R                   SU
 S3	5      e[+        US   5      X:'   U R
                  R                  U;   aœ  U" X R
                  R                     5      u  pïUS:”  a0  X:  a+  [%        U5      nUb	  USU S3-  n['        SU SU S
U 35      eU[.        R0                  :  a1  X:”  a+  [%        U5      nUb	  USU S3-  n['        SU SU S
U 35      eg g g [        U [        R                  5      (       a&  U R
                  R                  R                  (       d  g U[+        U 5      :w  a,  [%        U5      nUb	  USU S3-  n['        SU S	U  S
U S35      eg )Nr   )Ú_IntWrapper)Ú_convert_range_to_int)Ú	try_solver“   z.shape[Ú]úExpected input at ú to be equal to ú
, but got zExpected input z = z to be of the form z, where z is an integerr»   z
 to be >= z
 to be <= zt. If you meant for this dimension to be dynamic, please re-export and specify dynamic_shapes (e.g. with Dim.DYNAMIC))Útorch.export.dynamic_shapesrÑ   r\   rX   r°   rb   ÚexprÚ	is_numberÚsympyÚ@torch._export.passes.add_runtime_assertions_for_constraints_passrÒ   Útorch.utils._sympy.solverÓ   r˜   Úfree_symbolsÚnextÚiterÚsubsrÌ   ri   ÚSymbolr¿   ÚEqÚmathÚinf)rÍ   r�   Úrange_constraintsÚunification_maprÎ   rÏ   rÑ   rÛ   rÒ   rÓ   ÚsymbolÚexisting_dimÚpathÚsolutionÚmin_valÚmax_vals                   rM   Ú_check_symintrî   ]  s<  € õ 8ô 	�3œŸ™×%Ñ%Ø—‘—‘×'×'Ü�c×'Ñ'ð
 	ãõõ 3ä�&œ%Ÿ,™,×'Ò'¬C°·±×0@Ñ0@×0MÑ0MÓ,NÐRSÔ,SÜ”d˜6Ÿ;™;×+Ñ+×8Ñ8Ó9Ó:ˆØÓ$Ø!Ÿ;™;×+Ñ+×0Ñ0°ÓAˆLØÓ"Ü! 'Ó*�Ø‘=Ø˜g a S¨˜NÑ*�DÜ"Ø(¨¨Ð.>¸|¸nÈJÐWZÐV[Ð\óð ð	 #ô ˜&Ÿ+™+×*Ñ*¨E¯L©L×9Ñ9ô
 +.¨c«(�Ò'á$ U§X¢X¨f¯k©k×.>Ñ.>ÀÓ%DÀfÓM�ØÑ#Ü% gÓ.�DØ‘}Ø '¨!¨¨A Ñ.˜Ü&Ø)¨$¨¨s°3°%ð 8'Ø'-§{¡{×'7Ñ'7Ð&8¸ÀÀÈðXóð ô
 /2°(¸1±+Ó.>�OÑ+à�;‰;×ÑÐ0Ó0Ù4Ø!§+¡+×"2Ñ"2Ñ3ó ÑˆGð ˜‹{Ø“=Ü% gÓ.�DØ‘}Ø '¨!¨¨A Ñ.˜Ü&Ø,¨T¨F°*¸W¸IÀZÐPSÈuÐUóð ð œŸ™Ó!Ø“=Ü% gÓ.�DØ‘}Ø '¨!¨¨A Ñ.˜Ü&Ø,¨T¨F°*¸W¸IÀZÐPSÈuÐUóð ð	 !ð "ð 1ô* 
�FœEŸL™L×	)Ñ	)°&·+±+×2BÑ2B×2L×2Lð 	Ø	”�F“Ó	Ü˜'Ó"ˆØ‰=Ø�g˜a˜S �NÑ"ˆDÜØ   Ð&6°v°h¸jÈÈð N&ð &ó
ð 	
ð	 
rd   Úinput_placeholdersc           
      óø  • [        U5      [        U 5      :w  a$  [        S[        U 5       S[        U5       S35      e0 n[        X5       GH¬  u  u  pEnUR                  R	                  S5      n[        U[        5      (       aå  [        U[        R                  5      (       d#  [        S[        U5       S[        U5       35      e[        UR                  5      [        UR                  5      :w  a2  [        S[        U5       SUR                   SUR                   S35      e[        [        UR                  UR                  5      5       H  u  nu  pš[        X©X#XH5        M     GM  [        U[        [        [         45      (       a<  [        U5      [        U5      Ld  XW:w  a  [        S[        U5       S	U S
U 35      eGMz  [        U[        R"                  5      (       d  GMœ  [        UUUUUS 5        GM¯     g )Nz&Unexpected number of inputs (expected z, got Ú)r¬   rÕ   z to be a tensor, but got z,Unexpected number of dimensions in input at z.shape (expected rÖ   r×   )r˜   ri   Úzipr‚   r­   r\   r   rX   r]   rÌ   rÇ   ÚshapeÚ	enumeraterî   r¿   Úfloatr�   r°   )rï   Úflat_args_with_pathræ   rç   rÄ   r�   rb   Únode_valÚjÚarg_dimÚnode_dims              rM   Ú"_check_input_constraints_for_graphrû   »  sá  € ô ÐÓ¤3Ð'9Ó#:Ó:ÜðÜÐ/Ó0Ð1°¼Ð<OÓ8PÐ7QÐQRðTó
ð 	
ð 02€OÜ!$Ð%8×!MÑ‰ˆ˜Ø—9‘9—=‘= Ó'ˆÜ�h¤
×+Ñ+Ü˜c¤5§<¡<×0Ñ0Ü"Ø(¬°HÓ)=Ð(>Ð>WÔX\Ð]`ÓXaÐWbÐcóð ô �8—>‘>Ó"¤c¨#¯)©)£nÓ4Ü"ØBÄ:ÈhÓCWÐBXð Y!Ø!)§¡Ð 0°°s·y±y°kÀðDóð ô
 +4´C¸¿	¹	À8Ç>Á>Ó4RÖ*SÑ&�Ñ&�GÜØÐ'8È8öô +Tô
 ˜¤3¬¬sÐ"3×4Ñ4Ü�C‹y¤ X£Ò.°#³/Ü"Ø(¬°HÓ)=Ð(>Ð>NÈxÈjÐXbÐcfÐbgÐhóð ò 3Bô ˜¤%§,¡,×/Ô/ÜØØØ!ØØØ÷ò3 "Nrd   )Úserialized_type_nameÚto_dumpable_contextÚfrom_dumpable_contextÚreturn_none_fieldsÚclsÚ
flatten_fnÚunflatten_fnrü   rý   rþ   rÿ   c          
      ó`  ^ ^^• [         R                  " T 5      (       d  [        ST  35      e[        R                  R
                  S[        S[        [        [           [        4   4U4S jj5       n[        R                  R
                  S[        [           S[        S[        4U 4S jj5       n[        R                  R
                  S[        S[        [        [           [        4   4U4S jj5       n	Tb  TOUmUb  UOUnUS L US L -  (       a  [        S	T  S
35      e[        T TUUU	UUS9  g )Nz7Only dataclasses can be registered with this function: Úobjr1   c                 ó  >• / n/ n/ n[         R                  " U 5       Hb  nUR                  [        XR                  5      peUc  T(       a$  UR	                  U5        UR	                  U5        MQ  UR	                  U5        Md     XU/4$ ©N)ÚdataclassesÚfieldsrG   r<   Úappend)r  Ú	flattenedÚ
flat_namesÚ
none_namesÚfrG   r¬   rÿ   s          €rM   Údefault_flatten_fnÚ=register_dataclass_as_pytree_node.<locals>.default_flatten_fnù  s}   ø€ àˆ	Øˆ
Øˆ
Ü×#Ò# CÖ(ˆAØŸ™¤¨¯V©VÓ 4�#Ø‰Ö"4Ø× Ñ  Ô%Ø×!Ñ! $Ö'à×!Ñ! $Ö'ñ )ð  zÐ2Ð2Ð2rd   r¢   Úcontextc           
      ój   >• Uu  p#T" S0 [        [        X 5      5      D[         R                  U5      D6$ )N© )Údictrò   Úfromkeys)r¢   r  r  r  r   s       €rM   Údefault_unflatten_fnÚ?register_dataclass_as_pytree_node.<locals>.default_unflatten_fn  s1   ø€ à!(Ñˆ
ÙÑP”Tœ#˜jÓ1Ó2ÐP´d·m±mÀJÓ6OÑPÐPrd   c                 ó„   >• T" U 5      u  nu  p#[        X!5       VVs/ s H  u  pE[        U5      U4PM     snnU4$ s  snnf r  ©rò   r&   )r  r
  r  Ú_none_namesr§   r¨   r  s         €rM   Údefault_flatten_fn_with_keysÚGregister_dataclass_as_pytree_node.<locals>.default_flatten_fn_with_keys  sC   ø€ á/9¸#«Ñ,ˆ	Ñ,�JÜ/2°:Ô/IÔJÒ/I¡t q”˜A“ Ó"Ñ/IÒJÈJÐVÐVùÓJs   �<z7Both to_dumpable_context and from_dumpable_context for z must be None or registered.©rü   Úflatten_with_keys_fnrý   rþ   )r  Úis_dataclassrt   rX   Ú_dynamoÚdont_skip_tracingr	   ÚtupleÚlistr    r   Ú
ValueErrorr   )
r   r  r  rü   rý   rþ   rÿ   r  r  r  s
   ``    `   rM   Ú!register_dataclass_as_pytree_noder$  ê  sN  ú€ ô ×#Ò# C×(Ñ(ÜØEÀcÀUÐKó
ð 	
ô ‡]�]×$Ñ$ð3¤ð 3¬¬d´3©i¼Ð.@Ñ(Aö 3ó %ð3ô ‡]�]×$Ñ$ðQ¤X¬c¡]ð Q¼Wð QÌö Qó %ðQô ‡]�]×$Ñ$ðW¬#ð W´%¼¼S¹	Ä7Ð8JÑ2Kö Wó %ðWð  *Ñ5‘Ð;M€JØ#/Ñ#;‘<ÐAU€Là˜tÐ#Ð(=ÀÐ(E×FÜØEÀcÀUð K%ð %ó
ð 	
ô
 ØØØØ1Ø9Ø/Ø3órd   Úprogramr   rb   c                 óH   • UR                   U R                  R                  ;   $ )zE
Checks if the given node is a parameter within the exported program
)rG   rA   r£   ©r%  rb   s     rM   Úis_paramr(  %  s   € ð
 �9‰9˜×/Ñ/×DÑDÑDÐDrd   c                 óˆ   • [        X5      (       a2  U R                  R                  UR                     nU R                  U   $ g)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(  rA   r£   rG   r`   )r%  rb   Úparameter_names      rM   Ú	get_paramr+  -  s=   € ô �×ÑØ ×0Ñ0×EÑEÀdÇiÁiÑPˆØ×!Ñ! .Ñ1Ð1àrd   c                 óH   • UR                   U R                  R                  ;   $ )zB
Checks if the given node is a buffer within the exported program
)rG   rA   r¤   r'  s     rM   Ú	is_bufferr-  =  s   € ð
 �9‰9˜×/Ñ/×AÑAÑAÐArd   c                 óØ   • [        X5      (       aZ  U R                  R                  UR                     nX R                  R                  ;   a  U R
                  U   $ U R                  U   $ g)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-  rA   r¤   rG   rF   rB   r`   )r%  rb   r©   s      rM   Ú
get_bufferr/  E  s`   € ô �×ÑØ×-Ñ-×?Ñ?ÀÇ	Á	ÑJˆØ×1Ñ1×HÑHÓHØ×$Ñ$ [Ñ1Ð1à×%Ñ% kÑ2Ð2àrd   c                 óH   • UR                   U R                  R                  ;   $ )zR
Checks if the given node is a lifted tensor constant within the exported program
)rG   rA   Ú!inputs_to_lifted_tensor_constantsr'  s     rM   Úis_lifted_tensor_constantr2  X  s   € ð �9‰9˜×/Ñ/×QÑQÑQÐQrd   c                 óˆ   • [        X5      (       a2  U R                  R                  UR                     nU R                  U   $ g)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)r2  rA   r1  rG   rB   )r%  rb   Úlifted_tensor_names      rM   Úget_lifted_tensor_constantr5  c  sD   € ô ! ×/Ñ/Ø$×4Ñ4×VÑVØ�I‰Iñ
Ðð × Ñ Ð!3Ñ4Ð4àrd   Únode_call_backc                 ó
  ^• SSK Jn  0 mSnU R                  R                   H  nU" U5      (       a  US-  nUTU'   M     U" U U U4S jSSS9nU R                  R                  UR                  l        UR                  5         U$ )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                 ó   >• TU    $ r  r  )rb   Ú	split_maps    €rM   Ú<lambda>Ú"sequential_split.<locals>.<lambda>Š  s	   ø€ �Y˜t’_rd   T)Úkeep_original_orderÚkeep_original_node_name)Útorch.fx.passes.split_moduler8  rU   rV   Ú_codegenr_   )r�   r6  r8  Úsplit_idrb   Únew_gmr:  s         @rM   Úsequential_splitrC  u  s…   ø€ õ :à€IØ€HØ—‘—”ˆÙ˜$×ÑØ˜‰MˆHØ"ˆ	�$‹ñ ñ
 Ø
Ø
Ü$Ø Ø $ñ€Fð ŸH™H×-Ñ-€F‡L�LÔØ
×ÑÔØ€Mrd   rV   c                 óN   • U  Vs/ s H  o!" U5      (       d  M  UPM     sn$ s  snf )z:Returns the nodes that match the node_call_back as a list.r  ©rV   r6  rb   s      rM   Únodes_filterrF  ”  s!   € á"Ó;šU�T n°T×&:�D™UÑ;Ð;ùÒ;s   …"™"c               #   ó8   #   • [         n Sq  S v •  U q g ! U q f = f7f©NT)Ú_DISABLE_ATEN_TO_ASSERTION_PASS)Úorig_vals    rM   Ú$_disable_aten_to_metadata_assertionsrK  ™  s&   é € ô /€HØ&*Ð#ð3Ûà*2Ñ'ø¨(Ñ'üs   ‚	Œ �“—c                 ó  • SSK JnJn  [        (       a  g [        R
                  R                  R                  R                  [        R
                  R                  R                  R                  [        R
                  R                  R                  R                  /nU R                  R                   GH©  nUR                  U;   d  M  UR                  R                  [        R
                  R                  R                  R                   L a,  UR"                  S   UR                  R"                  S   :X  a  M‡  UR"                  S   R$                  R'                  S5      =nc  M´  U R                  R)                  U5         U" U [*        R,                  " UUR$                  R'                  S5      UR$                  R'                  S5      S.S95         U R                  R/                  [        R
                  R                  R                  R                   UR"                  S   4UR                  UR                  UR0                  S.S	9  S S S 5        S S S 5        GM¬     g ! , (       d  f       N= f! , (       d  f       GMÐ  = f)
Nr   ©Ú_node_metadata_hookÚ_set_node_metadata_hookr¬   r    rŸ   )r    rŸ   ©r¥   )ÚdtypeÚdeviceÚlayout©ÚargsÚkwargs)Ú(torch._export.passes._node_metadata_hookrN  rO  rI  rX   ÚopsÚatenÚtorR  rQ  Údtype_layoutrU   rV   r9   ÚprevÚ_assert_tensor_metadataÚdefaultrU  r‚   r­   Úinserting_beforeÚ	functoolsÚpartialr~   rS  )r�   rN  rO  Úaten_to_variantsrb   Ú
tensor_vals         rM   Ú$_insert_aten_to_metadata_assert_passrd  ¤  sÀ  € ÷÷
 'Ò&Øô 	�	‰	�‰×Ñ× Ñ Ü�	‰	�‰×Ñ×ÑÜ�	‰	�‰×Ñ×&Ñ&ðÐð
 —‘—•ˆØ�;‰;Ð*Õ*à—	‘	× Ñ ¤E§I¡I§N¡N×$JÑ$J×$RÑ$RÒRØ—I‘I˜a‘L D§I¡I§N¡N°1Ñ$5Ó5ñ à"Ÿi™i¨™l×/Ñ/×3Ñ3°EÓ:Ð:�
ÓGà—H‘H×-Ñ-¨dÕ3Ù+ØÜ!×)Ò)Ø/à/3¯y©y¯}©}¸]Ó/KØ37·9±9·=±=ÐARÓ3Sñ&ñõ	ð —H‘H×*Ñ*ÜŸ	™	Ÿ™×>Ñ>×FÑFØ"Ÿi™i¨™l˜_à%/×%5Ñ%5Ø&0×&7Ñ&7Ø&0×&7Ñ&7ñ ð +ñ ÷	÷ 4Ò3ò ÷	õ 	ú÷ 4×3ús&   ÆAI4ÇA8I#ÉI4É#
I1É-I4É4
J	c           	      ó¢  • SSK JnJn  SSKJn  [
        R                  R                  R                  (       dh  SnU" U [        R                  " USU0S95         [        U 5      nU(       a"  [        U US[        U R                  5       3SS	9  S S S 5        [        U 5        U R!                  5         U" U 5      Ul        X4$ ! , (       d  f       N9= f)
Nr   rM  )Ú_graph_output_nameszUFile "torch/fx/passes/runtime_assert.py", line 24, in insert_deferred_runtime_assertsr    rP  zexported program: T)Úexport)rW  rN  rO  Ú4torch._functorch._aot_autograd.input_output_analysisrf  rX   r  ÚconfigÚdo_not_emit_runtime_assertsr`  ra  r³   r   r   rU   rd  r_   Úuser_outputs)r�   rA   rN  rO  rf  r    r¯   s          rM   Úapply_runtime_assertion_passrl  Ô  s¿   € ÷õ Yä�=‰=×Ñ×;×;ð1ð 	ñ %ØÜ×ÒØ#¨}¸kÐ.Jñõ
ô /¨rÓ2ˆIÞÜ/ØØØ(Ô)LÈRÏXÉXÓ)VÐ(WÐXØò	÷
ô  	-¨RÔ0ð ‡L�L„NÙ#6°rÓ#:€OÔ ØÐÐ÷+
õ 
ús   Á5C Ã 
Cc                 óV   • [        X(       a  UOS 5      n[        U5      S:”  a  US   $ g)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                 ó   • grH  r  ©rb   s    rM   r;  Únodes_first.<locals>.<lambda>ÿ  s   € ÐQUrd   r   N)rF  r˜   )rV   r6  Úrets      rM   Únodes_firstrr  ø  s,   € ô �uµ™nÑDUÓ
V€CÜ
ˆ3ƒx�!ƒ|Ø�1‰vˆØrd   c                 ó*   • [        [        X5      5      $ )z:Returns the number of nodes that match the node_call_back.)r˜   rF  )rV   r6  s     rM   Únodes_countrt    s   € äŒ|˜EÓ2Ó3Ð3rd   c                 ó(   • U  H  nU" U5        M     U $ )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.
r  rE  s      rM   Ú	nodes_maprv  
  s   € ó
 ˆÙ�tÖñ à€Lrd   Úold_nodeÚnew_nodec                 ó�   • U R                  U5        U R                  R                  5         U R                  R	                  U 5        g)z-
Replace all uses of old_node with new_node.
N)Úreplace_all_uses_withÚusersÚclearrU   Ú
erase_node)rw  rx  s     rM   Únode_replace_r~    s4   € ð ×"Ñ" 8Ô,Ø‡N�N×ÑÔØ‡N�N×Ñ˜hÕ'rd   c                 óò   • [        U[        R                  R                  5      (       aN  [	        US5      (       a<  SUR
                  ;   a+  U R
                  R                  SUR
                  S   05        g g g g )Nr‚   r   )r\   rX   rY   r€   Úhasattrr‚   Úupdate)r�   rC   s     rM   Ú_update_gm_meta_if_possibler‚    s_   € ä�3œŸ™×,Ñ,×-Ñ-Ü�C˜× Ñ Ø˜Ÿ™Ó à
�‰�‰˜ #§(¡(¨8Ñ"4Ð5Õ6ð !ð !ð 	.rd   Úcall_mod_nodec           
      óH  ^• U R                   S:w  a  [        SU R                    35      eU R                  R                  nUc  [        S5      e[	        U R
                  [        5      (       d+  [        S[        U R
                  5      R                   35      e[        XR
                  5      nS UR                  R                   5       nS UR                  R                   5       nUR                  R                   Vs/ s H  oUR                   S:X  d  M  UPM     nn[        X0R                  5       HP  u  px[	        U[        R                  R                  5      (       d  [        S	[        U5       35      e[!        Xx5        MR     UR                  R#                  U 5         U H·  nUR                  R%                  U5      n	UR                   S
:X  a~  U	R
                  n
['        X5      (       a3  SnSU 3n
['        X5      (       a  US-  nSU 3n
['        X5      (       a  M  X©l        [)        XR
                  [        X%R
                  5      5        [!        XY5        M¹     [+        U5      S:”  GaY  [+        U5      S:w  d  [+        US   R                  5      S:w  a  [        S[+        U5       S35      eUS   R                  S   m[	        T[        R                  R                  5      (       a'  TR,                  R/                  5         [!        U T5        OÏ[	        T[0        [2        45      (       a�  T H!  nUR,                  R5                  US   5        M#     [7        [1        U R,                  R9                  5       5      S 5      n[;        UU4S j5        U R                  R=                  U 5        O3[?        S[        T5       S35      eU R                  R=                  U 5        SSS5        URA                  5         URC                  5         U$ s  snf ! , (       d  f       N5= f)z…
Inline the submodule of the given node into the parent module.
Note: we only support the case where submodule takes tensors inputs.
r{   zexpected call_module op, got Nz owning_module should not be Nonezexpected target to be str, got c              3   óH   #   • U  H  oR                   S :X  d  M  Uv •  M     g7f)r¡   N©rW   ©Ú.0rb   s     rM   Ú	<genexpr>Únode_inline_.<locals>.<genexpr>7  s   é € Ð
KÒ.�D·'±'¸]Ñ2J�4‰4Ò.ùó   ‚"™	"c              3   óH   #   • U  H  oR                   S ;  d  M  Uv •  M     g7f))r¡   ÚoutputNr†  r‡  s     rM   r‰  rŠ  8  s    é € ð Ú+�¯w©wÐ>WÑ/W�‰Ò+ùr‹  r�  zexpected fx.Node, got rR   r“   Úsubmod_r   z*expected exactly 1 output with 1 arg, got z outputsc                 óf   • U R                   S:H  =(       a    U R                  [        R                  L $ )Nr~   )rW   r9   ÚoperatorÚgetitemro  s    rM   r;  Únode_inline_.<locals>.<lambda>f  s)   €  §¡¨OÑ!;÷ "8ØŸ™¤x×'7Ñ'7Ð7ð"8rd   c                 ó<   >• [        U TU R                  S      5      $ ©Nr“   )r~  rU  )Úget_item_nodeÚ
new_outputs    €rM   r;  r’  l  s    ø€ ¬-Ø%Ø" =×#5Ñ#5°aÑ#8Ñ9ô+rd   zUnsupported output type z2. Expect it to be a Node or a list/tuple of Nodes.)"rW   rt   rU   Úowning_moduler\   r9   r�   rÇ   rÈ   r<   rV   rò   rU  rX   rY   ÚNoder~  r_  Ú	node_copyr€  r?   r˜   r{  r|  r"  r!  r>   rF  Úkeysrv  r}  ÚNotImplementedErrorÚdelete_all_unused_submodulesr_   )rƒ  r�   Úsub_gmÚphsÚbodyrb   r�  Úphr�   rx  Únew_target_namerÏ   Úget_item_usersr–  s                @rM   Únode_inline_r£  &  sm  ø€ ð
 ×Ñ˜=Ó(ÜÐ<¸]×=MÑ=MÐ<NÐOÓPÐPØ	×	Ñ	×	*Ñ	*€BØ	�zÜÐ?Ó@Ð@ä�m×*Ñ*¬C×0Ñ0ÜØ-¬d°=×3GÑ3GÓ.H×.QÑ.QÐ-RÐSó
ð 	
ô �R×-Ñ-Ó.€Fá
K˜FŸL™L×.Ò.Ó
K€CñØŸ™×+Ò+ó€Dð  &Ÿ|™|×1Ò1ÓIÒ1�t·W±WÀÑ5H�dÑ1€FÐIä�s×.Ñ.Ö/‰ˆÜ˜#œuŸx™xŸ}™}×-Ñ-Ü Ð#9¼$¸s»)¸Ð!EÓFÐFÜ�bÖñ 0ð
 
�‰×	"Ñ	" =Õ	1ÛˆDØ—x‘x×)Ñ)¨$Ó/ˆHØ�w‰w˜*Ó$Ø"*§/¡/�Ü˜2×/Ñ/à�AØ(/°¨s m�OÜ! "×6Ñ6Ø˜Q™˜Ø,3°A°3¨-˜ô " "×6Ó6ð #2”Ü˜ŸO™O¬W°V¿[¹[Ó-IÔJÜ˜$Ö)ñ ô ˆv‹;˜Œ?Ü�6‹{˜aÓ¤3 v¨a¡y§~¡~Ó#6¸!Ó#;Ü$Ø@ÄÀVÃÀÈXÐVóð ð   ™Ÿ™¨Ñ*ˆJä˜*¤e§h¡h§m¡m×4Ñ4ð × Ñ ×&Ñ&Ô(Ü˜m¨ZÕ8Ü˜J¬¬u¨×6Ñ6ã&�DØ—J‘J—N‘N 6¨!¡9Ö-ñ 'ô ".Ü˜×,Ñ,×1Ñ1Ó3Ó4ñ8ó"�ô Ø"ôôð ×#Ñ#×.Ñ.¨}Õ=ä)Ø.¬t°JÓ/?Ð.@Ð@rÐsóð ð ×Ñ×*Ñ*¨=Ô9÷k 
2ðn ×#Ñ#Ô%Ø‡L�L„NØ€IùòA J÷ 
2Õ	1ús    Ã?PÄPÆ"A>PÈ"GPÐ
P!c                 ó¶  • [         R                  " U R                  5      nUR                  S   nS[        R
                  0n/ nUR                  5        Hj  u  pV[        UR                  U5       Vs/ s H  owR                  PM     nnU H0  n	U	S:X  a  M  UR                  [        R                  " X–5      5        M2     Ml     [        R                  " US9$ s  snf )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   rU  Úself)Ú
parameters)ÚastÚparseÚcoderŸ  r   ÚPOSITIONAL_OR_KEYWORDr:   r<   rU  r�   r	  ÚinspectÚ	Signature)
rC   Úast_modÚast_func_defÚarg_type_mapÚ
param_listÚarg_typeÚ
param_typeÚaÚarg_name_listÚarg_names
             rM   Ú&_get_torch_jit_trace_forward_signaturer¶  ~  s¾   € ô �iŠi˜Ÿ™Ó!€GØ$+§L¡L°¡O€Lð œI×;Ñ;Ð<€Lð €JØ ,× 2Ñ 2Ö 4ÑˆÜ(/°×0AÑ0AÀ8Ô(LÓMÒ(L 1ŸœÑ(LˆÐMÛ%ˆHØ˜6Ó!ÙØ×Ñœg×/Ò/°ÓEÖFó &ñ !5ô ×Ò¨
Ñ3Ð3ùò Ns   Á1Cc                 óŒ  • [        U [        R                  R                  [        R                  R                  45      (       aE  [        U 5      n[        UR                  5      [        U5      [        U5      -   :w  a  [        S5      eO [        R                  " U R                  5      n0 UR                  " U6 R                  EUE$ )NzyArguments other than POSITIONAL_OR_KEYWORD kinds in forward() are not supported in _get_torch_jit_trace_forward_signature)r\   rX   ÚjitÚScriptModuleÚTracedModuler¶  r˜   r¦  rt   r«  Ú	signatureÚforwardÚbind_partialÚ	arguments)rC   Ú	fake_argsÚfake_kwargsrj   s       rM   Ú_bind_signature_to_inputsrÁ  —  s¦   € Ü�#œŸ	™	×.Ñ.´·	±	×0FÑ0FÐG×HÑHÜ4°SÓ9ˆô ˆs�~‰~Ó¤# i£.´3°{Ó3CÑ"CÓCÜ ðNóð ð Dô ×Ò §¡Ó,ˆð Eˆc×Ò 	Ð*×4Ñ4ÐD¸ÐDÐDrd   c                 óä   • UR                  U 5        [        R                  " SU 5      nU(       aA  UR                  S5      UR                  S5      pT[	        U5      X   :”  a  [	        U5      X'   g g g )Nrº   r“   r»   )r@   r¼   r½   r¾   r¿   )rG   rµ   r¶   r½   ru   rÁ   s         rM   Ú_build_cacherÃ  «  s]   € Ø‡N�N�4ÔÜ�HŠH�] DÓ)€EÞØ—K‘K “N E§K¡K°£N�Üˆq‹6�NÑ*Ó*Ü%(¨£VˆNÒ"ð +ð rd   c           	      ó  • / nU R                   R                   GHv  nUR                  S:X  d  M  [        UR                  [
        R                  R                  5      (       d  MK  UR                  R                  S:X  a]  UR                  u  p4pVUR                  [        XR                  5      U45        UR                  [        XR                  5      U45        MÂ  UR                  R                  S:X  aF  UR                  S   UR                  SS p‡UR                  [        XR                  5      U45        GM"  UR                  R                  S:X  d  GM?  UR                  u  pšnUR                  [        X	R                  5      X«-   45        GMy     U Hç  u  p|0 n[        [        5      n[        5       n[        UR                   R                  5       H‰  u  nnU[!        U5      :  aN  UU   R"                  XÒR"                  '   UU   R"                  =Ul        Ul        [%        UR"                  Xï5        Mc  ['        XÞXòR"                  UR"                  5      Ul        M‹     [)        U5        UR+                  5         Mé     g)a  
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.
r~   ÚcondÚwrap_with_set_grad_enabledr“   r»   NÚmap_impl)rU   rV   rW   r\   r9   rX   r‡   rˆ   Ú_nameÚ_argsr	  r<   r   r¿   rT   rô   r˜   rG   rÃ  rÃ   Ú_name_hoo_subgraph_placeholdersr_   )r�   Úsubgraph_ph_tuplesrb   rŽ   Ú
true_graphÚfalse_graphÚ	cond_argsÚsubgraphrž  Ú
body_graphÚarrayrU  Úhoo_phsr´   rµ   r¶   rÏ   s                    rM   rÊ  rÊ  ´  sé  € ð RTÐØ—‘—•ˆØ�7‰7�oÕ%¬*Ø�K‰KœŸ™×7Ñ7÷+
ó +
ð �{‰{× Ñ  FÓ*Ø8<¿
¹
Ñ5�˜{Ø"×)Ñ)¬7°2×7HÑ7HÓ+IÈ9Ð*UÔVØ"×)Ñ)¬7°2×7IÑ7IÓ+JÈIÐ*VÖWØ—‘×"Ñ"Ð&BÓBØ $§
¡
¨1¡¨t¯z©z¸!¸"¨~˜#Ø"×)Ñ)¬7°2·±Ó+GÈÐ*M×NØ—‘×"Ñ" jÖ0Ø*.¯*©*Ñ'�
 4Ø"×)Ñ)Ü˜R×!2Ñ!2Ó3°U±\ÐB÷ñ ó& 0ÑˆØ#%ˆÜ)4´SÓ)9ˆÜ"›uˆ
Ü  §¡×!5Ñ!5Ö6‰GˆAˆtØ”3�w“<ÓØ&-¨a¡j§o¡o�Ÿ™Ñ#Ø*1°!©*¯/©/Ð9�”	˜DœKÜ˜TŸY™Y¨ÖCä6Ø¨j¿)¹)ÀTÇYÁYó�–	ñ 7ô 	(¨Ô1Ø×ÑÖò! 0rd   Úcustom_metac                 óv  • U R                   R                   GHž  nUR                  S:X  Gac  UR                  U;  a  [	        SUR                  < S35      eXR                     =Ul        Ul        UR                  U;   aÉ  UR                  R                  S5      c  0 UR                  S'   OsUR                  S   R                  5        HR  u  pEXBUR                     ;   d  M  XRUR                     U   :w  d  M0  [	        SU SU SX#R                     U    S	35      e   UR                  S   R                  X#R                     5        [        UR                  S
   [        5      (       a!  UR                  UR                  S
   l        GMu  GMx  UR                  U;   d  GM‹  XR                     Ul        GM¡     g)zD
Assign new names to all nodes, in the graph module, from name map.
r¡   zplaceholder node ú not in name_mapr   Nz$Mismatch in custom metadata for key z. Value in node.meta is z and value in custom_meta is r3   r¬   )rU   rV   rW   rG   rt   r9   r‚   r­   r:   r�  r\   r   )r�   r´   rÓ  rb   r§   r¨   s         rM   Ú_assign_new_node_namesrÖ  ä  sz  € ð —‘—•ˆØ�7‰7�mÔ#Ø�y‰y Ó(Ü$Ð'8¸¿¹¹ÐEUÐ%VÓWÐWØ&.¯y©yÑ&9Ð9ˆDŒI˜œØ�y‰y˜KÓ'Ø—9‘9—=‘= Ó*Ñ2Ø*,�D—I‘I˜hÒ'ð !%§	¡	¨(Ñ 3× 9Ñ 9Ö ;™˜à¨T¯Y©YÑ!7Õ7Ø !°·±Ñ%;¸AÑ%>Õ >ä"0Ø"FÀqÀcð J0Ø01¨sÐ2OÐP[×\eÑ\eÑPfÐghÑPiÐOjÐjkð!mó#ð ñ !<ð —	‘	˜(Ñ#×*Ñ*¨;·y±yÑ+AÔBô ˜$Ÿ)™) EÑ*Ô,=×>Ñ>Ø(,¯	©	�—	‘	˜%Ñ ×%ò ?à�Y‰Y˜(Ö"Ø §¡Ñ+ˆD�Iò3 rd   Úexport_graph_signaturerB   c                 ó�	  ^• 0 n[        U[        R                  R                  5      (       aJ  UR                  R
                   H0  nSUR                  ;   d  M  UR                  S   XxR                  '   M2     S n	S m0 n
[        [        5      n[        5       n[        X#U5      n[        U5      u  pïUR                   Vs/ s H9  nUR                  [        R                   :X  d  M#  UR"                  R                  PM;     nn[%        UU5       HQ  u  u  nnnU(       d  M  ['        U
UUU[(        [        R                      SR+                  U4S jU 5       5      -   SS9  MS     UR                   HÛ  nUR                  [        R                   :X  a  M#  UR                  [        R,                  :X  a  SnO U	" UR.                  5      R1                  5       n[2        R4                  " S	SU5      n['        U
UUUR"                  R                  [(        UR                     U-   SS9  UU;   d  Mº  UU   XzUR"                  R                     '   UU	 MÝ     U R                  R
                   H6  nUR6                  S
:X  a  M  ['        X«XÈR                  UR                  5        M8     [9        X
U5        [;        U 5        U R=                  5         UR                   H²  nUR"                  R                  U
;  a$  [?        SUR"                  R                  < S35      eU
UR"                  R                     UR"                  l        UR                  [        R@                  :X  d  M‰  UR.                  U
;   d  M›  U
UR.                     SS Ul        M´     URB                   H‹  nUR"                  R                  U
;   a(  U
UR"                  R                     UR"                  l        UR                  [D        RF                  :X  d  Me  UR.                  U
;   d  Mw  U
UR.                     Ul        M�     [I        URK                  5       5       H„  nUU   nUU
;   d  M  [        U[        RL                  5      (       a  M1  U
U   nUU:w  d  M>  [2        RN                  " SU5      (       d  M\  U[(        [        R@                     U-   :w  d  M|  UUU'   UU	 M†     gs  snf )a  
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, ...
r   c                 óÈ   • U R                  S5      (       a  U [        S5      S  n O$U R                  S5      (       a  U [        S5      S  n [        R                  " SSU 5      n U $ )NÚ
L__self___Úself_ú[^a-zA-Z0-9]rŽ   )Ú
startswithr˜   r¼   Úsub©Úxs    rM   Ú_strip_nameÚ,placeholder_naming_pass.<locals>._strip_name)  sY   € Ø�<‰<˜×%Ñ%Ø”#�lÓ#Ð%Ð&‰AØ�\‰\˜'×"Ñ"Ø”#�g“,�.Ð!ˆAÜ�FŠF�? C¨Ó+ˆØˆrd   c                 óP  • [        U [        5      (       a-  [        R                  " SS[	        U R
                  5      5      n U $ [        U [        5      (       a  [	        U R                  5      $ [        U [        5      (       a  U R                  $ [        S[        U 5       SU  35      e)NrÜ  rŽ   zPytree key of type z not handled for )r\   r&   r¼   rÞ  r�   rÀ   r'   rÉ   r#   rG   ri   rÇ   rß  s    rM   Ú_extract_pytree_keyÚ4placeholder_naming_pass.<locals>._extract_pytree_key1  s}   € Ü�aœ×$Ñ$Ü—’�¨¬S°·±«ZÓ8ˆAØˆHÜ˜œ;×'Ñ'Ü�q—u‘u“:ÐÜ˜œ:×&Ñ&Ø—6‘6ˆMäÐ!4´T¸!³W°IÐ=NÈqÈcÐRÓSÐSrd   rŽ   c              3   óP   >#   • U  H  nT" U5      R                  5       v •  M     g 7fr  )Úlower)rˆ  rà  rä  s     €rM   r‰  Ú*placeholder_naming_pass.<locals>.<genexpr>S  s#   øé € ÐLÂ8¸aÑ.¨qÓ1×7Ñ7×9Ð9Â8ùs   ƒ#&T)r¸   r+   rÜ  r¡   zinput spec arg rÕ  é   Nz
arg(\d+)_1)(r\   rX   rY   r€   rU   rV   r‚   rG   r   r¿   rT   rÁ  r)   r5   r6   r   Ú
USER_INPUTr�   rò   rÃ   Úplaceholder_prefixesÚjoinÚTOKENr9   rç  r¼   rÞ  rW   rÖ  rÊ  r_   rt   Ú
CUSTOM_OBJrg   r   ÚUSER_INPUT_MUTATIONr"  rš  r]   r½   )r�   r×  rC   r¿  rÀ  Úfake_params_buffersrB   rÓ  rb   rá  r´   rµ   r¶   Úcombined_argsrö   rŽ   rE   Úuser_input_namesÚarg_pathÚ_argÚuser_input_nameÚ	base_namerG   ÚconstantrÂ   rä  s                            @rM   Úplaceholder_naming_passrø    sÞ  ø€ ð6 #%€KÜ�#”u—x‘x×+Ñ+×,Ñ,Ø—I‘I—O”OˆDØ˜4Ÿ9™9Õ$Ø)-¯©°8Ñ)<�ŸI™IÓ&ñ $òò	Tð  "€HÜ%0´Ó%5€NÜ›5€Jô .¨c¸kÓJ€Mä3°MÓBÑÐð +×6Ò6óâ6ˆDØ�9‰9œ	×,Ñ,Ñ,ó 	ˆ�‰�ŒÙ6ð ð ô .1Ð1DÐFVÖ-WÑ)Ñˆ�4˜/ßˆ?Ü&ØØØØÜ$¤Y×%9Ñ%9Ñ:Ø—(‘(ÔLÁ8ÓLÓLñMà#ôñ .Xð '×2Ô2ˆØ�9‰9œ	×,Ñ,Ó,ÙØ�9‰9œ	Ÿ™Ó'Ø‰Iá# D§K¡KÓ0×6Ñ6Ó8ˆIÜ—F’F˜?¨C°Ó;ˆ	ä"ØØØØ�H‰H�M‰MÜ  §¡Ñ+¨iÑ7Øò	
ð ˜Õ#ð 4?¸yÑ3IˆK §¡§¡Ñ/Ñ0Ø˜IÒ&ñ- 3ð8 —‘—”ˆØ�7‰7�mÓ#ÙÜ"Ø j·)±)¸T¿Y¹Yö	
ñ ô ˜2¨Ô5ô $ BÔ'ð ‡L�L„Nð '×2Ô2ˆØ�8‰8�=‰= Ó(Ü  ?°4·8±8·=±=Ñ2CÐCSÐ!TÓUÐUØ  §¡§¡Ñ/ˆ�‰Œà�I‰Iœ×-Ñ-Õ-°$·+±+ÀÕ2Ið # 4§;¡;Ñ/°°Ð3ˆDŽKñ 3ð '×3Ô3ˆØ�8‰8�=‰=˜HÓ$Ø$ T§X¡X§]¡]Ñ3ˆD�H‰HŒMØ�9‰9œ
×6Ñ6Õ6¸4¿;¹;È(Õ;Rà" 4§;¡;Ñ/ˆDŽKñ 4ô �Y—^‘^Ó%Ö&ˆØ˜T‘?ˆØ�8Õ¤JØ”e—l‘l÷%
ó %
ð   ‘~ˆHà˜DÕ Ü—H’H˜]¨D×1Ó1ØÔ 4´Y×5IÑ5IÑ JÈTÑ QÕQà&.�	˜(Ñ#Ø˜d’Oò 'ùòis   Â?"SÃ%Sr`   Úin_placec                 ó0  • U(       a<  U R                  5        H&  u  p#[        US5      (       d  M  [        X   S5        M(     U $ 0 nU R                  5        H<  u  p#[        US5      (       a"  UR                  5       R	                  5       XB'   M8  X4U'   M>     U$ )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.
rŠ   )r:   r€  ÚdelattrÚdetachÚclone)r`   rù  r§   r¨   Únew_state_dicts        rM   Úremove_proxy_from_state_dictrÿ  §  s‹   € ö Ø×$Ñ$Ö&‰DˆAÜ�q˜'×"Ó"Ü˜
™ wÖ/ñ 'ð ÐàˆØ×$Ñ$Ö&‰DˆAÜ�q˜'×"Ñ"Ø$%§H¡H£J×$4Ñ$4Ó$6�Ó!à$%˜qÓ!ñ	 'ð
 Ðrd   c                 óŠ  • / n/ nU R                   R                   GH  nUR                  S:X  aX  SUR                  ;   aH  UR                  S   nUb4  [	        U[
        R                  5      (       a  UR                  U5        Mh  Mj  Ml  [        U5      S:X  d  M}  SUR                  ;   d  SUR                  ;   d  MŸ  SnSUR                  ;   a  UR                  S   nOSUR                  ;   a  UR                  S   nUc  Må  [	        U[
        R                  5      (       d  GM  UR                  U5        GM     [        X-   5      $ )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)
rU   rV   rW   r‚   r\   rX   r]   r	  r˜   r   )r�   Ú	fake_inpsÚ	fake_valsrb   Úfake_vals        rM   r®   r®   ¼  s  € ð %'€IØ$&€IØ—‘—•ˆØ�7‰7�mÓ#¨°·±Ó(:Ø—y‘y Ñ'ˆHØÑ#¬
°8¼U¿\¹\×(JÑ(JØ× Ñ  Ö*ñ )KÑ#ä�‹^˜qÕ Ø˜tŸy™yÓ(¨E°T·Y±YÕ,>àˆHØ $§)¡)Ó+ØŸ9™9 _Ñ5‘Ø˜$Ÿ)™)Ó#ØŸ9™9 UÑ+�ØÓ#¬
°8¼U¿\¹\×(JÔ(JØ× Ñ  ×*ñ ô  ˜IÑ1Ó2Ð2rd   c              #   ó  #   • [        U R                  5      n[        U R                  5      nU R                  R                  5         U R                  R                  5          S v •  Xl        X l        g ! Xl        X l        f = f7fr  )r  Ú_state_dict_hooksÚ_state_dict_pre_hooksr|  )rC   Ústate_dict_hooksÚstate_dict_pre_hookss      rM   Ú_disable_load_state_dict_hooksr
  Ú  sn   é € ä,0°×1FÑ1FÓ,GÐÜ04°S×5NÑ5NÓ0OÐØ×Ñ×ÑÔ!Ø×Ñ×#Ñ#Ô%ð9Ûà 0ÔØ$8Õ!øð !1ÔØ$8Õ!üs   ‚ABÁ"A3 Á&BÁ3BÂBrW   r   c                 ó  • [         R                  R                  U R                  5       [         R                  R                  R
                  5      =(       d1    [         R                  R                  R
                  U R                  ;   $ r  )rX   r”   Ú%_dispatch_has_kernel_for_dispatch_keyrG   ÚDispatchKeyÚCompositeImplicitAutogradÚ
py_kernelsr†  s    rM   Ú
_is_cia_opr  ç  sX   € ä�‰×6Ñ6Ø�G‰G‹I”u—x‘x×+Ñ+×EÑEó	
÷ 	Kô �8‰8×Ñ×9Ñ9¸R¿]¹]ÑJð	rd   c                 ó<   • [        U 5      =(       a    [        U 5      $ r  )Ú_check_valid_to_preserver  r†  s    rM   Ú_is_preservable_cia_opr  ð  s   € Ü# BÓ'×:¬J°r«NÐ:rd   c                 óL   • U R                  5       R                  S5      S   S:H  $ )Nú::r   rY  )rG   r;   r†  s    rM   Ú_is_aten_opr  ô  s!   € Ø�7‰7‹9�?‰?˜4Ó  Ñ# vÑ-Ð-rd   c                 ó"   • [        U 5      (       + $ r  )r  r†  s    rM   Ú_is_custom_opr  ø  s   € Ü˜2‹ÔÐrd   c            	      óŒ  • [         R                  R                  S5      n U  HŸ  n[        UR	                  S5      5      u  p#UR	                  S5      n[        U5      S;  a  [        S[        U5       35      eUS   nSn[        U5      S:X  a  US	   n[        [        [        [         R                  U5      U5      U5      nM¡     g
)zu
Utility function to query C++ dispatcher to get the all
possible CIA ops and populate them into torch.ops namespace
r  r  r3   )r“   r»   zexpected 1 or 2 parts, got r   r^  r»   r“   N)	rX   r”   Ú,_dispatch_get_registrations_for_dispatch_keyr!  r;   r˜   rt   r<   rX  )Úcia_opsrW   Ú	namespaceÚop_nameÚ
split_listÚop_overload_namerŽ   s          rM   Ú_materialize_cpp_cia_opsr   þ  s²   € ô
 �h‰h×CÑCØ#ó€Gó
 ˆÜ" 2§8¡8¨D£>Ó2Ñˆ	Ø—]‘] 3Ó'ˆ
äˆz‹? &Ó(Ü Ð#>¼sÀ:»Ð>OÐ!PÓQÐQØ˜Q‘-ˆØ$ÐÜˆz‹?˜aÓØ)¨!™}Ðä”GœG¤E§I¡I¨yÓ9¸7ÓCÐEUÓVŠò rd   c                  ó   • [         $ )zU
This is an special marker that tells our infra that we shouldn't decompose this op.
)ÚNotImplementedrT  s     rM   Ú_special_op_to_preserve_ciar#    s
   € ô Ðrd   c                 óº  • SSK Jn  U" U 5      (       a  gU [        R                  ;   a  g[	        U S5      (       d  g[        U R                  R                   Vs/ s H  o"R                  c  M  UPM     sn5      nUS:g  =(       d    U R                  R                  nU(       a  g[        R                  R                  U R                  5       5      (       d  ggs  snf )Nr   )Ú#_should_decompose_because_unsafe_opFÚ_schemaT)Útorch._decompr%  r   Úmetadata_fnsr€  r˜   r&  r¾  Ú
alias_infoÚ
is_mutablerX   r”   Ú_dispatch_has_kernelrG   )Úop_overloadr%  rÏ   r)  Úis_mutating_or_aliasings        rM   r  r  !  s°   € ÝAá*¨;×7Ñ7ØØÔ&×3Ñ3Ó3Øä�; 	×*Ñ*ØäØ×'Ñ'×1Ò1ÓNÒ1ˆq·\±\�Ñ1ÑNó€Jð )¨A™o×O°×1DÑ1D×1OÑ1OÐæØä�8‰8×(Ñ(¨×)9Ñ)9Ó);×<Ñ<Øàùò 	Os   ÁCÁ-Cr“   )Úmaxsizec                  óH   • [        [        R                  R                  5      $ r  )Ú(_collect_all_valid_cia_ops_for_namespacerX   rX  rY  r  rd   rM   Ú-_collect_all_valid_cia_ops_for_aten_namespacer1  ;  s   € ä3´E·I±I·N±NÓCÐCrd   Úop_namespacec                 óà   • [        5         [        5       nU  HS  n[        X5      nUR                  5        H1  n[        X45      n[	        U5      (       d  M   UR                  U5        M3     MU     U$ r  )r   rT   r<   Ú	overloadsr  r@   )r2  r  rW   Ú	op_packetÚoverloadr,  s         rM   r0  r0  @  sb   € ô Ôô ‹e€GÛˆÜ˜LÓ-ˆ	Ø!×+Ñ+Ö-ˆHÜ! )Ó6ˆKÜ% k×2Ó2Ø—‘˜KÖ(ó .ñ ð €Nrd   c                  óˆ  • [        5       n [        R                  R                   H™  nUS:w  aƒ  [	        [        R                  U5      (       d  [        SU< 35      e[        [        R                  U5      n[        U[        R                  R                  5      (       a  U [        U5      -  n MŠ  MŒ  U [        5       -  n M›     U $ )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
rY  z"torch.ops does not have attribute )rT   rX   rX  Ú_dirr€  rt   r<   r\   r‡   Ú_OpNamespacer0  r1  )r  Úop_namespace_namer2  s      rM   Ú_collect_all_valid_cia_opsr;  Q  s¨   € ô ‹e€GÜ"ŸY™YŸ^œ^Ðà Ó&Üœ5Ÿ9™9Ð&7×8Ñ8Ü$Ø8Ð9JÑ8MÐNóð ô #¤5§9¡9Ð.?Ó@ˆLÜ˜,¬¯
©
×(?Ñ(?×@Ñ@ØÔCÀLÓQÑQ’ñ Að ÔDÓFÑFŠGñ ,ð €Nrd   c                 ó   • [         R                  R                  R                  nXR                  ;   aE  [        U R                  U   [         R                  R                  5      (       d  U R                  U   $ S n[        R                  " X S9$ )Nc                  óN  • US   nUS	 [         R                  R                  R                  n[         R                  R	                  UR                  5       [         R                  R                  R                  5      (       a  UR                  " U/U Q70 UD6$ [        SU S35      e)NÚkernelú	Expected z) to have CompositeImplicitAutograd kernel)rX   r”   r  r  r  rG   Ú_op_dkrt   )rU  rV  r>  Údks       rM   Ú_special_op_to_decompose_ciaÚ9_get_decomp_for_cia.<locals>._special_op_to_decompose_cia{  s’   € Ø˜Ñ!ˆØ�8Ðô �X‰X×!Ñ!×;Ñ;ˆÜ�8‰8×9Ñ9Ø�K‰K‹Mœ5Ÿ8™8×/Ñ/×IÑI÷
ñ 
ð —=’= Ð5 dÒ5¨fÑ5Ð5ä Ø˜F˜8Ð#LÐMóð rd   )r>  )rX   r”   r  r  r  r\   r`  ra  )rW   rA  rB  s      rM   Ú_get_decomp_for_ciarD  p  sj   € ô 
�‰×	Ñ	×	7Ñ	7€BØ	�]‰]Ó¤:¨b¯m©m¸BÑ.?ÄÇÁ×AUÑAU×#VÑ#VØ�}‰}˜RÑ Ð òô ×ÒÐ9ÑEÐErd   c               #   ó„  #   • [         R                  R                  n [         R                  R                  n S[         R                  l        S[         R                  l        S v •  U [         R                  l        U[         R                  l        g ! U [         R                  l        U[         R                  l        f = f7frH  )rX   ÚcompilerÚ_is_compiling_flagÚ_is_exporting_flag)Úold_compiling_flagÚold_exporting_flags     rM   Ú_compiling_state_contextrK  �  sx   é € äŸ™×:Ñ:ÐÜŸ™×:Ñ:Ðð?Ø,0Œ�‰Ô)Ø,0Œ�‰Ô)Ûà,>Œ�‰Ô)Ø,>Œ�‰Õ)øð -?Œ�‰Ô)Ø,>Œ�‰Õ)üs   ‚5C ¸.B Á&+C Â,B=Â=C r²   c                 ó"  • 0 [        UR                  SS95      E[        UR                  SS95      En0 n0 nUR                  5        HD  u  pV[	        U5      U;   a  U[	        U5         nOU R                  USS9nXt[	        U5      '   XsU'   MF     U$ )NF)r}   T)Ústatic_shapes)r  r…   r†   r:   ÚidÚfrom_tensor)r²   rC   Úparams_buffersÚfaked_params_buffersÚmemorÀ   rH   Úfake_tensors           rM   Ú_fakify_params_buffersrT  š  sª   € ðÜ
ˆs×#Ñ#°UÐ#Ð;Ó
<ðä
ˆs× Ñ °%Ð Ð8Ó
9ð€Nð
 ÐØ"$€DØ$×*Ñ*Ö,‰
ˆÜˆe‹9˜ÓØœr %›y™/‰Kà#×/Ñ/°ÀTÐ/ÐJˆKØ)”�E“‰OØ$/˜SÓ!ñ -ð  Ðrd   c           
      óF  ^ ^
^• [        T [        R                  R                  5      (       d  [	        ST  35      eSSKn " U
U 4S jSUR                  5      m
S[        S[        [        [           [        4   4U
4S jjnS	[        [           S
[        S[        4U4S jjnS[        S[        [        [           [        4   4U4S jjnUmUnT R                  S-   T R                  -   nS nU
4S jn[        T TUUUUUS9  S[        [           4U4S jjn	[        T U	5        g)aò  
Registers a module as a valid input type for :func:`torch.export.export`.

Args:
    mod: the module instance
    serialized_type_name: The serialized name for the module. This is
    required if you want to serialize the pytree TreeSpec containing this
    module.

Example::

    import torch


    class Module(torch.nn.Module):
        def __init__(self):
            super().__init__()
            self.linear = torch.nn.Linear(3, 3)

        def forward(self, x):
            return self.linear(x)


    torch._export.utils.register_module_as_pytree_node(InputDataClass)


    class Mod(torch.nn.Module):
        def forward(self, x, m):
            return m(x) + x


    ep = torch.export.export(Mod(), (torch.randn(3), Module()))
    print(ep)

z!expected nn.Module subclass, got r   Nc                   ó>   >^ • \ rS rSrU U4S jrS rU4S jrSrU =r$ )Ú=register_module_as_pytree_input_node.<locals>.PrototypeModuleiØ  c                 ó  >• [         TU ]  " U/UQ70 UD6  [        U[        R                  R
                  5      (       d!  [        S[        U5      R                   35      e[        U S5      (       a  [        S5      eTU l
        g )Nzexpected nn.Module, got Ú
_proto_clsz_proto_cls should not be set)ÚsuperÚ__init__r\   rX   rƒ   r„   rt   rÇ   rÈ   r€  rY  )r¥  ÚmrU  rV  Ú	__class__r   s       €€rM   r[  ÚFregister_module_as_pytree_input_node.<locals>.PrototypeModule.__init__Ù  sm   ø€ Ü‰GÒ˜QÐ0 Ò0¨Ò0Ü˜a¤§¡§¡×1Ñ1Ü$Ð'?ÄÀQÃ×@PÑ@PÐ?QÐ%RÓSÐSÜ�t˜\×*Ñ*Ü$Ð%CÓDÐDØ!ˆD�Ord   c                 ó4   • U R                   UR                   :H  $ r  ©rY  )r¥  Úothers     rM   Ú__eq__ÚDregister_module_as_pytree_input_node.<locals>.PrototypeModule.__eq__á  s   € Ø—?‘? e×&6Ñ&6Ñ6Ð6rd   c                 ó   >• T" U " 5       5      $ r  r  )r¥  rR  ÚPrototypeModules     €rM   Ú__deepcopy__ÚJregister_module_as_pytree_input_node.<locals>.PrototypeModule.__deepcopy__ä  s   ø€ Ù"¡4£6Ó*Ð*rd   r`  )	rÈ   Ú
__module__Ú__qualname__Ú__firstlineno__r[  rb  rf  Ú__static_attributes__Ú__classcell__)r]  re  r   s   @€€rM   re  rW  Ø  s   ù† ö	"ò	7÷	+ó 	+rd   re  r  r1   c                 óè   >• [        U R                  5       5      n[        U R                  5       5      n0 UEUEn[        UR	                  5       5      [        UR                  5       5      T" U 5      /4$ r  )r  r…   r†   r"  r¢   rš  )r  r…   r†   rP  re  s       €rM   r  Ú@register_module_as_pytree_input_node.<locals>.default_flatten_fnç  ss   ø€ Ü × 4Ñ 4Ó 6Ó7ÐÜ˜S×.Ñ.Ó0Ó1ˆØ>Ð,Ð>°Ð>ˆÜ�N×)Ñ)Ó+Ó,Ü�×$Ñ$Ó&Ó'Ù˜CÓ ð/
ð 
ð 	
rd   r¢   r  c           	      óÚ  >^• Uu  p#Ub  U" 5       c  [        S5      eU" 5       nT	c  [        S5      eT	" U5      u  pVS[        R                  R                  4U4S jjm[        S [        X5       5       5      (       aY  [        R                  R                  R                  R                  U[        [        X 5      5      SSS9   T" U5      nS S S 5        U$ UnU$ ! , (       d  f       W$ = f)Nz!Module has been garbage collectedzflatten_fn should not be NonerC   c                 óP  >• [         R                   " U 5      nU R                  R                  5        VVs0 s H0  u  p#[         R                   " U5      [         R                   " U5      _M2     snnUl        UR                  5        H  u  pE[	        XT" U5      5        M     U$ s  snnf r  )ÚcopyÚ__dict__r:   Únamed_childrenr?   )rC   rq  r§   r¨   rG   ÚchildÚcopy_modules         €rM   ru  ÚWregister_module_as_pytree_input_node.<locals>.default_unflatten_fn.<locals>.copy_moduleý  s{   ø€ Ü—)’)˜C“.ˆCØCFÇ<Á<×CUÑCUÔCWÔXÒCW¹4¸1œDŸIšI a›L¬$¯)ª)°A«,Ò6ÑCWÒXˆCŒLØ"×1Ñ1Ö3‘�Ü˜¡;¨uÓ#5Ö6ñ  4àˆJùó Ys   µ7B"c              3   ó,   #   • U  H
  u  pXLv •  M     g 7fr  r  )rˆ  r¨   Úos      rM   r‰  ÚUregister_module_as_pytree_input_node.<locals>.default_unflatten_fn.<locals>.<genexpr>  s   é € Ð=Ò&<™d˜aˆq�zÒ&<ùs   ‚T)Útie_weightsÚstrict)ri   rt   rX   rƒ   r„   Úanyrò   ÚutilsÚ	statelessÚ_reparametrize_moduler  )
r¢   r  r  Úrefr  r
  rŽ   rq  ru  r  s
           @€rM   r  ÚBregister_module_as_pytree_input_node.<locals>.default_unflatten_fnð  sÜ   ù€ Ø!‰ˆ
Ø‰;™#›%™-ÜÐBÓCÐCÙ‹eˆØÑÜ Ð!@ÓAÐAÙ! #“‰ˆ	ð	œUŸX™XŸ_™_÷ 	ô Ñ=¤c¨&Ô&<Ó=×=Ñ=Ü—‘—‘×)Ñ)×?Ñ?Ø”Tœ#˜jÓ1Ó2ÀÈTð @ò ñ " #Ó&�÷ð ˆ
ð ˆCØˆ
÷ô ð ˆ
ús   Ã	CÃ
C*c                 óˆ   >• T" U 5      u  ntp#[        X!5       VVs/ s H  u  pE[        U5      U4PM     snnU/UQ4$ s  snnf r  r  )r  r
  r  rU  r§   r¨   r  s         €rM   r  ÚJregister_module_as_pytree_input_node.<locals>.default_flatten_fn_with_keys  sW   ø€ Ù)3°C«Ñ&ˆ	Ð&�JÜ/2°:Ô/IÔJÒ/I¡t q”˜A“ Ó"Ñ/IÒJØðM
àðM
ð 
ð 	
ùÓJs   œ>r3   c                 óT   • U tp[         R                  " U/S /[        U5      -  Q5      $ r  )ÚjsonÚdumpsr˜   )r  rš  rŽ   s      rM   rý   ÚAregister_module_as_pytree_input_node.<locals>.to_dumpable_context  s*   € ØˆˆÜ�zŠz˜4Ð4 D 6¬C°«F¡?Ð4Ó5Ð5rd   c                 ó‚   >• [         R                  " U 5      nT" [        R                  R	                  5       5      US'   U$ r”  )r…  ÚloadsrX   rƒ   r„   )ÚdumpableÚsre  s     €rM   rþ   ÚCregister_module_as_pytree_input_node.<locals>.from_dumpable_context  s/   ø€ Ü�JŠJ�xÓ ˆÙœuŸx™xŸ™Ó0Ó1ˆˆ!‰Øˆrd   r  c                 óp   >• T" U 5      u  p#X1R                   :w  a  [        SU SUR                    35      eU$ )Nzcontext mismatch: z != )r  rt   )r  rE   Úflatsr  r  s       €rM   Údefault_flatten_fn_specÚEregister_module_as_pytree_input_node.<locals>.default_flatten_fn_spec,  s:   ø€ Ù# C›‰ˆØ—l‘lÓ"Ü Ð#5°g°Y¸dÀ4Ç<Á<À.Ð!QÓRÐRØˆrd   )Ú
issubclassrX   rƒ   r„   rt   Úweakrefr€  r	   r!  r"  r    r   rh  ri  r   r   )r   r’  r  r  r  r  rü   rý   rþ   r�  re  r  s   `         @@rM   Ú$register_module_as_pytree_input_noder“  ¯  s  ú€ ôH �cœ5Ÿ8™8Ÿ?™?×+Ñ+ÜÐ@ÀÀÐFÓGÐGã÷+ð +˜'Ÿ+™+ô +ð
¤ð 
¬¬d´3©i¼Ð.@Ñ(A÷ 
ð¤X¬c¡]ð ¼Wð Ì÷ ð:
¬#ð 
´%¼¼S¹	Ä7Ð8JÑ2K÷ 
ð $€JØ'€LàŸ>™>¨CÑ/°#×2BÑ2BÑBÐò6õô
 ØØØØ1Ø9Ø/Ø3òð¬d´3©i÷ ô !ØØõrd   c                 ó0   • [        U 5        [        U 5        g r  )r   r   )r   s    rM   Ú&deregister_module_as_pytree_input_noder•  8  s   € Ü˜CÔ Ü# CÕ(rd   c                 ó(  • [        U [        R                  R                  5      (       d  [	        SU  S35      e[        U[        R                  R                  5      (       d  [	        SU S35      eU R
                  Ul        U R                  Ul        g )Nr?  z to be a nn.Module)r\   rX   rƒ   r„   rt   Ú_parametersr=   )ÚsrcÚdsts     rM   Ú_sync_staterš  =  sn   € Ü�cœ5Ÿ8™8Ÿ?™?×+Ñ+Ü˜y¨¨Ð-?Ð@ÓAÐAÜ�cœ5Ÿ8™8Ÿ?™?×+Ñ+Ü˜y¨¨Ð-?Ð@ÓAÐAð
 —o‘o€C„OØ—<‘<€C…Lrd   c                  óB   • U (       a  U tpU H  n[        X5        M     gg)z�
Sync state between exported modules corresponding to wrapped methods.
This might be necessary after serializing/deserializing due to copying.
N)rš  )Úwrapped_method_modulesr\  Úother_msÚother_ms       rM   Ú
sync_staterŸ  J  s%   € ö
 Ø-ˆˆÛˆGÜ˜Ö#ò  ð rd   c                   ó(   ^ • \ rS rSrU 4S jrSrU =r$ )Ú_WrappedMethodiU  c                 óZ   >• [         TU ]  5         [        UR                  U 5        Xl        g r  )rZ  r[  rš  Ú__self__r¼  )r¥  Úmethodr]  s     €rM   r[  Ú_WrappedMethod.__init__V  s!   ø€ Ü‰ÑÔä�F—O‘O TÔ*à�rd   )r¼  )rÈ   rh  ri  rj  r[  rk  rl  )r]  s   @rM   r¡  r¡  U  s   ø† ÷ó rd   r¡  c                 óV   • [        U 5      (       d  [        SU  S35      e[        U 5      $ )zœ
Wrap a method as a module so that it can be exported.
The wrapped module's forward points to the method, and
the method's original module state is shared.
r?  z to be a method)r   rt   r¡  )r¤  s    rM   Úwrap_methodr§  ^  s.   € ô �F×ÑÜ˜y¨¨°Ð@ÓAÐAÜ˜&Ó!Ð!rd   )r1   r   )rj   r   )rn   r   rl   r   )Fr  )NN)r1   N)r,  r   )rW   r   )˜r§  rq  r  r`  r«  r…  rä   r�  r¼   Úcollectionsr   Úcollections.abcr   r   Ú
contextlibr   r   r   Útypingr	   r
   r   r   rX   Útorch._guardsr   Útorch._subclasses.fake_tensorr   r   Ú#torch._subclasses.functional_tensorr   Útorch.fx._utilsr   Ú"torch.fx.experimental.proxy_tensorr   Útorch.fx.passes.runtime_assertr   rÛ   r4   r   Ú
torch._opsr   Útorch.exportr   Útorch.export.graph_signaturer   r   r   r   Útorch.fx._pytreer   r   Útorch.utils._pytreer   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   rê  Ú	PARAMETERr7   rf   rî  rí  rë  rI  rN   rY   r€   rc   rk   ro   r  r�   r‘   rœ   rª   r³   r¿   rT   ÚboolrÃ   rÌ   r°   rî   r"  r˜  rû   rÇ   r$  r(  rƒ   r+  r-  r]   r/  r2  r5  rC  rF  rK  rd  rl  rr  rt  rv  r~  r„   r‚  r£  r¬  r¶  rÁ  rÃ  rÊ  rÖ  rø  rÿ  Ú_subclassesrS  r®   r
  r  r  r  r  r   r#  r  Ú	lru_cacher1  r‡   r9  r0  r;  rD  rK  rT  r“  r•  rš  rŸ  r¡  r§  r  rd   rM   Ú<module>r»     s¹  ðã 
Û Û Û Û Û Û Û Û 	Ý #ß .Ý %ß 'ß 6Ó 6ã Ý *ß DÝ @Ý ?Ý KÝ Jö ÛåHÝ'Ý,ÝAç QÑ Q÷÷÷ ÷ õ ð$ ×Ñ˜"Ø×Ñ˜Ø×Ñ�dØ×Ñ˜tØ×Ñ˜&Ø‡O�O�WðÐ ð #(Ð ðàôð<%Ø	�‰×	Ñ	ô%ð4Ø	ôð(Ø#ðØ.Dôð 7'¨¯©×(<Ñ(<ð 7'ÀÀcÈ3ÀhÁô 7'òtð0)Ø!% c¨3 h¡ð)à�‰×Ñð)ð $ð)ð 
ô	)ð8$˜uŸx™x×3Ñ3ô $ð* !ñ%Ø�3˜�8‰nð%à˜˜c˜‘Nð%ð �C‘ð%ð ð	%ð
 ð%ð õ%ðP/˜ð / Sô /ð< ñ[
Ø�#�u—|‘|Ð#Ñ$ð[
à	ð[
ð
 ð[
ð ��}ð[
ð 
õ[
ð|,Ø˜UŸX™XŸ]™]Ñ+ð,à	ô,ðb )-Ø,0ð8ð
 +/Ø9=Ø=AØ$ò8Ø	ˆc‰ð8à˜Ñ%ð8ð ˜=Ñ)ð8ð
 # 3™-ð8ð "Ð"5Ñ6ð8ð $Ð$9Ñ:ð8ð ð8ð 
ö8ðvEÐ'ð E¨u¯x©x¯}©}ð EÀô EðØðà
�(‰(�-‰-ðð ˆe�h‰h× Ñ Ñ!ôð BÐ(ð B°·±·±ð BÀ$ô BðØðà
�(‰(�-‰-ðð ˆe�l‰lÑôð&RØðRà
�(‰(�-‰-ðRð 
ôRðØðà
�(‰(�-‰-ðð ˆe�l‰lÑôð$Ø�‰×Ñðà˜eŸh™hŸm™m˜_¨e°E·H±H·M±MÀ4Ð4GÑ.HÐHÑIðð ‡X�X×Ñôð><˜˜UŸX™XŸ]™]Ñ+ð <ÀÀUÇXÁXÇ]Á]Ñ@Sô <ð
 ñ3ó ð3ð-¨U¯X©X×-AÑ-Að -Àdô -ð`! U§X¡X×%9Ñ%9ô !ðJ 04ñ
Ø�—‘—‘Ñð
àˆe�h‰h�m‰mÑõ
ð4�t˜EŸH™HŸM™MÑ*ð 4¸sô 4ð
�T˜%Ÿ(™(Ÿ-™-Ñ(ð ¸TÀ%Ç(Á(Ç-Á-Ñ=Pô ð(˜EŸH™HŸM™Mð (°U·X±X·]±]ð (Àtô (ð7 E§H¡H×$8Ñ$8ð 7¸u¿x¹x¿¹ð 7ÐSWô 7ðU §¡§¡ð U°(¸5¿8¹8×;OÑ;OÑ2Pô Uðp4°·±·±ð 4ÀG×DUÑDUô 4ò2Eò(,ð-¨¯©×(<Ñ(<ð -Àô -ð`!,Ø�‰×Ñð!,à�3˜�8‰nð!,ð �c˜3�h‘ð!,ð 
ô	!,ðH\$Ø�‰×Ñð\$à2ð\$ð 
�‰�‰ð\$ð �C˜�H‰~ð\$ð 
ô\$ð~¨Tð ¸Tð Àdô ð*3Ø�‰×Ñð3àˆe×Ñ×+Ñ+×:Ñ:Ñ;ô3ð< ð	9¨¯©¯©ó 	9ó ð	9ð�>ð  dô ð;˜~ð ;°$ô ;ð.�Nð . tô .ð�nð ¨ô ôWò0ôð4 ×Ó˜QÑðD°s¸>Ñ7Jó Dó  ðDðØ—*’*×)Ò)ðàˆÑôð" C¨Ñ$7ô ô>Fð: ñ	?ó ð	?ð Øð à	�‰�‰ð ð 
ˆ#ˆu�U—\‘\ 5§8¡8×#5Ñ#5Ð5Ñ6Ð
6Ñ7ô ð*F¨d°5·8±8·?±?Ñ.Cð FÈô FðR)°°U·X±X·_±_Ñ0Eð )È$ô )ò

 ò$ô�U—X‘X—_‘_ô ó"rd   