Ë
    P/æ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mZ d dlmZm	Z	m
Z
mZmZmZmZmZ d dlZd dl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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(m)Z) ejT                  dejV                  dejX                  dejZ                  dej\                  dej^                  diZ0	 	 dKd„Z1	 	 	 	 dLd„Z2dejf                  jh                  de	e5ef   fd„Z6de	e5ef   dejf                  jh                  ddddfd„Z7dejf                  jh                  fd„Z8	 dMde	e5e5f   de5de5d e9fd!„Z:d"eejf                  jv                     fd#„Z<	 	 dNddddd$œd%ee   d&ee    d'ee)   d(ee5   d)ee'   d*ee!   d+e9ddfd,„Z=d-d.d/ejf                  jv                  de9fd0„Z>d-d.d/ejf                  jv                  deej~                  j                     fd1„Z@d-d.d/ejf                  jv                  de9fd2„ZAd-d.d/ejf                  jv                  deej„                     fd3„ZCd-d.d/ejf                  jv                  de9fd4„ZDd-d.d/ejf                  jv                  deej„                     fd5„ZEdejf                  jh                  dejf                  jh                  fd6„ZFd7eejf                  jv                     deejf                  jv                     fd8„ZG	 dOd7eejf                  jv                     deejf                  jv                     fd9„ZHd7eejf                  jv                     deIfd:„ZJd7eejf                  jv                     deejf                  jv                     fd;„ZKd<ejf                  jv                  d=ejf                  jv                  ddfd>„ZLd?ejf                  jv                  ddfd@„ZMdej~                  jœ                  fdA„ZOdB„ ZPdejf                  jh                  ddfdC„ZQdejf                  jh                  dDddej~                  jœ                  dEe	e5ef   ddf
dF„ZRdGe	dHe9de	fdI„ZSdejf                  jh                  dej¨                  jª                  j¬                  fdJ„ZWy)Pé    N)Ú	Parameter)ÚAnyÚDictÚIterableÚListÚOptionalÚTupleÚTypeÚTYPE_CHECKING)Údetect_fake_mode)Ú
FakeTensor©ÚConstantAttrMap)ÚExportedProgram)ÚExportGraphSignature)Ú	InputKindÚ
OutputKind)Ú_register_pytree_nodeÚContextÚFlattenFuncÚFromDumpableContextFnÚ
GetAttrKeyÚKeyPathÚkeystrÚ
MappingKeyÚSequenceKeyÚToDumpableContextFnÚtree_flatten_with_pathÚUnflattenFuncÚ Úp_Úb_Úc_Úobj_ÚtokenÚreturnc                 óÄ  — ddl m}  |«       }| j                  D �ch c]7  }|j                  t        j
                  k(  r|j                  s|j                  ’Œ9 }}|j                  «       D ]n  \  }}||v rŒ|}	|j                  d«      �^ }
}|
D ]  }t        |	|«      }	Œ |	j                  j                  |d «       t        |	||«       |j                  ||«       Œp |S c c}w )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                úV/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torch/_export/utils.pyÚ_collect_and_set_constant_attrsrC   0   sê   € õ Iá$Ó&€Nð $×/Ñ/öàØ�9‰9œ	×(Ñ(Ò(°·²ð 	�‹ðÐð ð
 !—‘Ó(ò (‰ˆˆeØÐ)Ñ)ØàˆØ—z‘z #“‰ˆ�Øò 	'ˆDÜ˜4 Ó&‰Dð	'ð 	�‰×Ñ˜$ Ô%Ü��d˜EÔ"Ø×Ñ˜5 $Õ'ð(ð Ðùò#s   œ<Cr   Únew_sigc                 ó2  — | j                   D �ch c]7  }|j                  t        j                  k(  r|j                  s|j
                  ’Œ9 }}|j                   D ]6  }|j                  t        j                  k(  sŒ!|j
                  |v sŒ0d|_        Œ8 |S c c}w )NF)r*   r+   r   r,   r-   r.   )Úold_sigrD   r:   r;   s       rB   Ú/_overwrite_signature_for_non_persistent_buffersrG   N   sŒ   € ð ×'Ñ'öàØ�9‰9œ	×(Ñ(Ò(°·²ð 	�‹ðÐð ð ×#Ñ#ò $ˆØ�9‰9œ	×(Ñ(Ó(¨T¯[©[Ð<RÒ-RØ#ˆD�Oð$ð €Nùòs   �<Br8   c                 ó–  — i }dt         j                  j                  dt        fd„}| j                  j
                  D �]ˆ  }|j                  }|j                  }|j                  dk(  ry || |«      }t        |t         j                  j                  «      rL|j                  dd¬«      D ]  \  }}|||dz   |z   <   Œ |j                  dd¬«      D ]  \  }}|||dz   |z   <   Œ |j                  d	k(  r2 || |«      }t        |t         j                  j                  «      s|||<   |j                  d
