+
    "Ý³jf6  ã                   ó$  € ^ RI HtHt ^ RIt^ RIHu Ht ^ RIH	t	 ^ RI
Ht ^RIHtHt ^RIHt ^RIHt ^RIHt  ! R	 R
]P
                  P*                  4      t ! R R]4      t ! R R]4      t ! R R]P
                  P2                  4      tR# )é    )ÚAnyÚOptionalN)ÚTorchAODType)Úget_group_qparams_symmetric)ÚFakeQuantizeConfigBaseÚ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# )ÚFakeQuantizedEmbeddinga¡  
General embedding layer with fake quantized weights.

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

Example usage::

    weight_config = IntxFakeQuantizeConfig(
        dtype=torch.int4,
        group_size=8,
        symmetric=True,
    )
    fq_embedding = FakeQuantizedEmbedding(5, 10, weight_config)
    fq_embedding(torch.LongTensor([3]))
c                ó~   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[,          RS[RS[RS[RS[S[,          R	R
/	# )é   Únum_embeddingsÚembedding_dimÚpadding_idxÚmax_normÚ	norm_typeÚscale_grad_by_freqÚsparseÚweight_configÚreturnN)Úintr   ÚfloatÚboolr   )ÚformatÚ__classdict__s   "€Úc/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torchao/quantization/qat/embedding.pyÚ__annotate__Ú#FakeQuantizedEmbedding.__annotate__,   ss   ø€ ÷ .ñ .áð.ñ ð.ñ ™c•]ð	.ñ
 ™5•/ð.ñ ð.ñ !ð.ñ ð.ñ  Ñ 6Õ7ð.ð 
ñ.ó    c	           	     óÊ   <€ \         SV `  ! VVVVVVV.V	O5/ V
B  \        P                  P	                  R 4       Ve   \
        P                  ! V4      V n        R# RV n        R# )z/torchao.quantization.qat.FakeQuantizedEmbeddingN)ÚsuperÚ__init__ÚtorchÚ_CÚ_log_api_usage_oncer	   Úfrom_configÚweight_fake_quantizer)Úselfr   r   r   r   r   r   r   r   ÚargsÚkwargsÚ	__class__s   &&&&&&&&&*,€r   r$   ÚFakeQuantizedEmbedding.__init__,   sq   ø€ ô 	‰ÒØØØØØØØð
	
ð ò
	
ð ò
	
ô 	�‰×$Ñ$Ð%VÔWØÒ$Ü):×)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    J   s#   ø€ ÷ 
ñ 
™Ÿ™ð 
©%¯,©,ñ 
r!   c           	     ó
  € V P                   e   V P                  V P                  4      pMV P                  p\        P                  ! VVV P                  V P
                  V P                  V P                  V P                  4      # ©N)	r)   ÚweightÚFÚ	embeddingr   r   r   r   r   )r*   r0   Úws   && r   ÚforwardÚFakeQuantizedEmbedding.forwardJ   si   € Ø×%Ñ%Ò1Ø×*Ñ*¨4¯;©;Ó7‰Aà—‘ˆAÜ�{Š{ØØØ×ÑØ�M‰MØ�N‰NØ×#Ñ#Ø�K‰Kó
ð 	
r!   c                óH   <€ V ^8„  d   QhRS[ P                  P                  /# )r   r   )r%   ÚnnÚ	Embedding)r   r   s   "€r   r   r    Y   s   ø€ ÷ ñ ™eŸh™h×0Ñ0ñ r!   c                ó²  € \         P                  P                  V P                  V P                  V P
                  V P                  V P                  V P                  V P                  V P                  P                  V P                  P                  R 7	      pV P                  P                  \         P                  ! R4      8w  d   V P                  Vn
        V# ))ÚdeviceÚdtypeÚmeta)r%   r;   r<   r   r   r   r   r   r   r   r4   r>   r?   )r*   Únew_embeddings   & r   Úto_embeddingÚ#FakeQuantizedEmbedding.to_embeddingY   s�   € ÜŸ™×*Ñ*Ø×ÑØ×ÑØ×ÑØ�M‰MØ�N‰NØ×#Ñ#Ø�K‰KØ—;‘;×%Ñ%Ø—+‘+×#Ñ#ð +ó 

ˆð �;‰;×Ñ¤§¢¨fÓ!5Ô5Ø#'§;¡;ˆMÔ ØÐr!   c                ó^   <€ V ^8„  d   QhRS[ P                  P                  RS[S[,          /# )r   Úmodr   )r%   r;   r<   r   r   )r   r   s   "€r   r   r    m   s/   ø€ ÷ ñ á�X‰X×Ñðñ  Ñ 6Õ7ñr!   c                óŒ  € \        VP                  VP                  VP                  VP                  VP
                  VP                  VP                  VVP                  P                  VP                  P                  R 7
      pVP                  P                  \        P                  ! R4      8w  d   VP                  Vn        V# ))r   r>   r?   r@   )r   r   r   r   r   r   r   r   r4   r>   r?   r%   )ÚclsrE   r   rA   s   &&& r   Úfrom_embeddingÚ%FakeQuantizedEmbedding.from_embeddingl   s‘   € ô /Ø×ÑØ×ÑØ�O‰OØ�L‰LØ�M‰MØ×"Ñ"Ø�J‰JØ'Ø—:‘:×$Ñ$Ø—*‘*×"Ñ"ô
ˆð �:‰:×Ñ¤§¢¨VÓ 4Ô4Ø#&§:¡:ˆMÔ ØÐr!   )r)   )NNç       @FFNr3   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r$   r8   rB   ÚclassmethodrH   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r-   r   s   @@r   r   r      sF   ù‡ € ñ÷".õ .÷<
ð 
÷ð ð& ÷ñ ó ÷ð r!   r   c                   óª   a a€ ] tR t^‹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RtVtV ;t# )Ú#Int4WeightOnlyEmbeddingQATQuantizerzw
Quantizer for performing QAT on a model, where embedding layers have
int4 fake quantized grouped per channel weights.
é   c                óX   <€ V ^8„  d   QhRS[ RS[P                  RS[P                  RR/# )r   Ú
group_sizeÚscale_precisionÚzero_point_precisionr   N)r   r%   r?   )r   r   s   "€r   r   Ú0Int4WeightOnlyEmbeddingQATQuantizer.__annotate__‘   sA   ø€ ÷ Fñ FáðFñ Ÿ™ðFñ $Ÿk™kð	Fð
 
ñFr!   c                ó”   <€ \         SV `  4        \        P                  P	                  R 4       ^V n        Wn        W n        W0n        R# )z<torchao.quantization.qat.Int4WeightOnlyEmbeddingQATQuantizerN)	r#   r$   r%   r&   r'   Ú	bit_widthrY   rZ   r[   )r*   rY   rZ   r[   r-   s   &&&&€r   r$   Ú,Int4WeightOnlyEmbeddingQATQuantizer.__init__‘   s?   ø€ ô 	‰ÑÔÜ�‰×$Ñ$ØJô	
ð ˆŒØ)ŒØ,;ÔØ1EÖ!r!   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# ©r   Úmodelr+   r,   r   ©r%   r;   ÚModuler   )r   r   s   "€r   r   r\       s=   ø€ ÷ 'ñ 'Ù—X‘X—_‘_ð'Ù-0ð'Ù<?ð'á	�‰�‰ñ'r!   c                óD   a € ^ RI Hp R R lpR V 3R llpV! WV4       V# )z@
Swap `nn.Embedding` modules with `Int4WeightOnlyQATEmbedding`.
)Ú)_replace_with_custom_fn_if_matches_filterc                ód   € V ^8„  d   QhR\         P                  P                  R\        R\        /# )r   ÚchildÚcur_fqnr   )r%   r;   rd   Ústrr   )r   s   "r   r   ÚAInt4WeightOnlyEmbeddingQATQuantizer.prepare.<locals>.__annotate__«   s)   € ÷ 	9ñ 	9œUŸX™XŸ_™_ð 	9´sð 	9¼tñ 	9r!   c                 óJ   € \        V \        P                  P                  4      # r3   )Ú
isinstancer%   r;   r<   )rh   ri   s   &&r   Ú	filter_fnÚ>Int4WeightOnlyEmbeddingQATQuantizer.prepare.<locals>.filter_fn«   s   € Ü˜e¤U§X¡X×%7Ñ%7Ó8Ð8r!   c                ó€   € V ^8„  d   QhR\         P                  P                  R\         P                  P                  /# )r   rh   r   ©r%   r;   rd   )r   s   "r   r   rk   ®   s*   € ÷ 	!ñ 	!¤%§(¡(§/¡/ð 	!´e·h±h·o±oñ 	!r!   c                 óÎ  <€ \        V P                  V P                  V P                  V P                  V P
                  V P                  V P                  SP                  SP                  SP                  V P                  P                  V P                  P                  R 7      pV P                  P                  \        P                  ! R4      8w  d   V P                  Vn        V# ))r   r   r   r   r   r   r   rY   rZ   r[   r>   r?   r@   )ÚInt4WeightOnlyQATEmbeddingr   r   r   r   r   r   r   rY   rZ   r[   r4   r>   r?   r%   )rh   rA   r*   s   & €r   Úreplacement_fnÚCInt4WeightOnlyEmbeddingQATQuantizer.prepare.<locals>.replacement_fn®   s¨   ø€ Ü6à$×3Ñ3Ø#×1Ñ1Ø!×-Ñ-ØŸ™ØŸ/™/Ø#(×#;Ñ#;Ø—|‘|àŸ?™?Ø $× 4Ñ 4Ø%)×%>Ñ%>Ø—|‘|×*Ñ*Ø—l‘l×(Ñ(ôˆMð& �|‰|×"Ñ"¤e§l¢l°6Ó&:Ô:Ø',§|¡|�Ô$Ø Ð r!   )Útorchao.quantization.quant_apirf   )r*   rb   r+   r,   rf   rn   rt   s   f&*,   r   ÚprepareÚ+Int4WeightOnlyEmbeddingQATQuantizer.prepare    s(   ø€ õ	
õ	9÷	!ð 	!ñ0 	2°%ÈÔSØˆr!   c                ó‚   <€ V ^8„  d   QhRS[ P                  P                  RS[RS[RS[ P                  P                  /# ra   rc   )r   r   s   "€r   r   r\   É   s=   ø€ ÷ ñ Ù—X‘X—_‘_ðÙ-0ðÙ<?ðá	�‰�‰ñr!   c                ó(   € V P                  V4       V# )zO
Swap all `Int4WeightOnlyQATEmbedding` modules with `Int4WeightOnlyEmbedding`.
)Ú_convert_helper)r*   rb   r+   r,   s   &&*,r   ÚconvertÚ+Int4WeightOnlyEmbeddingQATQuantizer.convertÉ   s   € ð 	×Ñ˜UÔ#Øˆr!   c                óH   <€ V ^8„  d   QhRS[ P                  P                  /# )r   Úmodulerq   )r   r   s   "€r   r   r\   Ò   s   ø€ ÷ 8,ñ 8,¡e§h¡h§o¡oñ 8,r!   c                óÊ  € ^ RI Hp VP                  4        EFÇ  w  r4\        V\        4      '       Edš   VP
                  P                  P                  pVP
                  P                  P                  pVP
                  P                  P                  p\        VP                  VP                  VP                  VP                  VP                  VP                   VP"                  VVVVP$                  P&                  VP$                  P(                  R7      p\+        WV4       \-        V P.                  4      w  rš\1        VP$                  V P.                  VVR7      w  r¼VP3                  V4      pV! VP$                  VVV	V
\4        P6                  V4      pWØn        VP3                  V4      Vn        VP3                  V4      Vn        EK¶  V P=                  V4       EKÊ  	  R# )zi
Helper function to recursively swap `Int4WeightOnlyQATEmbedding`
modules with `Int4WeightOnlyEmbedding`
)Ú8_quantized_decomposed_quantize_per_channel_group_wrapper)r   r   r   r   r   r   r   rY   rZ   r[   r>   Úoutput_dtype)Ú	precisionN)Útorchao._executorch_opsr�   Únamed_childrenrm   rs   r)   ÚconfigrY   rZ   r[   ÚInt4WeightOnlyEmbeddingr   r   r   r   r   r   r   r4   r>   r?   Úsetattrr   r^   r   Útor%   Úint8ÚscaleÚ
zero_pointr{   )r*   r   r�   Únamerh   rY   rZ   r[   Úquantized_embeddingÚqminÚqmaxÚsÚzpÚq_weights   &&            r   r{   Ú3Int4WeightOnlyEmbeddingQATQuantizer._convert_helperÒ   s�  € õ
	
ð "×0Ñ0×2‰KˆDÜ˜%Ô!;×<Ó<Ø"×8Ñ8×?Ñ?×JÑJ�
Ø"'×"=Ñ"=×"DÑ"D×"TÑ"T�à×/Ñ/×6Ñ6×KÑKð %ô '>à#(×#7Ñ#7Ø"'×"5Ñ"5Ø %× 1Ñ 1Ø"Ÿ^™^Ø#Ÿo™oØ',×'?Ñ'?Ø Ÿ<™<à)Ø$3Ø)=Ø Ÿ<™<×.Ñ.Ø!&§¡×!3Ñ!3ô'Ð#ô  ˜Ð&9Ô:ô  .¨d¯n©nÓ=‘�Ü5Ø—L‘LØ—N‘NØØ-ô	‘�ð —U‘UÐ/Ó0�ÙSØ—L‘LØØØØÜ—J‘JØó�ð .6Ô*Ø,-¯D©D°Ó,AÐ#Ô)Ø13·±Ð7KÓ1LÐ#×.à×$Ñ$ U×+ó_ 3r!   )r^   rY   rZ   r[   )rK   rL   rM   rN   rO   r%   Úfloat32Úint32r$   rw   r|   r{   rQ   rR   rS   rT   s   @@r   rV   rV   ‹   sM   ù‡ € ñð Ø',§}¡}Ø,1¯K©K÷	Fõ F÷'ð '÷Rð ÷8,÷ 8,ð 8,r!   rV   c                   óš   a a€ ] tR tRt oRtRR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# )rs   i  a"  
This module implements a embedding layer with int4 fake quantized
grouped per channel weights.

