Ë
    f^(h—  ã                   óô   — d dl Z d dlmZmZmZ d dlZd dlmZmZ e	edf   Z
eeeef   ge	edf   f   Zg d¢Zdedefd„Zd	ej"                  j$                  deeef   fd
„Zdee   deeef   fd„Zdedefd„Zy)é    N)ÚAnyÚCallableÚ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                 ó0   — t        j                  dd| «      S )Nz\.([a-zA-Z_][a-zA-Z0-9_]*)z['\1'])ÚreÚsub)r   s    ú]/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/fx/experimental/_dynamism.pyr   r      s   € ä�6‰6Ð/°¸DÓAÐAó    Úmodulec                 óD  — i }i |d<   i |d<   t        | «      D ]˜  }|j                  d«      rŒt        t        | |«      «      rŒ+t        | |«      }t	        |t
        j                  j                  «      rŒ\t	        |t        t        t
        j                  f«      sŒ‚t        |«      t        usŒ”|||<   Œš | j                  d¬«      D ]  \  }}||d   |<   Œ | j                  d¬«      D ]  \  }}||d   |<   Œ | j                  «       D ]  \  }}t!        |«      |d   |<   Œ |S )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Únamed_parametersÚnamed_buffersÚnamed_childrenr	   )r   Ú	self_dictÚ	attr_nameÚ
attr_valuer   ÚparamÚbufferÚ	submodules           r   r	   r	      s2  € à "€Ià!€IˆmÑØ€IˆjÑä˜“[ò 2ˆ	Ø×#Ñ# CÕ(´¼'À&È)Ó:TÕ1UÜ  ¨Ó3ˆJä˜z¬5¯8©8¯?©?Õ;Ü˜z¬C´¼¿¹Ð+EÕFÜ˜Ó$¬DÒ0à'1�	˜)Ò$ð2ð ×.Ñ.°uÐ.Ó=ò /‰ˆˆeØ).ˆ	�-Ñ  Ò&ð/à×,Ñ,°UÐ,Ó;ò 0‰ˆˆfØ)/ˆ	�-Ñ  Ò&ð0ð "×0Ñ0Ó2ò G‰ˆˆiÜ&;¸IÓ&Fˆ	�*Ñ˜dÒ#ðGð Ðr   Úexample_inputsc                 óÎ  — i }| D �]m  }d|v r8t        |d   t        j                  j                  «      rt	        |d   «      |d<   t        |«      \  }}|D �]  \  }}t        |t        t        t        j                  f«      sŒ-t        |t        j                  «      rt        |j                  «      }d}n|f}d}||vr0t        t        |«      «      D �cg c]  }t        «       ‘Œ c}|f||<   nV||   \  }	}
|
|k7  r	 t        |	«      t        |«      k  r1|	j                  t        «       «       t        |	«      t        |«      k  rŒ1t        |«      D ]  \  }}||   d   |   j!                  |«       Œ! �Œ �Œp i }|j#                  «       D ]U  \  }\  }	}t        d„ |	D «       «      }ddj%                  d„ |D «       «      z   }|d   j&                  }||vri ||<   |||   |<   ŒW |S c c}w )	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   ó8   K  — | ]  }t        |«      d kD  –— Œ y­w)é   N)Úlen)Ú.0Úss     r   ú	<genexpr>z1track_dynamism_across_examples.<locals>.<genexpr>[   s   è ø€ Ò7¨œ#˜a›& 1�*Ñ7ùs   ‚ÚLÚ c              3   ó4   K  — | ]  }t        |«      › –— Œ y ­w)N)Ústr)r5   Úks     r   r7   z1track_dynamism_across_examples.<locals>.<genexpr>\   s   è ø€ Ò>°¤3 q£6 (£Ñ>ùs   ‚)r   r   r   r    r	   r   r!   r"   r#   ÚtupleÚshapeÚranger4   ÚsetÚappendÚ	enumerateÚaddÚitemsÚjoinÚkey)r/   ÚtrackingÚexÚleaves_with_pathsr   Úkey_pathÚvaluer>   Ú	is_tensorÚdim_setsÚflagÚiÚdimÚoutputÚ
_is_tensorÚ	final_dynÚkey_strrF   s                     r   r
   r
   4   sâ  € ð <>€Hàó 2ˆØ�R‰<œJ r¨&¡z´5·8±8·?±?ÔCÜ.¨r°&©zÓ:ˆBˆv‰JÜ5°bÓ9ÑÐ˜1Ø0ó 	2‰OˆH�eÜ˜e¤c¬5´%·,±,Ð%?Ô@ØÜ˜%¤§¡Ô.Ü16°u·{±{Ó1C�Ø ‘	à˜�Ø!�	Ø˜xÑ'Ü6;¼CÀ»JÓ6GÖ&H°¤s¥uÒ&HÈ)Ð%T�˜Ò"à!)¨(Ñ!3‘�˜$Ø˜9Ò$ØÜ˜(“m¤c¨%£jÒ0Ø—O‘O¤C£EÔ*ô ˜(“m¤c¨%£jÓ0ä# EÓ*ò 2‘��3Ø˜Ñ" 1Ñ% aÑ(×,Ñ,¨SÕ1ò2ò#	2ð	2ð0  €FØ,4¯N©NÓ,<ò )Ñ(ˆÑ(�8˜ZÜÑ7¨hÔ7Ó7ˆ	Ø˜Ÿ™Ñ>°XÔ>Ó>Ñ>ˆØ�q‰k�o‰oˆØ�fÑØˆF�3‰KØ(ˆˆs‰�GÒð)ð €Mùò% 'Is   ÃG"Úexample_inputc                 ó:   — dt         dt         fd„}t        || «      S )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.
    rK   r   c                 óz   — t        | t        j                  «      r | j                  «       j	                  d¬«      S | S )NÚmeta)Údevice)r   r   r#   ÚcloneÚto)rK   s    r   Útransform_fnz/clone_and_convert_to_meta.<locals>.transform_fnj   s/   € Ü�eœUŸ\™\Ô*Ø—;‘;“=×#Ñ#¨6Ð#Ó2Ð2Øˆr   )r   r   )rU   r\   s     r   r   r   d   s$   € ðœCð ¤Có ô
 �L -Ó0Ð0r   )r   Útypingr   r   r   r   Útorch.utils._pytreer   r   r=   ÚKeyPathr!   r"   ÚNonTensorShapeFnÚ__all__r;   r   r   r    Údictr	   Úlistr
   r   © r   r   ú<module>re      s¼   ðÛ 	ß 'Ñ 'ã ß @ð ��S�‰/€Ø˜U 3¨ :Ñ.Ð/°°s¸C°x±Ð@ÑAÐ ò€ðB ð B¨ó Bð
 %§(¡(§/¡/ð °d¸3À¸8±nó ð8-Ø˜‘Ið-à	ˆ#ˆsˆ(�^ó-ð`1¨Sð 1°Sô 1r   