U
    Kc:C                     @   s.  d dl Z d dlmZmZmZmZmZmZmZ d dl	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mZ d dl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 e
d e
d f ZddddhZeeeeeddd Zej e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(j)j*e daeee eeed5d6dZ+eej(j)j,e dbeee eeed5d7dZ-eej(j)j.e dceee eeed5d8dZ/eej(j)j0e ddeee eeed5d9dZ1eej(j)j2e deeee eeed5d:d
Z3eej(j)j4e dfeee eeed5d;dZ5G d<d= d=eZ6eee ee e6d>d?d@Z7ee edAdBdCZ8e$eeed(f eed(f eeedDdEdFZ9eej(j)j:e dgeee ee eedGdHd	Z;eej(j)j<e dheee ee eedGdIdZ=eej(j)j>e dieee ee eedGdJdZ?eej(j)j@e djeee ee eedGdKdZAG dLdM dMeZBe$eee ee eBdNdOdPZCeej(j)jDe dkeee ee eedGdQdZEeej(j)jFe dleee ee eedGdRdZGeej(j)jHe dmeee ee eedGdTdZIeej(j)jJe dneee ee eedGdUdZKeej(j)jLe doeee ee eedGdVdZMeej(j)jNe dpeee ee eedGdWdZOeej(j)jPe dqeee ee eedGdXdZQeej(j)jRe dreee ee eedGdYdZSee eee dZd[d\ZTeej(j)jUdseee ed]d^dZVeej(j)jWdteee ed]d_dZXdS )u    N)IterableList
NamedTupleOptionalSequenceTupleUnion)Literal)register_decomposition)checkDimsType	ShapeTypeTensorLikeType)out_wrapperfftfft2fftnhffthfft2hfftnrfftrfft2rfftnifftifft2ifftnihfftihfft2ihfftnirfftirfft2irfftnfftshift	ifftshiftforwardbackwardortho)xnormsignal_numelr$   returnc                    sf   t  tk fdd  dkr0| dt|  S | rF dkpP dkpP|oP dk}|rb| d|  S | S )z3Apply normalization to the un-normalized FFT resultc                      s
   d  S )NzInvalid normalization mode:  r+   r(   r+   3/tmp/pip-unpacked-wheel-gikjz4vx/torch/_refs/fft.py<lambda>/       z_apply_norm.<locals>.<lambda>r&      Nr%   r$   )r   _NORM_VALUESmathsqrt)r'   r(   r)   r$   	normalizer+   r,   r-   _apply_norm+   s    
r5   )dtyperequire_complexr*   c                 C   s*   | j r
| S | jst } |r&t| } | S )z@Helper to promote a dtype to one supported by the FFT primitives)
is_complexZis_floating_pointtorchZget_default_dtypeutilsZcorresponding_complex_dtype)r6   r7   r+   r+   r-   _promote_type_fft:   s    
r;   F)tr7   r*   c                 C   s(   | j }t||}||kr| S t| |S )zEHelper to promote a tensor to a dtype supported by the FFT primitives)r6   r;   primsZconvert_element_type)r<   r7   Zcur_typenew_typer+   r+   r-   _maybe_promote_tensor_fftI   s
    
