o
    8wiF                     @   s\   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 deje	ZdS )    N)deepcopy)Optional)BaseTunerLayercheck_adapters_to_mergec                       s   e Zd ZdZdZdejdef fddZdejdefdd	Z	d
e
ddfddZddeee  de
fddZdd ZdejdejfddZdef fddZ  ZS )LNTuningLayerz)
    Selects a layer from the model.
    )ln_tuning_layers
base_layeradapter_namec                    s:   t    || _ti | _| | j| || _g | _d S N)	super__init__r   nn
ModuleDictr   update_layer_active_adaptermerged_adapters)selfr   r	   	__class__ X/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/peft/tuners/ln_tuning/layer.pyr       s   

zLNTuningLayer.__init__layerc                 C   s   t || j|< d S r
   )r   r   )r   r   r	   r   r   r   r   (   s   zLNTuningLayer.update_layerenabledreturnNc                 C   sR   |r|  | j d| _dS | jr|   | jD ]}t| |}|d qd| _dS )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   r   r   r   enable_adapters+   s   



zLNTuningLayer.enable_adaptersFadapter_names
safe_mergec                 C   s   t | |}|s	d S t|dkrtdt| dt| j}|r-td| d |   | j|d  | j	| _	| j|d < | j
|d  d S )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   r   r   r   merge?   s   

zLNTuningLayer.mergec                 C   s<   | j s
td d S | j }| j| | j| _| j|< d S )Nz Already unmerged. Nothing to do.)r   r*   r+   r   popr   r   )r   merged_namer   r   r   r   V   s   

zLNTuningLayer.unmergexc                 O   s   | j r| jr
|   | j|g|R i |}|S | jr)| j|g|R i |}|S t| jdkr;tdt| j d| jd }| j| |g|R 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   r0   argskwargsresultactive_adapterr   r   r   forwardb   s   

zLNTuningLayer.forwardc                    s   t   }d| S )Nz
ln_tuning.)r   __repr__)r   repr   r   r   r7   t   s   
zLNTuningLayer.__repr__)NF)__name__
__module____qualname____doc__r   r   Modulestrr   r   boolr#   r   listr-   r   torchTensorr6   r7   __classcell__r   r   r   r   r      s    r   )r*   copyr   typingr   rA   torch.nnr   peft.tuners.tuners_utilsr   r   r=   r   r   r   r   r   <module>   s   