o
    iP                     @   s  d dl Z d dl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 d dlmZ d dlmZ d dlmZmZmZmZ eejdgZejjZdd	 Zd
d ZG dd dZeddejdejejej ej!ej"ej#gejdddgejdejej$ej%ej&ej'ej(gdd Z)eddG dd dZ*eddejdejej&ej+ej,gdd Z-G dd dZ.ejdejej&ej+ej,ej%ej(ej/ej0ej1ej2g
dd  Z3ejdd!d"gejdejej&ej,ej%ej(ej0ej1gd#d$ Z4dS )%    N)random)assert_array_almost_equalassert_allclose)raises)array_api_compatible)array_namespacexp_sizexp_assert_closexp_assert_equalskip_xp_backendsc                 C   sz   | t j t jt jt jt jt jt jt jt jt j	t j
t jfv r!|j}|S | t jt jt jt jt jt jfv r6|j}|S td|  )NzUnknown FFT function: )fftfftnfft2ifftifftnifft2hffthfftnhfft2irfftirfftnirfft2
complex128rfftrfftnrfft2ihfftihfftnihfft2float64
ValueError)funcxpdtype r$   T/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/fft/tests/test_basic.pyget_expected_input_dtype   s   r&   c                 C   sR   t | }dtj t|t|  }t|dd| }tj| t| ddS )Ny                 axis)lennppiZarangefloatZreshapesumexp)xLZphaser$   r$   r%   fft1%   s   r3   c                   @   sB  e Zd Zdd Zeddddd Zdd	 Zedd
d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#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zejd1ejejej ej!gd2d3 Z"ejd1ej#ej$gd4d5 Z%ejd1ejejej ej!gd6d7 Z&ejd1ej'ej(ej)ej*ej+ej,ej#ej$gd8d9 Z-d:d; Z.edd<ejd=e/j0e/j1gd>d? Z2ejd=d@dAgdBdC Z3ejd=dDdEgdFdG Z4eddHdejd1ejej5ej'ej(ejejej6ej7ej)ej*ej ej!ej8ej9ej+ej,ej#ej$gdIdJ Z:dKS )LTestFFTc              	   C   s   d}| t|dt|  }| t|}dD ])}ttt|d| |d|  ttt|d| ||d|  qd S )N                 ?)	r(            r5   5      i  i  r   )asarrayr   r	   r   r   r   r   selfr"   maxlenr1   Zxrir$   r$   r%   test_identity-   s   &*zTestFFT.test_identityTz&significant overhead for some backends)np_onlyreasonc              	   C   s   d}| t|dt|  }| t|}td|D ])}ttt|d| |d|  ttt|d| ||d|  qd S )Nr5   r6   r(   r   )r<   r   ranger	   r   r   r   r   r=   r$   r$   r%   test_identity_extensive6   s   &*zTestFFT.test_identity_extensivec              	   C   s   t ddt d  }|t|}||}tt|| ttj|dd| ttj|dd|||jd|jd  ttj|dd|d  d S )N   r6   backwardnormorthor#   forward)r   r<   r3   r	   r   sqrtr   r>   r"   r1   expectr$   r$   r%   test_fft?   s   
zTestFFT.test_fftzsome backends allow `n=0`c                 C   s(   |j g d|jd}tttj|d d S )Nr(   r7      rK   r   )r<   r   assert_raisesr    r   )r>   r"   r1   r$   r$   r%   
test_fft_nI   s   zTestFFT.test_fft_nc                 C   s\   | tddtd  }ttt|| dD ]}ttjtj||d|d| qd S )NrF   r6   rG   rJ   rL   rH   )r<   r   r	   r   r   r>   r"   r1   rI   r$   r$   r%   	test_ifftN   s
    zTestFFT.test_ifftc              	   C   s   | tddtd  }tjtj|dddd}tt|| ttj|dd| ttj|dd|||j d	|jd
  ttj|dd|d	  d S NrF      r6   r(   r)   r   rG   rH   rJ   X  rK   rL   )r<   r   r   r	   r   rM   r   rN   r$   r$   r%   	test_fft2T      zTestFFT.test_fft2c              	   C   s   | tddtd  }tjtj|dddd}tt|| ttj|dd| ttj|dd|||j d	|jd
  ttj|dd|d	  d S rX   )r<   r   r   r   r	   r   rM   r   rN   r$   r$   r%   
