U
    yh!F                     @   s  d dl Z d dlmZmZmZmZmZmZmZm	Z	 d dl
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 d dlmZmZ dddd	d
dddddddddddddddgZe	ded f ZddddhZe
jjjZeeee eddd Z!e
j"e e
j#e
j"d!d"d#Z$d`ee ed%d&d'Z%eeed(f eed(f ed)d*d+Z&e'eee eee ed,d-d.Z(e'eee eee e ed/d0d1Z)e'eee eee ed,d2d3Z*eej+e daeee eeed5d6dZ,eej-e dbeee eeed5d7dZ.eej/e dceee eeed5d8dZ0eej1e ddeee eeed5d9dZ2eej3e deeee eeed5d:d	Z4eej5e dfeee eeed5d;dZ6G d<d= d=eZ7eee ee e7d>d?d@Z8ee edAdBdCZ9e'eeed(f eed(f ee edDdEdFZ:eej;e dgeee ee eedGdHdZ<eej=e dheee ee eedGdIdZ>eej?e dieee ee eedGdJdZ@eejAe djeee ee eedGdKdZBG dLdM dMeZCe'eee ee eCdNdOdPZDeejEe dkeee ee eedGdQdZFeejGe dleee ee eedGdRdZHeejIe dmeee ee eedGdTdZJeejKe dneee ee eedGdUdZLeejMe doeee ee eedGdVdZNeejOe dpeee ee eedGdWdZPeejQe dqeee ee eedGdXd
ZReejSe dreee ee eedGdYdZTee eee dZd[d\ZUeejVdseee ed]d^dZWeejXdteee ed]d_dZYdS )u    N)IterableListLiteral
NamedTupleOptionalSequenceTupleUnion)register_decomposition)DimsType	ShapeTypeTensorLikeType)_maybe_convert_to_dtypeout_wrapperfftfft2fftnhffthfft2hfftnrfftrfft2rfftnifftifft2ifftnihfftihfft2ihfftnirfftirfft2irfftnfftshift	ifftshift)forwardbackwardorthor$   r%   r&   )xnormsignal_numelr$   returnc                    sh   t  tk fdd  dkr2| dt|  S | rH dkpR dkpR|oR dk}|rd| d|  S | S )z3Apply normalization to the un-normalized FFT resultc                      s
   d  S )NzInvalid normalization mode:  r+   r(   r+   A/var/www/html/venv/lib/python3.8/site-packages/torch/_refs/fft.py<lambda>.       z_apply_norm.<locals>.<lambda>r&      Nr%   r$   )torch_check_NORM_VALUESmathsqrt)r'   r(   r)   r$   	normalizer+   r,   r-   _apply_norm*   s    
r7   )dtyperequire_complexdevicer*   c                    sh    j r
 S  jst  tjtjg}|jdk}|r>|tj t	 |k fdd |rdt
   S )z@Helper to promote a dtype to one supported by the FFT primitives)cudametac                      s
   d  S )NzUnsupported dtype r+   r+   r8   r+   r-   r.   I   r/   z#_promote_type_fft.<locals>.<lambda>)
is_complexZis_floating_pointr1   Zget_default_dtypeZfloat32Zfloat64typeappendZfloat16r2   utilsZcorresponding_complex_dtype)r8   r9   r:   Zallowed_typesZmaybe_support_halfr+   r=   r-   _promote_type_fft9   s    

rB   F)tr9   r*   c                 C   s   | j }t||| j}t| |S )zEHelper to promote a tensor to a dtype supported by the FFT primitives)r8   rB   r:   r   )rC   r9   Zcur_typenew_typer+   r+   r-   _maybe_promote_tensor_fftQ   s    rE   .)r'   dimssizesr*   c                 C   s   t |t |kstd}| j}dgt | d }tt |D ]}|| dkrNq<|||  || k rd}t |d||   d }|| |||   ||< |||  || kr<| || d|| } q<|rt| |S | S )z
    Fixes the shape of x such that x.size(dims[i]) == sizes[i],
    either by zero-padding, or by slicing x starting from 0.
    Fr      Tr0   )lenAssertionErrorshaperangeZnarrowr1   Zconstant_pad_nd)r'   rF   rG   Z	must_copyZx_sizesZ
