o
    #j                     @   s\   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 de jd	ZdS )
    N)Layer)ConvertibleQuantedLayerLinearQuanterDequanter   )BaseQuanter)QuantConfigc                   @   s   e Zd ZdZdefddZejddefddZ	ddefd	d
Z
dedefddZdedefddZdd Zdd Zd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                 C   s   t || _d S N)copydeepcopy_config)selfr	    r   ]/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/quantization/quantize.py__init__$   s   zQuantization.__init__Fmodelc                 C   s   dS )zMCreate a model for quantization-aware training or post-training quantization.Nr   )r   r   inplacer   r   r   quantize'   s   zQuantization.quantizec                 C   s   |r|nt |}i }| D ]>\}}d}t|tr2|jrq|jdu s*|j du r+q|j|d nt|t	r=t
|}n| j|d|d |durM|||< q| D ]	\}	}
|
|j|	< qR|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   Z	convertedZweight_quanterscales_convertr   r   Zfrom_quanterconvertitems_sub_layers)r   r   r   r   Z_modelreplacednamechildZquant_dequantkeyvaluer   r   r   r   ,   s(   


zQuantization.convertc                 C   sj   i }|  D ]\}}||rt||jv r||||< q| || q| D ]	\}}||j|< q)d S r
   )r   Z_is_quantifiabletypeZqat_layer_mappingsZ_get_qat_layer_convert_to_quant_layersr   r   r   r   r	   r   r   r   r    r!   r   r   r   r#   _   s   z%Quantization._convert_to_quant_layersc                 C   s\   i }|  D ]\}}||r||||< q| || q| D ]	\}}||j|< q"d S r
   )r   Z_need_observeZ_get_observe_wrapper_insert_activation_observersr   r   r$   r   r   r   r%   l   s   
z)Quantization._insert_activation_observersc                 C   s
   | j  S r
   )r   detailsr   r   r   r   _detailsv   s   
zQuantization._detailsc                 C      |   S r
   )r(   r'   r   r   r   __str__y      zQuantization.__str__c                 C   r)   r
   )r*   r'   r   r   r   __repr__|   r+   zQuantization.__repr__N)F)FF)__name__
__module____qualname____doc__r   r   abcabstractmethodr   r   r   r#   r%   r(   r*   r,   r   r   r   r   r      s    3
r   )	metaclass)r1   r   Z	paddle.nnr   Zpaddle.nn.quant.formatr   r   Zbase_quanterr   r	   r   ABCMetar   r   r   r   r   <module>   s   