§
    ŠŠtj7A  ã                   ó†  — d dl Z d dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
 g d¢Z G d„ dej        j        ¦  «        Z	 dd
ej        j        dededeej        j        ej        j        f         fd„Zdej        j        dedefd„Z	 	 ddej        j        ej        j        z  deej        j        gef         dz  dedefd„ZdS )é    N)ÚCallable)ÚAny)Úmap_arg)Úsplit_module)ÚFoldedGraphModuleÚget_unique_attr_name_in_moduleÚsplit_const_subgraphsc                   ó¬   ‡ — e Zd ZdZ	 	 	 ddej        j        dej        j        dej        j        dz  de	dz  de	d	dfˆ fd
„Z
deded	efˆ fd„Zdd„Zˆ xZS )r   a�  
    FoldedGraphModule is a GraphModule which also contains another
    `const_subgraph_module` representing a subgraph which has all const attr
    inputs and which can be run once before running the main standard
    `graph`. The `const_output_names` are the ordered list names of attrs which
    represent what each respective output from the const_subgraph should be set
    on which attrs.
    NÚcudaÚrootÚgraphÚconst_subgraphÚfx_const_folded_attrs_nameÚdevice_for_folded_attrsÚreturnc                 óÈ   •— t          ¦   «                              ||¦  «         |€d nt          j                             ||¦  «        | _        d| _        || _        || _        d S )NF)	ÚsuperÚ__init__ÚtorchÚfxÚGraphModuleÚconst_subgraph_moduleÚhas_folding_been_runr   r   )Úselfr   r   r   r   r   Ú	__class__s         €ú^/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/fx/experimental/const_fold.pyr   zFoldedGraphModule.__init__   sk   ø€ õ 	‰Œ×Ò˜˜uÑ%Ô%Ð%ð Ð%ð ˆDå”×%Ò% d¨NÑ;Ô;ð 	Ô"ð
 %*ˆÔ!Ø*DˆÔ'Ø'>ˆÔ$Ð$Ð$ó    ÚargsÚkwargsc                 óf   •— | j         s|                      ¦   «           t          ¦   «         j        |Ž S ©N)r   Úrun_foldingr   Ú__call__)r   r   r   r   s      €r   r#   zFoldedGraphModule.__call__-   s4   ø€ ØÔ(ð 	Ø×ÒÑÔÐØ�u‰wŒwÔ Ð&Ð&r   c                 ó¤  ‡ ‡— ‰ j         �‰ j        €d S ‰ j        rt          d¦  «        ‚d‰ _        ‰                       ¦   «         }dt          j        t          z  dt          j        j        fˆ fd„Št          |t          ¦  «        r+t          j                             ˆfd„|D ¦   «         ¦  «        n
 ‰|¦  «        }t          ‰ ‰ j        |¦  «         d S )NzFolding has already been runTÚir   c                 óV  •— t           j                             t          | t          ¦  «        s&|                      ¦   «                              ¦   «         n-t          j        | g¦  «                             ‰j	        ¬¦  «        t          | t           j        ¦  «        r| j
        nd¬¦  «        S )N)ÚdeviceF)Úrequires_grad)r   ÚnnÚ	ParameterÚ
