+
    "Ý³j‹2  ã                   ó8  € ^ RI Ht ^ RIt^ RIHtHtHtHt ^ RIH	t	H
t
HtHtHtHtHtHtHt ^ RIHtHtHtHt ^RIHtHtHtHt ^RIHtHtHt  ! R R	]P@                  PB                  4      t" ! R
 R]"4      t# ! R R]"4      t$ ! R R]"4      t% ! R R]%4      t&R# )é    )ÚOptionalN)ÚPerAxisÚPerGroupÚPerRowÚPerToken)	Ú_DTYPE_TO_BIT_WIDTHÚ_DTYPE_TO_QVALUE_BOUNDSÚMappingTypeÚ_choose_scale_float8Ú_dequantize_affine_float8Ú_fake_quantize_affineÚ_quantize_affine_float8Ú_RoundÚchoose_qparams_affine)Ú_get_per_token_block_sizeÚget_block_sizeÚget_group_qparams_symmetricÚget_groupwise_affine_qparams)ÚFakeQuantizeConfigBaseÚFloat8FakeQuantizeConfigÚInt4WeightFakeQuantizeConfigÚIntxFakeQuantizeConfig)Ú _fake_quantize_per_channel_groupÚ_fake_quantize_per_tokenÚ_log_deprecation_warningc                   ó^   a € ] tR t^0t o RtV 3R lR lt]V 3R lR l4       tV 3R ltRt	V t
R# )	ÚFakeQuantizerBasezX
Generic module for applying fake quantization to a tensor, as specified in the config.
c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úreturn)Ústr)ÚformatÚ__classdict__s   "€Úh/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torchao/quantization/qat/fake_quantizer.pyÚ__annotate__ÚFakeQuantizerBase.__annotate__7   s   ø€ ÷ 1ñ 1™#ñ 1ó    c                ó(   € RV P                   ,          # )zU
Return a human readable representation of this `FakeQuantizer` with config details.
zFakeQuantizer(%s)©Úconfig©Úselfs   &r%   Ú__repr__ÚFakeQuantizerBase.__repr__7   s   € ð # T§[¡[Õ0Ð0r(   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r    r+   r!   r   ©r   )r#   r$   s   "€r%   r&   r'   >   s   ø€ ÷ ?ñ ?Ñ2ð ?Ð7Jñ ?r(   c                óä   € \        V \        4      '       d   \        V 4      # \        V \        4      '       d   \	        V 4      # \        V \
        4      '       d   \        V 4      # \        R V  24      h)zUnknown config type: )Ú
isinstancer   ÚIntxFakeQuantizerr   ÚInt4WeightFakeQuantizerr   ÚFloat8FakeQuantizerÚ
ValueErrorr*   s   &r%   Úfrom_configÚFakeQuantizerBase.from_config=   s`   € ä�fÔ4×5Ò5Ü$ VÓ,Ð,Ü˜Ô <×=Ò=Ü*¨6Ó2Ð2Ü˜Ô 8×9Ò9Ü& vÓ.Ð.äÐ4°V°HÐ=Ó>Ð>r(   c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # ©r    r+   r1   )r#   r$   s   "€r%   r&   r'   0   s   ø‡ ‚ ñ
 #Ñ"ò r(   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r.   Ústaticmethodr8   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__)r$   s   @r%   r   r   0   s/   ø‡ € ñ÷1ð 1ð ÷?ó ð?÷ ƒ r(   r   c                   óT   a a€ ] tR t^It oRtV3R lV 3R lltV3R lR ltRtVtV ;t	# )r6   z_
Generic module for applying float8 fake quantization to a tensor, as specified in the config.
c                ó    <€ V ^8„  d   QhRS[ /# r;   )r   )r#   r$   s   "€r%   r&   Ú Float8FakeQuantizer.__annotate__N   s   ø€ ÷ Uñ UÑ7ñ Ur(   c                ó|   <€ \         SV `  4        Wn        R V n        \        P
                  P                  R4       R# )Tz,torchao.quantization.qat.Float8FakeQuantizerN©ÚsuperÚ__init__r+   ÚenabledÚtorchÚ_CÚ_log_api_usage_once©r-   r+   Ú	__class__s   &&€r%   rL   ÚFloat8FakeQuantizer.__init__N   s-   ø€ Ü‰ÑÔØŒØˆŒÜ�‰×$Ñ$Ð%SÖTr(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r    Úxr!   ©rN   ÚTensor)r#   r$   s   "€r%   r&   rH   T   s#   ø€ ÷ ñ ™Ÿ™ð ©%¯,©,ñ r(   c                óŠ  € V P                   '       g   V# VP                  p\        VP                  V P                  P
                  4      p\        VVV P                  P                  V P                  P                  V P                  P                  R 7      p\        WV P                  P                  4      p\        WTV4      pV# ))Úhp_value_lbÚhp_value_ub)rM   Údtyper   Úshaper+   Úgranularityr   rZ   r[   r   r   )r-   rV   Úoriginal_dtypeÚ