test_ifft2]   r]   zTestFFT.test_ifft2c              	   C   s   | tddtd  }tjtjtj|dddddd}tt|| ttj|dd| ttj|d	d|||j d
|jd  ttj|dd|d
  d S )NrF   rZ   
   r6   r7   r)   r(   r   rG   rH   rJ   p  rK   rL   )r<   r   r   r	   r   rM   r   rN   r$   r$   r%   	test_fftnf   s   "zTestFFT.test_fftnc              	   C   s   | tddtd  }tjtjtj|dddddd}tt||dd ttj|d	d
|dd ttj|dd
t|||j d|jd  ttj|dd
|d dd d S )Nr_   r6   r7   r)   r(   r   gHz>)ZrtolrG   rH   rJ   ra   rK   rL   )r<   r   r   r   r	   r   rM   r   rN   r$   r$   r%   
test_ifftno   s   "
zTestFFT.test_ifftnc              
   C   s   |j td|jd}t|dt| fD ]A}dD ]!}ttj|||dtj|j ||jd||dd |d d   qttj||ddtj||d||j ||jd  qd S )	N   rK   r7   )NrG   rJ   rL   nrI   r(   rJ   )rf   )	r<   r   r   r   r	   r   r   r   rM   )r>   r"   r1   rf   rI   r$   r$   r%   	test_rfft|   s   "zTestFFT.test_rfftc                 C   P   | td}ttt|| dD ]}ttjtj||d|d| qd S )NrF   rU   rH   )r<   r   r	   r   r   r   rV   r$   r$   r%   
test_irfft   
    zTestFFT.test_irfftc              	   C   s   |j td|jd}t|j ||jdd d d df }tt|| ttj|dd| ttj|dd|||j d|jd  ttj|dd|d  d S 	NrY   rK      rG   rH   rJ   r[   rL   )	r<   r   r   r   r   r   r	   r   rM   rN   r$   r$   r%   
test_rfft2   s   &zTestFFT.test_rfft2c                 C   rh   NrY   rU   rH   )r<   r   r	   r   r   r   rV   r$   r$   r%   test_irfft2   rj   zTestFFT.test_irfft2c              	   C   s   |j td|jd}t|j ||jdd d d d d df }tt|| ttj|dd| ttj|dd|||j d|jd  ttj|dd|d  d S 	Nr_   rK      rG   rH   rJ   ra   rL   )	r<   r   r   r   r   r   r	   r   rM   rN   r$   r$   r%   
test_rfftn   s   ,zTestFFT.test_rfftnc                 C   rh   Nr_   rU   rH   )r<   r   r	   r   r   r   rV   r$   r$   r%   test_irfftn   rj   zTestFFT.test_irfftnc              	   C   s   t ddt d  }tt d|t df}t||d d d  f}||}||}|t|}tt|| ttj|dd| ttj|dd||	|jd|j
d	  ttj|d
d|d  d S )N   r6   r(   r'   rG   rH   rJ   rF   rK   rL   )r   r,   concatenateconjr<   realr   r	   r   rM   r   )r>   r"   r1   x_hermrO   r$   r$   r%   	test_hfft   s   

zTestFFT.test_hfftc                 C   s   t ddt d  }tt d|t df}t||d d d  f}||}||}ttt|| dD ]}ttjtj||d|d| q;d S )Nru   r6   r(   r'   rU   rH   )	r   r,   rv   rw   r<   r	   r   r   r   )r>   r"   r1   ry   rI   r$   r$   r%   
test_ihfft   s   

 zTestFFT.test_ihfftc                 C   rh   rn   )r<   r   r	   r   r   r   rV   r$   r$   r%   
