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 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)	LoraLayer)BaseTunerLayer)get_auto_gptq_quant_linear   )LoraVariantc                       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dedee	 fddZ
dejfddZdef fddZ  ZS )GPTQLoraLinearr   r           TF    adapter_namer
lora_alphalora_dropoutinit_lora_weights
use_rslorause_dora
use_qalora	lora_biasqalora_group_sizec                    sZ   t    t| | |rt| jj d|| _|| _| j||||||||	|
|d
 d S )Nz2 does not support DoRA yet, please set it to False)r   r   r   r   r   r   r   r   )	super__init__r   
ValueError	__class____name__quant_linear_module_active_adapterupdate_layer)self
base_layerr   r   r   r   r   r   r   r   r   r   kwargsr    I/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/lora/gptq.pyr      s$   

zGPTQLoraLinear.__init__returnc                K   sX   |r|rt d| jj d|rddlm} | }|S |r(ddlm} | }|S d }|S )Nz7Dora and QA_lora at the same time is not supported for z (yet).r   )DoraLinearVariant)QALoraLinearVariant)NotImplementedErrorr   r   variantsr&   r'   )r   r   r   r!   r&   variantr'   r#   r#   r$   resolve_lora_variantA   s   z#GPTQLoraLinear.resolve_lora_variantxc           
      C   s   |  |}| jr
|S | j }| jD ]I}||vrq|j}| j| }| j| }| j| }| j| }	| 	||j
j}|| jvrJ||||||	  }n| j| j| |||d}||}q|S )N)active_adapterr,   result)r   disable_adapterslora_Akeysactive_adaptersdtypelora_Br   scaling_cast_input_dtypeweightlora_variantforwardto)
r   r,   r.   lora_A_keysr-   torch_result_dtyper0   r4   dropoutr5   r#   r#   r$   r9   R   s.   








zGPTQLoraLinear.forwardc                    s   t   }d| S )Nzlora.)r   __repr__)r   repr"   r#   r$   r>   t   s   
zGPTQLoraLinear.__repr__)	r   r   r   TFFFFr   )r   
__module____qualname__strintfloatboolr   r   r	   r+   torchTensorr9   r>   __classcell__r#   r#   r"   r$   r
      sD    	
&"r
   targetr   r!   r%   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.qlinearrK   r
   qweightr   )rI   r   r!   
new_moduletarget_base_layercfgrK   quant_linearr#   r#   r$   dispatch_gptq   s    


rU   )typingr   r   rF   peft.import_utilsr   peft.tuners.lora.layerr   peft.tuners.tuners_utilsr   
peft.utilsr   layerr	   nnModuler
   rB   rU   r#   r#   r#   r$   <module>   s"   e
