§
    Ÿ²Åj$  ã                   óÆ   — d dl Z d dlmZmZmZmZmZ d dlZd dlZd dlm	Z	 d dlm
Z
mZ d dlmZmZmZmZ d dlmZmZmZ ddlmZ  G d„ d	e¦  «        Z G d
„ de¦  «        ZdS )é    N)ÚAnyÚCallableÚDictÚOptionalÚTuple)ÚProxyÚTransformer)ÚArgumentÚmap_aggregateÚNodeÚTarget)Úcreate_type_hintÚnormalize_functionÚnormalize_moduleé   )ÚAnnotateTypesWithSchemac                   ó  ‡ — e Zd ZdZ	 ddej        j        defˆ fd„Zde	de
fˆ fd„Z	 	 dd
edeedf         deee
f         deee
df                  deeee
f                  f
ˆ fd„Zd
edeedf         deee
f         fˆ fd„Zˆ xZS )ÚNormalizeArgsa‡  
    Normalize arguments to Python targets. This means that
    `args/kwargs` will be matched up to the module/functional's
    signature and rewritten to exclusively kwargs in positional order
    if `normalize_to_only_use_kwargs` is true. Also populates default
    values. Does not support positional-only parameters or varargs
    parameters (*args, **kwargs).

    If the nodes have 'type' metadata, it will use it to disambiguate
    overloads. Otherwise, it will throw an error.

    Example usage:
        m = torchvision.models.resnet18()
        traced = torch.fx.symbolic_trace(m)
        traced = NormalizeArgs(traced).transform()
    TÚmoduleÚnormalize_to_only_use_kwargsc                 óf   •— t          ¦   «                              |¦  «         i | _        || _        d S ©N)ÚsuperÚ__init__Únode_mapr   )Úselfr   r   Ú	__class__s      €úPC:\Projects\Historical\venv\Lib\site-packages\torch/fx/experimental/normalize.pyr   zNormalizeArgs.__init__%   s2   ø€ õ 	‰Œ×Ò˜Ñ Ô Ð Ø+-ˆŒØ,HˆÔ)Ð)Ð)ó    ÚnÚreturnc                 ó  •‡‡— |                       ‰¦  «        \  }}ˆfd„Št          ‰j        ‰¦  «        }t          |t          ¦  «        sJ ‚t	          d„ |D ¦   «         ¦  «        }ˆfd„|                     ¦   «         D ¦   «         }‰j        dk    r|                      ‰j        ||||¦  «        }n!t          ¦   «          
                    ‰¦  «        }‰j        dk    r,‰| j        |<   ‰j        |j        _        ‰j        |j        _        |S )Nc                 ó†   •— t          | t          j        ¦  «        rd‰j        v r‰j        d         nd S t	          | ¦  «        S )NÚtype)Ú
