+
    "Ý³j!  ã                   óZ   € ^ RI Ht ^ RIt^ RIHt ^ RIHt R.t ! R R]4      tR t	R t
R# )	é    )ÚOptionalN)Ú	Parameter)ÚFakeQuantizeBaseÚLearnableFakeQuantizec                   ó‚  a a€ ] tR t^t oRtRV 3R llt]P                  P                  V3R lR l4       t	]P                  P                  V3R lR l4       t
]P                  P                  RV3R lR ll4       t]P                  P                  R	 4       t]P                  P                  RV3R
 lR ll4       t]P                  P                  R 4       t]P                  P                  R 4       t]P                  P                  R 4       t]P                  P                  R 4       tV3R lR ltR tRtVtV ;t# )r   ah  Generalized extension of the FakeQuantize module.

This is an extension of the FakeQuantize module, which
supports more generalized lower-bit quantization and supports learning of the scale
and zero point parameters through backpropagation.

In addition to the attributes in the original FakeQuantize module, the LearnableFakeQuantize
module also includes the following attributes to support quantization parameter learning.

* :attr:`use_grad_scaling` defines the flag for whether the gradients for scale and zero point are
  normalized by the constant, which is proportional to the square root of the number of
  elements in the tensor. The related literature justifying the use of this particular constant
  can be found here: https://openreview.net/pdf?id=rkgO66VKDS.