args:
    group_size: the number of elements in each quantized group for weights
    scale_precision: precision of per group scales
    zero_point_precision: precision of per group zero points
NrJ   Fc                óž   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[,          RS[RS[RS[RS[ R	S[P
                  R
S[P
                  /
# )r   r   r   r   r   r   r   r   rY   rZ   r[   )r   r   r   r   r%   r?   )r   r   s   "€r   r   Ú'Int4WeightOnlyQATEmbedding.__annotate__  s   ø€ ÷ "
ñ "
áð"
ñ ð"
ñ ™c•]ð	"
ñ
 ™5•/ð"
ñ ð"
ñ !ð"
ñ ð"
ñ ð"
ñ Ÿ™ð"
ñ $Ÿk™kñ"
r!   c           
     ó|   <€ \        \        P                  VR R V	V
R7      p\        SV `  ! VVVVVVVV.VO5/ VB  R# )T)r?   rY   Úis_symmetricÚ
is_dynamicrZ   r[   N)r   r   ÚINT4r#   r$   )r*   r   r   r   r   r   r   r   rY   rZ   r[   r+   r,   r   r-   s   &&&&&&&&&&&*, €r   r$   Ú#Int4WeightOnlyQATEmbedding.__init__  sb   ø€ ô /Ü×#Ñ#Ø!ØØØ+Ø!5ô
ˆô 	‰ÒØØØØØØØØð	
ð ò	
ð ô	
r!   c                ó    <€ V ^8„  d   QhRS[ /# )r   Úenabled)r   )r   r   s   "€r   r   r™   <  s   ø€ ÷ 5ñ 5©ñ 5r!   c                ó&   € WP                   n        R # r3   )r)   r    )r*   r    s   &&r   Úenable_fake_quantÚ,Int4WeightOnlyQATEmbedding.enable_fake_quant<  s   € Ø-4×"Ñ"Ö*r!   c                ó(   € V P                  R 4       R# )FN)r¢   )r*   s   &r   Údisable_fake_quantÚ-Int4WeightOnlyQATEmbedding.disable_fake_quant?  s   € Ø×Ñ˜uÖ%r!   © )T)rK   rL   rM   rN   rO   r%   r•   r–   r$   r¢   r¥   rQ   rR   rS   rT   s   @@r   rs   rs     sK   ù‡ € ñð &*Ø$(ØØ#(ØØØ',§}¡}Ø,1¯K©K÷"
õ "
÷H5ò 5÷&ò &r!   rs   c            
       óœ   a a€ ] tR tRt oRtRRRRR^ ]P                  ]P                  R]P                  3
V3R lV 3R llltR t	R	t
VtV ;t# )
r‡   iC  z[
This module implements a embedding layer with int4 quantized
grouped per channel weights.
NrJ   Fc                óÒ   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[,          RS[RS[RS[RS[ R	S[P
                  R
S[P
                  RS[P                  RS[P
                  /# )r   r   r   r   r   r   r   r   rY   rZ   r[   r>   r‚   )r   r   r   r   r%   r?   r>   )r   r   s   "€r   r   Ú$Int4WeightOnlyEmbedding.__annotate__I  s›   ø€ ÷ 7
ñ 7
áð7
ñ ð7
ñ ™c•]ð	7
ñ
 ™5•/ð7
ñ ð7
ñ !ð7
ñ ð7
ñ ð7
ñ Ÿ™ð7
ñ $Ÿk™kð7
ñ —‘ð7
ñ —k‘kñ7
r!   c           	     óê  <€ \         SV `  4        Wn        W n        W0n        W@n        WPn        W`n        Wpn        ^V n	        W€n
        W�n        W n        WÀn        V P                  R\        P                   ! W3\        P"                  VR7      4       V P                  R\        P                   ! WV,          3V	VR7      4       V P                  R\        P                   ! WV,          3V
VR7      4       R# )é   r4   )r?   r>   r‹   rŒ   N)r#   r$   r   r   r   r   r   r   r   r^   rY   rZ   r[   r‚   Úregister_bufferr%   ÚemptyrŠ   )r*   r   r   r   r   r   r   r   rY   rZ   r[   r>   r‚   r-   s   &&&&&&&&&&&&&€r   r$   Ú Int4WeightOnlyEmbedding.__init__I  sæ   ø€ ô 	‰ÑÔð -ÔØ*ÔØ&ÔØ ŒØ"ŒØ"4ÔØŒð ˆŒØ$ŒØ.ÔØ$8Ô!Ø(Ôð 	×ÑØÜ�KŠKØÐ/´u·z±zÈ&ôô	
ð 	×ÑØÜ�KŠKØ°*Õ!<Ð=Ø%Øôô	
ð 	×ÑØÜ�KŠKØ°*Õ!<Ð=Ø*Øôö	
r!   c                ó|  € ^ RI Hp \        V P                  4      w  r4V! V P                  ^V P
                  .V P                  V P                  \        P                  VVV P                  R7      p\        P                  ! VVV P                  V P                  V P                  V P                   V P"                  4      # )r   )Údequantize_affine)r‚   )Ú%torchao.quantization.quant_primitivesr±   r   r^   r4   rY   r‹   rŒ   r%   rŠ   r‚   r5   r6   r   r   r   r   r   )r*   r0   r±   r�   r�   Úw_dqs   &&    r   r8   ÚInt4WeightOnlyEmbedding.forward‚  sœ   € õ	
ô $ D§N¡NÓ3‰
ˆñ
 !Ø�K‰KØ�—‘Ð Ø�J‰JØ�O‰OÜ�J‰JØØØ×*Ñ*ô	
ˆô �{Š{ØØØ×ÑØ�M‰MØ�N‰NØ×#Ñ#Ø�K‰Kó
ð 	
r!   )r^   r   rY   r   r   r   r‚   r   r   rZ   r   r[   )rK   rL   rM   rN   rO   r%   r•   r–   r$   r8   rQ   rR   rS   rT   s   @@r   r‡   r‡   C  sK   ù‡ € ñð &*Ø$(ØØ#(ØØØ',§}¡}Ø,1¯K©KØ#Ø$)§M¡M÷7
õ 7
÷r
ò 
r!   r‡   )Útypingr   r   r%   Útorch.nn.functionalr;   Ú
functionalr5   r²   r   Útorchao.quantization.utilsr   Úfake_quantize_configr   r   Úfake_quantizerr	   Útwo_step_quantizerr
   Úutilsr   r<   r   rV   rs   rd   r‡   r§   r!   r   Ú<module>r½      sx   ð÷ !ã ß Ð å >Ý B÷õ .Ý 0õô
i˜UŸX™X×/Ñ/ô iôb,Ð*:ô ,ôD3&Ð!7ô 3&ôl[
˜eŸh™hŸo™oö [
r!   