Ë
    L²jéX  ã                   ód  — 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j8                  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jJ                  e&z  ejJ                  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jJ                  dejJ                  dejJ                  fd„«       Z1e0dejJ                  dejJ                  dejJ                  fd„«       Z2e0dejJ                  dejJ                  dejJ                  fd „«       Z3dede4fd!„Z5deded"e'defd#„Z6y)$é    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	y)ÚNodeInputOrOutputTypeN)
Ú__name__Ú
__module__Ú__qualname__ÚenumÚautoÚFP32ÚINT8ÚFP16ÚUNKNOWNÚFP32_OR_INT8© ó    úS/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/ao/ns/fx/utils.pyr   r      sE   „ Øˆ4�9‰9‹;€DØˆ4�9‰9‹;€DØˆ4�9‰9‹;€DØˆd�i‰i‹k€Gð
 �4—9‘9“;�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 rIt        | |d
«      }t        |t        «      st        dt        |«      › �«      ‚t        ||||«      \  }}||fS t        j                  t        j                  fS | j                   dk(  �r{| j                   dk7  rt        d| j                   › d�«      ‚t        | j                  t        «      s!t        dt        | j                  «      › �«      ‚t        || j                  «      Št        ˆfd„|
D «       «      }t        ‰|t         t"        f«      s|rIt        | |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(  �rp| j                  dk(  rWt        | |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 rIt        | |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   ó6   •K  — | ]  }t        ‰|«      –— Œ y ­w©N©Ú
isinstance©Ú.0Útarget_typeÚmods     €r   ú	<genexpr>z7get_node_first_input_and_output_type.<locals>.<genexpr>R   s    øè ø€ ò 1
àô �s˜K×(ñ1
ùó   ƒc              3   ó6   •K  — | ]  }t        ‰|«      –— Œ y ­wr/   r0   r2   s     €r   r6   z7get_node_first_input_and_output_type.<locals>.<genexpr>f   ó    øè ø€ ò )
àô �s˜K×(ñ)
ùr7   c              3   ó6   •K  — | ]  }t        ‰|«      –— Œ y ­wr/   r0   r2   s     €r   r6   z7get_node_first_input_and_output_type.<locals>.<genexpr>j   r9   r7   Ú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   rC   rC   &   sœ  ø€ ð 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�w�/Ó!Ø�;‰;Ð+Ñ+Ü)×.Ñ.Ô0E×0JÑ0JÐKÐKØ�;‰;Ð+Ñ+Ü)×.Ñ.Ô0E×0JÑ0JÐKÐKØ�[‰[Ð-Ñ-Ü)×.Ñ.Ô0E×0JÑ0JÐKÐKØ�[‰[Ð5Ñ5Ü0°°r¸1Ó=ˆIÜ˜i¬Ô.Ü$Ð':¼4À	»?Ð:KÐ%LÓMÐMô 5Ø˜2˜zÐ+CóñØ%Ø%ð *Ð+@ÐAÐAä)×1Ñ1Ô3H×3PÑ3PÐQÐQà	�‰�MÓ	!Ø�7‰7�mÒ#Ü Ð#>¸t¿w¹w¸iÀqÐ!IÓJÐJÜ˜$Ÿ+™+¤sÔ+Ü Ð#9¼$¸t¿{¹{Ó:KÐ9LÐ!MÓNÐNä˜r 4§;¡;Ó/ˆÜ-0ó 1
à8ô1
ó .
Ð*ô
 �s˜Z¬Ô7GÐHÔIÙ1ô 1°°r¸1Ó=ˆIÜ˜i¬Ô.Ü$Ð':¼4À	»?Ð:KÐ%LÓMÐMô 5Ø˜2˜zÐ+CóñØ%Ø%ð *Ð+@ÐAÐAÜ%(ó )
à0ô)
ó &
Ð"ô &)ó )
à0ô)
ó &
Ð"ñ &Ü)×.Ñ.Ô0E×0JÑ0JÐKÐKÙ'Ü)×.Ñ.Ô0E×0JÑ0JÐKÐKä)×1Ñ1Ô3H×3PÑ3PÐQÐQà	�‰�MÓ	!Ø�;‰;˜,Ò&ô 1°°r¸1Ó=ˆIÜ˜i¬Ô.Ü$Ð':¼4À	»?Ð:KÐ%LÓMÐMô 5Ø˜2˜zÐ+CóñØ%Ø%ð *Ô+@×+EÑ+EÐFÐFà�[‰[˜DÒ ô
 1°°r¸1Ó=ˆIÜ˜i¬Ô.Ü$Ð':¼4À	»?Ð:KÐ%LÓMÐMô 5Ø˜2˜zÐ+CóñØ%Ø%ô
 %=¸TÀ2ÀqÓ$IÐ!Ø$¬E¯M©MÑ9Ü$Ø,Ð-Ð-HÐIóð ð *Ô+@×+EÑ+EÐFÐFà�[‰[Ð6Ñ6Ü0°°r¸1Ó=ˆIÜ˜i¬Ô.Ü$Ð':¼4À	»?Ð:KÐ%LÓMÐMô 5Ø˜2˜zÐ+CóñØ%Ø%ð *Ð+@ÐAÐAä%×-Ñ-Ô/D×/LÑ/LÐMÐMä%×-Ñ-Ô/D×/LÑ/LÐMÐMr   c                 óŠ  ‡— t        | |d«      }t        |t        «      sy|d   }d„ }|j                  dk(  r}|j                  t
        j                  u r |||dd«      S |j                  t        j                  t        j                  t        j                  t        j                  fv r |||dd«      S y|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         j0                  t         j2                  t         j4                  t         j6                  t         j8                  t         j:                  t         j<                  t         j>                  t         j@                  t         jB                  t         jD                  t         jF                  t(        jH                  t(        jJ                  t(        jL                  t(        j*                  t(        jN                  t(        jP                  f«      r‰jR                  ‰jT                  fS tW        ˆfd„|D «       «      }|rtY        |||«      S y)z{
    Returns the qparams (scale, zero_point) of the first input to `node`,
    if they can be inferred from the graph.
    r   Nr(   c                 ó  — 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	   rA   rB   r?   rD   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ˆ
Ü*¨4°°ZÓ@ˆÜ˜*¤dÔ+Ü Ð#6´t¸JÓ7GÐ6HÐ!IÓJÐJÜ˜*×+Ñ+¬SÔ1Ü Ð#5´d¸:×;LÑ;LÓ6MÐ5NÐ!OÓPÐPÜ˜'¤4Ô(Ü Ð#6´t¸G³}°oÐ!FÓGÐGÜ˜'Ÿ.™.¬#Ô.Ü Ð#5´d¸7¿>¹>Ó6JÐ5KÐ!LÓMÐMÜ$ R¨×):Ñ):Ó;ˆ	Ü! " g§n¡nÓ5ˆØ˜6Ð"Ð"r   r*   r
   é   é   r,   rZ   c              3   ó6   •K  — | ]  }t        ‰|«      –— Œ y ­wr/   r0   )r3   r4   Ú
module_objs     €r   r6   z)get_node_input_qparams.<locals>.<genexpr>û   s    øè ø€ ò 1
àô �z ;×/ñ1
ùr7   )-r@   r1   r	   r>   r?   rF   Úquantize_per_tensorÚtoqÚaddÚadd_reluÚmulÚmul_relurD   rA   rB   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_pointrE   Úget_node_input_qparams)r   r   r   rV   rN   ra   rS   re   s          @r   r‡   r‡   ­   sù  ø€ ô )¨¨r°1Ó5€Iä�i¤Ô&Øà 8Ð9TÑ UÐò#ð ‡|�|�Ò&à×Ñœu×8Ñ8Ñ8Ù3°I¸rÀ1ÀaÓHÐHØ×Ñ¤#§'¡'¬3¯<©<¼¿¹Ä#Ç,Á,Ð!OÑOÙ3°I¸rÀ1ÀaÓHÐHàð 
�‰˜Ó	&ä˜)×*Ñ*¬CÔ0Ü Ð#5´d¸9×;KÑ;KÓ6LÐ5MÐ!NÓOÐOÜ% b¨)×*:Ñ*:Ó;ˆ
ÜØä—
‘
Ü—
‘
Ü—
‘
Ü—‘Ü—
‘
Ü—‘Ü—‘Ü×#Ñ#Ü×#Ñ#Ü—‘Ü—‘Ü×"Ñ"Ü×"Ñ"Ü×"Ñ"Ü—‘Ü—‘Ü—‘Ü—	‘	Ü—‘Ü—‘Ü—‘Ü—‘Ü—‘Ü—‘ð1ô
ð: ×$Ñ$ j×&;Ñ&;Ð<Ð<ä-0ó 1
à8ô1
ó .
Ð*ñ .Ü)¨)°RÐ9QÓRÐRàr   c                 óF  — | j                   dk(  �r�t        || j                  «      }t        |«      �rnt	        | j
                  «      dk7  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k7  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+   rZ   )r>   r   r?   r   ÚlenÚargsrA   r1   r	   rB   rD   ©r   r   Únode_objs      r   Úreturn_first_non_observer_noder�     sT  € ð ‡w�w�-ÓÜ# B¨¯©Ó4ˆÜ& xÕ0Ü�4—9‘9‹~ Ò"Ü$Ø?ÄÀDÇIÁIÃÐ?OÐPóð ô ˜dŸi™i¨™l¬DÔ1Ü$Ð':¼4ÀÇ	Á	È!ÁÓ;MÐ:NÐ%OÓPÐPØ—9‘9˜Q‘<ˆDä˜dŸk™k¬3Ô/Ü$Ð'9¼$¸t¿{¹{Ó:KÐ9LÐ%MÓNÐNÜ'¨¨D¯K©KÓ8ˆHÜ*¨8Ô4Ü�t—y‘y“> QÒ&Ü(ØCÄCÈÏ	É	ÃNÐCSÐTóð ô " $§)¡)¨A¡,´Ô5Ü(Ð+>¼tÀDÇIÁIÈaÁLÓ?QÐ>RÐ)SÓTÐTØ—y‘y ‘|�Ø€Kr   c                 ó„   — | j                   dk(  r1t        || j                  «      }t        |t        j
                  «      ryy)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,   rb   r
   )r>   r   r?   r1   ÚnnÚLSTMr‹   s      r   Úget_number_of_non_param_argsr‘   +  s6   € ð" ‡w�w�-ÒÜ# B¨¯©Ó4ˆÜ�h¤§¡Ô(Øð r   c                 ó  — t        | j                  «      dk(  rg S | j                  dk(  r×| j                  t        j
                  t        j                  j                  j
                  t        j
                  fv sO| j                  t        j                  t        j                  j                  j                  t        j                  fv r9t        d«      D �cg c]#  }t        | j                  |   «      t        u sŒ"|‘Œ% }}|S dgS c c}w )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*   rb   )r‰   rŠ   r>   r?   rF   rh   ÚopsÚ	quantizedÚoperatorrj   ÚrangerB   r	   )r   ÚiÚresults      r   Ú get_arg_indices_of_inputs_to_logr™   E  s¸   € ô ˆ4�9‰9ƒ~˜ÒØˆ	Ø‡w�w�/Ò!à�‰œŸ	™	¤5§9¡9×#6Ñ#6×#:Ñ#:¼H¿L¹LÐIÑIØ�;‰;œ5Ÿ9™9¤e§i¡i×&9Ñ&9×&=Ñ&=¼x¿|¹|ÐLÑLä" 1›XÖD˜¬¨d¯i©i¸©lÓ);¼tÒ)C’!ÐDˆÐDØˆØˆ3€Jùò Es   Ã#DÃ9Dc                 óR  — d}| j                   dv r!t        j                  | j                  «      }|S | j                   dk(  rft	        | 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,   rZ   )	r>   rF   Útypenamer?   r1   rD   rA   rB   r   )r   r   r4   Ú
