o
    yi$                     @   sT   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 G dd deZdS )    )AnyListUnion)Tensortensor)_wip_compute_wip_update)Metricc                       s   e Zd ZU dZ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
f fd
dZdeeee f deeee f ddfddZde	fddZ  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 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errorspreds_totaltarget_totalkwargsc                    sR   t  jdi | | jdtddd | jdtddd | jdtddd d S )Nr   g        sum)dist_reduce_fxr   r    )super__init__	add_stater   )selfr   	__class__r   I/home/ubuntu/.local/lib/python3.10/site-packages/torchmetrics/text/wip.pyr   C   s   zWordInfoPreserved.__init__predstargetreturnNc                 C   s>   t ||\}}}|  j|7  _|  j|7  _|  j|7  _dS )z*Update state with predictions and targets.N)r   r   r   r   )r   r   r   r   r   r   r   r   r   updateL   s   zWordInfoPreserved.updatec                 C   s   t | j| j| jS )z)Calculate the Word Information Preserved.)r   r   r   r   )r   r   r   r   computeS   s   zWordInfoPreserved.compute)__name__
__module____qualname____doc__r   bool__annotations__r   r   r   r   r   r   strr   r   r    __classcell__r   r   r   r   r
      s   
 #.	r
   N)typingr   r   r   torchr   r    torchmetrics.functional.text.wipr   r   torchmetrics.metricr	   r
   r   r   r   r   <module>   s
   