a
    h/F                  	   @   s  d dl Z d dlmZmZ d dl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 g dZeded f Zh d	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ddZ)e'eee eeeedddZ*eej+e daeee eeed!d"d#Z,eej-e dbeee eeed!d$d%Z.eej/e dceee eeed!d&d'Z0eej1e ddeee eeed!d(d)Z2eej3e deeee eeed!d*d+Z4eej5e dfeee eeed!d,d-Z6G d.d/ d/eZ7eee ee e7d0d1d2Z8ee ed3d4d5Z9e'ee%edf e%edf eeed6d7d8Z:eej;e dgeee ee eed9d:d;Z<eej=e dheee ee eed9d<d=Z>eej?e dieee ee eed9d>d?Z@eejAe djeee ee eed9d@dAZBG dBdC dCeZCe'eee ee eCdDdEdFZDeejEe dkeee ee eed9dGdHZFeejGe dleee ee eed9dIdJZHeejIe dmeee ee eed9dLdMZJeejKe dneee ee eed9dNdOZLeejMe doeee ee eed9dPdQZNeejOe dpeee ee eed9dRdSZPeejQe dqeee ee eed9dTdUZReejSe dreee ee eed9dVdWZTee eeUe dXdYdZZVeejWdseee ed[d\d]ZXeejYdteee ed[d^d_ZZdS )u    N)IterableSequence)Literal
NamedTupleOptional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ortho>   r#   r$   Nr"   )xnormsignal_numelr"   returnc                    sh   t  tv  fdd  dkr2| dt|  S | rH du 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)   =/var/www/auris/lib/python3.9/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    
r5   )dtyperequire_complexdevicer(   c                    sh    j r
 S  jst  tjtjg}|jdv }|r>|tj t	 |v  fdd |rdt
   S )z@Helper to promote a dtype to one supported by the FFT primitives)Zcudametac                      s
   d  S )NzUnsupported dtype r)   r)   r6   r)   r+   r,   J   r-   z#_promote_type_fft.<locals>.<lambda>)
is_complexZis_floating_pointr/   Zget_default_dtypefloat32float64typeappendfloat16r0   utilsZcorresponding_complex_dtype)r6   r7   r8   Zallowed_typesZmaybe_support_halfr)   r:   r+   _promote_type_fft:   s    

rB   F)tr7   r(   c                 C   s   | j }t||| j}t| |S )zEHelper to promote a tensor to a dtype supported by the FFT primitives)r6   rB   r8   r   )rC   r7   Zcur_typenew_typer)   r)   r+   _maybe_promote_tensor_fftR   s    rE   .)r%   dimssizesr(   c                 C   s   t |t |ksJ 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      Tr.   )lenshaperangeZnarrowr/   Zconstant_pad_nd)r%   rF   rG   Z	must_copyZx_sizesZ
pad_amountiZpad_idxr)   r)   r+   _resize_fft_input[   s    rN   )	func_nameinputndimr&   r"   r(   c                    s   t |dd}tj|j|ddf}|dur,|nd|j| d   t dk fdd	 |du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r7   FZwrap_scalarNrH   r.   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   rR   rW   r&   r'   r"   )rE   rA   canonicalize_dimndimrK   r/   r0   rN   conjprimsfft_c2rr5   )rO   rP   rQ   rR   r&   r"   rF   outputr)   rV   r+   _fft_c2ru   s    	

r`   )rO   rP   rQ   rR   r&   r"   onesidedr(   c           	         s   t jj fdd ttjj|ddf}|durD|nj|  t  dk fdd |du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)   rO   rP   r)   r+   r,      r-   z_fft_r2c.<locals>.<lambda>FrT   Nr.   c                      s   d  dS rU   r)   r)   dim_sizer)   r+   r,      r-   rR   ra   )r/   r0   r6   r;   rE   rA   rZ   r[   rK   rN   r]   fft_r2cr5   r\   )	rO   rP   rQ   rR   r&   r"   ra   rF   retr)   rd   rO   rP   r+   _fft_r2c   s    
ri   c                    s   t jjfdd tjj|ddf}|dur:|nj|  t  dk fdd |du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)   rb   r)   r+   r,      r-   z_fft_c2c.<locals>.<lambda>FrT   Nr.   c                      s   d  dS rU   r)   r)   rc   r)   r+   r,      r-   rR   r"   )r/   r0   r6   r;   rA   rZ   r[   rK   rN   r]   fft_c2cr5   )rO   rP   rQ   rR   r&   r"   rF   rg   r)   rh   r+   _fft_c2c   s    	rm   rI   )rP   rQ   rR   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"   ra   r6   r;   rm   ri   rP   rQ   rR   r&   r)   r)   r+   r      s    r   c              	   C   s6   | j jrtd| |||ddS td| |||dddS d S )Nr   Frn   ro   rp   rq   r)   r)   r+   r      s    r   c              	   C   s   t d| |||dddS )Nr   Tro   ri   rq   r)   r)   r+   r      s    r   c                 C   s   t d| |||ddS )Nr   Frn   r`   rq   r)   r)   r+   r      s    r   c                 C   s   t d| |||ddS )Nr   Trn   rs   rq   r)   r)   r+   r      s    r   c              	   C   s   t d| |||dddS )Nr   FTro   rr   rq   r)   r)   r+   r     s    r   c                   @   s.   e Zd ZU eedf ed< eedf ed< dS )_ShapeAndDims.rK   rF   N__name__
__module____qualname__tupleint__annotations__r)   r)   r)   r+   rt     s   
rt   )rP   rK   rR   r(   c                    sP  | j  | j|durTt|ts$|f}tj |dd}ttt	|t|kdd  |durt|tsl|f}t|du pt|t|kdd  t|t k fdd |du rt
t   }t
fdd	t||D }n6|du 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 optionalNFrT   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,   2  s   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   D  r-   r   c                      s   d  dS rU   r)   r)   )rQ   r)   r+   r,   G  r-   )rK   rF   )r[   rK   
isinstancer   rA   Zcanonicalize_dimsr/   r0   rJ   setry   rL   ziprt   )rP   rK   rR   Zret_dimsZ	ret_shaper)   )r|   r   rQ   r}   r+   $_canonicalize_fft_shape_and_dim_args  sB    




