Ë
    [^(hh!  ã                   ó¶  — d Z ddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ej                  j                  j                  Zej                  d«       dev r eeee	e
g«      rej                  d«       	 dd„Zddej$                  fd„Zd	„ Zdd
ej$                  fd„Zdej,                  fd„Zd„ Zd„ Zed„ «       Zed„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$y)z`Importing this file includes common utility methods for checking quantized
tensors and modules.
é    N)Úcontextmanager)ÚTEST_WITH_TSANÚIS_PPCÚIS_MACOSÚ
IS_WINDOWSÚnoneÚqnnpackc                 ón   — t        j                  | d|z  z   |z
  |dz
  |dz
  z  z
  |z  «      d|z  z   dz   S )z7Computes the output shape given convolution parameters.é   é   )ÚnpÚfloor)Ú
input_sizeÚkernel_sizeÚpaddingÚstrideÚdilationÚoutput_paddings         úf/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/testing/_internal/common_quantized.pyÚ_conv_output_shaper      s\   € ô �8‰8�Z ! g¡+Ñ-°Ñ;¸{ÈQ¹Ø  1™ñ?&ñ &Ø)/ñ0ó 1Ø34°~Ñ3EñFØHIñJð Jó    c                 óJ  — |€t        j                  |«      j                  }|€t        j                  |«      j                  }t        j                  | |z  |z   «      j                  t         j                  «      }t        j                  |||«      }|j                  |«      }|S )zQuantizes a numpy array.)r   ÚiinfoÚminÚmaxÚroundÚastypeÚint64Úclip)ÚxÚscaleÚ
zero_pointÚqminÚqmaxÚdtypeÚqxs          r   Ú	_quantizer'      s}   € à€|Ü�x‰x˜‹×"Ñ"ˆØ€|Ü�x‰x˜‹×"Ñ"ˆÜ	�‰�!�e‘)˜jÑ(Ó	)×	0Ñ	0´·±Ó	:€BÜ	�‰��T˜4Ó	 €BØ	�‰�5Ó	€BØ€Ir   c                 ó<   — | j                  t        «      |z
  |z  }|S )zDequantizes a numpy array.)r   Úfloat)r&   r!   r"   r    s       r   Ú_dequantizer*   %   s   € à	�‰”5Ó	˜JÑ	&¨%Ñ/€AØ€Hr   éÿ   c                 ó~   — | |z  j                  «       |z   }t        j                  |||«      j                  |«      }|S )zhRequantizes a numpy array, i.e., intermediate int32 or int16 values are
    converted back to given type)r   r   r   r   )r    Ú
multiplierr"   r#   r$   Úqtyper&   s          r   Ú_requantizer/   +   s=   € ð ˆj‰.×	Ñ	Ó	! JÑ	.€BÜ	�‰��T˜4Ó	 ×	'Ñ	'¨Ó	.€BØ€Ir   Fc                 ó¤  — |t         j                  t         j                  fv sJ ‚|t         j                  k(  r|t         j                  k(  sJ ‚t	        | t         j
                  «      r| j                  «       } |t         j                  k(  r|rd\  }}nd\  }}n|rd\  }}nd\  }}| j                  «       }| j                  «       }|t         j                  k(  }||k(  rd}	d}
nÚ|rUt        || «      }| }||z
  ||z
  z  }	t        |	t        j                  t        j                  «      j                  «      }	d}
nƒt        |d«      }t        |d«      }||z
  ||z
  z  }	t        |	t        j                  t        j                  «      j                  «      }	|t        ||	z  «      z
  }
t        ||
«      }
t        ||
«      }
t        |	«      t        |
«      gS )úxCalculate the dynamic quantization parameters (scale, zero_point)
    according to the min and max element of the tensor)iÀÿÿÿé?   )i€ÿÿÿé   )r   r3   )r   r+   ç      ð?r   ç        )ÚtorchÚper_tensor_affineÚper_tensor_symmetricÚqint8Ú
isinstanceÚTensorÚnumpyr   r   r   ÚfinfoÚfloat32Úepsr   r)   Úint)ÚXr%   Úreduce_rangeÚqschemer#   r$   Úmin_valÚmax_valÚis_symmetricr!   r"   s              r   Ú_calculate_dynamic_qparamsrG   2   s¡  € ð ”u×.Ñ.´×0JÑ0JÐKÑKÐKÐKØ”%×,Ñ,Ò,ØœŸ™Ò#Ð#Ð#Ü�!”U—\‘\Ô"Ø�G‰G‹IˆØ”—‘ÒÙØ ‰JˆD‘$à"‰JˆD‘$áØ‰JˆD‘$à‰JˆD�$Ø�e‰e‹g€GØ�e‰e‹g€GØœu×9Ñ9Ñ9€LØ�'ÒØˆØ‰
áÜ˜' G 8Ó,ˆGØ�hˆGØ˜wÑ&¨4°$©;Ñ7ˆEÜ˜œrŸx™x¬¯
©
Ó3×7Ñ7Ó8ˆEØ‰Jä˜' 3Ó'ˆGÜ˜' 3Ó'ˆGØ˜wÑ&¨4°$©;Ñ7ˆEÜ˜œrŸx™x¬¯
©
Ó3×7Ñ7Ó8ˆEØ¤ g°¡oÓ 6Ñ6ˆJÜ˜T :Ó.ˆJÜ˜T :Ó.ˆJÜ�%‹Lœ#˜j›/Ð*Ð*r   c                 ó|  — t        | t        j                  «      r| j                  «       } t        j                  |«      j
                  t        j                  |«      j                  }}||z
  }t        j                  | j                  d   t        j                  ¬«      }t        j                  | j                  d   t        j                  ¬«      }t        |j                  d   «      D ]Í  }| j                  «       }| j                  «       }	||	k(  rd||<   d||<   Œ3t        |	d«      }	t        |d«      }|	|z
  |z  ||<   t        ||   t        j                  t        j                  «      j                  «      ||<   |t!        |||   z  «      z
  ||<   t        |||   «      ||<   t        |||   «      ||<   ŒÏ ||fS )r1   r   )r%   r4   r5   )r:   r6   r;   r<   r   r   r   r   ÚzerosÚshapeÚfloat64r   Úranger=   r>   r?   r   )
rA   r%   r#   r$   Ún_levelsr!   r"   ÚirD   rE   s
             r   Ú&_calculate_dynamic_per_channel_qparamsrO   [   sw  € ô �!”U—\‘\Ô"Ø�G‰G‹IˆÜ—‘˜UÓ#×'Ñ'¬¯©°UÓ);×)?Ñ)?ˆ$€DØ�d‰{€HÜ�H‰H�Q—W‘W˜Q‘Z¤r§z¡zÔ2€EÜ—‘˜!Ÿ'™' !™*¬B¯H©HÔ5€JÜ�:×#Ñ# AÑ&Ó'ò 5ˆØ—%‘%“'ˆØ—%‘%“'ˆØ�gÒØˆE�!‰HØˆJ�qŠMä˜' 3Ó'ˆGÜ˜' 3Ó'ˆGØ 'Ñ)¨XÑ5ˆE�!‰HÜ˜5 ™8¤R§X¡X¬b¯j©jÓ%9×%=Ñ%=Ó>ˆE�!‰HØ ¤5¨°5¸±8Ñ);Ó#<Ñ<ˆJ�q‰MÜ  j°¡mÓ4ˆJ�q‰MÜ  j°¡mÓ4ˆJ�qŠMð5ð �*ÐÐr   c                 óø  — t        | t        t        f«      rLt        | «      t        |«      k(  sJ ‚t	        t        | «      «      D �cg c]  }t        | |   ||   «      ‘Œ }}|S |j                  r|j                  «       }| j                  r| j                  «       } | |z
  j                  «       }|dk(  rdt        d«      t        d«      fS | j                  «       }||z  }d|j                  «       z  }|||fS c c}w )a°  Calculates the signal to noise ratio and returns the signal and noise
    power, as well as the SNR in dB.
    If the input is a list/tuple this function is called recursively on each
    element. The result will have the same nested structure as the inputs.

    Args:
        x, x_hat: Either a tensor or a nested list/tuple of tensors.
    Returns:
        signal, noise, SNR(in dB): Either floats or a nested list of floats
    r   r5   Úinfé   )r:   ÚlistÚtupleÚlenrL   Ú_snrÚis_quantizedÚ
dequantizeÚnormr)   Úlog10)r    Úx_hatÚidxÚresÚnoiseÚsignalÚsnrÚsnr_dbs           r   rV   rV   u   så   € ô �!”dœE�]Ô#Ü�1‹vœ˜U›Ò#Ð#Ð#Ü38¼¸Q»³=ÖA¨CŒt�A�c‘F˜E #™JÕ'ÐAˆÐAØˆ
Ø×ÒØ× Ñ Ó"ˆØ‡~‚~Ø�L‰L‹NˆØ�‰Y×ÑÓ€EØ�‚zØ”E˜%“L¤%¨£,Ð.Ð.Ø�V‰V‹X€FØ
�5‰.€CØ�#—)‘)“+Ñ€FØ�5˜&Ð Ð ùò Bs   ÁC7c              #   ó"  K  — t         j                  j                  j                  }| t         j                  j                  _        	 d –— |t         j                  j                  _        y # |t         j                  j                  _        w xY w­w©N©r6   ÚbackendsÚ	quantizedÚengine)ÚqengineÚpreviouss     r   Úoverride_quantized_enginerj   �   sY   è ø€ ä�~‰~×'Ñ'×.Ñ.€HØ&-„E‡N�N×ÑÔ#ð3Ûà*2Œ�‰× Ñ Õ'ø¨(Œ�‰× Ñ Õ'üs   ‚ABÁA+ Á BÁ+!BÂBc              #   óä   K  — 	 | rt         j                  j                  «        d –— | rt         j                  j                  «        y y # | rt         j                  j                  «        w w xY w­wrc   )r6   Ú_CÚ!_set_default_mobile_cpu_allocatorÚ#_unset_default_mobile_cpu_allocator)Úqengine_is_qnnpacks    r   Ú"override_cpu_allocator_for_qnnpackrp   ™   sR   è ø€ ð;ÙÜ�H‰H×6Ñ6Ô8ÛáÜ�H‰H×8Ñ8Õ:ð øÑÜ�H‰H×8Ñ8Õ:ð üs   ‚A0„$A
 ¨"A0Á
#A-Á-A0c                 ó   ‡ — ˆ fd„}|S )Nc                  ól   •— t         D ]  }t        |«      5   ‰| i |¤Ž d d d «       Œ  y # 1 sw Y   Œ+xY wrc   )Úsupported_qenginesrj   )ÚargsÚkwargsrh   Ú	qfunctions      €r   Útest_fnz"override_qengines.<locals>.test_fn§   sA   ø€ Ü)ò 	+ˆGÜ*¨7Ó3ñ +á˜4Ð* 6Ò*÷+ð +ñ	+÷+ð +ús   –	*ª3	© )rv   rw   s   ` r   Úoverride_qenginesry   ¦   s   ø€ ô+ð
 €Nr   c                  óP   — t         j                  j                  j                  dk(  S )NÚfbgemmrd   rx   r   r   Úqengine_is_fbgemmr|   ®   ó   € Ü�>‰>×#Ñ#×*Ñ*¨hÑ6Ð6r   c                  óP   — t         j                  j                  j                  dk(  S )Nr	   rd   rx   r   r   ro   ro   °   s   € Ü�>‰>×#Ñ#×*Ñ*¨iÑ7Ð7r   c                  óP   — t         j                  j                  j                  dk(  S )NÚonednnrd   rx   r   r   Úqengine_is_onednnr�   ²   r}   r   c                  óP   — t         j                  j                  j                  dk(  S )NÚx86rd   rx   r   r   Úqengine_is_x86r„   ´   s   € Ü�>‰>×#Ñ#×*Ñ*¨eÑ3Ð3r   c                 ó–   — t        t        | j                  «       «      «      }d||<   ||d<   | j                  t	        |«      «      }||fS )Nr   )rS   rL   ÚdimÚpermuterT   )rA   ÚaxisÚnew_axis_listÚys       r   Ú_permute_to_axis_zeror‹   ¸   sH   € Üœ˜qŸu™u›w›Ó(€MØ€M�$ÑØ€M�!ÑØ	�	‰	”%˜Ó&Ó'€AØˆmÐÐr   c           	      óÊ  — | j                   }t        | j                  t        j                  «      |«      \  } }t        j
                  | «      }t        | j                  «       d   «      D ]M  }	t        j                  t        j                  | |	   d||	   z  z  ||	   z   «      ||«      ||	   z
  ||	   z  ||	<   ŒO |j                  t        |«      «      }
