o
    yi                     @   s\   d dl mZmZmZ d dl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SequenceUnionN)Tensortensor)_explained_variance_compute_explained_variance_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	< e	ed
< e	ed< 	dde
deddf fddZde	de	ddfddZdee	ee	 f fddZ  ZS )ExplainedVarianceap  Computes `explained variance`_:

    .. math:: \text{ExplainedVariance} = 1 - \frac{\text{Var}(y - \hat{y})}{\text{Var}(y)}

    Where :math:`y` is a tensor of target values, and :math:`\hat{y}` is a tensor of predictions.

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

    - ``preds`` (:class:`~torch.Tensor`): Predictions from model in float tensor
      with shape ``(N,)`` or ``(N, ...)`` (multioutput)
    - ``target`` (:class:`~torch.Tensor`): Ground truth values in long tensor
      with shape ``(N,)`` or ``(N, ...)`` (multioutput)

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

    - ``explained_variance`` (:class:`~torch.Tensor`): A tensor with the explained variance(s)

    In the case of multioutput, as default the variances will be uniformly averaged over the additional dimensions.
    Please see argument ``multioutput`` for changing this behavior.

    Args:
        multioutput:
            Defines aggregation in the case of multiple output scores. Can be one
            of the following strings (default is ``'uniform_average'``.):

            * ``'raw_values'`` returns full set of scores
            * ``'uniform_average'`` scores are uniformly averaged
            * ``'variance_weighted'`` scores are weighted by their individual variances

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

    Raises:
        ValueError:
            If ``multioutput`` is not one of ``"raw_values"``, ``"uniform_average"`` or ``"variance_weighted"``.

    Example:
        >>> from torchmetrics import ExplainedVariance
        >>> target = torch.tensor([3, -0.5, 2, 7])
        >>> preds = torch.tensor([2.5, 0.0, 2, 8])
        >>> explained_variance = ExplainedVariance()
        >>> explained_variance(preds, target)
        tensor(0.9572)

        >>> target = torch.tensor([[0.5, 1], [-1, 1], [7, -6]])
        >>> preds = torch.tensor([[0, 2], [-1, 2], [8, -5]])
        >>> explained_variance = ExplainedVariance(multioutput='raw_values')
        >>> explained_variance(preds, target)
        tensor([0.9677, 1.0000])
    Tis_differentiablehigher_is_betterFfull_state_updaten_obs	sum_errorsum_squared_error
sum_targetsum_squared_targetuniform_averagemultioutputkwargsreturnNc                    s   t  jdi | d}||vrtd| || _| jdtddd | jdtddd | jdtddd | jd	tddd | jd
tddd d S )N)
raw_valuesr   variance_weightedzFInvalid input to argument `multioutput`. Choose one of the following: r   g        sum)defaultdist_reduce_fxr   r   r   r    )super__init__
ValueErrorr   	add_stater   )selfr   r   allowed_multioutput	__class__r   ^/home/ubuntu/.local/lib/python3.10/site-packages/torchmetrics/regression/explained_variance.pyr   U   s   zExplainedVariance.__init__predstargetc                 C   sT   t ||\}}}}}| j| | _| j| | _| j| | _| j| | _| j| | _dS )z*Update state with predictions and targets.N)r   r   r   r   r   r   )r!   r&   r'   r   r   r   r   r   r   r   r%   updateg   s   zExplainedVariance.updatec                 C   s   t | j| j| j| j| j| jS )z'Computes explained variance over state.)r   r   r   r   r   r   r   )r!   r   r   r%   computep   s   zExplainedVariance.compute)r   )__name__
__module____qualname____doc__r   bool__annotations__r   r   r   strr   r   r(   r   r   r)   __classcell__r   r   r#   r%   r
      s(   
 1"	r
   )typingr   r   r   torchr   r   5torchmetrics.functional.regression.explained_variancer   r   torchmetrics.metricr	   r
   r   r   r   r%   <module>   s   