target_mods       r   Úget_target_type_strrž   ]  s�   € ð
 €KØ‡w�wÐ2Ñ2Ü—n‘n T§[¡[Ó1ˆð Ðð 
�‰�MÒ	!Ü˜$Ÿ+™+¤sÔ+Ü Ð#5´d¸4¿;¹;Ó6GÐ5HÐ!IÓJÐJÜ% b¨$¯+©+Ó6ˆ
Ü—n‘n ZÓ0ˆØÐr   ÚresultsÚ
model_namec                 ó   — i }| j                  «       D ]h  \  }}d}|j                  «       D ]A  }|j                  «       D ],  \  }}||k(  r"t        |«      dk(  rt        d«      ‚|d   d   }Œ-Œ. ŒC |�|||<   Œd|||<   Œj |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‰   rA   )	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Ñ.ˆÐ.ØˆØ%;×%BÑ%BÓ%Dò 	Ð!Ø3H×3NÑ3NÓ3Pò Ñ/� Ø! ZÒ/Ü˜?Ó+¨qÒ0Ü,Ð-WÓXÐXØ%4°QÑ%7¸Ñ%H‘Nàñð	ð Ð%Ø*@ˆK˜Ò'à*@ˆK˜Ò'ðAð Ðr   c                 ó¸  — d}| j                  «       D ]L  }|j                  «       D ]6  }|j                  «       D ]   \  }}t        |«      dkD  sŒ|d   d   €Œ|} n  n  n |rw| j                  «       D ]c  }|j                  «       D ]N  }||   }|j                  «       D ]4  \  }}||k(  rŒt        t        |«      «      D ]  }||   d   }|||   d<   Œ Œ6 ŒP Œe yy)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²   •  s-  € ð  ÐØ")§.¡.Ó"2ò ÐØ%;×%BÑ%BÓ%Dò 	Ð!Ø-B×-HÑ-HÓ-Jò Ñ)�
˜MÜ�}Ó%¨Ó)Ø$ QÑ'¨Ñ.Ñ:Ø/9Ð,Ùð	ñ
 ð	ñ 	ðñ Ø&-§n¡nÓ&6ò 		6Ð"Ø)?×)FÑ)FÓ)Hò 6Ð%Ø$9Ð:NÑ$OÐ!Ø1F×1LÑ1LÓ1Nò 6Ñ-�J Ø!Ð%9Ò9Ø ä"¤3 }Ó#5Ó6ò 6˜Ø/°Ñ2°5Ñ9˜Ø25˜ aÑ(¨Ò/ñ6ñ	6ñ6ñ		6ð r   c                 ó   ‡ ‡— ˆ ˆfd„Š‰S )Nc                  óf  •— | ^}}}t        |t        «      rt        |t        «      s t        |t        «      rFt        |t        «      r6g }t        ||«      D ]#  \  }}||g|¢­}|j	                   ‰
