o
    Zh/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d
ededededef
ddZ de	j!dede	j"de	j!fddZ#	dgdededefddZ$d
ede%edf de%edf defddZ&de'd ed!ee d"edededefd#d$Z(de'd ed!ee d"ededed%edefd&d'Z)de'd ed!ee d"edededefd(d)Z*eej+e 		*	dhd ed!ee d"ededef
d+d,Z,eej-e 		*	dhd ed!ee d"ededef
d-d.Z.eej/e 		*	dhd ed!ee d"ededef
d/d0Z0eej1e 		*	dhd ed!ee d"ededef
d1d2Z2eej3e 		*	dhd ed!ee d"ededef
d3d4Z4eej5e 		*	dhd ed!ee d"ededef
d5d6Z6G d7d8 d8eZ7d ed9ee d"ee de7fd:d;Z8d<ee defd=d>Z9d?e'd ed9e%edf d"e%edf dededefd@dAZ:eej;e 			did edBee d"ee dedef
dCdDZ<eej=e 			did edBee d"ee dedef
dEdFZ>eej?e 			did edBee d"ee dedef
dGdHZ@eejAe 			did edBee d"ee dedef
dIdJZBG dKdL dLeZCdMe'd edBee d"ee deCf
dNdOZDeejEe 			did edBee d"ee dedef
dPdQZFeejGe 			did edBee d"ee dedef
dRdSZHeejIe 		T	djd edBee d"ee dedef
dUdVZJeejKe 		T	djd edBee d"ee dedef
dWdXZLeejMe 		T	djd edBee d"ee dedef
dYdZZNeejOe 		T	djd edBee d"ee dedef
d[d\ZPeejQe 		T	djd edBee d"ee dedef
d]d^ZReejSe 		T	djd edBee d"ee dedef
d_d`ZTd"ee d
edeUe fdadbZVeejWdkd ed"ee defdcddZXeejYdkd ed"ee defdedfZZdS )l    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"   Nr#   r$   xnormsignal_numelr"   returnc                    sh   t  tv  fdd  dkr| dt|  S | r$ du p) dkp)|o) dk}|r2| d|  S | S )z3Apply normalization to the un-normalized FFT resultc                      
   d  S )NzInvalid normalization mode:  r*   r&   r*   >/var/www/auris/lib/python3.10/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   
r6   dtyperequire_complexdevicec                    sh    j r S  jst  tjtjg}|jdv }|r|tj t	 |v  fdd |r2t
   S )z@Helper to promote a dtype to one supported by the FFT primitives)cudametac                      r)   )NzUnsupported dtype r*   r*   r7   r*   r,   r-   J   r.   z#_promote_type_fft.<locals>.<lambda>)
is_complexZis_floating_pointr0   Zget_default_dtypeZfloat32Zfloat64typeappendZfloat16r1   utilsZcorresponding_complex_dtype)r7   r8   r9   Zallowed_typesZmaybe_support_halfr*   r<   r,   _promote_type_fft:   s   

rA   Ftc                 C   s   | j }t||| j}t| |S )zEHelper to promote a tensor to a dtype supported by the FFT primitives)r7   rA   r9   r   )rB   r8   Zcur_typenew_typer*   r*   r,   _maybe_promote_tensor_fftR   s   
rD   dims.sizesc                 C   s   t |t |ks
J d}| j}dgt | d }tt |D ]B}|| dkr'q|||  || k rKd}t |d||   d }|| |||   ||< |||  || kr`| || d|| } q|rit| |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narrowr0   Zconstant_pad_nd)r%   rE   rF   Z	must_copyZx_sizesZ
pad_amountiZpad_idxr*   r*   r,   _resize_fft_input[   s   rM   	func_nameinputndimc                    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r;t|| d d fd
}|rBt|}t	j
|| d}t|| |dS )zBCommon code for performing any complex to real FFT (irfft or hfft)Tr8   FZwrap_scalarNrG   r/   c                         d  dS NzInvalid number of data points (z) specifiedr*   r*   last_dim_sizer*   r,   r-          z_fft_c2r.<locals>.<lambda>)rE   rF   rQ   rW   r&   r'   r"   )rD   r@   canonicalize_dimndimrJ   r0   r1   rM   conjprimsfft_c2rr6   )rN   rO   rP   rQ   r&   r"   rE   outputr*   rV   r,   _fft_c2ru   s   	

