
    oik                     x    S SK r S SKJr  S SKJr  S SKrS SKJr  S SKJ	r	J
r
Jr   " S S\R                  \	5      rg)    N)deepcopy)Optional)BaseTunerLayer_get_in_out_featurescheck_adapters_to_mergec                     ^  \ rS rSrSrSrS\R                  S\4U 4S jjr	SS\R                  S\S\
4S	 jjrS
\
SS4S jrSS\\\      S\
4S jjrS rS\R$                  S\R$                  4S jrS\4U 4S jjrSrU =r$ )LNTuningLayer   z!
Selects a layer from the model.
)ln_tuning_layers
base_layeradapter_namec                   > [         TU ]  5         Xl        [        R                  " 0 5      U l        U R                  U R                  U5        X l        / U l        [        U R                  5       5      u  p4X0l        X@l        g )N)super__init__r   nn
ModuleDictr   update_layer_active_adaptermerged_adaptersr   get_base_layerin_featuresout_features)selfr   r   r   r   	__class__s        U/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/ln_tuning/layer.pyr   LNTuningLayer.__init__    sh    $ "b 1$//<8+!$89L9L9N$O!&(    layerinference_modec                 R    [        U5      U R                  U'   U R                  X#S9  g )N)r   )r   r   set_adapter)r   r   r   r   kwargss        r   r   LNTuningLayer.update_layer,   s'    .6uol+Er   enabledreturnNc                    U(       a#  U R                  U R                  5        SU l        gU R                  (       a  U R	                  5         U R
                   H  n[        X5      nUR                  S5        M!     SU l        g)zToggle the enabling and disabling of adapters

Takes care of setting the requires_grad flag for the adapter weights.

Args:
    enabled (bool): True to enable adapters, False to disable adapters
FTN)r!   active_adapters_disable_adaptersmergedunmergeadapter_layer_namesgetattrrequires_grad_)r   r$   
layer_namer   s       r   enable_adaptersLNTuningLayer.enable_adapters0   se     T112%*D"{{"66
1$$U+ 7 &*D"r   adapter_names
safe_mergec                    [        X5      nU(       d  g [        U5      S:  a  [        S[        U5       S35      e[        U R                  5      nU(       a*  [
        R                  " SU S35        U R                  5         U R                  US      U R                  sU l	        U R                  US   '   U R                  R                  US   5        g )N   zTrying to merge zO adapters, but LN tuning does not allow merging more than one adapter at a timezAlready merged with z. Unmerging first.r   )r   len
ValueErrorsetr   warningswarnr*   r   r   append)r   r1   r2   r   s       r   mergeLNTuningLayer.mergeD   s    /D}!"3}#5"6 7P Q  d223MM00AASTULLN !!-"23OO 	A..}Q/?@ 	##M!$45r   c                     U R                   (       d  [        R                  " S5        g U R                  R	                  5       nU R
                  U   U R                  sU l        U R
                  U'   g )Nz Already unmerged. Nothing to do.)r)   r8   r9   r   popr   r   )r   merged_names     r   r*   LNTuningLayer.unmerge[   sZ    {{MM<= **..0!!+.OO 	<..{;r   xc                    U R                   (       a9  U R                  (       a  U R                  5         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      S:w  a"  [        S[	        U R
                  5       S35      eU R
                  S   nU R                  U   " U/UQ70 UD6nU$ )Nr4   zTrying to run forward with z] active adapters, but LN tuning does not allow inference with more than one adapter at a timer   )disable_adaptersr)   r*   r   r5   r'   r6   r   )r   rA   argsr"   resultactive_adapters         r   forwardLNTuningLayer.forwardg   s      {{__Q888F  [[__Q888F  4''(A- 1#d6J6J2K1L Ml m  "11!4N**>:1NtNvNFr   c                 *   > [         TU ]  5       nSU-   $ )Nz
ln_tuning.)r   __repr__)r   repr   s     r   rJ   LNTuningLayer.__repr__y   s    g c!!r   )r   r(   r   r   r   r   r   )F)NF)__name__
__module____qualname____firstlineno____doc__r+   r   Modulestrr   boolr   r/   r   listr;   r*   torchTensorrG   rJ   __static_attributes____classcell__)r   s   @r   r	   r	      s     0
)299 
)C 
)F")) F3 FPT F*t * *(68DI#6 64 6.

 5<< $"# " "r   r	   )r8   copyr   typingr   rV   torch.nnr   peft.tuners.tuners_utilsr   r   r   rR   r	    r   r   <module>r_      s0         b bb"BII~ b"r   