
    {-j                     J    d Z ddlmZ ddlmZ ddlmZ  G d de          Zd	S )
z
Layers used for QAT.
    )
functional   )Layer   )ConvertibleQuantedLayerc                   @     e Zd ZdZdef fdZd Zd Zd Zd Z	 xZ
S )QuantedConv2Dz
    The computational logic of QuantizedConv2D is the same as Conv2D.
    The only difference is that its inputs are all fake quantized.
    layerc                    t                                                       |j        | _        |j        | _        |j        | _        |j        | _        | j        dk    r|j        | _        |j        | _        |j        | _        |j	        | _	        |j
        | _
        d | _        d | _        |j	        |j	                            |          | _        |j        !|j                            |          | _        d S d S )Nzeros)super__init___groups_stride_padding_padding_mode _reversed_padding_repeated_twice	_dilation_data_formatweightbiasweight_quanteractivation_quanter	_instance
activation)selfr
   q_config	__class__s      X/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/nn/quant/qat/conv.pyr   zQuantedConv2D.__init__   s     }}"0((6 1 !.lJ	""&?&"*/";";E"B"BD*&.&9&C&CE&J&JD### +*    c                     |}| j         }| j        |                     |          }| j        |                     | j                   }|                     ||          S )N)r   r   r   _conv_forward)r   inputquant_inputquant_weights       r   forwardzQuantedConv2D.forward6   s^    {".11%88K*..t{;;L!!+|<<<r    c           
          | j         dk    r.t          j        || j        | j         | j                  }d| _        t          j        ||| j        | j        | j        | j	        | j
        | j                  S )Nr   )modedata_formatr   )r   paddingstridedilationgroupsr)   )r   Fpadr   r   r   conv2dr   r   r   r   )r   inputsweightss      r   r"   zQuantedConv2D._conv_forward?   s    ((U5' -	  F DMxM<^<)	
 	
 	
 		
r    c                     dgS )N)r   r    r   s    r   weights_to_quantersz!QuantedConv2D.weights_to_quantersT   s    ,--r    c                     dgS )Nr   r4   r5   s    r   activation_quantersz!QuantedConv2D.activation_quantersW   s    $%%r    )__name__
__module____qualname____doc__r   r   r&   r"   r6   r8   __classcell__)r   s   @r   r	   r	      s         
Ke K K K K K K0= = =
 
 
*. . .& & & & & & &r    r	   N)	r<   	paddle.nnr   r.   layer.layersr   formatr   r	   r4   r    r   <module>rA      s     & % % % % % ! ! ! ! ! ! , , , , , ,@& @& @& @& @&+ @& @& @& @& @&r    