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)
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
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)
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)
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
def car_tracking3(rng): return filtsmooth_zoo.car_tracking( rng=rng, measurement_variance=1.23, timespan=(0.2, 10.2), step=0.5 )
def car_tracking2(rng): return filtsmooth_zoo.car_tracking( rng=rng, measurement_variance=0.5, timespan=(0.1, 10.1), step=0.5 )
def car_tracking1(rng): return filtsmooth_zoo.car_tracking( rng=rng, measurement_variance=2.0, timespan=(0.0, 10.0), step=0.5 )
def problem(rng): """Car-tracking problem.""" return filtsmooth_zoo.car_tracking(rng=rng)
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