r?   .)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narrowr9   Zconstant_pad_nd)r'   r@   rA   Z	must_copyZx_sizesZ
pad_amountiZpad_idxr+   r+   r-   _resize_fft_inputT   s    rI   )	func_nameinputndimr(   r$   r*   c           	         s   t |dd}t|j|f} dk	r( nd|j| d  }t|dk fdd  dk	rpt|||d d fd}|r~t|}t	j
|||d	}t||||d
S )zBCommon code for performing any complex to real FFT (irfft or hfft)Tr7   NrB   r0   c                      s   d  dS NzInvalid number of data points (z) specifiedr+   r+   rL   r+   r-   r.   z   r/   z_fft_c2r.<locals>.<lambda>)r@   rA   rM   last_dim_sizer(   r)   r$   )r?   r:   canonicalize_dimndimrF   r   rI   r9   conjr=   fft_c2rr5   )	rJ   rK   rL   rM   r(   r$   r@   rR   outputr+   rP   r-   _fft_c2rn   s    	
rY   )rJ   rK   rL   rM   r(   r$   onesidedr*   c           	         s~   t jj  fdd ttj|f}|dk	rHt||ftj	||d}t
||j| |}|rt|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 r6   r+   rJ   rK   r+   r-   r.      r/   z_fft_r2c.<locals>.<lambda>NrM   rZ   )r   r6   r8   r?   r:   rT   rU   rI   r=   fft_r2cr5   rF   r9   rV   )	rJ   rK   rL   rM   r(   r$   rZ   r@   retr+   r\   r-   _fft_r2c   s    
r`   c                    sb   t jj fdd tj|f}|dk	r>t||ftj||d}t	||j
| |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+   r\   r+   r-   r.      r/   z_fft_c2c.<locals>.<lambda>NrM   r$   )r   r6   r8   r:   rT   rU   rI   r=   fft_c2cr5   rF   )rJ   rK   rL   rM   r(   r$   r@   r_   r+   r\   r-   _fft_c2c   s    	rd   rC   )rK   rL   rM   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$   rZ   r6   r8   rd   r`   rK   rL   rM   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   Fre   rf   rg   rh   r+   r+   r-   r      s    c              	   C   s   t d| |||dddS )Nr   Trf   r`   rh   r+   r+   r-   r      s    c                 C   s   t d| |||ddS )Nr   Fre   rY   rh   r+   r+   r-   r      s    c                 C   s   t d| |||ddS )Nr   Tre   rj   rh   r+   r+   r-   r      s    c              	   C   s   t d| |||dddS )Nr   FTrf   ri   rh   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.rF   r@   N__name__
__module____qualname__r   int__annotations__r+   r+   r+   r-   rk      s   
rk   )rK   rF   rM   r*   c                    sB  | j  | j|dk	rNt|ts$|f}t |}ttt|t|kdd  |dk	rt|tsf|f}t|dkp~t|t|kdd  t|t k fdd |dkrt	t
   }t	fddt||D }n4|dkrt	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 optionalNc                   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.     r/   c                 3   s&   | ]\}}|d kr|n | V  qdS )rC   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+   rt   rv   rw   r+   r-   ry   0  s     r   c                      s   d  dS rO   r+   r+   rP   r+   r-   r.   3  r/   )rF   r@   )rU   rF   
isinstancer   r:   Zcanonicalize_dimsr   rD   settuplerG   ziprk   )rK   rF   rM   Zret_dimsZ	ret_shaper+   )rr   rx   rL   rs   r-   $_canonicalize_fft_shape_and_dim_args  s>    



r   )xsr*   c                 C   s   d}| D ]}||9 }q|S )zCompute product of a listr0   r+   )r   prodr'   r+   r+   r-   _prod8  s    
r   )function_namerK   rF   rM   r(   r$   r*   c                    sH   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 ra   r[   r+   r   rK   r+   r-   r.   K  r/   z_fftn_c2c.<locals>.<lambda>rb   rS   )r   r6   r8   rI   r=   rc   r5   r   )r   rK   rF   rM   r(   r$   r'   rX   r+   r   r-   	_fftn_c2c@  s    	r   )rK   ru   rM   r(   r*   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrN   r   re   r   r?   r   rK   ru   rM   r(   rF   r'   r+   r+   r-   r   S  s    c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrN   r   Fre   r   r   r+   r+   r-   r   `  s    c                    sd   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+   rK   r+   r-   r.   w  r/   zrfftn.<locals>.<lambda>FrN   Tr]   rS   )
r   r6   r8   r   r?   rI   r=   r^   r5   r   )rK   ru   rM   r(   rF   outr+   r   r-   r   m  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/   FrN   rC   Tr]   r0   rS   rb   )r   r6   r8   r   rD   r?   rI   r=   r^   r5   rV   conj_physicalrc   r   )rK   ru   rM   r(   rF   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.rF   rM   rR   Nrl   r+   r+   r+   r-   r     s   
r   )fnamerK   ru   rM   r*   c                    s   t |||\}}tt|dk fdd |dks>|d dkrVd|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>NrC   rB   r0   c                      s   d  dS rO   r+   r+   )rR   r+   r-   r.     r/   )rF   rM   rR   )r   r   rD   rF   listr   r~   )r   rK   ru   rM   rF   Z
shape_listr+   )r   rR   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!   TrN   rQ   c                 3   s   | ]} j | V  qd S rz   rF   r{   r   r+   r-   ry     s     zirfftn.<locals>.<genexpr>Fre   )r   r?   rI   r=   rW   r5   r   )rK   ru   rM   r(   rF   rR   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   TrN   r0   rC   rb   re   rQ   )
r   r?   rI   rD   r=   rc   r5   r   r   rW   )rK   ru   rM   r(   rF   rR   r   r   r+   r+   r-   r     s       
(
rC   c                 C   s   t jj| |||dS N)ru   rM   r(   )r9   r   r   rK   ru   rM   r(   r+   r+   r-   r     s    c                 C   s   t jj| |||dS r   )r9   r   r   r   r+   r+   r-   r     s    c                 C   s   t jj| |||dS r   )r9   r   r   r   r+   r+   r-   r     s    c                 C   s   t jj| |||dS r   )r9   r   r!   r   r+   r+   r-   r      s    c                 C   s   t jj| |||dS r   )r9   r   r   r   r+   r+   r-   r     s    c                 C   s   t jj| |||dS r   )r9   r   r   r   r+   r+   r-   r     s    )rM   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   rG   rU   r|   r   )rM   r'   r+   r+   r-   _default_alldims&  s
    
r   )rK   rM   r*   c                    s*   t | } fdd|D }t ||S )Nc                    s   g | ]} j | d  qS )rB   r   r{   r   r+   r-   
<listcomp>3  s     zfftshift.<locals>.<listcomp>r   r9   ZrollrK   rM   r@   shiftr+   r   r-   r"   0  s    
c                    s*   t | } fdd|D }t ||S )Nc                    s   g | ]} j | d  d qS )r0   rB   r   r{   r   r+   r-   r   :  s     zifftshift.<locals>.<listcomp>r   r   r+   r   r-   r#   7  s    
)F)NrC   N)NrC   N)NrC   N)NrC   N)NrC   N)NrC   N)NNN)NNN)NNN)NNN)NNN)NNN)Nr   N)Nr   N)Nr   N)Nr   N)Nr   N)Nr   N)N)N)Yr2   typingr   r   r   r   r   r   r   Ztyping_extensionsr	   r9   Ztorch._primsZ_primsr=   Ztorch._prims_commonZ_prims_commonr:   Ztorch._decompr
   r   r   r   r   Ztorch._prims_common.wrappersr   __all__ZNormTyper1   rp   boolr5   r6   r;   r?   rI   strrY   r`   rd   opsZatenZfft_fftr   Zfft_ifftr   Zfft_rfftr   Z	fft_irfftr   Zfft_hfftr   Z	fft_ihfftr   rk   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>   sz  $      
 
         	   	   	   	  6	

                     	   	   	   	   	   	