|
j                  |«      S ©Nr   r4   )r%   r‹   Útor6   r>   Ú
zeros_likerL   ÚsizeÚclampr   r‡   rT   )rA   Úper_channel_scaleÚper_channel_zero_pointrˆ   Ú	quant_minÚ	quant_maxr%   Úpermute_axis_listr]   rN   Úouts              r   Ú+_fake_quantize_per_channel_affine_referencer˜   Á   sâ   € Ø�G‰G€EÜ0°·±´e·m±mÓ1DÀdÓKÑ€AÐÜ
×
Ñ
˜1Ó
€Cä�1—6‘6“8˜A‘;Óò xˆÜ—+‘+œeŸk™k¨!¨A©$°#Ð8IÈ!Ñ8LÑ2LÑ*MØ(¨Ñ+ñ+,ó -Ø.7¸óDØF\Ð]^ÑF_ñ`ØctÐuvÑcwñxˆˆAŠðxð �+‰+”eÐ-Ó.Ó
/€CØ�6‰6�%‹=Ðr   c                 óØ  — |j                   }t        |j                  t        j                  «      |«      \  }}t        j
                  |«      }	t        |j                  «       d   «      D ],  }
t        j                  ||
   d||
   z  z  ||
   z   «      |	|
<   Œ. |	j                  t        |«      «      }	|	|k\  |	|k  z  }t        j
                  | «      }| |   ||<   |j                  |«      S r�   )r%   r‹   rŽ   r6   r>   r�   rL   r�   r   r‡   rT   )ÚdYrA   r’   r“   rˆ   r”   r•   r%   r–   ÚXqrN   Úmaskr]   s                r   Ú0_fake_quantize_per_channel_affine_grad_referencer�   Ï   sÝ   € Ø�G‰G€EÜ0°·±´e·m±mÓ1DÀdÓKÑ€AÐÜ	×	Ñ	˜!Ó	€BÜ�1—6‘6“8˜A‘;Óò ]ˆÜ—‘˜A˜a™D CÐ*;¸AÑ*>Ñ$>Ñ?ÐBXÐYZÑB[Ñ[Ó\ˆˆ1Šð]à	�‰”EÐ+Ó,Ó	-€BØ�)‰O  i¡Ñ0€DÜ
