§
    ŠŠtjéX  ã                   ó  — d dl Z d dlZd dlmZ d dlZd dlmc mc mc m	Z
 d dlmc mc m	Z d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ dd	lmZmZ ej        j	        Z G d
„ de j        ¦  «        Zdededede e!e"e         f         de#eef         f
d„Z$dedede e!e"e         f         de#ej%        e&z  ej%        e'z  f         dz  fd„Z(dededefd„Z)dedede'fd„Z*dede+e'         fd„Z,dedede!fd„Z-dede!defd„Z.deddfd„Z/d„ Z0e0dej%        dej%        dej%        fd„¦   «         Z1e0dej%        dej%        dej%        fd„¦   «         Z2e0dej%        dej%        dej%        fd „¦   «         Z3dede4fd!„Z5deded"e'defd#„Z6dS )$é    N)ÚCallable)ÚFakeQuantizeBaseÚObserverBase)Ú_is_activation_post_process)Úgetattr_from_fqn)ÚGraphModule)ÚNodeé   )ÚNSNodeTargetTypeÚNSResultsTypec                   ó¤   — e Zd Z ej        ¦   «         Z ej        ¦   «         Z ej        ¦   «         Z ej        ¦   «         Z ej        ¦   «         Z	dS )ÚNodeInputOrOutputTypeN)
Ú__name__Ú
__module__Ú__qualname__ÚenumÚautoÚFP32ÚINT8ÚFP16ÚUNKNOWNÚFP32_OR_INT8© ó    úR/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/ao/ns/fx/utils.pyr   r      sQ   € € € € € Øˆ4Œ9‰;Œ;€DØˆ4Œ9‰;Œ;€DØˆ4Œ9‰;Œ;€DØˆdŒi‰kŒk€Gð
 �4”9‘;”;€L€L€Lr   r   ÚnodeÚgmÚ
logger_clsÚnode_type_to_io_type_mapÚreturnc                 ó
	  ‡— |d         }|d         }|d         }|d         }|d         }|d         }	|d         }
