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             1          1    ...
   u0s        ├────────────┼──────────────┼──────────────┼────────┼────────...
              ...
              ...
              ├────────────┼──────────────┼──────────────┼────────┼────────...
                states_3        0             0          0    ...
              ╰────────────┴──────────────┴──────────────┴────────┴────────...
├─────────┼──────────────────────────────────────────────────────────────────...
──────┤...
           ╭──────────┬──────────────┬──────────────┬─────────────┬────────...
             Labels    LowerBound    UpperBound      Mean     ...
           ├──────────┼──────────────┼──────────────┼─────────────┼────────...
              p_1      0.0360625     0.0439375     0.0399687    0.0023...
   ps      ├──────────┼──────────────┼──────────────┼─────────────┼────────...
           ...
           ...
           ├──────────┼──────────────┼──────────────┼─────────────┼────────...
              p_3       9015.62       10992.2       10007.2   ...
           ╰──────────┴──────────────┴──────────────┴─────────────┴────────...
╰─────────┴──────────────────────────────────────────────────────────────────...
──────╯...
 Basic Statistics for Given Dynamical System's Continuous Fields 
  Number of states in the ExperimentData: 3 
 ╭──────────┬─────────────────────────────────────────────────────────────────...
───────╮...
  Field   ...
            ...
├──────────┼─────────────────────────────────────────────────────────────────...
───────┤...
            ╭────────────┬──────────────┬──────────────┬────────────┬──────...
               Labels     LowerBound    UpperBound      Mean    ...
            ├────────────┼──────────────┼──────────────┼────────────┼──────...
              states_1    0.0811106         1         0.586675  ...
  states    ├────────────┼──────────────┼──────────────┼────────────┼──────...
            ...
            ...
            ├────────────┼──────────────┼──────────────┼────────────┼──────...
              states_3        0          0.918889     0.413314  ...
            ╰────────────┴──────────────┴──────────────┴────────────┴──────...
╰──────────┴─────────────────────────────────────────────────────────────────...
───────╯...

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         11000       ...
                    ╰──────────┴──────────────┴──────────────╯  ...
╰──────────────────┴──────────────────────────────────────────────┴──────────...
─────────╯...

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             1          1        0...
   u0s      ├────────────┼──────────────┼──────────────┼────────┼──────────...
            ...
            ...
            ├────────────┼──────────────┼──────────────┼────────┼──────────...
              states_3        0             0          0        0...
            ╰────────────┴──────────────┴──────────────┴────────┴──────────...
├─────────┼──────────────────────────────────────────────────────────────────...
───┤...
           ╭──────────┬──────────────┬──────────────┬─────────┬────────────...
             Labels    LowerBound    UpperBound    Mean       StdDev...
           ├──────────┼──────────────┼──────────────┼─────────┼────────────...
              p_1       0.03608       0.04392      0.04     0.00233238...
   ps      ├──────────┼──────────────┼──────────────┼─────────┼────────────...
           ...
           ...
           ├──────────┼──────────────┼──────────────┼─────────┼────────────...
              p_3         9020         10980       10000     583.095...
           ╰──────────┴──────────────┴──────────────┴─────────┴────────────...
╰─────────┴──────────────────────────────────────────────────────────────────...
───╯...
 Basic Statistics for Given Dynamical System's Continuous Fields 
  Number of states in the ExperimentData: 3 
 ╭──────────┬─────────────────────────────────────────────────────────────────...
───────╮...
  Field   ...
            ...
├──────────┼─────────────────────────────────────────────────────────────────...
───────┤...
            ╭────────────┬──────────────┬──────────────┬────────────┬──────...
               Labels     LowerBound    UpperBound      Mean    ...
            ├────────────┼──────────────┼──────────────┼────────────┼──────...
              states_1     0.086008         1         0.703216  ...
  states    ├────────────┼──────────────┼──────────────┼────────────┼──────...
            ...
            ...
            ├────────────┼──────────────┼──────────────┼────────────┼──────...
              states_3        0          0.913992     0.296769  ...
            ╰────────────┴──────────────┴──────────────┴────────────┴──────...
╰──────────┴─────────────────────────────────────────────────────────────────...
───────╯...

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             1          1    ...
   u0s        ├────────────┼──────────────┼──────────────┼────────┼────────...
              ...
              ...
              ├────────────┼──────────────┼──────────────┼────────┼────────...
                states_3        0             0          0    ...
              ╰────────────┴──────────────┴──────────────┴────────┴────────...
├─────────┼──────────────────────────────────────────────────────────────────...
───────┤...
           ╭──────────┬──────────────┬──────────────┬─────────────┬────────...
             Labels    LowerBound    UpperBound      Mean     ...
           ├──────────┼──────────────┼──────────────┼─────────────┼────────...
              p_1      0.0360625     0.0439375     0.0399792    0.0023...
   ps      ├──────────┼──────────────┼──────────────┼─────────────┼────────...
           ...
           ...
           ├──────────┼──────────────┼──────────────┼─────────────┼────────...
              p_3       9015.62       10992.2       10004.8   ...
           ╰──────────┴──────────────┴──────────────┴─────────────┴────────...
╰─────────┴──────────────────────────────────────────────────────────────────...
───────╯...
 Basic Statistics for Given Dynamical System's Continuous Fields 
  Number of states in the ExperimentData: 3 
 ╭──────────┬─────────────────────────────────────────────────────────────────...
───────╮...
  Field   ...
            ...
├──────────┼─────────────────────────────────────────────────────────────────...
───────┤...
            ╭────────────┬──────────────┬──────────────┬────────────┬──────...
               Labels     LowerBound    UpperBound      Mean    ...
            ├────────────┼──────────────┼──────────────┼────────────┼──────...
              states_1    0.0811106         1         0.586974  ...
  states    ├────────────┼──────────────┼──────────────┼────────────┼──────...
            ...
            ...
            ├────────────┼──────────────┼──────────────┼────────────┼──────...
              states_3        0          0.918889     0.413015  ...
            ╰────────────┴──────────────┴──────────────┴────────────┴──────...
╰──────────┴─────────────────────────────────────────────────────────────────...
───────╯...

Notice, that the number of trajectories is 150. So it takes 100 trajectories from ed_dataset and 50 trajectories from ed_ode.