Ejemplo n.º 1
0
def test_kalman_smoother_high_order_ibm():
    """The highest feasible order (without damping, which we dont use) is 11.

    If this test breaks, someone played with the stable square-root
    implementations in discrete_transition: for instance,
    solve_triangular() and cho_solve() must not be changed to inv()!
    """
    regression_problem, statespace_components = filtsmooth_zoo.car_tracking(
        model_ordint=11,
        timespan=(0.0, 1e-3),
        step=1e-5,
        forward_implementation="sqrt",
        backward_implementation="sqrt",
    )
    truth = regression_problem.solution

    kalman = filtsmooth.Kalman(
        statespace_components["dynamics_model"],
        statespace_components["measurement_model"],
        statespace_components["initrv"],
    )

    posterior, _ = kalman.filtsmooth(regression_problem)

    filtms = posterior.filtering_posterior.states.mean
    smooms = posterior.states.mean

    filtms_rmse = np.mean(np.abs(filtms[:, :2] - truth[:, :2]))
    smooms_rmse = np.mean(np.abs(smooms[:, :2] - truth[:, :2]))
    obs_rmse = np.mean(np.abs(regression_problem.observations - truth[:, :2]))

    assert smooms_rmse < filtms_rmse < obs_rmse
    def test_exactness_linear_model(self, rng):
        """Applied to a linear model, the results should be unchanged."""
        # pylint: disable=not-callable
        regression_problem, info = filtsmooth_zoo.car_tracking(rng=rng)
        linear_model = info["prior_process"].transition
        initrv = info["prior_process"].initrv
        linearised_model = self.linearizing_component(linear_model)

        # Assert that the objects are different
        assert not isinstance(linear_model, type(linearised_model))

        # Assert that the give the same outputs.
        received, info1 = linear_model.forward_rv(initrv, 0.0)
        expected, info2 = linearised_model.forward_rv(initrv, 0.0)

        crosscov1 = info1["crosscov"]
        crosscov2 = info2["crosscov"]
        rtol, atol = 1e-9, 1e-9
        np.testing.assert_allclose(received.mean,
                                   expected.mean,
                                   rtol=rtol,
                                   atol=atol)
        np.testing.assert_allclose(received.cov,
                                   expected.cov,
                                   rtol=rtol,
                                   atol=atol)
        np.testing.assert_allclose(crosscov1, crosscov2, rtol=rtol, atol=atol)
Ejemplo n.º 3
0
def test_kalman_smoother_high_order_ibm(rng):
    """The highest feasible order (without damping, which we dont use) is 11.

    If this test breaks, someone played with the stable square-root implementations in
    discrete_transition: for instance, solve_triangular() and cho_solve() must not be
    changed to inv()!
    """
    regression_problem, info = filtsmooth_zoo.car_tracking(
        rng=rng,
        num_prior_derivatives=11,
        timespan=(0.0, 1e-3),
        step=1e-5,
        forward_implementation="sqrt",
        backward_implementation="sqrt",
    )
    truth = regression_problem.solution

    kalman = filtsmooth.gaussian.Kalman(info["prior_process"])

    posterior, _ = kalman.filtsmooth(regression_problem)

    filtms = posterior.filtering_posterior.states.mean
    smooms = posterior.states.mean

    filtms_rmse = np.mean(np.abs(filtms[:, :2] - truth[:, :2]))
    smooms_rmse = np.mean(np.abs(smooms[:, :2] - truth[:, :2]))
    obs_rmse = np.mean(np.abs(regression_problem.observations - truth[:, :2]))

    assert smooms_rmse < filtms_rmse < obs_rmse
Ejemplo n.º 4
0
    def test_exactness_linear_model(self):
        """Applied to a linear model, the results should be unchanged."""
        # pylint: disable=not-callable
        regression_problem, statespace_components = filtsmooth_zoo.car_tracking(
        )
        linear_model = statespace_components["dynamics_model"]
        initrv = statespace_components["initrv"]
        linearised_model = self.linearising_component_car(linear_model)

        with self.subTest("Different objects"):
            self.assertNotIsInstance(linear_model, type(linearised_model))

        received, info1 = linear_model.forward_rv(initrv, 0.0)
        expected, info2 = linearised_model.forward_rv(initrv, 0.0)
        crosscov1 = info1["crosscov"]
        crosscov2 = info2["crosscov"]
        rtol, atol = 1e-10, 1e-10
        with self.subTest("Same outputs"):
            self.assertAllClose(received.mean,
                                expected.mean,
                                rtol=rtol,
                                atol=atol)
            self.assertAllClose(received.cov,
                                expected.cov,
                                rtol=rtol,
                                atol=atol)
            self.assertAllClose(crosscov1, crosscov2, rtol=rtol, atol=atol)
