§
    ŠŠtj­  ã                   óÂ   — d dl Z d dlmZ d dl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)ÚCallable)ÚAny)Ú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dd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
df         dz  deee
f         dz  defˆ fd„Zd
edeedf         deee
f         de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_kwargsÚreturnNc                 óf   •— t          ¦   «                              |¦  «         i | _        || _        d S ©N)ÚsuperÚ__init__Únode_mapr   )Úselfr   r   Ú	__class__s      €ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/fx/experimental/normalize.pyr   zNormalizeArgs.__init__%   s2   ø€ õ 	‰Œ×Ò˜Ñ Ô Ð Ø+-ˆŒØ,HˆÔ)Ð)Ð)ó    Únc                 ól  •‡‡— |                       ‰¦  «        \  }}dt          dt          fˆfd„Št          ‰j        ‰¦  «        }t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t          d„ |D ¦   «         ¦  «        }ˆfd„| 	                    ¦   «         D ¦   «         }‰j
        dk    r|                      ‰j        ||||¦  «        }n!t          ¦   «                              ‰¦  «        }‰j
        dk    r,‰| j        |<   ‰j        |j        _        ‰j        |j        _        |S )	NÚargr   c                 óŠ   •— t          | t          j        ¦  «        r‰j                             d¦  «        S t          | ¦  «        S )NÚtype)Ú