block_sizeÚscaleÚqÚdqs   &&     r%   ÚforwardÚFloat8FakeQuantizer.forwardT   s“   € Ø�|�|ˆ|ØˆHØŸ™ˆÜ# A§G¡G¨T¯[©[×-DÑ-DÓEˆ
Ü$ØØØ�K‰K×ÑØŸ™×/Ñ/ØŸ™×/Ñ/ô
ˆô $ A¨d¯k©k×.?Ñ.?Ó@ˆÜ& q°Ó@ˆØˆ	r(   ©r+   rM   )
r=   r>   r?   r@   rA   rL   rd   rD   rE   Ú__classcell__©rR   r$   s   @@r%   r6   r6   I   s%   ù‡ € ñ÷Uó U÷÷ ð r(   r6   c                   óx   a a€ ] tR t^et oRtV3R lV 3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R
t	Vt
V ;t# )r5   zà
Generic module for applying int4 fake quantization to a weight tensor,
targeting the following MSLK kernels:
    torch.ops.mslk.f8i4bf16_shuffled
    torch.ops.mslk.bf16i4bf16_shuffled
    torch.ops.mslk.bf16i4bf16_rowwise
c                ó    <€ V ^8„  d   QhRS[ /# r;   )r   )r#   r$   s   "€r%   r&   Ú$Int4WeightFakeQuantizer.__annotate__n   s   ø€ ÷ Yñ YÑ;ñ Yr(   c                ó|   <€ \         SV `  4        Wn        R V n        \        P
                  P                  R4       R# )Tz0torchao.quantization.qat.Int4WeightFakeQuantizerNrJ   rQ   s   &&€r%   rL   Ú Int4WeightFakeQuantizer.__init__n   s-   ø€ Ü‰ÑÔØŒØˆŒÜ�‰×$Ñ$Ð%WÖXr(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r    Úwr!   rW   )r#   r$   s   "€r%   r&   rk   t   s'   ø€ ÷ Yñ Y™Ÿ™ð Y©%¯,©,ñ Yr(   c                óV  € V P                   '       g   V# V P                  P                  \        P                  8X  d   V P                  V4      # V P                  P                  \        P                  8X  d   V P                  V4      # \        R V P                  P                   24      h)zUnknown activation dtype )	rM   r+   Úactivation_dtyperN   Úfloat8_e4m3fnÚ_fp8_activations_forwardÚbfloat16Ú_bf16_activations_forwardr7   )r-   rp   s   &&r%   rd   ÚInt4WeightFakeQuantizer.forwardt   s~   € Ø�|�|ˆ|ØˆHØ�;‰;×'Ñ'¬5×+>Ñ+>Ô>Ø×0Ñ0°Ó3Ð3Ø�[‰[×)Ñ)¬U¯^©^Ô;Ø×1Ñ1°!Ó4Ð4äÐ8¸¿¹×9UÑ9UÐ8VÐWÓXÐXr(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ro   rW   )r#   r$   s   "€r%   r&   rk   ~   s#   ø€ ÷ 'ñ '©%¯,©,ð '¹5¿<¹<ñ 'r(   c           
     ó<  € VP                  4       ^8X  g   Q hV P                  P                  \        P                  8X  g   Q h\        VP                  \        4       4      p\        VV\        P                  RR7      p\        W\        P                  4      p\        WCVP                  4      pRp^pVP                  VP                  ^ ,          RV P                  P                  4      p\        P                  ! \        P                  ! V4      RRR7      p\        P                   ! W†,          VR7      p	\        P"                  ! V	4      p
^V P                  P                  3p\%        VVV	V
\        P&                  R	^R7      pVP)                  VP                  4      # )
zÛ
Apply int4 fake quantization to the weight tensor where the input activations
are expected to be rowwise fp8, using the following as a reference:
https://github.com/meta-pytorch/MSLK/blob/main/mslk/quantize/shuffle.py
gê-�™—q=)rZ   ç�íµ ÷Æ°>F©ÚdimÚkeepdim©Úmin)Úquant_dtypeÚ	quant_minÚ	quant_maxéÿÿÿÿiøÿÿÿ)r|   r+   rr   rN   rs   r   r]   r   r   r   r   r\   ÚviewÚ
group_sizeÚamaxÚabsÚclampÚ
zeros_liker   Úint8Úto)r-   rp   Úper_row_block_sizeÚ	fp8_scaleÚw_fp8ÚepsÚmslk_scale_quant_maxÚw_fp8_groupedÚmax_absra   Ú
zero_pointÚper_group_block_sizeÚfqs   &&           r%   rt   Ú0Int4WeightFakeQuantizer._fp8_activations_forward~   sD  € ð �u‰u‹w˜!Œ|Ðˆ|Ø�{‰{×+Ñ+¬u×/BÑ/BÔBÐBÐBô ,¨A¯G©G´V³XÓ>ÐÜ(ØØÜ×ÑØô	
ˆ	ô (¨´e×6IÑ6IÓJˆÜ)¨%¸A¿G¹GÓDˆð ˆØ ÐØŸ
™
 5§;¡;¨q¥>°2°t·{±{×7MÑ7MÓNˆÜ—*’*œUŸYšY }Ó5¸2ÀuÔMˆÜ—’˜GÕ:ÀÔDˆÜ×%Ò% eÓ,ˆ
Ø ! 4§;¡;×#9Ñ#9Ð:ÐÜ"ØØ ØØÜŸ
™
ØØô
ˆð �u‰u�Q—W‘W‹~Ðr(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ro   rW   )r#   r$   s   "€r%   r&   rk   §   s#   ø€ ÷ ,ñ ,©5¯<©<ð ,¹E¿L¹Lñ ,r(   c                ó  € VP                  4       ^8X  g   Q hV P                  P                  \        P                  8X  g   Q hRp^ ^rC^pVP                  \        P                  4      P                  VP                  ^ ,          RV P                  P                  4      p\        P                  ! VRRR7      p\        P                  ! VRRR7      p\        P                  ! Wx,
          VR7      V,          p	W‰V,          ,           p
\        P                  ! Wh,
          V	,          4      P                  W44      pWµ,
          pW¹,          V
,           pVP                  VP                  4      P                  VP                  4      # )zÔ
Apply int4 fake quantization to the weight tensor where the input activations
are expected to be bf16, using the following as a reference:
https://github.com/meta-pytorch/MSLK/blob/main/mslk/quantize/shuffle.py
rz   Tr{   r~   rƒ   )r|   r+   rr   rN   ru   r‹   Úfloat32r„   r]   r…   r†   Úaminrˆ   r   Úapplyr\   )r-   rp   r�   ÚqminÚqmaxÚmslk_symmetric_qmaxÚ	w_groupedÚmax_valÚmin_valra   r“   r•   s   &&          r%   rv   Ú1Int4WeightFakeQuantizer._bf16_activations_forward§   s  € ð �u‰u‹w˜!Œ|Ðˆ|Ø�{‰{×+Ñ+¬u¯~©~Ô=Ð=Ð=àˆØ˜ˆdØÐØ—D‘DœŸ™Ó'×,Ñ,¨Q¯W©W°Q­Z¸¸T¿[¹[×=SÑ=SÓTˆ	Ü—*’*˜Y¨B¸Ô=ˆÜ—*’*˜Y¨B¸Ô=ˆÜ—’˜GÕ-°3Ô7¸$Õ>ˆØÐ':Õ:Õ:ˆ
Ü�\Š\˜9Õ.°%Õ7Ó8×>Ñ>¸tÓJˆØÕ%ˆØ�Z˜*Õ$ˆØ�w‰w�q—w‘wÓ×"Ñ" 1§7¡7Ó+Ð+r(   rf   )r=   r>   r?   r@   rA   rL   rd   rt   rv   rD   rE   rg   rh   s   @@r%   r5   r5   e   s<   ù‡ € ñ÷Yó Y÷Yð Y÷'ð '÷R,÷ ,ð ,r(   r5   c                   óœ   a a€ ] tR t^¾t oRtV3R lV 3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	V3R lR lt
RtVtV ;t# )r4   z`
Generic module for applying integer fake quantization to a tensor, as specified in the config.
c                ó    <€ V ^8„  d   QhRS[ /# r;   )r   )r#   r$   s   "€r%   r&   ÚIntxFakeQuantizer.__annotate__Ã   s   ø€ ÷ "ñ "Ñ5ñ "r(   c                ó´   <€ \         SV `  4        \        P                  P	                  R 4       Wn        RV n        RV n        RV n        RV n	        RV n
        R# )z*torchao.quantization.qat.IntxFakeQuantizerTNg•Ö&è.>F)rK   rL   rN   rO   rP   r+   rM   ra   r“   Ú
_scale_epsÚ_initializedrQ   s   &&€r%   rL   ÚIntxFakeQuantizer.__init__Ã   sL   ø€ Ü‰ÑÔÜ�‰×$Ñ$Ð%QÔRØŒØˆŒØ-1ˆŒ
Ø26ˆŒð ˆŒØ!ˆÖr(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rU   rW   )r#   r$   s   "€r%   r&   r¥   Ð   s'   ø€ ÷ Sñ S™Ÿ™ð S©%¯,©,ñ Sr(   c                ó  € V P                   '       g   V# V P                  P                  '       d:   V P                  '       g(   V P                  e   V P
                  f   \        R4      h\        V P                  P                  \        4      '       d   V P                  V4      # \        V P                  P                  \        \        34      '       d   V P                  V4      # \        RV P                  P                  ,          4      h)z„
Apply fake quantization to the tensor based on the bit-width,
granularity, symmetry, and other properties specified in the config.
zºScales and zero points must be initialized for range learning. Please call `torchao.quantization.qat.initialize_fake_quantizers` before initializing the optimizer and beginning training.zUnknown granularity '%s')rM   r+   Úrange_learningr¨   ra   r“   r7   r3   r^   r   Ú_per_token_forwardr   r   Ú_per_channel_or_group_forward)r-   rV   s   &&r%   rd   ÚIntxFakeQuantizer.forwardÐ   sÈ   € ð
 �|�|ˆ|ØˆHð �K‰K×&×&Ð&Ø×%×%Ð%Ø—‘Ò# t§¡Ò'>äðLóð ô �d—k‘k×-Ñ-¬x×8Ò8Ø×*Ñ*¨1Ó-Ð-Ü˜Ÿ™×/Ñ/´'¼8Ð1D×EÒEØ×5Ñ5°aÓ8Ð8äÐ7¸$¿+¹+×:QÑ:QÕQÓRÐRr(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rU   rW   )r#   r$   s   "€r%   r&   r¥   ê   s'   ø€ ÷ Tñ T¡E§L¡Lð T±U·\±\ñ Tr(   c                ó4  € V P                   P                  '       d   \        R4      h\        V P                   P                  ,          w  r#V P                  4       '       d™   \        V\        P                  \        V4      V P                   P                  VVV P                   P                  V P                   P                  V P                   P                  R7	      w  V n        V n        V P                  4        \!        WP                  V P                  W#4      # )z4
Perform per token fake quantization on the tensor.
z(Symmetric per token is not supported yet)Úmapping_typer`   Útarget_dtyper�   r‚   r�   Úscale_dtypeÚzero_point_dtype)r+   Úis_symmetricÚNotImplementedErrorr	   r\   Ú_should_compute_qparamsr   r
   Ú
ASYMMETRICr   r�   Úscale_precisionÚzero_point_precisionra   r“   Ú(_maybe_update_qparams_for_range_learningr   )r-   rV   rœ   r�   s   &&  r%   r­   Ú$IntxFakeQuantizer._per_token_forwardê   sÉ   € ð �;‰;×#×#Ð#Ü%Ð&PÓQÐQÜ,¨T¯[©[×->Ñ->Õ?‰
ˆØ×'Ñ'×)Ò)Ü*?ØÜ(×3Ñ3Ü4°QÓ7Ø!Ÿ[™[×.Ñ.ØØØ—K‘K—O‘OØ ŸK™K×7Ñ7Ø!%§¡×!AÑ!Aô
+Ñ'ˆDŒJ˜œð ×9Ñ9Ô;Ü'¨¯:©:°t·±ÈÓSÐSr(   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rU   rW   )r#   r$   s   "€r%   r&   r¥      s#   ø€ ÷ 5
ñ 5
©u¯|©|ð 5
ÁÇÁñ 5
r(   c           	     óþ  € V P                   P                  pV P                   P                  pV P                   P                  pV P                   P                  pV P                   P
                  p\        V\        4      '       d,   VP                  ^ 8X  g   Q hVP                  4       R,          pM5\        V\        4      '       d   VP                  pM\        RV,          4      hV P                  4       '       d½   \        V P                   P                  ,          pV'       d3   \!        VVVVV P                   P"                  R7      w  V n        V n        M1\)        VVVVV P                   P"                  R7      w  V n        V n        V P&                  P+                  V4      V n        V P-                  4        \.        V P                   P                  ,          w  rš\1        VV P$                  V P&                  V	V
VV4      # )z°
Perform per channel or per group fake quantization on the tensor.
We express per channel using per group where the group size is the size
of the last dimension of the tensor.
zUnexpected granularity '%s')r�   rƒ   )r+   r^   rº   r»   Úzero_point_domainr¶   r3   r   ÚaxisÚsizer   r…   r7   r¸   r   r\   r   r�   ra   r“   r   r‹   r¼   r	   r   )r-   rV   r^   rº   r»   rÀ   r¶   r…   Ú	bit_widthrœ   r�   s   &&         r%   r®   Ú/IntxFakeQuantizer._per_channel_or_group_forward   s�  € ð —k‘k×-Ñ-ˆØŸ+™+×5Ñ5ˆØ#Ÿ{™{×?Ñ?ÐØ ŸK™K×9Ñ9ÐØ—{‘{×/Ñ/ˆô �k¤7×+Ò+Ø×#Ñ# qÔ(Ð(Ð(ØŸ™› "�‰JÜ˜¤X×.Ò.Ø$×/Ñ/‰JäÐ:¸[ÕHÓIÐIð ×'Ñ'×)Ò)Ü+¨D¯K©K×,=Ñ,=Õ>ˆIßÜ0KØØØØ#ØŸ™Ÿ™ô1Ñ-�”˜T�_ô 1MØØØØ#ØŸ™Ÿ™ô1Ñ-�”˜Tœ_ð #Ÿo™o×0Ñ0Ð1EÓFˆDŒOØ×9Ñ9Ô;ä,¨T¯[©[×->Ñ->Õ?‰
ˆÜ/ØØ�J‰JØ�O‰OØØØØó
ð 	
r(   c                ó    <€ V ^8„  d   QhRS[ /# r   )Úbool)r#   r$   s   "€r%   r&   r¥   7  s   ø€ ÷ Wñ W©ñ Wr(   c                ó†   € V P                   P                  ;'       g%    V P                  RJ ;'       g    V P                  RJ # )z?
Return whether we need to compute new scales and zero points.
N)r+   Ú
is_dynamicra   r“   r,   s   &r%   r¸   Ú)IntxFakeQuantizer._should_compute_qparams7  s7   € ð �{‰{×%Ñ%×VÐV¨¯©°tÐ);×VÐV¸t¿¹ÐRVÐ?VÐVr(   c                ó   <€ V ^8„  d   QhRR/# )r    r!   Nr<   )r#   r$   s   "€r%   r&   r¥   =  s   ø€ ÷ Qñ Q¸$ñ Qr(   c                ó*  € V P                   P                  '       di   \        V P                  \        P
                  P                  4      '       g5   \        V P                  \        P
                  P                  4      '       d   R# V P                  V P                  r!\        V P                   P                  ,          w  r4\        P                  ! WP                  R7      p\        P
                  P                  VRR7      V n        V P                   P                  '       d   V P                  P                  4        R# \        P                  ! V4      p\        P                  ! W#V4      p\        P
                  P                  VRR7      V n        R# )z’
If range learning is enabled, turn scales and zero points into trainable parameters.
This function is idempotent and should only be called once.
Nr~   T)Úrequires_grad)r+   r¬   r3   ra   rN   ÚnnÚ	Parameterr“   r	   r\   rˆ   r§   r¶   Úzero_r   r›   )r-   ra   r“   rœ   r�   s   &    r%   r¼   Ú:IntxFakeQuantizer._maybe_update_qparams_for_range_learning=  sø   € ð —‘×*×*Ð*Ü˜$Ÿ*™*¤e§h¡h×&8Ñ&8×9Ò9Ü˜$Ÿ/™/¬5¯8©8×+=Ñ+=×>Ò>áØ ŸJ™J¨¯©ˆzÜ,¨T¯[©[×->Ñ->Õ?‰
ˆä—’˜E§¡Ô7ˆÜ—X‘X×'Ñ'¨¸TÐ'ÓBˆŒ
Ø�;‰;×#×#Ð#Ø�O‰O×!Ñ!Ö#äŸš jÓ1ˆJÜŸš Z°tÓ<ˆJÜ#Ÿh™h×0Ñ0°È4Ð0ÓPˆDŽOr(   )r¨   r§   r+   rM   ra   r“   )r=   r>   r?   r@   rA   rL   rd   r­   r®   r¸   r¼   rD   rE   rg   rh   s   @@r%   r4   r4   ¾   sU   ù‡ € ñ÷"ó "÷Sð S÷4Tð T÷,5
ð 5
÷nWð W÷Q÷ Qð Qr(   r4   c                   óB   a a€ ] tR tRt oRtV3R lV 3R lltRtVtV ;t# )ÚFakeQuantizeriV  zW
(Deprecated) Please use :class:`~torchao.quantization.qat.IntxFakeQuantizer` instead.
c                ó    <€ V ^8„  d   QhRS[ /# r;   r1   )r#   r$   s   "€r%   r&   ÚFakeQuantizer.__annotate__[  s   ø€ ÷ 'ñ 'Ñ5ñ 'r(   c                ó<   <€ \         SV `  V4       \        V 4       R # )N)rK   rL   r   rQ   s   &&€r%   rL   ÚFakeQuantizer.__init__[  s   ø€ Ü‰Ñ˜Ô Ü  Ö&r(   r<   )	r=   r>   r?   r@   rA   rL   rD   rE   rg   rh   s   @@r%   rÒ   rÒ   V  s   ù‡ € ñ÷'÷ 'ó 'r(   rÒ   )'Útypingr   rN   Ú torchao.quantization.granularityr   r   r   r   Ú%torchao.quantization.quant_primitivesr   r	   r
   r   r   r   r   r   r   Útorchao.quantization.utilsr   r   r   r   Úfake_quantize_configr   r   r   r   Úutilsr   r   r   rÍ   ÚModuler   r6   r5   r4   rÒ   r<   r(   r%   Ú<module>rÞ      s”   ðõ ã ÷ó ÷
÷ 
õ 
÷ó ÷ó ÷ñ ô?˜Ÿ™Ÿ™ô ?ô2Ð+ô ô8V,Ð/ô V,ôrTQÐ)ô TQôp'Ð%ö 'r(   