
    S_fL<                        d Z ddlmZmZ ddlmZ ddlmZ ddlZddl	Z
ddlZddlmZ ddlmZmZ ddlmZ eej&                  j)                  d	      gZej&                  j,                  Zg d
Zd Zd Z ed       G d d             Z ed       G d d             Z eddg       G d d             Z eddddg       G d d             Z eddddg       G d d              Zy)!zIncludes test functions for fftpack.helper module

Copied from fftpack.helper by Pearu Peterson, October 2005
Modified for Array API, 2023

    )next_fast_len_init_nd_shape_and_axes)assert_equal)raisesN)array_api_compatible)xp_assert_closeSCIPY_DEVICE)fftskip_if_array_api)                  	   
      i  i  c                  D    t         D ]  } t        t        |       |         y )N)_5_smooth_numbersr   r   )ns    ;lib/python3.12/site-packages/scipy/fft/tests/test_helper.pytest_next_fast_lenr      s      *]1%q)*    c                     | }|dk  rJ 	 t        | d      \  }}|dk7  rn|} t        d|dz   d      D ]  }	 t        | |      \  }}|dk7  r|}  | dk(  sJ d| d| d|         y )Nr   r   r      zx=z is not z-smooth, remainder=)divmodrange)xr   x_origqrds         r   _assert_n_smoothr$       s    F1uu
a|16	  1ac1 !Q<DAqAvA	  6 :xxs"5aS9:6r   T)np_onlyc                       e Zd Zd Zd Zd Zej                  j                  e	j                  dk  ded      d        Zd	 Zy
)TestNextFastLenc                     t         j                  j                  d       d } |       D ]B  }t        |      }t	        |d       |t        |d      k(  sJ t        |d      }t	        |d       D y )Ni  c               3   @   K   t        dd      E d {    d y 7 	w)Nr   i  iy )r    r   r   numsz0TestNextFastLen.test_next_fast_len.<locals>.nums<   s      Q~%%(( &s   
   FTr   )nprandomseedr   r$   )selfr+   r   ms       r   r   z"TestNextFastLen.test_next_fast_len9   si    
		t	)  	#Aa AQ#a////a&AQ"	#r   c           	      ,   t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  g}|D ]3  } |d      }t        |      }t        |t        t        |                   5 y )Ni90  )
r-   int16int32int64uint16uint32uint64r   r   int)r0   ITYPESitypr   testNs        r   test_np_integersz TestNextFastLen.test_np_integersH   sa    ((BHHbhh		299biiP 	7DUA!!$Ec!f 56	7r   c                     ddddddddddd	d
dddd}|j                         D ]  \  }}t        t        |d      |        y )Nr   r   r   r   r   r   r            i       @)r   r   r   r   r   r      r      r?   r@      i  rB   rC   Titemsr   r   r0   hamsr   ys       r   testnext_fast_len_smallz'TestNextFastLen.testnext_fast_len_smallO   sU    Q1qQ1$dh
 JJL 	4DAqq$/3	4r   l        z$Hamming Numbers too large for 32-bitT)reasonr   strictc                     i ddddddddddddd	d