Ejemplo n.º 5
0
def test_kalman_value_error_repeating_timepoints(rng):
    regression_problem, info = filtsmooth_zoo.car_tracking(
        rng=rng,
        num_prior_derivatives=4,
        timespan=(0.0, 1e-3),
        step=1e-5,
        forward_implementation="sqrt",
        backward_implementation="sqrt",
    )
    kalman = filtsmooth.gaussian.Kalman(info["prior_process"])

    # This should raise a ValueError
    regression_problem.locations[1] = regression_problem.locations[0]

    with pytest.raises(ValueError):
        posterior, _ = kalman.filtsmooth(regression_problem)
Ejemplo n.º 6
0
def test_kalman_multiple_measurement_models(rng):
    regression_problem, info = filtsmooth_zoo.car_tracking(
        rng=rng,
        num_prior_derivatives=4,
        timespan=(0.0, 1e-3),
        step=1e-5,
        forward_implementation="sqrt",
        backward_implementation="sqrt",
    )
    truth = regression_problem.solution
    kalman = filtsmooth.gaussian.Kalman(info["prior_process"])

    posterior, _ = kalman.filtsmooth(regression_problem)

    filtms = posterior.filtering_posterior.states.mean
    smooms = posterior.states.mean

    filtms_rmse = np.mean(np.abs(filtms[:, :2] - truth[:, :2]))
    smooms_rmse = np.mean(np.abs(smooms[:, :2] - truth[:, :2]))
    obs_rmse = np.mean(np.abs(regression_problem.observations - truth[:, :2]))

    assert smooms_rmse < filtms_rmse < obs_rmse
Ejemplo n.º 7
0
def car_tracking3(rng):
    return filtsmooth_zoo.car_tracking(
        rng=rng, measurement_variance=1.23, timespan=(0.2, 10.2), step=0.5
    )
Ejemplo n.º 8
0
def car_tracking2(rng):
    return filtsmooth_zoo.car_tracking(
        rng=rng, measurement_variance=0.5, timespan=(0.1, 10.1), step=0.5
    )
Ejemplo n.º 9
0
def car_tracking1(rng):
    return filtsmooth_zoo.car_tracking(
        rng=rng, measurement_variance=2.0, timespan=(0.0, 10.0), step=0.5
    )
Ejemplo n.º 10
0
def problem(rng):
    """Car-tracking problem."""
    return filtsmooth_zoo.car_tracking(rng=rng)
Ejemplo n.º 11
0
import pytest

from probnum import problems
import probnum.problems.zoo.filtsmooth as filtsmooth_zoo


def rng():
    return np.random.default_rng(seed=123)


# The logistic ODE problem is not random, so it does not get a random number generator.
all_filtmooth_setups = pytest.mark.parametrize(
    "filtsmooth_setup",
    [
        filtsmooth_zoo.benes_daum(rng=rng()),
        filtsmooth_zoo.car_tracking(rng=rng()),
        filtsmooth_zoo.logistic_ode(),
        filtsmooth_zoo.ornstein_uhlenbeck(rng=rng()),
        filtsmooth_zoo.pendulum(rng=rng()),
    ],
)


@all_filtmooth_setups
def test_types(filtsmooth_setup):
    regression_problem, info = filtsmooth_setup
    assert isinstance(regression_problem, problems.TimeSeriesRegressionProblem)
    assert isinstance(regression_problem.observations, np.ndarray)
    assert isinstance(regression_problem.locations, np.ndarray)
    assert isinstance(regression_problem.solution, np.ndarray)
    assert isinstance(info, dict)
import numpy as np
import pytest

import probnum.problems.zoo.filtsmooth as filtsmooth_zoo
from probnum import problems

all_filtmooth_setups = pytest.mark.parametrize(
    "filtsmooth_setup",
    [
        filtsmooth_zoo.benes_daum(),
        filtsmooth_zoo.car_tracking(),
        filtsmooth_zoo.logistic_ode(),
        filtsmooth_zoo.ornstein_uhlenbeck(),
        filtsmooth_zoo.pendulum(),
    ],
)


@all_filtmooth_setups
def test_types(filtsmooth_setup):
    regression_problem, statespace_components = filtsmooth_setup
    assert isinstance(regression_problem, problems.RegressionProblem)
    assert isinstance(regression_problem.observations, np.ndarray)
    assert isinstance(regression_problem.locations, np.ndarray)
    assert isinstance(regression_problem.solution, np.ndarray)
    assert isinstance(statespace_components, dict)
    assert "dynamics_model" in statespace_components
    assert "measurement_model" in statespace_components
    assert "initrv" in statespace_components