ó
    >:jº$  ã                   ó˜   • S SK r S SKrS SKJr  S SKrS SKJr  S SKJs  Jr	  S SK
JrJr   " S S\5      r " S S\R                  \5      rg)é    N)ÚOptional)ÚBaseTunerLayerÚcheck_adapters_to_mergec                   ód   • \ rS rSrSrSrS\R                  4S jr  SS\	S\	4S jjr
S	 rS
 rSrg)Ú
ShiraLayeré   )Úshira_weight)ÚrÚscalingÚshira_indicesÚ
base_layerc                 óŠ  • Xl         0 U l        0 U l        [        R                  " 0 5      U l        0 U l        UR                  R                  U l	        SU l
        / U l        U R                  5       n[        U[        R                  5      (       a  UR                  UR                   pCO[#        S5      eX0l        X@l        X l        g )NFz)Only nn.Linear layers supported currently)r   r
   r   ÚnnÚParameterDictr	   r   ÚweightÚshapeÚweight_shapeÚ_disable_adaptersÚmerged_adaptersÚget_base_layerÚ
isinstanceÚLinearÚin_featuresÚout_featuresÚNotImplementedErrorÚkwargs)Úselfr   r   r   r   s        ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/shira/layer.pyÚ__init__ÚShiraLayer.__init__    s¥   € Ø$ŒØˆŒØˆŒÜ×,Ò,¨RÓ0ˆÔØˆÔØ&×-Ñ-×3Ñ3ˆÔð "'ˆÔØ!ˆÔà×(Ñ(Ó*ˆ
Ü�j¤"§)¡)×,Ñ,Ø(2×(>Ñ(>À
×@WÑ@W™ä%Ð&QÓRÐRà&ÔØ(ÔØ�ó    Úinit_weightsÚinference_modec                 ó  • US::  a  [        SU 35      eX0R                  U'   SU R                  U'   X0R                  U R                  -   -  nXpR                  U R                  -  :”  a)  [        SU SU R                  U R                  -   S35      eU(       a  [
        R                  " U5      O[
        R                  " U5      n[        R                  " UR                  U R                  R                  R                  5      R                  U R                  R                  R                  5      SS9U R                  U'   UGb  [
        R                   " US:H  5      n	[
        R"                  " U	S   R%                  S5      U	S	   R%                  S5      /S5      R                  [
        R&                  5      U R(                  U'   U R(                  U   R                  U R                  R                  R                  5      U R(                  U'   U R(                  U   R*                  S	   U R                  U   R*                  S   :w  a  [        S
U SU R                   35      eU R-                  U5        U R/                  U R0                  US9  g )Nr   z?`r` should be a positive integer value but the value passed is g      ð?zThe set rank zP results in more shira params than the total number of params in the base layer z and this is not allowed.T)Úrequires_gradé   zFThe SHiRA indices and weights are not the same dimensions for adapter z
 in layer )r#   )Ú
ValueErrorr
   r   r   r   ÚtorchÚzerosÚrandnr   Ú	ParameterÚtor   r   ÚdtypeÚdevicer	   ÚwhereÚcatÚ	unsqueezeÚintr   r   Ú%_move_adapter_to_device_of_base_layerÚset_adapterÚactive_adapters)
r   Úadapter_nameÚmaskr
   r"   r#   r   Únum_shira_weightÚshira_init_weightÚmask_indicess
             r   Úupdate_layerÚShiraLayer.update_layer6   sy  € ð �‹6ÜÐ^Ð_`Ð^aÐbÓcÐcØ �‰ˆ|Ñàð 	�‰�\Ñ"ð × 0Ñ 0°4×3DÑ3DÑ DÑEÐØ×.Ñ.°×1BÑ1BÑBÓBÜØ ˜sÐ"rÐsw÷  tDñ  tDð  GK÷  GXñ  GXñ  tXð  sYð  Yrð  sóð ö >JœEŸKšKÐ(8Ô9ÌuÏ{Ê{Ð[kÓOlÐÜ*,¯,ª,Ø× Ñ  §¡×!7Ñ!7×!=Ñ!=Ó>×AÑAÀ$Ç/Á/×BXÑBX×B_ÑB_Ó`Øñ+
ˆ×Ñ˜,Ñ'ð
 Òä Ÿ;š; t¨s¡{Ó3ˆLÜ/4¯yªyØ˜a‘×*Ñ*¨1Ó-¨|¸A©×/HÑ/HÈÓ/KÐLÈaó0ç‰b”—‘‹mð ×Ñ˜|Ñ,ð 04×/AÑ/AÀ,Ñ/O×/RÑ/RÐSW×SbÑSb×SiÑSi×SpÑSpÓ/qˆD×Ñ˜|Ñ,à×!Ñ! ,Ñ/×5Ñ5°aÑ8¸D×<MÑ<MÈlÑ<[×<aÑ<aÐbcÑ<dÓdÜ Ø\Ð]iÐ\jÐjtÐuy÷  vEñ  vEð  uFð  Góð ð 	×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr!   c                 ó\   • [         R                  R                  U R                  U   5        g ©N)r   ÚinitÚzeros_r	   ©r   r6   s     r   Úreset_shira_parametersÚ!ShiraLayer.reset_shira_parametersf   s   € Ü
�‰�‰�t×(Ñ(¨Ñ6Õ7r!   c                 ó@   • XR                   ;  a  g X R                   U'   g r>   )r   )r   ÚadapterÚscales      r   Ú	set_scaleÚShiraLayer.set_scalei   s   € ØŸ,™,Ó&àØ %�‰�WÒr!   )r   r   r   r   r   r   r
   r   r   r	   r   N)TF)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úadapter_layer_namesÚother_param_namesr   ÚModuler   Úboolr;   rB   rG   Ú__static_attributes__© r!   r   r   r      sM   † à+Ðà9Ðð 2§9¡9ô ð6 "Ø$ñ.Nð
 ð.Nð õ.Nò`8õ&r!   r   c                   ó   ^ • \ rS rSr   SS\S\S\S\SS4
U 4S jjjrSS	\S
\\	\      SS4S jjr
SS jrS\R                  4S jrS\R                  S\R                  4S jrSS\S\4S jjrS\4U 4S jjrSrU =r$ )r   ép   r6   r
   Úfan_in_fan_outr"   ÚreturnNc                 óØ   >• [         TU ]  5         [        R                  " X40 UD6  XPl        U R                  U R                  5       La  [        S5      eX0l        U R                  X2XFS9  g )Nz)SHiRA does not support nested base layers)r"   )	Úsuperr   r   rU   r   r   r'   Ú_active_adapterr;   )	r   r   r7   r6   r
   rU   r"   r   Ú	__class__s	           €r   r   ÚLinear.__init__r   sc   ø€ ô 	‰ÑÔÜ×Ò˜DÑ7°Ò7Ø,ÔØ�?‰? $×"5Ñ"5Ó"7Ò7ÜÐHÓIÐIà+ÔØ×Ñ˜,¨aÐÒKr!   Ú
safe_mergeÚadapter_namesc                 ó>  • [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nU(       a€  UR                  R
                  R                  5       nXPR                  U5      -  n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        O.UR                  =R
                  U R                  U5      -  sl        U R                  R                  U5        GM     g)a  
Merge the active adapter weights into the base weights

Args:
    safe_merge (`bool`, *optional*):
        If True, the merge operation will be performed in a copy of the original weights and check for NaNs
        before merging the weights. This is useful if you want to check if the merge operation will produce
        NaNs. Defaults to `False`.
    adapter_names (`List[str]`, *optional*):
        The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults
        to `None`.
Nz1NaNs detected in the merged weights. The adapter z seems to be broken)r   r	   Úkeysr   r   ÚdataÚcloneÚget_delta_weightr(   ÚisfiniteÚallr'   r   Úappend)r   r\   r]   Úactive_adapterr   Úorig_weightss         r   ÚmergeÚLinear.merge…   së   € ô 0°ÓDˆÞàä+ˆNØ×!2Ñ!2×!7Ñ!7Ó!9Õ9Ø!×0Ñ0Ó2�
Þð $.×#4Ñ#4×#9Ñ#9×#?Ñ#?Ó#A�Là ×$9Ñ$9¸.Ó$IÑI�Lä Ÿ>š>¨,Ó7×;Ñ;×=Ñ=Ü(ØOÐP^ÐO_Ð_rÐsóð ð .:×%Ñ%Õ*à×%Ñ%×*Ò*¨d×.CÑ.CÀNÓ.SÑSÕ*Ø×$Ñ$×+Ñ+¨N×;ò% ,r!   c                 ó¤  • U R                   (       d  [        R                  " S5        g [        U R                  5      S:”  a�  U R                  R                  5       nXR                  R                  5       ;   a<  U R                  5       R                  =R                  U R                  U5      -  sl
        [        U R                  5      S:”  a  MŽ  g g )Nz Already unmerged. Nothing to do.r   )ÚmergedÚwarningsÚwarnÚlenr   Úpopr	   r_   r   r   r`   rb   )r   rf   s     r   ÚunmergeÚLinear.unmerge¬   s•   € Ø�{�{Ü�MŠMÐ<Ô=Øä�$×&Ñ&Ó'¨!Ó+Ø!×1Ñ1×5Ñ5Ó7ˆNØ×!2Ñ!2×!7Ñ!7Ó!9Ó9Ø×#Ñ#Ó%×,Ñ,×1Ò1°T×5JÑ5JÈ>Ó5ZÑZÕ1ô �$×&Ñ&Ó'¨!×+r!   c                 ó  • U R                   U   R                  U R                  U   R                  5      U R                   U'   [        R
                  " U R                   U   U R                  U   U R                  U   -  U R                  5      $ )zš
Compute the delta weight for the given adapter.

Args:
    adapter (str):
        The name of the adapter for which the delta weight should be computed.
)r   r,   r	   r.   r(   Úsparse_coo_tensorr   r   )r   rE   s     r   rb   ÚLinear.get_delta_weight¶   s‚   € ð '+×&8Ñ&8¸Ñ&A×&DÑ&DÀT×EVÑEVÐW^ÑE_×EfÑEfÓ&gˆ×Ñ˜7Ñ#Ü×&Ò&Ø×Ñ˜wÑ'¨×):Ñ):¸7Ñ)CÀdÇlÁlÐSZÑF[Ñ)[Ð]a×]nÑ]nó
ð 	
r!   Úxc                 ó0  • U R                   (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nU$ U R                  (       a  U R                  " U/UQ70 UD6nU$ [        R
                  " U R                  R                  R                  5      nU R                   H5  nX`R                  R                  5       ;  a  M"  XPR                  U5      -  nM7     [        R                  " XU R                  R                  S9nU$ )N)Úbias)Údisable_adaptersrk   rp   r   ÚcopyÚdeepcopyr   r`   r5   r	   r_   rb   ÚFÚlinearrw   )r   ru   Úargsr   ÚresultÚ
new_weightrf   s          r   ÚforwardÚLinear.forwardÅ   sÞ   € Ø× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8ˆFð ˆð �[�[Ø—_’_ QÐ8¨Ò8°Ñ8ˆFð ˆô Ÿš t§¡×'=Ñ'=×'BÑ'BÓCˆJØ"&×"6Ô"6�Ø!×):Ñ):×)?Ñ)?Ó)AÓAÙØ×3Ñ3°NÓCÑC’
ñ #7ô
 —X’X˜a°$·/±/×2FÑ2FÑGˆFàˆr!   c                 ó   • g)NFrR   rA   s     r   Úsupports_lora_conversionÚLinear.supports_lora_conversion×   s   € àr!   c                 ó*   >• [         TU ]  5       nSU-   $ )Nzshira.)rX   Ú__repr__)r   ÚreprZ   s     €r   r†   ÚLinear.__repr__Û   s   ø€ Ü‰gÑÓ ˆØ˜#‰~Ðr!   )rY   rU   )r   FT)FN)rV   N)Údefault)rI   rJ   rK   rL   Ústrr2   rP   r   r   Úlistrh   rp   r(   ÚTensorrb   r€   rƒ   r†   rQ   Ú__classcell__)rZ   s   @r   r   r   p   sË   ø† ð Ø$Ø!ñLð ð	Lð
 ðLð ðLð ðLð 
÷Lð Lñ&%< ð %<¸XÀdÈ3ÁiÑ=Pð %<Ð\`õ %<ôN[ð
¨5¯<©<ô 
ð˜Ÿ™ð ¸5¿<¹<ô ñ$°Sð Èõ ð˜#÷ õ r!   r   )ry   rl   Útypingr   r(   Útorch.nnr   Útorch.nn.functionalÚ
functionalr{   Úpeft.tuners.tuners_utilsr   r   r   rO   r   rR   r!   r   Ú<module>r“      sB   ðó Û Ý ã Ý ß Ð ç LôS&�ô S&ôlmˆR�Y‰Y˜
õ mr!   