|d         }| j         d	k    râ| j        |v rt          j        t          j        fS | j        |v rt          j        t          j        fS | j        |v rt          j        t          j        fS | j        |v r^t          | |d
¦  «        }t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t          ||||¦  «        \  }}||fS t          j        t          j        fS | j         dk    �r�| j         dk    rt          d| j         › d�¦  «        ‚t          | j        t          ¦  «        s$t          dt          | j        ¦  «        › �¦  «        ‚t          || j        ¦  «        Št          ˆfd„|
D ¦   «         ¦  «        }t          ‰|t           t"          f¦  «        s|r^t          | |d
¦  «        }t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t          ||||¦  «        \  }}||fS t          ˆfd„|D ¦   «         ¦  «        }t          ˆfd„|	D ¦   «         ¦  «        }|rt          j        t          j        fS |rt          j        t          j        fS t          j        t          j        fS | j         dk    �r–| j        dk    rht          | |d
¦  «        }t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t          ||||¦  «        \  }}|t          j        fS | j        dk    r™t          | |d
¦  «        }t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t          ||||¦  «        \  }}t          | |d¦  «        }|t$          j        urt          |› d�¦  «        ‚|t          j        fS | j        |v r^t          | |d
¦  «        }t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t          ||||¦  «        \  }}||fS t          j        t          j        fS t          j        t          j        fS )NÚfuns_io_type_fp32Úfuns_io_type_fp16Úfuns_io_type_int8Úfuns_io_type_fp32_or_int8Úmods_io_type_fp32Úmods_io_type_int8Úmods_io_type_fp32_or_int8Úmeths_io_type_fp32_or_int8Úcall_functionr   úExpected Node, got Úcall_modulezExpected call_module, got 'ú'zExpected str, but got c              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S ©N©Ú
isinstance©Ú.0Útarget_typeÚmods     €r   ú	<genexpr>z7get_node_first_input_and_output_type.<locals>.<genexpr>R   sA   øè è € ð 1
ð 1
àõ �s˜KÑ(Ô(ð1
ð 1
ð 1
ð 1
ð 1
ð 1
r   c              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S r/   r0   r2   s     €r   r6   z7get_node_first_input_and_output_type.<locals>.<genexpr>f   óA   øè è € ð )
ð )
àõ �s˜KÑ(Ô(ð)
ð )
ð )
ð )
ð )
ð )
r   c              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S r/   r0   r2   s     €r   r6   z7get_node_first_input_and_output_type.<locals>.<genexpr>j   r8   r   Úcall_methodÚ
dequantizeÚtor
   z handling needs to be added)ÚopÚtargetr   r   r   r   Úget_normalized_nth_inputr1   r	   ÚAssertionErrorÚtypeÚ$get_node_first_input_and_output_typer   Ústrr   Úanyr   r   ÚtorchÚfloat16)r   r   r   r   ÚFUNS_IO_TYPE_FP32ÚFUNS_IO_TYPE_FP16ÚFUNS_IO_TYPE_INT8ÚFUNS_IO_TYPE_FP32_OR_INT8ÚMODS_IO_TYPE_FP32ÚMODS_IO_TYPE_INT8ÚMODS_IO_TYPE_FP32_OR_INT8ÚMETHS_IO_TYPE_FP32_OR_INT8Ú	first_argÚ_prev_node_input_typeÚprev_node_output_typeÚ"is_known_fp32_or_int8_input_moduleÚis_known_fp32_input_moduleÚis_known_int8_input_moduleÚ	prev_nodeÚcur_node_dtype_targetr5   s                       @r   rB   rB   &   sf  ø€ ð 1Ð1DÔEÐØ0Ð1DÔEÐØ0Ð1DÔEÐØ 8Ð9TÔ UÐØ0Ð1DÔEÐØ0Ð1DÔEÐØ 8Ð9TÔ UÐØ!9Ð:VÔ!WÐà„w�/Ò!Ð!ØŒ;Ð+Ð+Ð+Ý)Ô.Õ0EÔ0JÐKÐKØŒ;Ð+Ð+Ð+Ý)Ô.Õ0EÔ0JÐKÐKØŒ[Ð-Ð-Ð-Ý)Ô.Õ0EÔ0JÐKÐKØŒ[Ð5Ð5Ð5Ý0°°r¸1Ñ=Ô=ˆIÝ˜i­Ñ.Ô.ð NÝ$Ð%L½4À	¹?¼?Ð%LÐ%LÑMÔMÐMõ 5Ø˜2˜zÐ+Cñô ñØ%Ø%ð *Ð+@ÐAÐAå)Ô1Õ3HÔ3PÐQÐQà	Œ�MÒ	!Ñ	!ØŒ7�mÒ#Ð#Ý Ð!I¸t¼wÐ!IÐ!IÐ!IÑJÔJÐJÝ˜$œ+¥sÑ+Ô+ð 	OÝ Ð!M½$¸t¼{Ñ:KÔ:KÐ!MÐ!MÑNÔNÐNå˜r 4¤;Ñ/Ô/ˆÝ-0ð 1
ð 1
ð 1
ð 1
à8ð1
ñ 1
ô 1
ñ .
ô .
Ð*õ
 �s˜Z­Õ7GÐHÑIÔIð	Bà1ð	Bõ 1°°r¸1Ñ=Ô=ˆIÝ˜i­Ñ.Ô.ð NÝ$Ð%L½4À	¹?¼?Ð%LÐ%LÑMÔMÐMõ 5Ø˜2˜zÐ+Cñô ñØ%Ø%ð *Ð+@ÐAÐAÝ%(ð )
ð )
ð )
ð )
à0ð)
ñ )
ô )
ñ &
ô &
Ð"õ &)ð )
ð )
ð )
ð )
à0ð)
ñ )
ô )
ñ &
ô &
Ð"ð &ð 	RÝ)Ô.Õ0EÔ0JÐKÐKØ'ð 	RÝ)Ô.Õ0EÔ0JÐKÐKå)Ô1Õ3HÔ3PÐQÐQà	Œ�MÒ	!Ñ	!ØŒ;˜,Ò&Ð&õ 1°°r¸1Ñ=Ô=ˆIÝ˜i­Ñ.Ô.ð NÝ$Ð%L½4À	¹?¼?Ð%LÐ%LÑMÔMÐMõ 5Ø˜2˜zÐ+Cñô ñØ%Ø%ð *Õ+@Ô+EÐFÐFàŒ[˜DÒ Ð õ
 1°°r¸1Ñ=Ô=ˆIÝ˜i­Ñ.Ô.ð NÝ$Ð%L½4À	¹?¼?Ð%LÐ%LÑMÔMÐMõ 5Ø˜2˜zÐ+Cñô ñØ%Ø%õ
 %=¸TÀ2ÀqÑ$IÔ$IÐ!Ø$­E¬MÐ9Ð9Ý$Ø,ÐIÐIÐIñô ð ð *Õ+@Ô+EÐFÐFàŒ[Ð6Ð6Ð6Ý0°°r¸1Ñ=Ô=ˆIÝ˜i­Ñ.Ô.ð NÝ$Ð%L½4À	¹?¼?Ð%LÐ%LÑMÔMÐMõ 5Ø˜2˜zÐ+Cñô ñØ%Ø%ð *Ð+@ÐAÐAå%Ô-Õ/DÔ/LÐMÐMå%Ô-Õ/DÔ/LÐMÐMr   c                 ó¶  ‡— t          | |d¦  «        }t          |t          ¦  «        sdS |d         }d„ }|j        dk    rf|j        t
          j        u r |||dd¦  «        S |j        t          j        t          j	        t          j
        t          j        fv r |||dd¦  «        S dS |j        d	k    �r§t          |j        t          ¦  «        s$t          d
