Explore with Aggregate Sampling Results

Suggest edits
Documentation > Explore > Samplings

Aggregating Results of a Direct Sampling 🔗

In Arrays 🔗

Direct sampling and offers a way to aggregate the multiple output value of the model generated by the multiple execution of the model. This is done by settings the argument aggregation of the Direct Sampling or Replication method. The simplest usage is to generate an array of all the computed outputs. You can then store it using a hook or pass it to a subsequent task:
val input_i = Val[Int]
val input_j = Val[Double]
val output1 = Val[Double]
val output2 = Val[Double]

val postProcessingTask =
  ScalaTask("""
    // my post processing code
  """) set (
    inputs += (output1.array, output2.array)
  )

DirectSampling(
  evaluation = my_own_model,
  sampling =
    (input_i in (0 to 10 by 2)) x
    (input_j in (0.0 to 5.0 by 0.5)),
  aggregation = Seq(output1, output2)
) -- postProcessingTask

Statistic Indicators 🔗

OpenMOLE provides a bunch on statistic function you can use to aggregate you outputs. The list of these function is available in the doc. You can use these function either in a ScalaTask to post process your results or using the evaluate keyword:
val input_i = Val[Int]
val input_j = Val[Double]
val output1 = Val[Double]
val output2 = Val[Double]

DirectSampling(
  evaluation = my_own_model,
  sampling =
    (input_i in (0 to 10 by 2)) x
    (input_j in (0.0 to 5.0 by 0.5)),
  aggregation = Seq(
    output1 evaluate median,
    output2 evaluate average
  )
)

You own function 🔗

You can also provide your own scala function to aggregate the data, as it is shown in the following example:
val input_i = Val[Int]
val input_j = Val[Double]
val output1 = Val[Double]
val output2 = Val[Double]

DirectSampling(
  evaluation = my_own_model,
  sampling =
    (input_i in (0 to 10 by 2)) x
    (input_j in (0.0 to 5.0 by 0.5)),
  aggregation = Seq(
    output1 evaluate "output1.sum / 3.0",
    output2 evaluate "output2.sum / 3.0"
  )
)
Or:
val input_i = Val[Int]
val input_j = Val[Double]
val output1 = Val[Double]
val output2 = Val[Double]

def myAggregation(d: Array[Double]) = d.sum / 3.0

DirectSampling(
  evaluation = my_own_model,
  sampling =
    (input_i in (0 to 10 by 2)) x
    (input_j in (0.0 to 5.0 by 0.5)),
  aggregation = Seq(
    output1 evaluate myAggregation,
    output2 evaluate myAggregation
  )
)