o
    Ni%                  	   @   s   d dl mZ d dlmZmZ d dlZd dlZd dl	m
Z
 d dlmZ d dlmZ G dd dejjeZdejjd	ed
edeejj fddZdS )    N)AnyOptional)is_auto_awq_available)	LoraLayer)BaseTunerLayerc                       sl   e Zd Z							ddededed	ed
ededef fddZdejfddZ	de
f fddZ  ZS )AwqLoraLinearr              TFr
lora_alphalora_dropoutinit_lora_weights
use_rslorause_dora	lora_biasc
              
      sV   |rt | jj dt   t| | || _|| _| j||||||||	d d S )Nz2 does not support DoRA yet, please set it to False)r   r   r   r   r   r   )	
ValueError	__class____name__super__init__r   quant_linear_module_active_adapterupdate_layer)self
base_layeradapter_namer
   r   r   r   r   r   r   kwargsr    H/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/lora/awq.pyr      s    

zAwqLoraLinear.__init__xc                 C   s   |  |}| jr
|S | jD ]G}|| j vrq| j| }| j| }| j| }| j| }t	  }|r=|j
}	| ||jj
}||||}
|rL|
|	}
|
| }
||
 }q|S )N)r   disable_adaptersactive_adapterslora_Akeyslora_Br   scalingtorchis_autocast_enableddtype_cast_input_dtypeweightto)r   r    resultactive_adapterr#   r%   dropoutr&   requires_conversionexpected_dtypeoutputr   r   r   forward=   s(   








zAwqLoraLinear.forwardreturnc                    s   t   }d| S )Nzlora.)r   __repr__)r   repr   r   r   r5   W   s   
zAwqLoraLinear.__repr__)r   r   r	   TFFF)r   
__module____qualname__intfloatboolr   r'   Tensorr3   strr5   __classcell__r   r   r   r   r      s2    	
#r   targetr   r   r4   c                 K   s   d }t | tr|  }n| }t rGddlm} t ||rGtjd}tjt	d}||kr:t
d| d| dt| |fi |}|j| _|S )Nr   )WQLinear_GEMMz0.2.0autoawqz9Found an incompatible version of auto-awq. Found version z, but only versions above z are supported for PEFT.)
isinstancer   get_base_layerr   awq.modules.linearr@   	packagingversionparseimportlib_metadataImportErrorr   qweight)r?   r   r   
new_moduletarget_base_layerr@   AUTOAWQ_MINIMUM_VERSIONversion_autoawqr   r   r   dispatch_awq\   s$   


rO   )importlib.metadatametadatarH   typingr   r   packaging.versionrE   r'   peft.import_utilsr   peft.tuners.lora.layerr   peft.tuners.tuners_utilsr   nnModuler   r=   rO   r   r   r   r   <module>   s"   C
