
    3j                    t    S SK Jr  S SKrS SKJr  S SKJrJrJrJr  SS	S jjr	 " S S\R                  5      rg)
    )annotationsN)nn)KORNIA_CHECKKORNIA_CHECK_IS_TENSORKORNIA_CHECK_SAME_DEVICEKORNIA_CHECK_SAME_SHAPEc                B   [        U 5        [        U5        [        X5        [        X5        [        US;   SU 35        X-
  S-  S-   R	                  5       S-
  nUS:X  a  UR                  5       nU$ US:X  a  UR                  5       nU$ US:X  d  Uc   U$ [        S5      e)	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 torch.Tensor with shape :math:`(*)`.
    img2: the target torch.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sumnoneNz/Given type of reduction is not supported. Got:    g      ?r
   r   r   zInvalid reduction option.)r   r   r   r   sqrtr
   r   NotImplementedError)img1img2	reductionlosss       S/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/losses/charbonnier.pycharbonnier_lossr      s    T 4 4 D'T(226efoep4q
 [Q$**,s2D Fyy{ K 
e	xxz K 
f		 1 K ""=>>    c                  >   ^  \ rS rSrSrSSU 4S jjjrSS jrSrU =r$ )	CharbonnierLossa   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:
    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 torch.Tensor with shape :math:`(*)`.
    - img2: the target torch.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()

c                .   > [         TU ]  5         Xl        g )N)super__init__r   )selfr   	__class__s     r   r   CharbonnierLoss.__init__   s    "r   c                *    [        XU R                  S9$ )N)r   r   r   )r   r   )r   r   r   s      r   forwardCharbonnierLoss.forward   s    TOOr   )r   r   )r   strreturnNone)r   torch.Tensorr   r'   r%   r'   )	__name__
__module____qualname____firstlineno____doc__r   r!   __static_attributes____classcell__)r   s   @r   r   r   a   s    (T# #P Pr   r   r#   )r   r'   r   r'   r   r$   r%   r'   )
__future__r   torchr   kornia.core.checkr   r   r   r   r   Moduler    r   r   <module>r4      s2   $ #   v uCL0Pbii 0Pr   