o
    i_                     @   s  d Z ddl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 eejjZeejedkZeejedkZd	eejef d
eejejf fddZdd Zdd Zdd Zdd Zdeeeejf  fddZ	d.deejef dejfddZdd Zdeejef deejef fd d!Zd"eejef d#eejef deejef fd$d%Zd"eejef fd&d'Z d/d"eejef fd(d)Z!d#eejef d"eejef fd*d+Z"deeeejf  fd,d-Z#dS )0zBeamformer module.    )SequenceTupleUnionN)parse)
functional)ComplexTensorz1.8.0z1.9.0ref	real_imagc                 C   s,   t | tr	t| S t| rtj| S td)Nz?Please update your PyTorch version to 1.9+ for complex support.)
isinstancer   is_torch_complex_tensortorchcomplex
ValueError)r   r	    r   T/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/enh/layers/complex_utils.pynew_complex_like   s   

r   c                 C   s   t | t otot| S N)r
   r   is_torch_1_9_plusr   
is_complexcr   r   r   r      s   r   c                 C   s   t | tpt| S r   )r
   r   r   r   r   r   r   r   "   s   r   c                 C   .   t | tstrt| r| jtjdS |  S Ndtype)r
   r   r   r   r   to
complex128doubler   r   r   r   	to_double&      r   c                 C   r   r   )r
   r   r   r   r   r   	complex64floatr   r   r   r   to_float-   r   r"   seqc                 O   T   t | ttfstdt | d trtj| g|R i |S tj| g|R i |S )NzKcat(): argument 'tensors' (position 1) must be tuple of Tensors, not Tensorr   )r
   listtuple	TypeErrorr   FCcatr   r#   argskwargsr   r   r   r)   4      r)   Fr   returnc                 C   sz   t | stdt| rtj| ||dS |d u r)t| jd | jd   t	 S t| jd | jd  j||dt	 S )NzInput is not a complex tensor.)dimkeepdim   )
r   r'   r   r   normsqrtrealimagsumEPS)r   r0   r1   r   r   r   complex_norm@   s   " r9   c           	         s|  t |dkr't|d ttfr|d }t|d trtnt}|j| g|R  S t |dkrY|d  t fdd|dd  D }|rUt trJtjntj}|| g|R  S t	d|\}}t|tsgt|trnt| ||S t
rt|szt|rt|st| ||j}t| ||j}t||S t|st| |j|}t| |j|}t||S t| ||S t| ||S )N   r   r2   c                 3   s    | ]	}|j  j kV  qd S r   r   ).0opop0r   r   	<genexpr>[   s    zeinsum.<locals>.<genexpr>z,0 or More than 2 operands are not supported.)lenr
   r&   r%   r   r(   r   einsumallr   r   r   r5   r6   r   )	equationoperandscomplex_module	same_type_einsumabo_realo_imagr   r=   r   rA   P   s4   

rA   c                 C   s   t | tr	|  S |  S r   )r
   r   inverse2inverser   r   r   r   rM   s   s   
rM   rH   rI   c                 C   s   t | ts
t |trt| |S trTt| st|rTt| s5t| |j}t| |j}t	||S t|sNt| j|}t| j|}t	||S t| |S t| |S r   )
r
   r   r(   matmulr   r   r   r5   r6   r   )rH   rI   rJ   rK   r   r   r   rN   |   s   

rN   c                 C   s
   t | S r   )r(   trace)rH   r   r   r   rO      s   
rO   c                 C   s(   t | trtj| |dS tj| |fdS )N)r0   )dims)r
   r   r(   reverser   flip)rH   r0   r   r   r   rQ      s   
rQ   c                 C   s   t |ts
t | tr#t |trt | trtj| |ddS tt|| S trGt|s/t| rGt|r@t| r@tj	|| S tt|| S t
rPtj	|| S t| |d S )z!Solve the linear equation ax = b.F)	return_LUr   )r
   r   r(   solverN   rM   r   r   r   linalgis_torch_1_8_plus)rI   rH   r   r   r   rT      s   rT   c                 O   r$   )NzMstack(): argument 'tensors' (position 1) must be tuple of Tensors, not Tensorr   )r
   r%   r&   r'   r   r(   stackr   r*   r   r   r   rW      r-   rW   )r.   F)r   )$__doc__typingr   r   r   r   packaging.versionr   Vtorch_complexr   r(   torch_complex.tensorr   finfor   epsr8   __version__rV   r   Tensorr   r   r   r   r"   r)   r9   rA   rM   rN   rO   rQ   rT   rW   r   r   r   r   <module>   sT    

#
	
& 