ra   onesidedc           	         s   t jj fdd ttjj|ddf}|dur"|nj|  t  dk fdd |dur>t	||ft
j||d}t|| |}|rQ|S t |S )	zBCommon code for performing any real to complex FFT (rfft or ihfft)c                           dj  S )Nz0 expects a floating point input tensor, but got r<   r*   rN   rO   r*   r,   r-          z_fft_r2c.<locals>.<lambda>FrS   Nr/   c                      rT   rU   r*   r*   dim_sizer*   r,   r-      rX   rQ   rb   )r0   r1   r7   r=   rD   r@   r[   r\   rJ   rM   r^   fft_r2cr6   r]   )	rN   rO   rP   rQ   r&   r"   rb   rE   retr*   rg   rN   rO   r,   _fft_r2c   s   
rl   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r9t||ft	j
||d}t|| |S )	zCCommon code for performing any complex to complex FFT (fft or ifft)c                      rc   Nz) expects a complex input tensor, but got r<   r*   rd   r*   r,   r-      re   z_fft_c2c.<locals>.<lambda>FrS   Nr/   c                      rT   rU   r*   r*   rf   r*   r,   r-      rX   rQ   r"   )r0   r1   r7   r=   r@   r[   r\   rJ   rM   r^   fft_c2cr6   )rN   rO   rP   rQ   r&   r"   rE   rj   r*   rk   r,   _fft_c2c   s   	rp   rH   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Tr"   Fr"   rb   r7   r=   rp   rl   rO   rP   rQ   r&   r*   r*   r,   r         r   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Frq   rr   rs   rt   r*   r*   r,   r      ru   r   c              	   C   s   t d| |||dddS )Nr   Trr   rl   rt   r*   r*   r,   r         r   c                 C      t d| |||ddS )Nr   Frq   ra   rt   r*   r*   r,   r         r   c                 C   rx   )Nr   Trq   ry   rt   r*   r*   r,   r      rz   r   c              	   C   s   t d| |||dddS )Nr   FTrr   rv   rt   r*   r*   r,   r     rw   r   c                   @   s.   e Zd ZU eedf ed< eedf ed< dS )_ShapeAndDims.rJ   rE   N__name__
__module____qualname__tupleint__annotations__r*   r*   r*   r,   r{     s   
 r{   rJ   c                    sL  | j  | j|dur*t|ts|f}tj |dd}ttt	|t|kdd  |durut|ts6|f}t|du pCt|t|kdd  t|t k fdd |du rft
t   }t
fdd	t||D }n|du rt
t }t
}nt
fd
d	|D }|D ]tdkfdd qt||dS )zTConvert the shape and dim arguments into a canonical form where neither are optionalNFrS   c                   S      dS )NzFFT dims must be uniquer*   r*   r*   r*   r,   r-   "      z6_canonicalize_fft_shape_and_dim_args.<locals>.<lambda>c                   S   r   )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 )rH   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  s    r   c                      rT   rU   r*   r*   )rP   r*   r,   r-   G  rX   )rJ   rE   )r\   rJ   
isinstancer   r@   Zcanonicalize_dimsr0   r1   rI   setr   rK   zipr{   )rO   rJ   rQ   Zret_dimsZ	ret_shaper*   )r   r   rP   r   r,   $_canonicalize_fft_shape_and_dim_args  sB   



