o
    Nik                     @   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
mZ G dd deje	ZdS )    N)deepcopy)Optional)BaseTunerLayer_get_in_out_featurescheck_adapters_to_mergec                       s   e Zd ZdZdZdejdef fddZddejde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                    sV   t    || _ti | _| | j| || _g | _t	| 
 \}}|| _|| _d S )N)super__init__r	   nn
ModuleDictr   update_layer_active_adaptermerged_adaptersr   get_base_layerin_featuresout_features)selfr	   r
   r   r   	__class__ O/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/ln_tuning/layer.pyr       s   

zLNTuningLayer.__init__Flayerinference_modec                 K   s    t || j|< | j||d d S )N)r   )r   r   set_adapter)r   r   r
   r   kwargsr   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)r   active_adapters_disable_adaptersmergedunmergeadapter_layer_namesgetattrrequires_grad_)r   r   
layer_namer   r   r   r   enable_adapters0   s   



zLNTuningLayer.enable_adapters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   mergeD   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/   r0   r   popr   r	   )r   merged_namer   r   r   r#   [   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   r5   argsr   resultactive_adapterr   r   r   forwardg   s   

zLNTuningLayer.forwardc                    s   t   }d| S )Nz
ln_tuning.)r   __repr__)r   repr   r   r   r;   y   s   
zLNTuningLayer.__repr__)F)NF)__name__
__module____qualname____doc__r$   r   Modulestrr   boolr   r(   r   listr2   r#   torchTensorr:   r;   __classcell__r   r   r   r   r      s    r   )r/   copyr   typingr   rE   torch.nnr   peft.tuners.tuners_utilsr   r   r   rA   r   r   r   r   r   <module>   s   