o
    i.                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z	d dl
mZ d dlmZ e	 	ddededeee  d	eee ef d
ee ddfddZdS )    N)Path)
CollectionOptionalSequenceUnion)check_argument_types)Reporter
output_dirreporterbest_model_criterionnbestsuffixreturnc                    sr  t  sJ t|tr|gnt|tdkr td dg|dur)|d }nd}fdd|D }i }|D ]\}}  fd	dD }	t|	dkrPdg}	|	D ]}
|
dkrYqR|
dkr d \}}| | d
 }| | d| d| d }| s| r|	  |
|j qR| | d| d|
 d| d }td|
 d| d| d|  d} d|
 D ]0\}}||vrtj| | d
 dd||< || }|du r|}q|D ]}|| ||  ||< qq|D ]}t|| jdrq|| |
 ||< qt|| qR| | d| dt|	 d| d }| | d| d| d }| s,| r0|	  |
|j q9dS )a  Generate averaged model from n-best models

    Args:
        output_dir: The directory contains the model file for each epoch
        reporter: Reporter instance
        best_model_criterion: Give criterions to decide the best model.
            e.g. [("valid", "loss", "min"), ("train", "acc", "max")]
        nbest: Number of best model files to be averaged
        suffix: A suffix added to the averaged model file name
    r   z$At least 1 nbest values are required   N. c              	      s>   g | ]\}}} ||r|||||d t  fqS N)hassort_epochs_and_valuesmax).0phkm)nbestsr
    [/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/main_funcs/average_nbest_models.py
<listcomp>,   s    
z(average_nbest_models.<locals>.<listcomp>c                    s   g | ]
}|t  kr|qS r   )len)r   i)epoch_and_valuesr   r   r   4   s    z	epoch.pthz.ave_1best.pthz.ave_zbest.z
Averaging zbest models: criterion="z": cpu)map_locationz	torch.intz.ave.)r   
isinstanceintlistr   warningswarn
is_symlinkexistsunlink
symlink_tonamelogginginfotorchloadstrdtype
startswithsaver   )r	   r
   r   r   r   nbest_epochs_loadedr   cr_nbestsne_opsym_opavgstatesr   r   )r    r   r
   r   average_nbest_models   sp   



 
$rA   r   )r.   r'   pathlibr   typingr   r   r   r   r0   	typeguardr   espnet2.train.reporterr   no_gradr2   r%   rA   r   r   r   r   <module>   s,    
