U
    Kc4                     @   s  d dl Z d dlmZ d dlm  mZ d dlmZmZm	Z	m
Z
 d dlmZ ddlmZ dddd	d
dgZG dd de jjjjeZG dd deejZG dd deejZG dd deejZG dd dee jjjjZG dd	 d	eejZG dd
 d
eejZG dd deejZdS )    N)OptionalDictAnyList)	_size_1_t   )ReferenceQuantizedModuleConv1dConv2dConv3dConvTranspose1dConvTranspose2dConvTranspose3dc                   @   s.   e Zd ZdZdeej iZdZe	dd Z
dS )_ConvNda,   A reference version of nn.quantized.Conv2d
        we will not pack the parameters in this module, since weight packing is an
        optimization for quantized backends supported in PyTorch (fbgemm/qnnpack),
        this is useful when user want to use this module in other backends like Glow.
    biasTc                 C   st   | |j |j|j|j|j|j|j|jd k	|j|j	j
|j	j|d}tj|j	 |_	|jd k	rptj|j |_|S N)devicedtypeweight_qparams)in_channelsout_channelskernel_sizestridepaddingdilationgroupsr   padding_modeweightr   r   torchnn	Parameterdetachcls
float_convr   Z	qref_conv r%   P/tmp/pip-unpacked-wheel-gikjz4vx/torch/ao/nn/quantized/reference/modules/conv.py
from_float   s$    
z_ConvNd.from_floatN)__name__
__module____qualname____doc__r   r   Tensor__annotations__Z_IS_REFERENCEstaticmethodr'   r%   r%   r%   r&   r   
   s
   r   c                   @   sb   e Zd Zdeeeeeeeeeeeee	f  d
ddZ
ejejd	d
dZdd Zedd ZdS )r	   r   r   TzerosN)
r   r   r   r   r   r   r   r   r   r   c                 C   s2   t j| |||||||||	|
| | ||
 d S N)r   r	   __init___init_weight_qparamsselfr   r   r   r   r   r   r   r   r   r   r   r   r%   r%   r&   r1   (   s              zConv1d.__init__xreturnc              	   C   s,   |   }t||| j| j| j| j| j}|S )aR  
        we have:
        w(float) -- quant - dequant         x(float) ------------- F.conv1d ---

        In the full model, we will see
        w(float) -- quant - *dequant         x -- quant --- *dequant --  *F.conv1d --- *quant - dequant
        and the backend should be able to fuse the ops with `*` into a quantized conv1d
        )
get_weightFZconv1dr   r   r   r   r   r4   r6   weight_quant_dequantresultr%   r%   r&   forward:   s         zConv1d.forwardc                 C   s   dS )NzQuantizedConv1d(Reference)r%   r4   r%   r%   r&   	_get_nameK   s    zConv1d._get_namec                 C   s   t | ||S r0   r   r'   r#   r$   r   r%   r%   r&   r'   N   s    zConv1d.from_float)	r   r   r   r   Tr/   NNN)r(   r)   r*   intr   boolstrr   r   r   r1   r   r,   r=   r?   classmethodr'   r%   r%   r%   r&   r	   '   s2            c                	   @   sP   e Zd Zdeeeef  dddZej	ej	d	d
dZ
dd Zedd ZdS )r
   r   r   Tr/   Nr   c                 C   s2   t j| |||||||||	|
| | ||
 d S r0   )r   r
   r1   r2   r3   r%   r%   r&   r1   S   s              zConv2d.__init__r5   c              	   C   s,   |   }t||| j| j| j| j| j}|S )aR  
        we have:
        w(float) -- quant - dequant         x(float) ------------- F.conv2d ---

        In the full model, we will see
        w(float) -- quant - *dequant         x -- quant --- *dequant --  *F.conv2d --- *quant - dequant
        and the backend should be able to fuse the ops with `*` into a quantized conv2d
        )r8   r9   Zconv2dr   r   r   r   r   r:   r%   r%   r&   r=   ^   s         zConv2d.forwardc                 C   s   dS )NzQuantizedConv2d(Reference)r%   r>   r%   r%   r&   r?   o   s    zConv2d._get_namec                 C   s   t | ||S r0   r@   rA   r%   r%   r&   r'   r   s    zConv2d.from_float)	r   r   r   r   Tr/   NNNr(   r)   r*   r   r   rD   r   r1   r   r,   r=   r?   rE   r'   r%   r%   r%   r&   r
   R   s                c                	   @   sP   e Zd Zdeeeef  dddZej	ej	d	d
dZ
dd Zedd ZdS )r   r   r   Tr/   NrF   c                 C   s2   t j| |||||||||	|
| | ||
 d S r0   )r   r   r1   r2   r3   r%   r%   r&   r1   w   s              zConv3d.__init__r5   c              	   C   s,   |   }t||| j| j| j| j| j}|S )aR  
        we have:
        w(float) -- quant - dequant         x(float) ------------- F.conv3d ---

        In the full model, we will see
        w(float) -- quant - *dequant         x -- quant --- *dequant --  *F.conv3d --- *quant - dequant
        and the backend should be able to fuse the ops with `*` into a quantized conv3d
        )r8   r9   Zconv3dr   r   r   r   r   r:   r%   r%   r&   r=      s         zConv3d.forwardc                 C   s   dS )NzQuantizedConv3d(Reference)r%   r>   r%   r%   r&   r?      s    zConv3d._get_namec                 C   s   t | ||S r0   r@   rA   r%   r%   r&   r'      s    zConv3d.from_float)	r   r   r   r   Tr/   NNNrG   r%   r%   r%   r&   r   v   s                c                   @   s   e Zd ZdZedd ZdS )_ConvTransposeNda5   A reference version of nn.quantized.ConvTranspose2d
        we will not pack the parameters in this module, since weight packing is an
        optimization for quantized backends supported in PyTorch (fbgemm/qnnpack),
        this is useful when user want to use this module in other backends like Glow.
    c                 C   sx   | |j |j|j|j|j|j|j|jd k	|j|j	|j