t          |j        ¦  «        › �¦  «        ‚t          ||j        ¦  «        Št          ‰t           j        t           j        t           j        t(          j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j         t           j!        t           j"        t           j#        t(          j$        t(          j%        t(          j&        t(          j        t(          j'        t(          j(        f¦  «        r‰j)        ‰j*        fS tW          ˆfd„|D ¦   «         ¦  «        }|rtY          |||¦  «        S dS )z{
    Returns the qparams (scale, zero_point) of the first input to `node`,
    if they can be inferred from the graph.
    r   Nr(   c                 ój  — t          | ||¦  «        }t          | ||¦  «        }t          |t          ¦  «        st          dt	          |¦  «        › �¦  «        ‚t          |j        t          ¦  «        s$t          dt	          |j        ¦  «        › �¦  «        ‚t          |t          ¦  «        st          dt	          |¦  «        › �¦  «        ‚t          |j        t          ¦  «        s$t          dt	          |j        ¦  «        › �¦  «        ‚t          ||j        ¦  «        }t          ||j        ¦  «        }||fS )Nr+   úExpected str, got )r?   r1   r	   r@   rA   r>   rC   r   )r   r   Úscale_arg_idxÚ
zp_arg_idxÚ
scale_nodeÚzp_nodeÚ	scale_objÚzp_objs           r   Ú _get_scale_zp_from_function_argsz@get_node_input_qparams.<locals>._get_scale_zp_from_function_args½   s"  € Ý-¨d°B¸ÑFÔFˆ
Ý*¨4°°ZÑ@Ô@ˆÝ˜*¥dÑ+Ô+ð 	KÝ Ð!Iµt¸JÑ7GÔ7GÐ!IÐ!IÑJÔJÐJÝ˜*Ô+­SÑ1Ô1ð 	QÝ Ð!Oµd¸:Ô;LÑ6MÔ6MÐ!OÐ!OÑPÔPÐPÝ˜'¥4Ñ(Ô(ð 	HÝ Ð!Fµt¸G±}´}Ð!FÐ!FÑGÔGÐGÝ˜'œ.­#Ñ.Ô.ð 	NÝ Ð!Lµd¸7¼>Ñ6JÔ6JÐ!LÐ!LÑMÔMÐMÝ$ R¨Ô):Ñ;Ô;ˆ	Ý! " g¤nÑ5Ô5ˆØ˜6Ð"Ð"r   r*   r
   é   é   r,   rY   c              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S r/   r0   )r3   r4   Ú
