+
    "Ý³jÇW  ã                   óò  € ^ RI HtHt ^ RIt^ RIHu Ht ^ RIH	t	H
t
 ^ RIHtHtHtHtHtHt ^ RIHtHt ^ RIHt ^ RIHt ^RIHtHtHt ^R	IHt ^R
IH t  ^RI!H"t"  ! R R]P
                  PF                  4      t$R,R R llt%R R lt& ! R R] 4      t' ! R R]'4      t( ! R R]$4      t)R R lt*R R lt+R R lt,R R lt- ! R  R!]'4      t. ! R" R#]$4      t/R$ R% lt0R& R' lt1R( R) lt2 ! R* R+]'4      t3R# )-é    )ÚAnyÚOptionalN)ÚPerGroupÚPerRow)ÚInt8DynActInt4WeightLinearÚWeightOnlyInt4LinearÚ_check_linear_int4_kÚ_replace_linear_8da4wÚ_replace_linear_int4Ú groupwise_affine_quantize_tensor)ÚTorchAODTypeÚZeroPointDomain)Úget_group_qparams_symmetric)Ú
_is_device)ÚFakeQuantizeConfigBaseÚFloat8FakeQuantizeConfigÚIntxFakeQuantizeConfig)ÚFakeQuantizerBase)ÚTwoStepQuantizer)Ú_get_qmin_qmaxc                   óŠ   a a€ ] tR t^*t oRtRV3R lV 3R llltV3R lR ltV3R lR lt]RV3R lR	 ll4       t	R
t
VtV ;t# )ÚFakeQuantizedLinearaY  
General linear layer with fake quantized weights and activations.

Specific target dtypes, granularity, schemes etc. are specified
through separate configs for weights and activations.

Example usage::

    activation_config = IntxFakeQuantizeConfig(
        dtype=torch.int8,
        granularity="per_token",
        is_symmetric=False,
    )
    weight_config = IntxFakeQuantizeConfig(
        dtype=torch.int4,
        group_size=8,
        is_symmetric=True,
    )
    fq_linear = FakeQuantizedLinear(
        16, 32, False, activation_config, weight_config,
    )
    fq_linear(torch.randn(16))