j|j
j|d}tj|j
 |_
|jd k	rttj|j |_|S r   )r   r   r   r   r   output_paddingr   r   r   r   r   r   r   r   r   r    r!   r"   r%   r%   r&   r'      s&    
z_ConvTransposeNd.from_floatN)r(   r)   r*   r+   r.   r'   r%   r%   r%   r&   rH      s   rH   c                   @   sp   e Zd Zdeeeeeeeeeeeeee	f  dddZ
dejeee  ejd	d
dZdd Zedd ZdS )r   r   r   Tr/   N)r   r   r   r   r   rI   r   r   r   r   r   c                 C   s4   t j| |||||||||	|
|| | || d S r0   )r   r   r1   r2   r4   r   r   r   r   r   rI   r   r   r   r   r   r   r   r%   r%   r&   r1      s                zConvTranspose1d.__init__r6   output_sizer7   c              
   C   sZ   t | jtst| t|| j| j| j| j}| 	 }t
||| j| j| j|| j| j}|S )ac  
        we have:
        w(float) -- quant - dequant         x(float) ------------- F.convTranspose1d ---
        In the full model, we will see
        w(float) -- quant - *dequant         x -- quant --- *dequant --  *F.convTranspose1d --- *quant - dequant
        and the backend should be able to fuse the ops with `*` into a quantized conv1d
        )
isinstancer   tupleAssertionError_output_paddinginputr   r   r   r8   r9   Zconv_transpose1dr   r   r4   r6   rL   rI   r;   r<   r%   r%   r&   r=      s*               zConvTranspose1d.forwardc                 C   s   dS )Nz#QuantizedConvTranspose1d(Reference)r%   r>   r%   r%   r&   r?      s    zConvTranspose1d._get_namec                 C   s   t | ||S r0   rH   r'   rA   r%   r%   r&   r'      s    zConvTranspose1d.from_float)
r   r   r   r   Tr   r/   NNN)N)r(   r)   r*   rB   r   rC   rD   r   r   r   r1   r   r,   r   r=   r?   rE   r'   r%   r%   r%   r&   r      s6              c                
   @   s\   e Zd Zdeeeef  dddZdej	ee
e  ej	d	d
dZdd Zedd ZdS )r   r   r   Tr/   NrF   c                 C   s4   t j| |||||||||	|
|| | || d S r0   )r   r   r1   r2   rJ   r%   r%   r&   r1      s                zConvTranspose2d.__init__rK   c              
   C   sZ   t | jtst| t|| j| j| j| j}| 	 }t
||| j| j| j|| j| j}|S )ac  
        we have:
        w(float) -- quant - dequant         x(float) ------------- F.convTranspose2d ---
        In the full model, we will see
        w(float) -- quant - *dequant         x -- quant --- *dequant --  *F.convTranspose2d --- *quant - dequant
        and the backend should be able to fuse the ops with `*` into a quantized conv2d
        )rM   r   rN   rO   rP   rQ   r   r   r   r8   r9   Zconv_transpose2dr   r   rR   r%   r%   r&   r=      s*    
           zConvTranspose2d.forwardc                 C   s   dS )Nz#QuantizedConvTranspose2d(Reference)r%   r>   r%   r%   r&   r?     s    zConvTranspose2d._get_namec                 C   s   t | ||S r0   rS   rA   r%   r%   r&   r'     s    zConvTranspose2d.from_float)
r   r   r   r   Tr   r/   NNN)Nr(   r)   r*   r   r   rD   r   r1   r   r,   r   rB   r=   r?   rE   r'   r%   r%   r%   r&   r      s"                 c                
   @   s\   e Zd Zdeeeef  dddZdej	ee
e  ej	d	d
dZdd Zedd ZdS )r   r   r   Tr/   NrF   c                 C   s4   t j| |||||||||	|
|| | || d S r0   )r   r   r1   r2   rJ   r%   r%   r&   r1     s                zConvTranspose3d.__init__rK   c              
   C   sZ   t | jtst| t|| j| j| j| j}| 	 }t
||| j| j| j|| j| j}|S )ac  
        we have:
        w(float) -- quant - dequant         x(float) ------------- F.convTranspose3d ---
        In the full model, we will see
        w(float) -- quant - *dequant         x -- quant --- *dequant --  *F.convTranspose3d --- *quant - dequant
        and the backend should be able to fuse the ops with `*` into a quantized conv3d
        )rM   r   rN   rO   rP   rQ   r   r   r   r8   r9   Zconv_transpose3dr   r   rR   r%   r%   r&   r=   "  s*               zConvTranspose3d.forwardc                 C   s   dS )Nz#QuantizedConvTranspose3d(Reference)r%   r>   r%   r%   r&   r?   9  s    zConvTranspose3d._get_namec                 C   s   t | ||S r0   rS   rA   r%   r%   r&   r'   <  s    zConvTranspose3d.from_float)
r   r   r   r   Tr   r/   NNN)NrT   r%   r%   r%   r&   r     s"                 )r   Ztorch.nnr   Ztorch.nn.functionalZ
functionalr9   typingr   r   r   r   Ztorch.nn.common_typesr   utilsr   __all__modulesconvr   r	   r
   r   rH   r   r   r   r%   r%   r%   r&   <module>   s   +$$2-