Skip to content

otf.system.linear_nonlinear

Helpers for systems with a separable linear and nonlinear part.

This module provides mixins and concrete System_* subclasses for ODEs that can be written as L(c) * state + N(c, state) where a parameter-dependent linear operator multiplies the state and a separate nonlinear function provides the remaining dynamics.

Classes:

Name Description
System_LinearNonlinear_ModelKnown

Concrete system: known true-model with separable linear/nonlinear parts.

System_LinearNonlinear_ModelUnknown

Concrete system: unknown true-model, only assimilated parts provided.

System_LinearNonlinear_ModelKnown

System_LinearNonlinear_ModelKnown(
    mu: float,
    gs: jndarray,
    cs: jndarray,
    observed_mask: jndarray,
    linear_assimilated: Callable[[jndarray], jndarray],
    nonlinear_assimilated_ode: Callable[
        [jndarray, jndarray], jndarray
    ],
    linear_true: Callable[[jndarray], jndarray],
    nonlinear_true_ode: Callable[
        [jndarray, jndarray], jndarray
    ],
    complex_differentiation: bool = False,
    true_observed_mask: jndarray | None = None,
)

Bases: _AssimilatedLinearNonlinearMixin, _TrueLinearNonlinearMixin, System_ModelKnown

Concrete system: known true-model with separable linear/nonlinear parts.

The class constructs compatible assimilated and true ODEs from provided linear and nonlinear component callables.

Source code in src/otf/system/linear_nonlinear.py
def __init__(
    self,
    mu: float,
    gs: jndarray,
    cs: jndarray,
    observed_mask: jndarray,
    linear_assimilated: Callable[[jndarray], jndarray],
    nonlinear_assimilated_ode: Callable[[jndarray, jndarray], jndarray],
    linear_true: Callable[[jndarray], jndarray],
    nonlinear_true_ode: Callable[[jndarray, jndarray], jndarray],
    complex_differentiation: bool = False,
    true_observed_mask: jndarray | None = None,
):
    self._set_assimilated_parts(
        linear_assimilated, nonlinear_assimilated_ode
    )
    assimilated_ode = self._define_ode(
        self.linear_assimilated, self.nonlinear_assimilated_ode
    )
    self._set_true_parts(linear_true, nonlinear_true_ode)
    true_ode = self._define_ode(linear_true, nonlinear_true_ode)
    super().__init__(
        mu,
        gs,
        cs,
        observed_mask,
        assimilated_ode,
        true_ode,
        complex_differentiation,
        true_observed_mask,
    )

System_LinearNonlinear_ModelUnknown

System_LinearNonlinear_ModelUnknown(
    mu: float,
    cs: jndarray,
    observed_mask: jndarray,
    linear_assimilated: Callable[[jndarray], jndarray],
    nonlinear_assimilated_ode: Callable[
        [jndarray, jndarray], jndarray
    ],
    complex_differentiation: bool = False,
)

Bases: _AssimilatedLinearNonlinearMixin, System_ModelUnknown

Concrete system: unknown true-model, only assimilated parts provided.

Source code in src/otf/system/linear_nonlinear.py
def __init__(
    self,
    mu: float,
    cs: jndarray,
    observed_mask: jndarray,
    linear_assimilated: Callable[[jndarray], jndarray],
    nonlinear_assimilated_ode: Callable[[jndarray, jndarray], jndarray],
    complex_differentiation: bool = False,
):
    self._set_assimilated_parts(
        linear_assimilated, nonlinear_assimilated_ode
    )
    assimilated_ode = self._define_ode(
        self.linear_assimilated, self.nonlinear_assimilated_ode
    )
    super().__init__(
        mu, cs, observed_mask, assimilated_ode, complex_differentiation
    )