r   xsc                 C   s   d}| D ]}||9 }q|S )zCompute product of a listr/   r*   )r   prodr%   r*   r*   r,   _prodL  s   
r   function_namec                    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                      rc   rm   r<   r*   r   rO   r*   r,   r-   _  s    z_fftn_c2c.<locals>.<lambda>rn   rZ   )	r0   r1   r7   r=   rM   r^   ro   r6   r   )r   rO   rJ   rQ   r&   r"   r%   r`   r*   r   r,   	_fftn_c2cT  s   	r   r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrR   r   rq   r   rD   r   rO   r   rQ   r&   rJ   r%   r*   r*   r,   r   g     r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrR   r   Frq   r   r   r*   r*   r,   r   t  r   r   c                    sf   t  jj  fdd t ||\}}t dd t || tj |dd}t	||t
|ddS )Nc                         d j  S )Nz2rfftn expects a real-valued input tensor, but got r<   r*   rO   r*   r,   r-     rX   zrfftn.<locals>.<lambda>FrR   Trh   rZ   )r0   r1   r7   r=   r   rD   rM   r^   ri   r6   r   )rO   r   rQ   r&   rJ   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rNt
|||d dd}t|S t|}tj||d d dd}t
||t|ddS )Nc                      r   )Nz3ihfftn expects a real-valued input tensor, but got r<   r*   r   r*   r,   r-     rX   zihfftn.<locals>.<lambda>r   c                   S   r   )Nz'ihfftn must transform at least one axisr*   r*   r*   r*   r,   r-     r   FrR   rH   Trh   r/   rZ   rn   )r0   r1   r7   r=   r   rI   rD   rM   r^   ri   r6   r]   conj_physicalro   r   )rO   r   rQ   r&   rJ   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.rJ   rQ   rW   Nr|   r*   r*   r*   r,   r     s   
 r   fnamec                    s   t |||\}}tt|dk fdd |du s |d dkr,d|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>NrH   rG   r/   c                      rT   rU   r*   r*   rV   r*   r,   r-     rX   )rJ   rQ   rW   )r   r0   r1   rI   rJ   listr   r   )r   rO   r   rQ   rJ   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   TrR   rY   c                 3   s    | ]} j | V  qd S r   rJ   r   r   r*   r,   r     s    zirfftn.<locals>.<genexpr>Frq   )r   rD   rM   r^   r_   r6   r   )rO   r   rQ   r&   rJ   rW   r*   r   r,   r     s   
"r   c                 C   s   t d| ||\}}}t| dd} t| ||} t|dkr(tj| |d d ddn| }t||t|d d dd}t|}tj	||dd  |d}t|||ddS )	Nr   TrR   r/   rH   rn   rq   rY   )
r   rD   rM   rI   r^   ro   r6   r   r   r_   )rO   r   rQ   r&   rJ   rW   r   r   r*   r*   r,   r     s   
(
r   rH   c                 C      t jj| |||dS N)r   rQ   r&   )r0   r   r   rO   r   rQ   r&   r*   r*   r,   r     rz   r   c                 C   r   r   )r0   r   r   r   r*   r*   r,   r     rz   r   c                 C   r   r   )r0   r   r   r   r*   r*   r,   r     rz   r   c                 C   r   r   )r0   r   r   r   r*   r*   r,   r     rz   r   c                 C   r   r   )r0   r   r   r   r*   r*   r,   r   $  rz   r   c                 C   r   r   )r0   r   r   r   r*   r*   r,   r   /  rz   r   c                 C   s.   | du rt t|jS t| ts| gS t | S )zIConvert Optional[DimsType] to a simple list, defaulting to all dimensionsN)r   rK   r\   r   r   )rQ   r%   r*   r*   r,   _default_alldims:  s
   
r   c                    *   t | } fdd|D }t ||S )Nc                    s   g | ]	} j | d  qS )rG   r   r   r   r*   r,   
<listcomp>G  s    zfftshift.<locals>.<listcomp>r   r0   ZrollrO   rQ   rE   shiftr*   r   r,   r    D     
r    c                    r   )Nc                    s   g | ]} j | d  d qS )r/   rG   r   r   r   r*   r,   r   N  s    zifftshift.<locals>.<listcomp>r   r   r*   r   r,   r!   K  r   r!   )F)NrH   N)NNN)Nr   Nr   )[r3   collections.abcr   r   typingr   r   r   r   r0   Ztorch._primsZ_primsr^   Ztorch._prims_commonZ_prims_commonr@   Ztorch._decompr   r	   r
   r   Ztorch._prims_common.wrappersr   r   __all__ZNormTyper2   Z_opsopsZatenr   boolr6   r7   r9   rA   rD   r   rM   strra   rl   rp   Zfft_fftr   Zfft_ifftr   Zfft_rfftr   Z	fft_irfftr   Zfft_hfftr   Z	fft_ihfftr   r{   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>   sX   



	





				
8



						
"