import numpy as np

import keras
import keras_retinanet.losses
import pytest


def test_smooth_l1():
    regression = np.array([
        [
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
        ]
    ], dtype=keras.backend.floatx())
    regression = keras.backend.variable(regression)

    regression_target = np.array([
        [
            [0, 0, 0, 1, 1],
            [0, 0, 1, 0, 1],
            [0, 0, 0.05, 0, 1],
            [0, 0, 1, 0, 0],
        ]
    ], dtype=keras.backend.floatx())
    regression_target = keras.backend.variable(regression_target)

    loss = keras_retinanet.losses.smooth_l1()(regression_target, regression)
    loss = keras.backend.eval(loss)

    assert loss == pytest.approx((((1 - 0.5 / 9) * 2 + (0.5 * 9 * 0.05 ** 2)) / 3))
