
    biF                     t    d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlm	Z	m
Z
  G d dej                  e	      Zy)    N)deepcopy)Optional)BaseTunerLayercheck_adapters_to_mergec                        e Zd ZdZdZdej                  def fdZdej                  defdZ	de
d	d
fdZddeee      de
fdZd Zdej"                  d	ej"                  fdZd	ef fdZ xZS )LNTuningLayerz)
    Selects a layer from the model.
    )ln_tuning_layers
base_layeradapter_namec                     t         |           || _        t        j                  i       | _        | j                  | j                  |       || _        g | _        y N)	super__init__r
   nn
ModuleDictr	   update_layer_active_adaptermerged_adapters)selfr
   r   	__class__s      V/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/ln_tuning/layer.pyr   zLNTuningLayer.__init__    sJ    $ "b 1$//<8+!    layerc                 4    t        |      | j                  |<   y r   )r   r	   )r   r   r   s      r   r   zLNTuningLayer.update_layer(   s    .6uol+r   enabledreturnNc                     |r#| j                  | j                         d| _        y| j                  r| j	                          | j
                  D ]  }t        | |      }|j                  d       ! d| _        y)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)set_adapteractive_adapters_disable_adaptersmergedunmergeadapter_layer_namesgetattrrequires_grad_)r   r   
layer_namer   s       r   enable_adapterszLNTuningLayer.enable_adapters+   sl     T112%*D"{{"66 ,
j1$$U+, &*D"r   adapter_names
safe_mergec                    t        | |      }|sy t        |      dkD  rt        dt        |       d      t        | j                        }|r)t        j                  d| d       | j                          | j                  |d      | j                  c| _	        | j                  |d   <   | j                  j                  |d          y )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   r(   r)   r   s       r   mergezLNTuningLayer.merge?   s    /m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                     | j                   st        j                  d       y | j                  j	                         }| j
                  |   | j                  c| _        | j
                  |<   y )Nz Already unmerged. Nothing to do.)r!   r/   r0   r   popr	   r
   )r   merged_names     r   r"   zLNTuningLayer.unmergeV   sZ    {{MM<= **..0!!+.OO 	<..{;r   xc                    | j                   r4| j                  r| j                           | j                  |g|i |}|S | j                  r | j                  |g|i |}|S t	        | j
                        dk7  r"t        dt	        | j
                         d      | j
                  d   } | j                  |   |g|i |}|S )Nr+   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
   r,   r   r-   r	   )r   r6   argskwargsresultactive_adapters         r   forwardzLNTuningLayer.forwardb   s      {{$T__Q888F  [[$T__Q888F  4''(A- 1#d6J6J2K1L Ml m  "11!4N:T**>:1NtNvNFr   c                 *    t         |          }d|z   S )Nz
ln_tuning.)r   __repr__)r   repr   s     r   r?   zLNTuningLayer.__repr__t   s    g c!!r   )NF)__name__
__module____qualname____doc__r#   r   Modulestrr   r   boolr'   r   listr2   r"   torchTensorr=   r?   __classcell__)r   s   @r   r   r      s     0"299 "C ">")) >3 >*t * *(68DI#6 64 6.

 5<< $"# " "r   r   )r/   copyr   typingr   rI   torch.nnr   peft.tuners.tuners_utilsr   r   rE   r    r   r   <module>rQ      s-         L]"BII~ ]"r   