Source code for opinf.roms._parametric

# roms/_parametric.py
"""Parametric ROM classes."""

__all__ = [
    "ParametricROM",
]

from ..models import _utils as modutils
from ._base import _BaseROM


[docs] class ParametricROM(_BaseROM): r"""Parametric reduced-order model. This class connects classes from the various submodules to form a complete reduced-order modeling workflow. High-dimensional data :math:`\to` transformed / preprocessed data :math:`\to` compressed data :math:`\to` low-dimensional model. Parameters ---------- model : :mod:`opinf.models` object Parametric system model, an instance of one of the following: * :class:`opinf.models.ParametricContinuousModel` * :class:`opinf.models.ParametricDiscreteModel` * :class:`opinf.models.InterpContinuousModel` * :class:`opinf.models.InterpDiscreteModel` lifter : :mod:`opinf.lift` object or None Lifting transformation. transformer : :mod:`opinf.pre` object or None Preprocesser. basis : :mod:`opinf.basis` object or None Dimensionality reducer. ddt_estimator : :mod:`opinf.ddt` object or None Time derivative estimator. Ignored if ``model`` is not time continuous. """ def __init__( self, model, *, lifter=None, transformer=None, basis=None, ddt_estimator=None, ): """Store each argument as an attribute.""" if not modutils.is_parametric(model): raise TypeError("'model' must be a parametric model instance") super().__init__(model, lifter, transformer, basis, ddt_estimator) # Training ----------------------------------------------------------------
[docs] def fit( self, parameters, states, lhs=None, inputs=None, fit_transformer: bool = True, fit_basis: bool = True, ): """Calibrate the model to training data. Parameters ---------- parameters : list of s (floats or (p,) ndarrays) Parameter values for which training data are available. states : list of s (n, k_i) ndarrays State snapshots in the original state space. Each array ``states[i]`` is the data corresponding to parameter value ``parameters[i]``; each column ``states[i][:, j]`` is one snapshot. lhs : list of s (n, k_i) ndarrays or None Left-hand side regression data. Each array ``lhs[i]`` is the data corresponding to parameter value ``parameters[i]``; each column ``lhs[i][:, j]`` corresponds to the snapshot ``states[i][:, j]``. - If the model is time continuous, these are the time derivatives of the state snapshots. - If the model is fully discrete, these are the "next states" corresponding to the state snapshots. If ``None``, these are estimated using :attr:`ddt_estimator` (time continuous) or extracted from ``states`` (fully discrete). inputs : list of s (m, k_i) ndarrays or None Input training data. Each array ``inputs[i]`` is the data corresponding to parameter value ``parameters[i]``; each column ``inputs[i][:, j]`` corresponds to the snapshot ``states[:, j]``. May be a two-dimensional array if :math:`m=1` (scalar input). Only required if one or more model operators depend on inputs. fit_transformer : bool If ``True`` (default), calibrate the preprocessing transformation using the ``states``. If ``False``, assume the transformer is already calibrated. fit_basis : bool If ``True`` (default), calibrate the high-to-low dimensional mapping using the ``states``. If ``False``, assume the basis is already calibrated. Returns ------- self """ self._fit_and_return_training_data( parameters=parameters, states=states, lhs=lhs, inputs=inputs, fit_transformer=fit_transformer, fit_basis=fit_basis, ) return self
# Evaluation --------------------------------------------------------------
[docs] def predict(self, parameter, state0, *args, **kwargs): r"""Evaluate the reduced-order model. Arguments are the same as the ``predict()`` method of :attr:`model`. Parameters ---------- parameter : (p,) ndarray Parameter value :math:`\bfmu`. state0 : (n,) ndarray Initial state, expressed in the original state space. *args : list Other positional arguments to the ``predict()`` method of :attr:`model`. **kwargs : dict Keyword arguments to the ``predict()`` method of :attr:`model`. Returns ------- states: (n, k) ndarray Solution to the model, expressed in the original state space. """ q0_ = self.encode(state0, fit_transformer=False, fit_basis=False) states = self.model.predict(parameter, q0_, *args, **kwargs) return self.decode(states)