test_hfft2   rj   zTestFFT.test_hfft2c              	   C   s   |j td|jd}t|j ||jdd d d df }tt|| ttj|dd| ttj|dd|||j d|jd  ttj|dd|d  d S rk   )	r<   r   r   r   r   r   r	   r   rM   rN   r$   r$   r%   test_ihfft2   s   &zTestFFT.test_ihfft2c                 C   rh   rs   )r<   r   r	   r   r   r   rV   r$   r$   r%   
test_hfftn   rj   zTestFFT.test_hfftnc              	   C   s   |j td|jd}t|j ||jdd d d d d df }t|t| t|tj|dd ttj|dd|||j d|jd  ttj|dd|d  d S rp   )	r<   r   r   r   r   r   r	   r   rM   rN   r$   r$   r%   test_ihfftn   s   ,zTestFFT.test_ihfftnc           
      C   sl   t ||}|jtd|d}g d}t|}|D ]}||j||d}|j|||d|d}	t||	 qd S )Nr_   rK   )r   r(   r7   r   r7   r(   )r(   r   r7   r(   r7   r   )r7   r   r(   )r7   r(   r   axes)r&   r<   r   r   permute_dimsr	   )
r>   opr"   r#   r1   r   xp_testaop_trtr_opr$   r$   r%   _check_axes   s   
zTestFFT._check_axesr   c                 C      |  || d S Nr   r>   r   r"   r$   r$   r%   test_axes_standard      zTestFFT.test_axes_standardc                 C   r   r   r   r   r$   r$   r%   test_axes_non_standard   r   zTestFFT.test_axes_non_standardc           	            t ||}|jtd|dg d}t}|D ]: t fddtjD }||j d|d d dd	}|j||d d  d d d	 d}t|| qd S )
Nr8         rK   r   r   r   c                    4   g | ]}| d d v rdj |  nj | qS Nr7   shape.0axr   r1   r$   r%   
<listcomp>       ,z@TestFFT.test_axes_subset_with_shape_standard.<locals>.<listcomp>r   r7   r   r(   sr   	r&   r<   r   r   tuplerD   ndimr   r	   	r>   r   r"   r#   r   r   r   r   r   r$   r   r%   $test_axes_subset_with_shape_standard   s    
 z,TestFFT.test_axes_subset_with_shape_standardc           	         r   )
Nr   rK   r   c                    r   r   r   r   r   r$   r%   r     r   zDTestFFT.test_axes_subset_with_shape_non_standard.<locals>.<listcomp>r   r7   r   r   r   r   r$   r   r%   (test_axes_subset_with_shape_non_standard	  s   
 (z0TestFFT.test_axes_subset_with_shape_non_standardc                 C   s   |j td|jd}t|}|j|}t|d }tjtj	ftj
tjftjtjfg}|D ]@\}}|tjkrD|j ||jd}|j|}t|dt| fD ]}dD ]}	||||	d}
||
||	d}
t|j|
| qRqNq-d S )NrF   rK   r7   rU   re   )r<   r   r   r   ZlinalgZvector_normr   r   r   r   r   r   r   r   r	   )r>   r"   r1   r   Zx_normrf   Z
func_pairsZforwbackrI   tmpr$   r$   r%   test_all_1d_norm_preserving  s(   



z#TestFFT.test_all_1d_norm_preservingrB   r#   c                 C   s   t d|}tjtjtjtji}||| }tt|}t	t
|}tt||jd }t|| t|| t|| |j|jksKJ |jttj|jksXJ |jttj|jkseJ d S )NrF   r   )r   astyper,   float16	complex64
longdoubleclongdoubler   r   r   r   r   r   r   r   r#   Zresult_typefloat32)r>   r#   r1   Z
out_dtypesZ	x_complexres_fftres_rfftres_hfftr$   r$   r%   test_dtypes_nonstandard2  s   


zTestFFT.test_dtypes_nonstandardr   r   c                 C   sX   |j tdt||d}tt|}tt||jd }t	|| t	|| d S )NrF   rK   r   )
r<   r   getattrr   r   r   r   r   r   r	   )r>   r#   r"   r1   r   r   r$   r$   r%   test_dtypes_realD  s
   
zTestFFT.test_dtypes_realr   r   c                 C   sD   t jd}|j|dt||d}tt|}t|| d S )Ni  rF   rK   )r,   r   Zdefault_rngr<   r   r   r   r	   )r>   r#   r"   rngr1   r   r$   r$   r%   test_dtypes_complexN  s   zTestFFT.test_dtypes_complexz,array-likes only supported for NumPy backendc                 C   sJ   ddgddggddgddggddgddggg}t ||||| d S )Ng      ?)r	   r<   )r>   r"   r   r1   r$   r$   r%   test_array_likeW  s
   zTestFFT.test_array_likeN);__name__
__module____qualname__rA   r   rE   rP   rT   rW   r\   r^   rb   rc   rg   ri   rm   ro   rr   rt   rz   r{   r|   r}   r~   r   r   pytestmarkparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r4   +   sz    
	



					






	
	r4   Tr   r#   orderFznon-contiguousr   c                 C   s   t jd}|dddj| dd}|dkrt |}n|d d d }t |d d d }|jd	rMt	d
