Using model parameters in the folder name of population hook


#1

Hello, I’m facing a simple problem while trying to give a name to the ouput folder of a nsga2 task. As you will see in the workflow, I’m starting several nsga task by sampling “hyperparameters” of a model with a LHS task, I would like to create a folder for each nsga task. Right now everything goes in the same folder and I’m not sure what is happening but I think populations files are erasing each other when they are created.

---------- Here is the working workflow:

//LHS inputs (hyperparameters)
val a = Val[Double]
val b = Val[Double]

//model inputs
val x = Val[Double]
val y = Val[Double]

//model outputs
val o1 = Val[Double]
val o2 = Val[Double]

val model =
ScalaTask(“val o1 = x + a; val o2 = y + b”) set (
inputs += (x, y, a, b),
outputs += (o1, o2, a, b),
x := 5.0,
y := 8.9,
a := 2.0,
b := 5.0
)

val nsga = NSGA2(
mu = 100,
genome = Seq(x in (0.0, 10.0), y in (0.0, 10.0)),
objectives = Seq(o1, o2)
)

val Latin =
ExplorationTask (
LHS(
10, // Number of points of the LHS
a in Range(0.0, 10.0),
b in Range(0.0, 5.0)
)
)

val evolution =
SteadyStateEvolution(
algorithm = nsga,
evaluation = Latin -< model,
parallelism = 10,
termination = 100
)

val savePopulation = SavePopulationHook(evolution, workDirectory / “evolution /”)
(evolution hook savePopulation on LocalEnvironment(4))

---------- End Workflow

and I would like a hook like this :
val savePopulation = SavePopulationHook(evolution, workDirectory / “evolution ${a} ${b}/”)
but it fails.
Is there a way I could run this ?


(Mathieu Leclaire) #2

HI Leonard,
You can definitely do this.
What error do you get?

Mathieu


#3

Hi Mathieu,
I get nothing in the Env nor in the standard output, only the red failed. I’m using OM7.1, is the workflow running on your side ?


(Mathieu Leclaire) #4

What error do you get when you click on the failed red string (did you
know you have error stacks in there :slight_smile: ?)?


#5

To my defense it was not that obvious (ok maybe it was) :smiley:

The error :

org.openmole.core.exception.UserBadDataError: Formal validation of your mole has failed, 1 error(s) has(ve) been found.
Errors in validation of hook savePopulation@-1924347684:
| org.openmole.core.console.ScalaREPL$CompilationError: (line 8) mgo.algorithm.package$EvolutionState does not take type parameters
| var evolution$generation = _input_value_context(“evolution$generation”).asInstanceOf[Long]; var evolution$population = _input_value_context(“evolution$population”).asInstanceOf[scala.collection.immutable.Vector[mgo.algorithm.nsga2$Individual]]; var evolution$state = _input_value_context(“evolution$state”).asInstanceOf[mgo.algorithm.package$EvolutionState[Unit]]; var evolution$terminated = _input_value_context(“evolution$terminated”).asInstanceOf[Boolean]; var o1 = _input_value_context(“o1”).asInstanceOf[Array[Double]]; var o2 = _input_value_context(“o2”).asInstanceOf[Array[Double]]; var x = _input_value_context(“x”).asInstanceOf[Array[Double]]; var y = input_value_context(“y”).asInstanceOf[Array[Double]]
| ^
| (line 13) not found: value a
| a
| ^
| Compiling code:
|
| import org.openmole.core.expansion.CodePackage.

