From 79c0ee12f63f8b43983ae49829032887e5ba0e3e Mon Sep 17 00:00:00 2001
From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de>
Date: Sun, 14 May 2023 13:17:36 +0200
Subject: [PATCH] Adapting to previous changes in DSL files and added a search
 path to DSL loading.

---
 .../de/evoal/approximative/density/ml.dl      |   4 +-
 .../approximative/density/optimisation.dl     |   4 +-
 .../de/evoal/core/ea/optimisation.dl          |  60 +++++-----
 .../evoal/core/ea/utils/LanguageHelperTest.dl |   4 +-
 .../core/ea/utils/regressions/generator.dl    |   6 +-
 .../de.evoal.core.main/scripts/run-search.sh  |   1 -
 .../core/api/board/CoreBlackboardEntries.java |  44 +++----
 .../main/language/SearchPathConfigurator.java |  29 +++++
 .../producer/OptimisationModuleLoader.java    |   5 +
 .../resources/de/evoal/core/constraint.dl     |   4 +-
 .../src/main/resources/de/evoal/core/math.dl  |   7 +-
 .../resources/de/evoal/core/optimisation.dl   |   2 +-
 .../de/evoal/core/api/utils/definitions.dl    |   4 +-
 .../main/cdi/GeneratorModuleProducer.java     |   7 +-
 .../src/main/java/module-info.java            |   1 +
 .../resources/de/evoal/generator/generator.dl |  18 +--
 .../cdi/MachineLearningModuleProducer.java    |   5 +
 .../src/main/java/module-info.java            |   1 +
 .../src/main/java/module-info.java            |   4 +
 .../resources/de/evoal/surrogate/simple/ml.dl |   8 +-
 .../resources/de/evoal/surrogate/svr/ml.dl    |  42 ++++---
 src/examples/generator/ackley.generator       |  50 ++++----
 src/examples/search/search.ol                 | 112 +++++++++---------
 src/examples/surrogate/training.mll           |  46 +++----
 24 files changed, 262 insertions(+), 206 deletions(-)
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/SearchPathConfigurator.java

diff --git a/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/ml.dl b/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/ml.dl
index af2115ce..16dc7673 100644
--- a/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/ml.dl
+++ b/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/ml.dl
@@ -4,12 +4,12 @@ module de.evoal.approximative.density.ml {
 	 * 
 	 * @param bandwith Width for density calculation.
 	 */
-	def void 'kernel-density-estimation'(float bandwidth);
+	def void 'kernel-density-estimation'(real bandwidth);
 	
 	/**
 	 * Measures density information using a gaussian kernel.
 	 * 
 	 * @param bandwith Width for density calculation.
 	 */
-	def void 'gaussian-density-estimation'(float bandwidth);	
+	def void 'gaussian-density-estimation'(real bandwidth);
 }
\ No newline at end of file
diff --git a/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/optimisation.dl b/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/optimisation.dl
index c94acc29..63af1771 100644
--- a/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/optimisation.dl
+++ b/src/core/de.evoal.approximative.density/src/main/resources/de/evoal/approximative/density/optimisation.dl
@@ -13,12 +13,12 @@ module de.evoal.approximative.density.optimisation {
 		/**
 		 * Exponent for the formula.
 		 */
-		exponent : float;
+		exponent : real;
 	
 		/**
 		 * Exponent for the formula.
 		 */
-		'root-exponent' : float;
+		'root-exponent' : real;
 	}
 	
 	type 'kernel-density' extends density {}
diff --git a/src/core/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl b/src/core/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl
index e1c3ee5e..9a78c386 100644
--- a/src/core/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl
+++ b/src/core/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl
@@ -48,7 +48,7 @@ module de.evoal.core.ea.optimisation {
 	}
 	
 	type 'standard-deviation' extends 'constraint-calculation' {
-		factor : float;
+		factor : real;
 	}
 	
 	abstract type 'constraint-handling' {}
