
    oi`                    f    S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	J
r
  SSKJr   " S S	\5      rg)
    )annotationsN)
PeftConfig)	BaseTuner)_get_input_embeddings_name_get_submodules   )TrainableTokensLayerc                     ^  \ rS rSr% SrS\S'   \rS r  S         SU 4S jjjr	S r
              SS jr              SS	 jr\S
 5       rSrU =r$ )TrainableTokensModel   trainable_tokens_strprefixc                V    UR                   c  [        U R                  S5      Ul         U$ )Nembed_tokens)target_modulesr   model)selfpeft_configmodel_configs      \/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/trainable_tokens/model.py_prepare_adapter_config,TrainableTokensModel._prepare_adapter_config   s(    %%-)CDJJP^)_K&    c           
       > [         TU ]  " SUUUUS.UD6  U R                  U 5      nU R                  5       nU(       a  UR	                  SS5      (       a  [        U R                  R                  5       [        5      (       a  U R                  R                  SS9 H  u  pU V
s/ s H  oR                  U
5      (       d  M  U
PM     nn
U(       d  M7  [        X5      u  pnU R                  U   R                  5       nU R                  R                  5       US'   U R                  UUUUUUS   5        M     g g g g s  sn
f )N)r   adapter_nameautocast_adapter_dtypelow_cpu_mem_usagetie_word_embeddingsF)remove_duplicatetied_adapterr    )superinject_adapterget_model_config%_get_module_names_tied_with_embeddingget
isinstancer   get_input_embeddingsr	   named_modulesendswithr   r   to_dict_create_and_replace_dict)r   r   r   r   r   kwargsr   tied_weights_module_namesnamemodule
target_keymatched_keysparenttargettarget_namer   	__class__s                   r   r$   #TrainableTokensModel.inject_adapter%   sE    	 	
%#9/		

 	
 ,,T2 %)$N$N$P! &  !6>>4::::<>RSS !%

 8 8% 8 P=Vt=VzZgZghrZs
=Vt<2A%2N/FK"&"2"2<"@"H"H"JK26**2Q2Q2SK/11#$#$Q !Q T ? &  us   %D<D<c                    / $ )Nr"   )r   argsr.   s      r   _get_tied_target_modules-TrainableTokensModel._get_tied_target_modulesV   s	    
 	r   c                    Un[        U[        5      (       a  UR                  " U40 UD6  gU R                  " XU40 UD6nU R	                  XTX5        g)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   current_keyr.   
new_modules	            r   r-   -TrainableTokensModel._create_and_replace_dict]   sR     f2337700F]V\]J  jIr   c                J    UR                  5       nU R                  XrX4XV5        g)zS
A private method to create and replace the target module with the adapter module.
N)r,   r-   )r   r   r   r5   r6   r4   rA   r.   s           r   _create_and_replace(TrainableTokensModel._create_and_replacer   s%     $$&%%fFQWer   c           	     n    [        X!40 UD6nUR                  UUS   US   UR                  SS 5      S9  U$ )Ninit_weightstoken_indicesr!   )rH   rI   r!   )r	   r>   r'   )r   r   r5   r.   rB   s        r   r?   'TrainableTokensModel._create_new_module   sM    )&I&I
/ 1ND9	 	  	
 r   r"   )TF)
r   	nn.Moduler   r   r   boolr   rL   returnNone)r   dictr   r   r5   rK   r6   r   r4   rK   rA   r   rM   rN   )r   r   r   r   r5   rK   r6   r   r4   rK   rA   r   rM   rN   )__name__
__module____qualname____firstlineno__r   __annotations__r	   tuner_layer_clsr   r$   r;   r-   rE   staticmethodr?   __static_attributes____classcell__)r7   s   @r   r   r      s   %FC%*O (,"'// / !%	/
  / 
/ /bJJ J 	J
 J J J 
J*ff f 	f
 f f f 
f 	 	r   r   )
__future__r   torch.nnnnpeft.configr   peft.tuners.tuners_utilsr   
peft.utilsr   r   layerr	   r   r"   r   r   <module>r`      s'    #  " . B 'q9 qr   