module_objs     €r   r6   z)get_node_input_qparams.<locals>.<genexpr>û   sA   øè è € ð 1
ð 1
àõ �z ;Ñ/Ô/ð1
ð 1
ð 1
ð 1
ð 1
ð 1
r   )-r?   r1   r	   r=   r>   rE   Úquantize_per_tensorÚtoqÚaddÚadd_reluÚmulÚmul_relurC   r@   rA   r   ÚnnqÚLinearÚConv1dÚConv2dÚnniqÚ
ConvReLU2dÚConv3dÚBatchNorm2dÚBatchNorm3dÚConvTranspose1dÚConvTranspose2dÚELUÚ	GroupNormÚInstanceNorm1dÚInstanceNorm2dÚInstanceNorm3dÚ	LayerNormÚ	HardswishÚ	LeakyReLUÚReLU6ÚBNReLU2dÚBNReLU3dÚ
ConvReLU1dÚ
ConvReLU3dÚ
LinearReLUÚscaleÚ
zero_pointrD   Úget_node_input_qparams)r   r   r   rU   rM   r`   rR   rd   s          @r   r†   r†   ­   s  ø€ õ )¨¨r°1Ñ5Ô5€Iå�i¥Ñ&Ô&ð Øˆtà 8Ð9TÔ UÐð#ð #ð #ð „|�Ò&Ð&àÔ�uÔ8Ð8Ð8Ø3Ð3°I¸rÀ1ÀaÑHÔHÐHØÔ¥#¤'­3¬<½¼Å#Ä,Ð!OÐOÐOØ3Ð3°I¸rÀ1ÀaÑHÔHÐHàˆtð 
Œ˜Ò	&Ñ	&å˜)Ô*­CÑ0Ô0ð 	PÝ Ð!Nµd¸9Ô;KÑ6LÔ6LÐ!NÐ!NÑOÔOÐOÝ% b¨)Ô*:Ñ;Ô;ˆ
ÝØå”
Ý”
Ý”
Ý”Ý”
Ý”Ý”ÝÔ#ÝÔ#Ý”Ý”ÝÔ"ÝÔ"ÝÔ"Ý”Ý”Ý”Ý”	Ý”Ý”Ý”Ý”Ý”Ý”ð1ñ
ô 
ð 	=ð: Ô$ jÔ&;Ð<Ð<å-0ð 1
ð 1
ð 1
ð 1
à8ð1
ñ 1
ô 1
ñ .
ô .
Ð*ð .ð 	SÝ)¨)°RÐ9QÑRÔRÐRàˆ4r   c                 óx  — | j         dk    �r­t          || j        ¦  «        }t          |¦  «        �rˆt	          | j        ¦  «        dk    r$t          dt	          | j        ¦  «        › �¦  «        ‚t          | j        d         t          ¦  «        s*t          dt          | j        d         ¦  «        › �¦  «        ‚| j        d         } t          | j        t          ¦  «        s$t          dt          | j        ¦  «        › �¦  «        ‚t          || j        ¦  «        }t          |¦  «        r“t	          | j        ¦  «        dk    r$t          dt	          | j        ¦  «        › �¦  «        ‚t          | j        d         t          ¦  «        s*t          dt          | j        d         ¦  «        › �¦  «        ‚| j        d         } | S )a‡  
    If node is not an observer, returns it.  If node is an observer,
    navigates up the graph and returns the first parent which is not an
    observer.  For example,

    graph: (node_non_obs), node = node_non_obs : returns node_non_obs
    graph: (node_non_obs -> obs0), node = obs0 : returns node_non_obs
    graph: (node_non_obs -> obs0 -> fq0), node = fq0 : returns node_non_obs
    r,   r
   z)Expected node.args to have length 1, got r   r+   rY   )r=   r   r>   r   ÚlenÚargsr@   r1   r	   rA   rC   ©r   r   Únode_objs      r   Úreturn_first_non_observer_noderŒ     s”  € ð „w�-ÒÑÝ# B¨¬Ñ4Ô4ˆÝ& xÑ0Ô0ñ 	$Ý�4”9‰~Œ~ Ò"Ð"Ý$ØPÅÀDÄIÁÄÐPÐPñô ð õ ˜dœi¨œl­DÑ1Ô1ð QÝ$Ð%O½4ÀÄ	È!ÄÑ;MÔ;MÐ%OÐ%OÑPÔPÐPØ”9˜Q”<ˆDå˜dœk­3Ñ/Ô/ð OÝ$Ð%M½$¸t¼{Ñ:KÔ:KÐ%MÐ%MÑNÔNÐNÝ'¨¨D¬KÑ8Ô8ˆHÝ*¨8Ñ4Ô4ð $Ý�t”y‘>”> QÒ&Ð&Ý(ØTÅCÈÌ	ÁNÄNÐTÐTñô ð õ " $¤)¨A¤,µÑ5Ô5ð UÝ(Ð)S½tÀDÄIÈaÄLÑ?QÔ?QÐ)SÐ)SÑTÔTÐTØ”y ”|�Ø€Kr   c                 ó~   — | j         dk    r1t          || j        ¦  «        }t          |t          j        ¦  «        rdS dS )aO  
    Assumes that all non-param args occur first. Returns the number of
    non-param args expected for a node.  For example, for

      F.linear(x, weight, bias)

    Returns 1, because x is a non-param arg and weight and bias are params.
    For

      lstm_mod(x, hid)

    Returns 2, because both x and hid are non-param args.
    r,   ra   r
   )r=   r   r>   r1   ÚnnÚLSTMrŠ   s      r   Úget_number_of_non_param_argsr�   +  sB   € ð" „w�-ÒÐÝ# B¨¬Ñ4Ô4ˆÝ�h¥¤Ñ(Ô(ð 	Ø�1ð ˆ1r   c                 ó^  ‡ — t          ‰ j        ¦  «        dk    rg S ‰ j        dk    r…‰ j        t          j        t          j        j        j        t          j        fv s4‰ j        t          j	        t          j        j        j	        t          j	        fv rˆ fd„t          d¦  «        D ¦   «         }|S dgS )a-  
    Returns the indices of args of the node which we should attach
    loggers to, if input logging is enabled.

    For example,
    * for (x + y), returns [0, 1]
    * for (1 + y), returns [1]
    * for (x + 1), returns [0]
    * for (linear(x, w, b)) returns [0]
    * by default, returns [0]
    r   r*   c                 óV   •— g | ]%}t          ‰j        |         ¦  «        t          u ¯#|‘Œ&S r   )rA   r‰   r	   )r3   Úir   s     €r   ú
<listcomp>z4get_arg_indices_of_inputs_to_log.<locals>.<listcomp>X  s1   ø€ ÐDÐDÐD˜­¨d¬i¸¬lÑ);Ô);½tÐ)CÐ)C�!Ð)CÐ)CÐ)Cr   ra   )rˆ   r‰   r=   r>   rE   rg   ÚopsÚ	quantizedÚoperatorri   Úrange)r   Úresults   ` r   Ú get_arg_indices_of_inputs_to_logrš   E  s•   ø€ õ ˆ4Œ9�~„~˜ÒÐØˆ	Ø„w�/Ò!Ð!àŒ�œ	¥5¤9Ô#6Ô#:½H¼LÐIÐIÐIØŒ;�5œ9¥e¤iÔ&9Ô&=½x¼|ÐLÐLÐLàDÐDÐDÐD�U 1™XœXÐDÑDÔDˆØˆØˆ3€Jr   c                 ó4  — d}| j         dv rt          j        | j        ¦  «        }nr| j         dk    rgt	          | j        t
          ¦  «        s$t          dt          | j        ¦  «        › �¦  «        ‚t          || j        ¦  «        }t          j        |¦  «        }|S )zˆ
    Returns a string representation of the type of the function or module
    pointed to by this node, or '' for other node types.
    Ú )r*   r:   r,   rY   )	r=   rE   Útypenamer>   r1   rC   r@   rA   r   )r   r   r4   Ú