isinstanceÚintÚdetachÚcloneÚTensorÚtor   r(   )r%   r   s    €r   Ú_create_paramz4FoldedGraphModule.run_folding.<locals>._create_paramD   sŒ   ø€ Ý”8×%Ò%å! !¥SÑ)Ô)ðO�—’‘
”
× Ò Ñ"Ô"Ð"å”\ 1 #Ñ&Ô&×)Ò)°Ô1MÐ)ÑNÔNÝ1;¸A½u¼|Ñ1LÔ1LÐW˜aœo˜oÐRWð	 &ñ ô ð r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS © r3   )Ú.0r%   r1   s     €r   ú
<listcomp>z1FoldedGraphModule.run_folding.<locals>.<listcomp>M   s#   ø€ Ð#KÐ#KÐ#K¸ M M°!Ñ$4Ô$4Ð#KÐ#KÐ#Kr   )r   r   r   ÚAssertionErrorr   r/   r,   r)   r*   r+   ÚtupleÚParameterListÚsetattr)r   Úfolded_attrsÚparamsr1   s   `  @r   r"   zFoldedGraphModule.run_folding2   sø   øø€ ð Ô&Ð.ØÔ.Ð6àˆFàÔ$ð 	AÝ Ð!?Ñ@Ô@Ð@Ø$(ˆÔ!ð
 ×1Ò1Ñ3Ô3ˆð	�Uœ\­CÑ/ð 	µE´HÔ4Fð 	ð 	ð 	ð 	ð 	ð 	õ ˜,­Ñ.Ô.ð-�EŒH×"Ò"Ð#KÐ#KÐ#KÐ#K¸lÐ#KÑ#KÔ#KÑLÔLÐLà�˜|Ñ,Ô,ð 	õ
 	��dÔ5°vÑ>Ô>Ð>Ð>Ð>r   )NNr   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   ÚModuler   ÚGraphÚstrr   Úobjectr   r#   r"   Ú__classcell__)r   s   @r   r   r      sí   ø€ € € € € ðð ð 15Ø15Ø'-ð?ð ?àŒhŒoð?ð ŒxŒ~ð?ð œœ¨Ñ-ð	?ð
 %(¨$¡Jð?ð "%ð?ð 
ð?ð ?ð ?ð ?ð ?ð ?ð$'˜fð '°ð '¸3ð 'ð 'ð 'ð 'ð 'ð 'ð
?ð ?ð ?ð ?ð ?ð ?ð ?ð ?r   r   TÚgmÚinline_mod_nameÚrun_dcer   c                 óN  ‡‡— t          |                      ¦   «         ¦  «        |         }t          |t          j        j        ¦  «        st          dt          |¦  «        › �¦  «        ‚d}| j        j	        D ]}|j
        dk    r|j        |k    r|} nŒ|€t          d|› �¦  «        ‚|j        }|j        }i Šd}dt          j        j        dt          j        j        fˆfd„}	|j        j	        D �]�}
|
j
        d	k    r'|
j        |v r||
j                 n||         ‰|
<   |d
z  }Œ5|
j
        dk    rï|
j        d         }t!          ||	¦  «        }g }t          |t"          t$          f¦  «        rddlŠˆfd„|j        D ¦   «         }|                     |¦  «         |D ]ƒ}|j        d
         }t          |t,          ¦  «        st          dt          |¦  «        › �¦  «        ‚|                     ||         ¦  «         | j                             |¦  «         ||         ‰|<   Œ„�Œ/| j                             |¦  «        5  | j                             |
|	¦  «        }ddd¦  «         n# 1 swxY w Y   |‰|
<   �Œƒ| j                             |¦  «         |r| j                             ¦   «          ‰S )a  
    Given `gm` and some graph module which is called with target name `inline_mod_name`,
    this helper will inline all of the nodes from that called graph module into `gm`.

    Returns a mapping from subgraph nodes to the newly created/mapped nodes in gm.
    zExpected GraphModule, got NÚcall_modulez$Could not find call_module node for r   Únoder   c                 óT   •— ‰|          }| j                              ¦   «         |_         |S r!   )ÚmetaÚcopy)rJ   Únew_nodeÚreplacement_mappings     €r   Úreplacement_fnz&_inline_module.<locals>.replacement_fnq   s%   ø€ Ø& tÔ,ˆØœ	ŸšÑ(Ô(ˆŒØˆr   Úplaceholderé   Úoutputc                 ó†   •— g | ]=}|j         d k    r0|j        ‰j        u ¯t          |j        d         t
          ¦  «        ¯;|‘Œ>S )Úcall_functionrR   )ÚopÚtargetÚgetitemr+   r   r,   )r4   ÚuserÚoperators     €r   r5   z"_inline_module.<locals>.<listcomp>‹   sZ   ø€ ð !ð !ð !àØ”w /Ò1Ð1Øœ xÔ'7Ð7Ð7Ý" 4¤9¨Q¤<µÑ5Ô5ð 8ð ð 8Ð7Ð7r   zExpected int index, got )ÚdictÚnamed_modulesr+   r   r   r   r6   Útyper   ÚnodesrV   rW   r   r   ÚNodeÚnamer   Úlistr7   rZ   ÚusersÚreplace_all_uses_withr,   Ú