k(  sŒõt        |j                  t         j                  j                  «      r�Œ%|j                   D ]U  }	|	j                  d	k(  sŒt         j                  j"                  j$                  D ]  }
|
|v sŒ||
   ||	j                     |
<   Œ ŒW �Œ‹ |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                 óv   — |j                  d«      �^ }}| }|D ]  }t        ||d «      }|�ŒJ ‚ t        ||«      S )Nr(   )r0   r1   )rI   rJ   ÚprefixÚfieldÚtÚitems         rB   Ú_getattrz0_collect_param_buffer_metadata.<locals>._getattrg   sO   € Ø"Ÿ™¨Ó-‰ˆ�ØˆØò 	!ˆDÜ˜˜4 Ó&ˆAØ‘=Ð �=ð	!ô �q˜%Ó Ð ó    Úcall_moduleTF)ÚrecurseÚremove_duplicater(   Úget_attrÚcall_function)ÚtorchÚfxÚGraphModuleÚstrÚgraphÚnodesr.   ÚmetaÚopÚ
isinstanceÚnnÚModuleÚnamed_parametersÚnamed_buffersÚ_opsÚHigherOrderOperatorÚ_input_nodesÚproxyÚ_COPY_META_FIELDS)r8   Úparams_buffers_to_node_metarP   Únoder.   r]   Ú	submoduler<   Ú_ÚargÚentrys              rB   Ú_collect_param_buffer_metadataro   ^   sÒ  € ð #%Ðð!œŸ™×,Ñ,ð !¼ó !ð —	‘	—‘ó YˆØ—‘ˆØ�y‰yˆØ�7‰7�mÒ#Ù   fÓ-ˆIÜ˜)¤U§X¡X§_¡_Ô5Ø(×9Ñ9Ø °5ð  :ó  ò L‘G�D˜!ð HLÐ/°¸±¸tÑ0CÒDðLð
  )×6Ñ6Ø °5ð  7ó  ò L‘G�D˜!ð HLÐ/°¸±¸tÑ0CÒDðLð
 �7‰7�jÒ Ù   fÓ-ˆIÜ˜i¬¯©×)=Ñ)=Ô>Ø6:Ð+¨FÑ3ð
 �7‰7�oÓ%¬jØ�K‰KœŸ™×7Ñ7ö/
ð ×(Ñ(ò Y�Ø—6‘6˜ZÓ'Ü!&§¡§¡×!AÑ!Aò Y˜Ø  Dš=ØMQÐRWÉ[Ð7¸¿
¹
ÑCÀEÒJñYòYð7YðB 'Ð&rQ   ri   Úgmc                 óL  — | j                  «       D ]&  }|j                  dd«       |j                  dd«       Œ( |j                  j                  D ]Ò  }|j                  dk(  sŒ|j
                  |j                  v rG|j                  |j
                     }|| v r*| |   j                  «       D ]  \  }}||j                  |<   Œ |j
                  |j                  v sŒ‹|j                  |j
                     }|| v sŒ©| |   j                  «       D ]  \  }}||j                  |<   Œ ŒÔ y)zq
    Given that we collected param'buffer metadata before, we put them back in
    newly traced graph module
    Únn_module_stackNÚstack_traceÚplaceholder)
Úvaluesr3   r[   r\   r^   r.   Úinputs_to_parametersr/   r]   Úinputs_to_buffers)	ri   rp   rD   Úmetadatarj   Ú
param_nameÚkÚvÚbuffer_names	            rB   Ú)_populate_param_buffer_metadata_to_new_gmr}   ”   s  € ð 0×6Ñ6Ó8ò *ˆØ�‰Ð&¨Ô-Ø�‰�] DÕ)ð*ð —‘—‘ò )ˆØ�7‰7�mÓ#Ø�{‰{˜g×:Ñ:Ñ:Ø$×9Ñ9¸$¿+¹+ÑF�
ØÐ!<Ñ<Ø ;¸JÑ G× MÑ MÓ Oò )™˜˜1Ø'(˜Ÿ	™	 !šð)à�{‰{˜g×7Ñ7Ò7Ø%×7Ñ7¸¿¹ÑD�ØÐ"=Ò=Ø ;¸KÑ H× NÑ NÓ Pò )™˜˜1Ø'(˜Ÿ	™	 !šñ)ñ)rQ   c                 óJ  — | j                   j                  D �cg c]-  }|j                  j                  dd «      �|j                  d   ‘Œ/ }}t	        | «      }|�|j
                  S |D ]4  }t        |t        j                  «      sŒ|j                  j
                  c S  y c c}w )NÚval)
