§
    Ÿ²Åjw1  ã            	       óV  — d dl Z d dlmZmZmZmZ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ej        j        d	efd
„Zdej        j        dedefd„Z	 	 ddeej        j        ej        j        f         deeej        j        gef                  dedefd„ZdS )é    N)ÚCallableÚDictÚOptionalÚSetÚUnion)Ú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	ej        j                 de	e
         de
f
ˆ fd	„Zˆ fd
„Z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_attrsc                 óÈ   •— 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         €úQC:\Projects\Historical\venv\Lib\site-packages\torch/fx/experimental/const_fold.pyr   zFoldedGraphModule.__init__   sk   ø€ õ 	‰Œ×Ò˜˜uÑ%Ô%Ð%ð Ð%ð ˆDå”×%Ò% d¨NÑ;Ô;ð 	Ô"ð
 %*ˆÔ!Ø*DˆÔ'Ø'>ˆÔ$Ð$Ð$ó    c                 óf   •— | j         s|                      ¦   «           t          ¦   «         j        |Ž S ©N)r   Úrun_foldingr   Ú__call__)r   ÚargsÚkwargsr   s      €r   r#   zFoldedGraphModule.__call__-   s4   ø€ ØÔ(ð 	Ø×ÒÑÔÐØ�u‰wŒwÔ Ð&Ð&r   c                 ó>  ‡ ‡— ‰ j         �‰ j        €d S ‰ j        rJ ‚d‰ _        ‰                       ¦   «         }ˆ fd„Št          |t          ¦  «        r+t
          j                             ˆfd„|D ¦   «         ¦  «        n
 ‰|¦  «        }t          ‰ ‰ j        |¦  «         d S )NTc                 ó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)   )Úir   s    €r   Ú_create_paramz4FoldedGraphModule.run_folding.<locals>._create_paramC   sŒ   ø€ Ý”8×%Ò%å! !¥SÑ)Ô)ðO�—’‘
”
× Ò Ñ"Ô"Ð"å”\ 1 #Ñ&Ô&×)Ò)°Ô1MÐ)ÑNÔNÝ1;¸A½u¼|Ñ1LÔ1LÐW˜aœo˜oÐRWð	 &ñ ô ð r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS © r5   )Ú.0r2   r3   s     €r   ú
<listcomp>z1FoldedGraphModule.run_folding.<locals>.<listcomp>L   s#   ø€ Ð#KÐ#KÐ#K¸ M M°!Ñ$4Ô$4Ð#KÐ#KÐ#Kr   )	r   r   r   r,   Útupler   r*   ÚParameterListÚsetattr)r   Úfolded_attrsÚparamsr3   s   `  @r   r"   zFoldedGraphModule.run_folding2   sÍ   øø€ ð Ô&Ð.ØÔ.Ð6àˆFàÔ,Ð,Ð,Ð,Ø$(ˆÔ!ð
 ×1Ò1Ñ3Ô3ˆð	ð 	ð 	ð 	ð 	õ ˜,­Ñ.Ô.ð-�EŒH×"Ò"Ð#KÐ#KÐ#KÐ#K¸lÐ#KÑ#KÔ#KÑLÔLÐLà�˜|Ñ,Ô,ð 	õ
 	��dÔ5°vÑ>Ô>Ð>Ð>Ð>r   )NNr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r*   ÚModuler   ÚGraphr   Ústrr   r#   r"   Ú__classcell__)r   s   @r   r
   r
      sÄ   ø€ € € € € ðð ð 48Ø48Ø'-ð?ð ?àŒhŒoð?ð ŒxŒ~ð?ð ! ¤¤Ô0ð	?ð
 %-¨S¤Mð?ð "%ð?ð ?ð ?ð ?ð ?ð ?ð$'ð 'ð 'ð 'ð 'ð
?ð ?ð ?ð ?ð ?ð ?ð ?r   r
   ÚgmÚinline_mod_namec                 óø  ‡— t          |                      ¦   «         ¦  «        |         }t          |t          j        j        ¦  «        sJ ‚d}| j        j        D ]}|j        dk    r|j	        |k    r|} nŒ|€J ‚|j
        }|j        }i Šd}ˆfd„}|j        j        D ]Ä}	|	j        dk    r'|	j        |v r||	j                 n||         ‰|	<   |dz  }Œ4|	j        dk    r3|	j
        d         }
