
    oi                     ~    S SK Jr  S SKrS SKrS SKJr  S SKJrJrJ	r	  S SK
Jr  S SKJr  SSKJrJr   " S	 S
\5      rg)    )annotationsN)Conv1D)	BaseTunerBaseTunerLayercheck_target_module_exists)4TRANSFORMERS_MODELS_TO_WAVEFT_TARGET_MODULES_MAPPING)get_pattern_key   )WaveFTLayerWaveFTLinearc                  n   ^  \ rS rSr% SrS\S'   \rS\S'   \r	SS jr
S r\S	 5       rSU 4S
 jjrSrU =r$ )WaveFTModel   waveft_strprefixztype[BaseTunerLayer]tuner_layer_clsc                   / nUR                  5        GHa  u  pE[        X$5      (       d  M  [        U[        5      (       a  UR                  n[        U[
        R                  R                  5      (       a  UR                  UR                  pO[        U[        5      (       a2  UR                  R                  S   UR                  R                  S   pOM  [        U[
        R                  R                  5      (       a  UR                  UR                  pOJ[        U[        5      (       a2  UR                  R                  S   UR                  R                  S   pOGMN  UR                  XGU45        GMd     U(       d  [        S5      e[        S U 5       5      n	[!        U5      n
UR"                  U
-  n0 nU H  u  pGnXx-  U	-  n[%        X-  5      nXU'   M      U$ )zCCalculate proportional parameter allocation for all target modules.r
   r   z>No target modules found for proportional parameter allocation.c              3  0   #    U  H  u  po2U-  v   M     g 7f)N ).0_	input_dim
output_dims       R/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/waveft/model.py	<genexpr>AWaveFTModel._calculate_proportional_parameters.<locals>.<genexpr>=   s     eQd3MA*J.Qds   )named_modulesr   
isinstancer   
base_layertorchnnLinearin_featuresout_featuresr   weightshapeappend
ValueErrorsumlenn_frequencyround)selfmodelwaveft_configtarget_modules_infonamemodulebase_moduler   r   	total_sum
num_layerstotal_budgetn_frequency_dictlayer_ration_freqs                  r   "_calculate_proportional_parameters.WaveFTModel._calculate_proportional_parameters#   s    !//1LD)->>fk22"("3"3K!+uxx??0;0G0GIaIa:#K880;0B0B0H0H0K[M_M_MeMefgMh: 88,2,>,>@S@Sz//,2MM,?,?,BFMMDWDWXYDZz#**DZ+HI% 2( #]^^eQdee	,-
$00:=+>'DZ$1Y>K;56F%+T" ,?
      c           
     \   Uc  [        S5      eUR                  (       aQ  [        U S5      (       d  0 U l        X R                  ;  a*  U R	                  U R
                  U5      nXR                  U'   S n	UR                  (       a>  [        U S5      (       a-  X R                  ;   a  U R                  U   R                  U5      n	U	c  SU;   a  US   n	U	cS  [        UR                  R                  5       5      n
[        X5      nUR                  R                  XR                  5      n	S nSU;   a  US   nUc  UR                  nUR                  nUR                  n[        US5      =(       a    UR                  S LnU	UUR                   UR"                  UR                  US.nUUS'   [%        U[&        5      (       a*  UR)                  UU	UUR"                  UUUR*                  S9  g U R,                  " XU40 UD6nX R.                  :w  a  UR1                  S5        U R3                  XTUU5        g )	NzCurrent Key shouldn't be `None`_proportional_params_cacher,   wavelet_familybias)r,   scalingfan_in_fan_outinit_weightsrandom_loc_seedr@   )r@   use_idwtF)r)   proportional_parametershasattrr?   r;   r/   getlistn_frequency_patternkeysr	   r,   r@   rB   rE   rA   rC   rD   r   r   update_layerrF   _create_new_moduleactive_adapterrequires_grad__replace_module)r.   r0   adapter_nametargettarget_nameparentcurrent_keyoptional_kwargsr8   r,   pattern_keystarget_name_keyr@   rB   rE   rA   kwargs
new_modules                     r   _create_and_replaceWaveFTModel._create_and_replaceI   s$    >?? 004!=>>24/#B#BB#'#J#J4::Wd#e @P//= 11:;; ? ??99,GKKKXK=O#C)-8K A A F F HIL-lHO';;??QjQjkK .,-=>N!*99N'''77vv&B6;;d+B '+::)66,<<,
 vfk****-&//    00f_X^_J222))%0  j&Ir=   c                   [        U[        5      (       a  UR                  5       nOUn[        U[        R                  R
                  5      (       a-  US   (       a"  [        R                  " S5        S=US'   U l        OV[        U[        5      (       a2  SUS'   US   (       d"  [        R                  " S5        S=US'   U l        O[        SU S35      eU R                  US	'   U R                  US
'   [        X!40 UD6nU$ )NrC   zjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.FTis_target_conv_1d_layerzafan_in_fan_out is set to False but the target module is `Conv1D`. Setting fan_in_fan_out to True.zTarget module zZ is not supported. Currently, only the following modules are supported: `torch.nn.Linear`.r@   rF   )r   r   get_base_layerr!   r"   r#   warningswarnrC   r   r)   r@   rF   r   )r0   rR   rS   rZ   target_base_layerr[   s         r   rN   WaveFTModel._create_new_module   s   fn-- & 5 5 7 &'99&'7 KPO'(=+G)62204F,-*+w KON'(=+G  )% % 
 $1#?#? *33z!&A&A
r=   c                   > [         TU ]  U5        [        U S5      (       a  XR                  ;   a  U R                  U	 ggg)z`
Deletes an existing adapter.

Args:
    adapter_name (str): Name of the adapter to be deleted.
r?   N)superdelete_adapterrH   r?   )r.   rR   	__class__s     r   rg   WaveFTModel.delete_adapter   sB     	|,4566<KjKj;j//= <k6r=   )r?   )r/   ztorch.nn.Module)rR   r   returnNone)__name__
__module____qualname____firstlineno__r   __annotations__r   r   r   target_module_mappingr;   r\   staticmethodrN   rg   __static_attributes____classcell__)rh   s   @r   r   r      sK    FC,7O)7P$ LMJ^  @
> 
>r=   r   )
__future__r   ra   r!   transformers.pytorch_utilsr   peft.tuners.tuners_utilsr   r   r   
peft.utilsr   peft.utils.otherr	   layerr   r   r   r   r=   r   <module>r{      s4    #   - Z Z - ,e>) e>r=   