|
| (_input_value_context: org.openmole.core.context.Context, _input_value_RNG: org.openmole.tool.cache.Lazy[scala.util.Random], _input_value_NewFile: org.openmole.core.workspace.NewFile) => {
| object input {
| var evolution$generation = _input_value_context(“evolution$generation”).asInstanceOf[Long]; var evolution$population = _input_value_context(“evolution$population”).asInstanceOf[scala.collection.immutable.Vector[mgo.algorithm.nsga2$Individual]]; var evolution$state = _input_value_context(“evolution$state”).asInstanceOf[mgo.algorithm.package$EvolutionState[Unit]]; var evolution$terminated = _input_value_context(“evolution$terminated”).asInstanceOf[Boolean]; var o1 = _input_value_context(“o1”).asInstanceOf[Array[Double]]; var o2 = _input_value_context(“o2”).asInstanceOf[Array[Double]]; var x = _input_value_context(“x”).asInstanceOf[Array[Double]]; var y = input_value_context(“y”).asInstanceOf[Array[Double]]
| }
| import input.

| implicit lazy val openmole$RNG: util.Random = _input_value_RNG()
| implicit lazy val openmole$NewFile = _input_value_NewFile
| a
|
| }: Any
|
| at org.openmole.core.console.ScalaREPL.messageToException(ScalaREPL.scala:181)
| at org.openmole.core.console.ScalaREPL.eval(ScalaREPL.scala:188)
| at org.openmole.core.expansion.ScalaCompilation$$anonfun$compile$1.apply(ScalaCompilation.scala:47)
| at scala.util.Try$.apply(Try.scala:192)
| at org.openmole.core.expansion.ScalaCompilation$class.compile(ScalaCompilation.scala:44)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.compile(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.ScalaWrappedCompilation$class.function(ScalaCompilation.scala:146)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.function(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.ScalaWrappedCompilation$class.closure(ScalaCompilation.scala:151)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.closure(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.DynamicHeader$$anonfun$compiled$1.apply(ScalaCompilation.scala:196)
| at org.openmole.core.expansion.DynamicHeader$$anonfun$compiled$1.apply(ScalaCompilation.scala:196)
| at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:194)
| at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:80)
| at org.openmole.core.expansion.DynamicHeader$class.compiled(ScalaCompilation.scala:194)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.compiled(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.DynamicHeader$class.validate(ScalaCompilation.scala:203)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.validate(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.ExpandedString$CodeElement.validate(ExpandedString.scala:132)
| at org.openmole.core.expansion.ExpandedString$Expansion$$anonfun$validate$1.apply(ExpandedString.scala:91)
| at org.openmole.core.expansion.ExpandedString$Expansion$$anonfun$validate$1.apply(ExpandedString.scala:91)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.immutable.List.foreach(List.scala:381)
| at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
| at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45)
| at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
| at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
| at org.openmole.core.expansion.ExpandedString$Expansion.validate(ExpandedString.scala:91)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.plugin.hook.file.AppendToCSVFileHook.validate(AppendToCSVFileHook.scala:62)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2$$anonfun$apply$39.apply(Validation.scala:283)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2$$anonfun$apply$39.apply(Validation.scala:279)
| at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
| at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
| at scala.collection.immutable.List.foreach(List.scala:381)
| at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
| at scala.collection.immutable.List.map(List.scala:285)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2.apply(Validation.scala:279)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2.apply(Validation.scala:277)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:316)
| at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:972)
| at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
| at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
| at org.openmole.core.workflow.validation.Validation$.validationErrors$1(Validation.scala:277)
| at org.openmole.core.workflow.validation.Validation$.hookErrors(Validation.scala:289)
| at org.openmole.core.workflow.validation.Validation$$anonfun$apply$40.apply(Validation.scala:326)
| at org.openmole.core.workflow.validation.Validation$$anonfun$apply$40.apply(Validation.scala:313)
| at scala.collection.immutable.List.flatMap(List.scala:327)
| at org.openmole.core.workflow.validation.Validation$.apply(Validation.scala:313)
| at org.openmole.core.workflow.mole.MoleExecution.start(MoleExecution.scala:205)
| at org.openmole.gui.server.core.ApiImpl$$anonfun$8.apply(ApiImpl.scala:346)
| at org.openmole.gui.server.core.ApiImpl$$anonfun$8.apply(ApiImpl.scala:346)
| at scala.util.Try$.apply(Try.scala:192)
| at org.openmole.gui.server.core.ApiImpl.runScript(ApiImpl.scala:346)
| at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply$mcV$sp(GUIServlet.scala:333)
| at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
| at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
| at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
| at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
| at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
| at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
| at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
| at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
| at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
| Caused by: javax.script.ScriptException: compile-time error
| at scala.tools.nsc.interpreter.IMain.compiled(IMain.scala:602)
| at scala.tools.nsc.interpreter.IMain.eval(IMain.scala:1074)
| at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
| at org.openmole.core.console.ScalaREPL.eval(ScalaREPL.scala:185)
| … 68 more
| org.openmole.core.console.ScalaREPL$CompilationError: (line 8) mgo.algorithm.package$EvolutionState does not take type parameters
| var evolution$generation = _input_value_context(“evolution$generation”).asInstanceOf[Long]; var evolution$population = _input_value_context(“evolution$population”).asInstanceOf[scala.collection.immutable.Vector[mgo.algorithm.nsga2$Individual]]; var evolution$state = _input_value_context(“evolution$state”).asInstanceOf[mgo.algorithm.package$EvolutionState[Unit]]; var evolution$terminated = _input_value_context(“evolution$terminated”).asInstanceOf[Boolean]; var o1 = _input_value_context(“o1”).asInstanceOf[Array[Double]]; var o2 = _input_value_context(“o2”).asInstanceOf[Array[Double]]; var x = _input_value_context(“x”).asInstanceOf[Array[Double]]; var y = input_value_context(“y”).asInstanceOf[Array[Double]]
| ^
| (line 13) not found: value b
| b
| ^
| Compiling code:
|
| import org.openmole.core.expansion.CodePackage.

