o
    8wi                     @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlZd dlm	Z	 d dl
mZmZmZ d dlmZmZ d	d
lmZ d	dlmZmZ G dd deZdS )    )contextmanager)asdict)Enum)AnyN)nn)	BaseTunerBaseTunerLayercheck_target_module_exists)2TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPINGModulesToSaveWrapper   )
PolyConfig)Linear	PolyLayerc                       s  e Zd ZU dZeed< d3 fddZedd Zd	e	d
ede
jdede
jdefddZdd Zde
jddfddZedd Zdef fddZd4defddZd5d d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zed,d- Zdd.d/d0Zdd.d1d2Z  ZS )6	PolyModelpoly_prefixreturnNc                    s   t  ||| d S N)super__init__)selfmodelconfigadapter_name	__class__ S/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/peft/tuners/poly/model.pyr   $   s   zPolyModel.__init__c                 C   s
   t | |S r   )r	   )poly_configkeyr   r   r   _check_target_module_exists'   s   
z%PolyModel._check_target_module_existsr   r   targettarget_nameparentoptional_kwargsc                 K   sP   t |tr||| d S | |||}|| jvr|d | |||| d S NF)
isinstancer   update_layer_create_new_moduleactive_adaptersrequires_grad__replace_module)r   r   r   r"   r#   r$   r%   
new_moduler   r   r   _create_and_replace+   s   
	

zPolyModel._create_and_replacec                 C   s   t ||| t|dr|j}t|ds |j|_t|dr |j|_t|dd d ur>t|dr3|j|j_n|j|_||jj |	 D ]\}}| j
|v sOd|v r`t|drW|jn|j}||j qBd S )N
base_layerbiasstateranknumqweight)setattrhasattrr/   weightr0   getattrr1   todevicenamed_modulesr   r3   )r   r$   
child_namer-   childnamemoduler6   r   r   r   r,   A   s$   



zPolyModel._replace_moduler   c                 C   s&   |  D ]\}}| j|vrd|_qd S r&   )named_parametersr   requires_grad)r   r   npr   r   r    _mark_only_adapters_as_trainable\   s
   
z*PolyModel._mark_only_adapters_as_trainablec                 K   sJ   t |tr
| }n|}t |tjjrt||| fi |S td| d)NzTarget module zZ is not supported. Currently, only the following modules are supported: `torch.nn.Linear`.)r'   r   get_base_layertorchr   r   
ValueError)r   r   r"   kwargstarget_base_layerr   r   r   r)   a   s   


zPolyModel._create_new_moduler=   c                    s8   zt  |W S  ty   |dkr t| j| Y S w )z1Forward missing attributes to the wrapped module.r   )r   __getattr__AttributeErrorr7   r   )r   r=   r   r   r   rI   p   s   zPolyModel.__getattr__F	inferencec                 C   sF   i }| j  D ]\}}dd t| D }|rd|d< q|||< |S )Nc                 S   s&   i | ]\}}|t |tr|jn|qS r   )r'   r   value).0kvr   r   r   
<dictcomp>|   s   & z5PolyModel.get_peft_config_as_dict.<locals>.<dictcomp>Tinference_mode)peft_configitemsr   )r   rK   config_dictr    rL   r   r   r   r   get_peft_config_as_dicty   s   z!PolyModel.get_peft_config_as_dictTc                 C   s,   | j  D ]}t|ttfr|| qd S r   )r   modulesr'   r   r   enable_adapters)r   enabledr>   r   r   r   _set_adapter_layers   s
   
zPolyModel._set_adapter_layersc                 C      | j dd d S )NTrX   rY   r   r   r   r   enable_adapter_layers      zPolyModel.enable_adapter_layersc                 C   rZ   )NFr[   r\   r]   r   r   r   disable_adapter_layers   r_   z PolyModel.disable_adapter_layersc                 C   s(   | j  D ]}t|tr|| qd S r   )r   rV   r'   r   set_adapter)r   r   r>   r   r   r   ra      s
   

zPolyModel.set_adapterc                 C   s4   |j d u r|d tvrtdtt|d  |_ |S )N
model_typez0Please specify `target_modules` in `peft_config`)target_modulesr
   rF   set)r   rR   model_configr   r   r   _prepare_adapter_config   s   

z!PolyModel._prepare_adapter_configc                    sR    du rg S  fdd}g }| j  D ]}t|tr&|j|dd}|| q|S )z$Helper method to register pre hooks.Nc                    s    |d< ||fS )Ntask_idsr   )_argsrG   rg   r   r   pre_hook   s   z/PolyModel._register_pre_hooks.<locals>.pre_hookT)with_kwargs)r   rV   r'   r   register_forward_pre_hookappend)r   rg   rk   handlesr>   handler   rj   r   _register_pre_hooks   s   

zPolyModel._register_pre_hooksc              	   c   s@    |  |}zdV  W |D ]}|  qdS |D ]}|  qw )z5Context manager to handle the lifecycle of pre hooks.N)rq   remove)r   rg   ro   rp   r   r   r   _manage_pre_hooks   s   


zPolyModel._manage_pre_hooksrj   c                O   s>   |  | | j|i |W  d    S 1 sw   Y  d S r   )rs   r   r   rg   ri   rG   r   r   r   forward   s   $zPolyModel.forwardc                O   s@   |  | | jj|i |W  d    S 1 sw   Y  d S r   )rs   r   generatert   r   r   r   rv      s   $zPolyModel.generate)r   N)F)T)__name__
__module____qualname__r   str__annotations__r   staticmethodr!   r   r   Moduler   r.   r,   rC   r)   rI   boolrU   rY   r^   r`   ra   rf   rq   r   rs   ru   rv   __classcell__r   r   r   r   r   !   sD   
 


	
		
	r   )
contextlibr   dataclassesr   enumr   typingr   rE   r   peft.tuners.tuners_utilsr   r   r	   
peft.utilsr
   r   r   r   layerr   r   r   r   r   r   r   <module>   s   