ó
    >:jÅ_  ã                  óä   • S SK J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Jr  S SKJr  SSKJr   " S S	\5      r " S
 S\R(                  \5      r " S S\R*                  \5      rg)é    )ÚannotationsN)ÚOptional)ÚBaseTunerLayerÚ_get_in_out_featuresÚcheck_adapters_to_merge)Ú	transposeé   )Ú
BufferDictc                  ó¢   • \ rS rSrSrSrSrSS jrSS jrSS jr	SSS jjr
SS	 jrSS
 jr        SS jrSS jrSS jrSS jrSS jrSrg)ÚTinyLoraLayeré   uŒ  
TinyLoRA layer implementation.

TinyLoRA is based on LoRA-XS and uses SVD decomposition of frozen weights. The key innovation is replacing the
trainable rÃ—r matrix R with:
    R = sum_i(v[i] * P[i])
where v is a tiny trainable vector and P_i are fixed random projection matrices.

The forward pass computes:
    result += lora_B(R(lora_A(x)))
where lora_A and lora_B are frozen SVD components.
)Ú
tinylora_v)Ú
tinylora_AÚ
tinylora_BÚ
tinylora_Pc                óZ  • Xl         0 U l        0 U l        [        R                  " 0 5      U l        S U l        0 U l        [        0 SS9U l	        [        0 SS9U l
        [        0 SS9U l        SU l        / U l        S U l        [        U R!                  5       5      u  U l        U l        X l        g )NT)Ú
persistentF)Ú
base_layerÚrÚuÚnnÚ
ModuleDictÚtinylora_dropoutr   Ú_tinylora_v_refr
   r   r   r   Ú_disable_adaptersÚmerged_adaptersÚ
