o
    Ni`                     @  s`   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	m
Z
 ddlmZ G dd	 d	eZdS )
    )annotationsN)
PeftConfig)	BaseTuner)_get_input_embeddings_name_get_submodules   )TrainableTokensLayerc                      sf   e Zd ZU dZded< eZdd Z		d!d" fddZdd Z	d#ddZ
d$ddZedd  Z  ZS )%TrainableTokensModeltrainable_tokens_strprefixc                 C  s   |j d u rt| jd|_ |S )Nembed_tokens)target_modulesr   model)selfpeft_configmodel_config r   V/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/trainable_tokens/model.py_prepare_adapter_config   s   
z,TrainableTokensModel._prepare_adapter_configTFr   	nn.Moduleadapter_nameautocast_adapter_dtypeboollow_cpu_mem_usagereturnNonec              
     s   t  jd	||||d| | | }|  }|r`|ddrbt| j trd| jj	ddD ]7\ } fdd|D }	|	r_t
| \}
}}| j|  }| j |d< | |||||
|	d  q.d S d S d S d S )
N)r   r   r   r   tie_word_embeddingsF)remove_duplicatec                   s   g | ]	}  |r|qS r   )endswith).0
target_keynamer   r   
<listcomp>F   s    z7TrainableTokensModel.inject_adapter.<locals>.<listcomp>tied_adapterr   r   )superinject_adapterget_model_config%_get_module_names_tied_with_embeddingget
isinstancer   get_input_embeddingsr   named_modulesr   r   to_dict_create_and_replace_dict)r   r   r   r   r   kwargsr   tied_weights_module_namesmodulematched_keysparenttargettarget_namer   	__class__r"   r   r'   %   sB   

z#TrainableTokensModel.inject_adapterc                 O  s   g S )Nr   )r   argsr0   r   r   r   _get_tied_target_modulesV   s   z-TrainableTokensModel._get_tied_target_modulesr   dictr5   r6   r4   current_keyc           	      C  sN   |}t |tr|j|fi | dS | j|||fi |}| |||| dS )z
        The same as `_create_and_replace` but takes a dictionary instead of a peft config so that we can add keys that
        are not present in the config, such as `tied_adapter`.
        N)r+   r   update_layer_create_new_module_replace_module)	r   r   r   r5   r6   r4   r<   r0   
new_moduler   r   r   r/   ]   s
   
z-TrainableTokensModel._create_and_replace_dictr   c                 C  s    |  }| |||||| dS )zc
        A private method to create and replace the target module with the adapter module.
        N)r.   r/   )r   r   r   r5   r6   r4   r<   r0   r   r   r   _create_and_replacer   s   z(TrainableTokensModel._create_and_replacec                 K  s8   t ||fi |}|j||d |d |dd d |S )Ninit_weightstoken_indicesr%   )rB   rC   r%   )r   r=   r*   )r   r   r5   r0   r@   r   r   r   r>      s   
z'TrainableTokensModel._create_new_module)TF)
r   r   r   r   r   r   r   r   r   r   )r   r;   r   r   r5   r   r6   r   r4   r   r<   r   r   r   )r   r   r   r   r5   r   r6   r   r4   r   r<   r   r   r   )__name__
__module____qualname__r   __annotations__r   tuner_layer_clsr   r'   r:   r/   rA   staticmethodr>   __classcell__r   r   r7   r   r	      s   
 1

r	   )
__future__r   torch.nnnnpeft.configr   peft.tuners.tuners_utilsr   
peft.utilsr   r   layerr   r	   r   r   r   r   <module>   s   