ó
    >:jH  ã                  ó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U 4S	 jrSS
.             SS jjrSS 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         €ÚR/home/mande/repo/quber/.venv/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)z¿Forward 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R                   c>  U R                  R                  US   5      nUb  [        TU ]  X5      nU$ SSKJn  XAl         U$ )NÚ
model_typer   )ÚINCLUDE_LINEAR_LAYERS_SHORTHAND)Útarget_modulesÚtarget_module_mappingÚgetr   Ú_prepare_adapter_configÚpeft.utils.constantsr$   )r   Úpeft_configÚmodel_configr%   r$   r   s        €r   r(   Ú OSFModel._prepare_adapter_config3   sY   ø€ à×%Ñ%Ñ-Ø!×7Ñ7×;Ñ;¸LÈÑ<VÓWˆNØÑ)Ü#™gÑ=¸kÓ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                  " X¶5      (       d  M"  U" XÉ5      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!                  XTXã5        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      $ )Nr0   r   r   )ÚmaxÚ
isinstanceÚfloatÚintÚmin)ÚvalueÚmin_dimÚrs      r   Ú_resolve_rankÚ3OSFModel._create_and_replace.<locals>._resolve_rankO   sU   € Ø‰}Ü˜7 a™<¨Ó+Ð+ä˜%¤×'Ñ'¨A°­N¸®NÜ˜™Ó(‘ä˜“J�Ü”s˜7“¨Ó*Ð*r   Úeffective_rankÚrank_patternF)r8   r5   Úreturnr5   )ÚhasattrÚlenr/   Úshaper6   r   r=   ÚitemsÚreÚsearchr3   r   Úupdate_layerr   Úactive_adaptersÚrequires_grad_Ú_replace_module)r   Ú
osf_configr   ÚtargetÚtarget_nameÚparentÚcurrent_keyr-   r:   r8   r<   ÚpatternÚrankÚkwargsÚ
new_modules                  r   Ú_create_and_replaceÚOSFModel._create_and_replace?   s  € ô �v˜x×(Ñ(¬C°·±×0CÑ0CÓ,DÈÓ,IØô	+ô �f—m‘m×)Ñ)Ó*ˆÙ&¤w¨zÐ;KÈTÓ'RÐT[Ó\ˆô �:˜~×.Ñ.°:×3J×3JØ!+×!8Ñ!8×!>Ñ!>Ö!@‘�Ü—9’9˜W×2Ó2Ù%2°4Ó%A�NÙñ "Að ˜nð
ˆô
 �fœh×'Ñ'Ø×Ò Ñ7°Ó7ä)¨&À
ÑUÈfÑUˆJØÑ!Øà×#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&   € Ø×*Ñ*Ö,‰DˆAà qÕ(Ø"'�–ò -r   c                ó   • [        S5      e)Nz#OSF models do not support unmerging)ÚNotImplementedError)r   ÚargsrP   s      r   Úunmerge_adapterÚOSFModel.unmerge_adapter{   s   € Ü!Ð"GÓHÐHr   © )FN)r   Úboolr   zdict[str, torch.Tensor] | None)r    r   )r   r   rJ   ú	nn.ModulerK   r   rL   rc   rM   r   r-   z
str | Noner>   ÚNone)r   rc   r>   rd   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__annotations__r   Útuner_layer_clsr   r&   r   r   r(   rR   rZ   r_   Ú__static_attributes__Ú__classcell__)r   s   @r   r
   r
      sµ   ø‡ ÙGà€FˆCÓØ€OØMÐð #(Ø59ð
ð
  ð
ð 3÷
ð 
÷"-õ
ð* &*ñ2Jð ð2Jð ð	2Jð
 ð2Jð ð2Jð ð2Jð #ð2Jð 
õ2Jôh(÷Ið Ir   r
   )Ú
__future__r   rC   ÚtorchÚtorch.nnÚnnÚpeft.tuners.tuners_utilsr   r)   r   Úlayerr   r   r
   ra   r   r   Ú<module>rt      s*   ðÝ "ã 	ã Ý å .Ý Rç -ônIˆyõ nIr   