o
    pi                     @   s,   d Z ddlmZ dd ZG dd deZdS )zFLibrary for computing the BLEU score

Authors
 * Mirco Ravanelli 2021
    )MetricStatsc                 C   s&   g }| D ]}d |}|| q|S )a  Merge successive words into phrase, putting space between each word

    Arguments
    ---------
    sequences : list
        Each item contains a list, and this list contains a word sequence.

    Returns
    -------
    The list contains phrase sequences.
     )joinappend)	sequencesresultsseqwords r
   T/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/speechbrain/utils/bleu.pymerge_words
   s
   
r   c                   @   s6   e Zd ZdZdddZdddZdd	d
Zdd ZdS )	BLEUStatsa  A class for tracking BLEU (https://www.aclweb.org/anthology/P02-1040.pdf).

    Arguments
    ---------
    merge_words: bool
        Whether to merge the successive words to create sentences.
    max_ngram_order: int
        The maximum length of the ngrams to use for scoring.

    Example
    -------
    >>> bleu = BLEUStats()
    >>> i2l = {0: 'a', 1: 'b'}
    >>> bleu.append(
    ...     ids=['utterance1'],
    ...     predict=[[0, 1, 1]],
    ...     targets=[[[0, 1, 0]], [[0, 1, 1]], [[1, 1, 0]]],
    ...     ind2lab=lambda batch: [[i2l[int(x)] for x in seq] for seq in batch],
    ... )
    >>> stats = bleu.summarize()
    >>> stats['BLEU']
    0.0
    T   c                 C   sV   zddl m} W n ty   td Y nw |   || _||d| _g | _d | _d S )Nr   )BLEUz^Please install sacrebleu (https://pypi.org/project/sacrebleu/) in order to use the BLEU metric)max_ngram_order)	sacrebleu.metricsr   ImportErrorprintclearr   bleupredictstargets)selfr   r   r   r
   r
   r   __init__6   s   
zBLEUStats.__init__Nc                    s   | j |  dur |} fdd|D }| jr%t|}dd |D }| j| | jdu r5|| _dS t| jt|ks@J tt| jD ]}| j| ||  qGdS )aU  Add stats to the relevant containers.
        * See MetricStats.append()
        Arguments
        ---------
        ids : list
            List of ids corresponding to utterances.
        predict : torch.tensor
            A predicted output, for comparison with the target output
        targets : list
            list of references (when measuring BLEU, one sentence could have more
                                than one target translation).
        ind2lab : callable
            Callable that maps from indices to labels, operating on batches,
            for writing alignments.
        Nc                    s   g | ]} |qS r
   r
   .0tind2labr
   r   
<listcomp>Z       z$BLEUStats.append.<locals>.<listcomp>c                 S   s   g | ]}t |qS r
   )r   r   r
   r
   r   r   ^   r    )idsextendr   r   r   lenrange)r   r!   predictr   r   ir
   r   r   r   F   s   

zBLEUStats.appendc                 C   s   | j | j| j}i }|j|d< |j|d< |j|j |d< |j|d< |j|d< |j|d< || _	|| _
| j
d | j
d< |durC| j
| S | j
S )	zaSummarize the BLEU and return relevant statistics.
        * See MetricStats.summarize()
        r   BPratiohyp_lenref_len
precisions
bleu_scoreN)r   corpus_scorer   r   scorebpsys_lenr*   r+   scoressummary)r   fieldr1   detailsr
   r
   r   	summarizeh   s   





zBLEUStats.summarizec                 C   s    | j s|   t| j|d dS )zoWrite all relevant info (e.g., error rate alignments) to file.
        * See MetricStats.write_stats()
        )fileN)r2   r5   r   r1   )r   
filestreamr
   r
   r   write_stats   s   zBLEUStats.write_stats)Tr   )N)__name__
__module____qualname____doc__r   r   r5   r8   r
   r
   r
   r   r      s    


"r   N)r<   speechbrain.utils.metric_statsr   r   r   r
   r
   r
   r   <module>   s    