Ë
    ýÿæiï  ã                   óŒ   — d dl mZ d dlmZmZmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZ esdgZ G d	„ d
e«      Zy)é    )ÚSequence)ÚAnyÚOptionalÚUnion)ÚTensorÚtensor)Ú_word_info_lost_computeÚ_word_info_lost_update)ÚMetric)Ú_MATPLOTLIB_AVAILABLE)Ú_AX_TYPEÚ_PLOT_OUT_TYPEzWordInfoLost.plotc                   ó  ‡ — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	e
ed<   dZe
ed	<   eed
<   eed<   eed<   deddfˆ fd„Zdeeee   f   deeee   f   ddfd„Zdefd„Z	 ddeeeee   f      dee   defd„Zˆ xZS )ÚWordInfoLosta  Word Information Lost (`WIL`_) is a metric of the performance of an automatic speech recognition system.

    This value indicates the percentage of words that were incorrectly predicted between a set of ground-truth
    sentences and a set of hypothesis sentences. The lower the value, the better the performance of the ASR system
    with a WordInfoLost of 0 being a perfect score. Word Information Lost rate can then be computed as:

    .. math::
        wil = 1 - \frac{C}{N} + \frac{C}{P}

    where:

        - :math:`C` is the number of correct words,
        - :math:`N` is the number of words in the reference
        - :math:`P` is the number of words in the prediction

    As input to ``forward`` and ``update`` the metric accepts the following input:

    - ``preds`` (:class:`~List`): Transcription(s) to score as a string or list of strings
    - ``target`` (:class:`~List`): Reference(s) for each speech input as a string or list of strings

    As output of ``forward`` and ``compute`` the metric returns the following output:

    - ``wil`` (:class:`~torch.Tensor`): A tensor with the Word Information Lost score

    Args:
        kwargs: Additional keyword arguments, see :ref:`Metric kwargs` for more info.

    Examples:
        >>> from torchmetrics.text import WordInfoLost
        >>> preds = ["this is the prediction", "there is an other sample"]
        >>> target = ["this is the reference", "there is another one"]
        >>> wil = WordInfoLost()
        >>> wil(preds, target)
        tensor(0.6528)

    FÚis_differentiableÚhigher_is_betterÚfull_state_updateç        Úplot_lower_boundg      ð?Úplot_upper_boundÚerrorsÚtarget_totalÚpreds_totalÚkwargsÚreturnNc                 óÒ   •— t        ‰| �  di |¤Ž | j                  dt        d«      d¬«       | j                  dt        d«      d¬«       | j                  dt        d«      d¬«       y )Nr   r   Úsum)Údist_reduce_fxr   r   © )ÚsuperÚ__init__Ú	add_stater   )Úselfr   Ú	__class__s     €új/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torchmetrics/text/wil.pyr!   zWordInfoLost.__init__L   sW   ø€ ô 	‰ÑÑ"˜6Ò"Ø�‰�x¤¨£¸UˆÔCØ�‰�~¤v¨c£{À5ˆÔIØ�‰�}¤f¨S£kÀ%ˆÕHó    ÚpredsÚtargetc                 ó¢   — t        ||«      \  }}}| xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        y)z*Update state with predictions and targets.N)r
   r   r   r   )r#   r'   r(   r   r   r   s         r%   ÚupdatezWordInfoLost.updateU   sE   € ä,BÀ5È&Ó,QÑ)ˆ�˜kØ�Š�vÑ�Ø×Ò˜\Ñ)ÕØ×Ò˜KÑ'Ör&   c                 óX   — t        | j                  | j                  | j                  «      S )z$Calculate the Word Information Lost.)r	   r   r   r   )r#   s    r%   ÚcomputezWordInfoLost.compute\   s!   € ä& t§{¡{°D×4EÑ4EÀt×GWÑGWÓXÐXr&   ÚvalÚaxc                 ó&   — | j                  ||«      S )aÈ  Plot a single or multiple values from the metric.

        Args:
            val: Either a single result from calling `metric.forward` or `metric.compute` or a list of these results.
                If no value is provided, will automatically call `metric.compute` and plot that result.
            ax: An matplotlib axis object. If provided will add plot to that axis

        Returns:
            Figure and Axes object

        Raises:
            ModuleNotFoundError:
                If `matplotlib` is not installed

        .. plot::
            :scale: 75

            >>> # Example plotting a single value
            >>> from torchmetrics.text import WordInfoLost
            >>> metric = WordInfoLost()
            >>> preds = ["this is the prediction", "there is an other sample"]
            >>> target = ["this is the reference", "there is another one"]
            >>> metric.update(preds, target)
            >>> fig_, ax_ = metric.plot()

        .. plot::
            :scale: 75

            >>> # Example plotting multiple values
            >>> from torchmetrics.text import WordInfoLost
            >>> metric = WordInfoLost()
            >>> preds = ["this is the prediction", "there is an other sample"]
            >>> target = ["this is the reference", "there is another one"]
            >>> values = [ ]
            >>> for _ in range(10):
            ...     values.append(metric(preds, target))
            >>> fig_, ax_ = metric.plot(values)

        )Ú_plot)r#   r-   r.   s      r%   ÚplotzWordInfoLost.plot`   s   € ðT �z‰z˜#˜rÓ"Ð"r&   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚboolÚ__annotations__r   r   r   Úfloatr   r   r   r!   r   ÚstrÚlistr*   r,   r   r   r   r   r1   Ú__classcell__)r$   s   @r%   r   r      sî   ø… ñ#ðJ $Ð�tÓ#Ø"Ð�dÓ"Ø#Ð�tÓ#Ø!Ð�eÓ!Ø!Ð�eÓ!àƒNØÓØÓðIàðIð 
õIð(˜E # t¨C¡y .Ñ1ð (¸5ÀÀdÈ3ÁiÀÑ;Pð (ÐUYó (ðY˜ó Yð
 _cñ*#Ø˜E &¨(°6Ñ*:Ð":Ñ;Ñ<ð*#ØIQÐRZÑI[ð*#à	÷*#r&   r   N)Úcollections.abcr   Útypingr   r   r   Útorchr   r   Ú torchmetrics.functional.text.wilr	   r
   Útorchmetrics.metricr   Útorchmetrics.utilities.importsr   Útorchmetrics.utilities.plotr   r   Ú__doctest_skip__r   r   r&   r%   Ú<module>rD      s9   ðõ %ß 'Ñ 'ç  ç \Ý &Ý @ß @áØ+Ð,Ðôn#�6õ n#r&   