target_mods       r   Úget_target_type_strrŸ   ]  s“   € ð
 €KØ„wÐ2Ð2Ð2Ý”n T¤[Ñ1Ô1ˆˆØ	Œ�MÒ	!Ð	!Ý˜$œ+¥sÑ+Ô+ð 	KÝ Ð!Iµd¸4¼;Ñ6GÔ6GÐ!IÐ!IÑJÔJÐJÝ% b¨$¬+Ñ6Ô6ˆ
Ý”n ZÑ0Ô0ˆØÐr   ÚresultsÚ
model_namec                 ó,  — i }|                       ¦   «         D ]|\  }}d}|                     ¦   «         D ]S}|                      ¦   «         D ]<\  }}||k    r1t          |¦  «        dk    rt          d¦  «        ‚|d         d         }Œ<Œ=ŒT|�|||<   Œw|||<   Œ}|S )a	  
    Rekeys the layer name of a results dictionary to use node names
    from `model_name`.

    For example, transforms

        {'base_op_1_0': {'node_output': {'model_a':
          [{'ref_node_name': 'linear1', ...}]}}}

    into

        {'linear1': {'node_output': {'model_a':
          [{'ref_node_name': 'linear1', ...}]}}}

    Note: we cannot use these node names directly because they are not
    guaranteed to be consistent across models. This is why we extract
    the results first and rekey afterwards.
    Nr   z(Expected list_of_results to be not emptyÚref_node_name)ÚitemsÚvaluesrˆ   r@   )	r    r¡   Únew_resultsÚold_layer_nameÚresult_type_to_resultsÚnew_layer_nameÚmodel_name_to_resultsÚcur_model_nameÚlist_of_resultss	            r   Ú'rekey_logger_info_on_node_name_of_modelr­   m  s×   € ð, €KØ29·-²-±/´/ð Að AÑ.ˆÐ.ØˆØ%;×%BÒ%BÑ%DÔ%Dð 	ð 	Ð!Ø3H×3NÒ3NÑ3PÔ3Pð ð Ñ/� Ø! ZÒ/Ð/Ý˜?Ñ+Ô+¨qÒ0Ð0Ý,Ð-WÑXÔXÐXØ%4°QÔ%7¸Ô%H�N�Nàðð Ð%Ø*@ˆK˜Ñ'Ð'à*@ˆK˜Ñ'Ð'ØÐr   c                 ó
  — d}|                       ¦   «         D ]X}|                      ¦   «         D ]A}|                     ¦   «         D ]*\  }}t          |¦  «        dk    r|d         d         �|} nŒ+  |r�|                       ¦   «         D ]|}|                      ¦   «         D ]c}||         }|                     ¦   «         D ]D\  }}||k    rŒt          t          |¦  «        ¦  «        D ]}||         d         }|||         d<   ŒŒEŒdŒ{dS dS )ay  
    If `fqn` entries are filled in for one of the models in `results`, copies
    them over to any models which do not have them filled out.

    A common use case benefitting from this is comparing a model prepared by
    quantization to a quantized model. In this case, the model prepared by
    quantization would have `fqn` entries, and the quantized model would not.
    Nr   Úfqn)r¥   r¤   rˆ   r˜   )	r    Úmodel_name_with_fqnsr¨   rª   r¡   Úmodel_resultsÚref_model_resultsr“   r¯   s	            r   Úmaybe_add_missing_fqnsr³   •  sq  € ð  ÐØ")§.¢.Ñ"2Ô"2ð ð ÐØ%;×%BÒ%BÑ%DÔ%Dð 	ð 	Ð!Ø-B×-HÒ-HÑ-JÔ-Jð ð Ñ)�
