Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Data Utilities

sindae.data_utils

Containers for multi-trajectory solution data and helpers for extracting and generating training data from solved Pyomo models.

Usage

import numpy as np
from sindae import generate_data, extract_instance_data

# Synthesize noisy observations from a problem whose true output is known
# (requires the problem to implement add_true_output_constraints):
true_data = generate_data(problem, noise_std=np.array([0.05]), obs_every=2, seed=0)

# After any solve, pull the arrays out of the Pyomo model:
data = extract_instance_data(problem, solved_model)

traj0 = data[0]                    # a TrajectoryData
traj0.sampling_times               # (num_t,)
traj0.nn_input, traj0.nn_output    # (num_t, input_dim) / (num_t, output_dim)

data.input_mean, data.input_std    # normalization stats across all trajectories
data.output_mean, data.output_std

generate_data also populates problem.obs_times / problem.obs_values in place, so the same problem is ready to hand to the smoother and training routines.

API reference

TrajectoryData

class TrajectoryData(
    sampling_times: np.ndarray,
    nn_input: np.ndarray,
    nn_output: np.ndarray,
    obs: np.ndarray,
    aux_vars: Optional[np.ndarray] = None,
)

Fields

InstanceData

class InstanceData(trajectories: List[TrajectoryData])

Container for multi-trajectory solution data extracted from a solved Pyomo model.

Per-trajectory data lives in TrajectoryData objects (accessible via indexing). Normalization statistics (input_mean/std, output_mean/std) are computed on the fly from the stored nn_input / nn_output arrays across all trajectories.

Note: obs is stored in original (un-normalised) space. Obs normalisation statistics are available via problem.obs_mean / problem.obs_std.

Parameters

Properties

Methods

append_trajectory

append_trajectory(traj_data: TrajectoryData) -> None

Parameters

save_to_file

save_to_file(filename: str) -> None

Parameters

load_from_file

load_from_file(filename: str) -> InstanceData

Parameters

Returns

NormStats

class NormStats(
    input_mean: np.ndarray,
    input_std: np.ndarray,
    output_mean: np.ndarray,
    output_std: np.ndarray,
)

The four normalization vectors solve_inference consumes.

An :class:InstanceData exposes the same four attributes as properties; NormStats is the lightweight stand-in restored by HybridDAE.load, which persists the scaler but not the full training trajectories. Anywhere an InstanceData is used only for normalization statistics (e.g. make_inference_model), a NormStats is a drop-in replacement.

Fields

extract_instance_data

extract_instance_data(problem, model: pyo.ConcreteModel) -> InstanceData

Extract trajectory data from a solved Pyomo model.

Iterates over model.traj_set, calling problem.get_input_vars, get_output_vars, get_obs_vars, and (if non-empty) get_aux_vars at each time point.

Parameters

Returns

generate_data

generate_data(
    problem: ProblemDefinition,
    obs_every: int = 1,
    seed: int = 0,
    noise_std: Optional[np.ndarray] = None,
    solver_options: Optional[dict] = None,
    nlp_solver: str = 'pounce',
    tee: bool = False,
) -> InstanceData

Solve the true model for all trajectories and populate problem with data.

Builds a Pyomo model using problem.build_trajectory + problem.add_true_output_constraints + problem.discretize, solves with POUNCE, then:

Parameters

Returns