o
    iq                     @   s@   d dl mZ d dlZd dlmZ d dlmZ G dd deZdS )    )defaultdictN)
AbsEnhLoss)AbsLossWrapperc                       s0   e Zd Zddef fddZi fddZ  ZS )FixedOrderSolver      ?	criterionc                    s   t    || _|| _d S )N)super__init__r   weight)selfr   r
   	__class__ Y/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/enh/loss/wrappers/fixed_order.pyr	   
   s   

zFixedOrderSolver.__init__c                 C   s   t |t |ksJ t |t |ft |}d}tt}t||D ]&\}}|t| ||| 7 }t| jdi  D ]\}	}
||	 	|
 q;q!| D ]\}	}
tj
|
dd ||	< qL| || jj< t|d|d dd}| t|d|ifS )a_  An naive fixed-order solver

        Args:
            ref (List[torch.Tensor]): [(batch, ...), ...] x n_spk
            inf (List[torch.Tensor]): [(batch, ...), ...]

        Returns:
            loss: (torch.Tensor): minimum loss with the best permutation
            stats: dict, for collecting training status
            others: reserved
        g        stats   )dimr   perm)lenr   listziptorchmeanr   getattritemsappendstackdetachnamearange	unsqueezerepeatsizedict)r   refinfothersnum_spklossr   rikvr   r   r   r   forward   s   $"zFixedOrderSolver.forward)r   )__name__
__module____qualname__r   r	   r-   __classcell__r   r   r   r   r   	   s    r   )collectionsr   r   $espnet2.enh.loss.criterions.abs_lossr   %espnet2.enh.loss.wrappers.abs_wrapperr   r   r   r   r   r   <module>   s
    