
    oi-                     `   % S SK JrJr  S SKJr  S SKJrJrJrJ	r	J
r
Jr  S SKrS SKrS SKJrJr  SSKJr   " S S	\5      r\\R.                  \\\S
4      4   r\\S'   \\\R.                  4   r\\S'   \\R.                  \\\S
4      4   r\\S'    " S S\5      r " S S\5      rS\	\\4   S\4S jrS\R@                  S\!4S jr"S\R.                  S\R.                  S\R.                  4S jr#S\S\R.                  4S jr$S\\%   SS4S jr&S\R.                  S\RN                  S\R.                  4S  jr(S\R.                  S!\R@                  S\R.                  4S" jr)\S#\*\R.                     S$\\R.                  /\R.                  4   S\*\R.                     4S% j5       r+\S#\S$\\R.                  /\R.                  4   S\4S& j5       r+\S#\S$\\R.                  /\R.                  4   S\4S' j5       r+S( r+S#\	\*\R.                     \\4   S\\RN                  \R@                  4   4S) jr,S\\%   S*\\%   S\\*\%   \*\%   4   4S+ jr-S,\R.                  S\\%   S\R.                  4S- jr.S,\R.                  S\\%   S\R.                  4S. jr/S,\R.                  S/\%S\\R.                  \*\%   4   4S0 jr0S,\R.                  S1\*\%   S/\%S\R.                  4S2 jr1SDS3\%S4\!4S5 jjr2S3\%S1\*\%   4S6 jr3S,\R.                  S3\%S1\*\%   S\	\\%S
4   \%4   S\R.                  4
S7 jr4S\	\\4   S8\!S9\RN                  S\R@                  S\4
S: jr5S;\%S<\%S=\%S>\%S\\%\%4   4
S? jr6S@\R.                  SA\R.                  S\R.                  4SB jr7 SES#\S\	\\4   S\\%\%4   S\R.                  4SC jjr8g)F    )CallableSequence)partial)Any
NamedTupleProtocolUnioncastoverloadN)	TypeAliasUnpack   )Waveletc                   p    \ rS rSr% \R
                  \S'   \R
                  \S'   \R
                  \S'   Srg)WaveletDetailTuple2d   
horizontalverticaldiagonal N)__name__
__module____qualname____firstlineno__torchTensor__annotations____static_attributes__r       V/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/waveft/waverec2d.pyr   r      s     llllr   r   .WaveletCoeff2dWaveletDetailDictWaveletCoeffNdc                       \ rS rSr% \\S'   \\   \S'   \\   \S'   \\   \S'   \\   \S'   \\S'   \\S'   \	\\   \\   \\   \\   4   \S	'   S
\4S jr
Srg)r   "   namedec_lodec_hirec_lorec_hidec_lenrec_lenfilter_bankreturnc                 ,    [        U R                  5      $ N)lenr'   )selfs    r    __len__Wavelet.__len__,   s    4;;r   r   N)r   r   r   r   strr   r   floatinttupler3   r   r   r   r    r   r   "   sj    
IUOUOUOUOLLx%(SX/YZZ   r   r   c                       \ rS rSr% \R
                  \S'   \R
                  \S'   \R
                  \S'   \R
                  \S'   \S\S\R                  SS 4S	 j5       r
S
rg)WaveletTensorTuple0   r'   r(   r)   r*   waveletdtyper.   c           
          U " [         R                  " UR                  US9[         R                  " UR                  US9[         R                  " UR                  US9[         R                  " UR
                  US95      $ )Nr=   )r   tensorr'   r(   r)   r*   )clsr<   r=   s      r    from_waveletWaveletTensorTuple.from_wavelet6   sW    LLu5LLu5LLu5LLu5	
 	
r   r   N)r   r   r   r   r   r   r   classmethodr   r=   rB   r   r   r   r    r:   r:   0   sV    LLLLLLLL
7 
5;; 
CW 
 
r   r:   r<   r.   c                 F    [        U [        5      (       a  [        U 5      $ U $ r0   )
isinstancer5   minimal_wavelet)r<   s    r    _as_waveletrH   @   s    '3w''r   r=   c                     U [         R                  [         R                  [         R                  [         R                  4;   $ r0   )r   float16bfloat16float32float64r?   s    r    _is_dtype_supportedrN   G   s&    U]]ENNEMM5==QQQr   abc                     [         R                  " U S/5      n[         R                  " US/5      n[         R                  " USS9n[         R                  " USS9nXE-  $ )N)dimr   )r   reshape	unsqueeze)rO   rP   a_flatb_flata_mulb_muls         r    _outerrZ   K   sN    ]]1rd#F]]1rd#FOOF+EOOF*E=r   arrayc                 Z    [        U [        R                  5      (       d  [        S5      eU $ )NzEFirst element of coeffs must be the approximation coefficient tensor.)rF   r   r   
ValueError)r[   s    r    _check_if_tensorr^   S   s$    eU\\**`aaLr   axesc                 \    [        [        U 5      5      [        U 5      :w  a  [        S5      eg )Nz#Cant transform the same axis twice.)r1   setr]   r_   s    r    _check_axes_argumentrc   Y   s'    
3t9~T">?? #r   r@   torch_devicec                 :    XR                   :w  a  [        S5      eU $ )Nz'coefficients must be on the same device)devicer]   )r@   rd   s     r    _check_same_devicerg   ^   s    }}$BCCMr   torch_dtypec                 :    XR                   :w  a  [        S5      eU $ )Nz%coefficients must have the same dtype)r=   r]   )r@   rh   s     r    _check_same_dtyperj   d   s    ll"@AAMr   coeffsfunctionc                     g r0   r   rk   rl   s     r    _coeff_tree_mapro   j   s     r   c                     g r0   r   rn   s     r    ro   ro   n       qtr   c                     g r0   r   rn   s     r    ro   ro   p   rq   r   c                 N   U" U S   5      n/ nU SS   H  n[        U[        5      (       a9  UR                  [        U" US   5      U" US   5      U" US   5      5      5        MQ  [        U[        5      (       a=  UR                  5        VVs0 s H  u  pVXQ" U5      _M     nnnUR                  U5        M  [        U[        R                  5      (       a  UR                  U" U5      5        M  [        S[        U5       35      e   U(       d  [        U [        5      (       a  U/$ U4$ [        US   [        R                  5      (       a%  U/[        [        [        R                     U5      -   $ [        [        [        [           [        [           4   U5      nU/UQ7$ s  snnf )Nr   r      zUnexpected input type )rF   r8   appendr   dictitemsr   r   r]   typelistr
   r	   r"   )	rk   rl   approx
result_lstelementkeyvaluenew_dictcast_result_lsts	            r    ro   ro   r   sp   fQi FJ!":gu%%28GAJ3GRYZ[R\I]_ghopqhr_stu&&?F}}OXe_,HOh'..hw/05d7m_EFF  %fd33xB&B	JqM5<<	0	0x$tELL1:>>>uT*;%<dCW>X%XY[ef))) Ps   F!c                     [        U S   5      nUR                  UR                  p2[        U [	        [
        US95        [        U [	        [        US95        X#4$ )Nr   )rd   )rh   )r^   rf   r=   ro   r   rg   rj   )rk   crd   rh   s       r    _check_same_device_dtyper      sN     	#A !!''+FG$6\RSFG$5;OP$$r   
data_shapec                    ^  T  Vs/ s H  o"S:  a  U[        U5      -   OUPM     snm [        [        [        U5      5      5      n[        [        U 4S jU5      5      nUT 4$ s  snf )Nr   c                    > U T;  $ r0   r   )rO   r_   s    r    <lambda>&_get_transpose_order.<locals>.<lambda>   s	    q}r   )r1   ry   rangefilter)r_   r   rO   all_axesremove_transformeds   `    r    _get_transpose_orderr      s_    9=>Aq5AJa/>DE#j/*+Hf%<hGHt## ?s   A"datac                     [        U5        [        U[        U R                  5      5      u  p#[        R
                  " XU-   5      $ r0   )rc   r   ry   shaper   permute)r   r_   frontbacks       r    
_swap_axesr      s4    &tT$**-=>KE==t|,,r   c                     [        U5        [        U[        U R                  5      5      u  p#[        R
                  " [        R                  " X#-   5      5      R                  5       n[        R                  " X5      $ r0   )	rc   r   ry   r   r   argsortr@   tolistr   )r   r_   r   r   restore_sorteds        r    _undo_swap_axesr      sR    &tT$**-=>KE]]5<<#=>EEGN==..r   keep_noc           
          [        U R                  5      n[        R                  " U [	        [
        R                  " US U*  5      5      /X!* S  -   5      U4$ r0   )ry   r   r   rT   r7   npprod)r   r   dshapes      r    
_fold_axesr      sM    $**FMM$RWWVIgX->%?!@ AF89DU UVX^__r   dsc           	      j    [         R                  " XS U*  [        U R                  U* S  5      -   5      $ r0   )r   rT   ry   r   )r   r   r   s      r    _unfold_axesr      s0    ==)G8}tDJJxy4I/JJKKr   ndimadd_channel_dimc                   ^ [        U[        5      (       a  U4n[        U S   5      R                  n[	        U5      (       d  [        SU S35      eTS::  a  [        S5      e[        U5      [        [        T* S5      5      :w  a9  [        U5      T:w  a  [        T ST S35      e[        [        US9n[        X5      n [        U S   R                  5      n[        U5      T:  a  [        ST S	35      e[        U5      T:X  a  [        U S
 5      n O"[        U5      TS-   :  a  [        U U4S j5      n U(       a  [        U S 5      n X4$ )Nr   zInput dtype z not supported%Number of dimensions must be positiveD transforms work with  axes.rb   	At least  input dimensions required.c                 $    U R                  S5      $ Nr   rU   xs    r    r   $_preprocess_coeffs.<locals>.<lambda>       1;;q>r   r   c                 "   > [        U T5      S   $ r   )r   )tr   s    r    r   r      s    :a3Fq3Ir   c                 $    U R                  S5      $ )Nr   r   r   s    r    r   r      r   r   )rF   r7   r^   r=   rN   r]   r8   r   r1   r   r   ro   ry   r   )rk   r   r_   r   rh   swap_fnr   s    `     r    _preprocess_coeffsr      s0   $w"6!9-33K{++<}NCDDqy@AAT{eE4%O,,t9v%<TF&IJJjt4G$V5F	fQioo	B
2w~9TF*EFGG	RD )AB	R4!8	 )IJ )AB:r   c                    [        U[        5      (       a  U4nUS::  a  [        S5      e[        U5      U:  a  [        SU S35      e[        U5      U:X  a  [	        U S 5      n O+[        U5      US-   :  a  [        [        X!S9n[	        X5      n [        U5      [        [        U* S5      5      :w  a9  [        U5      U:w  a  [        U SU S	35      e[        [        US
9n[	        X5      n U $ )Nr   r   r   r   c                 $    U R                  S5      $ r   )squeezer   s    r    r   %_postprocess_coeffs.<locals>.<lambda>   s    199Q<r   r   )r   r   r   r   rb   )
rF   r7   r]   r1   ro   r   r   r8   r   r   )rk   r   r   r_   unfold_axes_fnundo_swap_fns         r    _postprocess_coeffsr      s    $wqy@AA
2w~9TF*EFGG	RD )?@	R4!8	 "C 8T{eE4%O,,t9v%<TF&IJJ"?>L$V:FMr   c                      [        U /XUS9S   $ )N)rk   r   r   r_   r   )r   )r   r   r   r_   s       r    _postprocess_tensorr      s     tf4TJ1MMr   fliprf   c                 <   [        U 5      n U(       a  [        [        R                  " U R                  X#S9[        R                  " U R
                  X#S9[        R                  " U R                  X#S9[        R                  " U R                  X#S95      nU$ [        R                  XS9n[        UR                  R                  U5      UR                  R                  U5      UR                  R                  U5      UR
                  R                  U5      5      nU$ )N)rf   r=   r?   )
rH   r:   r   r@   r)   r*   r'   r(   rB   to)r<   r   rf   r=   filterss        r    _get_filter_tensorsr      s     '"G$LLDLLDLLDLLD	
 N %11'1G$NNf%NNf%NNf%NNf%	
 Nr   
tensor_len	coeff_lenpadrpadlc                 ^    SU-  U -
  S:X  a  US-  nX#4$ SU-  U -
  S:w  a  [        S5      eX#4$ )Nrt   r   r   zincorrect padding)r]   )r   r   r   r   s       r    !_adjust_padding_at_reconstructionr      sM    9}z!Q&	 : 
Y	#q	(,--:r   lohic                     [        X 5      n[        X5      n[        X5      n[        X5      n[        R                  " X#XE/S5      nUR                  S5      nU$ )Nr   r   )rZ   r   stackrU   )r   r   lllhhlhhfilts          r    _construct_2d_filtr     sN    	B	B	B	B;;'+D>>!DKr   c                 8   [        U SUS9u  p[        U 5      u  pE[        USXES9u    pgnUR                  S   n	[	        XxS9n
U S   n[        U SS  5       GH  u  p[        U[        5      (       a  [        U5      S	:w  a  [        S
[        U5       S35      eUR                  nU H  nUR                  U:w  d  M  [        S5      e   Uu  nnn[        R                  " UUUU/S5      n[        R                  R                  R                  XSS9R!                  S5      nSU	-  S	-
  S-  nSU	-  S	-
  S-  nSU	-  S	-
  S-  nSU	-  S	-
  S-  nU[        U 5      S-
  :  af  [#        UR                  S   XS-      S   R                  S   UU5      u  nn[#        UR                  S   XS-      S   R                  S   UU5      u  nnUS:  a  USUS 2S S 24   nUS:  a  USS U* 2S S 24   nUS:  a	  USUS 24   nUS:  d  GM  USS U* 24   nGM     [%        USX2S9nU$ )Nrt   )r   r_   F)r   rf   r=   rR   )r   r   r   r      z$Unexpected detail coefficient type: z. Must be a 3-tuple.z7All coefficients on each level must have the same shape)stride.)r   r   r_   )r   r   r   r   r   	enumeraterF   r8   r1   r]   rx   r   r   nn
functionalconv_transpose2dr   r   r   )rk   r<   r_   r   rd   rh   _r)   r*   filt_lenrec_filtres_llc_poscoeff_tuple
curr_shapecoeffres_lhres_hlres_hhr   r   padtpadbs                          r    	waverec2dr     sn   
 $F>JF 8 @L.wU<kAq&||BH!V7HAYF'qr
3+u--[1AQ1FCDDUCVVjkll\\
 E{{j( !Z[[ ! "-ffff=qA$$55fq5QYYZ[\Hq Q&Hq Q&Hq Q&Hq Q&3v;?":R &"3A"6"<"<R"@$JD$ ;R &"3A"6"<"<R"@$JD$ !8CM*F!8C4%N+F!8CJ'F!8C4%K(FA 4D !aBBFMr   )F))r   rR   )9collections.abcr   r   	functoolsr   typingr   r   r   r	   r
   r   numpyr   r   typing_extensionsr   r   r<   r   rG   r   r8   r   r!   r   rv   r5   r"   r#   r:   rH   r=   boolrN   rZ   r^   r7   rc   rf   rg   rj   ry   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    <module>r      s   / .  C C   / /:  "%,,u=QSV=V7W0X"XY	 Y#C$56 9 6!%,,u=NPS=S7T0U"UV	 V h  
 
 w|,  Ru{{ Rt Rell u||  C ELL @x} @ @
u|| 5<< ELL ell    
*2ELL>5<<3O*P	%,, 
 
 tN th~u||?[6\ tao t 
 t	 tN th~u||?[6\ tao t 
 t*,%$u||$nnDE%
5<<$%%$x} $(3- $ERVWZR[]abe]fRfLg $-U\\ -# -5<< -/%,, /hsm / /`U\\ `C `E%,,S	:Q4R `
Lu|| Lc LS LU\\ LS  4c tCy *N
,,N!N'+CyN8=eCHos>R8SN
\\N7C< (,6;llKP;;,# # S X[ `efiknfn`o 5<< U\\ ell  %007C< 0 S/0 \\	0r   