o
    j9:j3F                     @   s  d dl Z d dlmZmZ d dl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ded B 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dB d"edededefd#d$Z&de%d ed!edB d"ededed%edefd&d'Z'de%d ed!edB d"edededefd(d)Z(eej)e 		*	dhd ed!edB d"ededef
d+d,Z*eej+e 		*	dhd ed!edB d"ededef
d-d.Z,eej-e 		*	dhd ed!edB d"ededef
d/d0Z.eej/e 		*	dhd ed!edB d"ededef
d1d2Z0eej1e 		*	dhd ed!edB d"ededef
d3d4Z2eej3e 		*	dhd ed!edB d"ededef
d5d6Z4G d7d8 d8eZ5d ed9edB d"edB de5fd:d;Z6d<ee defd=d>Z7d?e%d ed9e#edf d"e#edf dededefd@dAZ8eej9e 			did edBedB d"edB dedef
dCdDZ:eej;e 			did edBedB d"edB dedef
dEdFZ<eej=e 			did edBedB d"edB dedef
dGdHZ>eej?e 			did edBedB d"edB dedef
dIdJZ@G dKdL dLeZAdMe%d edBedB d"edB deAf
dNdOZBeejCe 			did edBedB d"edB dedef
dPdQZDeejEe 			did edBedB d"edB dedef
dRdSZFeejGe 		T	djd edBedB d"edB dedef
dUdVZHeejIe 		T	djd edBedB d"edB dedef
dWdXZJeejKe 		T	djd edBedB d"edB dedef
dYdZZLeejMe 		T	djd edBedB d"edB dedef
d[d\ZNeejOe 		T	djd edBedB d"edB dedef
d]d^ZPeejQe 		T	djd edBedB d"edB dedef
d_d`ZRd"edB d
edeSe fdadbZTeejUdkd ed"edB defdcddZVeejWdkd ed"edB defdedfZXdS )l    N)IterableSequence)Literal
NamedTuple)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(   V/home/nk/hobo-godmode/plappi-mvp/.venv/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   
r4   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metaxpuc                      r'   )NzUnsupported dtype r(   r(   r5   r(   r*   r+   J   r,   z#_promote_type_fft.<locals>.<lambda>)
is_complexis_floating_pointr.   get_default_dtypefloat32float64typeappendfloat16r/   utilscorresponding_complex_dtype)r5   r6   r7   allowed_typesmaybe_support_halfr(   r;   r*   _promote_type_fft:   s   

rH   Ftc                 C   s   | j }t||| j}t| |S )zEHelper to promote a tensor to a dtype supported by the FFT primitives)r5   rH   r7   r
   )rI   r6   cur_typenew_typer(   r(   r*   _maybe_promote_tensor_fftR   s   
rL   dims.sizesc                 C   s   t |t |krtdt | dt | d}| j}dgt | d }tt |D ]B}|| dkr3q*|||  || k rWd}t |d||   d }|| |||   ||< |||  || krl| || d|| } q*|rut| |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.
    z.dims and sizes must have the same length, got z and Fr      Tr-   )lenAssertionErrorshaperangenarrowr.   constant_pad_nd)r#   rM   rN   	must_copyx_sizes
pad_amountipad_idxr(   r(   r*   _resize_fft_input[   s$   r\   	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r6   Fwrap_scalarNrO   r-   c                         d  dS NzInvalid number of data points (z) specifiedr(   r(   last_dim_sizer(   r*   r+          z_fft_c2r.<locals>.<lambda>)rM   rN   r`   rg   r$   r%   r    )rL   rD   canonicalize_dimndimrS   r.   r/   r\   conjprimsfft_c2rr4   )r]   r^   r_   r`   r$   r    rM   outputr(   rf   r*   _fft_c2ry   s   	

rq   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(   r]   r^   r(   r*   r+          z_fft_r2c.<locals>.<lambda>Frb   Nr-   c                      rd   re   r(   r(   dim_sizer(   r*   r+      rh   r`   rr   )r.   r/   r5   r<   rL   rD   rk   rl   rS   r\   rn   fft_r2cr4   rm   )	r]   r^   r_   r`   r$   r    rr   rM   retr(   rw   r]   r^   r*   _fft_r2c   s   
r|   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                      rs   Nz) expects a complex input tensor, but got r;   r(   rt   r(   r*   r+      ru   z_fft_c2c.<locals>.<lambda>Frb   Nr-   c                      rd   re   r(   r(   rv   r(   r*   r+      rh   r`   r    )r.   r/   r5   r<   rD   rk   rl   rS   r\   rn   fft_c2cr4   )r]   r^   r_   r`   r$   r    rM   rz   r(   r{   r*   _fft_c2c   s   	r   rP   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Tr    Fr    rr   r5   r<   r   r|   r^   r_   r`   r$   r(   r(   r*   r         r   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Fr   r   r   r   r(   r(   r*   r      r   r   c              	   C   s   t d| |||dddS )Nr   Tr   r|   r   r(   r(   r*   r         r   c                 C      t d| |||ddS )Nr   Fr   rq   r   r(   r(   r*   r         r   c                 C   r   )Nr   Tr   r   r   r(   r(   r*   r      r   r   c              	   C   s   t d| |||dddS )Nr   FTr   r   r   r(   r(   r*   r     r   r   c                   @   s.   e Zd ZU eedf ed< eedf ed< dS )_ShapeAndDims.rS   rM   N__name__
__module____qualname__tupleint__annotations__r(   r(   r(   r*   r     s   
 r   rS   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 optionalNFrb   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+   0  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+   6  s    c                 3   s(    | ]\}}|d kr|n | V  qdS )rP   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   I  s    r   c                      rd   re   r(   r(   )r_   r(   r*   r+   L  rh   )rS   rM   )rl   rS   
isinstancer   rD   canonicalize_dimsr.   r/   rQ   setr   rT   zipr   )r^   rS   r`   ret_dims	ret_shaper(   )r   r   r_   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*   _prodQ  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                      rs   r}   r;   r(   r   r^   r(   r*   r+   d  s    z_fftn_c2c.<locals>.<lambda>r~   rj   )	r.   r/   r5   r<   r\   rn   r   r4   r   )r   r^   rS   r`   r$   r    r#   rp   r(   r   r*   	_fftn_c2cY  s   	r   r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTra   r   r   r   rL   r   r^   r   r`   r$   rS   r#   r(   r(   r*   r   l     r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTra   r   Fr   r   r   r(   r(   r*   r   y  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(   r^   r(   r*   r+     rh   zrfftn.<locals>.<lambda>Fra   Trx   rj   )r.   r/   r5   r<   r   rL   r\   rn   ry   r4   r   )r^   r   r`   r$   rS   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+     rh   zihfftn.<locals>.<lambda>r   c                   S   r   )Nz'ihfftn must transform at least one axisr(   r(   r(   r(   r*   r+     r   Fra   rP   Trx   r-   rj   r~   )r.   r/   r5   r<   r   rQ   rL   r\   rn   ry   r4   rm   conj_physicalr   r   )r^   r   r`   r$   rS   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.rS   r`   rg   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>NrP   rO   r-   c                      rd   re   r(   r(   rf   r(   r*   r+     rh   )rS   r`   rg   )r   r.   r/   rQ   rS   listr   r   )r   r^   r   r`   rS   
shape_listr(   )r   rg   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   Tra   ri   c                 3   s    | ]} j | V  qd S r   rS   r   r   r(   r*   r     s    zirfftn.<locals>.<genexpr>Fr   )r   rL   r\   rn   ro   r4   r   )r^   r   r`   r$   rS   rg   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   Tra   r-   rP   r~   r   ri   )
r   rL   r\   rQ   rn   r   r4   r   r   ro   )r^   r   r`   r$   rS   rg   r   r   r(   r(   r*   r     s   
(
r   rP   c                 C      t jj| |||dS N)r   r`   r$   )r.   r   r   r^   r   r`   r$   r(   r(   r*   r     r   r   c                 C   r   r   )r.   r   r   r   r(   r(   r*   r     r   r   c                 C   r   r   )r.   r   r   r   r(   r(   r*   r     r   r   c                 C   r   r   )r.   r   r   r   r(   r(   r*   r     r   r   c                 C   r   r   )r.   r   r   r   r(   r(   r*   r   )  r   r   c                 C   r   r   )r.   r   r   r   r(   r(   r*   r   4  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   rT   rl   r   r   )r`   r#   r(   r(   r*   _default_alldims?  s
   
r   c                    *   t | } fdd|D }t ||S )Nc                    s   g | ]	} j | d  qS )rO   r   r   r   r(   r*   
<listcomp>L  s    zfftshift.<locals>.<listcomp>r   r.   rollr^   r`   rM   shiftr(   r   r*   r   I     
r   c                    r   )Nc                    s   g | ]} j | d  d qS )r-   rO   r   r   r   r(   r*   r   S  s    zifftshift.<locals>.<listcomp>r   r   r(   r   r*   r   P  r   r   )F)NrP   N)NNN)Nr   Nr   )Yr1   collections.abcr   r   typingr   r   r.   torch._prims_primsrn   torch._prims_common_prims_commonrD   torch._decompr   r   r   r	   torch._prims_common.wrappersr
   r   __all__NormTyper0   _opsopsatenr   boolr4   r5   r7   rH   rL   r   r\   strrq   r|   r   fft_fftr   fft_ifftr   fft_rfftr   	fft_irfftr   fft_hfftr   	fft_ihfftr   r   r   r   r   fft_fftnr   	fft_ifftnr   	fft_rfftnr   
fft_ihfftnr   r   r   
fft_irfftnr   	fft_hfftnr   fft_fft2r   	fft_ifft2r   	fft_rfft2r   
fft_irfft2r   	fft_hfft2r   
fft_ihfft2r   r   r   fft_fftshiftr   fft_ifftshiftr   r(   r(   r(   r*   <module>   sX   



	





				
9



						
"