pad_amountiZpad_idxr+   r+   r-   _resize_fft_inputZ   s    rO   )	func_nameinputndimr(   r$   r*   c                    s   t |dd}tj|j|ddf}|dk	r,|nd|j| d   t dk fdd	 |dk	rvt|| d d fd
}|rt|}t	j
|| d}t|| |dS )zBCommon code for performing any complex to real FFT (irfft or hfft)Tr9   FZwrap_scalarNrH   r0   c                      s   d  dS NzInvalid number of data points (z) specifiedr+   r+   last_dim_sizer+   r-   r.      r/   z_fft_c2r.<locals>.<lambda>)rF   rG   rS   rX   r(   r)   r$   )rE   rA   canonicalize_dimndimrL   r1   r2   rO   conjprimsfft_c2rr7   )rP   rQ   rR   rS   r(   r$   rF   outputr+   rW   r-   _fft_c2rt   s    	

ra   )rP   rQ   rR   rS   r(   r$   onesidedr*   c           	         s   t jj fdd ttjj|ddf}|dk	rD|nj|  t  dk fdd |dk	r|t	||ft
j||d}t|| |}|r|S t |S )	zBCommon code for performing any real to complex FFT (rfft or ihfft)c                      s     dj  S )Nz0 expects a floating point input tensor, but got r=   r+   rP   rQ   r+   r-   r.      r/   z_fft_r2c.<locals>.<lambda>FrU   Nr0   c                      s   d  dS rV   r+   r+   dim_sizer+   r-   r.      r/   rS   rb   )r1   r2   r8   r>   rE   rA   r[   r\   rL   rO   r^   fft_r2cr7   r]   )	rP   rQ   rR   rS   r(   r$   rb   rF   retr+   re   rP   rQ   r-   _fft_r2c   s     
 
rj   c                    s   t jjfdd tjj|ddf}|dk	r:|nj|  t  dk fdd |dk	rrt||ft	j
||d}t|| |S )	zCCommon code for performing any complex to complex FFT (fft or ifft)c                      s     dj  S Nz) expects a complex input tensor, but got r=   r+   rc   r+   r-   r.      r/   z_fft_c2c.<locals>.<lambda>FrU   Nr0   c                      s   d  dS rV   r+   r+   rd   r+   r-   r.      r/   rS   r$   )r1   r2   r8   r>   rA   r[   r\   rL   rO   r^   fft_c2cr7   )rP   rQ   rR   rS   r(   r$   rF   rh   r+   ri   r-   _fft_c2c   s    	 
rn   rI   )rQ   rR   rS   r(   r*   c              	   C   s6   | j jrtd| |||ddS td| |||dddS d S )Nr   Tr$   Fr$   rb   r8   r>   rn   rj   rQ   rR   rS   r(   r+   r+   r-   r      s    c              	   C   s6   | j jrtd| |||ddS td| |||dddS d S )Nr   Fro   rp   rq   rr   r+   r+   r-   r      s    c              	   C   s   t d| |||dddS )Nr   Trp   rj   rr   r+   r+   r-   r      s    c                 C   s   t d| |||ddS )Nr   Fro   ra   rr   r+   r+   r-   r      s    c                 C   s   t d| |||ddS )Nr   Tro   rt   rr   r+   r+   r-   r      s    c              	   C   s   t d| |||dddS )Nr   FTrp   rs   rr   r+   r+   r-   r     s    c                   @   s.   e Zd ZU eedf ed< eedf ed< dS )_ShapeAndDims.rL   rF   N__name__
__module____qualname__r   int__annotations__r+   r+   r+   r-   ru     s   
ru   )rQ   rL   rS   r*   c                    sP  | j  | j|dk	rTt|ts$|f}tj |dd}ttt	|t|kdd  |dk	rt|tsl|f}t|dkpt|t|kdd  t|t k fdd |dkrt
t   }t
fdd	t||D }n6|dkr
t
t }t
}nt
fd
d	|D }|D ]tdkfdd q$t||dS )zTConvert the shape and dim arguments into a canonical form where neither are optionalNFrU   c                   S   s   dS )NzFFT dims must be uniquer+   r+   r+   r+   r-   r.   !  r/   z6_canonicalize_fft_shape_and_dim_args.<locals>.<lambda>c                   S   s   dS )Nz=When given, dim and shape arguments must have the same lengthr+   r+   r+   r+   r-   r.   +  r/   c                      s   d d  dS )NzGot shape with z" values but input tensor only has z dimensions.r+   r+   )	input_dimtransform_ndimr+   r-   r.   1  r/   c                 3   s&   | ]\}}|d kr|n | V  qdS )rI   Nr+   ).0sdinput_sizesr+   r-   	<genexpr>:  s    z7_canonicalize_fft_shape_and_dim_args.<locals>.<genexpr>c                 3   s   | ]} | V  qd S Nr+   r~   r   r   r+   r-   r   C  s     r   c                      s   d  dS rV   r+   r+   )rR   r+   r-   r.   F  r/   )rL   rF   )r\   rL   
isinstancer   rA   Zcanonicalize_dimsr1   r2   rJ   settuplerM   zipru   )rQ   rL   rS   Zret_dimsZ	ret_shaper+   )r|   r   rR   r}   r-   $_canonicalize_fft_shape_and_dim_args  sD    
 



