o
    8wi                  	   @   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)OFTLayer)BaseTunerLayerc                       s~   e Zd Z										dded	ed
e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 )AwqOFTLinearr               FiUMu?T   roft_block_sizemodule_dropoutcoftepsblock_sharefan_in_fan_outinit_weightsuse_cayley_neumannnum_cayley_neumann_termsc                    sD   t    t| | || _|| _| j||||||||
||d
 d S )N)r   r   r   r   r   r   r   r   )super__init__r   quant_linear_module_active_adapterupdate_layer)self
base_layeradapter_namer   r   r   r   r   r   r   r   r   r   kwargs	__class__ P/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/peft/tuners/oft/awq.pyr      s    

zAwqOFTLinear.__init__xc                 C   s   | j r
| |}|S | jD ],}|| j vrq| j| }t  }|r.|j}| ||j	j}||}|r9|
|}q| |}|S )N)disable_adaptersr   active_adaptersoft_Rkeystorchis_autocast_enableddtype_cast_input_dtypeweightto)r   r#   resultactive_adapterr&   requires_conversionexpected_dtyper!   r!   r"   forward?   s"   





zAwqOFTLinear.forwardreturnc                    s   t   }d| S )Nzoft.)r   __repr__)r   repr   r!   r"   r4   U   s   
zAwqOFTLinear.__repr__)
r   r   r	   Fr
   FFTFr   )__name__
__module____qualname__intfloatboolr   r(   Tensorr2   strr4   __classcell__r!   r!   r   r"   r      sD    	
%r   targetr   r   r3   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_awqZ   s$   


rO   )importlib.metadatametadatarH   typingr   r   packaging.versionrE   r(   peft.import_utilsr   peft.tuners.oft.layerr   peft.tuners.tuners_utilsr   nnModuler   r=   rO   r!   r!   r!   r"   <module>   s"   A