|i |¤Ž«       Œ% |S t        |t
        j                  «      rRt        |t
        j                  «      r8|j                  r|j                  «       }|j                  r|j                  «       }|j                  t
        j                  k7  s|j                  t
        j                  k7  ry ||g|¢­} ‰	|i |¤ŽS r/   )r1   ÚtupleÚlistÚzipÚappendrF   Ú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¹  s  ø€ ØÐˆˆB�ä�rœ5Ô!¤j°´UÔ&;Ü�rœ4Ô ¤Z°´DÔ%9àˆGÜ  B›Kò ;‘��SØ Ð/ wÑ/�Ø—‘™u hÐ9°&Ñ9Õ:ð;ð ˆNä˜œEŸL™LÔ)¬j¸¼U¿\¹\Ô.JØ�ŠØ—]‘]“_�Ø�ŠØ—]‘]“_�ð �8‰8”u—{‘{Ò" b§h¡h´%·+±+Ò&=Øà˜Ð%˜WÑ%ˆÙ�(Ð%˜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
    é   )rF   ÚnormÚlog10)rÇ   rÈ   ÚPsÚPns       r   Úcompute_sqnrrÏ   Õ  s;   € ô 
�‰�A‹€BÜ	�‰�A˜‘EÓ	€BØ”—‘˜B ™GÓ$Ñ$Ð$r   c                 ó|   — t        j                  | |z
  dz  j                  «       | dz  j                  «       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
    rb   )rF   ÚsqrtÚsum©rÇ   rÈ   s     r   Úcompute_normalized_l2_errorrÔ   æ  s3   € ô �:‰:˜˜A™ !‘|×(Ñ(Ó*¨a°©d¯Z©Z«\Ñ9Ó:Ð:r   c                 óž   — | j                  dd«      } |j                  dd«      }t        j                  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
   éÿÿÿÿ)ÚreshaperF   r�   Ú
