From 6cd420b57d0b760a0c29de45c3d8436d450d79b7 Mon Sep 17 00:00:00 2001
From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de>
Date: Sat, 6 May 2023 17:51:28 +0200
Subject: [PATCH] Adapted EvoAl to changes in languages.

---
 .gitignore                                    |   3 +-
 ci/create-release.sh                          |  66 ++++---
 .../core/ea/main/alterer/AltererFactory.java  |  61 +++----
 .../JeneticsConstraintProducer.java           |   6 +-
 .../ea/main/producer/SelectorFactory.java     |  30 ++--
 .../search/EvolutionaryAlgorithmSearch.java   |   5 +-
 .../src/main/java/module-info.java            |   1 +
 .../de/evoal/core/ea/optimisation.dl          |   3 +
 src/core/de.evoal.core.main/pom.xml           |   9 +
 .../de.evoal.core.main/scripts/run-search.sh  |   1 +
 .../calculation/CalculationFactory.java       |   9 +-
 .../evoal/core/api/utils/LanguageHelper.java  | 163 ++++++++++++++----
 .../StandardDeviationCalculation.java         |   5 +-
 .../fitness/MalusFunctionProducer.java        |  12 +-
 .../internal/MalusForFitnessFunction.java     |   7 +-
 .../constraint/utils/ConfigurationUtils.java  |   3 +-
 .../producer/ConfigurationValueProducer.java  |  12 +-
 .../src/main/java/module-info.java            |   6 +-
 .../resources/de/evoal/core/optimisation.dl   |   4 +-
 .../api/utils/LanguageHelperUnitTest.java     |  63 ++++---
 .../generator/main/benchmarks/Ackley.java     |  17 +-
 .../generator/main/benchmarks/Rastrigin.java  |   7 +-
 .../main/functions/ConstantFunction.java      |  15 +-
 .../main/generators/NormalDistribution.java   |  18 +-
 .../main/generators/RealDistributionBase.java |   2 +
 .../main/generators/UniformDistribution.java  |   1 -
 .../main/internal/StatementExecutor.java      |   9 +-
 .../main/utils/ConfigurationHelper.java       |   7 +-
 .../src/main/java/module-info.java            |   2 +
 .../resources/de/evoal/generator/generator.dl |  17 +-
 .../FunctionCombinerConfiguration.java        |   7 +-
 .../api/configuration/Parameter.java          |   5 +-
 .../PartialFunctionConfiguration.java         |  11 +-
 .../configuration/SurrogateConfiguration.java |   6 +-
 .../main/internal/StatementExecutor.java      |   9 +-
 35 files changed, 402 insertions(+), 200 deletions(-)

diff --git a/.gitignore b/.gitignore
index 0b81bb9b..648e2405 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,5 @@ test-bin
 *._trace
 xtend-gen
 .idea
-*.iml
\ No newline at end of file
+*.iml
+evoal/
\ No newline at end of file
diff --git a/ci/create-release.sh b/ci/create-release.sh
index b8bb8189..d771852c 100755
--- a/ci/create-release.sh
+++ b/ci/create-release.sh
@@ -1,46 +1,62 @@
 #!/bin/bash
 
+RELEASE_PLUGINS="generator.main surrogate.api surrogate.simple surrogate.svr approximative.density core.arff core.ea"
 
 
+EVOAL_HOME=evoal
+PROJECT_HOME=src/core/
 
+# clear old build
+rm -rf "$EVOAL_HOME"
+mkdir -p "$EVOAL_HOME/bin"
+mkdir -p "$EVOAL_HOME/definitions"
+mkdir -p "$EVOAL_HOME/plugins"
 
-RELEASE_PLUGINS="generator.main surrogate.api surrogate.simple surrogate.svr approximative.density core.arff core.ea"
 
 
-rm -rf evoal
-mkdir -p evoal/plugins
 
-cp src/languages/de.evoal.languages.releng.site/target/de.evoal.languages.releng.site-*.zip "evoal/eclipse-update-site.zip"
-cp -r src/core/de.evoal.core.main/target/core.main evoal/modules
 
-for NAME in $RELEASE_PLUGINS; do
-    echo "Copying plugin $NAME"
-    cp -r src/core/de.evoal.$NAME/target/$NAME evoal/plugins/$NAME
-done
 
-# remove multiple definitions of javax stuff
-rm evoal/modules/javax.inject*
-rm evoal/modules/javax.annotation-api-*
-rm evoal/modules/jsr305-*
 
-# remove multiple definitions of CDI stuff
-rm evoal/modules/jboss-annotations-api*
-rm evoal/modules/jboss-interceptors-api*
-rm evoal/modules/jboss-el-api*
 
-cd evoal
 
-# remove xtext util since we merged it to xtext
-rm modules/org.eclipse.xtext.util-*
+# create evoal release
+echo "Copying Eclipse Update Site."
+cp src/languages/de.evoal.languages.releng.site/target/de.evoal.languages.releng.site-*.zip "evoal/eclipse-update-site.zip"
 
-# let's copy the scripts to the correct location
-mkdir bin
+echo "Copying core.main"
+cp -r "$PROJECT_HOME/de.evoal.core.main/target/core.main" "$EVOAL_HOME/modules"
 
