Ë
    –\;j:  ã                   ót   — 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 ddl	m
Z
  G d„ de j                  ¬	«      Zy)
é    N)ÚLayer)ÚConvertibleQuantedLayerÚLinearQuanterDequanteré   )ÚBaseQuanter)ÚQuantConfigc                   óˆ   — e Zd ZdZdefd„Zej                  ddefd„«       Z	ddefd„Z
dedefd„Zdedefd„Zd	„ Zd
„ Zd„ Zy)ÚQuantizationz½
    Abstract class used to prepares a copy of the model for quantization calibration or quantization-aware training.

    Args:
        config(QuantConfig): Quantization configuration
    Úconfigc                 ó8   — t        j                  |«      | _        y ©N)ÚcopyÚdeepcopyÚ_config)Úselfr   s     úeG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/quantization/quantize.pyÚ__init__zQuantization.__init__$   s   € Ü—}‘} VÓ,ˆ�ó    Úmodelc                  ó   — y)zMCreate a model for quantization-aware training or post-training quantization.N© )r   r   Úinplaces      r   ÚquantizezQuantization.quantize'   s   € ð 	r   c                 óð  — |r|nt        j                  |«      }i }|j                  «       D ]   \  }}d}t        |t        «      rG|j
                  rŒ%|j                  �|j                  j                  «       €ŒL|j                  |¬«       n:t        |t        «      rt        j                  |«      }n| j                  |d|¬«       |€Œœ|||<   Œ¢ |j                  «       D ]  \  }	}
|
|j                  |	<   Œ |S )a  Convert the quantization model to ONNX style. And the converted
        model can be saved as inference model by calling paddle.jit.save.

        Args:
            model(Layer): The quantized model to be converted.
            inplace(bool, optional): Whether to modify the model in-place, default is False.
            remain_weight(bool, optional): Whether to remain weights in floats, default is False.

        Return: The converted model

        Examples:
            .. code-block:: python

                >>> import paddle
                >>> from paddle.quantization import QAT, QuantConfig
                >>> from paddle.quantization.quanters import FakeQuanterWithAbsMaxObserver
                >>> from paddle.vision.models import LeNet

                >>> quanter = FakeQuanterWithAbsMaxObserver(moving_rate=0.9)
                >>> q_config = QuantConfig(activation=quanter, weight=quanter)
                >>> qat = QAT(q_config)
                >>> model = LeNet()
                >>> quantized_model = qat.quantize(model)
                >>> converted_model = qat.convert(quantized_model)
                >>> dummy_data = paddle.rand([1, 1, 32, 32], dtype="float32")
                >>> paddle.jit.save(converted_model, "./quant_deploy", [dummy_data])
        N)Úremain_weightT)r   r   )r   r   Únamed_childrenÚ
isinstancer   Ú	convertedÚweight_quanterÚscalesÚ_convertr   r   Úfrom_quanterÚconvertÚitemsÚ_sub_layers)r   r   r   r   Ú_modelÚreplacedÚnameÚchildÚquant_dequantÚkeyÚvalues              r   r#   zQuantization.convert,   så   € ñ8 "‘¤t§}¡}°UÓ';ˆØˆØ!×0Ñ0Ö2‰KˆD�%Ø ˆMÜ˜%Ô!8Ô9Ø—?’?Øà×(Ñ(Ð0Ø×+Ñ+×2Ñ2Ó4Ð<àØ—‘¨]�Õ;Ü˜E¤;Ô/Ü 6× CÑ CÀEÓ J‘à—‘˜U¨DÀ�ÔNØÑ(Ø!.�˜’ð! 3ð" #Ÿ.™.Ö*‰JˆC�Ø&+ˆF×Ñ˜sÒ#ð +àˆr   c                 ó$  — i }|j                  «       D ]T  \  }}|j                  |«      r,t        |«      |j                  v r|j	                  |«      ||<   ŒC| j                  ||«       ŒV |j                  «       D ]  \  }}||j                  |<   Œ y r   )r   Ú_is_quantifiableÚtypeÚqat_layer_mappingsÚ_get_qat_layerÚ_convert_to_quant_layersr$   r%   ©r   r   r   r'   r(   r)   r+   r,   s           r   r2   z%Quantization._convert_to_quant_layers_   s‰   € ØˆØ ×/Ñ/Ö1‰KˆD�%à×'Ñ'¨Ô.Ü˜“K 6×#<Ñ#<Ñ<à!'×!6Ñ!6°uÓ!=�˜’à×-Ñ-¨e°VÕ<ð 2ð #Ÿ.™.Ö*‰JˆC�Ø%*ˆE×Ñ˜cÒ"ñ +r   c                 óö   — i }|j                  «       D ]=  \  }}|j                  |«      r|j                  |«      ||<   Œ,| j                  ||«       Œ? |j	                  «       D ]  \  }}||j
                  |<   Œ y r   )r   Ú_need_observeÚ_get_observe_wrapperÚ_insert_activation_observersr$   r%   r3   s           r   r7   z)Quantization._insert_activation_observersl   sw   € ØˆØ ×/Ñ/Ö1‰KˆD�%Ø×#Ñ# EÔ*Ø!'×!<Ñ!<¸UÓ!C�˜’à×1Ñ1°%¸Õ@ð	 2ð
 #Ÿ.™.Ö*‰JˆC�Ø%*ˆE×Ñ˜cÒ"ñ +r   c                 ó6   — | j                   j                  «       S r   )r   Údetails©r   s    r   Ú_detailszQuantization._detailsv   s   € Ø�|‰|×#Ñ#Ó%Ð%r   c                 ó"   — | j                  «       S r   )r;   r:   s    r   Ú__str__zQuantization.__str__y   s   € Ø�}‰}‹Ðr   c                 ó"   — | j                  «       S r   )r=   r:   s    r   Ú__repr__zQuantization.__repr__|   s   € Ø�|‰|‹~Ðr   N)F)FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚabcÚabstractmethodr   r   r#   r2   r7   r;   r=   r?   r   r   r   r
   r
      sv   „ ñð-˜{ó -ð 	×Ññ˜eò ó ðñ1˜Uó 1ðf+¨eð +¸[ó +ð+°%ð +Àó +ò&òór   r
   )Ú	metaclass)rD   r   Ú	paddle.nnr   Úpaddle.nn.quant.formatr   r   Úbase_quanterr   r   r   ÚABCMetar
   r   r   r   Ú<module>rK      s/   ðó Û å ÷õ
 &Ý ôa˜SŸ[™[ö ar   