dddddddddddddddddddddddddddddddd }|j                         D ]  \  }}t        t        |d!      |        y )"Nihihi i=ui+2i,2i  B3l      l     l   s' l   >9l   >9l         l      fn l     fn l    >Uko l     q. l    q. l   xQ+t0 l      ! l     ! l    dopL? l   hRl   hR   2 f;               `71Y!l    ("               X l         	 )rP   l   2 f;rQ   l   rR   l    `71Y!rS   l          l   X rT   l   !X TrG   rI   s       r   testnext_fast_len_bigz%TestNextFastLen.testnext_fast_len_bigW   s'   
y
"/
y
 y
 #0
 ,	
 )9,	

 =

 +<]
 _
  
 _
  
 .
 !"2
 0
 "#4
   1#40#40#4 2$6$6 2$69
< JJL 	4DAqq$/3	4r   c                 L    t        dd      dk(  sJ t        dd      dk(  sJ y )Nr,   T)real   rD   F)targetrW   )r   )r0   s    r   test_keyword_argsz!TestNextFastLen.test_keyword_args|   s,    Rd+r111AE2a777r   N)__name__
__module____qualname__r   r=   rL   pytestmarkxfailsysmaxsize
ValueErrorrU   rZ   r*   r   r   r'   r'   6   sR    #74 [[s{{U*D(  7 47 4D8r   r'   )cpu_onlyc                   T    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)Test_init_nd_shape_and_axesc                 r    |j                  d      }d }d }d}g }t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   r*   asarrayr   	r0   xpr   shapeaxesshape_expectedaxes_expected	shape_resaxes_ress	            r   test_py_0d_defaultsz/Test_init_nd_shape_and_axes.test_py_0d_defaults   sR    JJqM5aE	8N***=(((r   c                 r    |j                  d      }d }d }d}g }t        |||      \  }}||k(  sJ ||k(  sJ y )Ng      @r*   rh   rj   s	            r   test_xp_0d_defaultsz/Test_init_nd_shape_and_axes.test_xp_0d_defaults   sR    JJrN5aE	8N***=(((r   c                 x    |j                  g d      }d }d }d}dg}t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   r   r   )r   r   rh   rj   s	            r   test_py_1d_defaultsz/Test_init_nd_shape_and_axes.test_py_1d_defaults   sU    JJy!5aE	8N***=(((r   c                 x    |j                  ddd      }d }d }d}dg}t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   r   皙?)r   )aranger   rj   s	            r   test_xp_1d_defaultsz/Test_init_nd_shape_and_axes.test_xp_1d_defaults   sY    IIaB5aE	8N***=(((r   c                     |j                  g dg dg      }d }d }d}ddg}t        |||      \  }}||k(  sJ ||k(  sJ y )N)r   r   r   r   )r   r   rD   r   )r   r   r   r   rh   rj   s	            r   test_py_2d_defaultsz/Test_init_nd_shape_and_axes.test_py_2d_defaults   sa    JJ$& 'A5aE	8N***=(((r   c                     |j                  ddd      }|j                  |d      }d }d }d}ddg}t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   r   ry   )r   r   )rz   reshaper   rj   s	            r   test_xp_2d_defaultsz/Test_init_nd_shape_and_axes.test_xp_2d_defaults   sk    IIaBJJq&!A5aE	8N***=(((r   c                 z    |j                  g d      }d }d }d}g d}t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   r   r   r   r   r   r   r   r   r   zerosr   rj   s	            r   test_xp_5d_defaultsz/Test_init_nd_shape_and_axes.test_xp_5d_defaults   sS    HH_%('5aE	8N***=(((r   c                 ~    |j                  g d      }g d}d }d}g d}t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   )r   r   r   r   )r   r   r   r   r   r   r   rj   s	            r   test_xp_5d_set_shapez0Test_init_nd_shape_and_axes.test_xp_5d_set_shape   sS    HH_%")'5aE	8N***=(((r   c                 ~    |j                  g d      }d }g d}d}g d}t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   )r   r   r   )r   r   r   r   rj   s	            r   test_xp_5d_set_axesz/Test_init_nd_shape_and_axes.test_xp_5d_set_axes   sS    HH_%"!5aE	8N***=(((r   c                     |j                  g d      }g d}g d}d}g d}t        |||      \  }}||k(  sJ ||k(  sJ y )Nr   )r   r   r   )r   r   r   )r   r   r   r   rj   s	            r   test_xp_5d_set_shape_axesz5Test_init_nd_shape_and_axes.test_xp_5d_set_shape_axes   sS    HH_%#!5aE	8N***=(((r   c                 h    |j                  d      }t        |dd       \  }}|dk(  sJ |g dk(  sJ y )N)r   r   r   r   )r   r   r   rl   rm   rv   r   )r0   rk   r   rl   rm   s        r   test_shape_axes_subsetz2Test_init_nd_shape_and_axes.test_shape_axes_subset  s>    HH\"-aytLt	!!!y   r   c                    |j                  d      }t        t        d      5  t        |d ddgddgg       d d d        t        t        d      5  t        |d g d       d d d        t        t        d	      5  t        |d dg       d d d        t        t        d	      5  t        |d d
g       d d d        t        t        d      5  t        |d ddg       d d d        t        t        d      5  t        |ddgddggd        d d d        t        t        d      5  t        |g dd        d d d        t        t        d      5  t        |j                  g d      g ddg       d d d        t        t        d      5  t        |dgd        d d d        t        t        d      5  t        |d
d        d d d        y # 1 sw Y   xY w# 1 sw Y   yxY w# 1 sw Y   ]xY w# 1 sw Y   AxY w# 1 sw Y   $xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr   z-axes must be a scalar or iterable of integers)matchr   r   r   r   )g      ?g       @g      @g      @z$axes exceeds dimensionality of inputzall axes must be uniquer   z.shape must be a scalar or iterable of integerszBwhen given, axes and shape arguments have to be of the same length)r   r   r   r   rv   z1invalid number of data points \(\[0\]\) specifiedz2invalid number of data points \(\[-2\]\) specified)r   assert_raisesrc   r   )r0   rk   r   s      r   test_errorsz'Test_init_nd_shape_and_axes.test_errors  sQ   HHQK: .2 3 	J#AT!Q!Q8HI	J : .2 3 	J#AT8HI	J :!GI 	=#AT<	= :!GI 	>#AT=	> :!:< 	@#ATA?	@ : .2 3 	J#Aq!fq!f-=DI	J : .2 3 	J#A-=DI	J :"<= 	? $BHH\$:*31#?	? :"34 	= $AaSt<	=
 :"45 	< $ARd;	< 	<O	J 	J	J 	J	= 	=	> 	>	@ 	@	J 	J	J 	J	? 	?	= 	=
	< 	<sw   GG;G&$G3H 7H%H#H&H24H>GG#&G03G= H
HH#&H/2H;>IN)r[   r\   r]   rr   rt   rw   r{   r}   r   r   r   r   r   r   r   r*   r   r   rf   rf      s>    ))))))))))!,<r   rf   torchz1torch.fft not yet implemented by array-api-compat)reasonsc                   $    e Zd Zd Zd Zd Zd Zy)TestFFTShiftc                    |j                  g d      }|j                  g d      }t        t        j                  |      |       t        t        j                  |      |       |j                  g d      }|j                  g d      }t        t        j                  |      |       t        t        j                  |      |       y )N)	        r   r   r   r   r   r   )	g      r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   )
g      r   r   r   r   r   r   r   r   r   ri   r   r
   fftshift	ifftshift)r0   rk   r   rK   s       r   test_definitionzTestFFTShift.test_definitionB  s    JJ78JJ78Q+a(!,JJ;<JJ;<Q+a(!,r   c                     dD ]c  }|j                  t        j                  j                  |f            }t        t	        j
                  t	        j                  |            |       e y )N)r   r   r   d      )ri   r-   r.   r   r
   r   r   )r0   rk   r   r   s       r   test_inversezTestFFTShift.test_inverseL  sK    $ 	?A

299++QD12ACMM#,,q/:A>	?r   c                 D   |j                  g dg dg dg      }|j                  g dg dg dg      }t        t        j                  |d      |       t        t        j                  |d	      t        j                  |d
             t        t        j                  |d      |       t        t        j                  |d	      t        j                  |d
             t        t        j                  |      |       t        t        j                  |      |       y )N)r   r   r   )r   r   r   )r   r   r   )g      r   r   )r   r   r   )r   r   r   r   r   rm   r   r   r   )r0   rk   freqsshifteds       r   test_axes_keywordzTestFFTShift.test_axes_keywordQ  s    

J
LAB**mY
CDU8'BU3S\\%d5STgF;UCgA6gD9	;U+W5g.6r   c                    |j                  ddgddgddgg|j                        }|j                  ddgddgddgg|j                        }t        t        j                  |d      |       t        t        j
                  |d      |       t        t        j                  |d	      |       t        t        j
                  |dg      |       |j                  ddgddgddgg|j                        }t        t        j                  |d      |       t        t        j
                  |d      |       |j                  ddgddgddgg|j                        }t        t        j                  |d
      |       t        t        j
                  |d
      |       t        t        j                  |ddg      |       t        t        j
                  |ddg      |       t        t        j                  |d      |       t        t        j
                  |d      |       t        t        j                  |      |       t        t        j
                  |      |       y)z1 Test 2D input, which has uneven dimension sizes r   r   r   r   r   r   dtyper   r   r   N)ri   float64r   r
   r   r   )r0   rk   r   
shift_dim0
shift_dim1shift_dim_boths         r   test_uneven_dimszTestFFTShift.test_uneven_dims\  s   

FFF
 	   ZZFFF!
 	   

 	U3Z@jq95AU6
Cjs;UC ZZFFF!
 	   

 	U3Z@jq95A FFF%
 	 $ 
 	U8.In6BEJU!Q8.InAq6BEJ 	U6Gn4@%HU+^<n5u=r   N)r[   r\   r]   r   r   r   r   r*   r   r   r   r   >  s    -?
	7+>r   r   array_api_strictcupyz+fft not yet implemented by array-api-strictz0cupy.fft not yet implemented by array-api-compatc                       e Zd Zd Zy)TestFFTFreqc                    t         }	 |j                  g d|j                  |      }|j                  g d|j                  |      }|j                  dt	        j
                  d|      z  |j                        }t        ||       |j                  d|j                  z  t	        j
                  d|j                  |      z  |j                        }t        ||       |j                  dt	        j
                  d|      z  |j                        }t        ||       |j                  d|j                  z  t	        j
                  d|j                  |      z  |j                        }t        ||       y # t        $ rB |j                  g d|j                        }|j                  g d|j                        }Y w xY w)N)	r   r   r   r   r   r   r   r   r   r   device)
r   r   r   r   r   r   r   r   r   r   r   r   rk   r   )r	   ri   r   	TypeErrorr
   fftfreqr   pir0   rk   r   r   x2rK   s         r   r   zTestFFTFreq.test_definition  sm   	.

:!#F  <A?"$**V  =B JJq3;;qR00

JC1JJq255y3;;q"%%B#??rzzJR1JJrCKKr22"**JE2JJrBEEzCKKBEEb$AAJT2  	.

:"**
MA?"$**  .B	.   A E= =AGGNr[   r\   r]   r   r*   r   r   r   r     s    
r   r   c                       e Zd Zd Zy)TestRFFTFreqc                    t         }	 |j                  g d|j                  |      }|j                  g d|j                  |      }|j                  dt	        j
                  d|      z  |j                        }t        ||       |j                  d|j                  z  t	        j
                  d|j                  |      z  |j                        }t        ||       |j                  dt	        j
                  d|      z  |j                        }t        ||       |j                  d|j                  z  t	        j
                  d|j                  |      z  |j                        }t        ||       y # t        $ rB |j                  g d|j                        }|j                  g d|j                        }Y w xY w)Nr   r   )r   r   r   r   r   r   r   r   r   r   )r	   ri   r   r   r
   rfftfreqr   r   r   s         r   r   zTestRFFTFreq.test_definition  s\   	B

?"**V
LA.bjjPB JJq3<<b11JD1JJq255y3<<255R#@@

JS1JJrCLL332::JF2JJrBEEzCLLRUUr$BB"**JU2  	B

?"**
=A.bjjAB	Br   Nr   r*   r   r   r   r     s    
r   r   )__doc__scipy.fft._helperr   r   numpy.testingr   r^   r   r   numpyr-   ra   scipy.conftestr   scipy._lib._array_apir   r	   scipyr
   r_   usefixtures
pytestmarkr   r   r   r$   r'   rf   r   r   r   r*   r   r   <module>r      s6   E & *   
 / ? "FKK$;$;<O$PQ
KK11  *
:, 4 G8 G8 !G8T D!y< y< "y<x 7OPRG> G>RG>T %vINPQ Q2 %vINPQ Qr   