|
| (_input_value_context: org.openmole.core.context.Context, _input_value_RNG: org.openmole.tool.cache.Lazy[scala.util.Random], _input_value_NewFile: org.openmole.core.workspace.NewFile) => {
| object input {
| var evolution$generation = _input_value_context(“evolution$generation”).asInstanceOf[Long]; var evolution$population = _input_value_context(“evolution$population”).asInstanceOf[scala.collection.immutable.Vector[mgo.algorithm.nsga2$Individual]]; var evolution$state = _input_value_context(“evolution$state”).asInstanceOf[mgo.algorithm.package$EvolutionState[Unit]]; var evolution$terminated = _input_value_context(“evolution$terminated”).asInstanceOf[Boolean]; var o1 = _input_value_context(“o1”).asInstanceOf[Array[Double]]; var o2 = _input_value_context(“o2”).asInstanceOf[Array[Double]]; var x = _input_value_context(“x”).asInstanceOf[Array[Double]]; var y = input_value_context(“y”).asInstanceOf[Array[Double]]
| }
| import input.

| implicit lazy val openmole$RNG: util.Random = _input_value_RNG()
| implicit lazy val openmole$NewFile = _input_value_NewFile
| b
|
| }: Any
|
| at org.openmole.core.console.ScalaREPL.messageToException(ScalaREPL.scala:181)
| at org.openmole.core.console.ScalaREPL.eval(ScalaREPL.scala:188)
| at org.openmole.core.expansion.ScalaCompilation$$anonfun$compile$1.apply(ScalaCompilation.scala:47)
| at scala.util.Try$.apply(Try.scala:192)
| at org.openmole.core.expansion.ScalaCompilation$class.compile(ScalaCompilation.scala:44)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.compile(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.ScalaWrappedCompilation$class.function(ScalaCompilation.scala:146)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.function(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.ScalaWrappedCompilation$class.closure(ScalaCompilation.scala:151)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.closure(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.DynamicHeader$$anonfun$compiled$1.apply(ScalaCompilation.scala:196)
| at org.openmole.core.expansion.DynamicHeader$$anonfun$compiled$1.apply(ScalaCompilation.scala:196)
| at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:194)
| at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:80)
| at org.openmole.core.expansion.DynamicHeader$class.compiled(ScalaCompilation.scala:194)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.compiled(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.DynamicHeader$class.validate(ScalaCompilation.scala:203)
| at org.openmole.core.expansion.ScalaWrappedCompilation$$anon$1.validate(ScalaCompilation.scala:101)
| at org.openmole.core.expansion.ExpandedString$CodeElement.validate(ExpandedString.scala:132)
| at org.openmole.core.expansion.ExpandedString$Expansion$$anonfun$validate$1.apply(ExpandedString.scala:91)
| at org.openmole.core.expansion.ExpandedString$Expansion$$anonfun$validate$1.apply(ExpandedString.scala:91)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.immutable.List.foreach(List.scala:381)
| at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
| at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45)
| at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
| at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
| at org.openmole.core.expansion.ExpandedString$Expansion.validate(ExpandedString.scala:91)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.core.expansion.FromContext$$anon$1$$anon$4.validate(FromContext.scala:81)
| at org.openmole.plugin.hook.file.AppendToCSVFileHook.validate(AppendToCSVFileHook.scala:62)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2$$anonfun$apply$39.apply(Validation.scala:283)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2$$anonfun$apply$39.apply(Validation.scala:279)
| at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
| at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
| at scala.collection.immutable.List.foreach(List.scala:381)
| at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
| at scala.collection.immutable.List.map(List.scala:285)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2.apply(Validation.scala:279)
| at org.openmole.core.workflow.validation.Validation$$anonfun$validationErrors$1$2.apply(Validation.scala:277)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
| at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:316)
| at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:972)
| at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
| at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
| at org.openmole.core.workflow.validation.Validation$.validationErrors$1(Validation.scala:277)
| at org.openmole.core.workflow.validation.Validation$.hookErrors(Validation.scala:289)
| at org.openmole.core.workflow.validation.Validation$$anonfun$apply$40.apply(Validation.scala:326)
| at org.openmole.core.workflow.validation.Validation$$anonfun$apply$40.apply(Validation.scala:313)
| at scala.collection.immutable.List.flatMap(List.scala:327)
| at org.openmole.core.workflow.validation.Validation$.apply(Validation.scala:313)
| at org.openmole.core.workflow.mole.MoleExecution.start(MoleExecution.scala:205)
| at org.openmole.gui.server.core.ApiImpl$$anonfun$8.apply(ApiImpl.scala:346)
| at org.openmole.gui.server.core.ApiImpl$$anonfun$8.apply(ApiImpl.scala:346)
| at scala.util.Try$.apply(Try.scala:192)
| at org.openmole.gui.server.core.ApiImpl.runScript(ApiImpl.scala:346)
| at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply$mcV$sp(GUIServlet.scala:333)
| at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
| at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
| at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
| at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
| at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
| at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
| at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
| at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
| at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
| Caused by: javax.script.ScriptException: compile-time error
| at scala.tools.nsc.interpreter.IMain.compiled(IMain.scala:602)
| at scala.tools.nsc.interpreter.IMain.eval(IMain.scala:1074)
| at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
| at org.openmole.core.console.ScalaREPL.eval(ScalaREPL.scala:185)
| … 68 more
In mole: Mole(first@959300725,List(scalingIndividuals@251460039 >| slot@2140248736:last@1800498522, $default$4@-2116091105 – slot@952673724:scalingIndividuals@251460039, first@959300725 – slot@178125896:randomGenome@-593684507, last@889195541 – slot@1278074075:$default$4@-2116091105, randomGenome@-593684507 -< slot@1058675556:scalingGenome@-1286408708, scalingGenome@-1286408708 – slot@1107471486:first@123592971, $default$4@403170015 – slot@282680986:last@889195541, first@123592971 – slot@140160970:$default$4@403170015, $default$4@-2116091105 -<- slot@655910858:scalingGenome@-1286408708),List(first@123592971 oo slot@282680986:last@889195541, randomGenome@-593684507 oo slot@1278074075:$default$4@-2116091105, first@959300725 oo slot@140160970:$default$4@403170015),PrototypeSet())
at org.openmole.core.workflow.mole.MoleExecution.start(MoleExecution.scala:206)
at org.openmole.gui.server.core.ApiImpl$$anonfun$8.apply(ApiImpl.scala:346)
at org.openmole.gui.server.core.ApiImpl$$anonfun$8.apply(ApiImpl.scala:346)
at scala.util.Try$.apply(Try.scala:192)
at org.openmole.gui.server.core.ApiImpl.runScript(ApiImpl.scala:346)
at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply$mcV$sp(GUIServlet.scala:333)
at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)


