Source code for probnum.filtsmooth.statespace.statespace

"""
Utility functions for state space models.

- generate_*(): generate samples according to continuous-discrete (_cd)
or discrete-discrete (_dd) models
"""

import numpy as np


[docs]def generate_cd(dynmod, measmod, initrv, times, _nsteps=5): """ Samples true states and observations at pre-determined timesteps "times" for a continuous-discrete model. Parameters ---------- dynmod : continuous.ContinuousModel instance Continuous dynamic model. measmod : discrete.DiscreteModel instance Discrete measurement model. initrv : probnum.RandomVariable object Random variable according to initial distribution times : np.ndarray, shape (n,) Timesteps on which the states are to be sampled. Returns ------- states : np.ndarray; shape (len(times), dynmod.dimension) True states according to dynamic model. obs : np.ndarray; shape (len(times)-1, measmod.dimension) Observations according to measurement model. """ states = np.zeros((len(times), dynmod.dimension)) obs = np.zeros((len(times) - 1, measmod.dimension)) states[0] = initrv.sample() for idx in range(1, len(times)): start, stop = times[idx - 1], times[idx] step = (stop - start) / _nsteps next_state_rv, _ = dynmod.transition_realization( real=states[idx - 1], start=start, stop=stop, step=step ) states[idx] = next_state_rv.sample() next_obs_rv, _ = measmod.transition_realization(real=states[idx], start=stop) obs[idx - 1] = next_obs_rv.sample() return states, obs
[docs]def generate_dd(dynmod, measmod, initrv, times): """ Samples true states and observations at pre-determined timesteps "times" for a continuous-discrete model. Parameters ---------- dynmod : discrete.DiscreteModel instance Discrete dynamic model. measmod : discrete.DiscreteModel instance Discrete measurement model. initrv : probnum.RandomVariable object Random variable according to initial distribution times : np.ndarray, shape (n,) Timesteps on which the states are to be sampled. Returns ------- states : np.ndarray; shape (len(times), dynmod.dimension) True states according to dynamic model. obs : np.ndarray; shape (len(times)-1, measmod.dimension) Observations according to measurement model. """ states = np.zeros((len(times), dynmod.dimension)) obs = np.zeros((len(times) - 1, measmod.dimension)) states[0] = initrv.sample() for idx in range(1, len(times)): start, stop = times[idx - 1], times[idx] next_state_rv, _ = dynmod.transition_realization( real=states[idx - 1], start=start, stop=stop ) states[idx] = next_state_rv.sample() next_obs_rv, _ = measmod.transition_realization(real=states[idx], start=stop) obs[idx - 1] = next_obs_rv.sample() return states, obs