˜MÝ�}Ñ%Ô%¨Ò)Ð)Ø$ QÔ'¨Ô.Ð:Ø/9Ð,Ø˜øØØàð 
6Ø&-§n¢nÑ&6Ô&6ð 		6ð 		6Ð"Ø)?×)FÒ)FÑ)HÔ)Hð 6ð 6Ð%Ø$9Ð:NÔ$OÐ!Ø1F×1LÒ1LÑ1NÔ1Nð 6ð 6Ñ-�J Ø!Ð%9Ò9Ð9Ø å"¥3 }Ñ#5Ô#5Ñ6Ô6ð 6ð 6˜Ø/°Ô2°5Ô9˜Ø25˜ aÔ(¨Ñ/Ð/ð6ð	6ð6ð
6ð 
6ð		6ð 		6r   c                 ó   ‡ ‡— ˆ ˆfd„Š‰S )Nc                  óx  •— | ^}}}t          |t          ¦  «        rt          |t          ¦  «        s*t          |t          ¦  «        rQt          |t          ¦  «        r<g }t          ||¦  «        D ]'\  }}||g|¢R }|                      ‰
|i |¤Ž¦  «         Œ(|S t          |t
          j        ¦  «        rPt          |t
          j        ¦  «        r6|j        r|                     ¦   «         }|j        r|                     ¦   «         }|j	        t
          j
        k    s|j	        t
          j
        k    rd S ||g|¢R } ‰	|i |¤ŽS r/   )r1   ÚtupleÚlistÚzipÚappendrE   ÚTensorÚis_quantizedr;   ÚdtypeÚfloat)r‰   ÚkwargsÚa0Úa1Úa_otherr    Úel0Úel1Únew_argsÚfÚinners            €€r   rÆ   zGmaybe_dequantize_first_two_tensor_args_and_handle_tuples.<locals>.inner¹  sS  ø€ ØÐˆˆB�å�r�5Ñ!Ô!ð 	%¥j°µUÑ&;Ô&;ð 	%Ý�r�4Ñ Ô ð	%Ý%/°µDÑ%9Ô%9ð	%ð ˆGÝ  B™KœKð ;ð ;‘��SØ Ð/ wÐ/Ð/�Ø—’˜u˜u hÐ9°&Ð9Ð9Ñ:Ô:Ð:Ð:ØˆNå˜�EœLÑ)Ô)ð 	%­j¸½U¼\Ñ.JÔ.Jð 	%ØŒð %Ø—]’]‘_”_�ØŒð %Ø—]’]‘_”_�ð Œ8•u”{Ò"Ð" b¤hµ%´+Ò&=Ð&=Ø�4à˜Ð%˜WÐ%Ð%ˆØˆq�(Ð%˜fÐ%Ð%Ð%r   r   )rÅ   rÆ   s   `@r   Ú8maybe_dequantize_first_two_tensor_args_and_handle_tuplesrÇ   ¸  s)   øø€ ð&ð &ð &ð &ð &ð &ð2 €Lr   ÚxÚyc                 óŒ   — t          j        | ¦  «        }t          j        | |z
  ¦  «        }dt          j        ||z  ¦  «        z  S )zµ
    Computes the SQNR between `x` and `y`.

    Args:
        x: Tensor or tuple of tensors
        y: Tensor or tuple of tensors

    Return:
        float or tuple of floats
    é   )rE   ÚnormÚlog10)rÈ   rÉ   ÚPsÚPns       r   Úcompute_sqnrrÐ   Õ  s=   € õ 
Œ�A‰Œ€BÝ	Œ�A˜‘EÑ	Ô	€BØ•”˜B ™GÑ$Ô$Ñ$Ð$r   c                 óŠ   — t          j        | |z
  dz                       ¦   «         | dz                       ¦   «         z  ¦  «        S )zÄ
    Computes the normalized L2 error between `x` and `y`.

    Args:
        x: Tensor or tuple of tensors
        y: Tensor or tuple of tensors

    Return:
        float or tuple of floats
    ra   )rE   ÚsqrtÚsum©rÈ   rÉ   s     r   Úcompute_normalized_l2_errorrÕ   æ  s9   € õ Œ:˜˜A™ !‘|×(Ò(Ñ*Ô*¨a°©d¯ZªZ©\¬\Ñ9Ñ:Ô:Ð:r   c                 ó¤   — |                       dd¦  «        } |                      dd¦  «        }t          j        j                             | |¦  «        S )zÂ
    Computes the cosine similarity between `x` and `y`.

    Args:
        x: Tensor or tuple of tensors
        y: Tensor or tuple of tensors

    Return:
        float or tuple of floats
    r
   éÿÿÿÿ)ÚreshaperE   rŽ   Ú
functionalÚcosine_similarityrÔ   s     r   Úcompute_cosine_similarityrÛ   ö  sE   € ð 	
�	Š	�!�RÑÔ€AØ	�	Š	�!�RÑÔ€AÝŒ8Ô×0Ò0°°AÑ6Ô6Ð6r   c                 ó¶   — | j         dk    rM| j        t          j        t          j        t
          j        t
          j        t          j        t          j        fv rdS dS )Nr*   FT)r=   r>   rE   rg   ri   r—   ÚcatÚstack)r   s    r   Úop_type_supports_shadowingrß   
  sM   € Ø„w�/Ò!Ð!ØŒ;ÝŒIÝŒIÝŒLÝŒLÝŒIÝŒKð
ð 
ð 
ð �5Øˆ4r   Úidxc           
      óØ  — 	 |                       |d¬¦  «        }|�œ|\  }}t          |¦  «        t          |¦  «        z   |k    r2t          d|› dt          |¦  «        t          |¦  «        z   › �¦  «        ‚|t          |¦  «        k     r||         S t          |                     ¦   «         ¦  «        |         S t          | j        ¦  «        t          | j        ¦  «        z   |k    r<t          d|› dt          | j        ¦  «        t          | j        ¦  «        z   › �¦  «        ‚|t          | j        ¦  «        k     r| j        |         S |t          | j        ¦  «        z   }t          | j                             ¦   «         ¦  «        |         S # t          $ r× t          | j        ¦  «        t          | j        ¦  «        z   |k    r=t          d|› dt          | j        ¦  «        t          | j        ¦  «        z   › �¦  «        d‚|t          | j        ¦  «        k     r| j        |         cY S |t          | j        ¦  «        z   }t          | j                             ¦   «         ¦  «        |         cY S w xY w)zu
    Given a node, gets the n'th input to that node, normalizing
    args and kwargs to the best of its ability.
    T)Únormalize_to_only_use_kwargsNzIndex z out of range: total = )Únormalized_argumentsrˆ   r@   r·   r¥   r‰   r¾   ÚRuntimeError)r   r   rà   Únorm_args_and_kwargsÚ	norm_argsÚnorm_kwargsÚ
kwargs_idxs          r   r?   r?     s]  € ð
%:Ø#×8Ò8Ø¨Tð  9ñ  
ô  
Ðð  Ð+Ø%9Ñ"ˆI�{Ý�9‰~Œ~¥ KÑ 0Ô 0Ñ0°CÒ7Ð7Ý$Ø\˜SÐ\Ð\½¸Y¹¼Í#ÈkÑJZÔJZÑ9ZÐ\Ð\ñô ð ð •S˜‘^”^Ò#Ð#Ø  ”~Ð%õ ˜K×.Ò.Ñ0Ô0Ñ1Ô1°#Ô6Ð6å�4”9‰~Œ~¥ D¤KÑ 0Ô 0Ñ0°CÒ7Ð7Ý$Ø\˜SÐ\Ð\½¸T¼Y¹¼Í#ÈdÌkÑJZÔJZÑ9ZÐ\Ð\ñô ð ð •S˜œ‘^”^Ò#Ð#Ø”y ”~Ð%à ¥3 t¤y¡>¤>Ñ1�
Ý˜DœK×.Ò.Ñ0Ô0Ñ1Ô1°*Ô=Ð=øÝð :ð :ð :õ ˆtŒy‰>Œ>�C ¤Ñ,Ô,Ñ,°Ò3Ð3Ý ØX˜ÐXÐXµS¸¼±^´^ÅcÈ$Ì+ÑFVÔFVÑ5VÐXÐXñô àðð •�T”Y‘”ÒÐØ”9˜S”>Ð!Ð!Ð!à�s 4¤9™~œ~Ñ-ˆJÝ˜œ×*Ò*Ñ,Ô,Ñ-Ô-¨jÔ9Ð9Ð9Ð9ð:øøøs.   ‚BF Â&F Â7BF ÅAF ÆBI)È#AI)É(I))7r   r—   Úcollections.abcr   rE   Útorch.ao.nn.intrinsic.quantizedÚaorŽ   Ú	intrinsicr–   ro   Útorch.ao.nn.quantizedrk   Útorch.nnÚtorch.ao.quantizationr   r   Útorch.ao.quantization.observerr   Útorch.ao.quantization.utilsr   Útorch.fxr   Útorch.fx.graphr	   Úns_typesr   r   r•   rf   ÚEnumr   ÚdictrC   Úsetr¶   rB   rº   r½   Úintr†   rŒ   r�   r·   rš   rŸ   r­   r³   rÇ   rÐ   rÕ   rÛ   Úboolrß   r?   r   r   r   ú<module>rú      sC  ðð €€€Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $à €€€Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø FÐ FÐ FÐ FÐ FÐ FØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5ð „iÔ€ð
	ð 	ð 	ð 	ð 	˜DœIñ 	ô 	ð 	ðDNØ
ðDNàðDNð ðDNð # 3¨Ð,<Ô(=Ð#=Ô>ð	DNð
 Ð Ð"7Ð7Ô8ðDNð DNð DNð DNðNUØ
ðUàðUð # 3¨Ð,<Ô(=Ð#=Ô>ðUð ˆ5Œ<˜%Ñ ¤°Ñ!3Ð3Ô4°tÑ;ð	Uð Uð Uð Uðp#Ø
ð#àð#ð 
ð#ð #ð #ð #ðLØ
ðàðð 	ðð ð ð ð4¨4ð °D¸´Ið ð ð ð ð0˜dð ¨ð ¸ð ð ð ð ð %Øð%àð%ð ð%ð %ð %ð %ðP 6 Mð  6°dð  6ð  6ð  6ð  6ðFð ð ð: :ð%�E”Lð % U¤\ð %°e´lð %ð %ð %ñ :Ô9ð%ð  :ð; 5¤<ð ;°E´Lð ;ÀUÄ\ð ;ð ;ð ;ñ :Ô9ð;ð :ð7 ¤ð 7°%´,ð 7À5Ä<ð 7ð 7ð 7ñ :Ô9ð7ð& Tð ¨dð ð ð ð ð*: 4ð *:¨[ð *:¸sð *:Àtð *:ð *:ð *:ð *:ð *:ð *:r   