erase_nodeÚinserting_beforeÚ	node_copyÚeliminate_dead_code)rE   rF   rG   Ú
inline_modÚcall_mod_node_to_replacerJ   Úcall_mod_argsÚcall_mod_kwargsÚph_countrP   Úinline_nodeÚoutputsÚoutput_replacementsÚgetitem_usersrY   ÚidxrN   rZ   rO   s                    @@r   Ú_inline_modulerr   T   so  øø€ õ �b×&Ò&Ñ(Ô(Ñ)Ô)¨/Ô:€JÝ�j¥%¤(Ô"6Ñ7Ô7ð NÝÐL½$¸zÑ:JÔ:JÐLÐLÑMÔMÐMØ#ÐØ””ð ð ˆØŒ7�mÒ#Ð#¨¬°Ò(FÐ(FØ'+Ð$ØˆEøØÐ'ÝÐUÀOÐUÐUÑVÔVÐVð -Ô1€MØ.Ô5€Oà>@ÐØ€Hð�UœXœ]ð ­u¬x¬}ð ð ð ð ð ð ð
 "Ô'Ô-ð ,4ñ ,4ˆØŒ>˜]Ò*Ð*ð Ô# Ð6Ð6ð   Ô 0Ô1Ð1à" 8Ô,ð   Ñ,ð ˜‰MˆHØàŒ>˜XÒ%Ð%Ø!Ô& qÔ)ˆGÝ")¨'°>Ñ"BÔ"BÐð 24ˆMÝÐ-µµe¨}Ñ=Ô=ð 	Ø���ð!ð !ð !ð !à 8Ô >ð!ñ !ô !�ð %×:Ò:Ð;NÑOÔOÐOð &ð Eð E�Ø”i ”l�Ý! #¥sÑ+Ô+ð QÝ(Ð)OÅDÈÁIÄIÐ)OÐ)OÑPÔPÐPØ×*Ò*Ð+>¸sÔ+CÑDÔDÐDØ”×#Ò# DÑ)Ô)Ð)Ø,?ÀÔ,DÐ# DÑ)Ð)áàŒX×&Ò&Ð'?Ñ@Ô@ð 	Gð 	GØ”x×)Ò)¨+°~ÑFÔFˆHð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gà+3Ð˜KÑ(Ñ(ð
 „H×ÒÐ0Ñ1Ô1Ð1Øð 'Ø
Œ×$Ò$Ñ&Ô&Ð&àÐs   È6IÉI"	É%I"	Ú
mod_tracedr`   c                 óJ  — t          j        dd|¦  «        }|d                              ¦   «         rd|› �}t          | |¦  «        r]t          j        d|¦  «        }|€|dz   }n0|                     dd¦  «        \  }}|› dt          |¦  «        dz   › �}t          | |¦  «        °]|S )	zP
    Make sure the name is unique (in a module) and can represents an attr.
    z[^0-9a-zA-Z_]+Ú_r   z(.*)_(\d+)$NÚ_1rR   é   )ÚreÚsubÚisdigitÚhasattrÚmatchÚgroupr,   )rs   r`   r|   ÚbaseÚnums        r   r   r   ®   s»   € õ
 Œ6Ð" C¨Ñ.Ô.€DØˆA„w‡‚ÑÔð Ø�4ˆzˆzˆå
