§
    ŠŠtj	  ã                   ó  — d dl Z d dlmZ d dlmZ d dlZd dlmZmZ e	edf         Z
eeez  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dS )é    N)ÚCallable)ÚAny)Útree_flatten_with_pathÚtree_map.)Únormalize_source_nameÚmodule_to_nested_dictÚtrack_dynamism_across_examplesÚclone_and_convert_to_metaÚnameÚreturnc                 ó.   — t          j        dd| ¦  «        S )Nz\.([a-zA-Z_][a-zA-Z0-9_]*)z['\1'])ÚreÚsub)r   s    ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/fx/experimental/_dynamism.pyr   r      s   € åŒ6Ð/°¸DÑAÔAÐAó    Úmodulec                 ó²  — i }i }i }||d<   ||d<   t          | ¦  «        D ]¶}	 |                     d¦  «        sŽt          t          | |¦  «        ¦  «        sqt          | |¦  «        }t	          |t
          j        j        ¦  «        sBt	          |t          t          t
          j
        f¦  «        rt          |¦  «        t          ur|||<   Œ§# t          $ r Y Œ³w xY w|                      d¬¦  «        D ]\  }}||d         |<   Œ|                      d¬¦  «        D ]\  }}||d         |<   Œ|                      ¦   «         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ÚNotImplementedErrorÚnamed_parametersÚnamed_buffersÚnamed_childrenr   )
r   Ú	self_dictÚ
parametersÚmodulesÚ	attr_nameÚ
attr_valuer   ÚparamÚbufferÚ	submodules
             r   r   r      s¦  € à "€Ià*,€JØ)+€GØ)€IˆmÑØ#€IˆjÑå˜‘[”[ð ð ˆ	ð	Ø×'Ò'¨Ñ,Ô,ð 	6µXÝ˜ 	Ñ*Ô*ñ6ô 6ð 	6õ % V¨YÑ7Ô7�
å" :­u¬x¬Ñ?Ô?ð6å" :µµU½E¼LÐ/IÑJÔJð6õ ˜ZÑ(Ô(µÐ4Ð4à+5�I˜iÑ(øøÝ"ð 	ð 	ð 	ð ˆHð	øøøð
 ×.Ò.°uÐ.Ñ=Ô=ð /ð /‰ˆˆeØ).ˆ	�-Ô  Ñ&Ð&Ø×,Ò,°UÐ,Ñ;Ô;ð 0ð 0‰ˆˆfØ)/ˆ	�-Ô  Ñ&Ð&à!×0Ò0Ñ2Ô2ð Gð G‰ˆˆiÝ&;¸IÑ&FÔ&Fˆ	�*Ô˜dÑ#Ð#àÐs   £B#CÃ
CÃCÚexample_inputsc                 óB  — i }| D �]�}d|v r=t          |d         t          j        j        ¦  «        rt	          |d         ¦  «        |d<   t          |¦  «        \  }}|D �]C\  }}t          |t          t          t          j        f¦  «        sŒ.t          |t          j        ¦  «        rt          |j
        ¦  «        }d}n|f}d}||vr,d„ t          t          |¦  «        ¦  «        D ¦   «         |f||<   ns||         \  }	}
|
|k    r	 t          |	¦  «        t          |¦  «        k     rA|	                     t          ¦   «         ¦  «         t          |	¦  «        t          |¦  «        k     °At          |¦  «        D ],\  }}||         d         |                              |¦  «         Œ-�ŒE�ŒŸi }|                     ¦   «         D ]d\  }\  }	}t          d„ |	D ¦   «         ¦  «        }dd                     d	„ |D ¦   «         ¦  «        z   }|d         j        }||vri ||<   |||         |<   Œe|S )
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.
    ÚselfTFc                 ó*   — g | ]}t          ¦   «         ‘ŒS © )Úset)Ú.0r   s     r   ú
