o
    "i*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 g dZe	ded 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"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/Z/eej0e 		)	dgded ee d!ededef
d0d1Z1eej2e 		)	dgded ee d!ededef
d2d3Z3eej4e 		)	dgded ee d!ededef
d4d5Z5G d6d7 d7eZ6ded8ee d!ee de6fd9d:Z7d;ee defd<d=Z8d>e&ded8eedf d!eedf dede defd?d@Z9e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j@e 			dhdedAee d!ee dedef
dHdIZAG dJdK dKeZBdLe&dedAee d!ee deBf
dMdNZCeejDe 			dhdedAee d!ee dedef
dOdPZEeejFe 			dhdedAee d!ee dedef
dQdRZGeejHe 		S	didedAee d!ee dedef
dTdUZIeejJe 		S	didedAee d!ee dedef
dVdWZKeejLe 		S	didedAee d!ee dedef
dXdYZMeejNe 		S	didedAee d!ee dedef
dZd[ZOeejPe 		S	didedAee d!ee dedef
d\d]ZQeejRe 		S	didedAee d!ee dedef
d^d_ZSd!ee dedee fd`daZTeejUdjded!ee defdbdcZVeejWdjded!ee defdddeZXd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>   r%   r$   r&   Nxnormsignal_numel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                      s
   d  S )NzInvalid normalization mode:  r+   r(   r+   ^/var/www/html/eduruby.in/lip-sync/lip-sync-env/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   
r7   dtyperequire_complexc                 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tc                 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?   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      Tr0   )len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   rH   	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r9   FZwrap_scalarNrB   r0   c                         d  dS NzInvalid number of data points (z) specifiedr+   r+   rK   r+   r-   r.   x       z_fft_c2r.<locals>.<lambda>)r@   rA   rL   last_dim_sizer(   r)   r$   )r?   r;   canonicalize_dimndimrE   r1   r2   rH   conjprimsfft_c2rr7   )	rI   rJ   rK   rL   r(   r$   r@   rT   outputr+   rQ   r-   _fft_c2rk   s   	
r\   onesidedc           	         s   t jj  fdd ttjj|ddf}|dur't||ft	j
||d}t||j| |}|r=|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 r8   r+   rI   rJ   r+   r-   r.          z_fft_r2c.<locals>.<lambda>FrN   NrL   r]   )r1   r2   r8   r:   r?   r;   rV   rW   rH   rY   fft_r2cr7   rE   rX   )	rI   rJ   rK   rL   r(   r$   r]   r@   retr+   r`   r-   _fft_r2c   s   
re   c                    sh   t jj fdd tjj|ddf}|dur"t||ftj	||d}t
||j| |S )zCCommon code for performing any complex to complex FFT (fft or ifft)c                      r^   Nz) expects a complex input tensor, but got r_   r+   r`   r+   r-   r.      ra   z_fft_c2c.<locals>.<lambda>FrN   NrL   r$   )r1   r2   r8   r:   r;   rV   rW   rH   rY   fft_c2cr7   rE   )rI   rJ   rK   rL   r(   r$   r@   rd   r+   r`   r-   _fft_c2c   s   	ri   rC   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Tr$   Fr$   r]   r8   r:   ri   re   rJ   rK   rL   r(   r+   r+   r-   r         r   c              	   C   s2   | j jrtd| |||ddS td| |||dddS )Nr   Frj   rk   rl   rm   r+   r+   r-   r      rn   r   c              	   C   s   t d| |||dddS )Nr   Trk   re   rm   r+   r+   r-   r         r   c                 C      t d| |||ddS )Nr   Frj   r\   rm   r+   r+   r-   r         r   c                 C   rq   )Nr   Trj   rr   rm   r+   r+   r-   r      rs   r   c              	   C   s   t d| |||dddS )Nr   FTrk   ro   rm   r+   r+   r-   r      rp   r   c                   @   s.   e Zd ZU eedf ed< eedf ed< dS )_ShapeAndDims.rE   r@   N__name__
__module____qualname__r   int__annotations__r+   r+   r+   r-   rt      s   
 rt   rE   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 optionalNFrN   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.     s    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+   r   r   r   r+   r-   r   /  s    r   c                      rO   rP   r+   r+   rQ   r+   r-   r.   2  rR   )rE   r@   )rW   rE   