r[   r\   r]   ÚgetÚ_detect_fake_mode_from_gmÚ	shape_envr_   rW   ÚSymIntrj   )rp   rj   ÚvalsÚ	fake_moder{   s        rB   Ú_get_shape_env_from_gmr†   °   s—   € ð —H‘H—N‘NöàØ�9‰9�=‰=˜ Ó%Ð1ð 	�	‰	�%Óð€Dð ô *¨"Ó-€IØÐØ×"Ñ"Ð"Øò $ˆÜ�aœŸ™Õ&Ø—6‘6×#Ñ#Ò#ñ$ùòs   ™2B FÚname_mapÚ	orig_namer<   Úis_placeholderc                 óZ  — || j                  «       v r�t        j                  d|«      }|r.|s,|j                  d«      t	        |j                  d«      «      }}nd}|› d|dz   › �x}| j                  «       v r"|dz  }|› d|dz   › �x}| j                  «       v rŒ"|| |<   | |   S || |<   | |   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   rl   )ru   ÚreÚmatchÚgroupÚint)r‡   rˆ   r<   r‰   rŽ   ÚnÚdup_names          rB   Ú_rename_without_collisionsr“   ¿   sÌ   € ð ˆx�‰Ó Ñ ô —‘˜¨Ó-ˆÙ™Ø—k‘k !“n¤c¨%¯+©+°a«.Ó&9�!‰DàˆAØ"˜V 1 Q¨¡U GÐ,Ð,ˆx°·±Ó1BÑBØ�‰FˆAð #˜V 1 Q¨¡U GÐ,Ð,ˆx°·±Ó1BÒBà&ˆ�Ñð �IÑÐð #ˆ�ÑØ�IÑÐrQ   Úinput_placeholdersc                 óà  — dt         dt        fd„}dd l}ddlm} ddlm} t        |«      t        | «      k7  r$t        dt        | «      › dt        |«      › d	�«      ‚i }t        || «      D �]  \  \  }}	}
|
j                  j                  d
«      }t        |t        «      �ryt        |	t        j                  «      s t        d ||«      › dt!        |	«      › �«      ‚t        |j"                  «      t        |	j"                  «      k7  r/t        d ||«      › d|j"                  › d|	j"                  › d	�«      ‚t%        t        |	j"                  |j"                  «      «      D �]¶  \  }\  }}t        |t        j&                  «      �r4t        |j(                  j*                  j,                  «      dk(  �rt/        t1        |j(                  j*                  j,                  «      «      }||v rH|j(                  j*                  j3                  |«      }||k7  �r
t        d ||«      › d|› d|› d|› �«      ‚t        |t        j&                  «      r!|j(                  j*                  j4                  sn²t        |j(                  j*                  |j6                  «      rt9        |«      ||<   ny ||j;                  |j(                  j*                  |«      |«      }|€9t        d|
j<                  › d|› d|› d|j(                  j*                  › d|› d�«      ‚t9        |d   «      ||<   |j(                  j*                  |v s�Œ× |||j(                  j*                     «      \  }}|dkD  r"||k  rt        d ||«      › d|› d|› d|› �«      ‚|t>        j@                  k  s�Œ5||kD  s�Œ<t        d ||«      › d|› d|› d|› �«      ‚||k7  s�Œ`t        |t        j&                  «      r"|j(                  j*                  j4                  s�Œœt        d ||«      › d|› d|› d|› �«      ‚ �Œ¯t        |t8        tB        t        f«      s�ŒÌt!        |	«      t!        |«      k7  s|	|k7  s�Œêt        d ||«      › d|› d|	› �«      ‚ y )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Œ   )r_   r   Úidxr   r   rZ   )r–   Úargs_kwargs_key_pathÚ	kwarg_keyr<   s       rB   Ú
get_keystrz6_check_input_constraints_for_graph.<locals>.get_keystrß   sŠ   € ð  (¨™{ÐÜÐ.´Ô<Ð<Ð<Ø×#Ñ# qÒ(Øœ6 (¨1¨2 ,Ó/Ð0Ð1Ð1à  ™ˆIÜ˜i¬Ô4Ð4Ð4Ü�y“> ! BÐ'ˆDØ�VœF 8¨A¨B <Ó0Ð1Ð2Ð2rQ   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   rZ   ÚsympyÚ@torch._export.passes.add_runtime_assertions_for_constraints_passr�   Útorch.utils._sympy.solverž   ÚlenÚRuntimeErrorÚzipr]   r€   r_   r   rW   ÚTensorÚtypeÚshapeÚ	enumeraterƒ   rj   ÚexprÚfree_symbolsÚnextÚiterÚsubsÚ	is_numberÚSymbolr�   ÚEqr<   ÚmathÚinfÚfloat)r”   Úflat_args_with_pathÚrange_constraintsrœ   r    r�   rž   Úunification_mapr–   rm   rj   Únode_valÚjÚarg_dimÚnode_dimÚsymbolÚexisting_dimÚsolutionÚmin_valÚmax_vals                       rB   Ú"_check_input_constraints_for_graphrÁ   Ü   s‚  € ð3œWð 3¬ó 3ó" õõ 3ä
ÐÓ¤3Ð'9Ó#:Ò:ÜðÜÐ/Ó0Ð1°¼Ð<OÓ8PÐ7QÐQRðTó
ð 	
ð 02€OÜ!$Ð%8Ð:LÓ!Mó [Ñ‰ˆ�3˜Ø—9‘9—=‘= Ó'ˆÜ�h¤
Õ+Ü˜c¤5§<¡<Ô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ó HÑ&�Ñ&�G˜Xô ˜x¬¯©Õ6Ü˜HŸM™M×.Ñ.×;Ñ;Ó<ÀÓAä!¤$ x§}¡}×'9Ñ'9×'FÑ'FÓ"GÓH�FØ Ñ0Ø'/§}¡}×'9Ñ'9×'>Ñ'>¸Ó'O˜Ø" lÓ2Ü".Ø"4±ZÀÓ5IÐ4JÈ'ÐRSÐQTÐTeØ#/ .°
¸7¸)ð!Eó#ð ô ' w´·±Ô=Ø$+§L¡L×$5Ñ$5×$?Ò$?ð
 !ä)¨(¯-©-×*<Ñ*<¸e¿l¹lÔKô
 ;>¸g», °Ò 7á+4Ø$)§H¡H¨X¯]©]×-?Ñ-?ÀÓ$IÈ6ó," ð $,Ð#3Ü*6Ø*9¸$¿)¹)¸ÀGÈAÈ3ÈdÐSZÐR[ð \7Ø7?·}±}×7IÑ7IÐ6JÈ(ÐSYÐRZÐZhð)jó+&ð %&ô
 ?BÀ(È1Á+Ó>N O°FÑ$;à—}‘}×)Ñ)Ð->Ó>Ù+@Ø-¨h¯m©m×.@Ñ.@ÑAó,Ñ(˜ ð # Qš;Ø&¨Ò0Ü&2Ø&8¹ÀHÓ9MÐ8NÈgÐVWÐUXÐXcØ'. i¨z¸'¸ð%Dó'"ð !"ð #¤T§X¡XÔ-Ø&¨Ô0Ü&2Ø&8¹ÀHÓ9MÐ8NÈgÐVWÐUXÐXcØ'. i¨z¸'¸ð%Dó'"ð !"ð
  (Ô*ä& x´·±Ô>Ø$,§M¡M×$6Ñ$6×$@Ò$@ñ %Ü*Ø0±¸HÓ1EÐ0FÀgÈaÈSÐPaØ'˜j¨
°7°)ð=óð òKHôR ˜¤3¬¬sÐ"3Ö4Ü�C‹yœD ›NÒ*¨c°X¬oÜ"Ø(©°HÓ)=Ð(>Ð>NÈxÈjÐXbÐcfÐbgÐhóð ñs[rQ   )Ú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        ‰ ‰|||	||¬«       y )Nz7Only dataclasses can be registered with this function: Úobjr&   c                 ó  •— g }g }g }t        j                  | «      D ]\  }|j                  t        | |j                  «      }}|€‰r#|j	                  |«       |j	                  |«       ŒL|j	                  |«       Œ^ |||gfS ©N)ÚdataclassesÚfieldsr<   r1   Úappend)rÊ   Ú	flattenedÚ
flat_namesÚ
none_namesÚfr<   r   rÅ   s          €rB   Údefault_flatten_fnz=register_dataclass_as_pytree_node.<locals>.default_flatten_fnl  sˆ   ø€ Øˆ	Øˆ
Øˆ
Ü×#Ñ# CÓ(ò 	(ˆAØŸ™¤¨¨Q¯V©VÓ 4�#ˆDØˆÑ"4Ø× Ñ  Ô%Ø×!Ñ! $Õ'à×!Ñ! $Õ'ð	(ð ˜: zÐ2Ð2Ð2rQ   ru   Úcontextc           
      ón   •— |\  }} ‰di t        t        || «      «      ¤t         j                  |«      ¤ŽS )N© )Údictr¥   Úfromkeys)ru   rÕ   rÑ   rÒ   rÆ   s       €rB   Údefault_unflatten_fnz?register_dataclass_as_pytree_node.<locals>.default_unflatten_fny  s5   ø€ Ø!(Ñˆ
�JÙÑP”Tœ#˜j¨&Ó1Ó2ÐP´d·m±mÀJÓ6OÑPÐPrQ   c                 ó„   •—  ‰| «      \  }\  }}t        ||«      D ��cg c]  \  }}t        |«      |f‘Œ c}}|fS c c}}w rÌ   )r¥   r   )rÊ   rÐ   rÑ   rÒ   rz   r{   rÇ   s         €rB   Údefault_flatten_fn_with_keyszGregister_dataclass_as_pytree_node.<locals>.default_flatten_fn_with_keys}  sC   ø€ Ù.8¸«oÑ+ˆ	Ñ+�J 
Ü/2°:¸yÓ/I×J¡t q¨!”˜A“ Ò"Ó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_dataclassr   r	   r   r   r   Ú
ValueErrorr   )
rÆ   rÇ   rÈ   rÂ   rÃ   rÄ   rÅ   rÔ   rÚ   rÜ   s
   ``    `   rB   Ú!register_dataclass_as_pytree_noderà   ^  s  ú€ ô ×#Ñ#Øôð Gà	@ÀÀÐFóGð ð3¤ð 3¬¬d´3©i¼Ð.@Ñ(Aõ 3ðQ¤X¬c¡]ð Q¼Wð QÌõ QðW¬#ð W´%¼¼S¹	Ä7Ð8JÑ2Kõ Wð  *Ð5‘Ð;M€JØ#/Ð#;‘<ÐAU€Là˜tÐ#Ð(=ÀÐ(EÒFÜØEÀcÀUð K%ð %ó
ð 	
ô
 ØØØØ1Ø9Ø/Ø3örQ   Úprogramr   rj   c                 óF   — |j                   | j                  j                  v S )zM
    Checks if the given node is a parameter within the exported program
    )r<   r6   rv   ©rá   rj   s     rB   Úis_paramrä   •  s   € ð
 �9‰9˜×/Ñ/×DÑDÐDÐDrQ   c                 ó€   — t        | |«      r2| j                  j                  |j                     }| j                  |   S y)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ä   r6   rv   r<   Ú
state_dict)rá   rj   Úparameter_names      rB   Ú	get_paramrè   �  s<   € ô �˜ÔØ ×0Ñ0×EÑEÀdÇiÁiÑPˆØ×!Ñ! .Ñ1Ð1àrQ   c                 óF   — |j                   | j                  j                  v S )zJ
    Checks if the given node is a buffer within the exported program
    )r<   r6   rw   rã   s     rB   Ú	is_bufferrê   ­  s   € ð
 �9‰9˜×/Ñ/×AÑAÐAÐArQ   c                 óÎ   — t        | |«      rY| j                  j                  |j                     }|| j                  j                  v r| j
                  |   S | j                  |   S y)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ê   r6   rw   r<   r;   r7   ræ   )rá   rj   r|   s      rB   Ú
get_bufferrì   µ  sa   € ô �˜$ÔØ×-Ñ-×?Ñ?ÀÇ	Á	ÑJˆØ˜'×1Ñ1×HÑHÑHØ×$Ñ$ [Ñ1Ð1à×%Ñ% kÑ2Ð2àrQ   c                 óF   — |j                   | j                  j                  v S )zZ
    Checks if the given node is a lifted tensor constant within the exported program
    )r<   r6   Ú!inputs_to_lifted_tensor_constantsrã   s     rB   Úis_lifted_tensor_constantrï   È  s   € ð �9‰9˜×/Ñ/×QÑQÐQÐQrQ   c                 ó€   — t        | |«      r2| j                  j                  |j                     }| j                  |   S y)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ï   r6   rî   r<   r7   )rá   rj   Úlifted_tensor_names      rB   Úget_lifted_tensor_constantrò   Ó  sC   € ô ! ¨$Ô/Ø$×4Ñ4×VÑVØ�I‰Iñ
Ðð × Ñ Ð!3Ñ4Ð4àrQ   c                 ó   ‡— ddl m} i Šd}| j                  j                  D ]  } ||«      r|dz  }|‰|<   Œ  || | ˆfd„dd¬«      }| j                  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Ì   r×   )rj   Ú	split_maps    €rB   ú<lambda>z"sequential_split.<locals>.<lambda>÷  s   ø€ �Y˜t‘_€ rQ   T)Úkeep_original_orderÚkeep_original_node_name)Útorch.fx.passes.split_modulerô   r[   r\   Ú_codegenÚ	recompile)rp   Únode_call_backrô   Úsplit_idrj   Únew_gmrö   s         @rB   Úsequential_splitr   å  s‡   ø€ õ :à€IØ€HØ—‘—‘ò #ˆÙ˜$ÔØ˜‰MˆHØ"ˆ	�$Šð#ñ
 Ø
Ø
Û$Ø Ø $ô€Fð ŸH™H×-Ñ-€F‡L�LÔØ
×ÑÔØ€MrQ   r\   c                 ó>   — | D �cg c]  } ||«      sŒ|‘Œ c}S c c}w )z:Returns the nodes that match the node_call_back as a list.r×   ©r\   rý   rj   s      rB   Únodes_filterr    s   € à"Ö;�T¡n°TÕ&:ŠDÒ;Ð;ùÒ;s   …“c                 óL   — t        | |r|nd„ «      }t        |«      dkD  r|d   S y)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                  ó   — y)NTr×   ©rj   s    rB   r÷   znodes_first.<locals>.<lambda>  s   � rQ   r   N)r  r£   )r\   rý   Úrets      rB   Únodes_firstr    s,   € ô �u±™nÑDUÓ
V€CÜ
ˆ3ƒx�!‚|Ø�1‰vˆØrQ   c                 ó,   — t        t        | |«      «      S )z:Returns the number of nodes that match the node_call_back.)r£   r  )r\   rý   s     rB   Únodes_countr
    s   € äŒ|˜E >Ó2Ó3Ð3rQ   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.
    r×   r  s      rB   Ú	nodes_mapr    s    € ð
 ò ˆÙ�tÕðà€LrQ   Úold_nodeÚnew_nodec                 ó�   — | j                  |«       | j                  j                  «        | j                  j	                  | «       y)z5
    Replace all uses of old_node with new_node.
    N)Úreplace_all_uses_withÚusersÚclearr[   Ú
erase_node)r  r  s     rB   Únode_replace_r  "  s4   € ð ×"Ñ" 8Ô,Ø‡N�N×ÑÔØ‡N�N×Ñ˜hÕ'rQ   Úcall_mod_nodec                 óö  ‡— | j                   dk(  sJ ‚| j                  j                  }t        | j                  t
        «      sJ ‚t        || j                  «      }d„ |j                  j                  D «       }d„ |j                  j                  D «       }|j                  j                  D �cg c]  }|j                   dk(  sŒ|‘Œ }}t        || j                  «      D ]7  \  }}t        |t        j                  j                  «      sJ ‚t        ||«       Œ9 |j                  j                  | «      5  |D ])  }|j                  j                  |«      }	t        ||	«       Œ+ t!        |«      dkD  �r4t!        |«      dk(  rt!        |d   j                  «      dk(  sJ ‚|d   j                  d   Št        ‰t        j                  j                  «      r'‰j"                  j%                  «        t        | ‰«       nÇt        ‰t&        t(        f«      r~‰D ]   }|j"                  j+                  |d   «       Œ" t-        t'        | j"                  j/                  «       «      d„ «      }
t1        |
ˆfd„«       | j                  j3                  | «       n3t5        d	t7        ‰«      › d
�«      ‚| j                  j3                  | «       ddd«       |j9                  «        |j;                  «        |S c c}w # 1 sw Y   Œ0xY w)z‘
    Inline the submodule of the given node into the parent module.
    Note: we only support the case where submodule takes tensors inputs.
    rR   c              3   ó@   K  — | ]  }|j                   d k(  sŒ|–— Œ y­w)rt   N©r^   ©Ú.0rj   s     rB   ú	<genexpr>znode_inline_.<locals>.<genexpr>6  s   è ø€ Ò
K�D°$·'±'¸]Ó2JŒ4Ñ
Kùs   ‚—c              3   ó>   K  — | ]  }|j                   d vsŒ|–— Œ y­w))rt   ÚoutputNr  r  s     rB   r  znode_inline_.<locals>.<genexpr>7  s!   è ø€ ò Ø¨t¯w©wÐ>WÒ/WŒñùs   ‚–r  r   r‹   c                 ó^   — | j                   dk(  xr | j                  t        j                  k(  S )NrV   )r^   r.   ÚoperatorÚgetitemr  s    rB   r÷   znode_inline_.<locals>.<lambda>V  s)   €  §¡¨OÑ!;ò "8ØŸ™¤x×'7Ñ'7Ñ7ð rQ   c                 ó<   •— t        | ‰| j                  d      «      S )Nr‹   )r  Úargs)Úget_item_nodeÚ
new_outputs    €rB   r÷   znode_inline_.<locals>.<lambda>\  s"   ø€ ¬-Ø%Ø" =×#5Ñ#5°aÑ#8Ñ9ó+€ rQ   zUnsupported output type z2. Expect it to be a Node or a list/tuple of Nodes.N)r^   r[   Úowning_moduler_   r.   rZ   r1   r\   r¥   r"  rW   rX   ÚNoder  Úinserting_beforeÚ	node_copyr£   r  r  ÚlistÚtupler3   r  Úkeysr  r  ÚNotImplementedErrorr§   Údelete_all_unused_submodulesrü   )r  rp   Úsub_gmÚphsÚbodyrj   r  Úphrm   r  Úget_item_usersr$  s              @rB   Únode_inline_r3  +  s’  ø€ ð
 ×Ñ˜}Ò,Ð,Ð,Ø	×	Ñ	×	*Ñ	*€Bä�m×*Ñ*¬CÔ0Ð0Ð0Ü�R˜×-Ñ-Ó.€Fá
K˜FŸL™L×.Ñ.Ô
K€CñØŸ™×+Ñ+ô€Dð  &Ÿ|™|×1Ñ1ÖI�t°T·W±WÀÓ5HŠdÐI€FÐIä�s˜M×.Ñ.Ó/ò ‰ˆˆCÜ˜#œuŸx™xŸ}™}Ô-Ð-Ð-Ü�b˜#Õðð 
�‰×	"Ñ	" =Ó	1ñ ':Øò 	*ˆDØ—x‘x×)Ñ)¨$Ó/ˆHÜ˜$ Õ)ð	*ô ˆv‹;˜‹?Ü�v“; !Ò#¬¨F°1©I¯N©NÓ(;¸qÒ(@Ð@Ð@Ø ™Ÿ™¨Ñ*ˆJä˜*¤e§h¡h§m¡mÔ4ð × Ñ ×&Ñ&Ô(Ü˜m¨ZÕ8Ü˜J¬¬u¨Ô6à&ò .�DØ—J‘J—N‘N 6¨!¡9Õ-ð.ô ".Ü˜×,Ñ,×1Ñ1Ó3Ó4ñ8ó"�ô Ø"óôð ×#Ñ#×.Ñ.¨}Õ=ä)Ø.¬t°JÓ/?Ð.@Ð@rÐsóð ð ×Ñ×*Ñ*¨=Ô9÷O':ðR ×#Ñ#Ô%Ø‡L�L„NØ€Iùòc J÷':ð ':ús   Â-K*ÃK*Ä3FK/Ë/K8c                 óª  — t        j                  | j                  «      }|j                  d   }dt        j
                  i}g }|j                  «       D ]d  \  }}t        |j                  |«      D �cg c]  }|j                  ‘Œ }}|D ]-  }	|	dk(  rŒ	|j                  t        j                  |	|«      «       Œ/ Œf t        j                  |¬«      S c c}w )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   r"  Úself)Ú
parameters)ÚastÚparseÚcoder0  r   ÚPOSITIONAL_OR_KEYWORDr/   r1   r"  rm   rÏ   ÚinspectÚ	Signature)
r8   Úast_modÚast_func_defÚarg_type_mapÚ
param_listÚarg_typeÚ
param_typeÚaÚarg_name_listÚarg_names
             rB   Ú&_get_torch_jit_trace_forward_signaturerF  n  sÏ   € ô �i‰i˜Ÿ™Ó!€GØ$+§L¡L°¡O€Lð œI×;Ñ;Ð<€Lð €JØ ,× 2Ñ 2Ó 4ò GÑˆ�*Ü(/°×0AÑ0AÀ8Ó(LÖM 1˜Ÿ›ÐMˆÐMØ%ò 	GˆHØ˜6Ò!ØØ×Ñœg×/Ñ/°¸*ÓEÕFñ	GðGô ×Ñ¨
Ô3Ð3ùò Ns   Á1Cc                 ór  — t        | t        j                  j                  t        j                  j                  f«      r?t        | «      }t        |j                  «      t        |«      t        |«      z   k(  s&J d«       ‚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)r_   rW   ÚjitÚScriptModuleÚTracedModulerF  r£   r6  r;  Ú	signatureÚforwardÚbindÚ	arguments)r8   Ú	fake_argsÚfake_kwargsÚsigs       rB   Ú_bind_signature_to_inputsrR  ‡  s•   € Ü�#œŸ	™	×.Ñ.´·	±	×0FÑ0FÐGÔHÜ4°SÓ9ˆô �3—>‘>Ó"¤c¨)£n´s¸;Ó7GÑ&GÒGð 	
ðJó	
ÐGô
 ×Ñ §¡Ó,ˆàˆ3�8‰8�YÐ. +Ñ.×8Ñ8Ð8rQ   c                 ó�  — g }| j                   j                  D �]p  }|j                  dk(  sŒt        |j                  t
        j                  j                  «      sŒC|j                  j                  dk(  r`|j                  \  }}}}|j                  t        | |j                  «      |f«       |j                  t        | |j                  «      |f«       Œ¼|j                  j                  dk(  rG|j                  d   |j                  dd }}|j                  t        | |j                  «      |f«       �Œ|j                  j                  dk(  s�Œ7|j                  \  }	}
}|j                  t        | |	j                  «      |
|z   f«       �Œs |D ]µ  \  }}i }t        |j                   j                  «      D ]q  \  }}|t        |«      k  r8||   j                  ||j                  <   ||   j                  x|_        |_        ŒLt        ||j                  |j                  «      |_        Œs t!        |«       |j#                  «        Œ· y)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.
    rV   ÚcondÚwrap_with_set_grad_enabledr‹   rŒ   NÚmap_impl)r[   r\   r^   r_   r.   rW   rd   re   Ú_nameÚ_argsrÏ   r1   r©   r£   r<   r“   Ú_name_hoo_subgraph_placeholdersrü   )rp   Úsubgraph_ph_tuplesrj   rl   Ú
