Combining ExperimentData objects
The previous sections demonstrate how we can add data from an ODEProblem, FMU or a Dataset source in order to produce an ExperimentData
object that would be used to train a DigitalEcho. In some scenarios, the complete data can come from multiple sources such as a combination of a Dataset and simulations from either ODEProblem
or FMUs. In such a scenario, we would want to combine both the sources into a single ExperimentData
object.
For this demonstration, we will use the dataset from the Including Data from a Dataset manual and combine it with simulations from an ODEProblem source.
using JuliaHub, JLSO, DataGeneration
using OrdinaryDiffEq
We start by downloading the dataset, and loading it into an ExperimentData
.
train_dataset_name = "robertson"
path_to_dataset = JuliaHub.download_dataset(("juliasimtutorials", train_dataset_name), "path to save");
train_data = JLSO.load(path_to_dataset)[:result]
ed_dataset = ExperimentData(train_data)
Number of Trajectories in ExperimentData: 100
Basic Statistics for Given Dynamical System's Specifications
Number of u0s in the ExperimentData: 3
Number of ps in the ExperimentData: 3
╭─────────┬──────────────────────────────────────────────────────────────────...
────╮...
│ Field │...
│...
├─────────┼──────────────────────────────────────────────────────────────────...
────┤...
│ │ ╭────────────┬──────────────┬──────────────┬────────┬─────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├────────────┼──────────────┼──────────────┼────────┼─────────...
│ │ │ states_1 │ 1.0 │ 1.0 │ 1.0 │ 0.0...
│ u0s │ ├────────────┼──────────────┼──────────────┼────────┼─────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ ├────────────┼──────────────┼──────────────┼────────┼─────────...
│ │ │ states_3 │ 0.0 │ 0.0 │ 0.0 │ 0.0...
│ │ ╰────────────┴──────────────┴──────────────┴────────┴─────────...
├─────────┼──────────────────────────────────────────────────────────────────...
────┤...
│ │ ╭──────────┬──────────────┬──────────────┬─────────────┬────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├──────────┼──────────────┼──────────────┼─────────────┼────────...
│ │ │ p_1 │ 0.036 │ 0.044 │ 0.04 │...
│ ps │ ├──────────┼──────────────┼──────────────┼─────────────┼────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ ├──────────┼──────────────┼──────────────┼─────────────┼────────...
│ │ │ p_3 │ 9015.625 │ 10992.188 │ 10007.188 │ 581.41...
│ │ ╰──────────┴──────────────┴──────────────┴─────────────┴────────...
╰─────────┴──────────────────────────────────────────────────────────────────...
────╯...
Basic Statistics for Given Dynamical System's Continuous Fields
Number of states in the ExperimentData: 3
╭──────────┬─────────────────────────────────────────────────────────────────...
──╮...
│ Field │...
│...
├──────────┼─────────────────────────────────────────────────────────────────...
──┤...
│ │ ╭────────────┬──────────────┬──────────────┬─────────┬─────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ states_1 │ 0.081 │ 1.0 │ 0.587 │ 0.299...
│ states │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ states_3 │ 0.0 │ 0.919 │ 0.413 │ 0.299...
│ │ ╰────────────┴──────────────┴──────────────┴─────────┴─────────...
╰──────────┴─────────────────────────────────────────────────────────────────...
──╯...
Now we simulate the Robertson model using an ODEProblem.
function rober(u, p, t)
y₁, y₂, y₃ = u
k₁, k₂, k₃ = p
[-k₁ * y₁ + k₃ * y₂ * y₃;
k₁ * y₁ - k₂ * y₂^2 - k₃ * y₂ * y₃;
k₂ * y₂^2]
# nothing
end
u0 = [1.0, 0.0, 0.0]
tspan = (0.0, 1e4)
rober_prob = ODEProblem{false}(rober, u0, tspan)
ODEProblem with uType Vector{Float64} and tType Float64. In-place: false
timespan: (0.0, 10000.0)
u0: 3-element Vector{Float64}:
1.0
0.0
0.0
Note that we use the same labels for parameters, that have been used by the dataset.
params_labels = train_data["params_labels"]
3-element Vector{String}:
"p_1"
"p_2"
"p_3"
p_lb = [0.036, 2.7e7, 0.9e4]
p_ub = [0.044, 3.3e7, 1.1e4]
nsamples = 50
param_space = ParameterSpace(p_lb, p_ub, nsamples; labels = params_labels)
3 dimensional ParameterSpace with 50 samples
╭──────────────────┬──────────────────────────────────────────────┬──────────...
─────────╮...
│ Space Type │ Statistics │ Number...
of Samples │...
├──────────────────┼──────────────────────────────────────────────┼──────────...
─────────┤...
│ │ ╭──────────┬──────────────┬──────────────╮ │...
│ │ │ Labels │ LowerBound │ UpperBound │ │...
│ │ ├──────────┼──────────────┼──────────────┤ │...
│ │ │ p_1 │ 0.036 │ 0.044 │ │...
│ ParameterSpace │ ├──────────┼──────────────┼──────────────┤ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ │...
│ │ ├──────────┼──────────────┼──────────────┤ │...
│ │ │ p_3 │ 9000.0 │ 11000.0 │ │...
│ │ ╰──────────┴──────────────┴──────────────╯ │...
╰──────────────────┴──────────────────────────────────────────────┴──────────...
─────────╯...
Now we define the SimulatorConfig
and call it on the rober_prob
.
sim_config = SimulatorConfig(param_space)
ed_ode = sim_config(rober_prob; alg = Rosenbrock23())
Number of Trajectories in ExperimentData: 50
Basic Statistics for Given Dynamical System's Specifications
Number of u0s in the ExperimentData: 3
Number of ps in the ExperimentData: 3
╭─────────┬──────────────────────────────────────────────────────────────────...
───╮...
│ Field │...
│...
├─────────┼──────────────────────────────────────────────────────────────────...
───┤...
│ │ ╭────────────┬──────────────┬──────────────┬────────┬──────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├────────────┼──────────────┼──────────────┼────────┼──────────...
│ │ │ states_1 │ 1.0 │ 1.0 │ 1.0 │ 0.0...
│ u0s │ ├────────────┼──────────────┼──────────────┼────────┼──────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │ ⋮...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │ ⋮...
│ │ ├────────────┼──────────────┼──────────────┼────────┼──────────...
│ │ │ states_3 │ 0.0 │ 0.0 │ 0.0 │ 0.0...
│ │ ╰────────────┴──────────────┴──────────────┴────────┴──────────...
├─────────┼──────────────────────────────────────────────────────────────────...
───┤...
│ │ ╭──────────┬──────────────┬──────────────┬────────────┬─────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├──────────┼──────────────┼──────────────┼────────────┼─────────...
│ │ │ p_1 │ 0.036 │ 0.044 │ 0.04 │ 0.002...
│ ps │ ├──────────┼──────────────┼──────────────┼────────────┼─────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ ├──────────┼──────────────┼──────────────┼────────────┼─────────...
│ │ │ p_3 │ 9015.625 │ 10968.75 │ 9978.125 │ 580.975...
│ │ ╰──────────┴──────────────┴──────────────┴────────────┴─────────...
╰─────────┴──────────────────────────────────────────────────────────────────...
───╯...
Basic Statistics for Given Dynamical System's Continuous Fields
Number of states in the ExperimentData: 3
╭──────────┬─────────────────────────────────────────────────────────────────...
──╮...
│ Field │...
│...
├──────────┼─────────────────────────────────────────────────────────────────...
──┤...
│ │ ╭────────────┬──────────────┬──────────────┬─────────┬─────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ states_1 │ 0.082 │ 1.0 │ 0.703 │ 0.317...
│ states │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ states_3 │ 0.0 │ 0.918 │ 0.297 │ 0.317...
│ │ ╰────────────┴──────────────┴──────────────┴─────────┴─────────...
╰──────────┴─────────────────────────────────────────────────────────────────...
──╯...
Now we have two different ExperimentData
objects: ed_dataset
and ed_ode
. We can combine them using combine
:
ed = combine(ed_ode, ed_dataset)
Number of Trajectories in ExperimentData: 150
Basic Statistics for Given Dynamical System's Specifications
Number of u0s in the ExperimentData: 3
Number of ps in the ExperimentData: 3
╭─────────┬──────────────────────────────────────────────────────────────────...
─╮...
│ Field │...
│...
├─────────┼──────────────────────────────────────────────────────────────────...
─┤...
│ │ ╭────────────┬──────────────┬──────────────┬────────┬──────────╮...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├────────────┼──────────────┼──────────────┼────────┼──────────┤...
│ │ │ states_1 │ 1.0 │ 1.0 │ 1.0 │ 0.0...
│ u0s │ ├────────────┼──────────────┼──────────────┼────────┼──────────┤...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │ ⋮...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │ ⋮...
│ │ ├────────────┼──────────────┼──────────────┼────────┼──────────┤...
│ │ │ states_3 │ 0.0 │ 0.0 │ 0.0 │ 0.0...
│ │ ╰────────────┴──────────────┴──────────────┴────────┴──────────╯...
├─────────┼──────────────────────────────────────────────────────────────────...
─┤...
│ │ ╭──────────┬──────────────┬──────────────┬──────────┬───────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├──────────┼──────────────┼──────────────┼──────────┼───────────...
│ │ │ p_1 │ 0.036 │ 0.044 │ 0.04 │ 0.002...
│ ps │ ├──────────┼──────────────┼──────────────┼──────────┼───────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │ ⋮...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │ ⋮...
│ │ ├──────────┼──────────────┼──────────────┼──────────┼───────────...
│ │ │ p_3 │ 9015.625 │ 10992.188 │ 9997.5 │ 579.476...
│ │ ╰──────────┴──────────────┴──────────────┴──────────┴───────────...
╰─────────┴──────────────────────────────────────────────────────────────────...
─╯...
Basic Statistics for Given Dynamical System's Continuous Fields
Number of states in the ExperimentData: 3
╭──────────┬─────────────────────────────────────────────────────────────────...
──╮...
│ Field │...
│...
├──────────┼─────────────────────────────────────────────────────────────────...
──┤...
│ │ ╭────────────┬──────────────┬──────────────┬─────────┬─────────...
│ │ │ Labels │ LowerBound │ UpperBound │ Mean │ StdDev...
│ │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ states_1 │ 0.081 │ 1.0 │ 0.587 │ 0.299...
│ states │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ │ ⋮ │ ⋮ │ ⋮ │ ⋮ │...
│ │ ├────────────┼──────────────┼──────────────┼─────────┼─────────...
│ │ │ states_3 │ 0.0 │ 0.919 │ 0.413 │ 0.299...
│ │ ╰────────────┴──────────────┴──────────────┴─────────┴─────────...
╰──────────┴─────────────────────────────────────────────────────────────────...
──╯...
Notice, that the number of trajectories is 150. So it takes 100 trajectories from ed_dataset
and 50 trajectories from ed_ode
.