o
    i&                     @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZzddlm	Z
 ddlmZ W n   ed	 Y 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d1d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 d2d%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/d0Z#dS )3zBeamformer module.    )LooseVersion)Sequence)Tuple)UnionN)
functional)ComplexTensorz$Please install torch_complex firstlyz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   X/home/ubuntu/.local/lib/python3.10/site-packages/funasr/frontends/utils/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_float1   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)   8      r)   Fr   returnc                 C   sP   t | stdt| rtj| ||d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_normC   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>W   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   L   s4   

rA   c                 C   s   t | tr	|  S |  S r   )r
   r   inverse2inverser   r   r   r   rM   o   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   v   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__distutils.versionr   typingr   r   r   r   torch_complexr   r(   torch_complex.tensorr   printfinfor   epsr8   __version__rV   r   Tensorr   r   r   r   r"   r)   r9   rA   rM   rN   rO   rQ   rT   rW   r   r   r   r   <module>   sL    

 	&#
& 