ó
    pyüiÓ  ã                   ó†   • S r SSKJrJrJr  \" 5       (       a  SSKr\R                  " \5      rS r	S r
S rS
S jrSS	 jrg)z2HQQ (Half-Quadratic Quantization) integration fileé   )Úis_hqq_availableÚis_torch_availableÚloggingé    Nc                 óB   • U R                  5        H  u  pXl        M     g ©N)Únamed_modulesÚname)Úmodelr
   Úmodules      ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/integrations/hqq.pyÚautoname_modulesr      s   € Ø×+Ñ+Ö-‰ˆØŽò .ó    c                 óª   • SR                  U R                  S5       Vs/ s H#  oS;  d  M
  UR                  5       (       a  M!  UPM%     sn5      $ s  snf )NÚ.)r   Úlayers)ÚjoinÚsplitÚ	isnumeric)r
   Úns     r   Úname_to_linear_tagr       s?   € Ø�8‰8 §
¡
¨3¤Ól¢˜1Ð>QÑ5Q“QÐ\]×\gÑ\g×\i—Q¡ÑlÓmÐmùÒls   Ÿ	A¬AÁAc                 ó  • [        5       (       a  SSKJn  [        5       nU R	                  5        HL  u  p4[        U[        R                  R                  W45      (       d  M2  UR                  [        U5      5        MN     [        U5      $ )Nr   )Ú	HQQLinear)r   Úhqq.core.quantizer   Úsetr	   Ú
isinstanceÚtorchÚnnÚLinearÚaddr   Úlist)r   r   Úlinear_tagsr
   r   s        r   Úget_linear_tagsr#   %   sc   € Ü×ÑÝ/ä“%€KØ×+Ñ+Ö-‰ˆÜ�fœuŸx™xŸ™°	Ð:×;Ó;Ø�O‰OÔ.¨tÓ4Ö5ñ .ô �ÓÐr   c                 óR  • U R                  5        GH  u  pEUc  / nUR                  U5        [        U[        R                  R
                  5      (       a‡  [        UR                  5      nXa;   aV  X   bQ  X   U R                  U   l	        [        U5      U R                  U   l        U R                  U   R                  S5        SnS H  n[        XWS 5        M     [        [        UR!                  5       5      5      S:”  a  [#        UUUS9u  p‚UR%                  S5        GM     X4$ )NFT)ÚW_qÚmetar   ©Úpatch_paramsÚhas_been_replacedéÿÿÿÿ)Únamed_childrenÚappendr   r   r   r   r   r
   Ú_modulesÚquant_configÚtypeÚ
source_clsÚrequires_grad_ÚsetattrÚlenr!   ÚchildrenÚ_prepare_for_hqq_linearÚpop)	r   r(   r)   Úcurrent_key_namer
   r   Ú
linear_tagÚattÚ_s	            r   r5   r5   0   s  € Ø×,Ñ,×.‰ˆØÑ#Ø!ÐØ×Ñ Ô%ä�fœeŸh™hŸo™o×.Ñ.ä+¨F¯K©KÓ8ˆJð Ó)ØÑ+Ñ7Ø8DÑ8P�E—N‘N 4Ñ(Ô5ä6:¸6³l�E—N‘N 4Ñ(Ô3à—N‘N 4Ñ(×7Ñ7¸Ô>à $Ðó '�Ü˜ TÖ*ñ 'ô Œt�F—O‘OÓ%Ó&Ó'¨!Ó+Ü#:ØØ)Ø"3ñ$Ñ ˆAð 	×Ñ˜R× ñ? /ðB Ð#Ð#r   c                 ó  ^• Uc  / OUn[        U 5        [        U 5      mUR                  nUR                  n[	        [        T5      [        U5      -
  [        U5      -
  5      m[        U4S jU 5       5      (       a'  [        R                  T5      nUR                  U5        O[        R                  TU5      n[        XUS9u  pUUR                  US.U R                  l        U(       d  [        R                  S5        U $ )a†  
Prepares nn.Linear layers for HQQ quantization.
Since each layer type can have separate quantization parameters, we need to do the following:
1- tag each module with its name via autoname_modules()
2- Extract linear_tags (e.g. ['self_attn.q_proj', ...])
3- Map quantization parameters as a dictionary linear_tag -> quant_params as HQQLinear expects it, this is referred to as patch_params
c              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   © )Ú.0Úkeyr"   s     €r   Ú	<genexpr>Ú)prepare_for_hqq_linear.<locals>.<genexpr>k   s   øé € Ð
6ª #�+Öªùs   ƒr'   )r.   Úquant_methodÚskip_modulesz<No linear modules were found in your model for quantization.)r   r#   rC   r.   r!   r   ÚanyÚdictÚfromkeysÚupdater5   rB   ÚconfigÚquantization_configÚloggerÚwarning)r   rI   Úmodules_to_not_convertr)   rC   r.   r(   r"   s          @r   Úprepare_for_hqq_linearrM   U   sí   ø€ ð $:Ñ#A™RÐG]Ðô �UÔô " %Ó(€Kð '×3Ñ3€LØ&×3Ñ3€LÜ”s˜;Ó'¬#¨lÓ*;Ñ;¼cÐBXÓ>YÑYÓZ€Kä
Ô
6©Ó
6×6Ñ6ä—}‘} [Ó1ˆØ×Ñ˜LÕ)ô —}‘} [°,Ó?ˆä6ØÐ<Mñ Ñ€Eð %Ø+×8Ñ8Ø$ñ(€E‡L�LÔ$ö Ü�‰ÐUÔVà€Lr   r   )NNF)Ú__doc__Úutilsr   r   r   r   Ú
get_loggerÚ__name__rJ   r   r   r#   r5   rM   r=   r   r   Ú<module>rR      sI   ðñ 5ç AÑ Añ ×ÑÛà	×	Ò	˜HÓ	%€òònò
ô"$õJ,r   