§
    ‚ŠtjÓ  ã                   ó|   — 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dS )z2HQQ (Half-Quadratic Quantization) integration fileé   )Úis_hqq_availableÚis_torch_availableÚloggingé    Nc                 óH   — |                       ¦   «         D ]\  }}||_        Œd S ©N)Únamed_modulesÚname)Úmodelr
   Úmodules      ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/integrations/hqq.pyÚautoname_modulesr      s4   € Ø×+Ò+Ñ-Ô-ð ð ‰ˆˆfØˆŒˆðð ó    c                 óf   — d                      d„ |                      d¦  «        D ¦   «         ¦  «        S )Nú.c                 óB   — g | ]}|d v¯|                      ¦   «         °|‘ŒS ))r   Úlayers)Ú	isnumeric)Ú.0Úns     r   ú
<listcomp>z&name_to_linear_tag.<locals>.<listcomp>!   s5   € ÐlÐlÐl˜1°QÐ>QÐ5QÐ5QÐ\]×\gÒ\gÑ\iÔ\iÐ5Q�QÐ5QÐ5QÐ5Qr   )ÚjoinÚsplit)r
   s    r   Úname_to_linear_tagr       s-   € Ø�8Š8ÐlÐl §
¢
¨3¡¤ÐlÑlÔlÑmÔmÐmr   c                 ó  — t          ¦   «         rddlm} t          ¦   «         }|                      ¦   «         D ]H\  }}t          |t          j        j        |f¦  «        r"| 	                    t          |¦  «        ¦  «         ŒIt          |¦  «        S )Nr   )Ú	HQQLinear)r   Úhqq.core.quantizer   Úsetr	   Ú
isinstanceÚtorchÚnnÚLinearÚaddr   Úlist)r   r   Úlinear_tagsr
   r   s        r   Úget_linear_tagsr&   %   s�   € ÝÑÔð 0Ø/Ð/Ð/Ð/Ð/Ð/å‘%”%€KØ×+Ò+Ñ-Ô-ð 6ð 6‰ˆˆfÝ�f�uœxœ°	Ð:Ñ;Ô;ð 	6Ø�OŠOÕ.¨tÑ4Ô4Ñ5Ô5Ð5øÝ�ÑÔÐr   c                 óˆ  — |                       ¦   «         D �])\  }}|€g }|                     |¦  «         t          |t          j        j        ¦  «        r�t          |j        ¦  «        }||v r_||         �W||         | j        |         _	        t          |¦  «        | j        |         _        | j        |                              d¦  «         d}dD ]}t          ||d ¦  «         Œt          t          |                     ¦   «         ¦  «        ¦  «        dk    rt#          |||¬¦  «        \  }}|                     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   r8   r8   0   s[  € Ø×,Ò,Ñ.Ô.ð !ñ !‰ˆˆfØÐ#Ø!ÐØ×Ò Ñ%Ô%Ð%å�f�eœhœoÑ.Ô.ð 	+å+¨F¬KÑ8Ô8ˆJð ˜\Ð)Ð)Ø 
Ô+Ð7Ø8DÀZÔ8P�E”N 4Ô(Ô5å6:¸6±l´l�E”N 4Ô(Ô3à”N 4Ô(×7Ò7¸Ñ>Ô>Ð>à $Ðð 'ð +ð +�Ý˜  TÑ*Ô*Ð*Ð*å�t�F—O’OÑ%Ô%Ñ&Ô&Ñ'Ô'¨!Ò+Ð+Ý#:ØØ)Ø"3ð$ñ $ô $Ñ ˆAÐ ð 	×Ò˜RÑ Ô Ð Ñ àÐ#Ð#Ð#r   Fc                 ó<  ‡— |€g n|}t          | ¦  «         t          | ¦  «        Š|j        }|j        }t	          t          ‰¦  «        t          |¦  «        z
  t          |¦  «        z
  ¦  «        Št          ˆfd„|D ¦   «         ¦  «        r0t                               ‰¦  «        }| 	                    |¦  «         nt                               ‰|¦  «        }t          | ||¬¦  «        \  } }||j        |dœ| j        _        |st                               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 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
    Nc              3   ó    •K  — | ]}|‰v V — Œ	d S r   © )r   Úkeyr%   s     €r   ú	<genexpr>z)prepare_for_hqq_linear.<locals>.<genexpr>k   s(   øè è € Ð
6Ð
6 #ˆ3�+ÐÐ
6Ð
6Ð
6Ð
6Ð
6Ð
6r   r*   )r1   Úquant_methodÚskip_modulesz<No linear modules were found in your model for quantization.)r   r&   rD   r1   r$   r   ÚanyÚdictÚfromkeysÚupdater8   rC   ÚconfigÚquantization_configÚloggerÚwarning)r   rJ   Úmodules_to_not_convertr,   rD   r1   r+   r%   s          @r   Úprepare_for_hqq_linearrN   U   s=  ø€ ð $:Ð#A˜R˜RÐG]Ðõ �UÑÔÐõ " %Ñ(Ô(€Kð 'Ô3€LØ&Ô3€LÝ•s˜;Ñ'Ô'­#¨lÑ*;Ô*;Ñ;½cÐBXÑ>YÔ>YÑYÑZÔZ€Kå
Ð
6Ð
6Ð
6Ð
6¨Ð
6Ñ
6Ô
6Ñ6Ô6ð @å—}’} [Ñ1Ô1ˆØ×Ò˜LÑ)Ô)Ð)Ð)õ —}’} [°,Ñ?Ô?ˆå6Ø˜LÐ<Mð ñ  ô  Ñ€EÐð %Ø+Ô8Ø$ð(ð (€E„LÔ$ð ð WÝ�ŠÐUÑVÔVÐVà€Lr   r   )NNF)Ú__doc__Úutilsr   r   r   r    Ú
get_loggerÚ__name__rK   r   r   r&   r8   rN   r@   r   r   ú<module>rS      s¼   ðð 5Ð 4à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Að ÐÑÔð Ø€L€L€Là	ˆÔ	˜HÑ	%Ô	%€ðð ð ðnð nð nð
ð ð ð"$ð "$ð "$ð "$ðJ,ð ,ð ,ð ,ð ,ð ,r   