
    |j                     r    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dS )
    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dS )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        |          | _        d S N)copydeepcopy_config)selfr   s     l/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/quantization/quantize.py__init__zQuantization.__init__#   s    }V,,    Fmodelc                     dS )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 }|                                D ]\  }}d}t          |t                    rP|j        r$t          |d          r!|j        |j                                        U|	                    |           nBt          |t                    rt          j        |          }n|                     |d|           ||||<   |                                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weight_quanter)remain_weightT)r   r   )r   r   named_children
isinstancer   	convertedhasattrr   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+   s0   6 ";t}U';';!0022 	/ 	/KD% M%!899 O? 5"233 (0+2244<];;;;E;// O 6 CE J JUDNNN(!."..** 	, 	,JC&+Fs##r   c                 :   i }|                                 D ]_\  }}|                    |          r/t          |          |j        v r|                    |          ||<   I|                     ||           `|                                D ]\  }}||j        |<   d S 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   r3   z%Quantization._convert_to_quant_layers]   s     //11 	= 	=KD%''..=KK6#<<<!'!6!6u!=!=--eV<<<<"..** 	+ 	+JC%*Ec""	+ 	+r   c                    i }|                                 D ]\  }}|                    |          r|                    |          ||<   3t          |          |j                                        vr>t          |          |j                                        vr|                     ||           |                                D ]\  }}||j	        |<   d S r   )
r   _need_observe_get_observe_wrapperr0   _qat_layer_mappingvalues_customized_qat_layer_mapping_insert_activation_observersr%   r&   r4   s           r   r;   z)Quantization._insert_activation_observersj   s     //11 		E 		EKD%##E** E!'!<!<U!C!C KKv'@'G'G'I'IIIU!?FFHHI I 55eVDDD"..** 	+ 	+JC%*Ec""	+ 	+r   c                 4    | j                                         S r   )r   detailsr   s    r   _detailszQuantization._detailsy   s    |##%%%r   c                 *    |                                  S r   )r?   r>   s    r   __str__zQuantization.__str__|   s    }}r   c                 *    |                                  S r   )rA   r>   s    r   __repr__zQuantization.__repr__   s    ||~~r   N)F)FF)__name__
__module____qualname____doc__r   r   abcabstractmethodr   r   r$   r3   r;   r?   rA   rC   r   r   r   r
   r
      s         -{ - - - - 	 e    0 0U 0 0 0 0d+e +[ + + + ++% + + + + +& & &      r   r
   )	metaclass)rH   r   	paddle.nnr   paddle.nn.quant.formatr   r   base_quanterr   r   r   ABCMetar
   r   r   r   <module>rO      s    


              
 & % % % % %      d d d d dS[ d d d d d dr   