(Mathieu Leclaire) #6

:). OK, so a and b are not known. When you use a hook, it refers to outputs of a Task. So if a and b are not provided as output, it won’t work.
You should read this: https://openmole.org/Hooks.html

In your workflow, I think you should rather hook the model Task rather than the evolution one.

val evolution =
SteadyStateEvolution(
algorithm = nsga,
evaluation = Latin -< model hook savePopulation,
parallelism = 10,
termination = 100
)

#7

Ok ! I get an error of recursion with this :
org.openmole.core.console.ScalaREPL$CompilationError: (line 43) recursive value savePopulation needs type
evaluation = Latin -< model hook savePopulation,
^
Error in imports header:
(line -19) recursive value evolution needs type
val savePopulation = SavePopulationHook(evolution, workDirectory / “evolution /”)
^
Compiling code:

class _7dab739c4f43074f307d7e0f7d47871893206fb0Class {
lazy val _imports = new {

}

import imports.

private lazy val workDirectory = File(new java.net.URI(“file:/home/leonard/.openmole/Fozzy/webui/projects/LHStest/”).getPath)
//LHS inputs
val a = Val[Double]
val b = Val[Double]

//model inputs
val x = Val[Double]
val y = Val[Double]

//model outputs
val o1 = Val[Double]
val o2 = Val[Double]

val model =
ScalaTask(“val o1 = x + a; val o2 = y + b”) set (
inputs += (x, y, a, b),
outputs += (o1, o2, a, b),
x := 5.0,
y := 8.9,
a := 2.0,
b := 5.0
)

val nsga = NSGA2(
mu = 100,
genome = Seq(x in (0.0, 10.0), y in (0.0, 10.0)),
objectives = Seq(o1, o2)
)

val Latin =
ExplorationTask (
LHS(
10, // Number of points of the LHS
a in Range(0.0, 10.0),
b in Range(0.0, 5.0)
)
)

val savePopulation = SavePopulationHook(evolution, workDirectory / “evolution /”)

val evolution =
SteadyStateEvolution(
algorithm = nsga,
evaluation = Latin -< model hook savePopulation,
parallelism = 10,
termination = 100
)

evolution on LocalEnvironment(4)

}