* :attr:`learning_enabled` defines the flag for enabling backpropagation for scale and zero point.
c                ó¨  <€ \         SV `  4        W#8  g   Q R 4       hW n        W0n        W%R&   W5R&   W@n        RV n        RV n        V! R/ VB V n        \        P                  ! V P                  P                  4      P                  V8:  g   Q R4       hV\        P                  ! V P                  P                  4      P                  8:  g   Q R4       hV P                  P                  V n
        V P                  P                  V n        \        V P                  R4      '       d   V P                  P                  MRV n        V P!                  R\        P"                  ! ^ .\        P$                  R7      4       V P!                  R	\        P"                  ! \        P&                  ! \        P(                  4      P*                  .4      4       R
V n        R# )z/quant_min must be strictly less than quant_max.Ú	quant_minÚ	quant_maxNzquant_min out of boundzquant_max out of boundÚch_axisÚlearning_enabled)ÚdtypeÚepsF© éÿÿÿÿ)ÚsuperÚ__init__r	   r
   Úuse_grad_scalingÚscaleÚ
zero_pointÚactivation_post_processÚtorchÚiinfor   ÚminÚmaxÚqschemeÚhasattrr   Úregister_bufferÚtensorÚuint8ÚfinfoÚfloat32r   Ú_initialized)ÚselfÚobserverr	   r
   r   Úobserver_kwargsÚ	__class__s   &&&&&,€Úr/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torchao/quantization/pt2e/learnable_fake_quantize.pyr   ÚLearnableFakeQuantize.__init__    s}  ø€ ô 	‰ÑÔØÔ$ÐWÐ&WÓWÐ$Ø"ŒØ"Œà'0˜Ñ$Ø'0˜Ñ$Ø 0Ôð 48ˆŒ
Ø8<ˆŒá'/Ñ'B°/Ñ'BˆÔ$Ü�{Š{˜4×7Ñ7×=Ñ=Ó>×BÑBÀiÔOð 	
Ø$ó	
ÐOð œEŸKšK¨×(DÑ(D×(JÑ(JÓK×OÑOÔOð 	
Ø$ó	
ÐOð ×1Ñ1×7Ñ7ˆŒ
Ø×3Ñ3×;Ñ;ˆŒô �t×3Ñ3°Y×?Ò?ð ×(Ñ(×0Ò0àð 	Œð
 	×ÑÐ/´·²¸q¸cÌÏÉÔ1UÔVØ×Ñ˜U¤E§L¢L´%·+²+¼e¿m¹mÓ2L×2PÑ2PÐ1QÓ$RÔSà!ˆÖó    c                ó   <€ V ^8„  d   QhRR/# ©é   ÚreturnNr   )ÚformatÚ__classdict__s   "€r'   Ú__annotate__Ú"LearnableFakeQuantize.__annotate__I   s   ø€ ÷ 1ñ 1 tñ 1r)   c                óÄ   € ^V P                   ^ &   V P                  4        V P                  e   RV P                  n        V P                  e   RV P                  n        R# R# )zvEnable quantization parameter learning.

Enables learning of quantization parameters and
disables observer estimates.
NT)r   Údisable_observerr   Úrequires_gradr   ©r#   s   &r'   Úenable_range_learningÚ+LearnableFakeQuantize.enable_range_learningH   sQ   € ð $%ˆ×Ñ˜aÑ Ø×ÑÔØ�:‰:Ò!Ø'+ˆD�J‰JÔ$Ø�?‰?Ò&Ø,0ˆD�O‰OÖ)ñ 'r)   c                ó   <€ V ^8„  d   QhRR/# r+   r   )r.   r/   s   "€r'   r0   r1   W   s   ø€ ÷ 	2ñ 	2¨ñ 	2r)   c                ó¤   € ^ V P                   ^ &   V P                  e   RV P                  n        V P                  e   RV P                  n        R# R# )zWDisable quantization parameter learning.

Disables learning of quantization parameters
NF)r   r   r4   r   r5   s   &r'   Údisable_range_learningÚ,LearnableFakeQuantize.disable_range_learningV   sE   € ð $%ˆ×Ñ˜aÑ Ø�:‰:Ò!Ø',ˆD�J‰JÔ$Ø�?‰?Ò&Ø,1ˆD�O‰OÖ)ñ 'r)   c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r,   Úenabledr-   N©Úbool)r.   r/   s   "€r'   r0   r1   c   s   ø€ ÷ *ñ *¡tð *°tñ *r)   c                ól   € V'       d   ^M^ V P                   ^ &   V'       d   V P                  4        R# R# )z_Enable observer.

Enables observer estimates and disables learning of
quantization parameters.
N)Úobserver_enabledr:   ©r#   r>   s   &&r'   Úenable_observerÚ%LearnableFakeQuantize.enable_observerb   s,   € ÷ )0¡1°Qˆ×Ñ˜aÑ ßØ×'Ñ'Ö)ñ r)   c                ó(   € V P                  R 4       R# ©FN)rD   r5   s   &r'   r3   Ú&LearnableFakeQuantize.disable_observerm   s   € à×Ñ˜UÖ#r)   c                ó$   <€ V ^8„  d   QhRS[ RR/# r=   r?   )r.   r/   s   "€r'   r0   r1   r   s   ø€ ÷ 9ñ 9©ð 9¸ñ 9r)   c                ó8   € V'       d   ^M^ V P                   ^ &   R# )é   N)Úfake_quant_enabledrC   s   &&r'   Úenable_fake_quantÚ'LearnableFakeQuantize.enable_fake_quantq   s   € ç*1¡Q°qˆ×Ñ Ó"r)   c                ó(   € V P                  R 4       R# rG   )rM   r5   s   &r'   Údisable_fake_quantÚ(LearnableFakeQuantize.disable_fake_quantu   s   € à×Ñ˜uÖ%r)   c                óž   € \        R V P                  P                  4        24       \        RV P                  P                  4        24       R# )zLearnableFakeQuantize Scale: z"LearnableFakeQuantize Zero Point: N)Úprintr   Údetachr   r5   s   &r'   Úobserve_quant_paramsÚ*LearnableFakeQuantize.observe_quant_paramsy   s>   € äÐ-¨d¯j©j×.?Ñ.?Ó.AÐ-BÐCÔDÜÐ2°4·?±?×3IÑ3IÓ3KÐ2LÐMÖNr)   c                ól  € V P                   P                  P                  V P                  P	                  4       R 7       V P                   P                  4       pV P                  P                  4       P                  4       P                  V P                  V P                  4      P                  4       pW3# ))r   )r   ÚdataÚclamp_r   ÚitemrT   r   ÚroundÚclampr	   r
   Úlong©r#   r   r   s   &  r'   Úcalculate_qparamsÚ'LearnableFakeQuantize.calculate_qparams~   sy   € à�
‰
�‰×Ñ 4§8¡8§=¡=£?ÐÔ3Ø—
‘
×!Ñ!Ó#ˆà�O‰O×"Ñ"Ó$ß‰U‹Wß‰U�4—>‘> 4§>¡>Ó2ß‰T‹Vð	 	ð Ð Ð r)   c                ó$  € R V P                    RV P                   RV P                   RV P                   RV P                   RV P
                   RV P                   RV P                   RV P                   R	V P                   R
V P                   2# )zfake_quant_enabled=z, observer_enabled=z, learning_enabled=z, quant_min=z, quant_max=z, dtype=z
, qscheme=z
, ch_axis=z, use_grad_scaling=z, scale=z, zero_point=)rL   rB   r   r	   r
   r   r   r   r   r   r   r5   s   &r'   Ú
extra_reprÚ LearnableFakeQuantize.extra_reprŠ   s¤   € ð " $×"9Ñ"9Ð!:Ð:MÈd×NcÑNcÐMdð e Ø $× 5Ñ 5Ð6°lÀ4Ç>Á>ÐBRÐR^Ð_c×_mÑ_mÐ^nð oØ—Z‘Z�L 
¨4¯<©<¨.¸
À4Ç<Á<À.ð Q Ø $× 5Ñ 5Ð6°h¸t¿z¹z¸lÈ-ÐX\×XgÑXgÐWhðjð	
r)   c                óR   <€ V ^8„  d   QhRS[ P                  RS[ P                  RR/# )r,   r   r   r-   N)r   ÚTensor)r.   r/   s   "€r'   r0   r1   “   s-   ø€ ÷ ;ñ ;Ù—\‘\ð;Ù/4¯|©|ð;à	ñ;r)   c                ó  € V P                   '       g•   \        V4      V n        \        VP                  4       4      V n        V P
                  ^ ,          ^8X  d$   RV P                  n        RV P                  n        M"RV P                  n        RV P                  n        RV n         R# V P                  P                  P                  V4       V P                  P                  P                  VP                  4       4       R# )zz
Initialize scale and zero_point parameters if they are not initialized yet.
Update them if they are already initialized.
TFN)	r"   r   r   Úfloatr   r   r4   rX   Úcopy_r^   s   &&&r'   Ú_initialize_or_update_qparamsÚ3LearnableFakeQuantize._initialize_or_update_qparams“   s³   € ð × × Ð Ü" 5Ó)ˆDŒJä'¨
×(8Ñ(8Ó(:Ó;ˆDŒOà×$Ñ$ QÕ'¨1Ô,Ø+/�—
‘
Ô(Ø04�—‘Õ-à+0�—
‘
Ô(Ø05�—‘Ô-Ø $ˆDÖà�J‰J�O‰O×!Ñ! %Ô(Ø�O‰O× Ñ ×&Ñ& z×'7Ñ'7Ó'9Ö:r)   c           	     óÖ  € V P                   ^ ,          ^8X  g   V P                  '       gM   V P                  VP                  4       4       V P                  P	                  4       w  r#V P                  W#4       V P                  ^ ,          ^8X  EdZ   V P                  \        P                  \        P                  39   d%   V P                  P                  P                  4        V P                  '       d1   RVP                  4       V P                   ,          R,          ,          pMRpV P                  \        P                  \        P"                  39   dQ   \        P$                  ! VV P&                  V P                  V P(                  V P*                  V P                   V4      pV# \        P,                  ! VV P&                  V P                  V P*                  V P                   V4      pV# )r   g      ð?g      à?)rB   r"   r   rT   r_   ri   rL   r   r   Úper_channel_symmetricÚper_tensor_symmetricr   rX   Úzero_r   Únumelr
   Úper_channel_affineÚ+_fake_quantize_learnable_per_channel_affiner   r   r	   Ú*_fake_quantize_learnable_per_tensor_affine)r#   ÚXÚ_scaleÚ_zero_pointÚgrad_factors   &&   r'   ÚforwardÚLearnableFakeQuantize.forwardª   sn  € Ø× Ñ  Õ# qÔ(°×0A×0AÐ0AØ×(Ñ(¨¯©«Ô4Ø"&×">Ñ">×"PÑ"PÓ"RÑˆFØ×.Ñ.¨vÔCà×"Ñ" 1Õ%¨Õ*Ø�|‰|Ü×+Ñ+Ü×*Ñ*ð ô ð —‘×$Ñ$×*Ñ*Ô,à×$×$Ð$Ø! Q§W¡W£Y°·±Õ%?ÀCÕ$GÕG‘à!�Ø�|‰|¤× ;Ñ ;¼U×=UÑ=UÐVÔVÜ×EÒEØØ—J‘JØ—O‘OØ—L‘LØ—N‘NØ—N‘NØó�ð& ˆô ×DÒDØØ—J‘JØ—O‘OØ—N‘NØ—N‘NØó�ð ˆr)   )
r"   r   r   r   r   r
   r	   r   r   r   )r   éÿ   F)T)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   ÚjitÚexportr6   r:   rD   r3   rM   rP   rU   r_   rb   ri   rw   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r&   r/   s   @@r'   r   r      s>  ù‡ € ñ÷"&"ðP ‡Y�Y×Ñ÷1ó ð1ð ‡Y�Y×Ñ÷	2ó ð	2ð ‡Y�Y×Ñ÷*ñ *ó ð*ð ‡Y�Y×Ññ$ó ð$ð ‡Y�Y×Ñ÷9ñ 9ó ð9ð ‡Y�Y×Ññ&ó ð&ð ‡Y�Y×ÑñOó ðOð ‡Y�Y×Ññ	!ó ð	!ð ‡Y�Y×Ññ
ó ð
÷;ð ;÷.%ò %r)   c                óV   € \        V \        4      '       d   V P                  4        R# R# )zÒEnable quantization parameter learning.

Enable fake quantization for this module, if applicable. Example usage::

  # model is any PyTorch model
  model.apply(torchao.quantization.pt2e.enable_range_learning)

N)Ú
isinstancer   r6   ©Úmods   &r'   r6   r6   Ò   s#   € ô �#Ô,×-Ò-Ø×!Ñ!Ö#ñ .r)   c                óV   € \        V \        4      '       d   V P                  4        R# R# )zÓEnable quantization parameter learning.

Enable fake quantization for this module, if applicable. Example usage::

  # model is any PyTorch model
  model.apply(torchao.quantization.pt2e.disable_range_learning)

N)r…   r   r:   r†   s   &r'   r:   r:   ß   s#   € ô �#Ô,×-Ò-Ø×"Ñ"Ö$ñ .r)   )Útypingr   r   Útorch.nn.parameterr   Ú'torchao.quantization.pt2e.fake_quantizer   Ú__all__r   r6   r:   r   r)   r'   Ú<module>r�      s5   ðõ ã Ý (å Dà"Ð
#€ôAÐ,ô AòH
$ô
%r)   