�*˜dÑ
#Ô
#ð ,Ý”˜¨Ñ.Ô.ˆØˆ=Ø˜$‘;ˆDˆDàŸš A qÑ)Ô)‰IˆD�#ØÐ+Ð+�S ™XœX¨™\Ð+Ð+ˆDõ �*˜dÑ
#Ô
#ð ,ð €Kr   ÚcpuÚmoduleÚskip_folding_node_fnr   c           	      ód  ‡‡— ddl }t          | t          j        j        ¦  «        s t          j                             | ¦  «        }n| }dt          j        j        dt          fˆfd„Št          ¦   «         Šd}|j        j	        D �]}|j
        dv rŒ|j
        dk    r(t          |j        ¦  «                             ‰¦  «        sŒ@|r ||¦  «        rŒN|                     ¦   «         rŒct          |j                             d	d¦  «        |j        ¦  «        rŒ’|j
        d
k    rG|                     |j        ¦  «        x}r+t          |t          j        j        ¦  «        r ‰|¦  «        rŒä‰                     |¦  «         |j
        dk    rd}�Œ|st)          ||j        ¦  «        S dt          j        j        dt,          fˆfd„}t/          || |¦  «        }	d\  }
}t1          |	|
¦  «        }t          |t          j        j        ¦  «        s"t3          d|
› dt5          |¦  «        › �¦  «        ‚t1          |	|d¦  «        }d}|�Ct          |t          j        j        ¦  «        s"t3          d|› dt5          |¦  «        › �¦  «        ‚|}|�C|j        j	        D ]6}|j
        d
k    r)t7          |	|j        t1          ||j        ¦  «        ¦  «         Œ7|j        j	        D ]6}|j
        d
k    r)t7          |	|j        t1          ||j        ¦  «        ¦  «         Œ7d}|	j        j	        D ]!}|j
        d
k    r|j        |
k    r	|j        } nŒ"|€t3          d¦  «        ‚t          j                             |	|j        ¦  «        }d}|j        j	        D �]>}|j
        dk    r!t          |j        d         t:          ¦  «        }Œ/|j
        dk    rŒ;|t=          |¦  «        k    r#t3          d|› dt=          |¦  «        › d�¦  «        ‚||         }|dz  }|j
        dk    rt3          d|j
        › �¦  «        ‚|j                             |¦  «        5  |j                              |j        ¦  «        }ddd¦  «         n# 1 swxY w Y   |j!         "                    ¦   «         |_!        | #                    |¦  «         |j         $                    |¦  «         �Œ@dtK          ¦   «         vrt3          d¦  «        ‚tM          |d¦  «        }t7          |	||rt          j'         (                    ¦   «         nt          j'         )                    ¦   «         ¦  «         |	j        j	        D ]™}|j
        d
