ó
    Eñi�  ã                   óz   • S SK r S SKJr  S SKJs  Jr  S SKJr  S SKJ	r	J
r
Jr  S/r " S S\R                  5      rg)é    N)Ú
LinearReLU)Úis_parametrizedÚ$transfer_parametrizations_and_paramsÚtype_before_parametrizationsÚLinearc                   óv   ^ • \ rS rSrSr\R                  r    S S	U 4S jjjrS r	\
S
S j5       rS rSrU =r$ )r   é   av  
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
c                 óŠ   >• XVS.n[         TU ]  " XU40 UD6  U(       d  [        S5      eX@l        UR	                  US9U l        g )N)ÚdeviceÚdtypez'qconfig must be provided for QAT module)Úfactory_kwargs)ÚsuperÚ__init__ÚAssertionErrorÚqconfigÚweightÚweight_fake_quant)	ÚselfÚin_featuresÚout_featuresÚbiasr   r   r   r   Ú	__class__s	           €Ú[/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/ao/nn/qat/modules/linear.pyr   ÚLinear.__init__"   sH   ø€ ð %+Ñ;ˆÜ‰Ò˜°DÑK¸NÒKÞÜ Ð!JÓKÐKØŒØ!(§¡¸~ Ð!NˆÕó    c                 óv   • [         R                  " XR                  U R                  5      U R                  5      $ ©N)ÚFÚlinearr   r   r   )r   Úinputs     r   ÚforwardÚLinear.forward2   s&   € Ü�xŠx˜×5Ñ5°d·k±kÓBÀDÇIÁIÓNÐNr   c           
      óŠ  • [        U5      U R                  :w  aE  [        SU R                   SU R                  R                   S[        U5      R                   35      e[	        US5      (       d  [        S5      eUR
                  (       d  [        S5      e[        U5      [        :X  a  US   nUR
                  nU " UR                  UR                  UR                  SLUS	9n[        US
5      (       a  [        XS
5        OUR                  Ul        [        US5      (       a  [        XS5        U$ UR                  Ul	        U$ )z�Create 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 z, got r   z,Input float module must have qconfig definedz,Input float module must have a valid qconfigr   N)r   r   r   r   )r   Ú_FLOAT_MODULEr   Ú__name__Úhasattrr   r   r   r   r   r   r   r   )ÚclsÚmodÚuse_precomputed_fake_quantr   Ú
qat_linears        r   Ú
from_floatÚLinear.from_float5   s+  € ô (¨Ó,°×0AÑ0AÓAÜ Ø�s—|‘|�nÐ$?Ø×$Ñ$×-Ñ-Ð.¨fÔ5QÐRUÓ5V×5_Ñ5_Ð4`ðbóð ô �s˜I×&Ñ&Ü Ð!OÓPÐPØ�{�{Ü Ð!OÓPÐPÜ'¨Ó,´
Ó:Ø�a‘&ˆCà—+‘+ˆÙØ�O‰OØ×ÑØ—‘ Ð%Øñ	
ˆ
ô ˜3 ×)Ñ)Ü0°À(ÕKà #§
¡
ˆJÔä˜3 ×'Ñ'Ü0°À&ÔIð Ðð "Ÿh™hˆJŒOàÐr   c                 óÈ  • [         R                  R                  U R                  U R                  U R
                  S L5      n[         R                  R                  U R                  R                  5       5      Ul        U R
                  b<  [         R                  R                  U R
                  R                  5       5      Ul        UR                  U R                  5        U$ r   )ÚtorchÚnnr   r   r   r   Ú	Parameterr   ÚdetachÚtrainÚtraining)r   r   s     r   Úto_floatÚLinear.to_float[   s—   € Ü—‘—‘Ø×Ñ˜d×/Ñ/°·±À$Ð1Fó
ˆô Ÿ™×*Ñ*¨4¯;©;×+=Ñ+=Ó+?Ó@ˆŒØ�9‰9Ñ ÜŸ(™(×,Ñ,¨T¯Y©Y×-=Ñ-=Ó-?Ó@ˆFŒKØ�‰�T—]‘]Ô#Øˆr   )r   r   )TNNN)ÚreturnN)F)r%   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r/   r   r$   r   r!   Úclassmethodr+   r4   Ú__static_attributes__Ú__classcell__)r   s   @r   r   r      s]   ø† ñð —I‘I€Mð ØØØðOð 
÷Oð Oò Oð ó#ó ð#÷Jð r   )r.   Útorch.nnr/   Útorch.nn.functionalÚ
functionalr   Útorch.ao.nn.intrinsicr   Útorch.nn.utils.parametrizer   r   r   Ú__all__r   © r   r   Ú<module>rE      s9   ðã Ý ß Ð Ý ,÷ñ ð ˆ*€ôSˆR�Y‰Yõ Sr   