o
    iN                     @   sN  d Z ddlmZ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mZmZ ddlmZ eejd	gZejjZg d
Zdd Zdd ZeddG dd dZeddG dd dZeddG dd dZG dd dZ edddedddG dd  d Z!edddedddG d!d" d"Z"dS )#zIncludes test functions for fftpack.helper module

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

    )next_fast_lenprev_fast_len_init_nd_shape_and_axes)assert_equal)raisesN)array_api_compatible)xp_assert_closeget_xp_devices	xp_devicearray_namespace)fftskip_xp_backends)                  	   
      i  i  c                  C   s   t D ]	} tt| |  qd S )N)_5_smooth_numbersr   r   )n r   U/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/fft/tests/test_helper.pytest_next_fast_len   s   r   c                 C   s   | }|dk rJ 	 t | d\}}|dkrn|} q	td|d dD ]}	 t | |\}}|dkr/n|} q#q | dksDJ d| d| d	|  d S )
Nr   FTr   r      zx=z is not z-smooth, remainder=)divmodrange)xr   Zx_origqrdr   r   r   _assert_n_smooth"   s(   
r#   T)Znp_onlyc                   @   N   e Zd Zdd Zdd Zdd Zejje	j
dk ded	d
dd Zdd ZdS )TestNextFastLenc                 C   \   t jd dd }| D ]}t|}t|d |t|dks!J t|d}t|d qd S )N  c                   s       t ddE d H  dV  d S Nr     iy r   r   r   r   r   nums>      
z0TestNextFastLen.test_next_fast_len.<locals>.nums   FTr   )nprandomseedr   r#   selfr,   r   mr   r   r   r   ;      


z"TestNextFastLen.test_next_fast_lenc                 C   sL   t jt jt jt jt jt jg}|D ]}|d}t|}t|tt	| qd S )N90  )
r/   int16int32int64uint16uint32uint64r   r   intr3   ZITYPESZitypr   ZtestNr   r   r   test_np_integersJ   s   z TestNextFastLen.test_np_integersc                 C   sJ   ddddddddddd	d
dddd}|  D ]\}}tt|d| qd S )Nr   r   r   r   r   r   r            i       @r   r   r   r   r   r      r      r@   rA        rC   rD   Titemsr   r   r3   Zhamsr   yr   r   r   testnext_fast_len_smallQ   s   
z'TestNextFastLen.testnext_fast_len_small        $Hamming Numbers too large for 32-bitTreasonr   strictc                 C   s   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 }|  D ]\}}tt|d!| qGd S )"Nhhi =u+2,2i  B3           l   s'    >9   >9l               fn      fn l    >Uko      q.     q. l   xQ+t0       !      ! l    dopL?    hR   hR   2 f;               `71Y!l    ("               X l         	 )re      2 f;rf      rg       `71Y!rh                X ri      !X TrJ   rL   r   r   r   testnext_fast_len_bigY   sd   	
z%TestNextFastLen.testnext_fast_len_bigc                 C   ,   t ddddks
J t ddddksJ d S )Nr.   Treal   rF   Ftargetrs   )r   r3   r   r   r   test_keyword_args~      z!TestNextFastLen.test_keyword_argsN)__name__
__module____qualname__r   r?   rN   pytestmarkxfailsysmaxsize
ValueErrorrp   rx   r   r   r   r   r%   8   s    
"r%   c                   @   r$   )TestPrevFastLenc                 C   r&   )Nr'   c                   s   r(   r)   r+   r   r   r   r   r,      r-   z0TestPrevFastLen.test_prev_fast_len.<locals>.numsr.   FTr   )r/   r0   r1   r   r#   r2   r   r   r   test_prev_fast_len   r5   z"TestPrevFastLen.test_prev_fast_lenc                 C   sn   t jt jt jt jt jt jg}|D ]$}|d}t|}t|tt	| t|dd}t|tt	|dd qd S )Nr6   Trr   )
r/   r7   r8   r9   r:   r;   r<   r   r   r=   r>   r   r   r   r?      s   z TestPrevFastLen.test_np_integersc                 C   s   dddddddddd	d
d
dddd}|  D ]\}}tt|d| q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}|  D ]\}}tt|d| qjd S ) Nr   r   r   r   r   r   r   rt   r@   rA   r*   rC   rD   rE   TrF   r   r   r.      rG   rH   rB            x   y   i  )rB      r   r   r   r   r   z   rI   rC   rD   FrK   r   r   rL   r   r   r   testprev_fast_len_small   s^   
z'TestPrevFastLen.testprev_fast_len_smallrO   rP   TrQ   c              
   C   s  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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/d0d0d.d1}|  D ]\}}tt|d2| qyd S )3NrT   rU   ihi  `rV   i=ui=urW   rX   i*2i@2rY   rZ   l    l     W: r[   r\   l   >9l    8r]   r^   l   en l        n r_   r`   l   q. l       , ra   rb   l   ! l         rc   l   hRrd   l    @!Rre   l   2 f;rj   l    arf   l         rk   l     +Krg   l    h\arh   l     >9ri   )rl   l   _71Y!rh   rm   l   ri   ro   rn   Tr   rL   r   r   r   testprev_fast_len_big   s   
 "#$&'(*+,./:z%TestPrevFastLen.testprev_fast_len_bigc                 C   rq   )Nr.   Trr   r   rF   Fru   )r   rw   r   r   r   rx      ry   z!TestPrevFastLen.test_keyword_argsN)rz   r{   r|   r   r?   r   r}   r~   r   r   r   r   r   rx   r   r   r   r   r      s    