r   )xsr*   c                 C   s   d}| D ]}||9 }q|S )zCompute product of a listr0   r+   )r   prodr'   r+   r+   r-   _prodK  s    
r   )function_namerQ   rL   rS   r(   r$   r*   c                    sJ   t jj fdd t||}tj|||d}t||t||dS )zECommon code for n-dimensional complex to complex FFTs (fftn or ifftn)c                      s     dj  S rk   r=   r+   r   rQ   r+   r-   r.   ^  r/   z_fftn_c2c.<locals>.<lambda>rl   rZ   )	r1   r2   r8   r>   rO   r^   rm   r7   r   )r   rQ   rL   rS   r(   r$   r'   r`   r+   r   r-   	_fftn_c2cS  s    	r   )rQ   r   rS   r(   r*   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrT   r   ro   r   rE   r   rQ   r   rS   r(   rL   r'   r+   r+   r-   r   f  s    c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrT   r   Fro   r   r   r+   r+   r-   r   s  s    c                    sf   t  jj  fdd t ||\}}t dd t || tj |dd}t	||t
|ddS )Nc                      s   d j  S )Nz2rfftn expects a real-valued input tensor, but got r=   r+   rQ   r+   r-   r.     r/   zrfftn.<locals>.<lambda>FrT   Trf   rZ   )r1   r2   r8   r>   r   rE   rO   r^   rg   r7   r   )rQ   r   rS   r(   rL   outr+   r   r-   r     s    
c                    s   t  jj  fdd t ||\}}t t|dkdd  t dd t || tj	 |dd  dd	}t|d
krt
|||d dd}t|S t|}tj||d d dd}t
||t|ddS )Nc                      s   d j  S )Nz3ihfftn expects a real-valued input tensor, but got r=   r+   r   r+   r-   r.     r/   zihfftn.<locals>.<lambda>r   c                   S   s   dS )Nz'ihfftn must transform at least one axisr+   r+   r+   r+   r-   r.     r/   FrT   rI   Trf   r0   rZ   rl   )r1   r2   r8   r>   r   rJ   rE   rO   r^   rg   r7   r]   conj_physicalrm   r   )rQ   r   rS   r(   rL   tmpr+   r   r-   r     s    


c                   @   s6   e Zd ZU eedf ed< eedf ed< eed< dS )_CanonicalizeC2rReturn.rL   rS   rX   Nrv   r+   r+   r+   r-   r     s   
r   )fnamerQ   r   rS   r*   c                    s   t |||\}}tt|dk fdd |dks@|d dkrXd|j|d  d  n|d tdkfdd t|}d d |d< tt||d	S )
zCanonicalize shape and dim arguments for n-dimensional c2r transforms,
    as well as calculating the last_dim_size which is shape[dim[-1]] for the outputr   c                      s
     dS )Nz! must transform at least one axisr+   r+   )r   r+   r-   r.     r/   z:_canonicalize_fft_c2r_shape_and_dim_args.<locals>.<lambda>NrI   rH   r0   c                      s   d  dS rV   r+   r+   rW   r+   r-   r.     r/   )rL   rS   rX   )r   r1   r2   rJ   rL   listr   r   )r   rQ   r   rS   rL   Z
