o
    yiv                     @   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DictOptional)Tensortensor)_perplexity_compute_perplexity_update)Metricc                       s|   e Zd ZU dZdZdZdZeed< eed< 	dde	e
 deeef f fd	d
ZdededdfddZdefddZ  ZS )
Perplexitya  Perplexity measures how well a language model predicts a text sample. It's calculated as the average number
    of bits per word a model needs to represent the sample.

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

    - ``preds`` (:class:`~torch.Tensor`): Probabilities assigned to each token in a sequence with shape
        [batch_size, seq_len, vocab_size]
    - ``target`` (:class:`~torch.Tensor`): Ground truth values with a shape [batch_size, seq_len]

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

    - ``perp`` (:class:`~torch.Tensor`): A tensor with the perplexity score

    Args:
        ignore_index: Integer specifying a target class to ignore.
            If given, this class index does not contribute to the returned score.
        kwargs:
            Additional keyword arguments, see :ref:`Metric kwargs` for more info.

    Examples:
        >>> import torch
        >>> preds = torch.rand(2, 8, 5, generator=torch.manual_seed(22))
        >>> target = torch.randint(5, (2, 8), generator=torch.manual_seed(22))
        >>> target[0, 6:] = -100
        >>> perp = Perplexity(ignore_index=-100)
        >>> perp(preds, target)
        tensor(5.2545)
    TFtotal_log_probscountNignore_indexkwargsc                    sd   t  jdi | |d urt|tstd| || _| jdtddd | jdtddd d S )NzIArgument `ignore_index` expected to either be `None` or an `int` but got r   g        sum)defaultdist_reduce_fxr    )super__init__
isinstanceint
ValueErrorr   	add_stater   )selfr   r   	__class__r   P/home/ubuntu/.local/lib/python3.10/site-packages/torchmetrics/text/perplexity.pyr   :   s   zPerplexity.__init__predstargetreturnc                 C   s2   t ||| j\}}|  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   updateF   s   zPerplexity.updatec                 C   s   t | j| jS )zCompute the Perplexity.)r   r   r   )r   r   r   r   computeL   s   zPerplexity.compute)N)__name__
__module____qualname____doc__is_differentiablehigher_is_betterfull_state_updater   __annotations__r   r   r   strr   r   r    r!   __classcell__r   r   r   r   r
      s   
 
r
   N)typingr   r   r   torchr   r   'torchmetrics.functional.text.perplexityr   r   torchmetrics.metricr	   r
   r   r   r   r   <module>   s
   