functionalÚcosine_similarityrÓ   s     r   Úcompute_cosine_similarityrÚ   ö  sA   € ð 	
�	‰	�!�RÓ€AØ	�	‰	�!�RÓ€AÜ�8‰8×Ñ×0Ñ0°°AÓ6Ð6r   c                 óô   — | j                   dk(  ri| j                  t        j                  t        j                  t
        j                  t
        j                  t        j                  t        j                  fv ryy)Nr*   FT)r>   r?   rF   rh   rj   r•   ÚcatÚstack)r   s    r   Úop_type_supports_shadowingrÞ   
  sQ   € Ø‡w�w�/Ò!Ø�;‰;Ü�I‰IÜ�I‰IÜ�L‰LÜ�L‰LÜ�I‰IÜ�K‰Kð
ñ 
ð Ør   Úidxc           
      ón  — 	 | j                  |d¬«      }|�t|\  }}t        |«      t        |«      z   |k  r&t        d|› dt        |«      t        |«      z   › �«      ‚|t        |«      k  r||   S t        |j	                  «       «      |   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                  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                  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‰   rA   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°CÒ7Ü$Ø˜S˜EÐ!8¼¸Y»Ì#ÈkÓJZÑ9ZÐ8[Ð\óð ð ”S˜“^Ò#Ø  ‘~Ð%ô ˜K×.Ñ.Ó0Ó1°#Ñ6Ð6ä�4—9‘9‹~¤ D§K¡KÓ 0Ñ0°CÒ7Ü$Ø˜S˜EÐ!8¼¸T¿Y¹Y»Ì#ÈdÏkÉkÓJZÑ9ZÐ8[Ð\óð ð ”S˜Ÿ™“^Ò#Ø—y‘y ‘~Ð%à ¤3 t§y¡y£>Ñ1�
Ü˜DŸK™K×.Ñ.Ó0Ó1°*Ñ=Ð=øÜò :ô ˆt�y‰y‹>œC §¡Ó,Ñ,°Ò3Ü Ø˜˜Ð4´S¸¿¹³^ÄcÈ$Ï+É+ÓFVÑ5VÐ4WÐXóàðð ”�T—Y‘Y“ÒØ—9‘9˜S‘>Ò!àœs 4§9¡9›~Ñ-ˆJÜ˜Ÿ™×*Ñ*Ó,Ó-¨jÑ9Ò9ð:ús,   ‚A,E Á/E ÂBE Ä=E ÅBH4Ç3>H4È3H4)7r   r•   Úcollections.abcr   rF   Útorch.ao.nn.intrinsic.quantizedÚaor�   Ú	intrinsicr”   rp   Útorch.ao.nn.quantizedrl   Útorch.nnÚtorch.ao.quantizationr   r   Útorch.ao.quantization.observerr   Útorch.ao.quantization.utilsr   Útorch.fxr   Útorch.fx.graphr	   Úns_typesr   r   r“   rg   ÚEnumr   ÚdictrD   Úsetrµ   rC   r¹   r¼   Úintr‡   r�   r‘   r¶   r™   rž   r¬   r²   rÆ   rÏ   rÔ   rÚ   ÚboolrÞ   r@   r   r   r   ú<module>rù      s�  ðó Û Ý $ã ß .Ö .ß #Ó #Ý ß @Ý FÝ 8Ý  Ý ç 5ð ‡i�i×Ñ€ô
	˜DŸI™Iô 	ðDNØ
ðDNàðDNð ðDNð # 3¨Ð,<Ñ(=Ð#=Ñ>ð	DNð
 Ð Ð"7Ð7Ñ8óDNðNUØ
ðUàðUð # 3¨Ð,<Ñ(=Ð#=Ñ>ðUð ˆ5�<‰<˜%Ñ §¡°Ñ!3Ð3Ñ4°tÑ;ó	Uðp#Ø
ð#àð#ð 
ó#ðLØ
ðàðð 	óð4¨4ð °D¸±Ió ð0˜dð ¨ð ¸ó ð %Øð%àð%ð ó%ðP 6 Mð  6°dó  6òFð: :ð%�E—L‘Lð % U§\¡\ð %°e·l±lò %ó :ð%ð  :ð; 5§<¡<ð ;°E·L±Lð ;ÀUÇ\Á\ò ;ó :ð;ð :ð7 §¡ð 7°%·,±,ð 7À5Ç<Á<ò 7ó :ð7ð& Tð ¨dó ð*: 4ð *:¨[ð *:¸sð *:Àtô *:r   