-cp -r ../src/core/de.evoal.core.main/scripts/* "bin"
 for NAME in $RELEASE_PLUGINS; do
+    echo "Copying plugin $NAME"
+    cp -r "$PROJECT_HOME/de.evoal.$NAME/target/$NAME" "$EVOAL_HOME/plugins/$NAME"
+done
+
+# link scripts
+for NAME in core.main $RELEASE_PLUGINS; do
     echo "Copying scripts of plugin $NAME"
 
-    if [ -e ../src/core/de.evoal.$NAME/scripts ]; then
-      cp -r ../src/core/de.evoal.$NAME/scripts/* bin
+    if [ -e "$PROJECT_HOME/de.evoal.$NAME/scripts" ]; then
+      for SCRIPT in $PROJECT_HOME/de.evoal.$NAME/scripts/*; do
+        cp $SCRIPT "$EVOAL_HOME/bin/`basename $SCRIPT`"
+      done
+    fi
+done
+
+# copy definitions
+for NAME in core.main $RELEASE_PLUGINS; do
+    echo "Copying definitions of plugin $NAME"
+
+    PLUGIN_BASE="$PROJECT_HOME/de.evoal.$NAME/src/main/resources"
+    if [ -e $PLUGIN_BASE ]; then
+      DEFINITION_FILES=`cd $PLUGIN_BASE && find . -name "*dl"`
+
+      for DF in $DEFINITION_FILES; do
+        mkdir -p $EVOAL_HOME/definitions/`dirname "$DF"`
+        cp $PLUGIN_BASE/$DF "$EVOAL_HOME/definitions/$DF"
+      done
     fi
 done
+
+# copy examples
+cp -r $PROJECT_HOME/../examples $EVOAL_HOME/examples
\ No newline at end of file
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java
index 9d919d0f..54df0601 100644
--- a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java
@@ -23,6 +23,9 @@ import javax.inject.Inject;
 @Slf4j
 public class AltererFactory {
 
+	@Inject
+	private CustomCodec codec;
+
 	@Inject
 	private Correlations correlations;
 
@@ -30,7 +33,7 @@ public class AltererFactory {
 	private BiFunction<Double, Double, Alterer> factory;
 
 	@Inject
-	private CustomCodec codec;
+	private LanguageHelper helper;
 
 	/**
 	 * Creates an alterer based on the heuristic configuration.
@@ -41,7 +44,7 @@ public class AltererFactory {
 	 * </ul>
 	 */
 	public <G extends Gene<?, G>> Alterer<G, OptimisationValue> create(final Instance config) {
-		final String name = LanguageHelper.lookup(config, "name");
+		final String name = helper.lookup(config, "name");
 
 		log.info("Creating alterer with name '{}'.", name);
 
@@ -73,105 +76,105 @@ public class AltererFactory {
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createUniformCrossover(final Instance config) {
-		final Double crossoverProbability = LanguageHelper.lookup(config, "crossover-probability");
-		final Double swapProbability = LanguageHelper.lookup(config,"swap-probability");
+		final Double crossoverProbability = helper.lookup(config, "crossover-probability");
+		final Double swapProbability = helper.lookup(config,"swap-probability");
 
 		return new UniformCrossover<>(crossoverProbability, swapProbability);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationUniformCrossover(final Instance config) {
-		final Double crossoverProbability = LanguageHelper.lookup(config, "crossover-probability");
-		final Double swapProbability = LanguageHelper.lookup(config,"swap-probability");
+		final Double crossoverProbability = helper.lookup(config, "crossover-probability");
+		final Double swapProbability = helper.lookup(config,"swap-probability");
 		
 		return new UniformCorrelationCrossover(crossoverProbability, swapProbability, correlations, codec);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createBitFlipMutator (final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return new SingleBitFlipMutator(probability);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationBitFlipMutator (final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
-		final Double threshold = LanguageHelper.lookup(config, "threshold");
+		final Double probability = helper.lookup(config, "probability");
+		final Double threshold = helper.lookup(config, "threshold");
 
 		return new SingleBitFlipCorrelationMutator(probability, threshold, correlations, codec);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createSwapMutator (final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return new SwapMutator<>(probability);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationSwapMutator (final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
-		final Double threshold = LanguageHelper.lookup(config, "threshold");
+		final Double probability = helper.lookup(config, "probability");
+		final Double threshold = helper.lookup(config, "threshold");
 
 		return new SwapCorrelationMutator<>(probability, threshold, correlations, codec);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createSinglePointCrossover(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return new SinglePointCrossover<>(probability);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationSinglePointCrossover(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return new SinglePointCorrelationCrossover(probability, correlations, codec);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createPartiallyMatchedAlterer(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return (Alterer<G, OptimisationValue>) new PartiallyMatchedCrossover(probability);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationPartiallyMatchedAlterer(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return (Alterer<G, OptimisationValue>) new PartiallyMatchedCorrelationCrossover<G, OptimisationValue>(probability, correlations, codec);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createMultiPointCrossover(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
-		final Integer count = LanguageHelper.lookup(config, "count");
+		final Double probability = helper.lookup(config, "probability");
+		final Integer count = helper.lookup(config, "count");
 
 		return new MultiPointCrossover<>(probability, count);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationMultiPointCrossover(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
-		final Integer count = LanguageHelper.lookup(config, "count");
+		final Double probability = helper.lookup(config, "probability");
+		final Integer count = helper.lookup(config, "count");
 
 		return new MultiPointCorrelationCrossover<>(probability, count, correlations, codec);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createMeanAlterer(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return  (Alterer<G, OptimisationValue>) new MeanAlterer(probability);
 	}
 
 	private <G extends NumericGene<?, G> & Mean<G>> Alterer<G, OptimisationValue> createCorrelationMeanAlterer(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 
 		return new MeanCorrelationAlterer<G, OptimisationValue>(probability, correlations, codec);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createLineCrossover(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
-		final Double position = LanguageHelper.lookup(config, "position");
+		final Double probability = helper.lookup(config, "probability");
+		final Double position = helper.lookup(config, "position");
 
 		return new LineCrossover(probability, position);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationLineCrossover(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
-		final Double position = LanguageHelper.lookup(config, "position");
+		final Double probability = helper.lookup(config, "probability");
+		final Double position = helper.lookup(config, "position");
 
 		return new LineCorrelationCrossover(probability, position, correlations, codec);
 	}
@@ -181,14 +184,14 @@ public class AltererFactory {
 	}
 
 	private <G extends Gene<?,G>> Alterer<G, OptimisationValue> createGaussianMutator(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
+		final Double probability = helper.lookup(config, "probability");
 		
 		return  new GaussianMutator(probability);
 	}
 
 	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createGaussianCorrelationMutator(final Instance config) {
-		final Double probability = LanguageHelper.lookup(config, "probability");
-		final Double threshold = LanguageHelper.lookup(config, "threshold");
+		final Double probability = helper.lookup(config, "probability");
+		final Double threshold = helper.lookup(config, "threshold");
 
 		return factory.apply(probability, threshold);
 	}
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java
index 28dda096..2f06ecb1 100644
--- a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java
@@ -17,6 +17,7 @@ import de.evoal.languages.model.base.*;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
 import javax.inject.Named;
 
 import java.util.*;
@@ -25,6 +26,9 @@ import java.util.stream.Collectors;
 
 @ApplicationScoped
 public class JeneticsConstraintProducer {
+    @Inject
+    private LanguageHelper helper;
+
     @Produces
     public List<io.jenetics.engine.Constraint> create(
             final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Instance [] handlerConfigurations,
@@ -44,7 +48,7 @@ public class JeneticsConstraintProducer {
                     .filter(c -> configurationMap.containsKey(c.getGroup()))
                     .map(s -> {
                         final Instance handlerConfiguration = configurationMap.get(s.getGroup());
-                        final Instance repairConfiguration = LanguageHelper.lookup(handlerConfiguration, "constraint-handling.repair-strategy");
+                        final Instance repairConfiguration = helper.lookup(handlerConfiguration, "constraint-handling.repair-strategy");
 
                         final CalculationStrategy cStrategy = factory.create(s);
                         final RepairStrategy rStrategy = BeanFactory.create(repairConfiguration.getDefinition().getName(), RepairStrategy.class)
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SelectorFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SelectorFactory.java
index 629094c4..0832b6dc 100644
--- a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SelectorFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SelectorFactory.java
@@ -5,6 +5,7 @@ import de.evoal.core.api.cdi.ConfigurationValue;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.base.Instance;
 import io.jenetics.*;
+import io.jenetics.ext.moea.NSGA2Selector;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
@@ -13,6 +14,9 @@ import javax.inject.Named;
 
 @ApplicationScoped
 public class SelectorFactory {
+	@Inject
+	private LanguageHelper helper;
+	
 	@Inject
 	@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.size-of-population")
 	private int sizeOfPopulation;
@@ -47,25 +51,25 @@ public class SelectorFactory {
 		throw new IllegalStateException("Selector '" + name + "' is unknown.");
 	}
 	
-	private static <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createBoltzmannSelector(final Instance config) {
-		double beta = LanguageHelper.lookup(config, "beta");
+	private <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createBoltzmannSelector(final Instance config) {
+		double beta = helper.lookup(config, "beta");
 
 		return (Selector<G,C>) new BoltzmannSelector<>(beta);
 	}
 
-	private static <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createExponentialRankSelector(final Instance config) {
-		final Double c = LanguageHelper.lookup(config, "c");
+	private <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createExponentialRankSelector(final Instance config) {
+		final Double c = helper.lookup(config, "c");
 
 		return new ExponentialRankSelector<>(c);
 	}
 
-	private static <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createTruncationSelector(final Instance config) {
-		int worstRank = LanguageHelper.lookup(config, "worstRank");
+	private <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createTruncationSelector(final Instance config) {
+		int worstRank = helper.lookup(config, "worstRank");
 		return new TruncationSelector<>(worstRank);
 	}
 
 	private <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createTournamentSelector(final Instance config) {
-		int count = (int)(LanguageHelper.<Double>lookup(config, "size-factor") * sizeOfPopulation);
+		int count = (int)(helper.<Double>lookup(config, "size-factor") * sizeOfPopulation);
 		return new TournamentSelector<>(count);
 	}
 
@@ -73,8 +77,8 @@ public class SelectorFactory {
 		return (Selector<G,C>) new StochasticUniversalSelector<>();
 	}
 
-	private static <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createLinearRankSelector(final Instance config) {
-		Integer nminus = LanguageHelper.lookup(config, "nminus");
+	private <G extends Gene<?,G>, C extends Comparable<? super C>> Selector<G, C> createLinearRankSelector(final Instance config) {
+		Integer nminus = helper.lookup(config, "nminus");
 		if(nminus == null) {
 			throw new IllegalStateException("'" + nminus + "' is not defined.");
 		}
@@ -86,15 +90,17 @@ public class SelectorFactory {
 	}
 
 	private <G extends Gene<?,G>, C extends Comparable<? super C>> EliteSelector<G,C> createEliteSelector(final Instance config) {
-		int count = (int)(LanguageHelper.<Double>lookup(config, "size-factor") * sizeOfPopulation);
-		final Instance nonEliteSelectorConfig = LanguageHelper.lookup(config, "non-elite-selector");
+		int count = (int)(helper.<Double>lookup(config, "size-factor") * sizeOfPopulation);
+		final Instance nonEliteSelectorConfig = helper.lookup(config, "non-elite-selector");
 		
 		if(nonEliteSelectorConfig == null) {
 			return new EliteSelector<>(count);
 		}
 		else {
-			Selector<G,C> nonEliteSelector = create(LanguageHelper.lookup(nonEliteSelectorConfig, "name"), nonEliteSelectorConfig);
+			Selector<G,C> nonEliteSelector = create(helper.lookup(nonEliteSelectorConfig, "name"), nonEliteSelectorConfig);
 			return new EliteSelector<>(count, nonEliteSelector);
 		}
+
+		NSGA2Selector
 	}
 }
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmSearch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmSearch.java
index 7c462741..4b8cdc16 100644
--- a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmSearch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmSearch.java
@@ -45,6 +45,9 @@ public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm {
 	@Inject
 	private Blackboard board;
 
+	@Inject
+	private LanguageHelper helper;
+
 	/**
 	 * Location for storing the output.
 	 */
@@ -146,7 +149,7 @@ public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm {
 	private void setup() {
 		final OptimisationModel configuration = board.get(CoreBlackboardEntries.OPTIMISATION_CONFIGURATION);
 
-		final de.evoal.languages.model.base.Instance alterers = LanguageHelper.lookup(configuration.getAlgorithm().getInstance(), "alterers");
+		final de.evoal.languages.model.base.Instance alterers = helper.lookup(configuration, "algorithm.alterers");
 
 		for(final Attribute category: alterers.getAttributes()) {
 			final String name = category.getDefinition().getName();
diff --git a/src/core/de.evoal.core.ea/src/main/java/module-info.java b/src/core/de.evoal.core.ea/src/main/java/module-info.java
index 8e399ed7..d8e1d8fd 100644
--- a/src/core/de.evoal.core.ea/src/main/java/module-info.java
+++ b/src/core/de.evoal.core.ea/src/main/java/module-info.java
@@ -23,6 +23,7 @@ module de.evoal.core.ea {
     requires de.evoal.languages.model.ol;
     requires org.eclipse.emf.ecore;
 
+    opens de.evoal.core.ea;
 
     opens de.evoal.core.ea.main.alterer to weld.core.impl;
     opens de.evoal.core.ea.main.alterer.mutator to weld.core.impl;
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 07f279ac..6e15ba36 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
@@ -75,6 +75,9 @@ module de.evoal.core.ea.optimisation {
 	abstract type selector {
 	}
 	
+	type 'roulette-wheel-selector' extends selector {
+	}
+
 	type 'elite-selector' extends selector {
 		'size-factor' : float;
 		'non-elite-selector' : instance selector;
diff --git a/src/core/de.evoal.core.main/pom.xml b/src/core/de.evoal.core.main/pom.xml
index de141829..8f723b9b 100644
--- a/src/core/de.evoal.core.main/pom.xml
+++ b/src/core/de.evoal.core.main/pom.xml
@@ -269,6 +269,15 @@
 			<version>${project.version}</version>
 			<scope>test</scope>
 		</dependency>
+
+		<dependency>
+			<groupId>org.jboss.weld</groupId>
+			<artifactId>weld-junit5</artifactId>
+<!--			<artifactId>weld-junit-parent</artifactId>
+			 -->
+			<version>3.1.0.Final</version>
+			<scope>test</scope>
+		</dependency>
 	</dependencies>
 
 	<build>
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 62e72327..4cc594fa 100755
--- a/src/core/de.evoal.core.main/scripts/run-search.sh
+++ b/src/core/de.evoal.core.main/scripts/run-search.sh
@@ -11,6 +11,7 @@ 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/constraints/calculation/CalculationFactory.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/constraints/calculation/CalculationFactory.java
index d84c62d0..e3f0f758 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/constraints/calculation/CalculationFactory.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/constraints/calculation/CalculationFactory.java
@@ -18,14 +18,17 @@ import java.util.Map;
 public class CalculationFactory {
     private final Map<String, Instance> calculationConfigurationByCategory = new HashMap<>();
 
+    @Inject
+    private LanguageHelper helper;
+
     @Inject
     public CalculationFactory(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Instance [] handlerConfigurations) {
         Arrays.stream(handlerConfigurations)
                              .map(Instance.class::cast)
                              .filter(LanguageHelper.filterInstanceByType("constraint-handler"))
                              .forEach(i -> {
-                                 final String category = LanguageHelper.lookup(i, "category");
-                                 final Instance config = LanguageHelper.lookup(i, "calculation");
+                                 final String category = helper.lookup(i, "category");
+                                 final Instance config = helper.lookup(i, "calculation");
 
                                  calculationConfigurationByCategory.put(category, config);
                              });
@@ -33,7 +36,7 @@ public class CalculationFactory {
 
     public CalculationStrategy create(final Constraint constraint) {
         final Instance config = calculationConfigurationByCategory.get(constraint.getGroup());
-        final String calculationName = LanguageHelper.lookup(config, "name");
+        final String calculationName = helper.lookup(config, "name");
 
         final CalculationStrategy strategy = BeanFactory.create(calculationName, CalculationStrategy.class);
         strategy.init(constraint, config);
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/utils/LanguageHelper.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/utils/LanguageHelper.java
index ffa77ee2..8eed5b99 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/utils/LanguageHelper.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/utils/LanguageHelper.java
@@ -1,32 +1,123 @@
 package de.evoal.core.api.utils;
 
-import de.evoal.languages.model.dl.*;
-import de.evoal.languages.model.base.BooleanLiteral;
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.languages.model.base.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Objects;
+import de.evoal.languages.model.ol.AlgorithmInstance;
+import de.evoal.languages.model.ol.OptimisationModel;
+import de.evoal.languages.model.ol.ProblemInstance;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.function.Predicate;
 
 /**
- * Helper class for processing instances.
+ * Helper component for processing instances.
  */
-public final class LanguageHelper {
-    /**
-     * Logger instance
-     */
-    private static final Logger log = LoggerFactory.getLogger(LanguageHelper.class);
-
-    /**
-     * Private constructor for avoiding instances of this class.
-     */
-    private LanguageHelper() {
+@ApplicationScoped
+@Slf4j
+public class LanguageHelper {
+    @Inject
+    private ExpressionEvaluator evaluator;
+
+    public <T> T lookup(final OptimisationModel model, final String path) {
+        log.debug("Locking up '{}':", path);
+
+        if(path == null) {
+            log.warn("Asking for a null-path.");
+            throw new IllegalArgumentException("Path is not allowed to be null");
+        } else if(path.isEmpty()) {
+            return (T)model;
+        }
+
+        final List<String> splittedPath = new LinkedList<>(Arrays.asList(path.split("\\.")));
+
+        if("problem".equals(splittedPath.get(0))) {
+            splittedPath.remove(0);
+            return lookup(model.getProblem(), splittedPath);
+        } else if("algorithm".equals(splittedPath.get(0))) {
+            splittedPath.remove(0);
+            return lookup(model.getAlgorithm(), splittedPath);
+        }
+
+        log.error("Cannot lookup path '{}'.", path);
+        throw new IllegalArgumentException("Invalid path '" + path + "' for optimisation model.");
     }
 
-    public static <T> T lookup(final Instance instance, final String path) {
+    private <T> T lookup(final ProblemInstance problem, final List<String> path) {
         log.debug("Locking up '{}':", path);
 
+        if(path.size() == 0) {
+            return (T)problem;
+        }
+
+        Object value = null;
+        switch (path.get(0)) {
+                case "name":
+                    value = problem.getName();
+                    path.remove(0);
+                    break;
+                case "documentation":
+                    value = problem.getDocumentation();
+                    path.remove(0);
+                    break;
+                case "instance":
+                    path.remove(0);
+                default:
+                    value = problem;
+        }
+
+        if(path.size() == 0) {
+            return (T)value;
+        }
+
+        if(!(value instanceof Instance)) {
+            log.error("Lookup did not result in an instance: {}", value);
+            throw new IllegalStateException("Lookup resulted in a non-instance: " + value);
+        }
+
+        return lookup((Instance)value, path);
+    }
+
+    private <T> T lookup(final AlgorithmInstance algorithm, final List<String> path) {
+        log.debug("Locking up '{}':", path);
+
+        if(path.size() == 0) {
+            return (T)algorithm;
+        }
+
+        Object value = null;
+        switch (path.get(0)) {
+            case "problem":
+                value = algorithm.getProblem();
+                path.remove(0);
+                break;
+            case "documentation":
+                value = algorithm.getDocumentation();
+                path.remove(0);
+                break;
+            case "instance":
+                path.remove(0);
+            default:
+                value = algorithm;
+        }
+
+        if(path.size() == 0) {
+            return (T)value;
+        }
+
+        if(!(value instanceof Instance)) {
+            log.error("Lookup did not result in an instance: {}", value);
+            throw new IllegalStateException("Lookup resulted in a non-instance: " + value);
+        }
+
+        return lookup((Instance)value, path);
+    }
+
+    public <T> T lookup(final Instance instance, final String path) {
         if(path == null) {
             log.warn("Asking for a null-path.");
             throw new IllegalArgumentException("Path is not allowed to be null");
@@ -34,11 +125,22 @@ public final class LanguageHelper {
             return (T)instance;
         }
 
-        final String [] parts = path.split("\\.");
+        return lookup(instance, Arrays.asList(path.split("\\.")));
+    }
+
+    private <T> T lookup(final Instance instance, final List<String> path) {
+        log.debug("Locking up '{}':", path);
+
+        if(path == null) {
+            log.warn("Asking for a null-path.");
+            throw new IllegalArgumentException("Path is not allowed to be null");
+        } else if(path.isEmpty()) {
+            return (T)instance;
+        }
 
         Object current = instance;
 
-        for(final String part : parts) {
+        for(final String part : path) {
             try {
                 if(current == null) {
                     log.error("Unable to select child on null value.");
@@ -82,11 +184,11 @@ public final class LanguageHelper {
         return (T) current;
     }
 
-    private static Object convertToJava(final Object current, final Type type) {
+    private Object convertToJava(final Object current, final Type type) {
         if(type instanceof InstanceType) {
             return (Instance)current;
         } else if(type instanceof LiteralType) {
-            return readLiteral(current, type);
+            return readExpression(current, type);
         } else if(type instanceof ArrayType) {
             return readArray(current, type);
         }
@@ -94,7 +196,7 @@ public final class LanguageHelper {
         return current;
     }
 
-    private static Object readArray(final Object current, final Type type) {
+    private Object readArray(final Object current, final Type type) {
         final Array array = (Array)current;
 
         return array.getValues()
@@ -103,19 +205,8 @@ public final class LanguageHelper {
                     .toArray();
     }
 
-    private static Object readLiteral(final Object current, final Type type) {
-        if(type instanceof FloatType) {
-            return ((Number)((Literal)current).getValue()).doubleValue();
-        } else if(type instanceof IntType) {
-            return ((Number)((Literal)current).getValue()).intValue();
-        } else if(type instanceof StringType) {
-            return Objects.toString(((Literal)current).getValue());
-        } else if(type instanceof BooleanType) {
-            // TODO Fix hard call to is value
-            return Boolean.TRUE.equals(((Literal)((Literal)current)).getValue());
-        }
-
-        throw new UnsupportedOperationException("Type " + type.toString() + " is not supported.");
+    private Object readExpression(final Object current, final Type type) {
+        return evaluator.evaluate(current);
     }
 
     public static Predicate<? super Value> filterInstanceByType(final String instanceTypeName) {
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
index 8c1505f8..1d9003c9 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
@@ -24,6 +24,9 @@ import java.util.stream.Collectors;
 @Dependent
 @Named("standard-deviation")
 public class StandardDeviationCalculation implements CalculationStrategy {
+    @Inject
+    private LanguageHelper helper;
+
     @Inject
     private Deviations deviations;
 
@@ -98,7 +101,7 @@ public class StandardDeviationCalculation implements CalculationStrategy {
     public void init(final Constraint constraint, final Instance configuration) {
         this.configuration = configuration;
         this.constraint = constraint;
-        this.factor = LanguageHelper.lookup(configuration, "factor");
+        this.factor = helper.lookup(configuration, "factor");
 
         final List<PropertySpecification> sourceProperties = constraint.getUsedProperties();
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/MalusFunctionProducer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
index 1bb3ed32..3f110238 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
@@ -20,12 +20,16 @@ import de.evoal.core.main.constraints.constraint.utils.ConfigurationUtils;
 import de.evoal.languages.model.base.*;
 import org.apache.commons.math3.util.Pair;
 
+import javax.inject.Inject;
 import javax.inject.Named;
 import java.util.*;
 import java.util.stream.Collectors;
 
 @ApplicationScoped
 public class MalusFunctionProducer {
+    @Inject
+    private LanguageHelper helper;
+
     @ApplicationScoped @Produces
     public MalusForFitnessStrategy create(
             final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Instance [] handlers,
@@ -96,9 +100,9 @@ public class MalusFunctionProducer {
 
                     final CalculationStrategy calculation = factory.create(constraint);
 
-                    final String handlerName = LanguageHelper.lookup(configuration, "name");
+                    final String handlerName = helper.lookup(configuration, "name");
 
-                    final MalusFunction strategy = new MalusForFitnessFunction(constraint, LanguageHelper.lookup(configuration, "constraint-handling"), index) ;
+                    final MalusFunction strategy = new MalusForFitnessFunction(helper, constraint, helper.lookup(configuration, "constraint-handling"), index) ;
                     resultingFunction.add(index, strategy);
                }
             }
@@ -116,9 +120,9 @@ public class MalusFunctionProducer {
 
                 final CalculationStrategy calculation = factory.create(constraint);
 
-                final String handlerName = LanguageHelper.lookup(configuration, "name");
+                final String handlerName = helper.lookup(configuration, "name");
 
-                final MalusFunction strategy = new MalusForFitnessFunction(constraint, LanguageHelper.lookup(configuration, "constraint-handling"), index) ;
+                final MalusFunction strategy = new MalusForFitnessFunction(helper, constraint, helper.lookup(configuration, "constraint-handling"), index) ;
                 resultingFunction.add(index, strategy);
             }
         }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
index 033a1869..bdc1c621 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
@@ -7,13 +7,16 @@ import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.base.Instance;
 
+import javax.inject.Inject;
+
 public class MalusForFitnessFunction implements MalusFunction {
+
     private final Constraint constraint;
     private final double smoothing;
 
-    public MalusForFitnessFunction(final Constraint constraint, final Instance configuration, final int index) {
+    public MalusForFitnessFunction(final LanguageHelper helper, final Constraint constraint, final Instance configuration, final int index) {
         this.constraint = constraint;
-        smoothing = LanguageHelper.lookup(configuration, "smoothing");
+        smoothing = helper.lookup(configuration, "smoothing");
     }
 
     @Override
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/utils/ConfigurationUtils.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/utils/ConfigurationUtils.java
index 58b428ab..9d07fe50 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/utils/ConfigurationUtils.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/constraints/constraint/utils/ConfigurationUtils.java
@@ -1,5 +1,6 @@
 package de.evoal.core.main.constraints.constraint.utils;
 
+import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.base.Array;
 import de.evoal.languages.model.base.Instance;
@@ -25,7 +26,7 @@ public final class ConfigurationUtils {
                 .map(Instance.class::cast)
                 .filter(LanguageHelper.filterInstanceByType("constraint-handler"))
                 .filter(LanguageHelper.filterByAttributesInstanceType("constraint-handling", name))
-                .filter(i -> category.equals(LanguageHelper.lookup(i, "category")))
+                .filter(i -> category.equals(BeanFactory.create(LanguageHelper.class).lookup(i, "category")))
                 .findFirst()
                 .get();
     }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java
index 5f5f402e..decca494 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java
@@ -15,10 +15,14 @@ import lombok.extern.slf4j.Slf4j;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
 import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Inject;
 
 @ApplicationScoped
 @Slf4j
 public class ConfigurationValueProducer {
+    @Inject
+    private LanguageHelper helper;
+
     @Produces
     @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "")
     public Integer injectIntegerValue(final InjectionPoint ip, final Blackboard board) {
@@ -98,18 +102,16 @@ public class ConfigurationValueProducer {
     public double [] injectDoubleArrayValue(final InjectionPoint ip, final Blackboard board) {
         final ConfigurationValue value = ip.getAnnotated().getAnnotation(ConfigurationValue.class);
 
-        return (ConfigurationValueProducer.<Array>lookup(board.get(value.entry()), value.access()))
+        return (this.<Array>lookup(board.get(value.entry()), value.access()))
                 .getValues()
                 .stream()
                 .mapToDouble(x -> ((DoubleLiteral)((Literal)x)).getValue())
                 .toArray();
     }
 
-    private static <T> T lookup(final OptimisationModel model, final String access) {
+    private <T> T lookup(final OptimisationModel model, final String access) {
         log.info("Looking up configuration value {}", access);
 
-        throw new RuntimeException("Implement lookup");
-
-        //return LanguageHelper.lookup(model.getInstance(), access);
+        return helper.lookup(model, access);
     }
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/module-info.java b/src/core/de.evoal.core.main/src/main/java/module-info.java
index 2d1027cd..8eefbaf5 100644
--- a/src/core/de.evoal.core.main/src/main/java/module-info.java
+++ b/src/core/de.evoal.core.main/src/main/java/module-info.java
@@ -37,13 +37,17 @@ module de.evoal.core.main {
     requires com.google.guice;
     requires commons.math3;
 
+    opens de.evoal.core; // export dl files.
+
     exports de.evoal.core.api.board;
     exports de.evoal.core.api.cdi;
     exports de.evoal.core.api.constraints.calculation;
     exports de.evoal.core.main.constraints.constraint.utils;
     exports de.evoal.core.api.constraints.model;
     exports de.evoal.core.api.constraints.strategies;
+    exports de.evoal.core.api.constraints.strategies.fitness;
     exports de.evoal.core.api.correlations;
+    exports de.evoal.core.api.languages;
     exports de.evoal.core.api.properties;
     exports de.evoal.core.api.properties.info;
     exports de.evoal.core.api.properties.io;
@@ -59,6 +63,7 @@ module de.evoal.core.main {
     opens de.evoal.core.api.constraints.calculation to weld.core.impl;
     opens de.evoal.core.api.constraints.model to weld.core.impl;
     opens de.evoal.core.api.correlations to weld.core.impl;
+    opens de.evoal.core.api.languages to weld.core.impl;
     opens de.evoal.core.api.optimisation to weld.core.impl;
     opens de.evoal.core.api.properties to weld.core.impl;
     opens de.evoal.core.api.properties.info to weld.core.impl;
@@ -85,7 +90,6 @@ module de.evoal.core.main {
     opens de.evoal.core.main.statistics.io.csv to weld.core.impl;
     opens de.evoal.core.api.statistics.io to weld.core.impl;
     opens de.evoal.core.api.statistics.writer to weld.core.impl;
-    exports de.evoal.core.api.constraints.strategies.fitness;
 
 
     //provides de.evoal.languages.model.utils.builtin.BuiltinProvider with ModuleBuiltinProvider;
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 5a8e1f2e..bdc13725 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
@@ -5,9 +5,9 @@ module de.evoal.core.optimisation {
 	 */
 	type problem {
 		/**
-		 * Name of the problem (used for referencing from the algorithm).
+		 * A description of the problem.
 		 */
-		name : string;
+		description : string;
 
         /**
          * Description of the optimisation space.
diff --git a/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java b/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java
index 6784c76d..da65966f 100644
--- a/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java
+++ b/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java
@@ -1,40 +1,47 @@
 package de.evoal.core.api.utils;
 
+import org.junit.jupiter.api.*;
+import org.jboss.weld.junit5.EnableWeld;
+
 import de.evoal.languages.model.base.Instance;
 import de.evoal.languages.model.ol.OptimisationModel;
-import org.junit.jupiter.api.*;
 
-import static de.evoal.core.api.utils.LanguageHelper.*;
+import javax.inject.Inject;
 
+
+@EnableWeld
 public class LanguageHelperUnitTest {
+    @Inject
+    private LanguageHelper helper;
+
     @Order(1)
     @Test
     public void testLoading() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
         Assertions.assertNotNull(instance);
     }
 
     @Test
     public void testLookupForNullInstance() {
-        Assertions.assertThrows(IllegalStateException.class, () -> lookup(null, "child"));
+        Assertions.assertThrows(IllegalStateException.class, () -> helper.lookup((Instance)null, "child"));
     }
 
     @Test
     public void testLookupForNullPath() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        Assertions.assertThrows(IllegalArgumentException.class, () -> lookup(instance, null));
+        Assertions.assertThrows(IllegalArgumentException.class, () -> helper.lookup(instance, null));
     }
 
     @Test
     public void testLookupForEmptyPath() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "");
+        final Object result = helper.lookup(instance, "");
 
         Assertions.assertNotNull(result);
         Assertions.assertSame(instance, result);
@@ -43,9 +50,9 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookupForExistingChild() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "child");
+        final Object result = helper.lookup(instance, "child");
 
         Assertions.assertNotNull(result);
         Assertions.assertTrue(result instanceof Instance);
@@ -57,9 +64,9 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookupName() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "name");
+        final Object result = helper.lookup(instance, "name");
 
         Assertions.assertNotNull(result);
         Assertions.assertEquals("parent", result);
@@ -68,25 +75,25 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookupChildOfLiteral() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        Assertions.assertThrows(IllegalStateException.class, () -> lookup(instance, "child.string-field.non-existing"));
+        Assertions.assertThrows(IllegalStateException.class, () -> helper.lookup(instance, "child.string-field.non-existing"));
     }
 
     @Test
     public void testLookupNonExistingChild() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        Assertions.assertThrows(IllegalStateException.class, () -> lookup(instance, "child.non-existing"));
+        Assertions.assertThrows(IllegalStateException.class, () -> helper.lookup(instance, "child.non-existing"));
     }
 
     @Test
     public void testLookupBooleanField() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "child.boolean-field");
+        final Object result = helper.lookup(instance, "child.boolean-field");
 
         Assertions.assertNotNull(result);
         Assertions.assertTrue(result instanceof Boolean);
@@ -96,9 +103,9 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookupFlotField() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "child.float-field");
+        final Object result = helper.lookup(instance, "child.float-field");
 
         Assertions.assertNotNull(result);
         Assertions.assertTrue(result instanceof Double);
@@ -108,9 +115,9 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookupIntegerField() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "child.integer-field");
+        final Object result = helper.lookup(instance, "child.integer-field");
 
         Assertions.assertNotNull(result);
         Assertions.assertTrue(result instanceof Integer);
@@ -120,9 +127,9 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookupStringField() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "child.string-field");
+        final Object result = helper.lookup(instance, "child.string-field");
 
         Assertions.assertNotNull(result);
         Assertions.assertTrue(result instanceof String);
@@ -132,9 +139,9 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookup1DArrayField() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "child.array-1D-float");
+        final Object result = helper.lookup(instance, "child.array-1D-float");
 
         Assertions.assertNotNull(result);
         Assertions.assertTrue(result instanceof Object []);
@@ -149,9 +156,9 @@ public class LanguageHelperUnitTest {
     @Test
     public void testLookup2DArrayField() {
         final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
-        final Instance instance = model.getProblem().getInstance();
+        final Instance instance = model.getProblem();
 
-        final Object result = lookup(instance, "child.array-2D-int");
+        final Object result = helper.lookup(instance, "child.array-2D-int");
 
         Assertions.assertNotNull(result);
         Assertions.assertTrue(result instanceof Object []);
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Ackley.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Ackley.java
index 5010c555..a4da466c 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Ackley.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Ackley.java
@@ -3,14 +3,15 @@ package de.evoal.generator.main.benchmarks;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.utils.InitializationException;
-import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.generator.api.AbstractGeneratorFunction;
 import de.evoal.generator.api.GeneratorFunction;
-import de.evoal.generator.main.utils.ConfigurationHelper;
+import de.evoal.core.api.languages.ExpressionEvaluator;
+import de.evoal.languages.model.base.Instance;
 import de.evoal.languages.model.generator.Step;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
 import javax.inject.Named;
 
 @Dependent
@@ -23,6 +24,9 @@ public class Ackley extends AbstractGeneratorFunction {
 
     private double c = 6.283185307179586;
 
+    @Inject
+    private ExpressionEvaluator evaluator;
+
     @Override
     public Properties apply(final Properties in) {
         final Properties result = mergeAndCopy(in);
@@ -50,9 +54,12 @@ public class Ackley extends AbstractGeneratorFunction {
     public GeneratorFunction init(final Step configuration) throws InitializationException {
         super.init(configuration);
 
-        a = LanguageHelper.lookup(configuration.getInstance(), "a");
-        b = LanguageHelper.lookup(configuration.getInstance(), "b");
-        c = LanguageHelper.lookup(configuration.getInstance(), "c");
+        final Instance instance = configuration.getInstance();
+        a = evaluator.attributeToDouble(instance, "a");
+        b = evaluator.attributeToDouble(instance, "b");
+        c = evaluator.attributeToDouble(instance, "c");
+
+        log.info("Creating Ackley function with parameter a={}, b={} and c={}.", a, b, c);
 
         return this;
     }
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Rastrigin.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Rastrigin.java
index 11553b11..a6e253f0 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Rastrigin.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/benchmarks/Rastrigin.java
@@ -1,5 +1,6 @@
 package de.evoal.generator.main.benchmarks;
 
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.utils.InitializationException;
@@ -10,11 +11,15 @@ import de.evoal.languages.model.generator.Step;
 import de.evoal.languages.model.base.Literal;
 
 import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
 import javax.inject.Named;
 
 @Dependent
 @Named("rastrigin")
 public class Rastrigin extends AbstractGeneratorFunction {
+    @Inject
+    private ExpressionEvaluator evaluator;
+
     private double a;
 
     @Override
@@ -39,7 +44,7 @@ public class Rastrigin extends AbstractGeneratorFunction {
     public GeneratorFunction init(final Step configuration) throws InitializationException {
         super.init(configuration);
 
-        a = ((DoubleLiteral)configuration.getInstance().findAttribute("a").getValue()).getLiteral();
+        a = evaluator.attributeToDouble(configuration.getInstance(), "a");
 
         return this;
     }
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/functions/ConstantFunction.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/functions/ConstantFunction.java
index 12e19e52..d99a3c34 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/functions/ConstantFunction.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/functions/ConstantFunction.java
@@ -1,5 +1,6 @@
 package de.evoal.generator.main.functions;
 
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.utils.InitializationException;
 import de.evoal.generator.api.AbstractGeneratorFunction;
@@ -9,13 +10,19 @@ import de.evoal.languages.model.generator.Step;
 import de.evoal.languages.model.base.Array;
 
 import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
 import javax.inject.Named;
 
 @Dependent
 @Named("constants")
 public class ConstantFunction extends AbstractGeneratorFunction {
+
 	private double [] constants = {};
 
+	@Inject
+	private ExpressionEvaluator evaluator;
+
+
 	public Properties apply(final Properties in) {
 		final Properties result = mergeAndCopy(in);
 
@@ -30,13 +37,7 @@ public class ConstantFunction extends AbstractGeneratorFunction {
 	public GeneratorFunction init(final Step configuration) throws InitializationException {
 		super.init(configuration);
 
-		final Array constantsArray = (Array)configuration.getInstance().findAttribute("constants").getValue();
-
-		constants = constantsArray.getValues()
-								  .stream()
-								  .map(DoubleLiteral.class::cast)
-								  .mapToDouble(DoubleLiteral::getValue)
-								  .toArray();
+		constants = evaluator.attributeToDoubleArray(configuration.getInstance(), "constants");
 
 		return this;
 	}
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/NormalDistribution.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/NormalDistribution.java
index 2438d544..3d39456c 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/NormalDistribution.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/NormalDistribution.java
@@ -2,23 +2,33 @@ package de.evoal.generator.main.generators;
 
 import de.evoal.core.api.utils.InitializationException;
 import de.evoal.generator.api.GeneratorFunction;
-import de.evoal.languages.model.base.DoubleLiteral;
+import de.evoal.core.api.languages.ExpressionEvaluator;
+import de.evoal.languages.model.base.Instance;
 import de.evoal.languages.model.generator.Step;
-import de.evoal.languages.model.base.Literal;
+import lombok.extern.slf4j.Slf4j;
 
 import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
 import javax.inject.Named;
 
 @Dependent
 @Named("normal-distribution")
+@Slf4j
 public class NormalDistribution extends RealDistributionBase {
 
+    @Inject
+    private ExpressionEvaluator evaluator;
+
     @Override
     public GeneratorFunction init(final Step configuration) throws InitializationException {
         super.init(configuration);
 
-        double μ = ((DoubleLiteral)configuration.getInstance().findAttribute("μ").getValue()).getValue();
-        double σ = ((DoubleLiteral)configuration.getInstance().findAttribute("σ").getValue()).getValue();
+        final Instance instance = configuration.getInstance();
+
+        double μ = evaluator.attributeToDouble(instance, "μ");
+        double σ = evaluator.attributeToDouble(instance, "σ");
+
+        log.info("Using distribution of μ={} and σ={}", μ, σ);
 
         for(int i = 0; i < writeSpecification.getProperties().size(); ++i) {
             getDistributions().add(new org.apache.commons.math3.distribution.NormalDistribution(μ, σ));
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/RealDistributionBase.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/RealDistributionBase.java
index 90a2c708..6513f000 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/RealDistributionBase.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/RealDistributionBase.java
@@ -5,11 +5,13 @@ import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.generator.api.AbstractGeneratorFunction;
 import lombok.AccessLevel;
 import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.math3.distribution.RealDistribution;
 
 import java.util.ArrayList;
 import java.util.List;
 
+@Slf4j
 public abstract class RealDistributionBase extends AbstractGeneratorFunction {
     @Getter(AccessLevel.PROTECTED)
     private final List<RealDistribution> distributions = new ArrayList<>();
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/UniformDistribution.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/UniformDistribution.java
index 7b271f5e..1b697151 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/UniformDistribution.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/generators/UniformDistribution.java
@@ -12,7 +12,6 @@ import javax.inject.Named;
 @Dependent
 @Named("uniform-distribution")
 public class UniformDistribution extends RealDistributionBase {
-
 	public GeneratorFunction init(final Step configuration) throws InitializationException {
 		super.init(configuration);
 
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/internal/StatementExecutor.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/internal/StatementExecutor.java
index c1799238..608d897c 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/internal/StatementExecutor.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/internal/StatementExecutor.java
@@ -143,7 +143,8 @@ public class StatementExecutor extends GeneratorSwitch<Object> {
             filename = filename.replace("${" + var + "}", replacement);
         }
 
-        log.info("Writing {}", filename);
+        log.info("Writing {} with {} data points.", filename, count);
+        new File(filename).getAbsoluteFile().getParentFile().mkdirs();
 
         final PropertiesSpecification specification = PropertiesSpecification.builder().build();
         final Properties emptyProperties = new Properties(specification);
@@ -156,10 +157,8 @@ public class StatementExecutor extends GeneratorSwitch<Object> {
             }
         }
 
-        new File(filename).getParentFile().mkdirs();
-
         PropertiesSpecification.Builder resultSpec = PropertiesSpecification.builder();
-        stream.peek(p -> resultSpec.add(p.getSpecification()));
+        stream = stream.peek(p -> resultSpec.add(p.getSpecification()));
 
         try(final PropertiesWriter writer = PropertiesIOFactory.writer(new File(filename), resultSpec.build())) {
             stream.limit(count)
@@ -171,7 +170,7 @@ public class StatementExecutor extends GeneratorSwitch<Object> {
                       }
                   });
         } catch (final Exception e) {
-            log.error("Failed to write properties to file '{}'.", filename);
+            log.error("Failed to write properties to file '{}'.", filename, e);
         }
 
         return null;
diff --git a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/utils/ConfigurationHelper.java b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/utils/ConfigurationHelper.java
index 8eb18e72..478c8ae0 100644
--- a/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/utils/ConfigurationHelper.java
+++ b/src/core/de.evoal.generator.main/src/main/java/de/evoal/generator/main/utils/ConfigurationHelper.java
@@ -1,5 +1,6 @@
 package de.evoal.generator.main.utils;
 
+import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.base.Array;
 import de.evoal.languages.model.base.Instance;
@@ -23,8 +24,10 @@ public final class ConfigurationHelper {
     }
 
     private static Distribution readDistribution(final Instance instance) {
-        final double μ = LanguageHelper.lookup(instance, "μ");
-        final double σ = LanguageHelper.lookup(instance, "σ");
+        final LanguageHelper helper = BeanFactory.create(LanguageHelper.class);
+
+        final double μ = helper.lookup(instance, "μ");
+        final double σ = helper.lookup(instance, "σ");
 
         return new Distribution(μ, σ);
     }
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 a424f636..832107c3 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
@@ -27,6 +27,8 @@ module de.evoal.generator.main {
     requires commons.math3;
     requires com.google.guice;
 
+    opens de.evoal.generator;
+
     opens de.evoal.generator.main;
     opens de.evoal.generator.main.benchmarks;
     opens de.evoal.generator.main.cdi;
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 e9a11f76..62d31442 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
@@ -1,3 +1,5 @@
+import "definitions" from de.evoal.core.math;
+
 module de.evoal.generator.generator {
 	abstract type benchmark{}
 	
@@ -110,17 +112,17 @@ module de.evoal.generator.generator {
 		/**
 		 * The constant a is set to 20 in the original Ackley function.
 		 */
-		'a' : float;
+		'a' : float := 20.0;
 		
 		/**
 		 * The constant b is set to 0.2 in the original Ackley function.
 		 */
-		b : float;
+		b : float := 0.2;
 	
 		/**
 		 * The constant c is set to 2Ï€ in the original Ackley function.
 		 */
-		'c' : float;
+		'c' : float := 2 * PI;
 	}
 	
 	/**
@@ -189,7 +191,7 @@ module de.evoal.generator.generator {
 		/**
 		 * Constant a, which is typically 10.
 		 */
-		'a' : float;
+		'a' : float := 10.0;
 	}
 	
 	/**
@@ -215,7 +217,9 @@ module de.evoal.generator.generator {
 	}
 	
 	
-	type 'multivariate-normal-distribution' {
+	type distribution {}
+
+	type 'multivariate-normal-distribution' extends distribution {
 		means : array float;
 		covariance : array array float;
 	}
@@ -232,10 +236,11 @@ module de.evoal.generator.generator {
 		distributions : array instance distribution;
 	}
 	
+	
 	/**
 	 * A distribution specification.
 	 */
-	type distribution {
+	type 'normal-distribution' extends distribution {
 		/**
 		 * The distribution's expected value.
 		 */
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/FunctionCombinerConfiguration.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/FunctionCombinerConfiguration.java
index 5add94c7..5754e012 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/FunctionCombinerConfiguration.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/FunctionCombinerConfiguration.java
@@ -1,13 +1,12 @@
 package de.evoal.surrogate.api.configuration;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import de.evoal.core.api.properties.PropertiesSpecification;
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.mll.PartialSurrogateFunctionDefinition;
 import de.evoal.languages.model.mll.SurrogateLayerDefinition;
 import de.evoal.surrogate.api.function.FunctionCombiner;
 import lombok.Data;
-import lombok.Setter;
 import org.eclipse.emf.common.util.EList;
 
 import java.util.ArrayList;
@@ -65,7 +64,7 @@ public class FunctionCombinerConfiguration {
                 .forEach(outputDimensions::add);
     }
 
-    public static FunctionCombinerConfiguration from(final SurrogateLayerDefinition definition) {
+    public static FunctionCombinerConfiguration from(final SurrogateLayerDefinition definition, ExpressionEvaluator evaluator) {
         final FunctionCombinerConfiguration configuration = new FunctionCombinerConfiguration();
         configuration.setName(definition.getName());
 
@@ -90,7 +89,7 @@ public class FunctionCombinerConfiguration {
 
         definition.getFunctions()
                 .stream()
-                .map(PartialFunctionConfiguration::from)
+                .map(d -> PartialFunctionConfiguration.from(d, evaluator))
                 .forEach(configuration.functions::add);
 
         return configuration;
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/Parameter.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/Parameter.java
index 69beb329..6d961008 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/Parameter.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/Parameter.java
@@ -2,6 +2,7 @@ package de.evoal.surrogate.api.configuration;
 
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.languages.model.base.Literal;
 import de.evoal.surrogate.main.jackson.ReflectiveDeserializer;
 import de.evoal.surrogate.main.jackson.ReflectiveSerializer;
@@ -22,10 +23,10 @@ public class Parameter {
 	@JsonSerialize(using = ReflectiveSerializer.class)
 	private Object value;
 
-	public static Parameter from(final Attribute attribute) {
+	public static Parameter from(final Attribute attribute, final ExpressionEvaluator evaluator) {
 		final Parameter parameter = new Parameter();
 		parameter.setName(attribute.getDefinition().getName());
-		parameter.setValue(((Literal)attribute.getValue()).getValue());
+		parameter.setValue(evaluator.attributeToObject(attribute));
 
 		return parameter;
 	}
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/PartialFunctionConfiguration.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/PartialFunctionConfiguration.java
index d46eeb87..313f2c4e 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/PartialFunctionConfiguration.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/PartialFunctionConfiguration.java
@@ -1,19 +1,18 @@
 package de.evoal.surrogate.api.configuration;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.mll.PartialSurrogateFunctionDefinition;
 import de.evoal.surrogate.api.function.PartialSurrogateFunction;
 import lombok.Data;
-import org.eclipse.emf.common.util.EList;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * Configuration of a {@link PartialSurrogateFunction}.
@@ -69,9 +68,9 @@ public class PartialFunctionConfiguration {
 		}
 	}
 
-	public static PartialFunctionConfiguration from(final PartialSurrogateFunctionDefinition definition) {
+	public static PartialFunctionConfiguration from(final PartialSurrogateFunctionDefinition definition, ExpressionEvaluator evaluator) {
 		final PartialFunctionConfiguration configuration = new PartialFunctionConfiguration();
-		configuration.setName(definition.getName().getName());
+		configuration.setName(definition.getDefinition().getName());
 
 		final List<DataDescription> inputs = definition.getInputs();
 		final List<DataDescription> outputs = definition.getOutputs();
@@ -79,9 +78,9 @@ public class PartialFunctionConfiguration {
 		configuration.setInputData(PropertiesSpecification.builder().add(inputs.stream()).build());
 		configuration.setOutputData(PropertiesSpecification.builder().add(outputs.stream()).build());
 
-		definition.getParameters()
+		definition.getAttributes()
 				  .stream()
-				  .map(Parameter::from)
+				  .map(a -> Parameter.from(a, evaluator))
 				  .forEach(p -> configuration.getParameters().add(p));
 
 		return configuration;
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/SurrogateConfiguration.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/SurrogateConfiguration.java
index aa9f1534..ddb122e9 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/SurrogateConfiguration.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/configuration/SurrogateConfiguration.java
@@ -1,6 +1,6 @@
 package de.evoal.surrogate.api.configuration;
 
-import de.evoal.core.api.properties.PropertiesSpecification;
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.languages.model.mll.SurrogateDefinition;
 import de.evoal.surrogate.api.function.SurrogateFunction;
 import lombok.Data;
@@ -37,12 +37,12 @@ public class SurrogateConfiguration {
 		}
 	}
 
-	public static SurrogateConfiguration from(final SurrogateDefinition definition) {
+	public static SurrogateConfiguration from(final SurrogateDefinition definition, final ExpressionEvaluator evaluator) {
 		final SurrogateConfiguration configuration = new SurrogateConfiguration();
 
 		definition.getLayers()
 				  .stream()
-				  .map(FunctionCombinerConfiguration::from)
+				  .map(d -> FunctionCombinerConfiguration.from(d, evaluator))
 				  .forEach(configuration.mappings::add);
 
 		return configuration;
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/internal/StatementExecutor.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/internal/StatementExecutor.java
index 1e0d90c5..cd07548d 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/internal/StatementExecutor.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/internal/StatementExecutor.java
@@ -1,8 +1,10 @@
 package de.evoal.surrogate.main.internal;
 
 import de.evoal.core.api.cdi.BeanFactory;
+import de.evoal.core.api.languages.ExpressionEvaluator;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.utils.ConstantSwitch;
+import de.evoal.languages.model.base.DefinedFunctionName;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.base.Call;
 import de.evoal.languages.model.base.StringLiteral;
@@ -36,6 +38,9 @@ import java.util.stream.Stream;
 @Slf4j
 public class StatementExecutor extends MllSwitch<Object> {
 
+    @Inject
+    private ExpressionEvaluator evaluator;
+
     private SurrogateConfiguration config;
 
     private SurrogateDefinition definition;
@@ -104,7 +109,7 @@ public class StatementExecutor extends MllSwitch<Object> {
         manager.setTrainingStream(new FileBasedPropertiesStreamSupplier(input, trainingSpec));
 
         this.definition = definition;
-        this.config = SurrogateConfiguration.from(definition);
+        this.config = SurrogateConfiguration.from(definition, evaluator);
 
         log.info("Training surrogate function.");
         this.function = new SurrogateFactory(config, manager.getTrainingStream()).create();
@@ -222,7 +227,7 @@ public class StatementExecutor extends MllSwitch<Object> {
 
     private void saveTrainedSurrogateFunctionFunction(final File outputFilename) {
         log.info("Storing pre-calculated predictive functions to '{}' ...", outputFilename);
-        outputFilename.getParentFile().mkdirs();
+        outputFilename.getAbsoluteFile().getParentFile().mkdirs();
         surrogateWriter.accept(config, outputFilename);
         log.info("Storing file was successful.");
     }
-- 
GitLab