
    oi+                         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
  S SKJrJr  S SKJr   " S S\5      r " S S	\R"                  \5      rg)
    N)Optional)Conv1D)BaseTunerLayercheck_adapters_to_merge)	transposec                       \ rS rSrSrS\R                  4S jr\S\	4S j5       r
   SS\S\S	\S
\S\S\S\S\	4S jjrS rSrg)VBLoRALayer   )vblora_logits_Avblora_logits_Bvblora_vector_bank
base_layerc                 \   Xl         0 U l        0 U l        [        R                  " 0 5      U l        [        R                  " 0 5      U l        [        R                  " 0 5      U l        SU l	        / U l
        U R                  5       n[        U[        R                  5      (       a  UR                  UR                  pCO^[        U[         5      (       aI  [#        UR$                  S5      (       a  UR$                  R&                  OUR$                  R(                  u  p4WU l        WU l        X l        g )NFds_shape)r   rtopknn
ModuleDictvblora_dropoutParameterDictr   r   _disable_adaptersmerged_adaptersget_base_layer
isinstanceLinearin_featuresout_featuresr   hasattrweightr   shapekwargs)selfr   r!   r   r   s        R/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/vblora/layer.py__init__VBLoRALayer.__init__   s    $	 mmB/  "//3!//3 "'!((*
j")),,(2(>(>
@W@W
F++.5j6G6G.T.T
!!**ZdZkZkZqZq &K '(    returnc                 ,    [        U R                  5      $ N)boolr   )r"   s    r#   mergedVBLoRALayer.merged9   s    D(())r&   adapter_namer   r   num_vectorsvector_lengthr   init_logits_stdinference_modec
                    US::  a  [        SU S35      eUS::  a  [        SU S35      eU R                  U-  S:w  a  [        SU R                   SU 35      eU R                  U-  S:w  a  [        SU R                   SU 35      eX0R                  U'   X@R                  U'   US:  a  [
        R                  " US	9nO[
        R                  " 5       nU R                  R                  [
        R                  " X05      5        [
        R                  " [        R                  " X0R                  U-  U5      S
S9U R                  U'   [
        R                  " [        R                  " U R                  U-  X55      S
S9U R                  U'   X l        U R#                  X5        U R%                  U5        U R'                  U R(                  U	S9  g )Nr   z`r` z# should be a positive integer valuez`topk` z`in_features` z& must be divisible by `vector_length` z`out_features`         )pT)requires_grad)r1   )
ValueErrorr   r   r   r   r   DropoutIdentityr   updater   	Parametertorchzerosr   r   r   reset_vblora_logits%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r"   r-   r   r   r   r.   r/   r   r0   r1   r!   vblora_dropout_layers               r#   update_layerVBLoRALayer.update_layer=   s    6tA3&IJKK19wtf,OPQQm+q0~d.>.>-??efsetuvv},1!$"3"3!44Z[hZij   !|"&		,C#%::#? #%;;= ""2==,1U#VW-/\\KK++}<kJZ^.
\* .0\\KK))]:AK[_.
\* #5  ?22<@--nMr&   c                 V   XR                   R                  5       ;   a{  [        R                  " 5          [        R
                  R                  U R                   U   SU5        [        R
                  R                  U R                  U   SU5        S S S 5        g g ! , (       d  f       g = f)Nr   )r   keysr;   no_gradr   initnormal_r   )r"   r-   r0   s      r#   r=   VBLoRALayer.reset_vblora_logitsh   sp    //4466 4 4\ BAW 4 4\ BAW ! 7 s   AB
B()r   r   r   r!   r   r   r   r   r   r   r   r   N)r3   {Gz?F)__name__
__module____qualname____firstlineno__adapter_layer_namesr   Moduler$   propertyr*   r+   strintfloatrB   r=   __static_attributes__ r&   r#   r	   r	      s    V299 4 * * * !$!%$)N)N 	)N
 )N )N )N )N )N )NVXr&   r	   c                   l  ^  \ rS rSr     SS\S\S\S\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                  S\R                  4S jrSS\\R                  \R                  4   4S jjrS\R                  4S jrS\R                  S\R                  4S jrSrU =r$ )r   o   r-   r   r.   r/   r   r   r0   fan_in_fan_outis_target_conv_1d_layerr'   Nc           
         > [         [        R                  U ]  5         [        R                  " X40 UD6  Xl        X0l        U R                  X2XGXVX5        Xl        g r)   )	superr   r   r$   r	   rY   _active_adapterrB   rZ   )r"   r   r   r-   r   r.   r/   r   r   r0   rY   rZ   r!   	__class__s                r#   r$   Linear.__init__q   sU      	bii')T88,+a{Sa	
 (?$r&   
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   rE   r   r   datacloneget_delta_weightr;   isfiniteallr6   r   append)r"   r`   ra   active_adapterr   orig_weightss         r#   mergeLinear.merge   s     0D+N!5!5!:!:!<<!002
 $.#4#4#9#9#?#?#AL $9$9.$IIL >>,7;;==(OP^O__rs  .:%%*%%**d.C.CN.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   )r+   warningswarnlenr   popr   rE   r   r   rc   re   )r"   ri   s     r#   unmergeLinear.unmerge   s    {{MM<=$&&'!+!11557N!5!5!:!:!<<##%,,11T5J5J>5ZZ1 $&&'!+r&   logitsc                     UR                  USS9u  pE[        R                  " USS9nUR                  S5      X%   -  R	                  S5      $ )N)dim)r   Fsoftmax	unsqueezesum)r"   rt   r   r   top_k_logitsindicestopk_weightss          r#   _get_low_rank_matrixLinear._get_low_rank_matrix   sL     &Db 9yy26&&r*-?-HHMMbQQr&   c                    U R                   U   nU R                  U   nU R                  (       a1  US   R                  5       R	                  5       (       a  [        S5      eU R                  U   R                  UR                  5      nU R                  U   nU(       a0  UR                  5       nUR                  5       nUR                  5       nU R                  X5U5      R                  UR                  S   S5      nU R                  XEU5      R                  SS5      R                  SUR                  S   5      nXx4$ )N)r   r   zoFound infinity values in VB-LoRA logits. Ensure training was not resumed from a `save_only_topk_weights` model.r   rv         )r   r   trainingisinfanyRuntimeErrorr   todevicer   rT   r   reshaper    r   )	r"   adaptercast_to_fp32r   r   r   r   ABs	            r#   _get_lora_matricesLinear._get_lora_matrices   s-   ..w7..w7 ==_T288:>>@@ B  "44W=@@AWAWXyy! -335O-335O!3!9!9!; %%o4PXXYhYnYnopYqsuv %%o4PYq!_WR..q12 	

 tr&   c                    U R                   U   R                  nU R                   U   R                  nUR                  S:H  =(       a    U[        R
                  :H  nU R                  X5      u  pV[        Xe-  U R                  5      nU$ )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.
cpu)	r   r   dtypetyper;   float16r   r   rY   )r"   r   r   r   r   r   r   output_tensors           r#   re   Linear.get_delta_weight   sx     %%g.55$$W-33{{e+F0F&&w=!!%)<)<=r&   xc           	         UR                   nU R                  (       a8  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nOU R                  (       a  U R                  " U/UQ70 UD6nOU R                  " U/UQ70 UD6nU R
                   H  nX`R                  R                  5       ;  a  M"  U R                  U5      u  pxUR                  U R                  U   R                   5      nU R                  U   n	U[        R                  " [        R                  " U	" U5      U5      U5      -   nM     UR                  U5      nU$ r)   )r   disable_adaptersr+   rr   r   r@   r   rE   r   r   r   r   ry   linear)
r"   r   argsr!   previous_dtyperesultri   r   r   dropouts
             r#   forwardLinear.forward   s     {{__Q888F[[__Q888F__Q888F"&"6"6!)=)=)B)B)DD..~>DD00@FFG--n=!((188GAJ+BA"FF #7 >*r&   )r]   rY   rZ   )r   r3   rJ   FF)FN)r'   N)F)rK   rL   rM   rN   rR   rS   rT   r*   r$   r   listrk   rr   r;   tensorTensorr   tupler   re   r   rU   __classcell__)r^   s   @r#   r   r   o   s     #!%$(-? 	?
 ? ? ? ? ? ? ? "&? 
? ?2!< !<Xd3i=P !<\` !<F[R5<< RV[VbVb R
u||UZUaUaGaAb <5<<  5<<  r&   r   )rn   typingr   r;   torch.nnr   torch.nn.functional
functionalry   transformers.pytorch_utilsr   peft.tuners.tuners_utilsr   r   peft.utils.otherr   r	   r   rV   r&   r#   <module>r      sG          - L &QX. QXhLRYY Lr&   