isinstancer   r;   Zcanonicalize_dimsr1   r2   rD   settuplerF   ziprt   )rJ   rE   rL   Zret_dimsZ	ret_shaper+   )r}   r   rK   r~   r-   $_canonicalize_fft_shape_and_dim_args  s>   
 


r   xsc                 C   s   d}| D ]}||9 }q|S )zCompute product of a listr0   r+   )r   prodr'   r+   r+   r-   _prod7  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                      r^   rf   r_   r+   r   rJ   r+   r-   r.   J  s    z_fftn_c2c.<locals>.<lambda>rg   rU   )	r1   r2   r8   r:   rH   rY   rh   r7   r   )r   rJ   rE   rL   r(   r$   r'   r[   r+   r   r-   	_fftn_c2c?  s   	r   r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrM   r   rj   r   r?   r   rJ   r   rL   r(   rE   r'   r+   r+   r-   r   R     r   c                 C   s0   t | ||\}}t| dd}td||||ddS )NTrM   r   Frj   r   r   r+   r+   r-   r   _  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+   rJ   r+   r-   r.   v  rR   zrfftn.<locals>.<lambda>FrM   Trb   rU   )r1   r2   r8   r:   r   r?   rH   rY   rc   r7   r   )rJ   r   rL   r(   rE   outr+   r   r-   r   l  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.     rR   zihfftn.<locals>.<lambda>r   c                   S   r{   )Nz'ihfftn must transform at least one axisr+   r+   r+   r+   r-   r.     r|   FrM   rC   Trb   r0   rU   rg   )r1   r2   r8   r:   r   rD   r?   rH   rY   rc   r7   rX   conj_physicalrh   r   )rJ   r   rL   r(   rE   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.rE   rL   rT   Nru   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>NrC   rB   r0   c                      rO   rP   r+   r+   )rT   r+   r-   r.     rR   )rE   rL   rT   )r   r1   r2   rD   rE   listr   r   )r   rJ   r   rL   rE   Z
shape_listr+   )r   rT   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!   TrM   rS   c                 3   s    | ]} j | V  qd S r   rE   r   r   r+   r-   r     s    zirfftn.<locals>.<genexpr>Frj   )r   r?   rH   rY   rZ   r7   r   )rJ   r   rL   r(   rE   rT   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   TrM   r0   rC   rg   rj   rS   )
r   r?   rH   rD   rY   rh   r7   r   r   rZ   )rJ   r   rL   r(   rE   rT   r   r   r+   r+   r-   r     s   
(
r   rC   c                 C      t jj| |||dS N)r   rL   r(   )r1   r   r   rJ   r   rL   r(   r+   r+   r-   r     rs   r   c                 C   r   r   )r1   r   r   r   r+   r+   r-   r     rs   r   c                 C   r   r   )r1   r   r   r   r+   r+   r-   r     rs   r   c                 C   r   r   )r1   r   r!   r   r+   r+   r-   r      rs   r    c                 C   r   r   )r1   r   r   r   r+   r+   r-   r     rs   r   c                 C   r   r   )r1   r   r   r   r+   r+   r-   r     rs   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   rF   rW   r   r   )rL   r'   r+   r+   r-   _default_alldims%  s
   
r   c                    *   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rJ   rL   r@   shiftr+   r   r-   r"   /     
r"   c                    r   )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  r   r#   )F)NrC   N)NNN)Nr   Nr   )Yr4   typingr   r   r   r   r   r   r   r	   r1   Ztorch._primsZ_primsrY   Ztorch._prims_commonZ_prims_commonr;   Ztorch._decompr
   r   r   r   Ztorch._prims_common.wrappersr   r   __all__ZNormTyper3   Z_opsopsZatenry   boolr7   r8   r<   r?   rH   strr\   re   ri   Zfft_fftr   Zfft_ifftr   Zfft_rfftr   Z	fft_irfftr   Zfft_hfftr   Z	fft_ihfftr   rt   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>   sF   (


	





				
6



						
"