Ë
    g^(h!?  ã                  óÄ  — d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	 d dl
Z
d dlmZ d dlmc mZ d dlmZmZ d dlmZmZmZmZmZmZ d dlmZmZ d dlm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d d	l(m)Z) e	rd d
l*m+Z+ d dl,m-Z- ddgZ.dd„Z/dd„Z0dd„Z1dd„Z2ejf                  	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Z4dd„Z5dd„Z6	 	 	 	 	 	 d d„Z7 e)d¬«       G d„ de«      «       Z8y)!é    )ÚannotationsN)ÚAnyÚCallableÚOptionalÚTYPE_CHECKING)ÚFakeQuantizeÚFusedMovingAvgObsFakeQuantize)ÚHistogramObserverÚMinMaxObserverÚMovingAverageMinMaxObserverÚ%MovingAveragePerChannelMinMaxObserverÚPerChannelMinMaxObserverÚPlaceholderObserver)ÚQuantizationSpecÚ	Quantizer)Ú_get_module_name_filter)Ú_convert_scalars_to_attrsÚOP_TO_ANNOTATORÚOperatorConfigÚOperatorPatternTypeÚpropagate_annotationÚQuantizationConfig)Úcompatibility)Ú"_ObserverOrFakeQuantizeConstructor)ÚNodeÚXNNPACKQuantizerÚ!get_symmetric_quantization_configc                óˆ   —  t        j                  | d¬«      |Ž \  }}|j                  j                  «        |j                  S )NT)Ú
aten_graph)ÚtorchdynamoÚexportÚgraphÚeliminate_dead_code)ÚfunctionÚinputsÚgmÚ_s       úo/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/ao/quantization/quantizer/xnnpack_quantizer.pyÚ_get_dynamo_graphr)   0   s8   € Ø9ŒK×Ñ˜x°DÔ9¸6ÐB�E€BˆØ‡H�H× Ñ Ô"Ø�8‰8€Oó    c                óÞ   — | d   }d}t        j                  ||f«      }t        j                  |f«      }t        j                  | «      }dd„}t        ||||f«      }t        |||f«      }||gS )Néÿÿÿÿé   c                ó0   — t        j                  | ||«      S ©N)ÚFÚlinear)ÚactÚweightÚbiass      r(   Ú	linear_opz'_get_linear_patterns.<locals>.linear_op=   s   € Ü�x‰x˜˜V TÓ*Ð*r*   r/   )ÚtorchÚonesr)   )	Ú
input_sizeÚin_channelsÚout_channelsr3   r4   r2   r5   Úpattern_w_biasÚpattern_wo_biass	            r(   Ú_get_linear_patternsr=   6   sv   € Ø˜R‘.€KØ€LÜ�Z‰Z˜ {Ð3Ó4€FÜ�:‰:�|�oÓ&€DÜ
�*‰*�ZÓ
 €Có+ô ' y°3¸ÀÐ2EÓF€NÜ'¨	°C¸°=ÓA€OØ˜OÐ,Ð,r*   c                 óJ  — t         j                  j                  t         j                  j                  gt         j                  j                  t        j
                  gt        j                  t         j                  j                  gt        j                  t        j
                  ggt         j                  j                  gt        j                  ggt         j                  ggt         j                  j                  gt        j                  ggdœ} t        j                  | «      S )N)Úconv2dr1   ÚaddÚadaptive_avg_pool2d)r6   ÚnnÚConv2dÚReLUr0   Úrelur?   ÚLinearr1   r@   ÚAdaptiveAvgPool2drA   ÚcopyÚdeepcopy)Úsupported_operatorss    r(   Ú(_supported_symmetric_quantized_operatorsrK   E   s»   € ô
 �X‰X�_‰_œeŸh™hŸm™mÐ,Ü�X‰X�_‰_œaŸf™fÐ%Ü�X‰X”u—x‘x—}‘}Ð%Ü�X‰X”q—v‘vÐð	