c                ó\   <€ V ^8„  d   QhRS[ RS[ RS[RS[S[,          RS[S[,          RR/# )é   Úin_featuresÚout_featuresÚbiasÚactivation_configÚweight_configÚreturnN)ÚintÚboolr   r   )ÚformatÚ__classdict__s   "€Ú`/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torchao/quantization/qat/linear.pyÚ__annotate__Ú FakeQuantizedLinear.__annotate__C   sS   ø€ ÷ '.ñ '.áð'.ñ ð'.ñ ð	'.ñ
 $Ñ$:Õ;ð'.ñ  Ñ 6Õ7ð'.ð 
ñ'.ó    c                óÞ  <€ \         S	V `  ! VVV.VO5/ VB  \        P                  P	                  R 4       Ve   \
        P                  ! V4      V n        MRV n        Ve…   \        V\        4      '       dR   \        VP                  \        4      '       d2   VP                  pVe"   W,          ^ 8w  d   \        RV: RV: R24      h\
        P                  ! V4      V n        R# RV n        R# )z,torchao.quantization.qat.FakeQuantizedLinearNzin_features (z) % group_size (z) must be == 0)ÚsuperÚ__init__ÚtorchÚ_CÚ_log_api_usage_oncer   Úfrom_configÚactivation_fake_quantizerÚ
isinstancer   Úgranularityr   Ú
group_sizeÚ
ValueErrorÚweight_fake_quantizer)
Úselfr   r   r   r   r   ÚargsÚkwargsr3   Ú	__class__s
   &&&&&&*, €r%   r+   ÚFakeQuantizedLinear.__init__C   sê   ø€ ô 	‰ÒØØØð	
ð ò		
ð
 ò	
ô 	�‰×$Ñ$Ð%SÔTàÒ(Ü->×-JÒ-JØ!ó.ˆDÕ*ð .2ˆDÔ*ð Ò$Ü˜-Ô)?×@Ò@ÄZØ×)Ñ)¬8÷Fò Fð +×5Ñ5�
ØÒ)¨kÕ.FÈ!Ô.KÝ$ã&«
ð4óð ô *;×)FÒ)FÀ}Ó)UˆDÖ&à)-ˆDÖ&r(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# )r   Úxr    )r,   ÚTensor)r#   r$   s   "€r%   r&   r'   l   s#   ø€ ÷ )ñ )™Ÿ™ð )©%¯,©,ñ )r(   c                óî   € V P                   e   V P                  V4      pV P                  e   V P                  V P                  4      pMV P                  p\        P                  ! WV P
                  4      # ©N)r0   r5   ÚweightÚFÚlinearr   )r6   r<   Úws   && r%   ÚforwardÚFakeQuantizedLinear.forwardl   s\   € Ø×)Ñ)Ò5Ø×.Ñ.¨qÓ1ˆAØ×%Ñ%Ò1Ø×*Ñ*¨4¯;©;Ó7‰Aà—‘ˆAÜ�xŠx˜˜dŸi™iÓ(Ð(r(   c                óH   <€ V ^8„  d   QhRS[ P                  P                  /# ©r   r    )r,   ÚnnÚLinear)r#   r$   s   "€r%   r&   r'   u   s   ø€ ÷ ñ ™5Ÿ8™8Ÿ?™?ñ r(   c                ó€  € \         P                  P                  V P                  V P                  V P
                  R JV P                  P                  V P                  P                  R7      pV P                  P                  \         P                  ! R4      8w  d#   V P                  Vn        V P
                  Vn        V# )N©ÚdeviceÚdtypeÚmeta)	r,   rH   rI   r   r   r   r@   rL   rM   )r6   Ú
new_linears   & r%   Ú	to_linearÚFakeQuantizedLinear.to_linearu   s‹   € Ü—X‘X—_‘_Ø×ÑØ×ÑØ�I‰I˜TÐ!Ø—;‘;×%Ñ%Ø—+‘+×#Ñ#ð %ó 
ˆ
ð �;‰;×Ñ¤§¢¨fÓ!5Ô5Ø $§¡ˆJÔØ"Ÿi™iˆJŒOØÐr(   c                ót   <€ V ^8„  d   QhRS[ P                  P                  RS[S[,          RS[S[,          /# )r   Úmodr   r   )r,   rH   rI   r   r   )r#   r$   s   "€r%   r&   r'   †   s=   ø€ ÷ ñ á�X‰X�_‰_ðñ $Ñ$:Õ;ðñ  Ñ 6Õ7ñ	r(   c           
     ó\  € \        VP                  VP                  VP                  R JVVVP                  P
                  VP                  P                  R7      pVP                  P
                  \        P
                  ! R4      8w  d#   VP                  Vn        VP                  Vn        V# )N©r   r   rL   rM   rN   )r   r   r   r   r@   rL   rM   r,   )ÚclsrS   r   r   rO   s   &&&& r%   Úfrom_linearÚFakeQuantizedLinear.from_linear…   s„   € ô )Ø�O‰OØ×ÑØ�H‰H˜DÐ Ø/Ø'Ø—:‘:×$Ñ$Ø—*‘*×"Ñ"ô
ˆ
ð �:‰:×Ñ¤§¢¨VÓ 4Ô4Ø #§
¡
ˆJÔØ!Ÿh™hˆJŒOØÐr(   )r0   r5   )FNN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r+   rD   rP   ÚclassmethodrW   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r9   r$   s   @@r%   r   r   *   sG   ù‡ € ñ÷0'.õ '.÷R)ð )÷ð ð  ÷ñ ó ÷ð r(   r   c                óX   € V ^8„  d   QhR\         P                  P                  R\        /# )r   rS   Úenabled)r,   rH   ÚModuler"   )r#   s   "r%   r&   r&   ž   s$   € ÷ 8ñ 8Ü	�‰�‰ð8äñ8r(   c                ó²   € \        V \        4      '       dA   V P                  e   WP                  n        V P                  e   WP                  n        R# R# R# )zG
Helper function to enable fake quantization in `FakeQuantizedLinear`.
N)r1   r   r0   rd   r5   )rS   rd   s   &&r%   Úenable_linear_fake_quantrg   ž   sL   € ô �#Ô*×+Ò+Ø×(Ñ(Ò4Ø4;×)Ñ)Ô1Ø×$Ñ$Ò0Ø07×%Ñ%Ö-ñ 1ñ ,r(   c                óL   € V ^8„  d   QhR\         P                  P                  /# ©r   rS   ©r,   rH   re   )r#   s   "r%   r&   r&   ¬   s   € ÷ 1ñ 1¤5§8¡8§?¡?ñ 1r(   c                ó    € \        V RR7       R# )zH
Helper function to disable fake quantization in `FakeQuantizedLinear`.
F)rd   N)rg   ©rS   s   &r%   Údisable_linear_fake_quantrm   ¬   s   € ô ˜S¨%×0r(   c                   óH   a € ] tR t^¸t o RtV 3R lR ltV 3R lR ltRtV tR# )Ú_LegacyQATQuantizerzE
Base class for sharing common methods across legacy QAT quantizers.
c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rG   ©r   r   )r#   r$   s   "€r%   r&   Ú _LegacyQATQuantizer.__annotate__½   s   ø€ ÷ ñ ±XÑ>TÕ5Uñ r(   c                ó   € R # r?   © ©r6   s   &r%   Ú#get_activation_fake_quantize_configÚ7_LegacyQATQuantizer.get_activation_fake_quantize_config½   ó   € Ùr(   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rG   rq   )r#   r$   s   "€r%   r&   rr   À   s   ø€ ÷ ñ ±Ñ:PÕ1Qñ r(   c                ó   € R # r?   rt   ru   s   &r%   Úget_weight_fake_quantize_configÚ3_LegacyQATQuantizer.get_weight_fake_quantize_configÀ   rx   r(   rt   N)	rY   rZ   r[   r\   r]   rv   r{   r_   r`   ©r$   s   @r%   ro   ro   ¸   s   ø‡ € ñ÷ð ÷ö r(   ro   c                   óÐ   a a€ ] tR t^Ét oRtRR]P                  ]P                  3V3R lV 3R llltV3R lR ltV3R lR	 lt	V3R
 lR lt
