Source code for training_ml_control.models.dmd

import re

import numpy as np
from casadi import constpow
from do_mpc.model import Model

__all__ = ["build_dmd_model"]


[docs] def build_dmd_model(dmd_model) -> Model: model = Model("continuous") variable_regex = re.compile(r"x\d+") feature_regex = re.compile(r"([xu]\d+)(\^(\d+))?") # Declare model state variables variables = dict() for feature_name in dmd_model.get_feature_names(): for match in re.finditer(variable_regex, feature_name): variable_name = match.group() if variable_name in variables: continue variables[variable_name] = model.set_variable( var_type="_x", var_name=variable_name ) # Declare model input variables inputs = [] for i in range(dmd_model.B.shape[1]): variable_name = f"u{i}" inputs.append(model.set_variable(var_type="_u", var_name=variable_name)) inputs = np.asarray(inputs) features = [] for feature in dmd_model.get_feature_names(): if feature == "1": features.append(1.0) continue matches = feature_regex.findall(feature) feature_expression = 1.0 for match in matches: variable_name, _, power = match if not power: feature_expression *= variables[variable_name] else: feature_expression *= constpow(variables[variable_name], int(power)) features.append(feature_expression) features = np.asarray(features) equations = dmd_model.A @ features + dmd_model.B @ inputs equations = dmd_model.C @ equations for i, equation in enumerate(equations): model.set_rhs(f"x{i}", equation) model.setup() return model