
    ois,                        S SK Jr  S SKrS SKJr  S SKJr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  SSKJrJr   " S	 S
\5      r " S S\
R,                  \5      r      SS jrg)    )annotationsN)partial)AnyOptional)
BufferDict)BaseTunerLayer   )decompose_weight_matrixreconstruct_weight_matrixc                  ~    \ rS rSr% SrS\S'   SrS\S'   SS jrSS jrSS	 jr	S
 r
SS jrSSS jjrSS jrS rSrg)OSFLayer!   )osf_svd_paramsztuple[str, ...]adapter_layer_names)_osf_U_high_osf_S_high_osf_V_highother_param_namesc                   Xl         0 U l        [        R                  " 0 5      U l        [        0 5      U l        [        0 5      U l        [        0 5      U l        / U l	        SU l
        / U l        U R                  5       n[        US5      (       a]  [        UR                  [         R"                  5      (       a4  UR                  R$                  S:X  a  UR                  R&                  u  p4GO[        U[        R(                  5      (       a  UR*                  UR,                  p4O[        US5      (       a)  [        US5      (       a  UR.                  UR0                  p4O[        US5      (       a)  [        US5      (       a  UR2                  UR4                  p4Of[        US5      (       a)  [        US	5      (       a  UR*                  UR,                  p4O,S
u  pC[6        R8                  " S[;        U5       S3[<        5        X@l        X0l        g )NFweight   
infeaturesoutfeatures
input_sizeoutput_sizein_featuresout_features)NNzUnsupported layer type 'z/' encountered; could not infer in/out features.)
base_layereffective_ranknn
ModuleDictr   r   r   r   r   hook_handles_disable_adaptersmerged_adaptersget_base_layerhasattr
isinstancer   torchTensorndimshapeLinearr   r   r   r   r   r   warningswarntypeUserWarning)selfr   kwargsr   r   s        O/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/osf/layer.py__init__OSFLayer.__init__'   s   $  mmB/%b>%b>%b>!&! ((*
 J)):,,ell;;!!&&!+ )3(9(9(?(?%L+
BII..(2(>(>
@W@WZ..7:}3U3U(2(=(=z?U?UZ..7:}3U3U(2(=(=z?U?UZ//GJ4W4W(2(>(>
@W@W(2%KMM*4
+;*<<kl
 '(    c                   US::  a  [        SU 35      eX R                  U'   U R                  5       nUR                  R                  n[        XRS9nUS   U R                  U'   US   U R                  U'   US   U R                  U'   [        R                  " US   US   US	   S
.5      nXpR                  U'   U R                  U5        U R                  U R                  5        g)z&Update layer to add a new OSF adapter.r   zL`effective_rank` should be a positive integer value but the value passed is )top_kU_highS_highV_highU_lowS_lowV_low)r<   r=   r>   N)
ValueErrorr   r%   r   datar
   r   r   r   r    ParameterDictr   _attach_hooksset_adapteractive_adapters)r1   adapter_namer   r2   r   r   svd_dict
svd_paramss           r3   update_layerOSFLayer.update_layerT   s   Q^_m^no 
 -;L) ((*
""''*6H *2();&)1();&)1();& %%!'*!'*!'*

 -7L) 	<( 	--.r6   c           	         XR                   ;  a  gU R                   U   nSS jnUS   R                  [        USXS95      nUS   R                  [        USXS95      nU R                  R	                  XE/5        g)z,Attach gradient hooks for the given adapter.Nc                    US:X  a*  UR                   U   nXDR                  SS5      U -  -  nX-
  $ US:X  a*  UR                  U   nXR                  SS5      -  U-  nX-
  $ U $ )Nr<   r   r	   r>   )r   	transposer   )gradnameadapterlayerr9   projr;   s          r3   hook$OSFLayer._attach_hooks.<locals>.hook   s{     w**73!1!1!Q!7$!>?{"**73//155?{"Kr6   r<   )rN   rO   rP   r>   )rN   strrO   rT   rP   r   )r   register_hookr   r"   extend)r1   rE   
svd_modulerR   handle_uhandle_vs         r3   rB   OSFLayer._attach_hooksx   s}    222((6
	 g&44WTYe5rsg&44WTYe5rs  (!56r6   c                ~    U R                    H  nUR                  5         M     U R                   R                  5         g)zRemove all gradient hooks.N)r"   removeclear)r1   handles     r3   _detach_hooksOSFLayer._detach_hooks   s-    ''FMMO (!r6   c                    XR                   ;  a  U R                  5       R                  $ U R                   U   nU R                  U   U R                  U   U R
                  U   US   US   US   S.n[        U5      $ )z@Reconstruct weight matrix from SVD components for given adapter.r<   r=   r>   )r9   r:   r;   r<   r=   r>   )r   r%   r   r   r   r   r   )r1   rE   rW   rF   s       r3   _reconstruct_weightOSFLayer._reconstruct_weight   s    222&&(///((6
&&|4&&|4&&|4(((
 )22r6   Nc                L   Uc  U R                   n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[        R                  " U5      R                  5       (       d  [        SU S35      eUR                  UR                  5      UR                  l        O!U R                  U5      nXdR                  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)rD   r   keysr%   r   r@   clonerb   r(   isfiniteallr?   todtyper$   append)r1   
safe_mergeadapter_namesactive_adapterr   orig_weight
new_weights          r3   mergeOSFLayer.merge   s       00M+N!4!4!9!9!;;!002
 #-"3"3"8"8">">"@K!%!9!9.!IJ >>*599;;(OP^O__rs  .8]];;L;L-MJ%%*!%!9!9.!IJ-7%%*$$++N;' ,r6   c                    U R                   (       d  [        R                  " S5        g[        R                  " S5        g)zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.NzJOSF does not support unmerging. Original weights are permanently modified.)mergedr-   r.   r1   s    r3   unmergeOSFLayer.unmerge   s*     {{MM<=
 	bcr6   c                $    U R                  5         g)zCleanup hooks on deletion.N)r_   ru   s    r3   __del__OSFLayer.__del__   s    r6   )r#   r   r   r   r   r   r"   r   r$   r   r   )r   z	nn.ModulereturnNone)rE   rT   r   int)rE   rT   )rE   rT   r{   torch.Tensor)FN)rl   boolrm   zOptional[list[str]]r{   r|   )r{   r|   )__name__
__module____qualname____firstlineno__r   __annotations__r   r4   rH   rB   r_   rb   rq   rv   ry   __static_attributes__ r6   r3   r   r   !   sD    +>>)VV+)Z"/H74"3 #<Jdr6   r   c                  V   ^  \ rS rSr S     SU 4S jjjrSS jrS	U 4S jjrSrU =r$ )
r,      c                   > [         TU ]  5         [        R                  " X40 UD6  Uc#  [        U R                  U R
                  5      S-  nX l        U R                  " X#40 UD6  g )Nr   )superr4   r   minr   r   _active_adapterrH   )r1   r   rE   r   r2   	__class__s        r3   r4   Linear.__init__   sa     	$5f5 ! !1!143D3DEJN+,A&Ar6   c                   U R                   (       a  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$ U R                  5       nUR                  nU R
                  (       a  U R
                  S   OS nU(       a9  XpR                  ;   a*  U R                  U5      n[        R                  " XU5      nU$ U R                  " U/UQ70 UD6nU$ )Nr   )
disable_adaptersr   rt   r%   biasrD   r   rb   Flinear)	r1   xargsr2   resultr   r   rn   r   s	            r3   forwardLinear.forward   s      __Q888F   [[__Q888F  ,,.J??D 9=8L8LT11!4RVN.4G4G"G11.A!T2  <T<V<r6   c                *   > [         TU ]  5       nSU-   $ )Nzosf.)r   __repr__)r1   repr   s     r3   r   Linear.__repr__  s    g |r6   )r   N)rE   rT   r   r}   r{   r|   )r   r~   r   r   r2   r   r{   r~   )r{   rT   )	r   r   r   r   r4   r   r   r   __classcell__)r   s   @r3   r,   r,      sD     #	B B 	B 
B B$( r6   r,   c                    S n[        U [        5      (       a  U R                  5       nOU n[        U[        R                  R
                  5      (       a  [        X40 UD6nU$ r   )r'   r   r%   r(   r    r,   )targetrE   
osf_configr2   
new_moduletarget_base_layers         r3   dispatch_defaultr     sV     J&.))"113"#UXX__55F;F;
r6   )r   ztorch.nn.ModulerE   rT   r{   zOptional[torch.nn.Module])
__future__r   r-   	functoolsr   typingr   r   r(   torch.nnr    torch.nn.functional
functionalr   peft.tuners._buffer_dictr   peft.tuners.tuners_utilsr   utilsr
   r   r   Moduler,   r   r   r6   r3   <module>r      sk    #         / 3{~ {|*RYY *Z
 r6   