isinstanceÚfxr   Úmetar$   )Úargr    s    €r   Úget_typez(NormalizeArgs.run_node.<locals>.get_type/   s@   ø€ Ý˜#�rœwÑ'Ô'ð DØ)/°1´6Ð)9Ð)9�q”v˜f”~�~¸tÐCÝ˜‘9”9Ðr   c                 ó,   — g | ]}t          |¦  «        ‘ŒS © )r   )Ú.0Úis     r   ú
<listcomp>z*NormalizeArgs.run_node.<locals>.<listcomp>6   s!   € ÐBÐBÐB°1Õ+¨AÑ.Ô.ÐBÐBÐBr   c                 ó.   •— i | ]\  }}| ‰|¦  «        “ŒS r+   r+   )r,   ÚkÚvr)   s      €r   ú
<dictcomp>z*NormalizeArgs.run_node.<locals>.<dictcomp>7   s'   ø€ ÐAÐAÐA©$¨!¨Q�q˜(˜( 1™+œ+ÐAÐAÐAr   Úcall_functionÚoutput)Úfetch_args_kwargs_from_envr   Úargsr%   ÚtupleÚitemsÚopr3   Útargetr   Úrun_noder   r'   Únoder$   )	r   r    r6   ÚkwargsÚ	arg_typesÚkwarg_typesÚoutr)   r   s	    `     @€r   r;   zNormalizeArgs.run_node,   s  øøø€ Ø×6Ò6°qÑ9Ô9‰ˆˆfð	ð 	ð 	ð 	ð 	õ
 " !¤&¨(Ñ3Ô3ˆ	Ý˜)¥UÑ+Ô+Ð+Ð+Ð+ÝÐBÐB¸	ÐBÑBÔBÑCÔCˆ	ØAÐAÐAÐA°&·,²,±.´.ÐAÑAÔAˆØŒ4�?Ò"Ð"Ø×$Ò$ Q¤X¨t°V¸YÈÑTÔTˆCˆCå‘'”'×"Ò" 1Ñ%Ô%ˆCØŒ4�8ÒÐØ!"ˆDŒM˜#ÑØœFˆCŒHŒMØœFˆCŒHŒMØˆ
r   Nr:   r6   .r=   r>   r?   c                 óæ   •— t          |¦  «        sJ ‚t          |||||| j        ¦  «        }|r"|\  }}| j                             d|||¦  «        S t          ¦   «                              |||¦  «        S )Nr3   )Úcallabler   r   ÚtracerÚcreate_proxyr   r3   )
r   r:   r6   r=   r>   r?   Únew_args_and_kwargsÚnew_argsÚ
new_kwargsr   s
            €r   r3   zNormalizeArgs.call_functionB   s“   ø€ õ ˜ÑÔÐÐÐÝ0ØØØØØØÔ-ñ
ô 
Ðð ð 	?Ø#6Ñ ˆH�jØ”;×+Ò+Ø ¨°:ñô ð õ ‘7”7×(Ò(¨°°vÑ>Ô>Ð>r   c                 ó  •— t          |t          ¦  «        sJ ‚t          | j        |||| j        ¦  «        }|r(|\  }}t          ¦   «                              |||¦  «        S t          ¦   «                              |||¦  «        S r   )r%   Ústrr   r   r   r   Úcall_module)r   r:   r6   r=   rE   rF   rG   r   s          €r   rJ   zNormalizeArgs.call_module[   s‹   ø€ õ ˜&¥#Ñ&Ô&Ð&Ð&Ð&Ý.ØŒKØØØØÔ-ñ
ô 
Ðð ð 	=Ø#6Ñ ˆH�jÝ‘7”7×&Ò& v¨x¸ÑDÔDÐDå‘7”7×&Ò& v¨t°VÑ<Ô<Ð<r   )T)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Útorchr&   ÚGraphModuleÚboolr   r   r   r;   r   r   r
   r   rI   r   r3   rJ   Ú__classcell__©r   s   @r   r   r      sj  ø€ € € € € ðð ð$ RVðIð IØ”hÔ*ðIØJNðIð Ið Ið Ið Ið Ið˜$ð  3ð ð ð ð ð ð ð6 04Ø04ð?ð ?àð?ð �H˜c�MÔ"ð?ð �S˜#�X”ð	?ð
 ˜E # s (œOÔ,ð?ð ˜d 3¨ 8œnÔ-ð?ð ?ð ?ð ?ð ?ð ?ð2=Øð=Ø$)¨(°C¨-Ô$8ð=ØBFÀsÈCÀxÄ.ð=ð =ð =ð =ð =ð =ð =ð =ð =ð =r   r   c                   ó¸  ‡ — e Zd ZU dZej        ej        ej        ej        ej        ej        ej	        ej
        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        iZeeeegef         eeegef         f         ed<   dedeedf         deeef         fˆ fd„Zˆ xZS )ÚNormalizeOperatorsaÚ  
    Normalize callsites that are different ways of "spelling" the same
    invocation into a single, canonical call. Currently supports:

    1. Normalize operators (e.g. operator.add) to the `torch` ops they
       ultimately invoke (e.g. torch.add) when it is possible to statically
       reason that

    Example usage:

        m = torchvision.models.resnet18()

        traced = torch.fx.symbolic_trace(m)

        traced = NormalizeOperators(traced).transform()
    Úbinary_magic_method_remapr:   r6   .r=   c                 óV  •— t          |¦  «        sJ ‚|| j        v rlt          |¦  «        dk    r#t          ¦   «                              |||¦  «        S |\  }}t          ¦   «                              | j        |         ||fi ¬¦  «        S t          ¦   «                              |||¦  «        S )Né   )r:   r6   r=   )rB   rV   Úlenr   r3   )r   r:   r6   r=   ÚlhsÚrhsr   s         €r   r3   z NormalizeOperators.call_function�   s¯   ø€ õ ˜ÑÔÐÐÐà�TÔ3Ð3Ð3Ý�4‰yŒy˜AŠ~ˆ~Ý‘w”w×,Ò,¨V°T¸6ÑBÔBÐBØ‰HˆC�å‘7”7×(Ò(ØÔ5°fÔ=Ø˜3�ZØð )ñ ô ð õ ‰wŒw×$Ò$ V¨T°6Ñ:Ô:Ð:r   ) rK   rL   rM   rN   rO   ÚaddÚoperatorÚmulÚsubÚdivÚtruedivÚfloor_divideÚfloordivÚ	remainderÚmodÚeqÚneÚltÚleÚgtÚgerV   r   r   r   Ú__annotations__r   r   r
   rI   r3   rR   rS   s   @r   rU   rU   m   s%  ø€ € € € € € ðð ð( 	Œ	�8”<ØŒ	�8”<ØŒ	�8”<ØŒ	�8Ô#ØÔ˜HÔ-ØŒ˜œØŒ�(”+ØŒ�(”+ØŒ�(”+ØŒ�(”+ØŒ�(”+ØŒ�(”+ð	ð ˜tØ�#�s�˜S�Ô! 8¨S°#¨J¸¨OÔ#<Ð<ô ð ð ñ ð";Øð;Ø$)¨(°C¨-Ô$8ð;ØBFÀsÈCÀxÄ.ð;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r   rU   )r]   Útypingr   r   r   r   r   rO   Útorch.fxr&   r   r	   Útorch.fx.noder
   r   r   r   Útorch.fx.operator_schemasr   r   r   Úschema_type_annotationr   r   rU   r+   r   r   ú<module>rr      sF  ðà €€€Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;ðW=ð W=ð W=ð W=ð W=�Kñ W=ô W=ð W=ðt6;ð 6;ð 6;ð 6;ð 6;Ð0ñ 6;ô 6;ð 6;ð 6;ð 6;r   