true_graphÚfalse_graphÚ	cond_argsÚsubgraphr/  Ú
body_graphÚarrayr"  Úhoo_phsr‡   Úis                  rB   rY  rY  –  sé  € ð RTÐØ—‘—‘ó ˆØ�7‰7�oÓ%¬*Ø�K‰KœŸ™×7Ñ7õ+
ð �{‰{× Ñ  FÒ*Ø8<¿
¹
Ñ5��:˜{¨IØ"×)Ñ)¬7°2°z×7HÑ7HÓ+IÈ9Ð*UÔVØ"×)Ñ)¬7°2°{×7IÑ7IÓ+JÈIÐ*VÕWØ—‘×"Ñ"Ð&BÒBØ $§
¡
¨1¡¨t¯z©z¸!¸"¨~˜#�Ø"×)Ñ)¬7°2°x·±Ó+GÈÐ*MÖNØ—‘×"Ñ" jÔ0Ø*.¯*©*Ñ'�
˜E 4Ø"×)Ñ)Ü˜R ×!2Ñ!2Ó3°U¸T±\ÐBöðð& 0ò Ñˆ�'Ø#%ˆÜ  §¡×!5Ñ!5Ó6ò 	W‰GˆAˆtØ”3�w“<ÒØ&-¨a¡j§o¡o�˜Ÿ™Ñ#Ø*1°!©*¯/©/Ð9�”	˜D�Kä6°xÀÇÁÈDÏIÉIÓV�•	ð	Wô 	(¨Ô1Ø×ÑÕñrQ   Úexport_graph_signaturer7   c           
      ó>  ‡— d„ }d„ Ši }t        |||«      }	t        |	«      \  }
}|j                  D �cg c]5  }|j                  t        j
                  k(  r|j                  j                  ‘Œ7 }}t        |
