o
    yi                     @   st   d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ G dd	 d	eZd
S )    )AnyListUnion)Tensor)Literal)_ergas_compute_ergas_update)Metric)rank_zero_warn)dim_zero_catc                	       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
 ed< e	e
 ed< 			
ddeeef ded deddf fddZde
de
ddfddZde
fddZ  ZS ))ErrorRelativeGlobalDimensionlessSynthesisa  Calculates `Relative dimensionless global error synthesis`_ (ERGAS) is used to calculate the accuracy of Pan
    sharpened image considering normalized average error of each band of the result image
    (ErrorRelativeGlobalDimensionlessSynthesis).

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

    - ``preds`` (:class:`~torch.Tensor`): Predictions from model
    - ``target`` (:class:`~torch.Tensor`): Ground truth values

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

    - ``ergas`` (:class:`~torch.Tensor`): if ``reduction!='none'`` returns float scalar tensor with average ERGAS
      value over sample else returns tensor of shape ``(N,)`` with ERGAS values per sample

    Args:
        ratio: ratio of high resolution to low resolution
        reduction: a method to reduce metric score over labels.

            - ``'elementwise_mean'``: takes the mean (default)
            - ``'sum'``: takes the sum
            - ``'none'`` or ``None``: no reduction will be applied

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

    Example:
        >>> import torch
        >>> from torchmetrics import ErrorRelativeGlobalDimensionlessSynthesis
        >>> preds = torch.rand([16, 1, 16, 16], generator=torch.manual_seed(42))
        >>> target = preds * 0.75
        >>> ergas = ErrorRelativeGlobalDimensionlessSynthesis()
        >>> torch.round(ergas(preds, target))
        tensor(154.)
    Fhigher_is_betterTis_differentiablefull_state_updatepredstarget   elementwise_meanratio	reduction)r   sumnoneNkwargsreturnNc                    sJ   t  jdi | td | jdg dd | jdg dd || _|| _d S )NzMetric `UniversalImageQualityIndex` will save all targets and predictions in buffer. For large datasets this may lead to large memory footprint.r   cat)defaultdist_reduce_fxr    )super__init__r
   	add_stater   r   )selfr   r   r   	__class__r   L/home/ubuntu/.local/lib/python3.10/site-packages/torchmetrics/image/ergas.pyr   D   s   
z2ErrorRelativeGlobalDimensionlessSynthesis.__init__c                 C   s*   t ||\}}| j| | j| dS )z*Update state with predictions and targets.N)r   r   appendr   r!   r   r   r   r   r$   updateV   s   z0ErrorRelativeGlobalDimensionlessSynthesis.updatec                 C   s&   t | j}t | j}t||| j| jS )z'Computes explained variance over state.)r   r   r   r   r   r   r&   r   r   r$   compute\   s   

z1ErrorRelativeGlobalDimensionlessSynthesis.compute)r   r   )__name__
__module____qualname____doc__r   bool__annotations__r   r   r   r   r   intfloatr   r   r   r'   r(   __classcell__r   r   r"   r$   r      s(   
 "
r   N)typingr   r   r   torchr   typing_extensionsr   #torchmetrics.functional.image.ergasr   r   torchmetrics.metricr	   torchmetrics.utilitiesr
   torchmetrics.utilities.datar   r   r   r   r   r$   <module>   s   