
    %Vji                     x    d dl Z d dlmZ d dlmc mZ d dlmZ d dlm	Z	m
Z
mZ dgZ G d dej                  ZdS )    N)
LinearReLU)is_parametrized$transfer_parametrizations_and_paramstype_before_parametrizationsLinearc                   b     e Zd ZdZej        Z	 	 	 	 d
	 d fdZd Ze	dd            Z
d	 Z xZS )r   a  
    A linear module attached with FakeQuantize modules for weight,
    used for quantization aware training.

    We adopt the same interface as `torch.nn.Linear`, please see
    https://pytorch.org/docs/stable/nn.html#torch.nn.Linear
    for documentation.

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

    Attributes:
        weight: fake quant module for weight
    TNreturnc                     ||d} t                      j        |||fi | |s
J d            || _        |                    |          | _        d S )N)devicedtypez'qconfig must be provided for QAT module)factory_kwargs)super__init__qconfigweightweight_fake_quant)	selfin_featuresout_featuresbiasr   r   r   r   	__class__s	           X/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/ao/nn/qat/modules/linear.pyr   zLinear.__init__"   sl     %+U;;lDKKNKKKAAAAAw!(~!N!N    c                 h    t          j        ||                     | j                  | j                  S N)Flinearr   r   r   )r   inputs     r   forwardzLinear.forward1   s(    xt55dkBBDINNNr   Fc                    t          |          | j        k    s"J d| j        z   dz   | j        j        z               t          |d          s
J d            |j        s
J d            t          |          t
          k    r|d         }|j        } | |j        |j        |j        du|          }t          |d	          rt          ||d	           n|j        |_        t          |d
          rt          ||d
           n|j        |_        |S )zCreate a qat module from a float module or qparams_dict
        Args: `mod` a float module, either produced by torch.ao.quantization utilities
        or directly from user
        z qat.z.from_float only works for r   z,Input float module must have qconfig definedz,Input float module must have a valid qconfigr   N)r   r   r   r   )r   _FLOAT_MODULE__name__hasattrr   r   r   r   r   r   r   r   )clsmoduse_precomputed_fake_quantr   
qat_linears        r   
from_floatzLinear.from_float4   s?    ,C00C4EEEEl+, () FEE sI&&VV(VVV&{JJJJJ{',,
::a&C+SO%	
 
 

 3)) 	+0j(KKKK #
J3'' 	'0j&IIII!hJOr   c                    t           j                            | j        | j        | j        d u          }t           j                            | j                                                  |_        | j        ;t           j                            | j                                                  |_        |	                    | j
                   |S r   )torchnnr   r   r   r   	Parameterr   detachtraintraining)r   r   s     r   to_floatzLinear.to_floatY   s    d/$1F
 
 **4;+=+=+?+?@@9 (,,TY-=-=-?-?@@FKT]###r   )TNNN)r	   N)F)r"   
__module____qualname____doc__r+   r   r!   r   r   classmethodr(   r0   __classcell__)r   s   @r   r   r      s          IM O 
O O O O O OO O O " " " ["H      r   )r*   torch.nnr+   torch.nn.functional
functionalr   torch.ao.nn.intrinsicr   torch.nn.utils.parametrizer   r   r   __all__r    r   r   <module>r=      s                    , , , , , ,          *Q Q Q Q QRY Q Q Q Q Qr   