|«      D ]J  \  \  }}}|sŒt        ||t        t        j
                     dj                  ˆfd„|D «       «      z   d¬«       ŒL |j                  D ]®  }|j                  t        j
                  k(  rŒ!|j                  t        j                  k(  rd}n  ||j                  «      j                  «       }t        j                   dd|«      }t        ||j                  j                  t        |j                     |z   d¬«       Œ° | j"                  j$                  D ]3  }|j&                  d	k(  rŒt        ||j                  |j                  «       Œ5 | j"                  j$                  D ]`  }|j&                  d	k(  r,|j                  |v sJ ‚||j                     x|_        |_        Œ>|j                  |v sŒM||j                     |_        Œb t)        | «       | j+                  «        |j                  D ]ˆ  }|j                  j                  |v sJ ‚||j                  j                     |j                  _        |j                  t        j,                  k(  sŒc|j                  |v sŒr||j                     d
d |_        ŒŠ |j.                  D ]ƒ  }|j                  j                  |v r(||j                  j                     |j                  _        |j                  t0        j2                  k(  sŒa|j                  |v sŒp||j                     |_        Œ… t5        |j7                  «       «      D ]o  }||   }||v sŒt9        |t:        j<                  «      rŒ(||   }||k7  sŒ3t        j>                  d|«      sŒJ|t        t        j,                     |z   k7  sŒh|||<   ||= Œq yc c}w )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                 ó²   — | j                  d«      r| t        d«      d  } n| j                  d«      r| t        d«      d  } t        j                  dd| «      } | S )NÚ
L__self___Úself_ú[^a-zA-Z0-9]rl   )Ú
startswithr£   r�   Úsub©Úxs    rB   Ú_strip_namez,placeholder_naming_pass.<locals>._strip_nameÛ  sS   € Ø�<‰<˜Ô%Ø”#�lÓ#Ð%Ð&‰AØ�\‰\˜'Ô"Ø”#�g“,�.Ð!ˆAÜ�F‰F�? C¨Ó+ˆØˆrQ   c                 ó0  — 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| › �«      ‚)Nrh  rl   zPytree key of type z not handled for )r_   r   r�   rj  rZ   Úkeyr   r™   r   r<   r¤   r§   rk  s    rB   Ú_extract_pytree_keyz4placeholder_naming_pass.<locals>._extract_pytree_keyã  st   € Ü�aœÔ$Ü—‘�¨¬S°·±«ZÓ8ˆAØˆHÜ˜œ;Ô'Ü�q—u‘u“:ÐÜ˜œ:Ô&Ø—6‘6ˆMäÐ!4´T¸!³W°IÐ=NÈqÈcÐRÓSÐSrQ   rl   c              3   óJ   •K  — | ]  } ‰|«      j                  «       –— Œ y ­wrÌ   )Úlower)r  rl  rp  s     €rB   r  z*placeholder_naming_pass.<locals>.<genexpr>  s    øè ø€ ÒL¸aÑ.¨qÓ1×7Ñ7×9ÑLùs   ƒ #T)r‰   r    rh  rt   é   Nz
arg(\d+)_1) rR  r   r*   r+   r   Ú
USER_INPUTrm   r<   r¥   r“   Úplaceholder_prefixesÚjoinÚTOKENr.   rr  r�   rj  r[   r\   r^   rY  rü   Ú
CUSTOM_OBJÚoutput_specsr   ÚUSER_INPUT_MUTATIONr)  r+  r_   rW   r¦   rŽ   )rp   rc  r8   rO  rP  Úfake_params_buffersr7   rm  r‡   Úcombined_argsrµ   rl   r:   Úuser_input_namesÚarg_pathrm   Úuser_input_nameÚ	base_namerj   r<   ÚconstantÚnew_namerp  s                         @rB   Úplaceholder_naming_passrƒ  À  s—  ø€ ò6ò	Tð  "€Hô .¨c°9¸kÓJ€Mä3°MÓBÑÐ˜ð +×6Ñ6öàØ�9‰9œ	×,Ñ,Ò,ð 	�‰�‹ðÐð ô -0Ð0CÐEUÓ,Vò Ñ(‰ˆ�3˜ÚÜ&ØØÜ$¤Y×%9Ñ%9Ñ:Ø—(‘(ÓLÀ8ÔLÓLñMà#öðð '×2Ñ2ò 
ˆØ�9‰9œ	×,Ñ,Ò,ØØ�9‰9œ	Ÿ™Ò'Ø‰Iá# D§K¡KÓ0×6Ñ6Ó8ˆIÜ—F‘F˜?¨C°Ó;ˆ	ä"ØØ�H‰H�M‰MÜ  §¡Ñ+¨iÑ7Øö		
ð
ð( —‘—‘ò CˆØ�7‰7�mÒ#ØÜ" 8¨T¯Y©Y¸¿	¹	ÕBðCð —‘—‘ò ,ˆØ�7‰7�mÒ#Ø—9‘9 Ñ(Ð(Ð(Ø&.¨t¯y©yÑ&9Ð9ˆDŒI˜�Ø�Y‰Y˜(Ò"Ø  §¡Ñ+ˆD�Ið,ô $ BÔ'ð ‡L�L„Nð '×2Ñ2ò 4ˆØ�x‰x�}‰} Ñ(Ð(Ð(Ø  §¡§¡Ñ/ˆ�‰Œà�I‰Iœ×-Ñ-Ó-°$·+±+ÀÒ2Ià" 4§;¡;Ñ/°°Ð3ˆD�Kð4ð '×3Ñ3ò 0ˆØ�8‰8�=‰=˜HÑ$Ø$ T§X¡X§]¡]Ñ3ˆD�H‰HŒMØ�9‰9œ
×6Ñ6Ó6¸4¿;¹;È(Ò;RØ" 4§;¡;Ñ/ˆD�Kð	0ô �Y—^‘^Ó%Ó&ò $ˆØ˜T‘?ˆØ�8Ò¤JØ”e—l‘lõ%
ð   ‘~ˆHà˜DÓ Ü—H‘H˜]¨DÕ1ØÔ 4´Y×5IÑ5IÑ JÈTÑ QÓQà&.�	˜(Ñ#Ø˜d‘Oñ$ùòUs   ³:Præ   Úin_placec                 ó  — |r6| j                  «       D ]!  \  }}t        |d«      sŒt        | |   d«       Œ# | S i }| j                  «       D ]8  \  }}t        |d«      r"|j                  «       j	                  «       ||<   Œ4|||<   Œ: |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.
    rg   )r/   ÚhasattrÚdelattrÚcloneÚdetach)ræ   r„  rz   r{   Únew_state_dicts        rB   Úremove_proxy_from_state_dictr‹  M  s™   € ñ Ø×$Ñ$Ó&ò 	0‰DˆAˆqÜ�q˜'Õ"Ü˜
 1™ wÕ/ð	0ð ÐàˆØ×$Ñ$Ó&ò 	&‰DˆAˆqÜ�q˜'Ô"Ø$%§G¡G£I×$4Ñ$4Ó$6�˜qÒ!à$%�˜qÒ!ð		&ð
 ÐrQ   c                 óD  — g }g }| j                   j                  D ]ö  }|j                  dk(  rMd|j                  v r?|j                  d   }|€Œ2t	        |t
        j                  «      sŒM|j                  |«       Œ_t        |«      dk(  sŒnd|j                  v sd|j                  v sŒ‹d}d|j                  v r|j                  d   }nd|j                  v r|j                  d   }|€ŒËt	        |t
        j                  «      sŒæ|j                  |«       Œø 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.
    rt   r   Nr   Úexample_value)
r[   r\   r^   r]   r_   rW   r¦   rÏ   r£   r   )rp   Ú	fake_inpsÚ	fake_valsrj   Úfake_vals        rB   r�   r�   b  sú   € ð %'€IØ$&€IØ—‘—‘ò +ˆØ�7‰7�mÒ#¨°·±Ñ(:Ø—y‘y Ñ'ˆHØÑ#¬
°8¼U¿\¹\Õ(JØ× Ñ  Õ*Ü�‹^˜qÓ Ø˜tŸy™yÑ(¨E°T·Y±YÒ,>àˆHØ $§)¡)Ñ+ØŸ9™9 _Ñ5‘Ø˜$Ÿ)™)Ñ#ØŸ9™9 UÑ+�ØÑ#¬
°8¼U¿\¹\Õ(JØ× Ñ  Õ*ð+ô  ˜I¨	Ñ1Ó2Ð2rQ   )r&   r   )rF   r   rD   r   )F)NNrÌ   )Xr7  rÍ   r;  r²   r  r�   r   Útypingr   r   r   r   r   r	   r
   r   rW   Útorch._guardsr   Útorch._subclasses.fake_tensorr   r)   r   Útorch.exportr   Útorch.export.graph_signaturer   r   r   Útorch.utils._pytreer   r   r   r   r   r   r   r   r   r   r   r   rt  Ú	PARAMETERr,   ÚCONSTANT_TENSORrx  rw  ru  rC   rG   rX   rY   rZ   ro   r}   r†   Úboolr“   r&  rÁ   rà   rä   r`   rè   rê   r¦   rì   rï   rò   r   r  r  r�   r
  r  r  r3  ra   rF  rR  rY  rƒ  r‹  Ú_subclassesÚfake_tensorÚFakeTensorModer�   r×   rQ   rB   ú<module>r�     s  ðã 
