Ë
    ýÿæ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)Ú_wip_computeÚ_wip_update)ÚMetric)Ú_MATPLOTLIB_AVAILABLE)Ú_AX_TYPEÚ_PLOT_OUT_TYPEzWordInfoPreserved.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 )ÚWordInfoPreserveda  Word Information Preserved (`WIP`_) is a metric of the performance of an automatic speech recognition system.

    This value indicates the percentage of words that were correctly predicted between a set of ground-
    truth sentences and a set of hypothesis sentences. The higher the value, the better the performance of the ASR
    system with a WordInfoPreserved of 1 being a perfect score. Word Information Preserved rate can then be
    computed as:

    .. math::
        wip = \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:

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

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

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

    FÚis_differentiableÚhigher_is_betterÚfull_state_updateç        Úplot_lower_boundg      ð?Úplot_upper_boundÚerrorsÚpreds_totalÚtarget_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/wip.pyr!   zWordInfoPreserved.__init__M   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WordInfoPreserved.updateV   sE   € ä,7¸¸vÓ,FÑ)ˆ�˜kØ�Š�vÑ�Ø×Ò˜\Ñ)ÕØ×Ò˜KÑ'Ör&   c                 óX   — t        | j                  | j                  | j                  «      S )z)Calculate the Word Information Preserved.)r	   r   r   r   )r#   s    r%   ÚcomputezWordInfoPreserved.compute]   s!   € ä˜DŸK™K¨×):Ñ):¸D×<LÑ<LÓMÐMr&   Ú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 WordInfoPreserved
            >>> metric = WordInfoPreserved()
            >>> 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 WordInfoPreserved
            >>> metric = WordInfoPreserved()
            >>> 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WordInfoPreserved.plota   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î   ø… ñ$ðL $Ð�tÓ#Ø"Ð�dÓ"Ø#Ð�tÓ#Ø!Ð�eÓ!Ø!Ð�eÓ!àƒNØÓØÓðIàðIð 
õIð(˜E # t¨C¡y .Ñ1ð (¸5ÀÀdÈ3ÁiÀÑ;Pð (ÐUYó (ðN˜ó Nð
 _cñ*#Ø˜E &¨(°6Ñ*:Ð":Ñ;Ñ<ð*#ØIQÐRZÑI[ð*#à	÷*#r&   r   N)Úcollections.abcr   Útypingr   r   r   Útorchr   r   Ú torchmetrics.functional.text.wipr	   r
   Útorchmetrics.metricr   Útorchmetrics.utilities.importsr   Útorchmetrics.utilities.plotr   r   Ú__doctest_skip__r   r   r&   r%   Ú<module>rD      s9   ðõ %ß 'Ñ 'ç  ç FÝ &Ý @ß @áØ0Ð1Ðôo#˜õ o#r&   