o
    rri                     @   s   d Z ddlmZ ddlZddlmZ ddlZddlZddl	Z	ddl
ZddlmZ ddlmZmZ ddlmZ dd	lmZ eeZd
d ZdddZdddZdS )zTest time evaluation, either using the original SDR from [Vincent et al. 2006]
or the newest SDR definition from the MDX 2021 competition (this one will
be reported as `nsdr` for `new sdr`).
    )futuresN)LogProgress   )apply_model)convert_audio
save_audio)distrib)DummyPoolExecutorc                 C   sv   |   dksJ |  dksJ d}tjt| dd}tjt| | dd}||7 }||7 }dt||  }|S )z
    Compute the SDR according to the MDX challenge definition.
    Adapted from AIcrowd/music-demixing-challenge-starter-kit (MIT license)
       gHz>)      dim
   )r   thsumsquarelog10)
references	estimatesdeltanumdenscores r   C/home/ubuntu/.local/lib/python3.10/site-packages/demucs/evaluate.pynew_sdr   s   r   Tc              	   C   s   |  dd } | dd }t|  d  | d  d }|s%d |fS |  } | }tjj| |d||dddd d }||fS )Nr   r   r   F)compute_permutationwindowhopframewise_filtersbsseval_sources_version)	transposedoubler   cpunumpymusevalmetricsbss_eval)r   r   winr   compute_sdr
new_scoresr   r   r   r   
eval_track.   s$   r-   Fc           *         s~  | j }| jd }|jddd | jd }|jddd |jjdu r-tj|jjdgdd}ntj|jjdgdd}|jj}d	}| j	}t
d
|j }	t
d
|j }
ttjt|tj}tt||jjdd}g }|jjrltjnt}||jj}|D ]}|j| tj  }| dkr|d }| | j!}|j"dd}||"  |#  }t$|||j|j%}t&||d |jj'|jj(|jj)dd }||#  |"  }| |}t*fdd|j+D }| dkr|dddf }| |}t$|||j|j%}|jj,r*| jd j- }|jddd t.|j+|D ]\}}t/|0 ||d  |j q|1j-|j2t3|||	|
|df qxtt||jjdd}i }|D ]_\}}|4 }|\}}i ||< t5|j+D ]\}}dt|| gi|| |< q_|dur|\}}}} t5|j+D ]%\}}|| 6 || 6 || 6 | | 6 d}!|| | 7|! qqJi  ttjD ]}" 7t8||" qi }#t9t: ; |j+d  }$|$D ][d}%d}&|j+D ]B fdd < D }'t="|'}(t=>|'})|(|#? d  < |)|#? d d  < |%|(t|j+ 7 }%|&|)t|j+ 7 }&q|%|#? < |&|#? d < q|#W  d   S 1 s8w   Y  dS )z
    Evaluate model using museval.
    compute_sdr=False means using only the MDX definition of the SDR, which
    is much faster to evaluate.
    resultsT)exist_okparentszresults/testNtest)subsetsis_wavFr%   g      ?Eval)updatesnamer   r   r   )shiftssplitoverlapc                    s"   g | ]}t  j| j qS r   )r   
from_numpytargetsaudiot).0r6   )trackr   r   
<listcomp>v   s   " zevaluate.<locals>.<listcomp>r   wavz.mp3)r*   r   r+   z
Eval (BSS)nsdr)SDRSIRISRSARc                    s"   g | ]}t  |   qS r   )np	nanmedian)r>   r?   )
all_tracksmetric_namesourcer   r   r@      s    __med)@argsfoldermkdirr1   nonhqmusdbDBdsetmusdb_sampleratemodelint
samplerateranger   ranklen
world_sizer   loggermisc
num_printsworkersr   ProcessPoolExecutorr	   tracksr   r:   r<   r=   floatr   todevicemeanstdr   audio_channelsr   r7   r8   r9   stacksourcessaver6   zipr   r%   appendsubmitr-   result	enumeratetolistupdatesharenextitervalueskeysrG   medianlower)*solverr+   rN   
output_dirjson_foldertest_setsrc_rateeval_devicerV   r*   r   indexespendingspoolindexmixrefr   r   rO   r6   estimaterb   
track_namependingr   nsdrsidxtargetsdrisrsirsarrv   srcro   metric_namesavgavg_of_mediansmediansrf   rx   r   )rI   rJ   rK   r?   r   evaluateC   s   














&r   )T)F)__doc__
concurrentr   loggingdora.logr   r&   rG   rR   r'   torchr   applyr   r<   r   r    r   utilsr	   	getLogger__name__r]   r   r-   r   r   r   r   r   <module>   s    

