
    bi                         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e      Zy)    )contextmanager)asdict)Enum)AnyN)nn)	BaseTunerBaseTunerLayercheck_target_module_exists)2TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPINGModulesToSaveWrapper   )
PolyConfig)Linear	PolyLayerc                   "    e Zd ZU dZeed<   ed        Zdedede	j                  dede	j                  d	efd
Zd Zde	j                  ddfdZed        Zdef fdZddefdZd dZd Zd Zd Zd Zd Zed        ZdddZdddZ xZS )!	PolyModelpoly_prefixc                     t        | |      S N)r
   )poly_configkeys     Q/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/poly/model.py_check_target_module_existsz%PolyModel._check_target_module_exists$   s    )+s;;    r   adapter_nametargettarget_nameparentoptional_kwargsc                     t        |t              r|j                  ||       y | j                  |||      }|| j                  vr|j                  d       | j                  ||||       y NF)
isinstancer   update_layer_create_new_moduleactive_adaptersrequires_grad__replace_module)selfr   r   r   r   r   r    
new_modules           r   _create_and_replacezPolyModel._create_and_replace(   si     fi(k:00J
 4#7#77))%0  j&Ir   c                 l   t        |||       t        |d      r|j                  }t        |d      s.|j                  |_        t        |d      r|j                  |_        t        |dd       ^t        |d      r|j                  |j                  _        n|j                  |_        |j                  |j                  j                         |j                         D ]W  \  }}| j                  |v sd|v st        |d      r|j                  n|j                  }|j                  |j                         Y y )N
base_layerbiasstateranknumqweight)setattrhasattrr-   weightr.   getattrr/   todevicenamed_modulesr   r1   )r)   r   
child_namer*   childnamemoduler4   s           r   r(   zPolyModel._replace_module>   s    
J/
 5,'$$Ez<0 %Juf%"'**
5'4(4z<0.3kk
%%+#(;;
 MM%,,--. '446 	)LD&t#d):*1%*C		&--(	)r   modelreturnNc                 `    |j                         D ]  \  }}| j                  |vsd|_         y r"   )named_parametersr   requires_grad)r)   r=   nps       r    _mark_only_adapters_as_trainablez*PolyModel._mark_only_adapters_as_trainableY   s1    **, 	(DAq{{!#"'	(r   c                     t        |t              r|j                         }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_layers        r   r%   zPolyModel._create_new_module^   sf    fn- & 5 5 7 &'9&,FvFF  )% % r   r;   c                 z    	 t         |   |      S # t        $ r |dk(  r t        | j                  |      cY S w xY w)z1Forward missing attributes to the wrapped module.r=   )super__getattr__AttributeErrorr5   r=   )r)   r;   	__class__s     r   rM   zPolyModel.__getattr__m   sB    	-7&t,, 	-w4::t,,	-s    %::	inferencec           
         i }| j                   j                         D ]U  \  }}t        |      j                         D ci c]$  \  }}|t        |t              r|j
                  n|& }}}|sQd|d<   W |<   |S c c}}w )NTinference_mode)peft_configitemsr   r#   r   value)r)   rP   config_dictr   rU   kvconfigs           r   get_peft_config_as_dictz!PolyModel.get_peft_config_as_dictv   s    **002 	0JCKQRW=K^K^K`a41aaJq$$7Q>aFa+/'(	0 "C	 bs   )A<c                     | j                   j                         D ]*  }t        |t        t        f      s|j                  |       , y r   )r=   modulesr#   r   r   enable_adapters)r)   enabledr<   s      r   _set_adapter_layerszPolyModel._set_adapter_layers   s<    jj((* 	0F&9.B"CD&&w/	0r   c                 (    | j                  d       y )NTr^   r_   r)   s    r   enable_adapter_layerszPolyModel.enable_adapter_layers   s       .r   c                 (    | j                  d       y )NFra   rb   rc   s    r   disable_adapter_layersz PolyModel.disable_adapter_layers   s       /r   c                     | j                   j                         D ]$  }t        |t              s|j	                  |       & y r   )r=   r\   r#   r   set_adapter)r)   r   r<   s      r   rh   zPolyModel.set_adapter   s6    jj((* 	1F&),""<0	1r   c                 ~    |j                   0|d   t        vrt        d      t        t        |d            |_         |S )N
model_typez0Please specify `target_modules` in `peft_config`)target_modulesr   rH   set)r)   rS   model_configs      r   _prepare_adapter_configz!PolyModel._prepare_adapter_config   sK    %%-L)1cc !STT),B<P\C]^*K& r   c                     g S fd}g }| j                   j                         D ]7  }t        |t              s|j	                  |d      }|j                  |       9 |S )z$Helper method to register pre hooks.c                     |d<   ||fS )Ntask_ids )_argsrI   rq   s      r   pre_hookz/PolyModel._register_pre_hooks.<locals>.pre_hook   s    !)F:<r   T)with_kwargs)r=   r\   r#   r   register_forward_pre_hookappend)r)   rq   ru   handlesr<   handles    `    r   _register_pre_hookszPolyModel._register_pre_hooks   si    I	  jj((* 	'F&&)99(PT9Uv&	'
 r   c              #      K   | j                  |      }	 d |D ]  }|j                           y# |D ]  }|j                           w xY ww)z5Context manager to handle the lifecycle of pre hooks.N)r{   remove)r)   rq   ry   rz   s       r   _manage_pre_hookszPolyModel._manage_pre_hooks   sP      **84	 !   '   s   A1 AA

A)rq   c                t    | j                  |      5   | j                  |i |cd d d        S # 1 sw Y   y xY wr   )r~   r=   r)   rq   rt   rI   s       r   forwardzPolyModel.forward   s8    ##H- 	/4::t.v.	/ 	/ 	/s   .7c                    | j                  |      5   | j                  j                  |i |cd d d        S # 1 sw Y   y xY wr   )r~   r=   generater   s       r   r   zPolyModel.generate   s>    ##H- 	8&4::&&77	8 	8 	8s	   8A)F)T)__name__
__module____qualname__r   str__annotations__staticmethodr   r   r   Moduler   r+   r(   rD   r%   rM   boolrZ   r_   rd   rf   rh   rn   r{   r   r~   r   r   __classcell__)rO   s   @r   r   r   !   s    FC< <JJ J 			J
 J 		J J,)6(bii (D (
  - - 0
/01
$     '+ / (, 8 8r   r   )
contextlibr   dataclassesr   enumr   typingr   rG   r   peft.tuners.tuners_utilsr   r	   r
   
peft.utilsr   r   rY   r   layerr   r   r   rr   r   r   <module>r      s:    &      Z Z
  $Y8	 Y8r   