ô —H‘H—O‘OÐ$¤q§x¡x jÐ1Ü—‘�ˆ}ä�X‰X×'Ñ'Ð(Ü×"Ñ"Ð#ð 
ñAÐô  �=‰=Ð,Ó-Ð-r*   c                 óú   ‡— g } t        «       t        d¬«      t        d¬«      t        dd¬«      fD ]4  Št        «       }| j                  ˆfd„|j                  «       D «       «       Œ6 t	        j
                  | «      S )NT)Úis_qat)Úis_per_channel)rN   rM   c              3  ó6   •K  — | ]  }t        ‰|«      –— Œ y ­wr/   )r   )Ú.0Úpattern_listÚquantization_configs     €r(   ú	<genexpr>z@_get_supported_symmetric_config_and_operators.<locals>.<genexpr>b   s!   øè ø€ ò .
àô Ð.°×=ñ.
ùs   ƒ)r   rK   ÚextendÚvaluesrH   rI   )Úsupported_config_and_operatorsÚopsrR   s     @r(   Ú-_get_supported_symmetric_config_and_operatorsrX   Y   sx   ø€ Ø;=Ð"ä)Ó+Ü)°Ô6Ü)¸Ô>Ü)¸ÀdÔKð	 ò 

Ðô 7Ó8ˆØ&×-Ñ-ó .
à #§
¡
£ô.
õ 	
ð

ô �=‰=Ð7Ó8Ð8r*   Fc                ór  — ddi}|r+|r"t         }t        j                  d¬«      }	|	|d<   nt        }n|rt        }nt
        }t        t        j                  ||t        j                  | |j                  d
i |¤Ž¬«      }
| rt        j                  nt        j                  }t        }|rt        }n| rt        }ddi}|r&|t        j                  k(  r
t        |d<   n	t        |d<   t        t        j                  |||dd |j                  d
i |¤Ž¬	«      }d }|rt        |
d |||«      }|S t        |
|
|||«      }|S )NÚepsg      0?é   )Úaveraging_constantÚobserver)ÚdtypeÚ	quant_minÚ	quant_maxÚqschemeÚ
is_dynamicÚobserver_or_fake_quant_ctrr   F)r^   r_   r`   ra   Úch_axisrb   rc   © )r   r   Ú	with_argsr	   r   r
   r   r6   Úint8Úper_tensor_affineÚper_channel_symmetricÚper_tensor_symmetricr   r   r   r   )rN   rM   rb   Úact_qminÚact_qmaxÚweight_qminÚweight_qmaxÚ
extra_argsÚact_observer_or_fake_quant_ctrÚdynamic_quant_observerÚact_quantization_specÚweight_qschemeÚ!weight_observer_or_fake_quant_ctrÚweight_quantization_specÚbias_quantization_specrR   s                   r(   r   r   i   s|  € ð #(¨ €JÙÙÜ-9Ð*Ü%@×%JÑ%JØ#$ô&Ð"ð &<ˆJ�zÒ"ä-JÑ*áÜ-@Ñ*ä->Ð*ä,Ü�j‰jØØÜ×'Ñ'ØØ#KÐ#A×#KÑ#Kñ $
Øñ$
ô	Ðñ (6Œ×#Ò#¼5×;UÑ;Uð ô 	ð &ñ ä,IÑ)Ù	Ü,DÐ)à"'¨ €JÙØœU×7Ñ7Ò7Ü%@ˆJ�zÒ"ä%JˆJ�zÑ"Ü/Ü�j‰jØØØØØØ#NÐ#D×#NÑ#Nñ $
Øñ$
ô
 Ðð "ÐÙÜ0Ø!ØØ$Ø"Øó
Ðð Ðô 1Ø!Ø!Ø$Ø"Øó
Ðð Ðr*   c                 ó   — t        «       S r/   )rX   re   r*   r(   Ú#_get_supported_config_and_operatorsrx   ¿   s   € Ü8Ó:Ð:r*   c                óL   ‡— | j                   dz   | j                  z   Šdˆfd„}|S )a  Get the module_type_filter function for a given module type, the filter accepts
    a node and checks if the node comes from a module that has certain module type

    For example:
        node: linear_op = call_function[...](...)  # comes from a module with type Block -> Sub -> Linear


    >> module_type_filter = _get_module_type_filter(Sub)  # submodule with type `Sub`, under the `Block` submodule
    >> print(module_type_filter(node))
    True  # the node is from the submodule `Sub` (same for `Block` and `Linear` as well)
    ú.c                óò   •— | j                   j                  di «      }g }|j                  «       D ]B  \  }}t        |t        «      r|j
                  dz   |j                  z   }|j                  |«       ŒD ‰|v S )NÚnn_module_stackrz   )ÚmetaÚgetrU   Ú
isinstanceÚtypeÚ
__module__Ú__qualname__Úappend)Únr|   Útypesr'   ÚtÚtp_strs        €r(   Úmodule_type_filterz3_get_module_type_filter.<locals>.module_type_filterÒ   su   ø€ ð
 Ÿ&™&Ÿ*™*Ð%6¸Ó;ˆØˆØ#×*Ñ*Ó,ò 	‰DˆAˆqô ˜!œTÔ"Ø—L‘L 3Ñ&¨¯©Ñ7�Ø�L‰L˜�Oð	ð ˜ˆÐr*   ©r„   r   ÚreturnÚbool)r�   r‚   )Útprˆ   r‡   s     @r(   Ú_get_module_type_filterr�   Ã   s)   ø€ ð �]‰]˜SÑ  2§?¡?Ñ2€Fõð Ðr*   c                ó�   ‡‡— | D �cg c]  }t        |«      ‘Œ c}Š|D �cg c]  }t        |«      ‘Œ c}Šdˆˆfd„}|S c c}w c c}w )Nc                ó6   •‡ — t        ˆ fd„‰‰z   D «       «       S )Nc              3  ó.   •K  — | ]  } |‰«      –— Œ y ­wr/   re   )rP   Úfr„   s     €r(   rS   z^_get_not_module_type_or_name_filter.<locals>.not_module_type_or_name_filter.<locals>.<genexpr>ë   s   øè ø€ ÒT ‘q˜—tÑTùs   ƒ)Úany)r„   Úmodule_name_list_filtersÚmodule_type_filterss   `€€r(   Únot_module_type_or_name_filterzK_get_not_module_type_or_name_filter.<locals>.not_module_type_or_name_filterê   s   ù€ ÜÓTÐ%8Ð;SÑ%SÔTÓTÐTÐTr*   r‰   )r�   r   )Útp_listÚmodule_name_listrŒ   Úmr•   r“   r”   s        @@r(   Ú#_get_not_module_type_or_name_filterr™   ä   sL   ù€ ð BIÖI¸2Ô2°2Õ6ÒIÐØDTÖU¸qÔ 7¸Õ :ÒUÐöUð *Ð)ùò JùÚUs	   ‡> A)Úis_backward_compatiblec                  ó6  ‡ — e Zd ZdZ e«       Zg d¢Zg d¢ZdgZdˆ fd„Z	e
dd„«       Ze
	 	 	 	 dd„«       Zdd„Z	 	 	 	 	 	 dd	„Z	 	 	 	 dd
„Z	 	 	 	 dd„Z	 	 	 	 dd„Zdd„Z	 d	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Z	 	 	 	 dd„Z	 	 	 	 dd„Zdd„Ze
dd„«       Zˆ xZS ) r   zú
    !!! DEPRECATED !!!
    XNNPACKQuantizer is a marked as deprected. It will be removed in the future.
    It has been moved to executorch.backends.xnnpack.quantizer.xnnpack_quantizer.XNNPACKQuantizer.
    Please use the new quantizer instead.
    )Úconv_bn_reluÚconv_bnÚconv_transpose_bn_reluÚconv_transpose_bn)Úlinear_relur1   Ú	conv_reluÚconvÚconv_transpose_relurA   Úgru_io_onlyÚadd_relur@   Úmul_reluÚmulÚcatr1   c                ó²   •— t         ‰| �  «        t        j                  | j                  j
                  › d�«       d | _        i | _        i | _        i | _	        y )Nz is deprecated!)
