o
    ?HhP                     @   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$   Z/home/air/sanwanet/gpt-api/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piarangefloatreshapesumexp)xLphaser$   r$   r%   fft1%   s   r6   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(            r8   5      i  i  r   )asarrayr   r	   r   r   r   r   selfr"   maxlenr3   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 )Nr8   r9   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   r9   backwardnormorthor#   forward)r   r?   r6   r	   r   sqrtr   rA   r"   r3   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(   r:      rO   r   )r?   r   assert_raisesr    r   )rA   r"   r3   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 )NrJ   r9   rK   rN   rP   rL   )r?   r   r	   r   r   rA   r"   r3   rM   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rJ      r9   r(   r)   r   rK   rL   rN   X  rO   rP   )r?   r   r   r	   r   rQ   r   rR   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 r\   )r?   r   r   r   r	   r   rQ   r   rR   r$   r$   r%   
test_ifft2]   ra   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rJ   r^   
   r9   r:   r)   r(   r   rK   rL   rN   p  rO   rP   )r?   r   r   r	   r   rQ   r   rR   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 )Nrc   r9   r:   r)   r(   r   gHz>)rtolrK   rL   rN   re   rO   rP   )r?   r   r   r   r	   r   rQ   r   rR   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   rO   r:   )NrK   rN   rP   nrM   r(   rN   )rk   )	r?   r   r   r   r	   r   r   r   rQ   )rA   r"   r3   rk   rM   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 )NrJ   rY   rL   )r?   r   r	   r   r   r   rZ   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 	Nr]   rO      rK   rL   rN   r_   rP   )	r?   r   r   r   r   r   r	   r   rQ   rR   r$   r$   r%   
test_rfft2   s   &zTestFFT.test_rfft2c                 C   rm   Nr]   rY   rL   )r?   r   r	   r   r   r   rZ   r$   r$   r%   test_irfft2   ro   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 	Nrc   rO      rK   rL   rN   re   rP   )	r?   r   r   r   r   r   r	   r   rQ   rR   r$   r$   r%   
test_rfftn   s   ,zTestFFT.test_rfftnc                 C   rm   Nrc   rY   rL   )r?   r   r	   r   r   r   rZ   r$   r$   r%   test_irfftn   ro   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   r9   r(   r'   rK   rL   rN   rJ   rO   rP   )r   r,   concatenateconjr?   realr   r	   r   rQ   r   )rA   r"   r3   x_hermrS   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 )Nrz   r9   r(   r'   rY   rL   )	r   r,   r{   r|   r?   r	   r   r   r   )rA   r"   r3   r~   rM   r$   r$   r%   
test_ihfft   s   

 zTestFFT.test_ihfftc                 C   rm   rs   )r?   r   r	   r   r   r   rZ   r$   r$   r%   