Û Û Û Û Û 	Ý ß R× RÓ Rã Ý *Ý 4ñ ÝHÝ,ÝAç >÷÷ ÷ ó ð" ×Ñ˜"Ø×Ñ˜Ø×Ñ�dØ×Ñ˜tØ×Ñ˜&Ø‡O�O�WðÐ ðàóð<Ø#ðØ.Dóð 3'¨¯©×(<Ñ(<ð 3'ÀÀcÈ3ÀhÁó 3'ðl)Ø!% c¨3 h¡ð)à�‰×Ñð)ð $ð)ð 
ó	)ð8$˜uŸx™x×3Ñ3ó $ð& !ñ	Ø�3˜�8‰nðàðð ðð ó	ð:Ø˜UŸX™XŸ]™]Ñ+óðH )-Ø,0ð4ð
 +/Ø9=Ø=AØ$ò4Ø	ˆc‰ð4à˜Ñ%ð4ð ˜=Ñ)ð4ð
 # 3™-ð4ð "Ð"5Ñ6ð4ð $Ð$9Ñ:ð4ð ð4ð 
ó4ðnEÐ'ð E¨u¯x©x¯}©}ð EÀó EðØðà
�(‰(�-‰-ðð ˆe�h‰h× Ñ Ñ!óð BÐ(ð B°·±·±ð BÀ$ó BðØðà
�(‰(�-‰-ðð ˆe�l‰lÑóð&RØðRà
�(‰(�-‰-ðRð 
óRðØðà
�(‰(�-‰-ðð ˆe�l‰lÑóð$˜Ÿ™×-Ñ-ð À%Ç(Á(×BVÑBVó ð8<˜˜UŸX™XŸ]™]Ñ+ð <ÀÀUÇXÁXÇ]Á]Ñ@Só <ð 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ó (ð@ §¡§¡ð @°$ó @ðF4°·±·±ó 4ò29ð'¨¯©×(<Ñ(<ð 'Àó 'ðTJ$Ø�‰×ÑðJ$à2ðJ$ð 
�‰�‰ðJ$ð �C˜�H‰~ðJ$ð 
óJ$ðZ¨Tð ¸Tð Àdó ð*3Ø�‰×Ñð3à
×Ñ×"Ñ"×1Ñ1ô3rQ   