o
    ¡¿¯i<  ã                	   @   sú   d Z zddlmZ W n eegy   ddlmZ Y nw ddlmZ ddl	Z	ee	j
ƒedƒkZesCzddlZW n eyB   edƒ‚w esPdd	d
„Zddd„ZnddlZ	dd
„ Zdd„ Zeskdd„ Zdd„ Zdd„ Zndd„ Zdd„ Zdd„ Zdd„ ZdS )zÖ
This file implements a number of wrappers for pytorch functions
whose API differs in older versions.
- rfft
- irfft
- solve
- division of complex by real
- einsum
For torch<=1.5 the torch_complex library is used.
é    )ÚVersion)ÚLooseVersion)ÚComplexTensorNz1.8.0zgWhen using torch<=1.7, the package torch_complex is required. Install it as `pip install torch_complex`éÿÿÿÿc                 C   s   |   |d¡} |d ur0|| jd kr!tjj | d|| jd  f¡} n|| jd k r0| dd |…f } t | d¡} t | d | d ¡} |   |d¡} | S )Nr   r   .é   ©.r   ).r   )	Ú	transposeÚshapeÚtorchÚnnÚ
functionalÚpadÚrfftÚtorch_complexr   )ÚxÚnÚdim© r   úU/home/ubuntu/.local/lib/python3.10/site-packages/fast_bss_eval/torch/compatibility.pyr   5   s    r   c                 C   sü   |   |d¡} t| tjƒrtj| j| jfdd} ntj| |  | j	¡fdd} |d urat 
|g¡}|d d }|| j	d k rH| dd |…d d …f } n&|| j	d kr`tjj | d|| j	d  ddf¡} nt 
| j	d d d g¡}tj| d|d} |   |d¡} | S )	Nr   ©r   é   r   éþÿÿÿ.r   )Úsignal_sizes)r   Ú
isinstancer   r   r
   ÚstackÚrealÚimagÚ	new_zerosr	   ÚSizer   r   r   Úirfft)r   r   r   r   Ún_freqr   r   r   r   G   s    "€r   c                  O   ó   t jj| i |¤ŽS ©N)r
   Úfftr   ©ÚargsÚkwargsr   r   r   r   g   ó   c                 O   s4   | j tjtjfvr| d } tjj| g|¢R i |¤ŽS )Ny                )Údtyper
   Ú	complex64Ú
complex128r#   r   )r   r%   r&   r   r   r   r   j   s   c                 C   s<   |j | j d k}|r|d }t || ¡\}}|r|d }|S )Nr   ).Nr   )Úndimr
   Úsolve)ÚAÚbÚpad_br   Ú_r   r   r   r,   u   s   r,   c                 C   s   t | tjƒr
|  ¡ S t | ¡S r"   )r   r   r   Úinverser
   )r-   r   r   r   Úinv   s   
r2   c                 G   s4   t |d tjƒrtj| g|¢R Ž S tj| g|¢R Ž S )Nr   )r   r   r   Úeinsumr
   )ÚexprÚoperandsr   r   r   r3   ‡   s   r3   c                  O   r!   r"   )r
   Úlinalgr,   r$   r   r   r   r,      r'   c                  O   r!   r"   )r
   r6   r2   r$   r   r   r   r2   ’   r'   c                  O   s   t j| i |¤ŽS r"   )r
   r3   r$   r   r   r   r3   •   s   c                 C   sp   t  | |j|j¡}t  | |j|j¡}t  | |j|j¡}t  | |j|j¡}t j|| || gdd}t  |¡}|S )Nr   r   )r
   r3   r   r   r   Úview_as_complex)r4   Úop1Úop2ÚrrÚriÚirÚiiÚresr   r   r   Úeinsum_complex™   s   
r?   )Nr   )Ú__doc__Úpackaging.versionr   ÚImportErrorÚModuleNotFoundErrorÚdistutils.versionr   r   r   r
   Ú__version__Úis_torch_1_8_plusr   r   Ú	torch.fftr,   r2   r3   r?   r   r   r   r   Ú<module>   s>   
ÿÿÿ
	