@@ -62,7 +62,7 @@ module de.evoal.core.ea.optimisation {
 	type 'repair-with-random' extends 'repair-strategy' {}
 	
 	type 'malus-for-fitness' extends 'constraint-handling' {
-		smoothing : float;
+		smoothing : real;
 	}
 	
 	type selectors {
@@ -77,12 +77,12 @@ module de.evoal.core.ea.optimisation {
 	}
 
 	type 'elite-selector' extends selector {
-		'size-factor' : float;
+		'size-factor' : real;
 		'non-elite-selector' : instance selector;
 	}
 	
 	type 'boltzmann-selector' extends selector {
-		beta : float;
+		beta : real;
 	}
 	
 	type 'exponential-rank-selector' extends selector {
@@ -102,7 +102,7 @@ module de.evoal.core.ea.optimisation {
 	}
 	
 	type 'tournament-selector' extends selector {
-		'size-factor' : float;
+		'size-factor' : real;
 	}
 	
 	type 'truncation-selector' extends selector {
@@ -117,86 +117,86 @@ module de.evoal.core.ea.optimisation {
 	abstract type crossover {}
 	
 	type 'mean-alterer' extends crossover {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'correlation-mean-alterer' extends crossover {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'partial-matched-alterer' extends crossover {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'correlation-partial-matched-alterer' extends crossover {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'line-crossover' extends crossover {
-		probability : float;
-		position : float;
+		probability : real;
+		position : real;
 	}
 	
 	type 'correlation-line-crossover' extends crossover {
-		probability : float;
-		position : float;
+		probability : real;
+		position : real;
 	}
 	
 	type 'multi-point-crossover' extends crossover {
-		probability : float;
+		probability : real;
 		count : int;
 	}
 	
 	type 'correlation-multi-point-crossover' extends crossover {
-		probability : float;
+		probability : real;
 		count : int;
 	}
 	
 	type 'single-point-crossover' extends crossover {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'correlation-single-point-crossover' extends crossover {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'uniform-crossover' extends crossover {
-		'crossover-probability' : float;
-		'swap-probability' : float;
+		'crossover-probability' : real;
+		'swap-probability' : real;
 	}
 	
 	type 'correlation-uniform-crossover' extends crossover {
-		'crossover-probability' : float;
-		'swap-probability' : float;
+		'crossover-probability' : real;
+		'swap-probability' : real;
 	}
 	
 	abstract type mutator {
 	}
 	
 	type 'gaussian-mutator' extends mutator {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'correlation-gaussian-mutator' extends mutator {
-		probability : float;
-		threshold : float;
+		probability : real;
+		threshold : real;
 	}
 	
 	type 'swap-mutator' extends mutator {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'correlation-swap-mutator' extends mutator {
-		probability : float;
-		threshold : float;
+		probability : real;
+		threshold : real;
 	}
 	
 	type 'bit-flip-mutator' extends mutator  {
-		probability : float;
+		probability : real;
 	}
 	
 	type 'correlation-bit-flip-mutator' extends mutator {
-		probability : float;
-		threshold : float;
+		probability : real;
+		threshold : real;
 	}
 }
\ No newline at end of file
diff --git a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl
index bde38ea5..0df35f3f 100644
--- a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl
+++ b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl
@@ -3,10 +3,10 @@ type 'parent' {
 }
 
 type A {
-    'float-field'    : float;
+    'float-field'    : real;
     'string-field'   : string;
     'integer-field'  : int;
     'boolean-field'  : boolean;
-    'array-1D-float' : array float;
+    'array-1D-float' : array real;
     'array-2D-int'   : array  array int;
 }
\ No newline at end of file
diff --git a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl
index 84b046e8..f5d46e99 100644
--- a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl
+++ b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl
@@ -7,7 +7,7 @@ type 'shekel' {
     /**
 	 * The recommended value for the vector a is (1/m)*{1,2,2,4,4,6,3,7,5,5}.
 	 */
-	'a' : array float;
+	'a' : array real;
 
     /**
 	 * The recommended value for the constant c is {
@@ -16,10 +16,10 @@ type 'shekel' {
      * {4.0, 1.0, 8.0, 6.0, 3.0, 2.0, 5.0, 8.0, 6.0, 7.0},
      * {4.0, 1.0, 8.0, 6.0, 7.0, 9.0, 3.0, 1.0, 2.0, 3.6}}.
 	 */
-	'c' : array array float;
+	'c' : array array real;
 
     /**
 	 * The recommended value for the constant m is 10.
 	 */
-	'm' : float;
+	'm' : real;
 }
diff --git a/src/core/de.evoal.core.main/scripts/run-search.sh b/src/core/de.evoal.core.main/scripts/run-search.sh
index 4cc594fa..62e72327 100755
--- a/src/core/de.evoal.core.main/scripts/run-search.sh
+++ b/src/core/de.evoal.core.main/scripts/run-search.sh
@@ -11,7 +11,6 @@ cd $1
 
 set -x
 java $CLASSPATH \
-    "-Bcore:logging=debug" \
      "-Bcore:main=heuristic-search" \
      "-Bcore:optimisation-configuration-file=$2" \
      "-Bcore:evaluation-output-folder=$3"
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java
index 379ec68d..4c5ddefb 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java
@@ -10,37 +10,32 @@ import javax.inject.Named;
 public class CoreBlackboardEntries implements BlackboardEntries {
 
     /**
-     * The target properties to search for.
-     */
-    public static final String TARGET_PROPERTIES = "core:target-properties";
-
-    /**
-     * Folder containing the constraint files.
+     * Number of evaluation runs.
      */
-    public static final String CONSTRAINT_FOLDER = "core:constraint-folder";
+    @Commandline(main = "heuristic-search", name = "core:evaluation-iterations", doc = "Number of iterations to run the search.")
+    public static final String EVALUATION_ITERATIONS = "core:evaluation-iterations";
 
     /**
-     * Parameter to specify for logging leven.
+     * The actual output folder for the evaluation.
      */
-    @Commandline(main = "",  name = "core:logging", doc = "Logging level to use (ERROR,WARN,INFO,DEBUG)")
-    public static final String LOGGING_LEVEL = "core:logging";
+    @Commandline(main = "heuristic-search", name = "core:evaluation-output-folder", doc = "Folder to write the results to.")
+    public static final String EVALUATION_OUTPUT_FOLDER = "core:evaluation-output-folder";
 
     /**
-     * Number of evaluation runs.
+     * The evaluation run number.
      */
-    @Commandline(main = "heuristic-search", name = "core:evaluation-iterations", doc = "Number of iterations to run the search.")
-    public static final String EVALUATION_ITERATIONS = "core:evaluation-iterations";
+    public static final String EVALUATION_RUN = "core:evaluation-run";
 
     /**
-     * The evaluation run number.
+     * Parameter to specify for logging leven.
      */
-    public static final String EVALUATION_RUN = "core:evaluation-run";
+    @Commandline(main = "",  name = "core:logging", doc = "Logging level to use (ERROR,WARN,INFO,DEBUG)")
+    public static final String LOGGING_LEVEL = "core:logging";
 
     /**
-     * The actual output folder for the evaluation.
+     * Name of the main to run.
      */
-    @Commandline(main = "heuristic-search", name = "core:evaluation-output-folder", doc = "Folder to write the results to.")
-    public static final String EVALUATION_OUTPUT_FOLDER = "core:evaluation-output-folder";
+    public static final String MAIN = "core:main";
 
     /**
      * The heuristic configuration.
@@ -53,14 +48,19 @@ public class CoreBlackboardEntries implements BlackboardEntries {
     @Commandline(main = "heuristic-search", name = "core:optimisation-configuration", doc = "Optimisation configuration to use.")
     public static final String OPTIMISATION_CONFIGURATION_FILE = "core:optimisation-configuration-file";
 
-    /**
-     * Name of the main to run.
-     */
-    public static final String MAIN = "core:main";
+
+    @Commandline(main="", name="core:search-path", doc="Additional search path entries for DSL lookup.")
+    public static final String SEARCH_PATH = "core:search-path";
 
     /**
      * File containing targets for evaluation.
      */
     @Commandline(main="heuristic-search-evaluation", name = "core:target-points-file", doc = "A file containing the targets to use for evaluation.")
     public static final String TARGET_POINTS_FILE = "core:target-points-file";
+
+
+    /**
+     * The target properties to search for.
+     */
+    public static final String TARGET_PROPERTIES = "core:target-properties";
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/SearchPathConfigurator.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/SearchPathConfigurator.java
new file mode 100644
index 00000000..08552403
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/SearchPathConfigurator.java
@@ -0,0 +1,29 @@
+package de.evoal.core.main.language;
+
+import de.evoal.core.api.board.Blackboard;
+import de.evoal.core.api.board.BlackboardEntry;
+import de.evoal.core.api.board.CoreBlackboardEntries;
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Observes;
+import javax.inject.Inject;
+import java.io.File;
+import java.util.Arrays;
+
+@ApplicationScoped
+public class SearchPathConfigurator {
+    @Inject
+    private Blackboard board;
+
+    public void configure(final @Observes BlackboardEntry entry) {
+        if (!entry.isSame(CoreBlackboardEntries.SEARCH_PATH)) {
+            return;
+        }
+
+        final String searchPath = board.get(CoreBlackboardEntries.SEARCH_PATH);
+        final String [] searchPathEntries = searchPath.split(File.pathSeparator);
+
+        ClasspathGlobalScopeProvider.SEARCH_PATH.addAll(Arrays.asList(searchPathEntries));
+    }
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/OptimisationModuleLoader.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/OptimisationModuleLoader.java
index ffed3f67..f1a49579 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/OptimisationModuleLoader.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/OptimisationModuleLoader.java
@@ -17,6 +17,7 @@ import de.evoal.languages.model.dl.impl.DlPackageImpl;
 import de.evoal.languages.model.ol.OptimisationModule;
 import de.evoal.languages.model.ol.dsl.OptimisationLanguageStandaloneSetup;
 import de.evoal.languages.model.ol.impl.OLPackageImpl;
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -51,6 +52,10 @@ public class OptimisationModuleLoader {
             throw new IllegalArgumentException("Unable to read optimisation configuration file: " + configurationFileName);
         }
 
+        final File folder = configurationFile.getAbsoluteFile().getParentFile();
+        ClasspathGlobalScopeProvider.SEARCH_PATH.add(folder.toString());
+        log.info("Adding {} to search path.", folder);
+
         initializeEMF();
 
         final Injector ealInjector = new OptimisationLanguageStandaloneSetup().createInjectorAndDoEMFRegistration();
diff --git a/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/constraint.dl b/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/constraint.dl
index 9afa3987..2048ea0d 100644
--- a/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/constraint.dl
+++ b/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/constraint.dl
@@ -7,9 +7,9 @@ module de.evoal.core.constraint {
 	 *   <li>Reference to the data ...</li>
 	 * </ol> 
 	 */
-	def void variance(data reference, float variance);
+	def void variance(data reference, real variance);
 	
-	def void connection(data ref1, data ref2, float connection);
+	def void connection(data ref1, data ref2, real connection);
 	
 	def void constraint(expression exp, string category);
 }
diff --git a/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/math.dl b/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/math.dl
index 7b397122..bccb079d 100644
--- a/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/math.dl
+++ b/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/math.dl
@@ -2,5 +2,10 @@ module de.evoal.core.math {
 	/**
 	 * The one and only PI.
 	 */
-	const float PI := 3.1415926535;
+	const real PI := 3.1415926535;
+
+	/**
+	 * The one and only PI.
+	 */
+	const real 'Ï€' := 3.1415926535;
 }
diff --git a/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/optimisation.dl b/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/optimisation.dl
index 17fc972f..f124a67a 100644
--- a/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/optimisation.dl
+++ b/src/core/de.evoal.core.main/src/main/resources/de/evoal/core/optimisation.dl
@@ -154,7 +154,7 @@ module de.evoal.core.optimisation {
 		/**
 		 * Weights for summing the dimensions.
 		 */
-		weights : array float;
+		weights : array real;
 	}
 	
 	/**
diff --git a/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/definitions.dl b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/definitions.dl
index 0ce286a3..ef6dcbcb 100644
--- a/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/definitions.dl
+++ b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/definitions.dl
@@ -4,11 +4,11 @@ module de.evoal.core.api.utils.definitions {
 	}
 	
 	type A {
-	    'float-field'    : float;
+	    'float-field'    : real;
 	    'string-field'   : string;
 	    'integer-field'  : int;
 	    'boolean-field'  : boolean;
-	    'array-1D-float' : array float;
+	    'array-1D-float' : array real;
 	    'array-2D-int'   : array  array int;
 	}
 }
\ No newline at end of file
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/cdi/GeneratorModuleProducer.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/cdi/GeneratorModuleProducer.java
index a9a41af0..8b882f99 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/cdi/GeneratorModuleProducer.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/cdi/GeneratorModuleProducer.java
@@ -15,6 +15,7 @@ import de.evoal.languages.model.base.impl.BasePackageImpl;
 import de.evoal.languages.model.generator.dsl.GeneratorDSLStandaloneSetup;
 import de.evoal.languages.model.generator.GeneratorModule;
 import de.evoal.languages.model.generator.impl.GeneratorPackageImpl;
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -31,7 +32,7 @@ import org.eclipse.xtext.resource.XtextResourceSet;
 
 @ApplicationScoped
 @Slf4j
-public class GeneratroeModuleProducer {
+public class GeneratorModuleProducer {
     public void loadModel(final @Observes BlackboardEntry value, final Blackboard board) {
         if(!value.isSame(GeneratorBlackboardEntries.GENERATOR_CONFIGURATION_FILE)) {
             return;
@@ -55,6 +56,10 @@ public class GeneratroeModuleProducer {
             throw  new IllegalArgumentException("Please specify a readable genrator file.");
         }
 
+        final File folder = file.getAbsoluteFile().getParentFile();
+        ClasspathGlobalScopeProvider.SEARCH_PATH.add(folder.toString());
+        log.info("Adding {} to search path.", folder);
+
         final GeneratorModule configuration = read(file).get();
         board.bind(GeneratorBlackboardEntries.GENERATOR_CONFIGURATION, configuration);
     }
diff --git a/src/core/de.evoal.generator.main/src/main/java/module-info.java b/src/core/de.evoal.generator.main/src/main/java/module-info.java
index 832107c3..155f81fe 100644
--- a/src/core/de.evoal.generator.main/src/main/java/module-info.java
+++ b/src/core/de.evoal.generator.main/src/main/java/module-info.java
@@ -26,6 +26,7 @@ module de.evoal.generator.main {
     requires de.evoal.core.main;
     requires commons.math3;
     requires com.google.guice;
+    requires de.evoal.languages.model.utils;
 
     opens de.evoal.generator;
 
diff --git a/src/core/de.evoal.generator.main/src/main/resources/de/evoal/generator/generator.dl b/src/core/de.evoal.generator.main/src/main/resources/de/evoal/generator/generator.dl
index 62d31442..19768659 100644
--- a/src/core/de.evoal.generator.main/src/main/resources/de/evoal/generator/generator.dl
+++ b/src/core/de.evoal.generator.main/src/main/resources/de/evoal/generator/generator.dl
@@ -112,17 +112,17 @@ module de.evoal.generator.generator {
 		/**
 		 * The constant a is set to 20 in the original Ackley function.
 		 */
-		'a' : float := 20.0;
+		'a' : real := 20.0;
 		
 		/**
 		 * The constant b is set to 0.2 in the original Ackley function.
 		 */
-		b : float := 0.2;
+		b : real := 0.2;
 	
 		/**
 		 * The constant c is set to 2Ï€ in the original Ackley function.
 		 */
-		'c' : float := 2 * PI;
+		'c' : real := 2 * PI;
 	}
 	
 	/**
@@ -191,7 +191,7 @@ module de.evoal.generator.generator {
 		/**
 		 * Constant a, which is typically 10.
 		 */
-		'a' : float := 10.0;
+		'a' : real := 10.0;
 	}
 	
 	/**
@@ -213,15 +213,15 @@ module de.evoal.generator.generator {
 		/**
 		 * The constant values to append.
 		 */
-		constants : array float;	
+		constants : array real;	
 	}
 	
 	
 	type distribution {}
 
 	type 'multivariate-normal-distribution' extends distribution {
-		means : array float;
-		covariance : array array float;
+		means : array real;
+		covariance : array array real;
 	}
 	
 	/**
@@ -244,12 +244,12 @@ module de.evoal.generator.generator {
 		/**
 		 * The distribution's expected value.
 		 */
-		'μ' : float;
+		'μ' : real;
 		
 		/**
 		 * The distribution's standard deviation.
 		 */
-		'σ' : float;	
+		'σ' : real;	
 	}
 	
 	
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/cdi/MachineLearningModuleProducer.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/cdi/MachineLearningModuleProducer.java
index 1dc67e95..8f7489bc 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/cdi/MachineLearningModuleProducer.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/cdi/MachineLearningModuleProducer.java
@@ -10,6 +10,7 @@ import de.evoal.languages.model.dl.dsl.DefinitionLanguageStandaloneSetup;
 import de.evoal.languages.model.mll.dsl.MachineLearningLanguageStandaloneSetup;
 import de.evoal.languages.model.mll.MachineLearningModule;
 import de.evoal.languages.model.mll.impl.MllPackageImpl;
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
 import de.evoal.surrogate.api.SurrogateBlackboardEntries;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.emf.common.util.URI;
@@ -75,6 +76,10 @@ public class MachineLearningModuleProducer {
     private Optional<MachineLearningModule> read(final File modelFile) {
         log.info("Reading model file {}.", modelFile);
 
+        final File folder = modelFile.getAbsoluteFile().getParentFile();
+        ClasspathGlobalScopeProvider.SEARCH_PATH.add(folder.toString());
+        log.info("Adding {} to search path.", folder);
+
         final Injector injector = new MachineLearningLanguageStandaloneSetup().createInjectorAndDoEMFRegistration();
         new DataDescriptionLanguageStandaloneSetup().createInjectorAndDoEMFRegistration();
         new DefinitionLanguageStandaloneSetup().createInjectorAndDoEMFRegistration();
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/module-info.java b/src/core/de.evoal.surrogate.api/src/main/java/module-info.java
index 6b25b824..f1a1b1b0 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/module-info.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/module-info.java
@@ -29,6 +29,7 @@ module de.evoal.surrogate.api {
     requires de.evoal.languages.model.instance;
     requires de.evoal.core.ea;
     requires com.google.guice;
+    requires de.evoal.languages.model.utils;
 
     exports de.evoal.surrogate.api;
     exports de.evoal.surrogate.api.function;
diff --git a/src/core/de.evoal.surrogate.simple/src/main/java/module-info.java b/src/core/de.evoal.surrogate.simple/src/main/java/module-info.java
index f0b82609..a0d7f423 100644
--- a/src/core/de.evoal.surrogate.simple/src/main/java/module-info.java
+++ b/src/core/de.evoal.surrogate.simple/src/main/java/module-info.java
@@ -7,4 +7,8 @@ module de.evoal.surrogate.simple {
     requires de.evoal.core.main;
     requires de.evoal.surrogate.api;
     requires jakarta.inject.api;
+
+    exports de.evoal.surrogate.simple.identity to weld.core.impl;
+    exports de.evoal.surrogate.simple.linear to weld.core.impl;
+    exports de.evoal.surrogate.simple.quadratic to weld.core.impl;
 }
diff --git a/src/core/de.evoal.surrogate.simple/src/main/resources/de/evoal/surrogate/simple/ml.dl b/src/core/de.evoal.surrogate.simple/src/main/resources/de/evoal/surrogate/simple/ml.dl
index 08d465ab..c4feef79 100644
--- a/src/core/de.evoal.surrogate.simple/src/main/resources/de/evoal/surrogate/simple/ml.dl
+++ b/src/core/de.evoal.surrogate.simple/src/main/resources/de/evoal/surrogate/simple/ml.dl
@@ -12,12 +12,12 @@ module de.evoal.surrogate.simple.ml {
 	}
 	
 	type 'linear-regression' extends surrogate {
-	    intercept : float;
-	    slope : float;
+	    intercept : real;
+	    slope : real;
 	}
 	
 	type 'simple-quadratic-regression' extends surrogate {
-	    intercept : float;
-	    slope : float;
+	    intercept : real;
+	    slope : real;
 	}
 }
\ No newline at end of file
diff --git a/src/core/de.evoal.surrogate.svr/src/main/resources/de/evoal/surrogate/svr/ml.dl b/src/core/de.evoal.surrogate.svr/src/main/resources/de/evoal/surrogate/svr/ml.dl
index 02497d1b..6810d782 100644
--- a/src/core/de.evoal.surrogate.svr/src/main/resources/de/evoal/surrogate/svr/ml.dl
+++ b/src/core/de.evoal.surrogate.svr/src/main/resources/de/evoal/surrogate/svr/ml.dl
@@ -1,52 +1,50 @@
 import "definitions" from de.evoal.surrogate.ml;
 
 module de.evoal.surrogate.svr.ml {
-	abstract type 'svr-surrogate' extends surrogate {}
-	
 	abstract type 'epsilon-svr' extends surrogate {
-	        /**
-	         * Some totally <b>accurate</b> description of a very soft margin.
-	         */
-	        'soft-margin'   : float;
-	        tolerance       : float;
-	        'ε'             : float;
+		/**
+	     * Some totally <b>accurate</b> description of a very soft margin.
+	     */
+		'soft-margin'   : real;
+		tolerance       : real;
+		'ε'             : real;
 	}
 	
 	type  'gaussian-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
+		'σ'             : real;
 	}
 	
 	type 'hellinger-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
+		'σ'             : real;
 	}
 	
 	type 'hyperbolic-tangent-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
-	        scale           : float;
-	        offset          : float;
+		'σ'             : real;
+		scale           : real;
+		offset          : real;
 	}
 	
 	type 'laplacian-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
+		'σ'             : real;
 	}
 	
 	type 'linear-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
+		'σ'             : real;
 	}
 	
 	type 'pearson-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
-	        'ω'             : float;
+		'σ'             : real;
+		'ω'             : real;
 	}
 	
 	type 'polynomial-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
-	        'degree'        : int;
-	        'scale'         : float;
-	        'offset'        : float;
+		'σ'             : real;
+		'degree'        : int;
+		'scale'         : real;
+		'offset'        : real;
 	}
 	
 	type 'thin-plate-spline-svr' extends 'epsilon-svr' {
-	        'σ'             : float;
+		'σ'             : real;
 	}
 }
\ No newline at end of file
diff --git a/src/examples/generator/ackley.generator b/src/examples/generator/ackley.generator
index 78ed183b..e0d4b05a 100644
--- a/src/examples/generator/ackley.generator
+++ b/src/examples/generator/ackley.generator
@@ -3,29 +3,31 @@ import "definitions" from de.evoal.generator.generator;
 import "data" from ackley;
 
 
-/**
- * Introduce a simple pipeline that generates some test data using
- *   the ackley function.
- */
-pipeline 'main-pipeline' [
+module ackley {
 	/**
-	 * First, we generate some normally distributed data.
+	 * Introduce a simple pipeline that generates some test data using
+	 *   the ackley function.
 	 */
-	step {
-		component 'normal-distribution' {
-			'μ' := 0.0;
-			'σ' := 5.12;
-		}		
-		
-		writes [data 'x:0'];
-	}
-    step {
-        component 'ackley' {
-        }
-
-        reads [data 'x:0'];
-        writes [data 'y:0'];
-     }
-]
-
-write "ackley.json" with 1000 samples from executing [ pipeline 'main-pipeline'];
\ No newline at end of file
+	pipeline 'main-pipeline' [
+		/**
+		 * First, we generate some normally distributed data.
+		 */
+		step {
+			component 'normal-distribution' {
+				'μ' := 0.0;
+				'σ' := 5.12;
+			}		
+			
+			writes [data 'x:0'];
+		}
+	    step {
+	        component 'ackley' {
+	        }
+	
+	        reads [data 'x:0'];
+	        writes [data 'y:0'];
+	     }
+	]
+	
+	write "ackley.json" with 1000 samples from executing [ pipeline 'main-pipeline'];
+}
\ No newline at end of file
diff --git a/src/examples/search/search.ol b/src/examples/search/search.ol
index 84e39045..bfc245af 100644
--- a/src/examples/search/search.ol
+++ b/src/examples/search/search.ol
@@ -8,62 +8,62 @@ import "definitions" from de.evoal.core.ea.optimisation;
 
 import "data" from search;
 
-specify problem 'example-search' {
-	description := "Simple search";
-	'search-space' := [data 'x:0'];
-	'optimisation-space' := [data 'y:0'];
-	'maximise' := true;
-	'optimisation-function' := 'benchmark-function' {
-		'benchmark' := ackley {};
-	};
-}
+module search {
+	specify problem 'example-search' {
+		description := "Simple search";
+		'search-space' := [data 'x:0'];
+		'optimisation-space' := [data 'y:0'];
+		'maximise' := true;
+		'optimisation-function' := 'benchmark-function' {
+			'benchmark' := ackley {};
+		};
+	}
+		
+		
+	configure 'evolutionary-algorithm' for 'example-search' {
+		'number-of-generations' := 100;
+		'size-of-population' := 50;
+		'maximum-age' := 100;
 	
+		'initialisation' := 'random-population' {};
+		
+		'comparator' := 'numeric-comparator' {};
 	
-configure 'evolutionary-algorithm' for 'example-search' {
-	'number-of-generations' := 100;
-	'size-of-population' := 50;
-	'maximum-age' := 100;
-
-	'initialisation' := 'random-population' {};
+	    genotype := [
+	            'bit-chromosome' {
+	                    scale := 12;
+	                    genes:= [
+	                            gene {content:= data 'x:0';}
+	                    ];
+	            }
+	    ];
 	
-	'comparator' := 'numeric-comparator' {};
-
-    genotype := [
-            'bit-chromosome' {
-                    scale := 12;
-                    genes:= [
-                            gene {content:= data 'x:0';}
-                    ];
-            }
-    ];
-
-    handlers := [];
-
-    selectors := selectors {
-        offspring := 'roulette-wheel-selector' {};
-        survivor := 'elite-selector' {
-                'size-factor' := 0.3;
-                'non-elite-selector' := 'tournament-selector' {
-                        'size-factor' := 0.1;
-                };
-        };
-    };
-    
-	alterers := alterers {
-        crossover := [
-                'single-point-crossover' {
-                        probability := 0.5;
-
-                }
-        ];
-        mutator := [
-                'bit-flip-mutator' {
-                        probability := 0.5;
-                        }
-        ];
-    };
-
-	'optimisation-function' := 'problem-function' {};
- 
-    
-}
+	    handlers := [];
+	
+	    selectors := selectors {
+	        offspring := 'roulette-wheel-selector' {};
+	        survivor := 'elite-selector' {
+	                'size-factor' := 0.3;
+	                'non-elite-selector' := 'tournament-selector' {
+	                        'size-factor' := 0.1;
+	                };
+	        };
+	    };
+	    
+		alterers := alterers {
+	        crossover := [
+	                'single-point-crossover' {
+	                        probability := 0.5;
+	
+	                }
+	        ];
+	        mutator := [
+	                'bit-flip-mutator' {
+	                        probability := 0.5;
+	                        }
+	        ];
+	    };
+	
+		'optimisation-function' := 'problem-function' {};
+	}
+}
\ No newline at end of file
diff --git a/src/examples/surrogate/training.mll b/src/examples/surrogate/training.mll
index c7947c02..a78c8be7 100644
--- a/src/examples/surrogate/training.mll
+++ b/src/examples/surrogate/training.mll
@@ -3,25 +3,27 @@ import "definitions" from de.evoal.surrogate.svr.ml;
 
 import "data" from surrogate;
 
-prediction svr
-	maps 'x:0'
-    to 'y:0'
-    using
-    	layer transfer
-			with function 'gaussian-svr'
-				mapping 'x:0'
-				to 'y:0'
-				with parameters
-					'ε' := 1.4;
-					'σ' := 3.0;
-					'soft-margin' := 0.15;
-					tolerance := 0.1;
-
-for _counter in [1 to 10] loop
-        predict svr from "data.json"
-        and measure
-                'cross-validation'(10);
-                'R²'();
-        end
-        and store to "svr_${_counter}.pson"
-end
+module training {
+	prediction svr
+		maps 'x:0'
+	    to 'y:0'
+	    using
+	    	layer transfer
+				with function 'gaussian-svr'
+					mapping 'x:0'
+					to 'y:0'
+					with parameters
+						'ε' := 1.4;
+						'σ' := 3.0;
+						'soft-margin' := 0.15;
+						tolerance := 0.1;
+	
+	for _counter in [1 to 10] loop
+	        predict svr from "data.json"
+	        and measure
+	                'cross-validation'(10);
+	                'R²'();
+	        end
+	        and store to "svr_${_counter}.pson"
+	end
+}
\ No newline at end of file
-- 
GitLab