
    ёi                     n    S SK r S SKrS SKJr  S SKJrJr  SSKJr  SSK	J
r
   " S S\ R                  S	9rg)
    N)Layer)ConvertibleQuantedLayerLinearQuanterDequanter   )BaseQuanter)QuantConfigc                       \ rS rSrSrS\4S jr\R                  SS\	4S jj5       r
SS\	4S jjrS\	S\4S jrS\	S\4S	 jrS
 rS rS rSrg)Quantization   z
Abstract class used to prepares a copy of the model for quantization calibration or quantization-aware training.
Args:
    config(QuantConfig): Quantization configuration
configc                 :    [         R                  " U5      U l        g N)copydeepcopy_config)selfr   s     \/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/quantization/quantize.py__init__Quantization.__init__#   s    }}V,    modelc                     g)zMCreate a model for quantization-aware training or post-training quantization.N )r   r   inplaces      r   quantizeQuantization.quantize&   s     	r   c                 >   U(       a  UO[         R                  " U5      n0 nUR                  5        H  u  pgSn[        U[        5      (       a^  UR
                  (       a  M/  [        US5      (       a*  UR                  b  UR                  R                  5       c  Mj  UR                  US9  O=[        U[        5      (       a  [        R                  " U5      nOU R                  USUS9  Uc  M  XU'   M     UR                  5        H  u  pXR                  U	'   M     U$ )aX  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'   Quantization.convert+   s    6 "t}}U';!002KD M%!899??5"233((0++224<];E;// 6 C CE JUDN(!.! 3" #..*JC&+s# +r   c                 2   0 nUR                  5        HZ  u  pEUR                  U5      (       a.  [        U5      UR                  ;   a  UR	                  U5      X4'   MI  U R                  XR5        M\     UR                  5        H  u  pgXqR                  U'   M     g r   )r    _is_quantifiabletypeqat_layer_mappings_get_qat_layer_convert_to_quant_layersr(   r)   r   r   r   r+   r,   r-   r/   r0   s           r   r7   %Quantization._convert_to_quant_layers]   s     //1KD''..K6#<#<<!'!6!6u!=--e< 2 #..*JC%*c" +r   c                    0 nUR                  5        H  u  pEUR                  U5      (       a  UR                  U5      X4'   M0  [        U5      UR                  R                  5       ;  d  MY  [        U5      UR                  R                  5       ;  d  M  U R                  XR5        M     UR                  5        H  u  pgXqR                  U'   M     g r   )
r    _need_observe_get_observe_wrapperr4   _qat_layer_mappingvalues_customized_qat_layer_mapping_insert_activation_observersr(   r)   r8   s           r   r@   )Quantization._insert_activation_observersj   s     //1KD##E**!'!<!<U!C Kv'@'@'G'G'IIU!??FFHI 55eD 2 #..*JC%*c" +r   c                 6    U R                   R                  5       $ r   )r   detailsr   s    r   _detailsQuantization._detailsy   s    ||##%%r   c                 "    U R                  5       $ r   )rE   rD   s    r   __str__Quantization.__str__|   s    }}r   c                 "    U R                  5       $ r   )rH   rD   s    r   __repr__Quantization.__repr__   s    ||~r   )r   N)F)FF)__name__
__module____qualname____firstlineno____doc__r   r   abcabstractmethodr   r   r'   r7   r@   rE   rH   rK   __static_attributes__r   r   r   r
   r
      sv    -{ - 	e  0U 0d+e +[ ++% + +&r   r
   )	metaclass)rR   r   	paddle.nnr   paddle.nn.quant.formatr   r   base_quanterr   r   r   ABCMetar
   r   r   r   <module>rZ      s/      
 & dS[[ dr   