o
    oi                     @  s\   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 ddddZG dd deZdS )    )annotations)Tensor)Module)KORNIA_CHECKKORNIA_CHECK_IS_TENSORKORNIA_CHECK_SAME_DEVICEKORNIA_CHECK_SAME_SHAPEnoneimg1r   img2	reductionstrreturnc                 C  s   t |  t | t| | t| | t|dv d|  | | d d  d }|dkr2| }|S |dkr<| }|S |dksD|du rG	 |S td	)
a  Criterion that computes the Charbonnier [2] (aka. L1-L2 [3]) loss.

    According to [1], we compute the Charbonnier loss as follows:

    .. math::

        \text{WL}(x, y) = \sqrt{(x - y)^{2} + 1} - 1

    Where:
       - :math:`x` is the prediction.
       - :math:`y` is the target to be regressed to.

    Reference:
        [1] https://arxiv.org/pdf/1701.03077.pdf
        [2] https://ieeexplore.ieee.org/document/413553
        [3] https://hal.inria.fr/inria-00074015/document
        [4] https://arxiv.org/pdf/1712.05927.pdf

    .. note::
        This implementation follows the formulation by Barron [1]. Other works utilize
        a slightly different implementation (see [4]).

    Args:
        img1: the predicted tensor with shape :math:`(*)`.
        img2: the target tensor with the same shape as img1.
        reduction: Specifies the reduction to apply to the
          output: ``'none'`` | ``'mean'`` | ``'sum'``. ``'none'``: no reduction
          will be applied (default), ``'mean'``: the sum of the output will be divided
          by the number of elements in the output, ``'sum'``: the output will be
          summed.

    Return:
        a scalar with the computed loss.

    Example:
        >>> img1 = torch.randn(2, 3, 32, 32, requires_grad=True)
        >>> img2 = torch.randn(2, 3, 32, 32)
        >>> output = charbonnier_loss(img1, img2, reduction="sum")
        >>> output.backward()

    )meansumr	   Nz/Given type of reduction is not supported. Got:    g      ?r   r   r	   NzInvalid reduction option.)r   r   r   r   sqrtr   r   NotImplementedError)r
   r   r   loss r   M/home/ubuntu/.local/lib/python3.10/site-packages/kornia/losses/charbonnier.pycharbonnier_loss   s$   *

r   c                      s.   e Zd ZdZdd fddZdddZ  ZS )CharbonnierLossa  Criterion that computes the Charbonnier [2] (aka. L1-L2 [3]) loss.

    According to [1], we compute the Charbonnier loss as follows:

    .. math::

        \text{WL}(x, y) = \sqrt{(x - y)^{2} + 1} - 1

    Where:
       - :math:`x` is the prediction.
       - :math:`y` is the target to be regressed to.

    Reference:
        [1] https://arxiv.org/pdf/1701.03077.pdf
        [2] https://ieeexplore.ieee.org/document/413553
        [3] https://hal.inria.fr/inria-00074015/document
        [4] https://arxiv.org/pdf/1712.05927.pdf

    .. note::
        This implementation follows the formulation by Barron [1]. Other works utilize
        a slightly different implementation (see [4]).

    Args:
        reduction: Specifies the reduction to apply to the
          output: ``'none'`` | ``'mean'`` | ``'sum'``. ``'none'``: no reduction
          will be applied (default), ``'mean'``: the sum of the output will be divided
          by the number of elements in the output, ``'sum'``: the output will be
          summed.

    Shape:
        - img1: the predicted tensor with shape :math:`(*)`.
        - img2: the target tensor with the same shape as img1.

    Example:
        >>> criterion = CharbonnierLoss(reduction="mean")
        >>> img1 = torch.randn(2, 3, 32, 2107, requires_grad=True)
        >>> img2 = torch.randn(2, 3, 32, 2107)
        >>> output = criterion(img1, img2)
        >>> output.backward()

    r	   r   r   r   Nonec                   s   t    || _d S )N)super__init__r   )selfr   	__class__r   r   r      s   

zCharbonnierLoss.__init__r
   r   r   c                 C  s   t ||| jdS )N)r
   r   r   )r   r   )r   r
   r   r   r   r   forward   s   zCharbonnierLoss.forwardr	   )r   r   r   r   )r
   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r   `   s    *r   Nr    )r
   r   r   r   r   r   r   r   )
__future__r   torchr   kornia.corer   kornia.core.checkr   r   r   r   r   r   r   r   r   r   <module>   s   F