
    oi                    j    S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJ	r	  SSK
JrJr   " S S\5      rg)	    )annotationsN)	BaseTuner)1TRANSFORMERS_MODELS_TO_OSF_TARGET_MODULES_MAPPING   )OSFLayerdispatch_defaultc                     ^  \ rS rSr% SrSrS\S'   \r\	r
  S   SU 4S jjjrSU 4S jjrS	 rSS
.             SS jjrSS jrSSS jjrS rSrU =r$ )OSFModel   z=A minimal tuner implementing Orthogonal Subspace Fine-tuning.osf_strprefixNc                (   > [         TU ]  UUUUUS9  g )N)low_cpu_mem_usage
state_dict)super__init__)selfmodelconfigadapter_namer   r   	__class__s         O/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/osf/model.pyr   OSFModel.__init__   s&     	/! 	 	
    c                ~   >  [         TU ]  U5      $ ! [         a     US:X  a  e [        U R                  U5      s $ f = f)zForward missing attributes to the wrapped base model.

This mirrors the behavior of other tuners (e.g., LoRA), ensuring attributes like `device` resolve to the
underlying transformers model.
r   )r   __getattr__AttributeErrorgetattrr   )r   namer   s     r   r   OSFModel.__getattr__&   sB    	-7&t,, 	-w4::t,,	-s    '<<c                    [        USS 5      cK  UR                  S5      nX0R                  ;   a  [        U R                  U   5      Ul        U$ SSKJn  XAl        U$ )Ntarget_modules
model_typer   )INCLUDE_LINEAR_LAYERS_SHORTHAND)r   gettarget_module_mappingsetr#   peft.utils.constantsr%   )r   peft_configmodel_configr$   r%   s        r   _prepare_adapter_config OSFModel._prepare_adapter_config3   s`    ; 0$7?%)),7J777-01K1KJ1W-X*
  Q-L*r   )parameter_namec                  [        US5      (       a#  [        UR                  R                  5      S:w  a  g SS jn[	        UR                  R                  5      n	U" [        USS 5      U	5      n
[        US5      (       aY  UR                  (       aH  UR                  R                  5        H*  u  p[        R                  " X5      (       d  M"  U" X5      n
  O   SU
0n[        U[        5      (       a  UR                  " U40 UD6  g [        X2U40 UD6nUc  g X R                  ;  a  UR                  S5        U R!                  XTX5        g )Nweight   c                    U c  [        US-  S5      $ [        U [        5      (       a  SU s=:  a  S::  a  O  O[        X-  5      nO[        U 5      n[        [	        X5      S5      $ )Nr1   r   r   )max
isinstancefloatintmin)valuemin_dimrs      r   _resolve_rank3OSFModel._create_and_replace.<locals>._resolve_rankO   sU    }7a<++%''ANN(Js7**r   effective_rankrank_patternF)r9   r6   returnr6   )hasattrlenr0   shaper7   r   r>   itemsresearchr4   r   update_layerr   active_adaptersrequires_grad__replace_module)r   
osf_configr   targettarget_nameparentcurrent_keyr.   r;   r9   r=   patternrankkwargs
new_modules                  r   _create_and_replaceOSFModel._create_and_replace?   s    vx((C0C0C,D,I	+ fmm))*&wz;KT'RT[\ :~..:3J3J!+!8!8!>!>!@99W22%24%AN "A n

 fh''77)&
UfUJ!#7#77))%0  jIr   c                T    UR                  5        H  u  p#SU;  d  M  SUl        M     g )Nosf_svd_paramsF)named_parametersrequires_grad)r   r   nps       r    _mark_only_adapters_as_trainable)OSFModel._mark_only_adapters_as_trainables   s&    **,DAq("' -r   c                   U(       d  gU R                   R                  5        GH  n[        US5      (       d  M  [        USS5      nUb  [        US5      (       d  M:  UR                  R
                  nXR                  ;   aZ  UR                  U   nUR                  5        H7  u  pxUR
                  U:w  d  M  UR                  R                  U5      Ul        M9     [        R                   HP  n	[        X95      (       d  M  [        X95      n
X;   d  M'  X   nUR
                  U:w  d  M=  UR                  U5      X'   MR     GM      g)z
Ensure all OSF adapter components have consistent dtype with the base model.

Instead of forcing float32, we match the base model's actual dtype for consistency.
NrV   
base_layerr0   )r   modulesr@   r   r0   dtyperV   rC   datator   other_param_names)r   r   autocast_adapter_dtypemoduler^   target_dtype
svd_params
param_nameparambuffer_dict_namebuffer_dictbuffers               r   _cast_adapter_dtypeOSFModel._cast_adapter_dtypey   s    &jj((*F6#344 !t<J!X)F)F%,,22L 444#22<@
)3)9)9);%J{{l2%*ZZ]]<%@
 *<
 %-$>$> 644")&"CK#2!,!:!<<<78>		,8OK5 %?' +r   c                    [        S5      e)Nz#OSF models do not support unmerging)NotImplementedError)r   argsrQ   s      r   unmerge_adapterOSFModel.unmerge_adapter   s    !"GHHr    )FN)r   boolr   zdict[str, torch.Tensor] | None)r    r   )r   r   rK   	nn.ModulerL   r   rM   rv   rN   r   r.   z
str | Noner?   None)r   rv   r?   rw   )T)r   r   rd   ru   r?   rw   )__name__
__module____qualname____firstlineno____doc__r   __annotations__r   tuner_layer_clsr   r'   r   r   r,   rS   r[   rm   rr   __static_attributes____classcell__)r   s   @r   r
   r
      s    GFCOM #(59

  
 3
 
"-
* &*2J 2J 	2J
 2J 2J 2J #2J 
2Jh("PLI Ir   r
   )
__future__r   rD   torchtorch.nnnnpeft.tuners.tuners_utilsr   r)   r   layerr   r   r
   rt   r   r   <module>r      s*    " 	   . R -RIy RIr   