>r   )Zcpu_onlyc                   @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )Test_init_nd_shape_and_axesc           	      C   F   | d}d }d }d}g }t|||\}}||ksJ ||ks!J d S )Nr   r   asarrayr   	r3   xpr   shapeaxesZshape_expectedZaxes_expectedZ	shape_resZaxes_resr   r   r   test_py_0d_defaults      
z/Test_init_nd_shape_and_axes.test_py_0d_defaultsc           	      C   r   )Ng      @r   r   r   r   r   r   test_xp_0d_defaults  r   z/Test_init_nd_shape_and_axes.test_xp_0d_defaultsc           	      C   sL   | g d}d }d }d}dg}t|||\}}||ksJ ||ks$J d S )Nr   r   r   )r   r   r   r   r   r   r   test_py_1d_defaults     z/Test_init_nd_shape_and_axes.test_py_1d_defaultsc           	      C   sL   | ddd}d }d }d}dg}t|||\}}||ksJ ||ks$J d S )Nr   r   皙?)r   )aranger   r   r   r   r   test_xp_1d_defaults   r   z/Test_init_nd_shape_and_axes.test_xp_1d_defaultsc           	      C   sV   | g dg dg}d }d }d}ddg}t|||\}}||ks#J ||ks)J d S )N)r   r   r   r   )r   r   rF   r   )r   r   r   r   r   r   r   r   r   test_py_2d_defaults-  s   
z/Test_init_nd_shape_and_axes.test_py_2d_defaultsc           	      C   sZ   | ddd}||d}d }d }d}ddg}t|||\}}||ks%J ||ks+J d S )Nr   r   r   )r   r   )r   Zreshaper   r   r   r   r   test_xp_2d_defaults;  s   z/Test_init_nd_shape_and_axes.test_xp_2d_defaultsc           	      C   sN   | g d}d }d }d}g d}t|||\}}||ksJ ||ks%J d S )Nr   r   r   r   r   r   r   r   r   r   zerosr   r   r   r   r   test_xp_5d_defaultsI  s   z/Test_init_nd_shape_and_axes.test_xp_5d_defaultsc           	      C   sR   | g d}g d}d }d}g d}t|||\}}||ks!J ||ks'J d S )Nr   )r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   test_xp_5d_set_shapeV  s   z0Test_init_nd_shape_and_axes.test_xp_5d_set_shapec           	      C   sR   | g d}d }g d}d}g d}t|||\}}||ks!J ||ks'J d S )Nr   )r   r   r   )r   r   r   r   r   r   r   r   test_xp_5d_set_axesc  s   z/Test_init_nd_shape_and_axes.test_xp_5d_set_axesc           	      C   sV   | g d}g d}g d}d}g d}t|||\}}||ks#J ||ks)J d S )Nr   )r   r   r   )r   r   r   )r   r   r   r   r   r   r   r   test_xp_5d_set_shape_axesp  s   z5Test_init_nd_shape_and_axes.test_xp_5d_set_shape_axesc                 C   s<   | d}t|dd d\}}|dksJ |g dksJ d S )N)r   r   r   r   )r   r   r   r   r   r   r   )r3   r   r   r   r   r   r   r   test_shape_axes_subset}  s   
z2Test_init_nd_shape_and_axes.test_shape_axes_subsetc                 C   s  | d}ttdd t|d ddgddggd W d    n1 s#w   Y  ttdd t|d g dd W d    n1 sBw   Y  ttd	d t|d dgd W d    n1 s`w   Y  ttd	d t|d d
gd W d    n1 s~w   Y  ttdd t|d ddgd W d    n1 sw   Y  ttdd t|ddgddggd d W d    n1 sw   Y  ttdd t|g dd d W d    n1 sw   Y  ttdd t| g dg ddgd W d    n	1 sw   Y  ttdd t|dgd d W d    n	1 s$w   Y  ttdd t|d
d d W d    d S 1 sCw   Y  d S )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   r   z1invalid number of data points \(\[0\]\) specifiedz2invalid number of data points \(\[-2\]\) specified)r   assert_raisesr   r   )r3   r   r   r   r   r   test_errors  sZ   

