U
    <ºc3  ã                   @   sd   d dl Z d dlm  m  mZ d dlm  m  mZ d dl	m  m
Z G dd„ dejejƒZdS )é    Nc                       sH   e Zd ZdZejZd‡ fdd„	Zdd„ Ze	‡ fdd	„ƒZ
d
d„ Z‡  ZS )Ú
LinearReLUa_  
    A LinearReLU module fused from Linear and ReLU modules, attached with
    FakeQuantize modules for weight, used in
    quantization aware training.

    We adopt the same interface as :class:`torch.nn.Linear`.

    Similar to `torch.nn.intrinsic.LinearReLU`, with FakeQuantize modules initialized to
    default.

    Attributes:
        weight: fake quant module for weight

    Examples::

        >>> # xdoctest: +SKIP
        >>> m = nn.qat.LinearReLU(20, 30)
        >>> input = torch.randn(128, 20)
        >>> output = m(input)
        >>> print(output.size())
        torch.Size([128, 30])
    TNc                    s   t t| ƒ ||||¡ d S ©N)Úsuperr   Ú__init__)ÚselfÚin_featuresÚout_featuresÚbiasZqconfig©Ú	__class__© úN/tmp/pip-unpacked-wheel-gikjz4vx/torch/nn/intrinsic/qat/modules/linear_relu.pyr      s    zLinearReLU.__init__c                 C   s   t  t  ||  | j¡| j¡¡S r   )ÚFÚreluÚlinearZweight_fake_quantÚweightr	   )r   Úinputr   r   r   Úforward#   s    zLinearReLU.forwardc                    s   t t| ƒ |¡S r   )r   r   Ú
from_float)ÚclsÚmodr
   r   r   r   &   s    zLinearReLU.from_floatc                 C   sf   t j | j| j| jd k	¡}t j | j ¡ ¡|_| jd k	rLt j | j ¡ ¡|_t j 	¡ }t jj
 ||¡S r   )ÚtorchÚnnÚLinearr   r   r	   Ú	Parameterr   ÚdetachZReLUÚ	intrinsicr   )r   r   r   r   r   r   Úto_float*   s    

zLinearReLU.to_float)TN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únnir   Z_FLOAT_MODULEr   r   Úclassmethodr   r   Ú__classcell__r   r   r
   r   r      s     ÿr   )r   Ztorch.ao.nn.qatZaor   ZqatZnnqatZtorch.ao.nn.intrinsicr   r"   Ztorch.nn.functionalZ
functionalr   r   Z_FusedModuler   r   r   r   r   Ú<module>   s   