r   )xsr(   c                 C   s   d}| D ]}||9 }q|S )zCompute product of a listr.   r)   )r   prodr%   r)   r)   r+   _prodL  s    
r   )function_namerP   rK   rR   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 rj   r:   r)   r   rP   r)   r+   r,   _  s   z_fftn_c2c.<locals>.<lambda>rk   rY   )	r/   r0   r6   r;   rN   r]   rl   r5   r   )r   rP   rK   rR   r&   r"   r%   r_   r)   r   r+   	_fftn_c2cT  s    	r   )rP   r   rR   r&   r(   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrS   r   rn   r   rE   r   rP   r   rR   r&   rK   r%   r)   r)   r+   r   g  s    r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrS   r   Frn   r   r   r)   r)   r+   r   t  s    r   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)   rP   r)   r+   r,     r-   zrfftn.<locals>.<lambda>FrS   Tre   rY   )r/   r0   r6   r;   r   rE   rN   r]   rf   r5   r   )rP   r   rR   r&   rK   outr)   r   r+   r     s    
r   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-   FrS   rI   Tre   r.   rY   rk   )r/   r0   r6   r;   r   rJ   rE   rN   r]   rf   r5   r\   conj_physicalrl   r   )rP   r   rR   r&   rK   tmpr)   r   r+   r     s    


r   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.rK   rR   rW   Nru   r)   r)   r)   r+   r     s   
r   )fnamerP   r   rR   r(   c                    s   t |||\}}tt|dk fdd |du 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   r.   c                      s   d  dS rU   r)   r)   rV   r)   r+   r,     r-   )rK   rR   rW   )r   r/   r0   rJ   rK   listr   ry   )r   rP   r   rR   rK   Z
shape_listr)   )r   rW   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   TrS   rX   c                 3   s   | ]} j | V  qd S r   rK   r   r   r)   r+   r     r-   zirfftn.<locals>.<genexpr>Frn   )r   rE   rN   r]   r^   r5   r   )rP   r   rR   r&   rK   rW   r)   r   r+   r     s    
r   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   TrS   r.   rI   rk   rn   rX   )
r   rE   rN   rJ   r]   rl   r5   r   r   r^   )rP   r   rR   r&   rK   rW   r   r   r)   r)   r+   r     s    
(
r   rI   c                 C   s   t jj| |||dS N)r   rR   r&   )r/   r   r   rP   r   rR   r&   r)   r)   r+   r     s    r   c                 C   s   t jj| |||dS r   )r/   r   r   r   r)   r)   r+   r     s    r   c                 C   s   t jj| |||dS r   )r/   r   r   r   r)   r)   r+   r     s    r   c                 C   s   t jj| |||dS r   )r/   r   r   r   r)   r)   r+   r     s    r   c                 C   s   t jj| |||dS r   )r/   r   r   r   r)   r)   r+   r   $  s    r   c                 C   s   t jj| |||dS r   )r/   r   r   r   r)   r)   r+   r   /  s    r   )rR   r%   r(   c                 C   s2   | du 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   rL   r[   r   r   )rR   r%   r)   r)   r+   _default_alldims:  s
    
r   )rP   rR   r(   c                    s*   t | } fdd|D }t ||S )Nc                    s   g | ]} j | d  qS )rH   r   r   r   r)   r+   
<listcomp>G  r-   zfftshift.<locals>.<listcomp>r   r/   ZrollrP   rR   rF   shiftr)   r   r+   r    D  s    
r    c                    s*   t | } fdd|D }t ||S )Nc                    s   g | ]} j | d  d qS )r.   rH   r   r   r   r)   r+   r   N  r-   zifftshift.<locals>.<listcomp>r   r   r)   r   r+   r!   K  s    
r!   )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)[r2   collections.abcr   r   typingr   r   r   r   r/   Ztorch._primsZ_primsr]   Ztorch._prims_commonZ_prims_commonrA   Ztorch._decompr   r	   r
   r   Ztorch._prims_common.wrappersr   r   __all__ZNormTyper1   Z_opsopsZatenrz   boolr5   r6   r8   rB   rE   ry   rN   strr`   ri   rm   Zfft_fftr   Zfft_ifftr   Zfft_rfftr   Z	fft_irfftr   Zfft_hfftr   Z	fft_ihfftr   rt   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   r   Zfft_fftshiftr    Zfft_ifftshiftr!   r)   r)   r)   r+   <module>   sH  

 
         	   	   	   	8	

                     	   	   	   	   	   	
