"""Interfaces for Bayesian filtering and smoothing."""
from abc import ABC, abstractmethod
class BayesFiltSmooth(ABC):
"""Bayesian filtering and smoothing."""
def __init__(self, dynamod, measmod, initrv):
self.dynamod = dynamod
self.measmod = measmod
self.initrv = initrv
@abstractmethod
def filter_step(self, start, stop, randvar, data, **kwargs):
"""Filter step.
For e.g. Gaussian filters, this means a prediction step followed
by an update step.
"""
errormsg = (
"filter_step(...) is not implemented for "
+ "the Bayesian filter {}.".format(type(self).__name__)
)
raise NotImplementedError(errormsg)
def smoother_step(self, **kwargs):
"""Smoother step."""
errormsg = (
"smoother_step(...) is not implemented for "
+ "the Bayesian smoother {}.".format(type(self).__name__)
)
raise NotImplementedError(errormsg)
def predict(self, start, stop, randvar, **kwargs):
"""Prediction step of the Bayesian filter.
Not required for all filters, e.g. the Particle Filter only has
an `update()` method.
"""
classname = type(self).__name__
errormsg = (
"predict(...) is not implemented for "
+ "the Bayesian filter {}.".format(classname)
)
raise NotImplementedError(errormsg)
def update(self, time, randvar, data, **kwargs):
"""Update step of the Bayesian filter.
Must be implemented by subclasses.
"""
raise NotImplementedError
@property
def dynamicmodel(self):
"""Convenience function for accessing ``self.dynamod``."""
return self.dynamod
@property
def measurementmodel(self):
"""Convenience function for accessing ``self.measmod``."""
return self.measmod
@property
def initialrandomvariable(self):
"""Convenience function for accessing ``self.initrv``."""
return self.initrv
@property
def initialdistribution(self):
"""Convenience function for accessing ``self.initdist``."""
return self.initrv