<listcomp>z2track_dynamism_across_examples.<locals>.<listcomp>Y   s   € Ð&HÐ&HÐ&H°¥s¡u¤uÐ&HÐ&HÐ&Hr   r   c              3   ó<   K  — | ]}t          |¦  «        d k    V — ŒdS )é   N)Úlen)r7   Úss     r   ú	<genexpr>z1track_dynamism_across_examples.<locals>.<genexpr>e   s,   è è € Ð7Ð7¨�#˜a™&œ& 1š*Ð7Ð7Ð7Ð7Ð7Ð7r   ÚLÚ c              3   ó6   K  — | ]}t          |¦  «        › V — Œd S )N)Ústr)r7   Úks     r   r=   z1track_dynamism_across_examples.<locals>.<genexpr>f   s*   è è € Ð>Ð>°¥3 q¡6¤6 Ð>Ð>Ð>Ð>Ð>Ð>r   )r   r   r   r   r   r   r    r!   r"   ÚtupleÚshapeÚranger;   Úappendr6   Ú	enumerateÚaddÚitemsÚjoinÚkey)r1   ÚtrackingÚexÚleaves_with_pathsr   Úkey_pathÚvaluerD   Ú	is_tensorÚdim_setsÚflagÚiÚdimÚoutputÚ
_is_tensorÚ	final_dynÚkey_strrK   s                     r   r	   r	   >   sL  € ð <>€Hàð 2ñ 2ˆØ�Rˆ<ˆ<�J r¨&¤zµ5´8´?ÑCÔCˆ<Ý.¨r°&¬zÑ:Ô:ˆBˆv‰JÝ5°bÑ9Ô9ÑÐ˜1Ø0ð 	2ñ 	2‰OˆH�eÝ˜e¥c­5µ%´,Ð%?Ñ@Ô@ð ØÝ˜%¥¤Ñ.Ô.ð "Ý16°u´{Ñ1CÔ1C�Ø �	�	à˜�Ø!�	Ø˜xÐ'Ð'Ø&HÐ&Hµe½CÀ¹J¼JÑ6GÔ6GÐ&HÑ&HÔ&HÈ)Ð%T�˜Ñ"Ð"à!)¨(Ô!3‘�˜$Ø˜9Ò$Ð$ØÝ˜(‘m”m¥c¨%¡j¤jÒ0Ð0Ø—O’O¥C¡E¤EÑ*Ô*Ð*õ ˜(‘m”m¥c¨%¡j¤jÒ0Ð0å# EÑ*Ô*ð 2ð 2‘��3Ø˜Ô" 1Ô% aÔ(×,Ò,¨SÑ1Ô1Ð1Ð1ñ2ñ#	2ð(  €FØ,4¯NªNÑ,<Ô,<ð )ð )Ñ(ˆÑ(�8˜ZÝÐ7Ð7¨hÐ7Ñ7Ô7Ñ7Ô7ˆ	Ø˜ŸšÐ>Ð>°XÐ>Ñ>Ô>Ñ>Ô>Ñ>ˆØ�qŒkŒoˆØ�fÐÐØˆF�3‰KØ(ˆˆsŒ�GÑÐØ€Mr   Úexample_inputc                 óF   — 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.
    rP   r   c                 óŠ   — t          | t          j        ¦  «        r(|                      ¦   «                              d¬¦  «        S | S )NÚmeta)Údevice)r   r   r"   ÚcloneÚto)rP   s    r   Útransform_fnz/clone_and_convert_to_meta.<locals>.transform_fnt   s:   € Ý�e�Uœ\Ñ*Ô*ð 	3Ø—;’;‘=”=×#Ò#¨6Ð#Ñ2Ô2Ð2Øˆr   )r   r   )rZ   ra   s     r   r
   r
   n   s6   € ð�Cð ¥Cð ð ð ð õ
 �L -Ñ0Ô0Ð0r   )r   Úcollections.abcr   Útypingr   r   Útorch.utils._pytreer   r   rC   ÚKeyPathr    r!   ÚNonTensorShapeFnÚ__all__rA   r   r   r   Údictr   Úlistr	   r
   r5   r   r   ú<module>rj      sE  ðØ 	€	€	€	Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à €€€Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @ð ��S�Œ/€Ø˜S 5™[˜M¨5°°c°¬?Ð:Ô;Ð ðð ð €ðB ð B¨ð Bð Bð Bð Bð
" %¤(¤/ð "°d¸3À¸8´nð "ð "ð "ð "ðJ-Ø˜”Ið-à	ˆ#ˆsˆ(„^ð-ð -ð -ð -ð`1¨Sð 1°Sð 1ð 1ð 1ð 1ð 1ð 1r   