test_hfft2   ro   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 rp   )	r?   r   r   r   r   r   r	   r   rQ   rR   r$   r$   r%   test_ihfft2   s   &zTestFFT.test_ihfft2c                 C   rm   rx   )r?   r   r	   r   r   r   rZ   r$   r$   r%   
test_hfftn   ro   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 ru   )	r?   r   r   r   r   r   r	   r   rQ   rR   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 )Nrc   rO   )r   r(   r:   r   r:   r(   )r(   r   r:   r(   r:   r   )r:   r   r(   )r:   r(   r   axes)r&   r?   r   r   permute_dimsr	   )
rA   opr"   r#   r3   r   xp_testaop_trtr_opr$   r$   r%   _check_axes   s   
zTestFFT._check_axesr   c                 C      |  || d S Nr   rA   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r;         rO   r   r   r   c                    4   g | ]}| d d v rdj |  nj | qS Nr:   shape.0axr   r3   r$   r%   
<listcomp>       ,z@TestFFT.test_axes_subset_with_shape_standard.<locals>.<listcomp>r   r:   r   r(   sr   	r&   r?   r   r   tuplerH   ndimr   r	   	rA   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   rO   r   c                    r   r   r   r   r   r$   r%   r     r   zDTestFFT.test_axes_subset_with_shape_non_standard.<locals>.<listcomp>r   r:   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 )NrJ   rO   r:   rY   rj   )r?   r   r   r   linalgvector_normr   r   r   r   r   r   r   r   r	   )rA   r"   r3   r   x_normrk   
func_pairsforwbackrM   tmpr$   r$   r%   test_all_1d_norm_preserving  s(   



z#TestFFT.test_all_1d_norm_preservingrF   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 )NrJ   r   )r   astyper,   float16	complex64
longdoubleclongdoubler   r   r   r   r   r   r   r   r#   result_typefloat32)rA   r#   r3   
out_dtypes	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 )NrJ   rO   r   )
r?   r   getattrr   r   r   r   r   r   r	   )rA   r#   r"   r3   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  rJ   rO   )r,   r   default_rngr?   r   r   r   r	   )rA   r#   r"   rngr3   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?   )rA   r"   r   r3   r$   r$   r%   test_array_likeW  s
   zTestFFT.test_array_likeN);__name__
__module____qualname__rE   r   rI   rT   rX   r[   r`   rb   rf   rh   rl   rn   rr   rt   rw   ry   r   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%   r7   +   sz    
	



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





	
	r7   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   rV   r)   )r   r   )r   )r(   r:   )r   r:   r   ))r   )r(   )r:   Nr   )r,   r   RandomStaterandr   asfortranarrayascontiguousarrayr   endswithrH   r   extendr    )r#   r   r   r   XYr*   X_resY_resr   r   r$   r$   r%   test_fft_with_orderi  s,   r   )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 )TestFFTThreadSafer;   )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   rD   )r   r   r   r$   r%   r     s    z2TestFFTThreadSafe._test_mtsame.<locals>.<listcomp>c                 S      g | ]}|  qS r$   )startr   r3   r$   r$   r%   r         c                 S   r   r$   )joinr   r$   r$   r%   r     r      )timeoutz6Function returned wrong value in multithreaded context)err_msg)queueQueuerH   threadsr
   get)rA   r!   r"   r   expectedtrD   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 NrO   r   )onesinput_shaper   r   r   rA   r"   r   r$   r$   r%   rT        zTestFFTThreadSafe.test_fftc                 C   $   | | jd}| jtj||d d S Ny      ?        r   )fullr   r   r   r   r   r$   r$   r%   r[        zTestFFTThreadSafe.test_ifftc                 C   "   | | j}| jtj||d d S Nr   )r   r   r   r   r   r   r$   r$   r%   rl        zTestFFTThreadSafe.test_rfftc                 C   r  r  )r  r   r   r   r   r   r$   r$   r%   rn     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%   r     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   rT   r[   rl   rn   r   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 )Nr:   c                 S   s   g | ]}t d qS )d   )r,   r   )r   _r$   r$   r%   r     s    z%test_multiprocess.<locals>.<listcomp>r   r	  )multiprocessingPoolmaprH   r,   r   r   )r!   presrS   r3   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)r:   r;   r       r9   )r   )r,   r   r?   r   r   )rA   r"   ar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numpyrU   rO   r:   )workers)
r   r   r   r   r   r   r   r?   rW   r    )r!   r"   r#   r3   r$   r$   r%   test_non_standard_params  s   
r  r   r   c                 C   s$   |j g dt||d}| | d S )NrU   rO   )r?   r   )r!   r#   r"   r3   r$   r$   r%   test_real_input  s   r  )5r   r   r  r  r,   r   numpy.randomr   numpy.testingr   r   r   rW   	scipy.fftr   scipy.conftestr   scipy._lib._array_apir   r   r	   r
   r   usefixtures
pytestmarkr   r&   r6   r7   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