V3R lR ltV3R lR ltRtVtV ;t# )Ú Int8DynActInt4WeightQATQuantizerzª
Quantizer for performing QAT on a model, where linear layers have int8
dynamic per token fake quantized activations and int4 fake quantized
grouped per channel weights.
é   Fc          
      ó^   <€ V ^8„  d   QhRS[ RS[RS[P                  RS[P                  RR/# )r   Ú	groupsizeÚpadding_allowedÚ	precisionÚscales_precisionr    N)r!   r"   r,   rM   )r#   r$   s   "€r%   r&   Ú-Int8DynActInt4WeightQATQuantizer.__annotate__Ð   sE   ø€ ÷ 9ñ 9áð9ñ ð9ñ —;‘;ð	9ñ
  Ÿ+™+ð9ð 
ñ9r(   c                ó¼   <€ \         SV `  4        \        P                  P	                  R 4       Wn        W n        W0n        W@n        \        P                  V n
        R# )z9torchao.quantization.qat.Int8DynActInt4WeightQATQuantizerN)r*   r+   r,   r-   r.   r‚   rƒ   r„   r…   Úfloat32Úactivation_scales_precision)r6   r‚   rƒ   r„   r…   r9   s   &&&&&€r%   r+   Ú)Int8DynActInt4WeightQATQuantizer.__init__Ð   sI   ø€ ô 	‰ÑÔÜ�‰×$Ñ$ØGô	
ð (ŒØ%4ÔØ&/ŒØ-=Ôä+0¯=©=ˆÖ(r(   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# ©r   Úmodelr7   r8   r    ©r,   rH   re   r   )r#   r$   s   "€r%   r&   r†   â   s=   ø€ ÷ ñ Ù—X‘X—_‘_ðÙ-0ðÙ<?ðá	�‰�‰ñr(   c           
     ó‚   € \        VV P                  V P                  V P                  V P                  \
        R R7       V# )T)Úcopy_weights)r
   r‚   rƒ   r„   r…   ÚInt8DynActInt4WeightQATLinear©r6   r�   r7   r8   s   &&*,r%   ÚprepareÚ(Int8DynActInt4WeightQATQuantizer.prepareâ   s<   € ô 	ØØ�N‰NØ× Ñ Ø�N‰NØ×!Ñ!Ü)Øõ	
ð ˆr(   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# rŒ   rŽ   )r#   r$   s   "€r%   r&   r†   ð   ó=   ø€ ÷ ñ Ù—X‘X—_‘_ðÙ-0ðÙ<?ðá	�‰�‰ñr(   c                ó(   € V P                  V4       V# r?   )Ú_convert_qat_linear_8da4wr’   s   &&*,r%   ÚconvertÚ(Int8DynActInt4WeightQATQuantizer.convertð   s   € ð 	×&Ñ& uÔ-Øˆr(   c                óH   <€ V ^8„  d   QhRS[ P                  P                  /# ©r   Úmodulerj   )r#   r$   s   "€r%   r&   r†   ö   s   ø€ ÷ .6ñ .6±·±·±ñ .6r(   c           
     ó  € VP                  4        EFo  w  r#\        V\        4      '       EdB   TP                  P                  p\        VP                  VP                  VP                  RJVP                  VP                  P                  VP                  R7      p\        WV4       ^p\        V4      w  rx\        VP                  VVP                  VP                  R7      w  ršV
P!                  VP"                  4      p
^ RIHp V! VP                  V	V
VV\(        P*                  VP                  4      pWÅn
        W•n        W¥n        VP                  e   VP                  Vn        EK[  EK^  V P1                  V4       EKr  	  R# )zP
Replace all `Int8DynActInt4WeightQATLinear` with `Int8DynActInt4WeightLinear`.
N)r‚   r„   r…   )r„   )Ú8_quantized_decomposed_quantize_per_channel_group_wrapper)Únamed_childrenr1   r‘   r5   Úconfigr   r   r   r   r3   r@   rM   Úscale_precisionÚsetattrr   r   ÚtoÚzero_point_precisionÚtorchao._executorch_opsrŸ   r,   Úint8ÚscalesÚzerosr˜   )r6   r�   ÚnameÚchildr¡   Úquantized_linearÚn_bitÚqminÚqmaxÚsÚzprŸ   Úq_weights   &&           r%   r˜   Ú:Int8DynActInt4WeightQATQuantizer._convert_qat_linear_8da4wö   sT  € ð "×0Ñ0×2‰KˆDÜ˜%Ô!>×?Ó?Ø×4Ñ4×;Ñ;�Ü#=Ø×%Ñ%Ø×&Ñ&Ø—J‘J dÐ*Ø$×/Ñ/Ø#Ÿl™l×0Ñ0Ø%+×%;Ñ%;ô$Ð ô ˜Ð&6Ô7ð �Ü-¨eÓ4‘�Ü5Ø—L‘LØØ×%Ñ%Ø$×4Ñ4ô	‘�ð —U‘U˜6×6Ñ6Ó7�õñ TØ—L‘LØØØØÜ—J‘JØ×%Ñ%ó�ð +3Ô'Ø*+Ô'Ø)+Ô&Ø—:‘:Ò)Ø,1¯J©JÐ$×)ò *ð ×.Ñ.¨u×5óU 3r(   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rG   rq   )r#   r$   s   "€r%   r&   r†   &  s   ø€ ÷ Nñ N±XÑ>TÕ5Uñ Nr(   c                ó,   € \        V P                  4      # r?   )Ú_get_8da4w_activation_configr‰   ru   s   &r%   rv   ÚDInt8DynActInt4WeightQATQuantizer.get_activation_fake_quantize_config&  s   € Ü+¨D×,LÑ,LÓMÐMr(   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rG   rq   )r#   r$   s   "€r%   r&   r†   )  s   ø€ ÷ Oñ O±Ñ:PÕ1Qñ Or(   c                óB   € \        V P                  V P                  4      # r?   )Ú_get_8da4w_weight_configr‚   r…   ru   s   &r%   r{   Ú@Int8DynActInt4WeightQATQuantizer.get_weight_fake_quantize_config)  s   € Ü'¨¯©¸×8MÑ8MÓNÐNr(   )r‰   r‚   rƒ   r„   r…   )rY   rZ   r[   r\   r]   r,   rˆ   r+   r“   r™   r˜   rv   r{   r_   r`   ra   rb   s   @@r%   r   r   É   sg   ù‡ € ñð Ø %Ø!&§¡Ø(-¯©÷9õ 9÷$ð ÷ð ÷.6ð .6÷`Nð N÷O÷ Oð Or(   r   c                   ó”   a a€ ] tR tRt oRtRRR]P                  ]P                  3V3R lV 3R llltRV3R lR	 lltR
 t	Rt
VtV ;t# )r‘   i-  a,  
This module implements a linear layer with int8 dynamic per token fake
quantized activations with int4 fake quantized grouped per channel weights.

args:
    groupsize: the number of elements in each quantized group for weights
    precision: precision of weights
    scales_precision: precision of per group scales and zero points

Note: we hardcode activation scales to use torch.fp32, but allow users to specify the weight scales (defaults to torch.fp32).
Here scales_precision refers specifically to the weight scales only, not the activation scales.
FNr€   c                ó„   <€ V ^8„  d   QhRS[ RS[ RS[RS[P                  RS[ RS[P                  RS[P                  RR	/# )
r   r   r   r   rL   r‚   r„   r…   r    N©r!   r"   r,   rL   rM   )r#   r$   s   "€r%   r&   Ú*Int8DynActInt4WeightQATLinear.__annotate__;  sg   ø€ ÷ 
ñ 
áð
ñ ð
ñ ð	
ñ
 —‘ð
ñ ð
ñ —;‘;ð
ñ  Ÿ+™+ð
ð 
ñ
r(   c           
     ó|   <€ \        \        P                  4      p\        WW4      p	\        S
V `  VVVVV	VVR 7       R# )rK   N)r¶   r,   rˆ   rº   r*   r+   )r6   r   r   r   rL   r‚   r„   r…   r   r   r9   s   &&&&&&&&  €r%   r+   Ú&Int8DynActInt4WeightQATLinear.__init__;  sE   ø€ ô 9¼¿¹ÓGÐÜ0°ÓMˆÜ‰ÑØØØØØØØð 	ö 	
r(   c                ó    <€ V ^8„  d   QhRS[ /# ©r   rd   ©r"   )r#   r$   s   "€r%   r&   r¿   S  ó   ø€ ÷ 5ñ 5©ñ 5r(   c                óF   € WP                   n        WP                  n        R # r?   ©r0   rd   r5   ©r6   rd   s   &&r%   Úenable_fake_quantÚ/Int8DynActInt4WeightQATLinear.enable_fake_quantS  ó   € Ø18×&Ñ&Ô.Ø-4×"Ñ"Ö*r(   c                ó(   € V P                  R 4       R# ©FN©rÉ   ru   s   &r%   Údisable_fake_quantÚ0Int8DynActInt4WeightQATLinear.disable_fake_quantW  ó   € Ø×Ñ˜uÖ%r(   rt   ©T)rY   rZ   r[   r\   r]   r,   rˆ   r+   rÉ   rÏ   r_   r`   ra   rb   s   @@r%   r‘   r‘   -  sA   ù‡ € ñð" Ø#ØØ!&§¡Ø(-¯©÷
õ 
÷05ò 5÷&ò &r(   r‘   c                óL   € V ^8„  d   QhR\         P                  P                  /# ri   rj   )r#   s   "r%   r&   r&   \  s   € ÷  ñ  ¤§¡§¡ñ  r(   c                óV   € \        V \        4      '       d   V P                  4        R# R# )zL
(deprecated) Enable fake quantization for `Int8DynActInt4WeightQATLinear`.
N)r1   r‘   rÉ   rl   s   &r%   Úenable_8da4w_fake_quantrÕ   \  s#   € ô �#Ô4×5Ò5Ø×ÑÖñ 6r(   c                óL   € V ^8„  d   QhR\         P                  P                  /# ri   rj   )r#   s   "r%   r&   r&   e  s   € ÷ !ñ !¤%§(¡(§/¡/ñ !r(   c                óV   € \        V \        4      '       d   V P                  4        R# R# )zM
(deprecated) Disable fake quantization for `Int8DynActInt4WeightQATLinear`.
N)r1   r‘   rÏ   rl   s   &r%   Údisable_8da4w_fake_quantrØ   e  s#   € ô �#Ô4×5Ò5Ø×ÑÖ ñ 6r(   c                óD   € V ^8„  d   QhR\         P                  R\        /# )r   Úqparams_precisionr    )r,   rM   r   )r#   s   "r%   r&   r&   m  s    € ÷ ñ Ü—{‘{ðäñr(   c                ó¬   € V \         P                  8X  g   Q h\        \         P                  RRRV V \         P                  ! V 4      P
                  R7      # )zX
Return the activation `IntxFakeQuantizeConfig` for `Int8DynActInt4WeightQATQuantizer`.
Ú	per_tokenFT)rM   r2   Úis_symmetricÚ
is_dynamicr¢   r¥   Úeps)r,   rˆ   r   r§   Úfinforß   )rÚ   s   &r%   r¶   r¶   m  sL   € ð ¤§¡Ô-Ð-Ð-Ü!Ü�j‰jØØØØ)Ø.Ü�KŠKÐ)Ó*×.Ñ.ôð r(   c                óP   € V ^8„  d   QhR\         R\        P                  R\        /# ©r   r3   rÚ   r    ©r!   r,   rM   r   )r#   s   "r%   r&   r&   €  s*   € ÷ ñ Üðä—{‘{ðô ñr(   c           	     ó@   € \        \        P                  V RRVVR7      # )zT
Return the weight `IntxFakeQuantizeConfig` for `Int8DynActInt4WeightQATQuantizer`.
T)rM   r3   rÝ   rÞ   r¢   r¥   )r   r   ÚINT4©r3   rÚ   s   &&r%   rº   rº   €  s)   € ô "Ü×ÑØØØØ)Ø.ôð r(   c                   ó¾   a a€ ] tR tRt oRtR^]P                  ]P                  3V3R lV 3R llltV3R lR ltV3R lR	 lt	V3R
 lR lt
