o
    *ѹgE                     @   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 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$	dfd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 		)	dgded ee d!ed
edef
d*d+Z,eej-e 		)	dgded ee d!ed
edef
d,d-Z.eej/e 		)	dgded ee d!ed
edef
d.d/Z0eej1e 		)	dgded ee d!ed
edef
d0d1Z2eej3e 		)	dgded ee d!ed
edef
d2d3Z4eej5e 		)	dgded ee d!ed
edef
d4d5Z6G d6d7 d7eZ7ded8ee d!ee de7fd9d:Z8d;ee defd<d=Z9d>e'ded8eedf d!eedf d
ede defd?d@Z:eej;e 			dhdedAee d!ee d
edef
dBdCZ<eej=e 			dhdedAee d!ee d
edef
dDdEZ>eej?e 			dhdedAee d!ee d
edef
dFdGZ@eejAe 			dhdedAee d!ee d
edef
dHdIZBG dJdK dKeZCdLe'dedAee d!ee deCf
dMdNZDeejEe 			dhdedAee d!ee d
edef
dOdPZFeejGe 			dhdedAee d!ee d
edef
dQdRZHeejIe 		S	didedAee d!ee d
edef
dTdUZJeejKe 		S	didedAee d!ee d
edef
dVdWZLeejMe 		S	didedAee d!ee d
edef
dXdYZNeejOe 		S	didedAee d!ee d
edef
dZd[ZPeejQe 		S	didedAee d!ee d
edef
d\d]ZReejSe 		S	didedAee d!ee d
edef
d^d_ZTd!ee d	edee fd`daZUeejVdjded!ee defdbdcZWeejXdjded!ee defdddeZYdS )k    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ortho>   Nr$   r%   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,   S/Users/admin/.pyenv/versions/3.10.0/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   
r8   dtyperequire_complexdevicec                    sr    j r S  jst  tjtjg}|jdv otjj }|r$|	tj
 t |v  fdd |r7t   S )z@Helper to promote a dtype to one supported by the FFT primitives)Zcudametac                      r+   )NzUnsupported dtype r,   r,   r9   r,   r.   r/   I   r0   z#_promote_type_fft.<locals>.<lambda>N)
is_complexZis_floating_pointr2   Zget_default_dtypeZfloat32Zfloat64typeversionZhipappendZfloat16r3   utilsZcorresponding_complex_dtype)r9   r:   r;   Zallowed_typesZmaybe_support_halfr,   r=   r.   _promote_type_fft9   s   
rC   Ftc                 C   s   | j }t||| j}t| |S )zEHelper to promote a tensor to a dtype supported by the FFT primitivesN)r9   rC   r;   r   )rD   r:   Zcur_typenew_typer,   r,   r.   _maybe_promote_tensor_fftQ   s   
rF   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      Tr1   N)lenshaperangeZnarrowr2   Zconstant_pad_nd)r'   rG   rH   Z	must_copyZx_sizesZ
pad_amountiZpad_idxr,   r,   r.   _resize_fft_inputZ   s   rO   	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r:   FZwrap_scalarNrI   r1   c                         d  dS NzInvalid number of data points (z) specifiedr,   r,   last_dim_sizer,   r.   r/          z_fft_c2r.<locals>.<lambda>)rG   rH   rS   rY   r(   r)   r$   )rF   rB   canonicalize_dimndimrL   r2   r3   rO   conjprimsfft_c2rr8   )rP   rQ   rR   rS   r(   r$   rG   outputr,   rX   r.   _fft_c2rt   s   	

rc   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,   rP   rQ   r,   r.   r/          z_fft_r2c.<locals>.<lambda>FrU   Nr1   c                      rV   rW   r,   r,   dim_sizer,   r.   r/      rZ   rS   rd   )r2   r3   r9   r>   rF   rB   r]   r^   rL   rO   r`   fft_r2cr8   r_   )	rP   rQ   rR   rS   r(   r$   rd   rG   retr,   ri   rP   rQ   r.   _fft_r2c   s   
rn   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                      re   Nz) expects a complex input tensor, but got r=   r,   rf   r,   r.   r/      rg   z_fft_c2c.<locals>.<lambda>FrU   Nr1   c                      rV   rW   r,   r,   rh   r,   r.   r/      rZ   rS   r$   )r2   r3   r9   r>   rB   r]   r^   rL   rO   r`   fft_c2cr8   )rP   rQ   rR   rS   r(   r$   rG   rl   r,   rm   r.   _fft_c2c   s   	rr   rJ   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Tr$   Fr$   rd   r9   r>   rr   rn   rQ   rR   rS   r(   r,   r,   r.   r         r   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Frs   rt   ru   rv   r,   r,   r.   r      rw   r   c              	   C   s   t d| |||dddS )Nr   Trt   rn   rv   r,   r,   r.   r         r   c                 C      t d| |||ddS )Nr   Frs   rc   rv   r,   r,   r.   r         r   c                 C   rz   )Nr   Trs   r{   rv   r,   r,   r.   r      r|   r   c              	   C   s   t d| |||dddS )Nr   FTrt   rx   rv   r,   r,   r.   r     ry   r   c                   @   s.   e Zd ZU eedf ed< eedf ed< dS )_ShapeAndDims.rL   rG   N__name__
__module____qualname__r   int__annotations__r,   r,   r,   r.   r}     s   
 r}   rL   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 optionalNFrU   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/   1  s    c                 3   s(    | ]\}}|d kr|n | V  qdS )rJ   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                      rV   rW   r,   r,   )rR   r,   r.   r/   F  rZ   )rL   rG   )r^   rL   
isinstancer   rB   Zcanonicalize_dimsr2   r3   rK   settuplerM   zipr}   )rQ   rL   rS   Zret_dimsZ	ret_shaper,   )r   r   rR   r   r.   $_canonicalize_fft_shape_and_dim_args  sB   



r   xsc                 C   s   d}| D ]}||9 }q|S )zCompute product of a listr1   Nr,   )r   prodr'   r,   r,   r.   _prodK  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                      re   ro   r=   r,   r   rQ   r,   r.   r/   ^  s    z_fftn_c2c.<locals>.<lambda>rp   r\   N)	r2   r3   r9   r>   rO   r`   rq   r8   r   )r   rQ   rL   rS   r(   r$   r'   rb   r,   r   r.   	_fftn_c2cS  s   	r   r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrT   r   rs   r   rF   r   rQ   r   rS   r(   rL   r'   r,   r,   r.   r   f     r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrT   r   Frs   r   r   r,   r,   r.   r   s  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,   rQ   r,   r.   r/     rZ   zrfftn.<locals>.<lambda>FrT   Trj   r\   )r2   r3   r9   r>   r   rF   rO   r`   rk   r8   r   )rQ   r   rS   r(   rL   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/     rZ   zihfftn.<locals>.<lambda>r   c                   S   r   )Nz'ihfftn must transform at least one axisr,   r,   r,   r,   r.   r/     r   FrT   rJ   Trj   r1   r\   rp   )r2   r3   r9   r>   r   rK   rF   rO   r`   rk   r8   r_   conj_physicalrq   r   )rQ   r   rS   r(   rL   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.rL   rS   rY   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/     r0   z:_canonicalize_fft_c2r_shape_and_dim_args.<locals>.<lambda>NrJ   rI   r1   c                      rV   rW   r,   r,   rX   r,   r.   r/     rZ   )rL   rS   rY   )r   r2   r3   rK   rL   listr   r   )r   rQ   r   rS   rL   Z
shape_listr,   )r   rY   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   r[   c                 3   s    | ]} j | V  qd S r   rL   r   r   r,   r.   r     s    zirfftn.<locals>.<genexpr>Frs   )r   rF   rO   r`   ra   r8   r   )rQ   r   rS   r(   rL   rY   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   TrT   r1   rJ   rp   rs   r[   )
r   rF   rO   rK   r`   rq   r8   r   r   ra   )rQ   r   rS   r(   rL   rY   r   r   r,   r,   r.   r     s   
(
r   rJ   c                 C      t jj| |||dS N)r   rS   r(   )r2   r   r   rQ   r   rS   r(   r,   r,   r.   r     r|   r   c                 C   r   r   )r2   r   r   r   r,   r,   r.   r     r|   r   c                 C   r   r   )r2   r   r   r   r,   r,   r.   r     r|   r   c                 C   r   r   )r2   r   r!   r   r,   r,   r.   r      r|   r    c                 C   r   r   )r2   r   r   r   r,   r,   r.   r   #  r|   r   c                 C   r   r   )r2   r   r   r   r,   r,   r.   r   .  r|   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   rM   r^   r   r   )rS   r'   r,   r,   r.   _default_alldims9  s
   
r   c                    *   t | } fdd|D }t ||S )Nc                    s   g | ]	} j | d  qS )rI   r   r   r   r,   r.   
<listcomp>F  s    zfftshift.<locals>.<listcomp>r   r2   ZrollrQ   rS   rG   shiftr,   r   r.   r"   C     
r"   c                    r   )Nc                    s   g | ]} j | d  d qS )r1   rI   r   r   r   r,   r.   r   M  s    zifftshift.<locals>.<listcomp>r   r   r,   r   r.   r#   J  r   r#   )F)NrJ   N)NNN)Nr   Nr   )Zr5   typingr   r   r   r   r   r   r   r	   r2   Ztorch._primsZ_primsr`   Ztorch._prims_commonZ_prims_commonrB   Ztorch._decompr
   r   r   r   Ztorch._prims_common.wrappersr   r   __all__ZNormTyper4   Z_opsopsZatenr   boolr8   r9   r;   rC   rF   rO   strrc   rn   rr   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   Zfft_fftshiftr"   Zfft_ifftshiftr#   r,   r,   r,   r.   <module>   sV   (



	





				
8



						
"