t          |
|¦  «        }|                     |¦  «         Œr| j                             |¦  «        5  | j                             |	|¦  «        }ddd¦  «         n# 1 swxY w Y   |‰|	<   ŒÅ| j                             ¦   «          dS )z´
    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`.
    NÚcall_moduler   c                 óT   •— ‰|          }| j                              ¦   «         |_         |S r!   )ÚmetaÚcopy)ÚnodeÚnew_nodeÚreplacement_mappings     €r   Úreplacement_fnz&_inline_module.<locals>.replacement_fnj   s%   ø€ Ø& tÔ,ˆØœ	ŸšÑ(Ô(ˆŒØˆr   Úplaceholderé   Úoutput)ÚdictÚnamed_modulesr,   r   r   r   r   ÚnodesÚopÚtargetr$   r%   Únamer   Úreplace_all_uses_withÚinserting_beforeÚ	node_copyÚeliminate_dead_code)rE   rF   Ú
inline_modÚcall_mod_node_to_replacerL   Úcall_mod_argsÚcall_mod_kwargsÚph_countrO   Úinline_nodeÚoutputsÚoutput_replacementsrM   rN   s                @r   Ú_inline_modulere   S   s   ø€ õ �b×&Ò&Ñ(Ô(Ñ)Ô)¨/Ô:€JÝ�j¥%¤(Ô"6Ñ7Ô7Ð7Ð7Ð7Ø#ÐØ””ð ð ˆØŒ7�mÒ#Ð#¨¬°Ò(FÐ(FØ'+Ð$ØˆEøØ#Ð/Ð/Ð/ð -Ô1€MØ.Ô5€Oà>@ÐØ€Hðð ð ð ð ð
 "Ô'Ô-ð 4ð 4ˆØŒ>˜]Ò*Ð*ð Ô# Ð6Ð6ð   Ô 0Ô1Ð1à" 8Ô,ð   Ñ,ð ˜‰MˆHØàŒ>˜XÒ%Ð%Ø!Ô& qÔ)ˆGÝ")¨'°>Ñ"BÔ"BÐØ$×:Ò:Ð;NÑOÔOÐOØàŒ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× Ò Ñ"Ô"Ð"Ð"Ð"s   Ä(EÅE	ÅE	Ú
mod_tracedrX   Úreturnc                 ó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Ú_1rQ   é   )ÚreÚsubÚisdigitÚhasattrÚmatchÚgroupr-   )rf   rX   rp   Ú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           	      ó<	  ‡‡— t          | t          j        j        ¦  «        s t          j                             | ¦  «        }n| }t          ¦   «         Šd}|j        j        D ]„Š‰j        dv rŒ‰j        dk    r(t          ‰j	        ¦  «         
                    ‰¦  «        sŒ?|r |‰¦  «        rŒM‰                     ¦   «         rŒb‰                     ‰¦  «         ‰j        dk    rd}Œ…|st          ||j        ¦  «        S dt          j        j        fˆfd„}t          || |¦  «        }d\  }}|j        t#          ||d¦  «        }
}	|
r|
j        j        ng D ]6Š‰j        d	k    r)t%          |‰j        t#          |
‰j        ¦  «        ¦  «         Œ7|	j        j        D ]6Š‰j        d	k    r)t%          |‰j        t#          |	‰j        ¦  «        ¦  «         Œ7d}|j        j        D ]!Š‰j        d	k    r‰j        |k    r	‰j        } nŒ"|€J ‚t          j                             ||	j        ¦  «        }|j        j        D �]Š‰j        d
k    r!t          ‰j        d         t*          ¦  «        }Œ/‰j        dk    rŒ;t-          ˆfd„|D ¦   «         ¦  «        }|j        dk    sJ ‚|j                             ‰¦  «        5  |j                             |j        ¦  «        }ddd¦  «         n# 1 swxY w Y   ‰j                             ¦   «         |_        ‰                     |¦  «         |j                             ‰¦  «         �Œdt;          ¦   «         v sJ ‚t=          |d¦  «        }t%          |||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ŒštE          ||¦  «        rtG          ||¦  «         |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.
    F>   rR   rP   Úget_attrTrL   c                 ó   •— | ‰v rdndS )Nr   rQ   r5   )rL   Úconst_nodess    €r   Úmod_partitionz,split_const_subgraphs.<locals>.mod_partitionÐ   s   ø€ Ø˜KÐ'Ð'ˆqˆq¨QÐ.r   )Úsubmod_0Úsubmod_1NrH   rR   r   rP   c              3   ó<   •K  — | ]}|j         ‰j        k    ¯|V — Œd S r!   )rX   rW   )r6   ÚnrL   s     €r   ú	<genexpr>z(split_const_subgraphs.<locals>.<genexpr>  s1   øè è € ÐNÐN˜Q¸¼À$Ä+Ò8MÐ8M�qÐ8MÐ8MÐ8MÐ8MÐNÐNr   Úmultiple_outputsÚ_FX_CONST_FOLDED_ATTRS)%r,   r   r   r   Úsymbolic_traceÚsetr   rU   rV   Úall_input_nodesÚissubsetÚ	is_impureÚaddr
   ÚNoder	   r|   Úgetattrr:   rW   r$   r8   ÚnextrZ   rx   rJ   rK   rY   Ú
erase_nodeÚlocalsr   r*   r9   r+   ro   re   r\   )ru   rv   r   rf   Úfound_const_foldingr{   ÚsplitÚconst_mod_nameÚnon_const_mod_nameÚconst_gmÚnon_const_gmÚcall_const_gm_argsÚroot_const_gmr�   Úin_noderM   r   r;   rz   rL   s                     @@r   r   r   ›   sœ  øø€ õ �f�eœhÔ2Ñ3Ô3ð Ý”X×,Ò,¨VÑ4Ô4ˆ
ˆ
àˆ
õ '*¡e¤e€KØÐØÔ Ô&ð 'ð 'ˆð Œ7Ð/Ð/Ð/Øð Œ7�jÒ Ð ­¨TÔ-AÑ)BÔ)B×)KÒ)KØñ*
ô *
Ð ð ð  ð 	Ð$8Ð$8¸Ñ$>Ô$>ð 	Øð �>Š>ÑÔð 	Øð 	�Š˜ÑÔÐØŒ7�jÒ Ð Ø"&Ðøð ð ?Ý  ¨ZÔ-=Ñ>Ô>Ð>ð/�EœHœMð /ð /ð /ð /ð /ð /õ ˜ V¨]Ñ;Ô;€Eà)?Ñ&€NÐ&à"œ^­W°UÐ<NÐPTÑ-UÔ-Uˆl€Hð
 -9Ð@�Ô"Ô(Ð(¸bð Lð LˆØŒ7�mÒ#Ð#Ý�E˜4œ;­°¸d¼kÑ(JÔ(JÑKÔKÐKøØ”Ô$ð Hð HˆØŒ7�mÒ#Ð#Ý�E˜4œ;­°¸$¼+Ñ(FÔ(FÑGÔGÐGøð ÐØ”Ô!ð ð ˆØŒ7�mÒ#Ð#ØŒ{˜nÒ,Ð,Ø%)¤YÐ"Ø�øØÐ)Ð)Ð)õ ”H×(Ò(¨°´Ñ?Ô?€MØÔ#Ô)ð -ñ -ˆØŒ7�hÒÐÝ)¨$¬)°A¬,½Ñ>Ô>ÐØØŒ7�mÒ#Ð#ØÝÐNÐNÐNÐNÐ"4ÐNÑNÔNÑNÔNˆØŒz˜ZÒ'Ð'Ð'Ð'ØÔ ×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$   Ê- KËK	Ë K	Ï PÐP	ÐP	)Nrt   )rl   Útypingr   r   r   r   r   Útorch.fxr   Útorch.fx.noder   Útorch.fx.passes.split_moduler	   Ú__all__r   r   r
   rC   re   r   r*   rA   r‰   Úboolr   r5   r   r   ú<module>r�      s�  ðà 	€	€	€	Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð €ð??ð ??ð ??ð ??ð ??˜œÔ,ñ ??ô ??ð ??ðD1#�u”xÔ+ð 1#¸cð 1#ð 1#ð 1#ð 1#ðh¨u¬xÔ/Cð È3ð ÐSVð ð ð ð ð, GKØ#(ðUð UØ�%”(”/ 5¤8Ô#7Ð7Ô8ðUà" 8¨U¬X¬]¨O¸TÐ,AÔ#BÔCðUð !ðUð ð	Uð Uð Uð Uð Uð Ur   