isinstanceÚfxr	   ÚmetaÚgetr"   )r    r   s    €r   Úget_typez(NormalizeArgs.run_node.<locals>.get_type/   s7   ø€ Ý˜#�rœwÑ'Ô'ð *Ø”v—z’z &Ñ)Ô)Ð)Ý˜‘9”9Ðr   zExpected tuple, got c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   )r   )Ú.0Úis     r   ú	<genexpr>z)NormalizeArgs.run_node.<locals>.<genexpr>7   s+   è è € ÐAÐA°!Õ*¨1Ñ-Ô-ÐAÐAÐAÐAÐAÐAr   c                 ó.   •— i | ]\  }}| ‰|¦  «        “ŒS © r-   )r)   ÚkÚvr'   s      €r   ú
<dictcomp>z*NormalizeArgs.run_node.<locals>.<dictcomp>8   s'   ø€ ÐAÐAÐA©$¨!¨Q�q˜(˜( 1™+œ+ÐAÐAÐAr   Úcall_functionÚoutput)Úfetch_args_kwargs_from_envÚobjectr   r   Úargsr#   ÚtupleÚAssertionErrorr"   ÚitemsÚopr1   Útargetr   Úrun_noder   r%   Únode)	r   r   r5   ÚkwargsÚ	arg_typesÚkwarg_typesÚoutr'   r   s	    `     @€r   r;   zNormalizeArgs.run_node,   s?  øøø€ Ø×6Ò6°qÑ9Ô9‰ˆˆfð	�&ð 	¥Sð 	ð 	ð 	ð 	ð 	ð 	õ
 " !¤&¨(Ñ3Ô3ˆ	Ý˜)¥UÑ+Ô+ð 	KÝ Ð!I½¸Y¹¼Ð!IÐ!IÑJÔJÐJÝÐAÐA°yÐAÑAÔAÑAÔAˆ	Ø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   r:   r5   .r=   r>   r?   c                 ó   •— t          |¦  «        st          dt          |¦  «        › �¦  «        ‚t          |||||| j        ¦  «        }|r"|\  }}| j                             d|||¦  «        S t          ¦   «                              |||¦  «        S )NúExpected callable target, got r1   )	Úcallabler7   r"   r   r   ÚtracerÚcreate_proxyr   r1   )
r   r:   r5   r=   r>   r?   Únew_args_and_kwargsÚnew_argsÚ
new_kwargsr   s
            €r   r1   zNormalizeArgs.call_functionC   s­   ø€ õ ˜ÑÔð 	RÝ Ð!PÅ$ÀvÁ,Ä,Ð!PÐ!PÑQÔQÐQÝ0ØØØØØØÔ-ñ
ô 
Ðð ð 	?Ø#6Ñ ˆH�jØ”;×+Ò+Ø ¨°:ñô ð õ ‘7”7×(Ò(¨°°vÑ>Ô>Ð>r   c                 ó@  •— t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t	          | j        |||| j        ¦  «        }|r(|\  }}t          ¦   «                              |||¦  «        S t          ¦   «                              |||¦  «        S )NzExpected str target, got )	r#   Ústrr7   r"   r   r   r   r   Úcall_module)r   r:   r5   r=   rF   rG   rH   r   s          €r   rK   zNormalizeArgs.call_module]   s¥   ø€ õ ˜&¥#Ñ&Ô&ð 	MÝ Ð!K½TÀ&¹\¼\Ð!KÐ!KÑLÔLÐLÝ.ØŒ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
   r6   r   ÚdictrJ   r   r1   rK   Ú__classcell__©r   s   @r   r   r      s…  ø€ € € € € ðð ð$ RVðIð IØ”hÔ*ðIØJNðIà	ðIð Ið Ið Ið Ið Ið˜$ð  3ð ð ð ð ð ð ð8 -1Ø-1ð?ð ?àð?ð �H˜c�MÔ"ð?ð �S˜#�X”ð	?ð
 ˜˜c˜”? TÑ)ð?ð ˜#˜s˜(”^ dÑ*ð?ð 
ð?ð ?ð ?ð ?ð ?ð ?ð4=Øð=Ø$)¨(°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         de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:   r5   .r=   r   c                 ó�  •— t          |¦  «        st          dt          |¦  «        › �¦  «        ‚|| j        v rlt	          |¦  «        dk    r#t          ¦   «                              |||¦  «        S |\  }}t          ¦   «                              | j        |         ||fi ¬¦  «        S t          ¦   «                              |||¦  «        S )NrB   é   )r:   r5   r=   )rC   r7   r"   rX   Úlenr   r1   )r   r:   r5   r=   ÚlhsÚrhsr   s         €r   r1   z NormalizeOperators.call_function“   sÉ   ø€ õ ˜ÑÔð 	RÝ Ð!PÅ$ÀvÁ,Ä,Ð!PÐ!PÑQÔQÐQà�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   )!rL   rM   rN   rO   rP   ÚaddÚoperatorÚmulÚsubÚdivÚtruedivÚfloor_divideÚfloordivÚ	remainderÚmodÚeqÚneÚltÚleÚgtÚgerX   rS   r   r   Ú__annotations__r
   r6   r   rJ   r   r1   rT   rU   s   @r   rW   rW   p   s-  ø€ € € € € € ðð ð( 	Œ	�8”<ØŒ	�8”<ØŒ	�8”<ØŒ	�8Ô#ØÔ˜HÔ-ØŒ˜œØŒ�(”+ØŒ�(”+ØŒ�(”+ØŒ�(”+ØŒ�(”+ØŒ�(”+ð	ð ˜tØ�#�s�˜S�Ô! 8¨S°#¨J¸¨OÔ#<Ð<ô ð ð ñ ð";Øð;Ø$)¨(°C¨-Ô$8ð;ØBFÀsÈCÀxÄ.ð;à	ð;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r   rW   )r_   Úcollections.abcr   Útypingr   rP   Útorch.fxr$   r   r   Útorch.fx.noder   r   r	   r
   Útorch.fx.operator_schemasr   r   r   Úschema_type_annotationr   r   rW   r-   r   r   ú<module>ru      s@  ðØ €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;ðZ=ð Z=ð Z=ð Z=ð Z=�Kñ Z=ô Z=ð Z=ðz7;ð 7;ð 7;ð 7;ð 7;Ð0ñ 7;ô 7;ð 7;ð 7;ð 7;r   