shape_listr+   )r   rX   r-   (_canonicalize_fft_c2r_shape_and_dim_args  s     
  r   c                    s^   t d| ||\}}}t| dd} t| ||} tj| ||d t |t fdd|D ddS )	Nr!   TrT   rY   c                 3   s   | ]} j | V  qd S r   rL   r   r   r+   r-   r     s     zirfftn.<locals>.<genexpr>Fro   )r   rE   rO   r^   r_   r7   r   )rQ   r   rS   r(   rL   rX   r+   r   r-   r!     s       
c                 C   s   t d| ||\}}}t| dd} t| ||} t|dkrPtj| |d d ddn| }t||t|d d dd}t|}tj	||dd  |d}t|||ddS )	Nr   TrT   r0   rI   rl   ro   rY   )
r   rE   rO   rJ   r^   rm   r7   r   r   r_   )rQ   r   rS   r(   rL   rX   r   r   r+   r+   r-   r     s       
(
rI   c                 C   s   t jj| |||dS N)r   rS   r(   )r1   r   r   rQ   r   rS   r(   r+   r+   r-   r     s    c                 C   s   t jj| |||dS r   )r1   r   r   r   r+   r+   r-   r     s    c                 C   s   t jj| |||dS r   )r1   r   r   r   r+   r+   r-   r     s    c                 C   s   t jj| |||dS r   )r1   r   r!   r   r+   r+   r-   r      s    c                 C   s   t jj| |||dS r   )r1   r   r   r   r+   r+   r-   r   #  s    c                 C   s   t jj| |||dS r   )r1   r   r   r   r+   r+   r-   r   .  s    )rS   r'   r*   c                 C   s2   | dkrt t|jS t| ts&| gS t | S dS )zIConvert Optional[DimsType] to a simple list, defaulting to all dimensionsN)r   rM   r\   r   r   )rS   r'   r+   r+   r-   _default_alldims9  s
    
r   )rQ   rS   r*   c                    s*   t | } fdd|D }t ||S )Nc                    s   g | ]} j | d  qS )rH   r   r   r   r+   r-   
<listcomp>F  s     zfftshift.<locals>.<listcomp>r   r1   ZrollrQ   rS   rF   shiftr+   r   r-   r"   C  s    
c                    s*   t | } fdd|D }t ||S )Nc                    s   g | ]} j | d  d qS )r0   rH   r   r   r   r+   r-   r   M  s     zifftshift.<locals>.<listcomp>r   r   r+   r   r-   r#   J  s    
)F)NrI   N)NrI   N)NrI   N)NrI   N)NrI   N)NrI   N)NNN)NNN)NNN)NNN)NNN)NNN)Nr   N)Nr   N)Nr   N)Nr   N)Nr   N)Nr   N)N)N)Zr4   typingr   r   r   r   r   r   r   r	   r1   Ztorch._primsZ_primsr^   Ztorch._prims_commonZ_prims_commonrA   Ztorch._decompr
   r   r   r   Ztorch._prims_common.wrappersr   r   __all__ZNormTyper3   Z_opsZopsZatenrz   boolr7   r8   r:   rB   rE   rO   strra   rj   rn   Zfft_fftr   Zfft_ifftr   Zfft_rfftr   Z	fft_irfftr   Zfft_hfftr   Z	fft_ihfftr   ru   r   r   r   Zfft_fftnr   Z	fft_ifftnr   Z	fft_rfftnr   Z
fft_ihfftnr   r   r   Z
fft_irfftnr!   Z	fft_hfftnr   Zfft_fft2r   Z	fft_ifft2r   Z	fft_rfft2r   Z
fft_irfft2r    Z	fft_hfft2r   Z
fft_ihfft2r   r   Zfft_fftshiftr"   Zfft_ifftshiftr#   r+   r+   r+   r-   <module>   s  (
       
 
 
         	   	   	   	  8	

                     	   	   	   	   	   	
