"""Stopping criteria for iterated filtering and smoothing."""
import numpy as np
from probnum import StoppingCriterion
class FiltSmoothStoppingCriterion(StoppingCriterion):
"""Stop iteration if absolute and relative tolerance are reached."""
def __init__(self, atol=1e-3, rtol=1e-6, maxit=1000):
self.atol = atol
self.rtol = rtol
self.maxit = maxit
self.iterations = 0
[docs] def __call__(self, error, reference):
"""Decide whether the stopping criterion is satisfied, which implies terminating
of the iteration.
If the error is sufficiently small (with respect to atol, rtol and the
reference), return True. Else, return False. Throw a runtime error if the
maximum number of iterations is reached.
"""
if self.iterations > self.maxit:
errormsg = f"Maximum number of iterations (N={self.maxit}) reached."
raise RuntimeError(errormsg)
magnitude = self.evaluate_error(error=error, reference=reference)
if magnitude > 1:
self.iterations += 1
return False
self.iterations = 0
return True
[docs] def evaluate_error(self, error, reference):
"""Compute the normalised error."""
normalisation = self.atol + self.rtol * reference
magnitude = np.sqrt(np.mean((error / normalisation) ** 2))
return magnitude