V3R lR ltRtVtV ;t# )ÚInt4WeightOnlyQATQuantizeri–  zt
Quantizer for performing QAT on a model, where linear layers have
int4 fake quantized grouped per channel weights.
r€   c          
      ón   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[P                  RS[P                  RR/# )r   r‚   Úinner_k_tilesr„   r…   r    N)r!   r   r,   rM   )r#   r$   s   "€r%   r&   Ú'Int4WeightOnlyQATQuantizer.__annotate__œ  sI   ø€ ÷ 1ñ 1áð1ñ  ¡•}ð1ñ —;‘;ð	1ñ
  Ÿ+™+ð1ð 
ñ1r(   c                ó¶   <€ \         SV `  4        \        P                  P	                  R 4       VR9   g   Q hVR9   g   Q hW n        Wn        W0n        W@n        R# )z3torchao.quantization.qat.Int4WeightOnlyQATQuantizerN)r   é   é   )é    é@   é€   r€   )	r*   r+   r,   r-   r.   rê   r‚   r„   r…   )r6   r‚   rê   r„   r…   r9   s   &&&&&€r%   r+   Ú#Int4WeightOnlyQATQuantizer.__init__œ  sZ   ø€ ô 	‰ÑÔÜ�‰×$Ñ$ØAô	
ð  	Ô)Ð)Ð)ØÐ.Ô.Ð.Ð.Ø*ÔØ"ŒØ"ŒØ 0Ör(   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# rŒ   rŽ   )r#   r$   s   "€r%   r&   rë   ®  s=   ø€ ÷ ñ Ù—X‘X—_‘_ðÙ-0ðÙ<?ðá	�‰�‰ñr(   c                ó„   € \        VV P                  V P                  R V P                  V P                  \
        R R7       V# )T)rƒ   r„   r…   Úlinear_classr�   )r   r‚   rê   r„   r…   ÚInt4WeightOnlyQATLinearr’   s   &&*,r%   r“   Ú"Int4WeightOnlyQATQuantizer.prepare®  s?   € ô 	ØØ�N‰NØ×ÑØ Ø—n‘nØ!×2Ñ2Ü0Øõ		
ð ˆr(   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# rŒ   rŽ   )r#   r$   s   "€r%   r&   rë   ½  r–   r(   c                ó(   € V P                  V4       V# r?   )Ú_convert_qat_linear_4wr’   s   &&*,r%   r™   Ú"Int4WeightOnlyQATQuantizer.convert½  s   € ð 	×#Ñ# EÔ*Øˆr(   c                óH   <€ V ^8„  d   QhRS[ P                  P                  /# rœ   rj   )r#   r$   s   "€r%   r&   rë   Ã  s   ø€ ÷ *3ñ *3©U¯X©X¯_©_ñ *3r(   c                óâ  € VP                  4        EFÙ  w  r#\        V\        4      '       Ed¬   VP                  pVP                  pVP
                  pVP                  P                  p\        VVRVP                  VVP                  P                  VP                  \        VP                  4       4      P                  R7      p\!        WV4       ^p	\#        VP                  V	VP                  4      w  r«\%        V
P                  P&                  R4      '       dY   \(        P*                  P,                  P/                  V
P1                  VP                  P                  4      VP
                  4      p
MW\(        P*                  P,                  P3                  V
P1                  VP                  P                  4      VP
                  4      p
W¨n
        W¸n        EKÈ  V P7                  V4       EKÜ  	  R# )zD
Replace all `Int4WeightOnlyQATLinear` with `WeightOnlyInt4Linear`.
F)r   r‚   rê   r„   r…   rL   ÚcpuN)r    r1   rö   r   r   rê   r5   r¡   r   r3   r@   rM   r¢   ÚnextÚ
parametersrL   r£   r   r   Útyper,   ÚopsÚatenÚ#_convert_weight_to_int4pack_for_cpur¤   Ú_convert_weight_to_int4packÚscales_and_zerosrú   )r6   r�   rª   r«   r   r   rê   r¡   r¬   r­   r²   r  s   &&          r%   rú   Ú1Int4WeightOnlyQATQuantizer._convert_qat_linear_4wÃ  s€  € ð "×0Ñ0×2‰KˆDÜ˜%Ô!8×9Ó9Ø#×/Ñ/�Ø$×1Ñ1�Ø %× 3Ñ 3�Ø×4Ñ4×;Ñ;�Ü#7ØØ ØØ$×/Ñ/Ø"/Ø#Ÿl™l×0Ñ0Ø%+×%;Ñ%;Ü × 0Ñ 0Ó 2Ó3×:Ñ:ô	$Ð ô ˜Ð&6Ô7ð �Ü/OØ—L‘LØØ×%Ñ%ó0Ñ,�ô
 ˜hŸo™o×2Ñ2°E×:Ò:Ü$Ÿy™yŸ~™~×QÑQØ Ÿ™ E§L¡L×$7Ñ$7Ó8Ø×+Ñ+ó ‘Hô
  %Ÿy™yŸ~™~×IÑIØ Ÿ™ E§L¡L×$7Ñ$7Ó8Ø×+Ñ+ó �Hð +3Ô'Ø4D×1à×+Ñ+¨E×2óM 3r(   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rG   rq   )r#   r$   s   "€r%   r&   rë   ï  s   ø€ ÷ Lñ L±Ñ:PÕ1Qñ Lr(   c                óB   € \        V P                  V P                  4      # r?   )Ú_get_4w_weight_configr‚   r…   ru   s   &r%   r{   Ú:Int4WeightOnlyQATQuantizer.get_weight_fake_quantize_configï  s   € Ü$ T§^¡^°T×5JÑ5JÓKÐKr(   )r‚   rê   r„   r…   )rY   rZ   r[   r\   r]   r,   Úbfloat16r+   r“   r™   rú   r{   r_   r`   ra   rb   s   @@r%   rè   rè   –  s[   ù‡ € ñð Ø'(Ø!&§¡Ø(-¯©÷1õ 1÷$ð ÷ð ÷*3ð *3÷XL÷ Lð Lr(   rè   c                   ó–   a a€ ] tR tRt oRtRRR^]P                  ]P                  3V3R lV 3R llltRV3R lR	 lltR
 t	Rt
VtV ;t# )rö   ió  a|  
This module implements a linear layer with int4 fake quantized grouped
per channel weights, with forward numerics matching `WeightOnlyInt4Linear`,
which uses the efficient int4 tinygemm kernel.

args:
    groupsize: the number of elements in each quantized group for weights
    precision: precision of weights
    scales_precision: precision of per group scales and zero points
FNr€   c                óŠ   <€ V ^8„  d   QhRS[ RS[ RS[RS[P                  RS[ RS[ RS[P                  RS[P                  R	R
/	# )r   r   r   r   rL   r‚   rê   r„   r…   r    Nr¾   )r#   r$   s   "€r%   r&   Ú$Int4WeightOnlyQATLinear.__annotate__ÿ  sq   ø€ ÷ 
ñ 
áð
ñ ð
ñ ð	
ñ
 —‘ð
ñ ð
ñ ð
ñ —;‘;ð
ñ  Ÿ+™+ð
ð 
ñ
r(   c	           
     óÈ   <€ V\         P                  8X  g   Q R 4       h\        WV4      '       g   \        R4      hW`n        \        WX4      p	\        S
V `  VVVRV	VVR7       R# )z!only bf16 is supported for scalesz'Padding for QAT 4w is not supported yetNrU   )r,   r  r	   r4   rê   r
  r*   r+   )r6   r   r   r   rL   r‚   rê   r„   r…   r   r9   s   &&&&&&&&& €r%   r+   Ú Int4WeightOnlyQATLinear.__init__ÿ  sm   ø€ ð  ¤5§>¡>Ô1ÐVÐ3VÓVÐ1Ü# K¸M×JÒJÜÐFÓGÐGØ*ÔÜ-¨iÓJˆÜ‰ÑØØØØ"Ø'ØØð 	ö 	
r(   c                ó    <€ V ^8„  d   QhRS[ /# rÃ   rÄ   )r#   r$   s   "€r%   r&   r    rÅ   r(   c                óF   € WP                   n        WP                  n        R # r?   rÇ   rÈ   s   &&r%   rÉ   Ú)Int4WeightOnlyQATLinear.enable_fake_quant  rË   r(   c                ó(   € V P                  R 4       R# rÍ   rÎ   ru   s   &r%   rÏ   Ú*Int4WeightOnlyQATLinear.disable_fake_quant  rÑ   r(   )rê   rÒ   )rY   rZ   r[   r\   r]   r,   r  r+   rÉ   rÏ   r_   r`   ra   rb   s   @@r%   rö   rö   ó  sD   ù‡ € ñ	ð Ø#ØØØ!&§¡Ø(-¯©÷
õ 
÷45ò 5÷&ò &r(   rö   c                óL   € V ^8„  d   QhR\         P                  P                  /# ri   rj   )r#   s   "r%   r&   r&   "  s   € ÷  ñ  œeŸh™hŸo™oñ  r(   c                óV   € \        V \        4      '       d   V P                  4        R# R# )zF
(deprecated) Enable fake quantization for `Int4WeightOnlyQATLinear`.
N)r1   rö   rÉ   rl   s   &r%   Úenable_4w_fake_quantr  "  s#   € ô �#Ô.×/Ò/Ø×ÑÖñ 0r(   c                óL   € V ^8„  d   QhR\         P                  P                  /# ri   rj   )r#   s   "r%   r&   r&   +  s   € ÷ !ñ !œuŸx™xŸ™ñ !r(   c                óV   € \        V \        4      '       d   V P                  4        R# R# )zG
(deprecated) Disable fake quantization for `Int4WeightOnlyQATLinear`.
N)r1   rö   rÏ   rl   s   &r%   Údisable_4w_fake_quantr  +  s#   € ô �#Ô.×/Ò/Ø×ÑÖ ñ 0r(   c                óP   € V ^8„  d   QhR\         R\        P                  R\        /# râ   rã   )r#   s   "r%   r&   r&   3  s*   € ÷ ñ Üðä—{‘{ðô ñr(   c           
     ó^   € \        \        P                  V RRVV\        P                  R7      # )zN
Return the weight `IntxFakeQuantizeConfig` for `Int4WeightOnlyQATQuantizer`.
FT)rM   r3   rÝ   rÞ   r¢   r¥   Úzero_point_domain)r   r,   Úuint4r   ÚFLOATræ   s   &&r%   r
  r
  3  s0   € ô "Ü�k‰kØØØØ)Ø.Ü)×/Ñ/ôð r(   c                   óš   a € ] tR tRt o Rt^@]P                  3V 3R lR lltV 3R lR ltV 3R lR lt	V 3R	 lR
 lt
V 3R lR ltRtV tR# )ÚFloat8ActInt4WeightQATQuantizeriJ  a¿  
QAT quantizer for applying dynamic rowwise float8 activation + int4
per group/channel symmetric weight fake quantization to linear layers
in the model. Currently only supports rowwise granularity for float8
activations.

args:
    group_size (Optional[int]): the number of elements in each quantized
        group for weights, defaults to 64. Use None for per channel.
    scale_precision: precision of weight scales, defaults to torch.bfloat16.
c                óJ   <€ V ^8„  d   QhRS[ S[,          RS[P                  /# )r   r3   r¢   )r   r!   r,   rM   )r#   r$   s   "€r%   r&   Ú,Float8ActInt4WeightQATQuantizer.__annotate__W  s'   ø€ ÷ 
ñ 
á™S•Mð
ñ Ÿ™ñ
r(   c           	     óî   € \         P                  P                  R 4       Ve   RpMRp\        \         P                  \        4       R7      V n        \        \         P                  VVRRVR7      V n	        R# )z8torchao.quantization.qat.Float8ActInt4WeightQATQuantizerNÚ	per_groupÚper_channel)rM   r2   T)rM   r2   r3   rÝ   rÞ   r¢   )
r,   r-   r.   r   Úfloat8_e4m3fnr   Ú_activation_configr   Úint4Ú_weight_config)r6   r3   r¢   Úweight_granularitys   &&& r%   r+   Ú(Float8ActInt4WeightQATQuantizer.__init__W  sm   € ô
 	�‰×$Ñ$ØFô	
ð Ò!Ø!,Ñà!.ÐÜ":Ü×%Ñ%Ü›ô#
ˆÔô 5Ü—*‘*Ø*Ø!ØØØ+ô
ˆÖr(   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# rŒ   rŽ   )r#   r$   s   "€r%   r&   r%  p  s=   ø€ ÷ ñ Ù—X‘X—_‘_ðÙ-0ðÙ<?ðá	�‰�‰ñr(   c                ó"  € VP                  4        Fz  w  rE\        V\        P                  P                  4      '       d;   \
        P                  VV P                  V P                  R7      p\        WV4       Ki  V P                  V4       K|  	  V# )z�
Swap all `nn.Linear` with `FakeQuantizedLinear` with float8
fake quantizer for activations and int4 fake quantizer for weights.
)r   r   )r    r1   r,   rH   rI   r   rW   r*  r,  r£   r“   )r6   r�   r7   r8   rª   r«   rO   s   &&*,   r%   r“   Ú'Float8ActInt4WeightQATQuantizer.preparep  sw   € ð !×/Ñ/Ö1‰KˆDÜ˜%¤§¡§¡×1Ò1Ü0×<Ñ<ØØ&*×&=Ñ&=Ø"&×"5Ñ"5ð =ó �
ô
 ˜ ZÖ0à—‘˜UÖ#ñ 2ð ˆr(   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# rŒ   rŽ   )r#   r$   s   "€r%   r&   r%  „  s=   ø€ ÷ "ñ "Ù—X‘X—_‘_ð"Ù-0ð"Ù<?ð"á	�‰�‰ñ"r(   c                ó   € \         hr?   ©ÚNotImplementedErrorr’   s   &&*,r%   r™   Ú'Float8ActInt4WeightQATQuantizer.convert„  s
   € ô "Ð!r(   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rG   rq   )r#   r$   s   "€r%   r&   r%  ‰  s   ø€ ÷ Rñ R±XÑ>TÕ5Uñ Rr(   c                ó   € \        R 4      h)z,Float8 FakeQuantizeConfig does not exist yetr4  ru   s   &r%   rv   ÚCFloat8ActInt4WeightQATQuantizer.get_activation_fake_quantize_config‰  s   € Ü!Ð"PÓQÐQr(   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rG   rq   )r#   r$   s   "€r%   r&   r%  Œ  s   ø€ ÷ "ñ "±Ñ:PÕ1Qñ "r(   c                ó   € V P                   # r?   )r   ru   s   &r%   r{   Ú?Float8ActInt4WeightQATQuantizer.get_weight_fake_quantize_configŒ  s   € Ø×!Ñ!Ð!r(   )r*  r,  N)rY   rZ   r[   r\   r]   r,   r  r+   r“   r™   rv   r{   r_   r`   r}   s   @r%   r#  r#  J  sJ   ø‡ € ñ
ð %'Ø',§~¡~÷
ò 
÷2ð ÷("ð "÷
Rð R÷"ö "r(   r#  rÒ   )4Útypingr   r   r,   Útorch.nn.functionalrH   Ú
functionalrA   Ú torchao.quantization.granularityr   r   Ú)torchao.quantization.linear_quant_modulesr   r   r	   r
   r   r   Ú%torchao.quantization.quant_primitivesr   r   Útorchao.quantization.utilsr   Útorchao.utilsr   Úfake_quantize_configr   r   r   Úfake_quantizerr   Útwo_step_quantizerr   Úutilsr   rI   r   rg   rm   ro   r   r‘   rÕ   rØ   r¶   rº   rè   rö   r  r  r
  r#  rt   r(   r%   Ú<module>rI     sç   ð÷ !ã ß Ð ç =÷÷ ÷õ CÝ $÷ñ õ
õ 1õô
q˜%Ÿ(™(Ÿ/™/ô q÷h8õ1ô	Ð*ô 	ô"aOÐ':ô aOôH+&Ð$7ô +&õ^ õ!õõ&ô,ZLÐ!4ô ZLôz+&Ð1ô +&õ^ õ!õô.C"Ð&9ö C"r(   