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