Ë
    S^(hÚ  ã                   óx   — d Z ddlmZmZmZ  e«       rddlZ ej                  e«      Zd„ Z	d„ Z
d„ Zd
d„Zdd	„Zy)z2HQQ (Half-Quadratic Quantization) integration fileé   )Úis_hqq_availableÚis_torch_availableÚloggingé    Nc                 óB   — | j                  «       D ]  \  }}||_        Œ y ©N)Únamed_modulesÚname)Úmodelr
   Úmodules      ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/integrations/hqq.pyÚautoname_modulesr      s%   € Ø×+Ñ+Ó-ò ‰ˆˆfØˆ�ñó    c                 ó”   — dj                  | j                  d«      D �cg c]  }|dvsŒ|j                  «       rŒ|‘Œ c}«      S c c}w )Nú.)r   Úlayers)ÚjoinÚsplitÚ	isnumeric)r
   Úns     r   Úname_to_linear_tagr       s;   € Ø�8‰8 §
¡
¨3£Öl˜1°QÐ>QÒ5QÐ\]×\gÑ\gÕ\i’QÒlÓmÐmùÒls   Ÿ	A©AºAc                 óþ   — t        «       rddlm} t        «       }| j	                  «       D ]F  \  }}t        |t        j                  j                  f«      sŒ-|j                  t        |«      «       ŒH t        |«      S )Nr   )Ú	HQQLinear)r   Úhqq.core.quantizer   Úsetr	   Ú
isinstanceÚtorchÚnnÚLinearÚaddr   Úlist)r   r   Úlinear_tagsr
   r   s        r   Úget_linear_tagsr#   %   sd   € ÜÔÝ/ä“%€KØ×+Ñ+Ó-ò 6‰ˆˆfÜ�fœuŸx™xŸ™°	Ð:Õ;Ø�O‰OÔ.¨tÓ4Õ5ð6ô �ÓÐr   c                 óJ  — | j                  «       D �]  \  }}|€g }|j                  |«       t        |t        j                  j
                  «      r†t        |j                  «      }||v rW||   �R||   | j                  |   _	        t        |«      | j                  |   _        | j                  |   j                  d«       d}dD ]  }t        ||d «       Œ t        t        |j!                  «       «      «      dkD  rt#        |||¬«      \  }}|j%                  d«       �Œ | |fS )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ØÐ#Ø!ÐØ×Ñ Ô%ä�fœeŸh™hŸo™oÔ.ä+¨F¯K©KÓ8ˆJð ˜\Ñ)Ø 
Ñ+Ð7Ø8DÀZÑ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                 ó  ‡— |€g n|}t        | «       t        | «      Š|j                  }|j                  }t	        t        ‰«      t        |«      z
  t        |«      z
  «      Št        ˆfd„|j                  «       D «       «      r't        j                  ‰«      }|j                  |«       nt        j                  ‰|«      }t        | ||¬«      \  } }||j                  |dœ| j                  _        |st        j!                  d«       | S )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 neme 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 exepects it, this is referred to as patch_params
    c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr   © )Ú.0Úkeyr"   s     €r   ú	<genexpr>z)prepare_for_hqq_linear.<locals>.<genexpr>k   s   øè ø€ Ò
= #ˆ3�+ÔÑ
=ùs   ƒr'   )r.   Úquant_methodÚskip_modulesz<No linear modules were found in your model for quantization.)r   r#   rB   r.   r!   r   ÚanyÚkeysÚdictÚfromkeysÚupdater5   rA   ÚconfigÚquantization_configÚloggerÚwarning)r   rI   Úmodules_to_not_convertr)   rB   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ä
Ó
=¨×):Ñ):Ó)<Ô
=Ô=ä—}‘} [Ó1ˆØ×Ñ˜LÕ)ô —}‘} [°,Ó?ˆä6Ø˜LÐ<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      sH   ðñ 5ç AÑ Añ ÔÛà	ˆ×	Ñ	˜HÓ	%€òònò
ó"$ôJ,r   