
    oi2                         S SK r S SKJrJrJr  S SKrS SKJr  S SKJs  J	r
  S SKJr  S SKJrJr  SSKJr  SSKJr   " S S	\5      r " S
 S\R(                  \5      rg)    N)AnyOptionalUnion)Conv1D)BaseTunerLayercheck_adapters_to_merge   )WAVELET_REDUCTIONS)	waverec2dc                       \ rS rSrSrSrS\R                  SS4S jr SS jr	\
R                  " 5       S	 5       rS\
R                  4S
 jrSrg)WaveFTLayer   )waveft_spectrum)waveft_n_frequencywaveft_scalingwaveft_random_loc_seedwaveft_wavelet_familywaveft_indiceswaveft_use_idwt
base_layerreturnNc                 h   Xl         0 U l        0 U l        [        R                  " 0 5      U l        0 U l        0 U l        0 U l        0 U l	        SU l
        / U l        X l        U R                  5       n[        U[        R                  5      (       a$  UR                   UR"                  sU l        U l        g [        U[$        5      (       aU  ['        UR(                  S5      (       a  UR(                  R*                  OUR(                  R,                  u  U l        U l        g [/        S[1        U5       35      e)NFds_shapezUnsupported layer type )r   r   r   nnParameterDictr   r   r   r   r   _disable_adaptersmerged_adapterskwargsget_base_layer
isinstanceLinearin_featuresout_featuresr   hasattrweightr   shape
ValueErrortype)selfr   r   s      R/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/waveft/layer.py__init__WaveFTLayer.__init__*   s   $"$ !//3%'" &(#!!&!((*
j")),,2<2H2H*JaJa/Dd/
F++.5j6G6G.T.T
!!**ZdZkZkZqZq 0Dd/ 6tJ7G6HIJJ    c                    US::  a  [        SU 35      eX R                  U R                  -  :  a(  [        SU SU R                  U R                  -   35      eX R                  U'   XPR                  U'   X`R
                  U'   XpR                  U'   [        U   u  p[        R                  " 5       R                  U R                  U   5      n
[        R                  " U R                  U R                  -  U
S9S U n[        R                  " XR                  -  XR                  -  /SS9U R                  U'   X0R                  U'   U(       aH  [        R                   " [        R"                  " U5      SS9U R$                  U'   U R'                  U5        O;S	n[        R                   " [        R(                  " U5      U-  SS9U R$                  U'   U R+                  U5        U R-                  U R.                  5        g )
Nr   zI`n_frequency` should be a positive integer value but the value passed is zu`n_frequency` should be less than or equal to the product of the input and output dimensions but the value passed is z and the product is )	generator)dimT)requires_gradg{Gz?)r'   r"   r#   r   r   r   r   r
   torch	Generatormanual_seedrandpermstackr   r   r   	Parameteremptyr   reset_wave_parametersrandn%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r)   adapter_namen_frequencyscalinginit_weightsrandom_loc_seedwavelet_familyuse_idwtreduction_rowsreduction_colsr/   indicesstd_devs                r*   update_layerWaveFTLayer.update_layerB   s    !hithuvww))D,=,===++6-7KDL\L\_c_p_pLpKqs 
 1<-4C##L13A""<0-5\* *<N)K& OO%11$2M2Ml2[\	..!2!2T5E5E!EQZ[\h]hi -2KK((('4D4D*DE1-
L) -4L) 13ekk+>Vfj1kD  .&&|4 G13ekk+>VY`>`pt1uD  .22<@--.r-   c                     XR                   R                  5       ;   a-  [        R                  R	                  U R                   U   5        g g N)r   keysr   initzeros_)r)   r>   s     r*   r9   !WaveFTLayer.reset_wave_parameterso   s7    //4466GGNN4//=> 7r-   c                    U R                   U   nU R                  U   R                  UR                  5      nU R                  U   nU R
                  U   (       Ga  [        U   u  pVU R                  U-   nU R                  U-   nUS-  S:w  a  US-  nUS-  S:w  a  US-  n[        R                  " XxUR                  UR                  S9n	XpR                  -
  S-  n
XR                  -
  S-  nUR                  5       nUSS S 24==   U
-  ss'   USS S 24==   U-  ss'   USS S 24   U:  USS S 24   U:  -  nUS S 2U4   nX-   nXUSS S 24   USS S 24   4'   U	R                  u  nnUS-  US-  nnU	S U2S U24   nU	S U2US 24   nU	US 2S U24   nU	US 2US 24   nUUUU44n[        UU5      U R                  U   -  nUR                  S   U R                  :w  d  UR                  S   U R                  :w  ac  UR                  S   U R                  -
  S-  nUR                  S   U R                  -
  S-  nUUUU R                  -   2UUU R                  -   24   nU$ [        R                  " U R                  U R                  UR                  UR                  S9n	X)USS S 24   USS S 24   4'   XR                  U   -  nU$ )N   r   r	   )devicedtype)r   r   torS   r   r   r
   r#   r"   r2   zerosrT   cloner&   r   r   )r)   adapterspectrumrG   rC   rE   rF   padded_out_featurespadded_in_featuresdense_spectrum
row_offset
col_offsetpadded_indices
valid_maskvalid_indicesvalid_spectrumHWH2W2cAcHcVcDcoeffsdelta_weight	start_row	start_cols                               r*   get_delta_weightWaveFTLayer.get_delta_weightt   sZ   ''0%%g.11(//B33G< ((-?-O*N #'"3"3n"D!%!1!1N!B #Q&!+#q(#!A%*"a'" #[[#W_WeWeN
 .0A0AAaGJ,/?/??AEJ %]]_N1a4 J. 1a4 J.  )A.1DDXY[\X\I]`rIrsJ*1j=9M%1N HV=A.ad0CCD "''DAq!VQ!VBSbS)BRS)BSbS)BRS)B 2r2,'F %V^<t?R?RSZ?[[L !!!$(9(99\=O=OPQ=RVZVfVf=f)//2T5F5FF1L	)//2T5E5EE!K	  ,	D,=,= ==y9W[WgWgKg?gg   #[[!!4#3#3HOOS[SaSaN <D71a4='!Q$-78),?,?,HHLr-   )r   r   r"   r   r   r#   r   r   r   r   r   r   r   )db1T)__name__
__module____qualname____firstlineno__adapter_layer_namesother_param_namesr   Moduler+   rI   r2   no_gradr9   Tensorro   __static_attributes__ r-   r*   r   r      sc    .K299 K4 K2 qu+/Z ]]_? ?K5<< Kr-   r   c                     ^  \ rS rSr       SS\S\S\S\S\\\4   S\S\S	\S
S4U 4S jjjr	SS\S\
\\      S
S4S jjrSS jrS
\R                  4U 4S jjrS\R                  S\S\S
\R                  4S jrS
\4U 4S jjrSrU =r$ )WaveFTLinear   r>   r?   r@   fan_in_fan_outrA   rB   rC   rD   r   Nc
           	         > [         TU ]  5         [        R                  " X40 U
D6  XPl        X l        U R                  X#XFXxU	5        g rL   )superr+   r   r   _active_adapterrI   )r)   r   r>   r?   r@   r   rA   rB   rC   rD   r   	__class__s              r*   r+   WaveFTLinear.__init__   sD     	T88,+,WOmuvr-   
safe_mergeadapter_namesc                 >   [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nU(       a  UR                  R
                  R                  5       nXPR                  U5      -  n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        O.UR                  =R
                  U R                  U5      -  sl        U R                  R                  U5        GM     g)a  
Merge the active adapter weights into the base weights

Args:
    safe_merge (`bool`, *optional*):
        If True, the merge operation will be performed in a copy of the original weights and check for NaNs
        before merging the weights. This is useful if you want to check if the merge operation will produce
        NaNs. Defaults to `False`.
    adapter_names (`List[str]`, *optional*):
        The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults
        to `None`.
Nz1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   rM   r   r%   datarW   ro   r2   isfiniteallr'   r   append)r)   r   r   active_adapterr   orig_weightss         r*   mergeWaveFTLinear.merge   s     0D+N!5!5!:!:!<<!002
 $.#4#4#9#9#?#?#AL $9$9.$IIL >>,7;;==(OP^O__rs  .:%%*%%**d.C.CN.SS*$$++N;# ,r-   c                    U R                   (       d  [        R                  " S5        g[        U R                  5      S:  a  U R                  R                  5       nXR                  R                  5       ;   a<  U R                  5       R                  =R                  U R                  U5      -  sl
        [        U R                  5      S:  a  M  gg)zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   )mergedwarningswarnlenr   popr   rM   r   r%   r   ro   )r)   r   s     r*   unmergeWaveFTLinear.unmerge   s     {{MM<=$&&'!+!11557N!5!5!:!:!<<##%,,11T5J5J>5ZZ1 $&&'!+r-   c                 "   > [         TU ]  U5      $ rL   )r   ro   )r)   rX   r   s     r*   ro   WaveFTLinear.get_delta_weight  s    w'00r-   xargsr   c                 <   UR                   nU R                  (       a8  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nOU R                  (       a  U R                  " U/UQ70 UD6nOU R                  " U/UQ70 UD6nU R
                   Hg  nX`R                  R                  5       ;  a  M"  U R                  U5      nU R                  XR                   5      nU[        R                  " X5      -   nMi     UR                  U5      nU$ rL   )rT   disable_adaptersr   r   r   r=   r   rM   ro   _cast_input_dtypeFlinearrU   )r)   r   r   r   previous_dtyperesultr   delta_ws           r*   forwardWaveFTLinear.forward  s      {{__Q888F[[__Q888F__Q888F"&"6"6!)=)=)B)B)DD//?**1mm<!((1"66 #7 >*r-   c                 *   > [         TU ]  5       nSU-   $ )Nzwaveft.)r   __repr__)r)   repr   s     r*   r   WaveFTLinear.__repr__!  s    g 3r-   )r   r   )i  g     b@FFi	  rq   T)FN)r   N)rr   rs   rt   ru   strintfloatboolr   r+   r   listr   r   r2   rz   ro   r   r   r   r{   __classcell__)r   s   @r*   r~   r~      s     $)."#w w 	w
 w w D#I&w w w w 
w w&#< #<Xd3i=P #<\` #<J
[15<< 1 c S U\\ ,#  r-   r~   )r   typingr   r   r   r2   torch.nnr   torch.nn.functional
functionalr   transformers.pytorch_utilsr   peft.tuners.tuners_utilsr   r   	constantsr
   r   r   rx   r~   r|   r-   r*   <module>r      sK     ' '     - L )  b. bJa299k ar-   