×
Ñ
˜2Ó
€CØ�4‘€Cˆ�IØ�6‰6�%‹=Ðr   c                 ó  — t        | t        j                  «      st        j                  | «      } n| j	                  «       j                  «       } | j                  t        j                  |«      t        j                  ¬«      S )N)Údevicer%   )	r:   r6   r;   ÚtensorÚdetachÚclonerŽ   rŸ   r>   )rA   rŸ   s     r   Ú	to_tensorr£   Û   sQ   € Ü�aœŸ™Ô&Ü�L‰L˜‹O‰à�H‰H‹J×ÑÓˆØ�4‰4”u—|‘| FÓ+´5·=±=ˆ4ÓAÐAr   )r   )%Ú__doc__r<   r   r6   Ú
contextlibr   Ú$torch.testing._internal.common_utilsr   r   r   r   re   rf   Úsupported_enginesrs   ÚremoveÚanyr   Úuint8r'   r*   r/   r7   rG   rO   rV   rj   rp   ry   r|   ro   r�   r„   r‹   r˜   r�   r£   rx   r   r   ú<module>r«      s  ðñó Û Ý %ß ]Ó ]à—^‘^×-Ñ-×?Ñ?Ð Ø × Ñ ˜&Ô !ð Ð"Ñ"¡s¨F°NÀHÈjÐ+YÔ'ZØ×Ñ˜iÔ(ð '(óJð *.°DÀÇÁó 	òð 12¸À2Ç8Á8ó ð 7<ÀU×E\ÑE\ó '+òRò4!ð6 ñ3ó ð3ð ñ;ó ð;òò7ò8ò7ò4òò
ò
óBr   