o
    pi                     @   s<   d Z ddlmZ ddlmZ ddlmZ G dd deZd	S )
z
Layers used for QAT.
    )
functional   )Layer   )ConvertibleQuantedLayerc                       sF   e Zd ZdZdef fddZdd Zdd Zd	d
 Zdd Z	  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                    s   t    |j| _|j| _|j| _|j| _| jdkr|j| _|j| _|j| _|j	| _	|j
| _
d | _d | _|j	d ur@|j	|| _|jd urN|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_quanterZ	_instanceZ
activation)selfr   Zq_config	__class__ _/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/nn/quant/qat/conv.pyr      s&   



zQuantedConv2D.__init__c                 C   s@   |}| j }| jd ur| |}| jd ur| | j }| ||S )N)r   r   r   _conv_forward)r   inputZquant_inputZquant_weightr   r   r   forward6   s   


zQuantedConv2D.forwardc              
   C   sN   | j dkrtj|| j| j | jd}d| _tj||| j| j| j| j	| j
| jdS )Nr	   )modedata_formatr   )r   paddingZstrideZdilationgroupsr    )r   Fpadr   r   r   Zconv2dr   r   r   r   )r   Zinputsweightsr   r   r   r   ?   s$   
zQuantedConv2D._conv_forwardc                 C      dgS )N)r   r   r   r   r   r   r   weights_to_quantersT      z!QuantedConv2D.weights_to_quantersc                 C   r&   )Nr   r   r'   r   r   r   activation_quantersW   r)   z!QuantedConv2D.activation_quanters)__name__
__module____qualname____doc__r   r   r   r   r(   r*   __classcell__r   r   r   r   r      s    	r   N)	r.   Z	paddle.nnr   r#   Zlayer.layersr   formatr   r   r   r   r   r   <module>   s
   