D ]}|||d}|||d}t
|| q7d S |jdr|g d}	|jdrd|	g d |	D ]}
|||
d}|||
d}t
|| qfd S t)N*   r         F)copyr   r'   r   rR   r)   )r   r   )r   )r(   r7   )r   r7   r   ))r   )r(   )r7   Nr   )r,   r   ZRandomStateZrandr   ZasfortranarrayZascontiguousarrayr   endswithrD   r   extendr    )r#   r   r   r   XYr*   ZX_resZY_resr   r   r$   r$   r%   test_fft_with_orderi  s,   r   )Zcpu_onlyc                   @   sR   e Zd ZdZdZddddZdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestFFTThreadSafer8   )i      Nr"   c                   s~   fddt    } fddt| jD }dd |D  dd |D  t| jD ]}tjdd|d	d
 q/d S )Nc                    s   |  |   d S r   )put)argsq)r!   r$   r%   worker  s   z.TestFFTThreadSafe._test_mtsame.<locals>.workerc                    s   g | ]}t j fd qS ))targetr   )	threadingThread)r   r@   )r   r   r   r$   r%   r     s    z2TestFFTThreadSafe._test_mtsame.<locals>.<listcomp>c                 S      g | ]}|  qS r$   )startr   r1   r$   r$   r%   r         c                 S   r   r$   )joinr   r$   r$   r%   r     r      )timeoutz6Function returned wrong value in multithreaded context)err_msg)queueQueuerD   threadsr
   get)r>   r!   r"   r   expectedtr@   r$   )r   r!   r   r   r%   _test_mtsame  s   zTestFFTThreadSafe._test_mtsamec                 C   s(   |j | j|jd}| jtj||d d S NrK   r   )onesinput_shaper   r   r   r>   r"   r   r$   r$   r%   rP        zTestFFTThreadSafe.test_fftc                 C   $   | | jd}| jtj||d d S Ny      ?        r   )fullr   r   r   r   r   r$   r$   r%   rW        zTestFFTThreadSafe.test_ifftc                 C   "   | | j}| jtj||d d S Nr   )r   r   r   r   r   r   r$   r$   r%   rg        zTestFFTThreadSafe.test_rfftc                 C   r   r   )r   r   r   r   r   r   r$   r$   r%   ri     r   zTestFFTThreadSafe.test_irfftc                 C   s(   |j | j|jd}| jtj||d d S r   )r   r   r   r   r   r   r   r$   r$   r%   rz     r   zTestFFTThreadSafe.test_hfftc                 C   r   r   )r   r   r   r   r   r   r$   r$   r%   r{     r   zTestFFTThreadSafe.test_ihfft)r   r   r   r   r   r   rP   rW   rg   ri   rz   r{   r$   r$   r$   r%   r     s    r   r!   c                 C   sj   t d}|| dd tdD }W d    n1 sw   Y  | td}|D ]}t|| q+d S )Nr7   c                 S   s   g | ]}t d qS )d   )r,   r   )r   _r$   r$   r%   r     s    z%test_multiprocess.<locals>.<listcomp>r   r   )multiprocessingZPoolmaprD   r,   r   r   )r!   presrO   r1   r$   r$   r%   test_multiprocess  s   r   c                   @   s   e Zd Zdd ZdS )
TestIRFFTNc                 C   s<   t jd\}}|d|  }||}d}tj||d d S )N)r7   r8   r       r6   )r   )r,   r   r<   r   r   )r>   r"   arZair   r   r$   r$   r%   test_not_last_axis_success  s
   
z%TestIRFFTN.test_not_last_axis_successN)r   r   r   r   r$   r$   r$   r%   r     s    r   c                 C   s^   | t jt jt jfv r|j}n|j}|jdkr-|jg d|d}| | tt	| |dd d S d S )NnumpyrQ   rK   r7   )workers)
r   r   r   r   r   r   r   r<   rS   r    )r!   r"   r#   r1   r$   r$   r%   test_non_standard_params  s   
r  r   r   c                 C   s$   |j g dt||d}| | d S )NrQ   rK   )r<   r   )r!   r#   r"   r1   r$   r$   r%   test_real_input  s   r  )5r   r   r   r   r,   r   Znumpy.randomr   Znumpy.testingr   r   r   rS   Z	scipy.fftr   Zscipy.conftestr   Zscipy._lib._array_apir   r   r	   r
   r   ZusefixturesZ
pytestmarkr   r&   r3   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r$   r$   r$   r%   <module>   sd      @2
