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$   r"   N)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)   K/var/www/html/assistant/venv/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)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_dtypeZfloat32Zfloat64typeappendZfloat16r0   utilsZcorresponding_complex_dtype)r6   r7   r8   Zallowed_typesZmaybe_support_halfr)   r;   r+   _promote_type_fft:   s    

r@   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   r@   r8   r   )rA   r7   Zcur_typenew_typer)   r)   r+   _maybe_promote_tensor_fftR   s    rC   .)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%   rD   rE   Z	must_copyZx_sizesZ
pad_amountiZpad_idxr)   r)   r+   _resize_fft_input[   s    rL   )	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_scalarNrF   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>)rD   rE   rP   rU   r&   r'   r"   )rC   r?   canonicalize_dimndimrI   r/   r0   rL   conjprimsfft_c2rr5   )rM   rN   rO   rP   r&   r"   rD   outputr)   rT   r+   _fft_c2ru   s    	

r^   )rM   rN   rO   rP   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)   rM   rN   r)   r+   r,      r-   z_fft_r2c.<locals>.<lambda>FrR   Nr.   c                      s   d  dS rS   r)   r)   dim_sizer)   r+   r,      r-   rP   r_   )r/   r0   r6   r<   rC   r?   rX   rY   rI   rL   r[   fft_r2cr5   rZ   )	rM   rN   rO   rP   r&   r"   r_   rD   retr)   rb   rM   rN   r+   _fft_r2c   s    
rg   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)   r`   r)   r+   r,      r-   z_fft_c2c.<locals>.<lambda>FrR   Nr.   c                      s   d  dS rS   r)   r)   ra   r)   r+   r,      r-   rP   r"   )r/   r0   r6   r<   r?   rX   rY   rI   rL   r[   fft_c2cr5   )rM   rN   rO   rP   r&   r"   rD   re   r)   rf   r+   _fft_c2c   s    	rk   rG   )rN   rO   rP   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"   r_   r6   r<   rk   rg   rN   rO   rP   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   Frl   rm   rn   ro   r)   r)   r+   r      s    r   c              	   C   s   t d| |||dddS )Nr   Trm   rg   ro   r)   r)   r+   r      s    r   c                 C   s   t d| |||ddS )Nr   Frl   r^   ro   r)   r)   r+   r      s    r   c                 C   s   t d| |||ddS )Nr   Trl   rq   ro   r)   r)   r+   r      s    r   c              	   C   s   t d| |||dddS )Nr   FTrm   rp   ro   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.rI   rD   N__name__
__module____qualname__tupleint__annotations__r)   r)   r)   r+   rr     s   
rr   )rN   rI   rP   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 optionalNFrR   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 )rG   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 rS   r)   r)   )rO   r)   r+   r,   G  r-   )rI   rD   )rY   rI   
isinstancer   r?   Zcanonicalize_dimsr/   r0   rH   setrw   rJ   ziprr   )rN   rI   rP   Zret_dimsZ	ret_shaper)   )rz   r   rO   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_namerN   rI   rP   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 rh   r;   r)   r   rN   r)   r+   r,   _  s   z_fftn_c2c.<locals>.<lambda>ri   rW   )	r/   r0   r6   r<   rL   r[   rj   r5   r   )r   rN   rI   rP   r&   r"   r%   r]   r)   r   r+   	_fftn_c2cT  s    	r   )rN   r}   rP   r&   r(   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrQ   r   rl   r   rC   r   rN   r}   rP   r&   rI   r%   r)   r)   r+   r   g  s    r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrQ   r   Frl   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)   rN   r)   r+   r,     r-   zrfftn.<locals>.<lambda>FrQ   Trc   rW   )r/   r0   r6   r<   r   rC   rL   r[   rd   r5   r   )rN   r}   rP   r&   rI   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-   FrQ   rG   Trc   r.   rW   ri   )r/   r0   r6   r<   r   rH   rC   rL   r[   rd   r5   rZ   conj_physicalrj   r   )rN   r}   rP   r&   rI   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.rI   rP   rU   Nrs   r)   r)   r)   r+   r     s   
r   )fnamerN   r}   rP   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>NrG   rF   r.   c                      s   d  dS rS   r)   r)   rT   r)   r+   r,     r-   )rI   rP   rU   )r   r/   r0   rH   rI   listr   rw   )r   rN   r}   rP   rI   Z
shape_listr)   )r   rU   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   TrQ   rV   c                 3   s   | ]} j | V  qd S r   rI   r   r   r)   r+   r     r-   zirfftn.<locals>.<genexpr>Frl   )r   rC   rL   r[   r\   r5   r   )rN   r}   rP   r&   rI   rU   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   TrQ   r.   rG   ri   rl   rV   )
r   rC   rL   rH   r[   rj   r5   r   r   r\   )rN   r}   rP   r&   rI   rU   r   r   r)   r)   r+   r     s    
(
r   rG   c                 C   s   t jj| |||dS N)r}   rP   r&   )r/   r   r   rN   r}   rP   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   )rP   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   rJ   rY   r   r   )rP   r%   r)   r)   r+   _default_alldims:  s
    
r   )rN   rP   r(   c                    s*   t | } fdd|D }t ||S )Nc                    s   g | ]} j | d  qS )rF   r   r   r   r)   r+   
<listcomp>G  r-   zfftshift.<locals>.<listcomp>r   r/   ZrollrN   rP   rD   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.   rF   r   r   r   r)   r+   r   N  r-   zifftshift.<locals>.<listcomp>r   r   r)   r   r+   r!   K  s    
r!   )F)NrG   N)NrG   N)NrG   N)NrG   N)NrG   N)NrG   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_commonr?   Ztorch._decompr   r	   r
   r   Ztorch._prims_common.wrappersr   r   __all__ZNormTyper1   Z_opsopsZatenrx   boolr5   r6   r8   r@   rC   rw   rL   strr^   rg   rk   Zfft_fftr   Zfft_ifftr   Zfft_rfftr   Z	fft_irfftr   Zfft_hfftr   Z	fft_ihfftr   rr   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	

                     	   	   	   	   	   	
