Dynamic API Reference
Contents
Dynamic API Reference#
Complete API reference for NeurEco Dynamic models: ODE and ConvolutiveDynamic.
On this page
Import#
from NeurEco import NeurEcoDynamic as dyn
ODE#
class dyn.ODE
ODE-based model for time-series prediction. Learns hidden states to capture system dynamics.
File extension: .ernn
Constructor#
model = dyn.ODE(dll_path=None)
Parameters:
dll_path(str, optional) — Path to NeurEco binaries
Methods#
build#
status = model.build(config)
Train the ODE model.
Parameters:
config(ODEBuildConfig) — Build configuration
Returns: int — Status code (0 = success)
evaluate#
predictions = model.evaluate(
excitations=None,
init_excitations=None,
init_outputs=None,
*,
time=None,
init_time=None,
)
Run inference on time-series data.
Parameters:
excitations(ndarray or list) — Input/excitation arrays with time in the first column (shape(n_samples, 1 + n_inputs)or a list of such arrays)init_excitations(ndarray or list, optional) — Initialization inputs, time in the first columninit_outputs(ndarray or list, optional) — Initialization outputs, time in the first column (required for explicit init)time(ndarray or list, optional, keyword-only) — Deprecated. Separate time array(s); emits aDeprecatedParameterWarningand returns predictions without a leading time columninit_time(ndarray or list, optional, keyword-only) — Deprecated. Separate initialization time values
Returns: ndarray or list — Predicted outputs, time-first (time in column 0) when excitations carries the time column
Note: If initialization not provided, uses steady-state initialization. The deprecated separate-time form returns predictions without a leading time column.
The 4.x positional call evaluate(time, excitations, init_time, init_excitations, init_outputs) is still accepted for backward compatibility. It emits a DeprecatedParameterWarning and, like the time= keyword form, returns predictions without a leading time column.
compute_error#
error = dyn.ODE.compute_error(predictions, targets)
Compute L2 relative error. Static method.
Parameters:
predictions(ndarray) — Model predictionstargets(ndarray) — Ground truth
Returns: float — L2 relative error
load / save#
model.load(path)
model.save(path)
Load or save model.
Parameters:
path(str) — File path
Returns: int — Status code
get_input_count / get_output_count#
n_inputs = model.get_input_count()
n_outputs = model.get_output_count()
Get number of input (excitation) and output features.
Returns: int
get_state_count#
n_states = model.get_state_count()
Get number of hidden states learned by the model.
Returns: int
get_number_of_init_tsteps#
n_init = model.get_number_of_init_tsteps()
Get number of time steps required for initialization.
Returns: int
get_steady_input / get_steady_output#
steady_in = model.get_steady_input()
steady_out = model.get_steady_output()
Get steady-state input/output values.
Returns: ndarray
sensitivity#
sens = model.sensitivity(
time,
excitations,
id_output,
initialization_time=None,
initialization_excitations=None,
initialization_outputs=None,
)
Compute sensitivity of output with respect to inputs.
Note
Unlike evaluate, sensitivity takes the time as a separate time
argument (it does not use the combined time-in-first-column form).
Parameters:
time(ndarray) — Time arrayexcitations(ndarray) — Excitation (input) arrayid_output(int) — Output index to analyzeinitialization_time/initialization_excitations/initialization_outputs— Optional initialization arrays
Returns: ndarray — Sensitivity values
export_fmu#
status = model.export_fmu(path)
Export to FMU format.
Parameters:
path(str) — Output .fmu file path
Returns: int — Status code
Note
Requires NeurEco Embed license.
get_number_of_networks_from_checkpoint#
n = model.get_number_of_networks_from_checkpoint(path)
Get number of models saved in a checkpoint.
Parameters:
path(str) — Checkpoint path
Returns: int — Number of checkpointed models
load_model_from_checkpoint#
model.load_model_from_checkpoint(path, model_index)
Load a specific model from checkpoint.
Parameters:
path(str) — Checkpoint pathmodel_index(int) — Model index (0-based)
The build log and the GUI number checkpoints from 1: “Checkpoint N” there is model_index N - 1 here.
delete#
model.delete()
Free native memory. Always call when done.
ODEBuildConfig#
# Each array: column 0 = time, remaining columns = excitations / outputs.
config = dyn.ODEBuildConfig(
# Required (time-first arrays)
train_exc_list,
train_out_list,
# Optional (time-first arrays)
valid_exc_list=None,
valid_out_list=None,
test_exc_list=None,
test_out_list=None,
valid_percentage=30,
write_model_to="model",
checkpoint_address="ckpt",
inputs_shifting="mean",
inputs_scaling="l2",
outputs_shifting="mean",
outputs_scaling="l2",
inputs_normalize_per_feature=True,
outputs_normalize_per_feature=True,
steady_state_exc=None,
steady_state_out=None,
min_hidden_states=1,
max_hidden_states=0,
resume=False,
)
Parameters:
Parameter |
Default |
Description |
|---|---|---|
|
(required) |
List of excitation (input) arrays; column 0 is time, remaining columns are inputs |
|
(required) |
List of output arrays; column 0 is time, remaining columns are outputs |
|
|
Validation excitation arrays (time in the first column) |
|
|
Validation output arrays (time in the first column) |
|
|
Validation split (if no validation data) |
|
|
Steady-state input values (1D array) |
|
|
Steady-state output values (1D array) |
|
|
Minimum hidden states |
|
|
Maximum hidden states (0 = no limit) |
|
|
Input shift: |
|
|
Input scale: |
|
|
Output shift (same options as |
|
|
Output scale (same options as |
|
|
Normalize each input feature independently |
|
|
Normalize each output feature independently |
|
|
|
Note
Deprecated separate-time parameters. train_time_list,
valid_time_list and test_time_list (lists of 1-D time arrays passed
alongside pure excitation/output arrays) remain accepted for backward
compatibility but emit a DeprecatedParameterWarning. Prefer placing the
time in the first column of each excitation and output array.
ConvolutiveDynamic#
class dyn.ConvolutiveDynamic
Convolutional Dynamic model for time-series prediction: a convolutional neural network applied to a sliding window of past inputs. In the GUI, this is the CNN Dynamic template.
File extension: .ecnn
Constructor#
model = dyn.ConvolutiveDynamic(dll_path=None)
Methods#
Same methods as ODE, with these additions/differences:
get_window_size#
w_size = model.get_window_size()
Get the window size: the number of time steps the network reads to make one prediction.
Returns: int
Note: Predictions start at time step window_size - 1 (the window provides context for the first prediction).
evaluate#
Same as ODE, but no initialization parameters needed. excitations carries the
time in its first column and predictions are returned time-first:
predictions = model.evaluate(excitations)
The model predicts every time step from the window_size-th one on, whatever the
window_stride used for training.
ConvolutiveDynamicBuildConfig#
# Each array: column 0 = time, remaining columns = excitations / outputs.
config = dyn.ConvolutiveDynamicBuildConfig(
# Required (time-first arrays)
train_exc_list,
train_out_list,
# Optional (same as ODE plus:)
window_size=32,
# ... other parameters same as ODEBuildConfig
)
Additional Parameters:
window_size(int) — Convolution window size, at least 3 (default: 32)window_stride(int) — Training data only: step between two consecutive training windows (default: 1). The model still predicts every time step.resume(bool) —True: continue the build stored incheckpoint_addressinstead of starting a new one (default:False). See Resuming from Checkpoint.
The network architecture parameters (hidden_layer_number, layer_multiplier,
last_layer_grid_number, tol_last_layer) and the padding parameters are
described in Building Convolutional Dynamic Models.
The deprecated train_time_list / valid_time_list / test_time_list
separate-time parameters behave the same way as for ODEBuildConfig.
Important
ConvolutiveDynamic requires uniformly spaced time steps within and across all trajectories. ODE does not have this requirement — its time arrays only need to be sorted in strictly increasing order (non-uniform spacing is allowed).
Example Usage#
ODE Model#
from NeurEco import NeurEcoDynamic as dyn
import numpy as np
# Prepare data (lists of arrays for multiple trajectories, time in column 0)
t = np.arange(0, 10, 0.01)
train_exc = [np.column_stack([t, np.random.randn(1000, 3)])] # time + 3 inputs
train_out = [np.column_stack([t, np.random.randn(1000, 2)])] # time + 2 outputs
# Build
# Each array: column 0 = time, remaining columns = excitations / outputs.
model = dyn.ODE()
config = dyn.ODEBuildConfig(
train_exc_list=train_exc,
train_out_list=train_out,
write_model_to="./ode_model.ernn"
)
model.build(config)
# Evaluate (steady-state init)
# test_exc has time in its first column; predictions are returned time-first.
predictions = model.evaluate(test_exc)
# Evaluate with explicit initialization
n_init = model.get_number_of_init_tsteps()
predictions = model.evaluate(
test_exc[n_init-1:],
init_excitations=test_exc[:n_init],
init_outputs=test_out[:n_init]
)
model.delete()
Convolutional Dynamic Model#
from NeurEco import NeurEcoDynamic as dyn
import numpy as np
# Build
# Each array: column 0 = time, remaining columns = excitations / outputs.
model = dyn.ConvolutiveDynamic()
config = dyn.ConvolutiveDynamicBuildConfig(
train_exc_list=train_exc,
train_out_list=train_out,
window_size=32,
write_model_to="./conv_model.ecnn"
)
model.build(config)
# Evaluate
# test_exc has time in its first column; predictions are returned time-first.
predictions = model.evaluate(test_exc)
# Note: predictions start at time step (window_size - 1)
w_size = model.get_window_size()
aligned_ref = test_out[w_size - 1:]
# compute_error takes outputs only, so drop the leading time column from both.
error = model.compute_error(predictions[:, 1:], aligned_ref[:, 1:])
model.delete()
Parametric ODE Model#
For parameters that stay constant within a trajectory but vary between experiments:
# Replicate constant parameter across all time steps
k_value = 2.5 # Constant parameter
n_steps = 1000
# Create excitation with parametric input (time in column 0)
time_column = np.linspace(0, 10, n_steps)
k_column = np.full(n_steps, k_value)
force_column = np.sin(np.linspace(0, 10, n_steps))
excitation = np.column_stack([time_column, k_column, force_column])
# Build and evaluate as normal