lazy val _7dab739c4f43074f307d7e0f7d47871893206fb0 = new _7dab739c4f43074f307d7e0f7d47871893206fb0Class

def runOMSScript(): org.openmole.core.workflow.puzzle.Puzzle = {
import _7dab739c4f43074f307d7e0f7d47871893206fb0.imports.
//LHS inputs
val a = Val[Double]
val b = Val[Double]

//model inputs
val x = Val[Double]
val y = Val[Double]

//model outputs
val o1 = Val[Double]
val o2 = Val[Double]

val model =
ScalaTask(“val o1 = x + a; val o2 = y + b”) set (
inputs += (x, y, a, b),
outputs += (o1, o2, a, b),
x := 5.0,
y := 8.9,
a := 2.0,
b := 5.0
)

val nsga = NSGA2(
mu = 100,
genome = Seq(x in (0.0, 10.0), y in (0.0, 10.0)),
objectives = Seq(o1, o2)
)

val Latin =
ExplorationTask (
LHS(
10, // Number of points of the LHS
a in Range(0.0, 10.0),
b in Range(0.0, 5.0)
)
)

val savePopulation = SavePopulationHook(evolution, workDirectory / “evolution /”)

val evolution =
SteadyStateEvolution(
algorithm = nsga,
evaluation = Latin -< model hook savePopulation,
parallelism = 10,
termination = 100
)

evolution on LocalEnvironment(4)

}
runOMSScript()
at org.openmole.core.console.ScalaREPL$CompilationError.copy(ScalaREPL.scala:54)
at org.openmole.core.console.ScalaREPL$CompilationError$$anon$3$$anonfun$modifyF$1.apply(ScalaREPL.scala:54)
at org.openmole.core.console.ScalaREPL$CompilationError$$anon$3$$anonfun$modifyF$1.apply(ScalaREPL.scala:54)
at scalaz.Monad$$anonfun$map$1$$anonfun$apply$2.apply(Monad.scala:14)
at scalaz.IdInstances$$anon$1.point(Id.scala:20)
at scalaz.Monad$$anonfun$map$1.apply(Monad.scala:14)
at scalaz.IdInstances$$anon$1.bind(Id.scala:22)
at scalaz.Monad$class.map(Monad.scala:14)
at scalaz.IdInstances$$anon$1.map(Id.scala:19)
at org.openmole.core.console.ScalaREPL$CompilationError$$anon$3.modifyF(ScalaREPL.scala:54)
at org.openmole.core.console.ScalaREPL$CompilationError$$anon$3.modifyF(ScalaREPL.scala:54)
at monocle.PLens$$anon$5.modifyF(Lens.scala:190)
at monocle.PTraversal$$anon$2.modifyF(Traversal.scala:113)
at monocle.PTraversal$$anon$2.modifyF(Traversal.scala:113)
at monocle.PTraversal$$anon$2.modifyF(Traversal.scala:113)
at monocle.PTraversal$$anon$2.modifyF(Traversal.scala:113)
at monocle.PTraversal.monocle$PTraversal$$$anonfun$8(Traversal.scala:69)
at scala.Function1$$anonfun$andThen$1.apply(Function1.scala:52)
at org.openmole.core.project.Project.compile$1(Project.scala:155)
at org.openmole.core.project.Project.compile(Project.scala:161)
at org.openmole.gui.server.core.ApiImpl.runScript(ApiImpl.scala:316)
at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply$mcV$sp(GUIServlet.scala:333)
at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
at org.openmole.gui.server.core.GUIServlet$$anonfun$2$$anonfun$applyOrElse$24.apply(GUIServlet.scala:333)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: javax.script.ScriptException: compile-time error
at scala.tools.nsc.interpreter.IMain.compiled(IMain.scala:602)
at scala.tools.nsc.interpreter.IMain.eval(IMain.scala:1074)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at scala.tools.nsc.interpreter.IMain.compile(IMain.scala:1068)
at org.openmole.core.console.ScalaREPL.compile(ScalaREPL.scala:194)
at org.openmole.core.project.Project.compile$1(Project.scala:132)
… 12 more