$z'Test_init_nd_shape_and_axes.test_errorsN)rz   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    r   c                   @   sD   e Zd Zdd Zdd Zeddddd	 Zedddd
d ZdS )TestFFTShiftc                 C   s|   | g d}| g d}tt|| tt|| | g d}| g d}tt|| tt|| d S )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   r   r   r   fftshift	ifftshift)r3   r   r   rM   r   r   r   test_definition  s   zTestFFTShift.test_definitionc                 C   s8   dD ]}| tj|f}ttt|| qd S )N)r   r   r   d      )r   r/   r0   r   r   r   r   )r3   r   r   r   r   r   r   test_inverse  s   zTestFFTShift.test_inversecupyzcupy/cupy#8393rR   c                 C   s   | g dg dg dg}| g dg dg dg}ttj|dd| ttj|d	dtj|d
d ttj|dd| ttj|d	dtj|d
d tt|| tt|| d S )N)r   r   r   )r   r   r   )r   r   r   )g      r   r   )r   r   r   )r   r   r   r   r   r   r   r   r   )r3   r   freqsZshiftedr   r   r   test_axes_keyword  s   zTestFFTShift.test_axes_keywordc                 C   s  |j ddgddgddgg|jd}|j ddgddgddgg|jd}ttj|dd| ttj|dd| ttj|d	d| ttj|dgd| |j ddgddgddgg|jd}ttj|dd| ttj|dd| |j ddgddgddgg|jd}ttj|d
d| ttj|d
d| ttj|ddgd| ttj|ddgd| ttj|dd| ttj|dd| tt|| tt|| dS )z1 Test 2D input, which has uneven dimension sizes r   r   r   r   r   r   Zdtyper   r   r   N)r   float64r   r   r   r   )r3   r   r   Z
shift_dim0Z
shift_dim1Zshift_dim_bothr   r   r   test_uneven_dims  sT   zTestFFTShift.test_uneven_dimsN)rz   r{   r|   r   r   r   r   r   r   r   r   r   r     s    



r   r   z+CuPy has not implemented the `device` paramr   z	jax.numpyz*JAX has not implemented the `device` paramc                   @      e Zd Zdd Zdd ZdS )TestFFTFreqc                 C      |j g d|jd}|j g d|jd}dtjd|d }t||ddd d|j tjd|j|d }t||dd	 d
tjd
|d }t||dd	 d
|j tjd
|j|d }t||dd	 d S )N)	r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   r   r   FTcheck_dtypeZcheck_namespacer   r   )r   r   r   fftfreqr   pir3   r   r   Zx2rM   r   r   r   r        zTestFFTFreq.test_definitionc                 C   V   t |d}t|}|D ]}tjd||d}|jd|d}t|t|ks(J qd S Nr   r   )r   device)r   )r   emptyr	   r   r   r
   r3   r   Zxp_testZdevicesr"   rM   r   r   r   r   test_device     zTestFFTFreq.test_deviceNrz   r{   r|   r   r   r   r   r   r   r         r   c                   @   r   )TestRFFTFreqc                 C   r   )Nr   r   )r   r   r   r   r   r   r   r   FTr   r   r   )r   r   r   rfftfreqr   r   r   r   r   r   r   &  r   zTestRFFTFreq.test_definitionc                 C   r   r   )r   r   r	   r   r   r
   r   r   r   r   r   8  r   zTestRFFTFreq.test_deviceNr   r   r   r   r   r      r   r   )#__doc__Zscipy.fft._helperr   r   r   Znumpy.testingr   r}   r   r   numpyr/   r   Zscipy.conftestr   Zscipy._lib._array_apir   r	   r
   r   Zscipyr   r~   ZusefixturesZ
pytestmarkr   r   r   r#   r%   r   r   r   r   r   r   r   r   r   <module>   sJ    Is =L