k    rŒ|j        |
k    r�|j                             |¦  «        5  |j                              |¦  «        }ddd¦  «         n# 1 swxY w Y   |j!         "                    ¦   «         |_!        | #                    |¦  «          nŒštU          |	|¦  «        rtW          |	|¦  «         |	j         ,                    ¦   «          t)          |	|	j        |j        ||¦  «        S )aJ  
    Looks through `module` for any nodes that have all constant attribute inputs
    and separates them out into their own constant subgraph, and returns a
    FoldedGraphModule which runs that constant subgraph on the first run to set
    attributes on the module prior to running the non-constant portion of the
    graph.
    r   Nr�   r   c                 ól  •— t          | t          j        j        ¦  «        st	          d¦  «        ‚| j        j        D ]w}|j        dk    r|                     ¦   «         r dS |j        dk    rH|  	                    |j
        ¦  «        x}r,t          |t          j        j        ¦  «        r ‰|¦  «        c S ŒxdS )z`
        Return True if a GraphModule type subgraph contains any impure op, else False.
        zDcaller should only pass GraphModule to subgraph_has_impure_ops checkrU   TrI   F)r+   r   r   r   r6   r   r^   rV   Ú	is_impureÚget_submodulerW   )r�   rJ   Ú	submoduleÚ_subgraph_has_impure_opss      €r   rˆ   z7split_const_subgraphs.<locals>._subgraph_has_impure_opsÖ   sÌ   ø€ õ ˜&¥%¤(Ô"6Ñ7Ô7ð 	Ý ØVñô ð ð ”LÔ&ð 		;ð 		;ˆDØŒw˜/Ò)Ð)¨d¯nªnÑ.>Ô.>Ð)Ø�t�tà”˜=Ò(Ð(à"(×"6Ò"6°t´{Ñ"CÔ"CÐC�Yð )õ ˜y­%¬(Ô*>Ñ?Ô?ð )ð
 0Ð/°	Ñ:Ô:Ð:Ð:Ð:øØˆur   F>   rS   rQ   Úget_attrÚ
fill_valuerI   TrJ   c                 ó   •— | ‰v rdndS )Nr   rR   r3   )rJ   Úconst_nodess    €r   Úmod_partitionz,split_const_subgraphs.<locals>.mod_partition  s   ø€ Ø˜KÐ'Ð'ˆqˆq¨QÐ.r   )Úsubmod_0Úsubmod_1zExpected GraphModule for z, got z,Could not find call_module node for const_gmrS   rQ   zPlaceholder index z out of range for args (len=ú)rR   zExpected get_attr, got Úmultiple_outputsz multiple_outputs not set in loopÚ_FX_CONST_FOLDED_ATTRS)-Úsympyr+   r   r   r   Úsymbolic_traceÚboolÚsetr   r^   rV   Úall_input_nodesÚissubsetr…   r   ÚgetÚExprr†   rW   Úaddr   r_   r,   r   Úgetattrr6   r]   r9   r   r7   Úlenre   r‰   rL   rM   rc   rd   Úlocalsr   r)   r8   r*   r{   rr   rg   )r�   r‚   r   r“   rs   Úfound_const_foldingrJ   Ú
target_modr�   ÚsplitÚconst_mod_nameÚnon_const_mod_nameÚconst_gmÚnon_const_modÚnon_const_gmÚcall_const_gm_argsÚroot_const_gmÚph_idxr‘   Úin_noderN   r   r:   rˆ   rŒ   s                          @@r   r	   r	   Â   st  øø€ ð €L€L€Lå�f�eœhÔ2Ñ3Ô3ð Ý”X×,Ò,¨VÑ4Ô4ˆ
ˆ
àˆ
ð­¬Ô)=ð Å$ð ð ð ð ð ð õ, '*¡e¤e€KØÐØÔ Ô&ð &'ñ &'ˆð Œ7Ð/Ð/Ð/Øð Œ7�jÒ Ð ­¨TÔ-AÑ)BÔ)B×)KÒ)KØñ*
ô *
Ð ð ð  ð 	Ð$8Ð$8¸Ñ$>Ô$>ð 	Øð �>Š>ÑÔð 	Øõ �d”k—o’o l°DÑ9Ô9¸5¼:ÑFÔFð 	Øð ŒG�}Ò$Ð$à)×7Ò7¸¼ÑDÔDÐD�ð %õ ˜:¥u¤xÔ';Ñ<Ô<ð %ð )Ð(¨Ñ4Ô4ð	 %ð ð 	�Š˜ÑÔÐØŒ7�jÒ Ð Ø"&Ðùð ð ?Ý  ¨ZÔ-=Ñ>Ô>Ð>ð/�EœHœMð /­cð /ð /ð /ð /ð /ð /õ ˜ V¨]Ñ;Ô;€Eà)?Ñ&€NÐ&å�u˜nÑ-Ô-€HÝ�h¥¤Ô 4Ñ5Ô5ð 
ÝØN¨ÐNÐN½dÀ8¹n¼nÐNÐNñ
ô 
ð 	
õ ˜EÐ#5°tÑ<Ô<€MØ04€LØÐ Ý˜-­¬Ô)=Ñ>Ô>ð 	Ý Ø[Ð,>Ð[Ð[ÅdÈ=ÑFYÔFYÐ[Ð[ñô ð ð %ˆð
 ÐØ Ô&Ô,ð 	Pð 	PˆDØŒw˜-Ò'Ð'Ý˜˜tœ{­G°LÀ$Ä+Ñ,NÔ,NÑOÔOÐOøØ”Ô$ð Hð HˆØŒ7�mÒ#Ð#Ý�E˜4œ;­°¸$¼+Ñ(FÔ(FÑGÔGÐGøð ÐØ”Ô!ð ð ˆØŒ7�mÒ#Ð#ØŒ{˜nÒ,Ð,Ø%)¤YÐ"Ø�øØÐ!ÝÐKÑLÔLÐLõ ”H×(Ò(¨°´Ñ?Ô?€Mð
 €FØÔ#Ô)ð -ñ -ˆØŒ7�hÒÐÝ)¨$¬)°A¬,½Ñ>Ô>ÐØØŒ7�mÒ#Ð#ØØ•SÐ+Ñ,Ô,Ò,Ð,Ý ð3 Vð 3ð 3ÝÐ.Ñ/Ô/ð3ð 3ð 3ñô ð ð % VÔ,ˆØ�!‰ˆØŒ:˜Ò#Ð#Ý Ð!G¸7¼:Ð!GÐ!GÑHÔHÐHØÔ ×1Ò1°$Ñ7Ô7ð 	Dð 	DØ$Ô*×3Ò3°G´NÑCÔCˆHð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dàœ	ŸšÑ(Ô(ˆŒØ×"Ò" 8Ñ,Ô,Ð,ØÔ×&Ò& tÑ,Ô,Ð,Ñ,Ø¥¡¤Ð)Ð)ÝÐ?Ñ@Ô@Ð@õ "@ØÐ,ñ"ô "Ðõ ØØ"Ø$4ÐN�Œ×ÒÑ Ô Ð ½%¼(×:LÒ:LÑ:NÔ:Nñô ð ð
 ”Ô!ð ð ˆØŒ7�mÒ#Ð#¨¬°~Ò(EÐ(EØ”×,Ò,¨TÑ2Ô2ð Oð OØ#œz×2Ò2Ð3MÑNÔN�ðOð Oð Oñ Oô Oð Oð Oð Oð Oð Oð Oøøøð Oð Oð Oð Oà $¤	§¢Ñ 0Ô 0ˆLÔØ×&Ò& |Ñ4Ô4Ð4ØˆEøõ
 ˆuÐ(Ñ)Ô)ð 2Ý�uÐ0Ñ1Ô1Ð1à	„K×#Ò#Ñ%Ô%Ð%åØØŒØÔØ"Øñô ð s$   Ð4 Q Ñ Q$	Ñ'Q$	Õ4VÖV	Ö"V	)T)Nr€   )rx   Úcollections.abcr   Útypingr   Útorch.fxr   Útorch.fx.noder   Útorch.fx.passes.split_moduler   Ú__all__r   r   r   rB   r•   r[   r_   rr   r   r)   r@   r	   r3   r   r   ú<module>r±      s·  ðØ 	€	€	€	Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð €ð@?ð @?ð @?ð @?ð @?˜œÔ,ñ @?ô @?ð @?ðH EIðWð WØŒÔðWØ/2ðWØ=AðWà	ˆ%Œ(Œ-˜œœÐ
&Ô'ðWð Wð Wð Wðt¨u¬xÔ/Cð È3ð ÐSVð ð ð ð ð, DHØ#(ðUð UØŒHŒO˜eœhÔ2Ñ2ðUà" E¤H¤M ?°DÐ#8Ô9¸DÑ@ðUð !ðUð ð	Uð Uð Uð Uð Uð Ur   