which make sense because savePopulation is defined with evolution :
val savePopulation = SavePopulationHook(evolution, workDirectory / “evolution /”)
However I’m not certain that it is the problem


(Mathieu Leclaire) #8

I didn’t realize it was a SavePopulationHook, my mistake.

So you just had to define the hook after the evolution Task had been created to be able to reference it in the hook. Note that you shouldn’t use the weird notation you use for the workingDirectory. By default, it defines the directory where the scripts lays.

This script works fine:

//LHS inputs
val a = Val[Double]
val b = Val[Double]

//model inputs
val x = Val[Double]
val y = Val[Double]

//model outputs
val o1 = Val[Double]
val o2 = Val[Double]

val model =
ScalaTask("val o1 = x + a; val o2 = y + b") set (
inputs += (x, y, a, b),
outputs += (o1, o2, a, b),
x := 5.0,
y := 8.9,
a := 2.0,
b := 5.0
)

val nsga = NSGA2(
mu = 100,
genome = Seq(x in (0.0, 10.0), y in (0.0, 10.0)),
objectives = Seq(o1, o2)
)

val Latin =
ExplorationTask (
LHS(
10, // Number of points of the LHS
a in Range(0.0, 10.0),
b in Range(0.0, 5.0)
)
)

val evolution =
SteadyStateEvolution(
algorithm = nsga,
evaluation = Latin -< model,
parallelism = 10,
termination = 100
)


val savePopulation = SavePopulationHook(evolution, workDirectory / "evolution /")

evolution hook savePopulation on LocalEnvironment(4)

#9

Yes but it won’t allow me to write the population of each nsga in a specific directory, I can’t write
val savePopulation = SavePopulationHook(evolution, workDirectory / “evolution ${a} ${b}/”)
Is there a way to set a and b as output of the SteadyStateEvolution ? Something like encapsulating evolution in an other task. This would allow me to get a and b as outputs of the evolution.

EDIT:
I’m reading the doc on Capsules, I might want something like :
val encapsulation = Capsule(evolution, strain = true)