o
    Ni                     @   sx   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 d dl	m
Z
 ddlmZ dd	lmZmZ G d
d deZdS )    )contextmanager)AnyN)nn)	BaseTunerBaseTunerLayer)2TRANSFORMERS_MODELS_TO_POLY_TARGET_MODULES_MAPPING   )
PolyConfig)Linear	PolyLayerc                   @   s   e Zd ZU dZeed< eZeZ	de
dedejdedejdefd	d
Zedd Zdd Zedd ZddddZddddZdS )	PolyModelpoly_prefixpoly_configadapter_name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)selfr   r   r   r   r   r   
new_module r   J/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/poly/model.py_create_and_replace!   s   
	

zPolyModel._create_and_replacec                 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   7   s   


zPolyModel._create_new_modulec                    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   )_argsr#   r%   r   r   pre_hookK   s   z/PolyModel._register_pre_hooks.<locals>.pre_hookT)with_kwargs)modelmodulesr   r
   register_forward_pre_hookappend)r   r%   r)   handlesmodulehandler   r(   r   _register_pre_hooksF   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)r2   remove)r   r%   r/   r1   r   r   r   _manage_pre_hooksX   s   


zPolyModel._manage_pre_hooksNr(   c                O   s>   |  | | j|i |W  d    S 1 sw   Y  d S N)r4   r+   r   r%   r'   r#   r   r   r   forwardb   s   $zPolyModel.forwardc                O   s@   |  | | jj|i |W  d    S 1 sw   Y  d S r5   )r4   r+   generater6   r   r   r   r8   f   s   $zPolyModel.generate)__name__
__module____qualname__r   str__annotations__r   tuner_layer_clsr   target_module_mappingr	   r   Moduler   r   staticmethodr   r2   r   r4   r7   r8   r   r   r   r   r      s0   
 


	r   )
contextlibr   typingr   r!   r   peft.tuners.tuners_utilsr   r   
peft.utilsr   configr	   layerr
   r   r   r   r   r   r   <module>   s   