U
    9%e*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/Darija-Ai-API/env/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 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      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
}|rt|}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	rt|tsl|f}t|dkpt|t|kdd  t|t k fdd |dkrt
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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/   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 )
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>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	

                     	   	   	   	   	   	