_layer_idxr   Úget_base_layerÚin_featuresÚout_featuresÚkwargs)Úselfr   r!   s      ÚW/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/tinylora/layer.pyÚ__init__ÚTinyLoraLayer.__init__1   s¥   € Ø$ŒØˆŒØˆŒÜ "§¢¨bÓ 1ˆÔð 48ˆŒð 9;ˆÔô
 % R°DÑ9ˆŒÜ$ R°DÑ9ˆŒô % R°DÑ9ˆŒð "'ˆÔØ!ˆÔð *.ˆŒä.BÀ4×CVÑCVÓCXÓ.YÑ+ˆÔ˜$Ô+Ø�ó    c                ó*  • [        5       nUR                  U R                  R                  5       5        U R                   HF  n[        XS5      nUc  M  [        US5      (       d  M'  UR                  UR                  5       5        MH     [        U5      $ )z4Return a sorted list of all available adapter names.NÚkeys)ÚsetÚupdater   r(   Úother_param_namesÚgetattrÚhasattrÚsorted)r"   Úadapter_namesÚnameÚattrs       r#   Ú_all_available_adapter_namesÚ*TinyLoraLayer._all_available_adapter_namesR   su   € ä›ˆØ×Ñ˜T×1Ñ1×6Ñ6Ó8Ô9Ø×*Ô*ˆDÜ˜4 tÓ,ˆDØÓ¤G¨D°&×$9Ó$9Ø×$Ñ$ T§Y¡Y£[Ö1ñ +ô �mÓ$Ð$r&   c                óˆ  • XR                   ;   a  U R                   U	 U R                   H  n[        XS5      nUc  M  X;   d  M  X1	 M     XR                  ;   a  U R                  U	 XR                  ;   a  U R                  U	 XR
                  ;   a  U R
                  U	 XR                  ;   a–  U R                  SS nUR                  U5        U(       a  U R                  U5        gU R                  5       nU(       d  U R                  / 5        gUS   n[        R                  " SU SU S35        U R                  U5        gg)z!Delete an adapter from the layer.Nr   zAdapter z< was active which is now deleted. Setting active adapter to Ú.)r   r+   r,   r   r   r   Úactive_adaptersÚremoveÚset_adapterr2   ÚwarningsÚwarn)r"   Úadapter_namer1   Ú
param_dictr6   Úremaining_adaptersÚnew_active_adapters          r#   Údelete_adapterÚTinyLoraLayer.delete_adapter\   s8  € ð ×/Ñ/Ó/Ø×$Ñ$ \Ð2ð ×*Ô*ˆDÜ  ¨TÓ2ˆJØÓ%¨,Õ*DØÒ,ñ +ð Ÿ6™6Ó!Ø—‘�|Ð$ØŸ6™6Ó!Ø—‘�|Ð$ð ×0Ñ0Ó0Ø×%Ñ% lÐ3ð ×/Ñ/Ó/Ø"×2Ñ2±1Ð5ˆOØ×"Ñ" <Ô0ÞØ× Ñ  Õ1à%)×%FÑ%FÓ%HÐ"Þ)Ø×$Ñ$ RÕ(à);¸AÑ)>Ð&Ü—M’MØ" < .Ð0lØ-Ð.¨að1ôð ×$Ñ$Ð%7Õ8ð 0r&   c                ó   • g)NT© )r"   r;   s     r#   Úsupports_lora_conversionÚ&TinyLoraLayer.supports_lora_conversion„   s   € Ør&   c                ó   • Xl         g)zKSet the layer index, used for deterministic seeding of projection matrices.N)r   )r"   Úidxs     r#   Úset_layer_idxÚTinyLoraLayer.set_layer_idx‡   s   € à�r&   c                óZ   • U R                   b  X R                   -   $ U[        U5      S-  -   $ )z>Get a deterministic seed for this layer's projection matrices.i'  )r   Úhash)r"   r;   Ú	base_seeds      r#   Ú_get_layer_seedÚTinyLoraLayer._get_layer_seed‹   s.   € à�?‰?Ñ&ØŸ™Ñ.Ð.àœ4 Ó-°Ñ5Ñ5Ð5r&   c                ó–  • UR                   nUR                  nUR                  n	UR                  n
UR                  nUS::  a  [        SU 35      eUS::  a  [        SU 35      eXpR                   U'   US:”  a  [        R                  " US9nO[        R                  " 5       nU R                  R                  [        R                  " X05      5        X l        X!   U   U R                  U'   U R                  XU5      nXÐR                  U'   U R                  XXÙ5        U R!                  U5        U R#                  U R$                  U
S9  g©z?Initialize layer with SVD decomposition and projection tensors.r   z?`r` should be a positive integer value but the value passed is z?`u` should be a positive integer value but the value passed is ç        )Úp)Úinference_modeN)r   r   Úprojection_seedrR   Úfan_in_fan_outÚ
ValueErrorr   ÚDropoutÚIdentityr*   r   r   r   Ú	_init_svdr   Ú_init_projectionÚ%_move_adapter_to_device_of_base_layerr8   r6   )r"   r;   r   Úv_keyr   Úconfigr!   r   r   rS   rR   rT   Útinylora_dropout_layerÚactual_rs                 r#   Úupdate_layerÚTinyLoraLayer.update_layer’   s8  € ð �H‰HˆØ!×2Ñ2ÐØ ×0Ñ0ˆØ×.Ñ.ˆØ×.Ñ.ˆà�‹6ÜÐ^Ð_`Ð^aÐbÓcÐcØ�‹6ÜÐ^Ð_`Ð^aÐbÓcÐcà �‰ˆ|Ñà˜cÓ!Ü%'§Z¢ZÐ2BÑ%CÑ"ä%'§[¢[£]Ð"à×Ñ×$Ñ$¤R§]¢]°LÐ3YÓ%ZÔ[ð %Œà-7Ñ-EÀeÑ-Lˆ×Ñ˜\Ñ*ð —>‘> ,°>ÓBˆØ'�‰ˆ|Ñð 	×Ñ˜l¨xÔIà×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr&   c                ó¼  • U R                  5       nUR                  R                  n[        XS5      nUR                  nUR                  5       n[        R                  R                  USS9u  p‰n
[        UR                  S   UR                  S   5      n[        X+5      nUSS2SU24   R                  U5      nU	SU R                  U5      nU
SU2SS24   R                  U5      n[        R                  " U5      nUR                  S5      U-  R                  5       U R                  U'   UUR                  S5      -  R                  5       U R                   U'   U$ )a  
Compute truncated SVD of base weights and store as frozen buffers.

Compute truncated SVD and distribute singular values to both A and B:
- W = U @ S @ V^T (full SVD)
- We store: tinylora_A = diag(sqrt(S[:r])) @ V[:r, :] (shape: r x in_features)
- We store: tinylora_B = U[:, :r] @ diag(sqrt(S[:r])) (shape: out_features x r)

Distributing S equally avoids imbalanced norms between A and B. This allows: delta_W = tinylora_B @ R @
tinylora_A

Returns:
    int: The actual rank used (may be less than r if matrix dimensions are smaller)
F©Úfull_matricesr   é   N)r   ÚweightÚdatar   ÚdtypeÚfloatÚtorchÚlinalgÚsvdÚminÚshapeÚtoÚsqrtÚ	unsqueezeÚ
contiguousr   r   )r"   r;   r   rT   r   re   rg   Úweight_fp32ÚUÚSÚVhÚmax_rankr^   ÚU_rÚS_rÚV_rÚsqrt_S_rs                    r#   rX   ÚTinyLoraLayer._init_svdÁ   s;  € ð ×(Ñ(Ó*ˆ
Ø×"Ñ"×'Ñ'ˆô ˜6Ó2ˆà—‘ˆð —l‘l“nˆÜ—<‘<×#Ñ# K¸uÐ#ÐE‰ˆˆbô �v—|‘| A‘¨¯©°Q©Ó8ˆÜ�qÓ#ˆð ’�9�H�9�‰o× Ñ  Ó'ˆØ�	�ˆl�o‰o˜eÓ$ˆØ��(�šA�Ñ×!Ñ! %Ó(ˆÜ—:’:˜c“?ˆð *2×);Ñ);¸AÓ)>ÀÑ)D×(PÑ(PÓ(Rˆ�‰˜Ñ%Ø),¨x×/AÑ/AÀ!Ó/DÑ)D×(PÑ(PÓ(Rˆ�‰˜Ñ%àˆr&   c                óÈ   • U R                  X5      n[        R                  " 5       R                  U5      n[        R                  " SSUS-  -  X#U4US9nXpR
                  U'   g)u=   Initialize fixed random projection tensors P âˆˆ R^{uÃ—rÃ—r}.rP   g      ð?g      à?)ÚmeanÚstdÚsizeÚ	generatorN)rL   ri   Ú	GeneratorÚmanual_seedÚnormalr   )r"   r;   r   r   rK   ÚseedÚgenÚPs           r#   rY   ÚTinyLoraLayer._init_projectionð   sX   € à×#Ñ# LÓ<ˆÜ�oŠoÓ×+Ñ+¨DÓ1ˆô �LŠL˜c s¨a°©f¡~¸QÀ1¸IÐQTÑUˆà()�‰˜Ò%r&   c                ó¸   • U R                   U   nU R                  U   nUR                  UR                  UR                  S9n[
        R                  " SX#5      nU$ )z:Reconstruct R matrix from v and P: R = sum_i(v[i] * P[i]).©Údevicerg   z	i,ijk->jk)r   r   rn   rŠ   rg   ri   Úeinsum)r"   r;   Úvr†   ÚRs        r#   Ú
_compute_RÚTinyLoraLayer._compute_Rý   sS   € à× Ñ  Ñ.ˆØ�O‰O˜LÑ)ˆð �D‰D˜Ÿ™¨¯©ˆDÐ0ˆô �LŠL˜ aÓ+ˆØˆr&   c                ó.  • U R                   U   nU R                  U   nU R                  U5      nUR                  nUR                  nUR                  XVS9nUR                  XVS9nUR                  S:H  =(       a-    U[        R                  :H  =(       d    U[        R                  :H  nU(       a0  UR                  5       nUR                  5       nUR                  5       nX4-  U-  n[        U SS5      n	[        X‰5      nU(       a  UR                  US9nU$ )zö
Compute delta_W = tinylora_B @ R @ tinylora_A for merging.

Returns weight update in the same shape as the base layer weight. For Conv1D layers (fan_in_fan_out=True), the
result is transposed to match the (in_features, out_features) convention.
r‰   ÚcpurT   F)rg   )r   r   rŽ   rŠ   rg   rn   Útyperi   Úfloat16Úbfloat16rh   r,   r   )
r"   r;   ÚAÚBr�   rŠ   rg   Úcast_to_fp32ÚdeltarT   s
             r#   Úget_delta_weightÚTinyLoraLayer.get_delta_weight	  sõ   € ð �O‰O˜LÑ)ˆØ�O‰O˜LÑ)ˆØ�O‰O˜LÓ)ˆà—‘ˆØ—‘ˆð �D‰D˜ˆDÐ,ˆØ�D‰D˜ˆDÐ,ˆð —{‘{ eÑ+×c°¼%¿-¹-Ñ1G×1bÈ5ÔTY×TbÑTbÑKbˆæØ—‘“	ˆAØ—‘“	ˆAØ—‘“	ˆAð
 ‘˜‘	ˆô ! Ð'7¸Ó?ˆÜ˜%Ó0ˆæØ—H‘H 5�HÐ)ˆEàˆr&   )r   r   r   r   r   r!   r   r    r   r   r   r   r   r   r   N)r   ú	nn.Module)Úreturnz	list[str])r;   Ústrrœ   ÚNone)Údefault)r;   r�   rœ   Úbool)rF   Úint)r;   r�   rK   r¡   rœ   r¡   ©r;   r�   r   únn.ModuleDictr[   r�   r   r¡   )r;   r�   r   r¡   rT   r    rœ   r¡   )r;   r�   r   r¡   r   r¡   rK   r¡   )r;   r�   rœ   útorch.Tensor)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úadapter_layer_namesr+   r$   r2   r?   rC   rG   rL   r_   rX   rY   rŽ   r™   Ú__static_attributes__rB   r&   r#   r   r      s{   † ñð *ÐØBÐôôB%ô&9öPôô6ð-Nàð-Nð "ð-Nð ð	-Nð
 ô-Nô^-ô^*ô
÷'r&   r   c                  óv   ^ • \ rS rSrSr          S	U 4S jjrS
SS jjrSS jrSS jrSU 4S jjr	Sr
U =r$ )ÚLineari3  z&TinyLoRA implemented in a dense layer.c                ó  >• [         [        R                  U ]  5         [        R                  " X40 UD6  UR
                  U l        X@l        U R                  UUUUR                  U5        UR                  SS5      U l
        g )NÚis_target_conv_1d_layerF)Úsuperr   r­   r$   r   rT   Ú_active_adapterr_   r   Úgetr¯   ©r"   r   r   r[   r;   r\   r!   Ú	__class__s          €r#   r$   ÚLinear.__init__6  st   ø€ ô 	Œb�i‰i˜Ñ'Ô)Ü×Ò˜tÑ:°6Ò:à$×3Ñ3ˆÔà+ÔØ×ÑØØØØ�H‰HØô	
ð (.§z¡zÐ2KÈUÓ'SˆÕ$r&   c                óF  • [        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U R                  U5      nXV-  n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        O0U R                  U5      nUR                  =R
                  U-  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`.
Nú1NaNs detected in the merged weights. The adapter ú seems to be broken©r   r   r(   r   re   rf   Úcloner™   ri   ÚisfiniteÚallrU   r   Úappend©r"   Ú
safe_merger/   Úactive_adapterr   Úorig_weightsÚdelta_weights          r#   ÚmergeÚLinear.mergeO  sñ   € ô 0°ÓDˆÞàä+ˆNØ§¡×!5Ñ!5Ó!7Õ7Ø!×0Ñ0Ó2�
ÞØ#-×#4Ñ#4×#9Ñ#9×#?Ñ#?Ó#A�LØ#'×#8Ñ#8¸Ó#H�LØ Ñ0�Lä Ÿ>š>¨,Ó7×;Ñ;×=Ñ=Ü(ØOÐP^ÐO_Ð_rÐsóð ð .:×%Ñ%Õ*à#'×#8Ñ#8¸Ó#H�LØ×%Ñ%×*Ò*¨lÑ:Õ*à×$Ñ$×+Ñ+¨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                  U5      nU R                  5       R                  =R                  U-  sl        [        U R                  5      S:”  a  M�  gg©z2Unmerge all merged adapters from the base weights.z Already unmerged. Nothing to do.Nr   ©Úmergedr9   r:   Úlenr   Úpopr   r(   r™   r   re   rf   ©r"   rÀ   rÂ   s      r#   ÚunmergeÚLinear.unmergeu  ó˜   € à�{�{Ü�MŠMÐ<Ô=Øä�$×&Ñ&Ó'¨!Ó+Ø!×1Ñ1×5Ñ5Ó7ˆNØ§¡×!5Ñ!5Ó!7Ó7Ø#×4Ñ4°^ÓD�Ø×#Ñ#Ó%×,Ñ,×1Ò1°\ÑAÕ1ô	 �$×&Ñ&Ó'¨!×+r&   c                ó†  • UR                   nU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nGOYU R                  (       a  U R                  " U/UQ70 UD6nGO0U R                  " U/UQ70 UD6nU R
                   GH	  nX`R                  R                  5       ;  a  M#  U R                  U   nU R                  U   nU R                  U5      n	U R                  U   n
U
" U5      nUR                  UR                   5      nUR                  nUR                  U5      nUR                  U5      nU	R                  U5      n	[        R                  " X·5      n[        R                  " XÙ5      n[        R                  " XØ5      nX^-   nGM     UR                  U5      nU$ ©N)rg   Údisable_adaptersrÈ   rÌ   r   r6   r   r(   r   rŽ   r   rn   rŠ   ÚFÚlinear)r"   ÚxÚargsr!   Úprevious_dtypeÚresultrÀ   r•   r–   r�   ÚdropoutÚ	x_droppedrŠ   Úhr˜   s                  r#   ÚforwardÚLinear.forward�  sh  € ØŸ™ˆà× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8ŠFØ�[�[Ø—_’_ QÐ8¨Ò8°Ñ8ŠFà—_’_ QÐ8¨Ò8°Ñ8ˆFØ"&×"6Õ"6�Ø!¯©×)=Ñ)=Ó)?Ó?Ùà—O‘O NÑ3�Ø—O‘O NÑ3�Ø—O‘O NÓ3�à×/Ñ/°Ñ?�Ù# A›J�	Ø%ŸL™L¨¯©Ó1�	ð #×)Ñ)�Ø—D‘D˜“L�Ø—D‘D˜“L�Ø—D‘D˜“L�ô —H’H˜YÓ*�Ü—H’H˜Q“N�ÜŸš ›�à™“ñ9 #7ð< —‘˜>Ó*ˆØˆr&   c                ó*   >• [         TU ]  5       nSU-   $ ©Nz	tinylora.©r°   Ú__repr__©r"   Úrepr´   s     €r#   rà   ÚLinear.__repr__­  ó   ø€ Ü‰gÑÓ ˆØ˜SÑ Ð r&   )r±   rT   r¯   ©
r   r›   r   r£   r[   r�   r;   r�   rœ   rž   ©FN©r¿   r    r/   zOptional[list[str]]rœ   rž   ©rœ   rž   ©rÔ   r¤   rœ   r¤   ©rœ   r�   )r¥   r¦   r§   r¨   r©   r$   rÃ   rÌ   rÛ   rà   r«   Ú__classcell__©r´   s   @r#   r­   r­   3  s]   ø† Ù0ðTàðTð "ðTð ð	Tð
 ðTð 
÷Tö2$<ôL
Bô*÷X!õ !r&   r­   c                  óš   ^ • \ rS rSrSr          SU 4S jjr        SS jrSS jrSSS jjrSS jr	SS jr
SU 4S	 jjrS
rU =r$ )Ú	Embeddingi²  z+TinyLoRA implemented in an Embedding layer.c                óš   >• [         TU ]  5         [        R                  " X40 UD6  X@l        U R	                  UUUUR
                  U5        g rÐ   )r°   r$   r   r±   r_   r   r³   s          €r#   r$   ÚEmbedding.__init__µ  sJ   ø€ ô 	‰ÑÔÜ×Ò˜tÑ:°6Ò:à+ÔØ×ÑØØØØ�H‰HØõ	
r&   c                ó|  • UR                   nUR                  nUR                  n	UR                  n
US::  a  [	        SU 35      eUS::  a  [	        SU 35      eXpR                   U'   US:”  a  [
        R                  " US9nO[
        R                  " 5       nU R                  R                  [
        R                  " X05      5        X l
        X!   U   U R                  U'   U R                  X5      nXÀR                  U'   U R                  XXÉ5        U R                  U5        U R!                  U R"                  U
S9  grO   )r   r   rS   rR   rU   r   rV   rW   r*   r   r   r   Ú_init_svd_embeddingr   rY   rZ   r8   r6   )r"   r;   r   r[   r   r\   r!   r   r   rS   rR   r]   r^   s                r#   r_   ÚEmbedding.update_layerÊ  s-  € ð �H‰HˆØ!×2Ñ2ÐØ ×0Ñ0ˆØ×.Ñ.ˆà�‹6ÜÐ^Ð_`Ð^aÐbÓcÐcØ�‹6ÜÐ^Ð_`Ð^aÐbÓcÐcà �‰ˆ|Ñà˜cÓ!Ü%'§Z¢ZÐ2BÑ%CÑ"ä%'§[¢[£]Ð"à×Ñ×$Ñ$¤R§]¢]°LÐ3YÓ%ZÔ[ð %Œà-7Ñ-EÀeÑ-Lˆ×Ñ˜\Ñ*ð ×+Ñ+¨LÓ<ˆØ'�‰ˆ|Ñð 	×Ñ˜l¨xÔIà×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr&   c                ó¤  • U R                  5       nUR                  R                  nUR                  nUR	                  5       n[
        R                  R                  USS9u  pxn	[        UR                  S   UR                  S   5      n
[        X*5      nUSS2SU24   R                  U5      nUSU R                  U5      nU	SU2SS24   R                  U5      n[
        R                  " U5      nUR                  S5      U-  R                  5       U R                  U'   XÏR                  S5      -  R                  5       U R                  U'   U$ )aŸ  
Compute truncated SVD of embedding weights and store as frozen buffers.

Embedding weight shape: (num_embeddings, embedding_dim) We treat this as W where:
- W = U @ S @ V^T (full SVD)
- tinylora_A = diag(sqrt(S[:r])) @ V[:r, :] (shape: r x embedding_dim)
- tinylora_B = U[:, :r] @ diag(sqrt(S[:r])) (shape: num_embeddings x r)

Returns:
    int: The actual rank used (may be less than r if dimensions are smaller)
Frb   r   rd   N)r   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   r   r   )r"   r;   r   r   re   rg   rr   rs   rt   ru   rv   r^   rw   rx   ry   rz   s                   r#   rò   ÚEmbedding._init_svd_embedding÷  s-  € ð ×(Ñ(Ó*ˆ
Ø×"Ñ"×'Ñ'ˆà—‘ˆð —l‘l“nˆÜ—<‘<×#Ñ# K¸uÐ#ÐE‰ˆˆbô �v—|‘| A‘¨¯©°Q©Ó8ˆÜ�qÓ#ˆð ’�9�H�9�‰o× Ñ  Ó'ˆØ�	�ˆl�o‰o˜eÓ$ˆØ��(�šA�Ñ×!Ñ! %Ó(ˆÜ—:’:˜c“?ˆð *2×);Ñ);¸AÓ)>ÀÑ)D×(PÑ(PÓ(Rˆ�‰˜Ñ%Ø),×/AÑ/AÀ!Ó/DÑ)D×(PÑ(PÓ(Rˆ�‰˜Ñ%àˆr&   c                óF  • [        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U R                  U5      nXV-  n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        O0U R                  U5      nUR                  =R
                  U-  sl        U R                  R                  U5        GM
     g)z7Merge the active adapter weights into the base weights.Nr·   r¸   r¹   r¾   s          r#   rÃ   ÚEmbedding.merge  sï   € ä/°ÓDˆÞØä+ˆNØ§¡×!5Ñ!5Ó!7Õ7Ø!×0Ñ0Ó2�
ÞØ#-×#4Ñ#4×#9Ñ#9×#?Ñ#?Ó#A�LØ#'×#8Ñ#8¸Ó#H�LØ Ñ0�Lä Ÿ>š>¨,Ó7×;Ñ;×=Ñ=Ü(ØOÐP^ÐO_Ð_rÐsóð ð .:×%Ñ%Õ*à#'×#8Ñ#8¸Ó#H�LØ×%Ñ%×*Ò*¨lÑ:Õ*à×$Ñ$×+Ñ+¨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                  U5      nU R                  5       R                  =R                  U-  sl        [        U R                  5      S:”  a  M�  ggrÆ   rÇ   rË   s      r#   rÌ   ÚEmbedding.unmerge6  rÎ   r&   c                óÎ  • U R                   (       a7  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6$ U R                  (       a  U R                  " U/UQ70 UD6$ U R                  " U/UQ70 UD6nU R                   HÏ  nXPR
                  R                  5       ;  a  M"  U R
                  U   nU R                  U   nU R                  U5      nU R                  U   n	UR                  n
UR                  nUR                  X«S9nUR                  X«S9nUR                  X«S9n[        R                  " X5      nU	" U5      nXÈ-  nXÖ-  nXN-   nMÑ     U$ )Nr‰   )rÑ   rÈ   rÌ   r   r6   r   r(   r   rŽ   r   rŠ   rg   rn   rÒ   Ú	embedding)r"   rÔ   rÕ   r!   r×   rÀ   r•   r–   r�   rØ   rŠ   rg   Úafter_BÚafter_Rr˜   s                  r#   rÛ   ÚEmbedding.forwardB  sI  € Ø× × Ø�{�{Ø—‘”Ø—?’? 1Ð6 tÒ6¨vÑ6Ð6à�;�;Ø—?’? 1Ð6 tÒ6¨vÑ6Ð6à—’ Ð4 TÒ4¨VÑ4ˆà"×2Ô2ˆNØ§_¡_×%9Ñ%9Ó%;Ó;Ùà—‘ Ñ/ˆAØ—‘ Ñ/ˆAØ—‘ Ó/ˆAà×+Ñ+¨NÑ;ˆGð —]‘]ˆFØ—L‘LˆEØ—‘˜F�Ð0ˆAØ—‘˜F�Ð0ˆAØ—‘˜F�Ð0ˆAô —k’k !Ó'ˆGÙ˜gÓ&ˆGð ‘kˆGØ‘KˆEà‘^ŠFñ? 3ðB ˆr&   c                ó*   >• [         TU ]  5       nSU-   $ rÞ   rß   rá   s     €r#   rà   ÚEmbedding.__repr__p  rä   r&   )r±   r   rå   r¢   )r;   r�   r   r¡   rœ   r¡   ræ   rç   rè   ré   rê   )r¥   r¦   r§   r¨   r©   r$   r_   rò   rÃ   rÌ   rÛ   rà   r«   rë   rì   s   @r#   rî   rî   ²  s�   ø† Ù5ð
àð
ð "ð
ð ð	
ð
 ð
ð 
÷
ð*+Nàð+Nð "ð+Nð ð	+Nð
 ô+NôZ#öJ<ô4
Bô,÷\!õ !r&   rî   )Ú
__future__r   r9   Útypingr   ri   Útorch.nnr   Útorch.nn.functionalÚ
functionalrÒ   Úpeft.tuners.tuners_utilsr   r   r   Úpeft.utils.otherr   Ú_buffer_dictr
   r   r­   ÚModulerî   rB   r&   r#   Ú<module>r
     s`   ðõ #ã Ý ã Ý ß Ð ç bÑ bÝ &å %ôR�Nô Rôj|!ˆR�Y‰Y˜ô |!ô~@!�—	‘	˜=õ @!r&   