U
    ©Ê¹j*C  ã                   @   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 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
jjj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.œd/d0„Z(e&eee eee ed+œd1d2„Z)eej*ƒeƒ d`eee eeed4œd5d„ƒƒZ+eej,ƒeƒ daeee eeed4œd6d„ƒƒZ-eej.ƒeƒ dbeee eeed4œd7d„ƒƒZ/eej0ƒeƒ dceee eeed4œd8d„ƒƒZ1eej2ƒeƒ ddeee eeed4œd9d	„ƒƒZ3eej4ƒeƒ deeee eeed4œd:d„ƒƒZ5G d;d<„ d<eƒZ6eee ee e6d=œd>d?„Z7ee ed@œdAdB„Z8e&eeed'f eed'f ee edCœdDdE„Z9eej:ƒeƒ dfeee ee eedFœdGd„ƒƒZ;eej<ƒeƒ dgeee ee eedFœdHd„ƒƒZ=eej>ƒeƒ dheee ee eedFœdId„ƒƒZ?eej@ƒeƒ dieee ee eedFœdJd„ƒƒZAG dKdL„ dLeƒZBe&eee ee eBdMœdNdO„ZCeejDƒeƒ djeee ee eedFœdPd„ƒƒZEeejFƒeƒ dkeee ee eedFœdQd„ƒƒZGeejHƒeƒ dleee ee eedFœdSd„ƒƒZIeejJƒeƒ dmeee ee eedFœdTd„ƒƒZKeejLƒeƒ dneee ee eedFœdUd„ƒƒZMeejNƒeƒ doeee ee eedFœdVd„ƒƒZOeejPƒeƒ dpeee ee eedFœdWd
„ƒƒZQeejRƒeƒ dqeee ee eedFœdXd„ƒƒZSee eee dYœdZd[„ZTeejUƒdreee ed\œd]d„ƒZVeejWƒdseee ed\œd^d„ƒZXdS )té    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)ÚxÚnormÚsignal_numelr$   Úreturnc                    sh   t  ˆ tk‡ fdd„¡ ˆ dkr2| dt |¡  S | rHˆ dk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+   úN/var/www/html/bwave/python/venv/lib/python3.8/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    
ÿr7   )Ú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_pointr1   Zget_default_dtypeÚutilsZcorresponding_complex_dtype)r8   r9   r+   r+   r-   Ú_promote_type_fft9   s    
r<   F)Útr9   r*   c                 C   s   | j }t||ƒ}t| |ƒS )zEHelper to promote a tensor to a dtype supported by the FFT primitives)r8   r<   r   )r=   r9   Zcur_typeÚnew_typer+   r+   r-   Ú_maybe_promote_tensor_fftH   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 r–d}t |ƒd||   d }|| |||   ||< |||  || kr<|  || d|| ¡} q<|rÒt | |¡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narrowr1   Zconstant_pad_nd)r'   r@   rA   Z	must_copyZx_sizesZ
pad_amountÚiZpad_idxr+   r+   r-   Ú_resize_fft_inputQ   s    rI   )Ú	func_nameÚinputÚnÚdimr(   r$   r*   c           	         s¤   t |dd�}tj|j|dd�f}ˆ dk	r,ˆ nd|j| d  }t |dk‡ fdd	„¡ ˆ dk	rvt|||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©r9   F©Zwrap_scalarNrB   r0   c                      s   dˆ › d�S ©NzInvalid number of data points (z) specifiedr+   r+   ©rL   r+   r-   r.   x   r/   z_fft_c2r.<locals>.<lambda>)r@   rA   ©rM   Úlast_dim_size©r(   r)   r$   )r?   r;   Úcanonicalize_dimÚndimrF   r1   r2   rI   ÚconjÚprimsÚfft_c2rr7   )	rJ   rK   rL   rM   r(   r$   r@   rS   Úoutputr+   rQ   r-   Ú_fft_c2rk   s    	 
ÿ
r[   )rJ   rK   rL   rM   r(   r$   Úonesidedr*   c           	         s„   t  ˆjj ‡ ‡fdd„¡ tˆƒ‰tjˆj|dd�f}|dk	rNtˆ||fƒ‰t	j
ˆ||d�}t||ˆj| |ƒ}|rz|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 ©r8   r+   ©rJ   rK   r+   r-   r.   ‘   r/   z_fft_r2c.<locals>.<lambda>FrO   N©rM   r\   )r1   r2   r8   r:   r?   r;   rU   rV   rI   rX   Úfft_r2cr7   rF   rW   )	rJ   rK   rL   rM   r(   r$   r\   r@   Úretr+   r^   r-   Ú_fft_r2c…   s    
þrb   c                    sh   t  ˆjj‡ ‡fdd„¡ tjˆj|dd�f}|dk	rDtˆ||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>FrO   N©rM   r$   )r1   r2   r8   r:   r;   rU   rV   rI   rX   Úfft_c2cr7   rF   )rJ   rK   rL   rM   r(   r$   r@   ra   r+   r^   r-   Ú_fft_c2cž   s    	þrf   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$   r\   ©r8   r:   rf   rb   ©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   Frg   rh   ri   rj   r+   r+   r-   r   Â   s    c              	   C   s   t d| |||ddd�S )Nr   Trh   ©rb   rj   r+   r+   r-   r   Ð   s    c                 C   s   t d| |||dd�S )Nr   Frg   ©r[   rj   r+   r+   r-   r   Û   s    c                 C   s   t d| |||dd�S )Nr   Trg   rl   rj   r+   r+   r-   r   æ   s    c              	   C   s   t d| |||ddd�S )Nr   FTrh   rk   rj   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-   rm   ü   s   
rm   )rK   rF   rM   r*   c                    sP  | j ‰ | j‰|dk	rTt|tƒs$|f}tjˆ |dd�}t tt	|ƒƒt|ƒkdd„ ¡ |dk	rêt|tƒsl|f}t |dkp†t|ƒt|ƒkdd„ ¡ t|ƒ‰t ˆˆ k‡ ‡fdd„¡ |dkrÌt
tˆ ˆ ˆ ƒƒ}t
‡fdd	„t||ƒD ƒƒ}n6|dk�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 optionalNFrO   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.     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+   ©rv   rx   ry   r+   r-   r{   /  s     r   c                      s   dˆ › d�S rP   r+   r+   rQ   r+   r-   r.   2  r/   )rF   r@   )rV   rF   Ú
isinstancer   r;   Zcanonicalize_dimsr1   r2   rD   ÚsetÚtuplerG   Úziprm   )rK   rF   rM   Zret_dimsZ	ret_shaper+   )rt   rz   rL   ru   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-   Ú_prod7  s    
r…   )Úfunction_namerK   rF   rM   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 rc   r]   r+   ©r†   rK   r+   r-   r.   J  r/   z_fftn_c2c.<locals>.<lambda>rd   rT   )	r1   r2   r8   r:   rI   rX   re   r7   r…   )r†   rK   rF   rM   r(   r$   r'   rZ   r+   r‡   r-   Ú	_fftn_c2c?  s    	þrˆ   )rK   rw   rM   r(   r*   c                 C   s0   t | ||ƒ\}}t| dd�}td||||dd�S )NTrN   r   rg   ©r‚   r?   rˆ   ©rK   rw   rM   r(   rF   r'   r+   r+   r-   r   R  s    c                 C   s0   t | ||ƒ\}}t| dd�}td||||dd�S )NTrN   r   Frg   r‰   rŠ   r+   r+   r-   r   _  s    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+   ©rK   r+   r-   r.   v  r/   zrfftn.<locals>.<lambda>FrN   Tr_   rT   )r1   r2   r8   r:   r‚   r?   rI   rX   r`   r7   r…   )rK   rw   rM   r(   rF   Úoutr+   r‹   r-   r   l  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rœt
|||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   rT   rd   )r1   r2   r8   r:   r‚   rD   r?   rI   rX   r`   r7   rW   Úconj_physicalre   r…   )rK   rw   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   rS   Nrn   r+   r+   r+   r-   r�   ›  s   
r�   )ÚfnamerK   rw   rM   r*   c                    s¢   t |||ƒ\}}t t|ƒdk‡ fdd„¡ |dks@|d dkrXd|j|d  d  ‰n|d ‰t ˆdk‡fdd„¡ t|ƒ}ˆd d |d< tt|ƒ|ˆd	�S )
zšCanonicalize 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 rP   r+   r+   )rS   r+   r-   r.   ³  r/   )rF   rM   rS   )r‚   r1   r2   rD   rF   Úlistr�   r€   )r�   rK   rw   rM   rF   Z
shape_listr+   )r�   rS   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   rR   c                 3   s   | ]}ˆ j | V  qd S r|   ©rF   r}   ©rŒ   r+   r-   r{   Ë  s     zirfftn.<locals>.<genexpr>Frg   )r’   r?   rI   rX   rY   r7   r…   )rK   rw   rM   r(   rF   rS   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   rd   rg   rR   )
r’   r?   rI   rD   rX   re   r7   r…   r�   rY   )rK   rw   rM   r(   rF   rS   rŽ   rŒ   r+   r+   r-   r   Î  s       ÿ
(
©éþÿÿÿrC   c                 C   s   t jj| |||d�S ©N)rw   rM   r(   )r1   r   r   ©rK   rw   rM   r(   r+   r+   r-   r   ã  s    c                 C   s   t jj| |||d�S r—   )r1   r   r   r˜   r+   r+   r-   r   î  s    c                 C   s   t jj| |||d�S r—   )r1   r   r   r˜   r+   r+   r-   r   ù  s    c                 C   s   t jj| |||d�S r—   )r1   r   r!   r˜   r+   r+   r-   r      s    c                 C   s   t jj| |||d�S r—   )r1   r   r   r˜   r+   r+   r-   r     s    c                 C   s   t jj| |||d�S r—   )r1   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   rV   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>2  s     zfftshift.<locals>.<listcomp>©r™   r1   Zroll©rK   rM   r@   Úshiftr+   r‹   r-   r"   /  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š   9  s     zifftshift.<locals>.<listcomp>r›   rœ   r+   r‹   r-   r#   6  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)Yr4   Útypingr   r   r   r   r   r   r   r	   r1   Ztorch._primsZ_primsrX   Ztorch._prims_commonZ_prims_commonr;   Ztorch._decompr
   r   r   r   Ztorch._prims_common.wrappersr   r   Ú__all__ZNormTyper3   Z_opsZopsZatenrr   Úboolr7   r8   r<   r?   rI   Ústrr[   rb   rf   Zfft_fftr   Zfft_ifftr   Zfft_rfftr   Z	fft_irfftr   Zfft_hfftr   Z	fft_ihfftr   rm   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	

ù   üû   üû   üû   üûû   üû   üû   üû	   üû	   üû	   üû	   üû	   üû	
