o
    Ni                  	   @   s   d dl mZmZ d dlZd dlm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 )    )AnyOptionalN)is_gptqmodel_available)OFTLayer)BaseTunerLayer)get_auto_gptq_quant_linearc                       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def fddZdej	fddZ
def fddZ  ZS )GPTQOFTLinear   r           FiUMu?   Tadapter_nameroft_block_sizemodule_dropoutcoftepsblock_shareuse_cayley_neumannnum_cayley_neumann_termsfan_in_fan_outinit_weightsc                    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_layerr   r   r   r   r   r   r   r   r   r   r   kwargs	__class__ H/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/oft/gptq.pyr      s    

zGPTQOFTLinear.__init__xc                 C   s   |  |}| jr|  |S | jD ]%}|| j vrq| j| }t  }|r1|j}| ||j	j}||}q|  |}|rB|
|}|S )N)r   disable_adapters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GPTQOFTLinear.forwardreturnc                    s   t   }d| S )Nzoft.)r   __repr__)r   repr    r"   r#   r5   V   s   
zGPTQOFTLinear.__repr__)
r	   r   r
   Fr   FFr   FT)__name__
__module____qualname__strintfloatboolr   r)   Tensorr3   r5   __classcell__r"   r"   r    r#   r      sH    	
$r   targetr   r   r4   c                 K   s   d }t | tr|  }n| }|dd }t r1ddlm} t ||r/t| |fi |}|j| _|S t	|}|d urKt ||rKt| |fi |}|j| _|S )Ngptq_quantization_configr   )BaseQuantLinear)

isinstancer   get_base_layergetr   gptqmodel.nn_modules.qlinearrB   r   qweightr   )r@   r   r   
new_moduletarget_base_layercfgrB   quant_linearr"   r"   r#   dispatch_gptq[   s    


rL   )typingr   r   r)   peft.import_utilsr   peft.tuners.oft.layerr   peft.tuners.tuners_utilsr   
peft.utilsr   nnModuler   r:   rL   r"   r"   r"   r#   <module>   s    C