ÚsuperÚ__init__ÚwarningsÚwarnÚ	__class__Ú__name__Úglobal_configÚoperator_type_configÚmodule_type_configÚmodule_name_config)Úselfr®   s    €r(   r«   zXNNPACKQuantizer.__init__  sU   ø€ Ü‰ÑÔÜ�‰˜Ÿ™×0Ñ0Ð1°ÐAÔBØ;?ˆÔð ð 	Ô!ð QSˆÔØKMˆÕr*   c                ó`   — | j                   D ��ch c]  \  }}|’Œ	 }}}t        |«      S c c}}w r/   )rV   Úlist)ÚclsÚspecr'   Ú
op_configss       r(   Ú"get_supported_quantization_configsz3XNNPACKQuantizer.get_supported_quantization_configs!  s:   € ð !$× BÑ B÷/
Ù�T˜1ŠDð/
ˆ
ñ /
ô �JÓÐùó/
s   �*c                ó–   — |€)g }| j                   D ]  \  }}|j                  |«       Œ |S | j                   D ]  \  }}||k(  sŒ|c S  g S r/   )rV   rT   )r·   rR   Úall_opsr'   rW   Úconfigs         r(   Ú.get_supported_operator_for_quantization_configz?XNNPACKQuantizer.get_supported_operator_for_quantization_config(  si   € ð Ð&ØˆGØ×<Ñ<ò $‘��3Ø—‘˜sÕ#ð$àˆNà×=Ñ=ò 	‰KˆF�Cð Ð,Ó,Ø’
ð	ð ˆ	r*   c                ó   — || _         | S r/   )r°   )r´   rR   s     r(   Ú
set_globalzXNNPACKQuantizer.set_global<  s   € Ø0ˆÔØˆr*   c                ó$   — || j                   |<   | S r/   )r±   )r´   Úoperator_typerR   s      r(   Úset_operator_typez"XNNPACKQuantizer.set_operator_type@  s   € ð
 4Gˆ×!Ñ! -Ñ0Øˆr*   c                ó$   — || j                   |<   | S )a5  Set quantization_config for a submodule with type: `module_type`, for example:
        quantizer.set_module_name(Sub) or quantizer.set_module_name(nn.Linear), it will quantize all supported operator/operator
        patterns in the submodule with this module type with the given `quantization_config`
        )r²   )r´   Úmodule_typerR   s      r(   Úset_module_typez XNNPACKQuantizer.set_module_typeH  s   € ð 0Cˆ×Ñ Ñ,Øˆr*   c                ó6   — |€J d«       ‚|| j                   |<   | S )a  Set quantization_config for a submodule with name: `module_name`, for example:
        quantizer.set_module_name("blocks.sub"), it will quantize all supported operator/operator
        patterns in the submodule with this module name with the given `quantization_config`
        z1 quantization_config == None is not supported yet)r³   )r´   Úmodule_namerR   s      r(   Úset_module_namez XNNPACKQuantizer.set_module_nameR  s/   € ð  Ð+ð	?à>ó	?Ø+à/Bˆ×Ñ Ñ,Øˆr*   c                ó   — t        |«      S )z-Transforms scalar values to tensor attributes)r   ©r´   Úmodels     r(   Útransform_for_annotationz)XNNPACKQuantizer.transform_for_annotation_  s   € ô )¨Ó/Ð/r*   c                óº   — | j                   r2| j                   j                  j                  r| j                  |«      }n| j	                  |«      }t        |«       |S )z!just handling global spec for now)r°   Úinput_activationrb   Ú)_annotate_for_dynamic_quantization_configÚ(_annotate_for_static_quantization_configr   rË   s     r(   ÚannotatezXNNPACKQuantizer.annotatee  sN   € ð ×Ò $×"4Ñ"4×"EÑ"E×"PÒ"PØ×BÑBÀ5ÓI‰Eà×AÑAÀ%ÓHˆEÜ˜UÔ#Øˆr*   c                óª   — |€|S |j                   r!| j                  D ]  }t        |   |||«       Œ | j                  D ]  }t        |   |||«       Œ |S r/   )rM   ÚSTATIC_QAT_ONLY_OPSr   Ú
STATIC_OPS©r´   rÌ   rR   Ú	filter_fnÚops        r(   Ú_annotate_all_static_patternsz.XNNPACKQuantizer._annotate_all_static_patternso  sm   € ð Ð&ØˆLà×%Ò%Ø×.Ñ.ò K�Ü Ñ# EÐ+>À	ÕJðKà—/‘/ò 	GˆBÜ˜BÑ Ð':¸IÕFð	Gàˆr*   c                óP   — |€|S | j                   D ]  }t        |   |||«       Œ |S r/   )ÚDYNAMIC_OPSr   rÖ   s        r(   Ú_annotate_all_dynamic_patternsz/XNNPACKQuantizer._annotate_all_dynamic_patterns€  s=   € ð Ð&ØˆLà×"Ñ"ò 	GˆBÜ˜BÑ Ð':¸IÕFð	Gàˆr*   c                óØ  — t        | j                  j                  «       «      }| j                  j                  «       D ]!  \  }}| j	                  ||t        |«      «       Œ# t        | j                  j                  «       «      }| j                  j                  «       D ]!  \  }}| j	                  ||t        |«      «       Œ# | j	                  || j                  t        ||«      «       |S r/   )
r¶   r³   ÚkeysÚitemsrÙ   r   r²   r�   r°   r™   ©r´   rÌ   r—   rÈ   r½   r–   rÅ   s          r(   rÑ   z9XNNPACKQuantizer._annotate_for_static_quantization_configŽ  sã   € ô   × 7Ñ 7× <Ñ <Ó >Ó?ÐØ#'×#:Ñ#:×#@Ñ#@Ó#Bò 	ÑˆK˜Ø×.Ñ.Ø�vÔ6°{ÓCõð	ô
 �t×.Ñ.×3Ñ3Ó5Ó6ˆØ#'×#:Ñ#:×#@Ñ#@Ó#Bò 	ÑˆK˜Ø×.Ñ.Ø�vÔ6°{ÓCõð	ð
 	×*Ñ*ØØ×ÑÜ/°Ð9IÓJô	
ð
 ˆr*   c                óØ  — t        | j                  j                  «       «      }| j                  j                  «       D ]!  \  }}| j	                  ||t        |«      «       Œ# t        | j                  j                  «       «      }| j                  j                  «       D ]!  \  }}| j	                  ||t        |«      «       Œ# | j	                  || j                  t        ||«      «       |S r/   )
r¶   r³   rÞ   rß   rÜ   r   r²   r�   r°   r™   rà   s          r(   rÐ   z:XNNPACKQuantizer._annotate_for_dynamic_quantization_config¤  sã   € ô   × 7Ñ 7× <Ñ <Ó >Ó?ÐØ#'×#:Ñ#:×#@Ñ#@Ó#Bò 	ÑˆK˜Ø×/Ñ/Ø�vÔ6°{ÓCõð	ô
 �t×.Ñ.×3Ñ3Ó5Ó6ˆØ#'×#:Ñ#:×#@Ñ#@Ó#Bò 	ÑˆK˜Ø×/Ñ/Ø�vÔ6°{ÓCõð	ð
 	×+Ñ+ØØ×ÑÜ/°Ð9IÓJô	
ð
 ˆr*   c                 ó   — y r/   re   rË   s     r(   ÚvalidatezXNNPACKQuantizer.validateº  s   € Ør*   c                ó   — | j                   S r/   )rV   )r·   s    r(   Úget_supported_operatorsz(XNNPACKQuantizer.get_supported_operators½  s   € à×1Ñ1Ð1r*   )rŠ   ÚNone)rŠ   zlist[QuantizationConfig])rR   úOptional[QuantizationConfig]rŠ   zlist[OperatorPatternType])rR   r   rŠ   r   )rÂ   ztorch._ops.OpOverloadPacketrR   r   rŠ   r   )rÅ   r   rR   r   )rÈ   ÚstrrR   rç   )rÌ   útorch.fx.GraphModulerŠ   ré   r/   )rÌ   ré   rR   rç   r×   z Optional[Callable[[Node], bool]]rŠ   ré   )rÌ   ré   rŠ   ræ   ©rŠ   zlist[OperatorConfig])r¯   r�   r‚   Ú__doc__rx   rV   rÔ   rÕ   rÛ   r«   Úclassmethodrº   r¾   rÀ   rÃ   rÆ   rÉ   rÍ   rÒ   rÙ   rÜ   rÑ   rÐ   rã   rå   Ú__classcell__)r®   s   @r(   r   r   ð   sz  ø„ ññ &IÓ%JÐ"òÐò€Jð" 	ð€KõNð ò ó ð ð ðØ">ðà	"òó ðó&ðà2ðð 0ðð 
ó	ðØ#ðØ:LóðØðØ5Qóð0Ø)ð0à	ó0óð 7;ð	à#ðð :ðð 4ð	ð
 
óð* 7;ð	à#ðð :ðð 4ð	ð
 
óðØ)ðà	óð,Ø)ðà	óó,ð ò2ó ô2r*   )r$   r   rŠ   ztorch.fx.Graph)r8   z	list[int])rŠ   z$dict[str, list[OperatorPatternType]]rê   )FFFi€ÿÿÿé   i�ÿÿÿrî   )rN   r‹   rM   r‹   rb   r‹   rk   Úintrl   rï   rm   rï   rn   rï   )rŒ   r   )r–   zlist[Callable]r—   z	list[str]rŠ   zCallable[[Node], bool])9Ú
__future__r   rH   Ú	functoolsr¬   Útypingr   r   r   r   r6   Útorch._dynamoÚ_dynamor    Útorch.nn.functionalrB   Ú
functionalr0   Ú#torch.ao.quantization.fake_quantizer   r	   Útorch.ao.quantization.observerr
   r   r   r   r   r   Útorch.ao.quantization.quantizerr   r   Ú%torch.ao.quantization.quantizer.utilsr   Ú7torch.ao.quantization.quantizer.xnnpack_quantizer_utilsr   r   r   r   r   r   Útorch.fx._compatibilityr   Útorch.ao.quantization.qconfigr   Útorch.fxr   Ú__all__r)   r=   rK   rX   Ú	lru_cacher   rx   r�   r™   r   re   r*   r(   ú<module>r     s>  ðå "ã Û Û ß 9Ó 9ã Ý #ß Ð ÷÷÷ ÷ HÝ I÷÷ õ 2ñ ÝPÝð Ø'ð€óó-ó.ó(9ð  ×Ñà ØØØØØØðRØðRàðRð ðRð ð	Rð
 ðRð ðRð òRó ðRój;óðB	*Øð	*Ø/8ð	*àó	*ñ  eÔ,ôN2�yó N2ó -ñN2r*   