ó
    Eñi°  ã                   ó  • S SK r S SKJr  S SKJrJr  S SKrS SKJrJ	r	  \
\S4   r\\\\4   /\
\S4   4   r/ SQrS\S\4S	 jrS
\R$                  R&                  S\\\4   4S jrS\\   S\\\4   4S jrS\S\4S jrg)é    N)ÚCallable)ÚAnyÚUnion)Útree_flatten_with_pathÚtree_map.)Únormalize_source_nameÚmodule_to_nested_dictÚtrack_dynamism_across_examplesÚclone_and_convert_to_metaÚnameÚreturnc                 ó2   • [         R                  " SSU 5      $ )Nz\.([a-zA-Z_][a-zA-Z0-9_]*)z['\1'])ÚreÚsub)r   s    Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/fx/experimental/_dynamism.pyr   r      s   € ä�6Š6Ð/°¸DÓAÐAó    Úmodulec                 ó’  • 0 n0 US'   0 US'   [        U 5       H±  n UR                  S5      (       d—  [        [        X5      5      (       d|  [        X5      n[	        U[
        R                  R                  5      (       dF  [	        U[        [        [
        R                  45      (       a  [        U5      [        La  X1U'   M©  M«  M­  M¯  M±  M³     U R                  SS9 H  u  pEXQS   U'   M     U R                  SS9 H  u  pFXaS   U'   M     U R!                  5        H  u  pG[#        U5      US   U'   M     U$ ! [         a     GM-  f = f)ziRecursively converts an nn.Module into a nested dictionary with explicit 'parameters' and 'modules' keys.Ú_parametersÚ_modulesÚ_F)Úrecurse)ÚdirÚ
startswithÚcallableÚgetattrÚ
isinstanceÚtorchÚnnÚModuleÚintÚfloatÚTensorÚtypeÚboolÚNotImplementedErrorÚnamed_parametersÚnamed_buffersÚnamed_childrenr	   )r   Ú	self_dictÚ	attr_nameÚ
attr_valuer   ÚparamÚbufferÚ	submodules           r   r	   r	      sS  € à "€Ià!€IˆmÑØ€IˆjÑä˜–[ˆ	ð	Ø×'Ñ'¨×,Ñ,´XÜ˜Ó*÷6ñ 6ô % VÓ7�
ä" :¬u¯x©x¯©×?Ñ?Ü" :´´U¼E¿L¹LÐ/I×JÑJÜ˜ZÓ(´Ò4à+5˜iÓ(ñ 5ñ Kñ @ñ6Ñ,ñ !ð" ×.Ñ.°uÐ.Ó=‰ˆØ).�-Ñ  Ó&ñ >à×,Ñ,°UÐ,Ó;‰ˆØ)/�-Ñ  Ó&ñ <ð "×0Ñ0Ö2‰ˆÜ&;¸IÓ&Fˆ	�*Ñ˜dÓ#ñ 3ð Ðøô #ó 	ó ð	ús   œB#D7Ä7
EÅEÚexample_inputsc                 ó  • 0 nU  GH„  nSU;   a=  [        US   [        R                  R                  5      (       a  [	        US   5      US'   [        U5      u  p4U GH)  u  pV[        U[        [        [        R                  45      (       d  M2  [        U[        R                  5      (       a  [        UR                  5      nSnOU4nSnXQ;  a2  [        [        U5      5       Vs/ s H  n[        5       PM     snU4X'   OWX   u  pšX¨:w  a   [        U	5      [        U5      :  a3  U	R                  [        5       5        [        U	5      [        U5      :  a  M3  [        U5       H  u  p¼X   S   U   R!                  U5        M      GM,     GM‡     0 nUR#                  5        HV  u  nu  pž[        S U	 5       5      nSSR%                  S U 5       5      -   nUS   R&                  nUU;  a  0 UU'   XýU   U'   MX     U$ s  snf )	aì  
This function analyzes a list of example inputs to determine the dynamism of their shapes.
It tracks whether the dimensions of tensors or non-tensor values change across
different examples. The function returns a dictionary where each key represents
a path to a value in the input examples, and the corresponding value is a tuple
indicating which dimensions are dynamic (i.e., change across examples). This
helps in understanding how the structure of data varies across different instances.
ÚselfTFr   c              3   ó>   #   • U  H  n[        U5      S :„  v •  M     g7f)é   N)Úlen)Ú.0Úss     r   Ú	<genexpr>Ú1track_dynamism_across_examples.<locals>.<genexpr>c   s   é € Ð7ªh¨œ#˜a›& 1ž*ªhùs   ‚ÚLÚ c              3   ó:   #   • U  H  n[        U5       v •  M     g 7f)N)Ústr)r6   Úks     r   r8   r9   d   s   é € Ð>²X°¤3 q£6 (¤²Xùs   ‚)r   r   r   r    r	   r   r!   r"   r#   ÚtupleÚshapeÚranger5   ÚsetÚappendÚ	enumerateÚaddÚitemsÚjoinÚkey)r0   ÚtrackingÚexÚleaves_with_pathsr   Úkey_pathÚvaluer@   Ú	is_tensorÚdim_setsÚflagÚiÚdimÚoutputÚ
_is_tensorÚ	final_dynÚkey_strrH   s                     r   r
   r
   <   sÇ  € ð <>€HäˆØ�R‹<œJ r¨&¡z´5·8±8·?±?×CÑCÜ.¨r°&©zÓ:ˆBˆv‰JÜ5°bÓ9ÑÐÜ0‰OˆHÜ˜e¤c¬5´%·,±,Ð%?×@Ñ@ÙÜ˜%¤§¡×.Ñ.Ü16°u·{±{Ó1C�Ø ‘	à˜�Ø!�	ØÓ'Ü6;¼CÀ»JÔ6GÓ&HÒ6G°¤s¦uÑ6GÑ&HÈ)Ð%T�Ò"à!)Ñ!3‘�ØÓ$ØÜ˜(“m¤c¨%£jÓ0Ø—O‘O¤C£EÔ*ô ˜(“m¤c¨%£jÕ0ä# EÖ*‘�ØÑ" 1Ñ% aÑ(×,Ñ,¨SÖ1ô +ô#  1ñ	 ð0  €FØ,4¯N©NÖ,<Ñ(ˆÑ(�8ÜÑ7©hÓ7Ó7ˆ	Ø˜Ÿ™Ñ>±XÓ>Ó>Ñ>ˆØ�q‰k�o‰oˆØ�fÓØˆF�3‰KØ(ˆs‰�GÓñ -=ð €Mùò% 'Is   Ã$G<Úexample_inputc                 ó:   • S[         S[         4S jn[        X5      $ )zÔ
This function takes a list of example inputs and for each tensor, clones it and converts it to device=meta.
For non-tensor values, it keeps the reference. It uses pytree to handle nested structures recursively.
rM   r   c                 ó~   • [        U [        R                  5      (       a  U R                  5       R	                  SS9$ U $ )NÚmeta)Údevice)r   r   r#   ÚcloneÚto)rM   s    r   Útransform_fnÚ/clone_and_convert_to_meta.<locals>.transform_fnr   s2   € Ü�eœUŸ\™\×*Ñ*Ø—;‘;“=×#Ñ#¨6Ð#Ð2Ð2Øˆr   )r   r   )rW   r^   s     r   r   r   l   s"   € ðœCð ¤Cô ô
 �LÓ0Ð0r   )r   Úcollections.abcr   Útypingr   r   r   Útorch.utils._pytreer   r   r?   ÚKeyPathr!   r"   ÚNonTensorShapeFnÚ__all__r=   r   r   r    Údictr	   Úlistr
   r   © r   r   Ú<module>ri      s½   ðÛ 	Ý $ß ã ß @ð ��S�‰/€Ø˜U 3¨ :Ñ.Ð/°°s¸C°x±Ð@ÑAÐ ò€ðB ð B¨ô Bð
  %§(¡(§/¡/ð  °d¸3À¸8±nô  ðF-Ø˜‘Ið-à	ˆ#ˆsˆ(�^ô-ð`1¨Sð 1°Sõ 1r   