From fdd0872adfcab2d978a2efca5008a17fd22880de Mon Sep 17 00:00:00 2001 From: Alexander Diewald <diewald@fortiss.org> Date: Wed, 1 Aug 2018 14:56:45 +0200 Subject: [PATCH] DSE-Process: Add an ExplorationFeature service. * The IExplorationFeatureService allows to add extensions to the DSE process that consist of sub-modules, e.g., Variables, Evaluations, or additional operations on existing encodings. * While the IExplorationFeatureService is used to manage all existing extensions, the activated ones (configuration) is passed to the DSE by the exploration backend. Currently, the activated features are hard coded, but shall be moved to the UI. * Consequently, the IExplorationModuleService has bee removed. Its functionality has been moved to the ExplorationFeature abstract class that are single features registered with the IExplorationFeatureService. * The activated features now govern the installation of the sub-modules (Creators, Decoders), instead of the previous IExplorationModuleService. * When setting up the Opt4J exploration, the activated decoder configuration is now checked for consistency to avoid circular dependencies and duplicate responsibilities of decoders to create a phenotype. * An IExplorationFeature type is added to the MOEA ecore model to allow referencing exploration features from EMF classes. Signed-off-by: Alexander Diewald <diewald@fortiss.org> --- .../META-INF/MANIFEST.MF | 340 ++++++------ .../model/.ratings | 2 +- .../model/moea.ecore | 12 +- .../model/moea.genmodel | 3 +- .../org/fortiss/af3/exploration/alg/.ratings | 4 +- .../af3/exploration/alg/ExplorationAlg.java | 132 +---- .../af3/exploration/alg/backend/.ratings | 2 +- .../alg/backend/Opt4JDseBackend.java | 37 +- .../fortiss/af3/exploration/alg/dse/.ratings | 12 +- .../af3/exploration/alg/dse/DSEFactory.java | 20 +- .../af3/exploration/alg/dse/Explorer.java | 493 +++++++++--------- .../af3/exploration/alg/dse/backend/.ratings | 2 +- .../alg/dse/backend/ExplorerBackendBase.java | 388 +++++++------- .../alg/dse/backend/opt4j/.ratings | 10 +- .../backend/opt4j/Opt4JExplorerBackend.java | 83 ++- .../extensions/compositegene/create/.ratings | 10 +- .../compositegene/create/GuiceCreator.java | 15 +- .../extensions/compositegene/decode/.ratings | 17 +- .../compositegene/decode/Genotyped.java | 43 ++ .../compositegene/decode/GuiceDecoder.java | 57 +- .../extensions/compositegene/graph/.ratings | 9 +- .../compositegene/graph/BindingWalker.java | 67 +++ .../compositegene/graph/GenotypeFinder.java | 35 +- ...a => TypeMemorizingDependencyVisitor.java} | 4 +- .../alg/dse/backend/opt4j/problem/.ratings | 14 +- .../opt4j/problem/DseProblemModuleBase.java | 401 +++++++------- ...dule.java => DseProcessProblemModule.java} | 54 +- .../opt4j/problem/safetyfunction/.ratings | 2 +- .../safetyfunction/SFMappingDecoder.java | 24 +- .../opt4j/problem/taskmapping/.ratings | 2 +- .../AbstractTaskMappingIdentityDecoder.java | 3 + .../problem/taskmapping/instantiate/.ratings | 2 +- .../FailSilentAbstractTaskMappingDecoder.java | 14 +- .../af3/exploration/alg/feature/.ratings | 7 + .../feature/DesignDiversityExploration.java | 37 ++ .../ExplorationFeature.java} | 154 ++---- .../IExplorationFeature.java} | 42 +- .../PartitionArchitectureExploration.java | 38 ++ .../SafetyArchitectureExploration.java | 46 ++ .../alg/feature/TTScheduleExploration.java | 33 ++ .../alg/feature/TaskMappingExploration.java | 58 +++ .../af3/exploration/alg/service/.ratings | 28 +- .../service/IExplorationFeatureService.java | 54 ++ .../exploration/alg/service/internal/.ratings | 11 +- .../internal/ExplorationFeatureService.java | 186 +++++++ .../fortiss/af3/exploration/alg/util/.ratings | 2 +- ...gnSpaceExplorationModelElementFactory.java | 25 +- 47 files changed, 1775 insertions(+), 1259 deletions(-) create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/Genotyped.java create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/BindingWalker.java rename org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/{TransitiveDependencyVisitor.java => TypeMemorizingDependencyVisitor.java} (97%) rename org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/{ArchitectureExplorationProblemModule.java => DseProcessProblemModule.java} (65%) create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/DesignDiversityExploration.java rename org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/{service/internal/ExplorationModuleService.java => feature/ExplorationFeature.java} (53%) rename org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/{service/IExplorationModuleService.java => feature/IExplorationFeature.java} (63%) create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/SafetyArchitectureExploration.java create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TTScheduleExploration.java create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TaskMappingExploration.java create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/IExplorationFeatureService.java create mode 100644 org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationFeatureService.java diff --git a/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF b/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF index e826057a..b0eb4255 100644 --- a/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF +++ b/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF @@ -1,170 +1,170 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Exploration Algorithms -Bundle-SymbolicName: org.fortiss.af3.exploration.alg;singleton:=true -Bundle-Version: 2.13.0.qualifier -Bundle-ClassPath: ., - lib/jgrapht-core-0.9.0.jar, - lib/aopalliance-1.0.jar, - lib/apfloat.jar, - lib/jgrapht-ext-0.9.0.jar, - lib/jgraphx-2.0.0.1.jar, - lib/guice-assistedinject-4.2.0.jar, - lib/guice-4.2.0.jar, - lib/guice-multibindings-4.2.0.jar, - lib/commons-collections4-4.1.jar, - lib/opt4j-optimizers-SNAPSHOT-20161110.jar, - lib/guava-25.1-jre.jar, - lib/jfreechart-1.0.19.jar, - lib/jcommon-1.0.23.jar, - lib/opt4j-core-SNAPSHOT-20180714.jar, - lib/opt4j-operators-SNAPSHOT-20180714.jar -Bundle-Vendor: fortiss GmbH -Bundle-Localization: plugin -Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Bundle-ActivationPolicy: lazy -Bundle-Activator: org.fortiss.af3.exploration.alg.ExplorationAlgActivator -Require-Bundle: org.fortiss.tooling.base.ui;visibility:=reexport, - org.fortiss.af3.safety;bundle-version="2.9.0";visibility:=reexport, - org.fortiss.tooling.kernel;visibility:=reexport, - org.fortiss.af3.schedule;visibility:=reexport, - org.eclipse.core.runtime, - org.eclipse.emf.ecore;visibility:=reexport, - org.fortiss.tooling.base;visibility:=reexport, - org.fortiss.af3.component;visibility:=reexport, - org.fortiss.af3.exploration;bundle-version="2.11.0";visibility:=reexport, - org.fortiss.af3.expression;visibility:=reexport, - org.fortiss.af3.platform;visibility:=reexport, - org.fortiss.af3.project;visibility:=reexport, - org.eclipse.ui.ide;visibility:=reexport, - org.fortiss.af3.exploration.smt;bundle-version="2.11.0", - org.fortiss.af3.platform.hierarchic, - org.fortiss.af3.task, - org.fortiss.af3.partition;visibility:=reexport -Export-Package: org.fortiss.af3.exploration.alg, - org.fortiss.af3.exploration.alg.backend, - org.fortiss.af3.exploration.alg.dse, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.repair, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, - org.fortiss.af3.exploration.alg.dse.evaluator; - uses:="org.fortiss.af3.exploration.alg.dse.sysmodel.arch, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, - org.fortiss.af3.exploration.model, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.evaluate, - org.opt4j.core", - org.fortiss.af3.exploration.alg.dse.evaluator.constraint; - uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, - org.fortiss.af3.exploration.alg.dse.modeltransformation, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, - eu.dreamsproject.ikerlan.safetystandards.SafetyCompliance, - org.fortiss.af3.exploration.model, - org.fortiss.af3.exploration.alg.dse.evaluator", - org.fortiss.af3.exploration.alg.dse.evaluator.objective; - uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, - org.apfloat, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, - org.fortiss.af3.exploration.model, - org.fortiss.af3.exploration.alg.dse.evaluator", - org.fortiss.af3.exploration.alg.dse.modeltransformation, - org.fortiss.af3.exploration.alg.dse.modeltransformation.base, - org.fortiss.af3.exploration.alg.dse.modeltransformation.comparch, - org.fortiss.af3.exploration.alg.dse.modeltransformation.deployment, - org.fortiss.af3.exploration.alg.dse.modeltransformation.element, - org.fortiss.af3.exploration.alg.dse.sysmodel, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch; - uses:="org.eclipse.emf.ecore, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, - org.eclipse.emf.common.util, - org.jgrapht", - org.fortiss.af3.exploration.alg.dse.sysmodel.arch.af3; - uses:="org.fortiss.tooling.base.model.element, - eu.dreamsproject.application.model.annotation, - org.fortiss.af3.component.model, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, - org.eclipse.emf.common.util, - org.fortiss.af3.timing.model.annotation, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch, - org.fortiss.af3.platform.model, - eu.dreamsproject.platform.model.annotation", - org.fortiss.af3.exploration.alg.dse.sysmodel.arch.af3.helper, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, - org.fortiss.af3.exploration.alg.dse.sysmodel.comm; - uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch, - org.fortiss.af3.exploration.alg.dse.sysmodel.mapping, - org.jgrapht", - org.fortiss.af3.exploration.alg.dse.sysmodel.faultmodel, - org.fortiss.af3.exploration.alg.dse.sysmodel.mapping;uses:="org.fortiss.af3.exploration.alg.dse.sysmodel.arch", - org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm, - org.fortiss.af3.exploration.alg.dse.sysmodel.random, - org.fortiss.af3.exploration.alg.dse.sysmodel.sched;uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution,org.fortiss.af3.exploration.alg.dse.sysmodel.arch,org.fortiss.af3.exploration.model", - org.fortiss.af3.exploration.alg.dse.sysmodel.sched.comm; - uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, - org.fortiss.af3.exploration.alg.dse.sysmodel.sched, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch, - org.fortiss.af3.exploration.model, - org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm", - org.fortiss.af3.exploration.alg.dse.sysmodel.sched.proc; - uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping, - org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping, - org.apfloat, - org.fortiss.af3.exploration.alg.dse.sysmodel.sched, - org.fortiss.af3.exploration.alg.dse.sysmodel.arch, - org.fortiss.af3.exploration.model", - org.fortiss.af3.exploration.alg.exception, - org.fortiss.af3.exploration.alg.guava, - org.fortiss.af3.exploration.alg.plot, - org.fortiss.af3.exploration.alg.service, - org.fortiss.af3.exploration.alg.util, - org.fortiss.af3.exploration.dsl.model, - org.fortiss.af3.exploration.dsl.model.expressions, - org.fortiss.af3.exploration.dsl.model.expressions.impl, - org.fortiss.af3.exploration.dsl.model.expressions.util, - org.fortiss.af3.exploration.dsl.model.impl, - org.fortiss.af3.exploration.dsl.model.operators, - org.fortiss.af3.exploration.dsl.model.operators.impl, - org.fortiss.af3.exploration.dsl.model.operators.util, - org.fortiss.af3.exploration.dsl.model.patterns, - org.fortiss.af3.exploration.dsl.model.patterns.impl, - org.fortiss.af3.exploration.dsl.model.patterns.util, - org.fortiss.af3.exploration.dsl.model.types, - org.fortiss.af3.exploration.dsl.model.types.impl, - org.fortiss.af3.exploration.dsl.model.types.util, - org.fortiss.af3.exploration.dsl.model.util, - org.fortiss.af3.exploration.model, - org.fortiss.af3.exploration.model.impl, - org.fortiss.af3.exploration.model.location, - org.fortiss.af3.exploration.model.location.impl, - org.fortiss.af3.exploration.model.location.util, - org.fortiss.af3.exploration.model.time, - org.fortiss.af3.exploration.model.time.impl, - org.fortiss.af3.exploration.model.time.util, - org.fortiss.af3.exploration.model.util, - org.fortiss.af3.exploration.moea.model, - org.fortiss.af3.exploration.moea.model.annotation, - org.fortiss.af3.exploration.moea.model.annotation.impl, - org.fortiss.af3.exploration.moea.model.annotation.util, - org.fortiss.af3.exploration.moea.model.feature, - org.fortiss.af3.exploration.moea.model.feature.impl, - org.fortiss.af3.exploration.moea.model.feature.util, - org.fortiss.af3.exploration.moea.model.impl, - org.fortiss.af3.exploration.moea.model.parameters, - org.fortiss.af3.exploration.moea.model.parameters.impl, - org.fortiss.af3.exploration.moea.model.parameters.util, - org.fortiss.af3.exploration.moea.model.predefined, - org.fortiss.af3.exploration.moea.model.predefined.impl, - org.fortiss.af3.exploration.moea.model.predefined.util, - org.fortiss.af3.exploration.moea.model.util, - org.fortiss.af3.exploration.util +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Exploration Algorithms +Bundle-SymbolicName: org.fortiss.af3.exploration.alg;singleton:=true +Bundle-Version: 2.13.0.qualifier +Bundle-ClassPath: ., + lib/jgrapht-core-0.9.0.jar, + lib/aopalliance-1.0.jar, + lib/apfloat.jar, + lib/jgrapht-ext-0.9.0.jar, + lib/jgraphx-2.0.0.1.jar, + lib/guice-assistedinject-4.2.0.jar, + lib/guice-4.2.0.jar, + lib/guice-multibindings-4.2.0.jar, + lib/commons-collections4-4.1.jar, + lib/opt4j-optimizers-SNAPSHOT-20161110.jar, + lib/guava-25.1-jre.jar, + lib/jfreechart-1.0.19.jar, + lib/jcommon-1.0.23.jar, + lib/opt4j-core-SNAPSHOT-20180714.jar, + lib/opt4j-operators-SNAPSHOT-20180714.jar +Bundle-Vendor: fortiss GmbH +Bundle-Localization: plugin +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-ActivationPolicy: lazy +Bundle-Activator: org.fortiss.af3.exploration.alg.ExplorationAlgActivator +Require-Bundle: org.fortiss.tooling.base.ui;visibility:=reexport, + org.fortiss.af3.safety;bundle-version="2.9.0";visibility:=reexport, + org.fortiss.tooling.kernel;visibility:=reexport, + org.fortiss.af3.schedule;visibility:=reexport, + org.eclipse.core.runtime, + org.eclipse.emf.ecore;visibility:=reexport, + org.fortiss.tooling.base;visibility:=reexport, + org.fortiss.af3.component;visibility:=reexport, + org.fortiss.af3.exploration;bundle-version="2.11.0";visibility:=reexport, + org.fortiss.af3.expression;visibility:=reexport, + org.fortiss.af3.platform;visibility:=reexport, + org.fortiss.af3.project;visibility:=reexport, + org.eclipse.ui.ide;visibility:=reexport, + org.fortiss.af3.exploration.smt;bundle-version="2.11.0", + org.fortiss.af3.platform.hierarchic, + org.fortiss.af3.task, + org.fortiss.af3.partition;visibility:=reexport +Export-Package: org.fortiss.af3.exploration.alg, + org.fortiss.af3.exploration.alg.backend, + org.fortiss.af3.exploration.alg.dse, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.repair, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, + org.fortiss.af3.exploration.alg.dse.evaluator; + uses:="org.fortiss.af3.exploration.alg.dse.sysmodel.arch, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, + org.fortiss.af3.exploration.model, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.evaluate, + org.opt4j.core", + org.fortiss.af3.exploration.alg.dse.evaluator.constraint; + uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, + org.fortiss.af3.exploration.alg.dse.modeltransformation, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, + eu.dreamsproject.ikerlan.safetystandards.SafetyCompliance, + org.fortiss.af3.exploration.model, + org.fortiss.af3.exploration.alg.dse.evaluator", + org.fortiss.af3.exploration.alg.dse.evaluator.objective; + uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, + org.apfloat, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype, + org.fortiss.af3.exploration.model, + org.fortiss.af3.exploration.alg.dse.evaluator", + org.fortiss.af3.exploration.alg.dse.modeltransformation, + org.fortiss.af3.exploration.alg.dse.modeltransformation.base, + org.fortiss.af3.exploration.alg.dse.modeltransformation.comparch, + org.fortiss.af3.exploration.alg.dse.modeltransformation.deployment, + org.fortiss.af3.exploration.alg.dse.modeltransformation.element, + org.fortiss.af3.exploration.alg.dse.sysmodel, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch; + uses:="org.eclipse.emf.ecore, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, + org.eclipse.emf.common.util, + org.jgrapht", + org.fortiss.af3.exploration.alg.dse.sysmodel.arch.af3; + uses:="org.fortiss.tooling.base.model.element, + eu.dreamsproject.application.model.annotation, + org.fortiss.af3.component.model, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, + org.eclipse.emf.common.util, + org.fortiss.af3.timing.model.annotation, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch, + org.fortiss.af3.platform.model, + eu.dreamsproject.platform.model.annotation", + org.fortiss.af3.exploration.alg.dse.sysmodel.arch.af3.helper, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph, + org.fortiss.af3.exploration.alg.dse.sysmodel.comm; + uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch, + org.fortiss.af3.exploration.alg.dse.sysmodel.mapping, + org.jgrapht", + org.fortiss.af3.exploration.alg.dse.sysmodel.faultmodel, + org.fortiss.af3.exploration.alg.dse.sysmodel.mapping;uses:="org.fortiss.af3.exploration.alg.dse.sysmodel.arch", + org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm, + org.fortiss.af3.exploration.alg.dse.sysmodel.random, + org.fortiss.af3.exploration.alg.dse.sysmodel.sched;uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution,org.fortiss.af3.exploration.alg.dse.sysmodel.arch,org.fortiss.af3.exploration.model", + org.fortiss.af3.exploration.alg.dse.sysmodel.sched.comm; + uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, + org.fortiss.af3.exploration.alg.dse.sysmodel.sched, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch, + org.fortiss.af3.exploration.model, + org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm", + org.fortiss.af3.exploration.alg.dse.sysmodel.sched.proc; + uses:="org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping, + org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping, + org.apfloat, + org.fortiss.af3.exploration.alg.dse.sysmodel.sched, + org.fortiss.af3.exploration.alg.dse.sysmodel.arch, + org.fortiss.af3.exploration.model", + org.fortiss.af3.exploration.alg.exception, + org.fortiss.af3.exploration.alg.guava, + org.fortiss.af3.exploration.alg.plot, + org.fortiss.af3.exploration.alg.service, + org.fortiss.af3.exploration.alg.util, + org.fortiss.af3.exploration.dsl.model, + org.fortiss.af3.exploration.dsl.model.expressions, + org.fortiss.af3.exploration.dsl.model.expressions.impl, + org.fortiss.af3.exploration.dsl.model.expressions.util, + org.fortiss.af3.exploration.dsl.model.impl, + org.fortiss.af3.exploration.dsl.model.operators, + org.fortiss.af3.exploration.dsl.model.operators.impl, + org.fortiss.af3.exploration.dsl.model.operators.util, + org.fortiss.af3.exploration.dsl.model.patterns, + org.fortiss.af3.exploration.dsl.model.patterns.impl, + org.fortiss.af3.exploration.dsl.model.patterns.util, + org.fortiss.af3.exploration.dsl.model.types, + org.fortiss.af3.exploration.dsl.model.types.impl, + org.fortiss.af3.exploration.dsl.model.types.util, + org.fortiss.af3.exploration.dsl.model.util, + org.fortiss.af3.exploration.model, + org.fortiss.af3.exploration.model.impl, + org.fortiss.af3.exploration.model.location, + org.fortiss.af3.exploration.model.location.impl, + org.fortiss.af3.exploration.model.location.util, + org.fortiss.af3.exploration.model.time, + org.fortiss.af3.exploration.model.time.impl, + org.fortiss.af3.exploration.model.time.util, + org.fortiss.af3.exploration.model.util, + org.fortiss.af3.exploration.moea.model, + org.fortiss.af3.exploration.moea.model.annotation, + org.fortiss.af3.exploration.moea.model.annotation.impl, + org.fortiss.af3.exploration.moea.model.annotation.util, + org.fortiss.af3.exploration.moea.model.feature, + org.fortiss.af3.exploration.moea.model.feature.impl, + org.fortiss.af3.exploration.moea.model.feature.util, + org.fortiss.af3.exploration.moea.model.impl, + org.fortiss.af3.exploration.moea.model.parameters, + org.fortiss.af3.exploration.moea.model.parameters.impl, + org.fortiss.af3.exploration.moea.model.parameters.util, + org.fortiss.af3.exploration.moea.model.predefined, + org.fortiss.af3.exploration.moea.model.predefined.impl, + org.fortiss.af3.exploration.moea.model.predefined.util, + org.fortiss.af3.exploration.moea.model.util, + org.fortiss.af3.exploration.util diff --git a/org.fortiss.af3.exploration.alg/model/.ratings b/org.fortiss.af3.exploration.alg/model/.ratings index f54baab0..7e6407a4 100644 --- a/org.fortiss.af3.exploration.alg/model/.ratings +++ b/org.fortiss.af3.exploration.alg/model/.ratings @@ -1,3 +1,3 @@ common.ecore 3e3e3a1484cebe698e99621a60be4fa285238c92 RED explorationDsl.ecore 6950a6116721764800ad6bf3b301e0dec934c365 RED -moea.ecore 099cf6fd45522f4b427d21f6bca28ec493e36c35 RED +moea.ecore 3af9fb8410fd06f1bafd7f841de03db3fdd4327e RED diff --git a/org.fortiss.af3.exploration.alg/model/moea.ecore b/org.fortiss.af3.exploration.alg/model/moea.ecore index 099cf6fd..3af9fb84 100644 --- a/org.fortiss.af3.exploration.alg/model/moea.ecore +++ b/org.fortiss.af3.exploration.alg/model/moea.ecore @@ -5,9 +5,14 @@ <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> <details key="documentation" value="Contains the selected {@link IOptimizer}, the {@link SystemParameter}s, and the {@link ExplorationSpecification} that define a particular DSE problemn."/> </eAnnotations> - <eStructuralFeatures xsi:type="ecore:EReference" name="features" lowerBound="1" - upperBound="-1" eType="ecore:EClass platform:/resource/org.fortiss.af3.exploration/model/exploration.ecore#//IExplorationFeature" - containment="true"/> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="features" lowerBound="1" + upperBound="-1"> + <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaClass"> + <eTypeArguments> + <eUpperBound eClassifier="#//feature/IExplorationFeature"/> + </eTypeArguments> + </eGenericType> + </eStructuralFeatures> <eStructuralFeatures xsi:type="ecore:EReference" name="optimizer" lowerBound="1" eType="#//parameters/IOptimizer" containment="true"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> @@ -70,6 +75,7 @@ <eClassifiers xsi:type="ecore:EClass" name="TaskMapping" eSuperTypes="platform:/resource/org.fortiss.af3.exploration/model/exploration.ecore#//IExplorationFeature"/> <eClassifiers xsi:type="ecore:EDataType" name="ISafetyFunctionAdapter" instanceClassName="org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ISafetyFunctionAdapter" serializable="false"/> + <eClassifiers xsi:type="ecore:EDataType" name="IExplorationFeature" instanceClassName="org.fortiss.af3.exploration.alg.feature.IExplorationFeature"/> </eSubpackages> <eSubpackages name="parameters" nsURI="http://www.fortiss.org/af3/exploration/moea/parameters" nsPrefix="org-fortiss-af3-exploration-moea-parameters"> diff --git a/org.fortiss.af3.exploration.alg/model/moea.genmodel b/org.fortiss.af3.exploration.alg/model/moea.genmodel index ba106c86..223aad89 100644 --- a/org.fortiss.af3.exploration.alg/model/moea.genmodel +++ b/org.fortiss.af3.exploration.alg/model/moea.genmodel @@ -15,7 +15,7 @@ <genEnumLiterals ecoreEnumLiteral="moea.ecore#//VoterType_t/MajorityVoter"/> </genEnums> <genClasses ecoreClass="moea.ecore#//DseSpecification"> - <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference moea.ecore#//DseSpecification/features"/> + <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute moea.ecore#//DseSpecification/features"/> <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference moea.ecore#//DseSpecification/optimizer"/> <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference moea.ecore#//DseSpecification/parameters"/> <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference moea.ecore#//DseSpecification/targetSpecification"/> @@ -40,6 +40,7 @@ <nestedGenPackages prefix="Feature" basePackage="org.fortiss.af3.exploration.moea.model" disposableProviderFactory="true" ecorePackage="moea.ecore#//feature"> <genDataTypes ecoreDataType="moea.ecore#//feature/ISafetyFunctionAdapter"/> + <genDataTypes ecoreDataType="moea.ecore#//feature/IExplorationFeature"/> <genClasses ecoreClass="moea.ecore#//feature/SafetyExploration"> <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EAttribute moea.ecore#//feature/SafetyExploration/adapters"/> diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/.ratings index 6bc68964..2e07f40a 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/.ratings @@ -1,2 +1,2 @@ -ExplorationAlg.java 213524a903ff48c0b8edcac6819c206440519274 RED -ExplorationAlgActivator.java 1970505dc53286fd3752c909abc568e0bf598fe0 RED +ExplorationAlg.java 8d8775418e82ebd92b4ceedcee410b3cd5f8e038 YELLOW +ExplorationAlgActivator.java 1970505dc53286fd3752c909abc568e0bf598fe0 YELLOW diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/ExplorationAlg.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/ExplorationAlg.java index 213524a9..8d877541 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/ExplorationAlg.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/ExplorationAlg.java @@ -20,44 +20,20 @@ import static org.fortiss.af3.exploration.alg.service.ExplorationServiceManager. import org.eclipse.ui.IStartup; import org.fortiss.af3.exploration.alg.backend.Opt4JDseBackend; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.partitionmapping.PartitionMappingCreator; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.safetyfunctionarch.SafetyFunctionArchCreator; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.taskmapping.AbstractTaskMappingCreator; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.taskmapping.FailSilentTaskMappingCreator; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm.MessageEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch.SafetyFunctionArchEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedAcyclicTaskGraphEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedTaskGraphEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.SafeTaskGraphEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.partitionmapping.PartitionMappingModule; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.safetyarch.MutateSafetyFunctionArchitectureModule; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskinstantiation.MutateTaskInstanceModule; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmapping.MutateTaskMappingModule; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.StrictTTDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.comm.MessageDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmapping.PartitionMappingDecoderGraph; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFGraphDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFMappingDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.AbstractTaskMappingIdentityDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.FailSilentAbstractTaskMappingDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.TaskInstanceResourceAlignmentDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule; +import org.fortiss.af3.exploration.alg.feature.DesignDiversityExploration; +import org.fortiss.af3.exploration.alg.feature.PartitionArchitectureExploration; +import org.fortiss.af3.exploration.alg.feature.SafetyArchitectureExploration; +import org.fortiss.af3.exploration.alg.feature.TTScheduleExploration; +import org.fortiss.af3.exploration.alg.feature.TaskMappingExploration; import org.fortiss.af3.exploration.alg.service.IExplorationConstraintTransformationService; import org.fortiss.af3.exploration.alg.service.IExplorationEvaluatationService; -import org.fortiss.af3.exploration.alg.service.IExplorationModuleService; +import org.fortiss.af3.exploration.alg.service.IExplorationFeatureService; import org.fortiss.af3.exploration.alg.service.IExplorationRepairService; import org.fortiss.af3.exploration.alg.service.IExplorationService; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService; import org.fortiss.af3.exploration.alg.service.internal.ExplorationConstraintTransformationService; import org.fortiss.af3.exploration.alg.service.internal.ExplorationEvaluationService; -import org.fortiss.af3.exploration.alg.service.internal.ExplorationModuleService; +import org.fortiss.af3.exploration.alg.service.internal.ExplorationFeatureService; import org.fortiss.af3.exploration.alg.service.internal.ExplorationRepairService; import org.fortiss.af3.exploration.alg.service.internal.ExplorationTransformationService; import org.fortiss.af3.exploration.backend.DseBackendHandler; @@ -90,7 +66,7 @@ public final class ExplorationAlg implements IStartup { public static void initialize() { registerServices(); - getService(IExplorationModuleService.class).initializeService(); + getService(IExplorationFeatureService.class).initializeService(); getService(IExplorationConstraintTransformationService.class).initializeService(); getService(IExplorationEvaluatationService.class).initializeService(); getService(IExplorationRepairService.class).initializeService(); @@ -104,8 +80,8 @@ public final class ExplorationAlg implements IStartup { private static void registerServices() { BundleContext context = getDefault().getBundle().getBundleContext(); - context.registerService(IExplorationModuleService.class.getName(), - ExplorationModuleService.getInstance(), null); + context.registerService(IExplorationFeatureService.class.getName(), + ExplorationFeatureService.getInstance(), null); context.registerService(IExplorationConstraintTransformationService.class.getName(), ExplorationConstraintTransformationService.getInstance(), null); context.registerService(IExplorationEvaluatationService.class.getName(), @@ -117,84 +93,18 @@ public final class ExplorationAlg implements IStartup { } /** Registers the exploration modules bundled with this plugin. */ - @SuppressWarnings("unchecked") private static void registerExplorationModules() { // Functional groups of Decoders. - registerSafetyFunctionModules(); - registerPartitionMappingModules(); - registerTaskMappingModules(); - registerInstTaskGraphModules(); - - // Single exploration modules: Decoding. - getService(IExplorationModuleService.class).registerProblem(StrictTTSchedule.class, - new StrictTTDecoder()); - getService(IExplorationModuleService.class).registerProblem(MessageEncoding.class, - new MessageDecoder()); - } - - /** Registers problem modules related to safety functions. */ - @SuppressWarnings("unchecked") - private static void registerSafetyFunctionModules() { - // Variables - getService(IExplorationModuleService.class).registerVariable( - SafetyFunctionArchEncoding.class, new SafetyFunctionArchCreator(), - new MutateSafetyFunctionArchitectureModule()); - - // Decoding - getService(IExplorationModuleService.class).registerProblem( - AbstractTaskMappingEncoding.class, new SFMappingDecoder()); - // TODO: ConstraintDecoder - // getService(IExplorationModuleService.class).registerProblem( - // AbstractTaskMappingEncoding.class, new SFMappingConstraintDecoder()); - getService(IExplorationModuleService.class).registerProblem(SafeTaskGraphEncoding.class, - new SFGraphDecoder()); - } - - /** Registers problem modules related to safety functions. */ - private static void registerPartitionMappingModules() { - // Variables - getService(IExplorationModuleService.class).registerVariable( - PartitionMappingEncoding.class, new PartitionMappingCreator(), - new PartitionMappingModule()); - - // Decoding - getService(IExplorationModuleService.class).registerProblem( - PlatformCommunicationGraphEncoding.class, new PartitionMappingDecoderGraph()); - } - - /** Registers all problem modules related to task mapping. */ - private static void registerTaskMappingModules() { - // Variables - getService(IExplorationModuleService.class).registerVariable( - AbstractTaskMappingEncoding.class, new AbstractTaskMappingCreator(), - new MutateTaskMappingModule()); - getService(IExplorationModuleService.class).registerVariable( - FailSilentTaskMappingEncoding.class, new FailSilentTaskMappingCreator(), - new MutateTaskInstanceModule()); - - // Decoding - getService(IExplorationModuleService.class).registerProblem( - AbstractTaskMappingEncoding.class, new AbstractTaskMappingIdentityDecoder()); - getService(IExplorationModuleService.class).registerProblem( - FailSilentTaskMappingEncoding.class, new FailSilentAbstractTaskMappingDecoder()); - // getService(IExplorationModuleService.class).registerProblem( - // FaultDetectionVotingTaskMappingEncoding.class, - // new FaultDetectionVotingAbstractTaskMappingDecoder()); - getService(IExplorationModuleService.class).registerProblem( - InstantiatedTaskMappingEncoding.class, new TaskInstanceResourceAlignmentDecoder()); - } - - /** - * Registers all modules related to the derivation of task graphs from instantiated task - * mappings. - */ - @SuppressWarnings("unchecked") - private static void registerInstTaskGraphModules() { - getService(IExplorationModuleService.class).registerProblem( - InstantiatedTaskGraphEncoding.class, new InstantiatedTaskMappingDecoder()); - getService(IExplorationModuleService.class).registerProblem( - InstantiatedAcyclicTaskGraphEncoding.class, - new InstantiatedTaskMappingDecoderAcyclic()); + getService(IExplorationFeatureService.class).registerExplorationFeature( + new SafetyArchitectureExploration()); + getService(IExplorationFeatureService.class).registerExplorationFeature( + new PartitionArchitectureExploration()); + getService(IExplorationFeatureService.class).registerExplorationFeature( + new TaskMappingExploration()); + getService(IExplorationFeatureService.class).registerExplorationFeature( + new DesignDiversityExploration()); + getService(IExplorationFeatureService.class).registerExplorationFeature( + new TTScheduleExploration()); } /** Register the DSE backend with the exploration plugin. */ @@ -208,7 +118,7 @@ public final class ExplorationAlg implements IStartup { */ public static void start() { // TODO: Check start order w.r.t. the transformation service. - getService(IExplorationModuleService.class).startService(); + getService(IExplorationFeatureService.class).startService(); getService(IExplorationConstraintTransformationService.class).startService(); // The Transformation Service must be started before the Evaluation Service such that it can // check for the availability of required transformation modules. diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/.ratings index 826fc063..3b9a9d0d 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/.ratings @@ -1 +1 @@ -Opt4JDseBackend.java 91928dee43716df571dc3a6a5f4031401ed3ae61 RED +Opt4JDseBackend.java aa55d9d0655712fb90ff871e5033541587aa305a RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/Opt4JDseBackend.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/Opt4JDseBackend.java index 91928dee..aa55d9d0 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/Opt4JDseBackend.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/backend/Opt4JDseBackend.java @@ -19,7 +19,6 @@ import static org.fortiss.af3.exploration.alg.util.DesignSpaceExplorationModelEl import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; import static org.fortiss.tooling.kernel.utils.EcoreUtils.getParentsWithType; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; @@ -32,19 +31,23 @@ import org.eclipse.swt.widgets.Display; import org.fortiss.af3.component.model.ComponentArchitecture; import org.fortiss.af3.exploration.alg.dse.CompositeExplorationSolution; import org.fortiss.af3.exploration.alg.dse.Explorer; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.af3.AF3SystemModelAdapter; +import org.fortiss.af3.exploration.alg.feature.DesignDiversityExploration; +import org.fortiss.af3.exploration.alg.feature.IExplorationFeature; +import org.fortiss.af3.exploration.alg.feature.PartitionArchitectureExploration; +import org.fortiss.af3.exploration.alg.feature.SafetyArchitectureExploration; +import org.fortiss.af3.exploration.alg.feature.TTScheduleExploration; +import org.fortiss.af3.exploration.alg.feature.TaskMappingExploration; import org.fortiss.af3.exploration.alg.plot.XYPlotter; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; import org.fortiss.af3.exploration.backend.IDseBackend; import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; import org.fortiss.af3.exploration.model.ExplorationSpecification; -import org.fortiss.af3.exploration.model.IExplorationFeature; import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.exploration.model.solutions.ExplorationSolution; import org.fortiss.af3.exploration.moea.model.DseSpecification; -import org.fortiss.af3.exploration.moea.model.feature.FeatureFactory; import org.fortiss.af3.platform.model.ExecutionUnit; import org.fortiss.af3.platform.model.PlatformArchitecture; import org.fortiss.af3.task.model.Signal; @@ -82,8 +85,8 @@ public class Opt4JDseBackend implements IDseBackend { @Override public Optional<ExplorationSolution> executeDSE(ExplorationSpecification expSpec, Set<Class<? extends IModelElement>> solutionModelTypes, - Collection<IExplorationFeature> explorationModules, IProgressMonitor monitor, - int timeoutMS) throws Exception { + Collection<org.fortiss.af3.exploration.model.IExplorationFeature> explorationModules, + IProgressMonitor monitor, int timeoutMS) throws Exception { ExplorationSolution explorationSolution; SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter; SuperSetMap superSets = expSpec.getSearchSpace(); @@ -101,26 +104,21 @@ public class Opt4JDseBackend implements IDseBackend { superSets.get(ExecutionUnit.class), superSets.get(Signal.class)); DseSpecification dseSpec = createDefaultDesignSpaceExploration(EcoreUtil.copy(expSpec), context); + addDefaultExplorationFeatures(dseSpec); // Set the requested solutions. Set<Class<?>> solutionTypes = new HashSet<>(); solutionTypes.add(StrictTTSchedule.class); - // Features enabled by default. - Collection<IExplorationFeature> dseFeatures = new ArrayList<>(); - dseFeatures.add(FeatureFactory.eINSTANCE.createTaskMapping()); - dseFeatures.add(FeatureFactory.eINSTANCE.createTaskInstantiation()); - dseSpec.getFeatures().addAll(dseFeatures); - try { Explorer explorer = new Explorer(); - Set<Class<? extends IExplorationEncoding>> solPhenotypeTypes = new HashSet<>(); + Set<Class<? extends Phenotype>> solPhenotypeTypes = new HashSet<>(); for(Class<?> solType : solutionTypes) { - if(!IExplorationEncoding.class.isAssignableFrom(solType)) { + if(!Phenotype.class.isAssignableFrom(solType)) { throw new Exception( "The demanded solution is not available in the sleceted DSE backend."); } - solPhenotypeTypes.add((Class<? extends IExplorationEncoding>)solType); + solPhenotypeTypes.add((Class<? extends Phenotype>)solType); } CompositeExplorationSolution<?> expResult = explorer.explore(dseSpec, systemModelAdapter, solPhenotypeTypes, monitor, true); @@ -158,6 +156,15 @@ public class Opt4JDseBackend implements IDseBackend { return getFirst(getParentsWithType(anyElem.get(), archModelType)).orElse(null); } + /** Adds the default set of {@link IExplorationFeature}s to the given {@link DseSpecification}. */ + private void addDefaultExplorationFeatures(DseSpecification dseSpec) { + dseSpec.getFeatures().add(SafetyArchitectureExploration.class); + dseSpec.getFeatures().add(PartitionArchitectureExploration.class); + dseSpec.getFeatures().add(TaskMappingExploration.class); + dseSpec.getFeatures().add(DesignDiversityExploration.class); + dseSpec.getFeatures().add(TTScheduleExploration.class); + } + /** * Creates and launches the Dialog that displays the results from the exploration. * Pareto-optimal points are displayed in a 2D-graph, while schedules can be inspected for diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings index 95c9ceba..a18c43f8 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings @@ -1,6 +1,6 @@ -CompositeExplorationSolution.java db9dadb94e6696cddaf12f0c5238fecfc4348afc RED -DSEFactory.java a4afb8c8c2ab23258ca13083c58b9d8ea766eed2 RED -Explorer.java 48ce78929632a9b78b4c809c7719eb5aa46d21df RED -ImplicitExplorationTargetFactory.java 25c3c668ed268843f8af7e37eb03370ed513b482 RED -SolutionQuantification.java 19cd7caa721bbca3112af7825c7fb20a96a4a799 RED -TaskMappingFactory.java 13f4e8104769a1592050ebb6e23d6fbcf864d1d2 RED +CompositeExplorationSolution.java db9dadb94e6696cddaf12f0c5238fecfc4348afc RED +DSEFactory.java b2eda5cf4b3fb41f0247751116276c3f7a3fd33c RED +Explorer.java be3ff1506a4aa34861de98e0a7e56743630f5afe RED +ImplicitExplorationTargetFactory.java 25c3c668ed268843f8af7e37eb03370ed513b482 RED +SolutionQuantification.java 19cd7caa721bbca3112af7825c7fb20a96a4a799 RED +TaskMappingFactory.java 13f4e8104769a1592050ebb6e23d6fbcf864d1d2 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java index a4afb8c8..b2eda5cf 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java @@ -15,8 +15,6 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse; -import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickFirstInstanceOf; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -42,7 +40,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.DecoderDependencyGraph; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.problem.CompositeProblemModuleBase; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureExplorationProblemModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.DseProcessProblemModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmapping.PartitionMappingDecoderGraph; import org.fortiss.af3.exploration.alg.dse.evaluator.ArchitectureEvaluator; import org.fortiss.af3.exploration.alg.dse.sysmodel.FailSilentExecModelFactory; @@ -108,13 +106,13 @@ public class DSEFactory { @SuppressWarnings("unchecked") public <C, S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>> - void createSubProblems(ArchitectureExplorationProblemModule archExpProblemModule, + void createSubProblems(DseProcessProblemModule archExpProblemModule, DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception { // Java-limitation: it is not possible to pass the generic to the static methods. TaskMappingFactory<S, T> tmFactory = (TaskMappingFactory<S, T>)TaskMappingFactory.getInstance(); - SafetyExploration sfExplorationModule = - pickFirstInstanceOf(SafetyExploration.class, dse.getFeatures()); + SafetyExploration sfExplorationModule = null; + // pickFirstInstanceOf(SafetyExploration.class, dse.getFeatures()); if(sfExplorationModule != null) { // Initialize & register safety function adapters with the SystemModelAdapter. sfExplorationModule.getAdapters().parallelStream() @@ -142,7 +140,7 @@ public class DSEFactory { */ @SuppressWarnings("unchecked") private <C, T extends SafetyFunctionArchEncoding> void createSafetyFunctionArchProblem( - ArchitectureExplorationProblemModule archExpProblemModule, + DseProcessProblemModule archExpProblemModule, DecoderDependencyGraph execDepGraph) throws Exception { // These suppress warnings are required since type erasure in Java does not allow to pass // XY<Z>.class. @@ -169,7 +167,7 @@ public class DSEFactory { * if a cyclic dependency is discovered when registering the problem. */ private void createPartitionMappingProblem( - ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse, + DseProcessProblemModule archExpProblemModule, DseSpecification dse, DecoderDependencyGraph execDepGraph) throws CycleFoundException { Class<PartitionMappingEncoding> pmEnodingClass = PartitionMappingEncoding.class; PartitionMappingCreator pmCreator = new PartitionMappingCreator(); @@ -186,7 +184,7 @@ public class DSEFactory { */ @SuppressWarnings("unchecked") private void createPlatformCommunicationGraphProblem( - ArchitectureExplorationProblemModule archExpProblemModule, + DseProcessProblemModule archExpProblemModule, DecoderDependencyGraph execDepGraph) throws CycleFoundException { Class<PlatformCommunicationGraphEncoding> pmEnodingClass = PlatformCommunicationGraphEncoding.class; @@ -228,7 +226,7 @@ public class DSEFactory { @SuppressWarnings("unchecked") private <S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>> void createAbstractTaskMappingProblem(TaskMappingFactory<S, T> tmFactory, - ArchitectureExplorationProblemModule archExpProblemModule, + DseProcessProblemModule archExpProblemModule, DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception { Class<AbstractTaskMappingEncoding> tmEnodingClass = AbstractTaskMappingEncoding.class; AbstractTaskMappingCreator tmCreator = @@ -262,7 +260,7 @@ public class DSEFactory { @SuppressWarnings("unchecked") private <S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>> void createTaskMappingInstantiationProblem(TaskMappingFactory<S, T> tmFactory, - ArchitectureExplorationProblemModule archExpProblemModule, + DseProcessProblemModule archExpProblemModule, DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception { // These suppress warnings are required since type erasure in Java does not allow to pass // XY<Z>.class. diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java index 9af6eeae..be3ff150 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java @@ -1,246 +1,247 @@ -/*-------------------------------------------------------------------------+ -| Copyright 2014 fortiss GmbH | -| | -| Licensed under the Apache License, Version 2.0 (the "License"); | -| you may not use this file except in compliance with the License. | -| You may obtain a copy of the License at | -| | -| http://www.apache.org/licenses/LICENSE-2.0 | -| | -| Unless required by applicable law or agreed to in writing, software | -| distributed under the License is distributed on an "AS IS" BASIS, | -| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | -| See the License for the specific language governing permissions and | -| limitations under the License. | -+--------------------------------------------------------------------------*/ -package org.fortiss.af3.exploration.alg.dse; - -import static org.fortiss.af3.exploration.alg.service.ExplorationServiceManager.getService; -import static org.fortiss.tooling.common.util.LambdaUtils.filter; -import static org.fortiss.tooling.common.util.LambdaUtils.filterType; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.backend.IExplorerBackend; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.Opt4JExplorerBackend; -import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; -import org.fortiss.af3.exploration.alg.service.IExplorationConstraintTransformationService; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; -import org.fortiss.af3.exploration.model.ExplorationConstraint; -import org.fortiss.af3.exploration.model.ExplorationSpecification; -import org.fortiss.af3.exploration.model.ExplorationTarget; -import org.fortiss.af3.exploration.model.ExternalModelTarget; -import org.fortiss.af3.exploration.moea.model.DseSpecification; -import org.fortiss.af3.exploration.moea.model.parameters.EAOptimizer; -import org.fortiss.af3.exploration.moea.model.parameters.IOptimizer; -import org.fortiss.tooling.kernel.utils.EcoreUtils; - -import com.google.inject.Guice; -import com.google.inject.Injector; - -/** - * Explorer - entry point to architectural exploration - * - * @author huang - */ -public class Explorer { - - /** - * Performs the DSE defined a given {@link DseSpecification} specification on a given - * system model (represented by a {@link SystemModelAdapter}). - * - * @throws Exception - */ - public CompositeExplorationSolution<?> explore(DseSpecification dse, - SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, - Set<Class<? extends IExplorationEncoding>> requestedSolutions, - boolean generateImplicitConstraints) throws Exception { - return explore(dse, systemModelAdapter, requestedSolutions, null, - generateImplicitConstraints); - } - - /** - * Performs the DSE defined a given {@link DseSpecification} specification on a given - * system model (represented by a {@link SystemModelAdapter}). - */ - public CompositeExplorationSolution<?> explore(DseSpecification dse, - SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, - Set<Class<? extends IExplorationEncoding>> requestedSolutions, - IProgressMonitor progressMonitor, boolean generateImplicitConstraints) throws Exception { - validateDesignSpaceExploration(dse); - validateSystemModelAdapter(systemModelAdapter); - - // Clear & add implicit constraints to the Goal specification that are defined by the system - // model. - Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap = new HashMap<>(); - DseSpecification dseSpec = copyDSESpecification(dse, targetAssocMap); - ExplorationSpecification expSpec = dseSpec.getTargetSpecification(); - // FIXME: temporally disable the the implicit constraint generation. - // generateImplicitConstraints = false; - if(generateImplicitConstraints) { - expSpec.getTargets().addAll( - ImplicitExplorationTargetFactory.getInstance() - .createImplicitExplorationTargets(dseSpec, systemModelAdapter)); - } - - // Extract external models to add them to the available input models. - // TODO: readd support for "external" EMF models - for(ExplorationTarget<?> expTarget : expSpec.getTargets()) { - if(expTarget instanceof ExternalModelTarget) { - Collection<EObject> extModels = - ((ExternalModelTarget)expTarget).getExternalModels(); - for(EObject extModel : extModels) { - @SuppressWarnings("unchecked") Class<? extends EObject> modelType = - (Class<? extends EObject>)extModel.eClass().getInstanceClass(); - } - } - } - - // Execute the Constraint Transformation. - IExplorationConstraintTransformationService constrService = - getService(IExplorationConstraintTransformationService.class); - Collection<ExplorationConstraint<?>> genConstrs = - filter(filterType(expSpec.getTargets(), ExplorationConstraint.class), - t -> (t.getExpression() == null)); - // TODO: Reenable the constraint transformation service. - genConstrs = Collections.emptySet(); - Collection<ExplorationConstraint<?>> transformedConstrs = - constrService.getTransformedConstraints(systemModelAdapter, genConstrs); - expSpec.getTargets().addAll(transformedConstrs); - - // Invoke the backend in order to perform the DSE - IExplorerBackend<? extends IOptimizer> explorerBackend = - createExplorerBackend(dseSpec, expSpec, targetAssocMap, systemModelAdapter, - requestedSolutions, progressMonitor); - CompositeExplorationSolution<?> explorationResult = explorerBackend.explore(); - - // Print results - System.out.println(explorationResult); - - return explorationResult; - } - - /** - * Copies a DSE model, and returns a map that associates the {@link ExplorationTarget}s given in - * the original {@link ExplorationSpecification} with the copied ones. - */ - private DseSpecification copyDSESpecification(DseSpecification dse, - Map<ExplorationTarget<?>, ExplorationTarget<?>> assocMap) { - // TODO: rework this method, can be done more efficient. - DseSpecification dseCopy = EcoreUtils.copy(dse); - - ExplorationSpecification origExpSpec = dse.getTargetSpecification(); - dseCopy.getTargetSpecification().getTargets().clear(); - - // Instead of this extra hook, use the M2MCopier. - ExplorationSpecification expSpecCopy = dseCopy.getTargetSpecification(); - for(ExplorationTarget<?> target : origExpSpec.getTargets()) { - ExplorationTarget<?> targetCopy = EcoreUtils.copy(target); - expSpecCopy.getTargets().add(targetCopy); - assocMap.put(target, targetCopy); - } - return dseCopy; - } - - /** Helper method to issue an exception for invalid DSE configurations */ - private void createDesignSpaceExplorationConfigurationException(final String msg) - throws Exception { - throw new Exception("DSE configuration: " + msg); - } - - // TODO: Port validation of DSE configuration to model validation framework that creates markers - // in the problem view - /** Validation of DSE configuration */ - private void validateDesignSpaceExploration(DseSpecification dse) throws Exception { - if(dse == null) { - createDesignSpaceExplorationConfigurationException("No DSE configuration has been specified."); - // Never here - return; - } - - if(dse.getParameters() == null) { - createDesignSpaceExplorationConfigurationException("No optimizer independent parameters have been provided."); - } - - if(dse.getParameters().getExecutionModel() == null) { - createDesignSpaceExplorationConfigurationException("No execution model has been specified."); - } - - if(dse.getOptimizer() == null) { - createDesignSpaceExplorationConfigurationException("No optimizer backend has been specified."); - } - - // TODO: create a validation whether the constraints or objectives are not given - if(dse.getTargetSpecification() == null || - dse.getTargetSpecification().getTargets() == null || - dse.getTargetSpecification().getTargets().isEmpty()) { - createDesignSpaceExplorationConfigurationException("No Optimization goals have been provided."); - } - } - - // TODO: Use a subclassed Exception here. - /** Helper method to issue an exception for invalid input system models */ - private void createSystemModelAdapterConfigurationException(final String msg) throws Exception { - throw new Exception("System model: " + msg); - } - - // TODO: Port validation of system model to model validation framework that creates markers - // in the problem view - /** Validation of system model */ - private void validateSystemModelAdapter( - SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter) throws Exception { - - if(systemModelAdapter == null) { - createSystemModelAdapterConfigurationException("No DSE configuration has been specified."); - return; - } - - if(systemModelAdapter.getDeployableComponents().isEmpty()) { - createSystemModelAdapterConfigurationException("Component architecture does not contain any deployable components.\n\nMake sure the \"Trigger\" annotation have been defined for all components that should be deployed."); - } - - if(systemModelAdapter.getDeploymentTargets().isEmpty()) { - createSystemModelAdapterConfigurationException("Platform architecture does not contain any deployment targets.\n\nMake sure the \"Deployment Target\" annotation has been set for all execution units that should be deployed.\n\nMaybe you selected the wrong platform architecture?"); - } - - if(systemModelAdapter.getTaskGraphs().isEmpty()) { - createSystemModelAdapterConfigurationException("System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); - } - - if(systemModelAdapter.getAcyclicTaskGraphs().isEmpty()) { - createSystemModelAdapterConfigurationException("System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); - } - - // FIXME: readd? ==>> VL Generation. - // if(systemModelAdapter.getHyperPeriod() <= 0) { - // createSystemModelAdapterConfigurationException("System model does not have a valid hyper - // period."); - // } - } - - /** Explorer backend */ - private IExplorerBackend<? extends IOptimizer> createExplorerBackend(DseSpecification dse, - ExplorationSpecification expSpec, - Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap, - SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, - Set<Class<? extends IExplorationEncoding>> requestedSolutions, - IProgressMonitor progressMonitor) throws Exception { - Injector dseInjector = Guice.createInjector(systemModelAdapter); - - if(dse.getOptimizer() instanceof EAOptimizer) { - return new Opt4JExplorerBackend(dse, expSpec, targetAssocMap, dseInjector, - requestedSolutions, progressMonitor); - } - - createDesignSpaceExplorationConfigurationException("Unsupported exploration backend."); - - // Never here - return null; - } -} +/*-------------------------------------------------------------------------+ +| Copyright 2014 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.dse; + +import static org.fortiss.af3.exploration.alg.service.ExplorationServiceManager.getService; +import static org.fortiss.tooling.common.util.LambdaUtils.filter; +import static org.fortiss.tooling.common.util.LambdaUtils.filterType; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.emf.ecore.EObject; +import org.fortiss.af3.exploration.alg.dse.backend.IExplorerBackend; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.Opt4JExplorerBackend; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; +import org.fortiss.af3.exploration.alg.service.IExplorationConstraintTransformationService; +import org.fortiss.af3.exploration.model.ExplorationConstraint; +import org.fortiss.af3.exploration.model.ExplorationSpecification; +import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.fortiss.af3.exploration.model.ExternalModelTarget; +import org.fortiss.af3.exploration.moea.model.DseSpecification; +import org.fortiss.af3.exploration.moea.model.parameters.EAOptimizer; +import org.fortiss.af3.exploration.moea.model.parameters.IOptimizer; +import org.fortiss.tooling.kernel.utils.EcoreUtils; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Explorer - entry point to architectural exploration + * + * @author huang + */ +public class Explorer { + + /** + * Performs the DSE defined a given {@link DseSpecification} specification on a given + * system model (represented by a {@link SystemModelAdapter}). + * + * @throws Exception + */ + public CompositeExplorationSolution<?> + explore(DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, + Set<Class<? extends Phenotype>> requestedSolutions, + boolean generateImplicitConstraints) throws Exception { + return explore(dse, systemModelAdapter, requestedSolutions, null, + generateImplicitConstraints); + } + + /** + * Performs the DSE defined a given {@link DseSpecification} specification on a given + * system model (represented by a {@link SystemModelAdapter}). + */ + public CompositeExplorationSolution<?> explore(DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, + Set<Class<? extends Phenotype>> requestedSolutions, IProgressMonitor progressMonitor, + boolean generateImplicitConstraints) throws Exception { + validateDesignSpaceExploration(dse); + validateSystemModelAdapter(systemModelAdapter); + + // Clear & add implicit constraints to the Goal specification that are defined by the system + // model. + Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap = new HashMap<>(); + DseSpecification dseSpec = copyDSESpecification(dse, targetAssocMap); + ExplorationSpecification expSpec = dseSpec.getTargetSpecification(); + // FIXME: temporally disable the the implicit constraint generation. + // generateImplicitConstraints = false; + if(generateImplicitConstraints) { + expSpec.getTargets().addAll( + ImplicitExplorationTargetFactory.getInstance() + .createImplicitExplorationTargets(dseSpec, systemModelAdapter)); + } + + // Extract external models to add them to the available input models. + // TODO: readd support for "external" EMF models + for(ExplorationTarget<?> expTarget : expSpec.getTargets()) { + if(expTarget instanceof ExternalModelTarget) { + Collection<EObject> extModels = + ((ExternalModelTarget)expTarget).getExternalModels(); + for(EObject extModel : extModels) { + @SuppressWarnings("unchecked") Class<? extends EObject> modelType = + (Class<? extends EObject>)extModel.eClass().getInstanceClass(); + } + } + } + + // Execute the Constraint Transformation. + IExplorationConstraintTransformationService constrService = + getService(IExplorationConstraintTransformationService.class); + Collection<ExplorationConstraint<?>> genConstrs = + filter(filterType(expSpec.getTargets(), ExplorationConstraint.class), + t -> (t.getExpression() == null)); + // TODO: Reenable the constraint transformation service. + genConstrs = Collections.emptySet(); + Collection<ExplorationConstraint<?>> transformedConstrs = + constrService.getTransformedConstraints(systemModelAdapter, genConstrs); + expSpec.getTargets().addAll(transformedConstrs); + + // Invoke the backend in order to perform the DSE + IExplorerBackend<? extends IOptimizer> explorerBackend = + createExplorerBackend(dseSpec, expSpec, targetAssocMap, systemModelAdapter, + requestedSolutions, progressMonitor); + CompositeExplorationSolution<?> explorationResult = explorerBackend.explore(); + + // Print results + System.out.println(explorationResult); + + return explorationResult; + } + + /** + * Copies a DSE model, and returns a map that associates the {@link ExplorationTarget}s given in + * the original {@link ExplorationSpecification} with the copied ones. + */ + private DseSpecification copyDSESpecification(DseSpecification dse, + Map<ExplorationTarget<?>, ExplorationTarget<?>> assocMap) { + // TODO: rework this method, can be done more efficient. + DseSpecification dseCopy = EcoreUtils.copy(dse); + + ExplorationSpecification origExpSpec = dse.getTargetSpecification(); + dseCopy.getTargetSpecification().getTargets().clear(); + + // Instead of this extra hook, use the M2MCopier. + ExplorationSpecification expSpecCopy = dseCopy.getTargetSpecification(); + for(ExplorationTarget<?> target : origExpSpec.getTargets()) { + ExplorationTarget<?> targetCopy = EcoreUtils.copy(target); + expSpecCopy.getTargets().add(targetCopy); + assocMap.put(target, targetCopy); + } + return dseCopy; + } + + /** Helper method to issue an exception for invalid DSE configurations */ + private void createDesignSpaceExplorationConfigurationException(final String msg) + throws Exception { + throw new Exception("DSE configuration: " + msg); + } + + // TODO: Port validation of DSE configuration to model validation framework that creates markers + // in the problem view + /** Validation of DSE configuration */ + private void validateDesignSpaceExploration(DseSpecification dse) throws Exception { + if(dse == null) { + createDesignSpaceExplorationConfigurationException("No DSE configuration has been specified."); + // Never here + return; + } + + if(dse.getParameters() == null) { + createDesignSpaceExplorationConfigurationException("No optimizer independent parameters have been provided."); + } + + if(dse.getParameters().getExecutionModel() == null) { + createDesignSpaceExplorationConfigurationException("No execution model has been specified."); + } + + if(dse.getOptimizer() == null) { + createDesignSpaceExplorationConfigurationException("No optimizer backend has been specified."); + } + + // TODO: create a validation whether the constraints or objectives are not given + if(dse.getTargetSpecification() == null || + dse.getTargetSpecification().getTargets() == null || + dse.getTargetSpecification().getTargets().isEmpty()) { + createDesignSpaceExplorationConfigurationException("No Optimization goals have been provided."); + } + } + + // TODO: Use a subclassed Exception here. + /** Helper method to issue an exception for invalid input system models */ + private void createSystemModelAdapterConfigurationException(final String msg) throws Exception { + throw new Exception("System model: " + msg); + } + + // TODO: Port validation of system model to model validation framework that creates markers + // in the problem view + /** Validation of system model */ + private void validateSystemModelAdapter( + SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter) throws Exception { + + if(systemModelAdapter == null) { + createSystemModelAdapterConfigurationException("No DSE configuration has been specified."); + return; + } + + if(systemModelAdapter.getDeployableComponents().isEmpty()) { + createSystemModelAdapterConfigurationException("Component architecture does not contain any deployable components.\n\nMake sure the \"Trigger\" annotation have been defined for all components that should be deployed."); + } + + if(systemModelAdapter.getDeploymentTargets().isEmpty()) { + createSystemModelAdapterConfigurationException("Platform architecture does not contain any deployment targets.\n\nMake sure the \"Deployment Target\" annotation has been set for all execution units that should be deployed.\n\nMaybe you selected the wrong platform architecture?"); + } + + if(systemModelAdapter.getTaskGraphs().isEmpty()) { + createSystemModelAdapterConfigurationException("System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); + } + + if(systemModelAdapter.getAcyclicTaskGraphs().isEmpty()) { + createSystemModelAdapterConfigurationException("System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); + } + + // FIXME: readd? ==>> VL Generation. + // if(systemModelAdapter.getHyperPeriod() <= 0) { + // createSystemModelAdapterConfigurationException("System model does not have a valid hyper + // period."); + // } + } + + /** Explorer backend */ + private IExplorerBackend<? extends IOptimizer> createExplorerBackend(DseSpecification dse, + ExplorationSpecification expSpec, + Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap, + SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, + Set<Class<? extends Phenotype>> requestedSolutions, IProgressMonitor progressMonitor) + throws Exception { + Injector dseInjector = Guice.createInjector(systemModelAdapter); + + if(dse.getOptimizer() instanceof EAOptimizer) { + return new Opt4JExplorerBackend(dse, expSpec, targetAssocMap, dseInjector, + requestedSolutions, progressMonitor); + } + + createDesignSpaceExplorationConfigurationException("Unsupported exploration backend."); + + // Never here + return null; + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/.ratings index 3e8c90ba..f7151466 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/.ratings @@ -1,3 +1,3 @@ -ExplorerBackendBase.java c8cb7fda00311b9f3002833eb5cd3d2eb3615ea4 RED +ExplorerBackendBase.java 19c9b3977fce8f8c4ab6153994c3f2608ca1b492 RED IExplorerBackend.java 608f40896becf86dd68cc7b6994383e58c0885a8 RED SolutionCandidateBase.java ba1b16d55680ea45bffd665ac7b0fd71b589b769 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java index c8cb7fda..19c9b397 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java @@ -1,195 +1,193 @@ -/*-------------------------------------------------------------------------+ -| Copyright 2014 fortiss GmbH | -| | -| Licensed under the Apache License, Version 2.0 (the "License"); | -| you may not use this file except in compliance with the License. | -| You may obtain a copy of the License at | -| | -| http://www.apache.org/licenses/LICENSE-2.0 | -| | -| Unless required by applicable law or agreed to in writing, software | -| distributed under the License is distributed on an "AS IS" BASIS, | -| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | -| See the License for the specific language governing permissions and | -| limitations under the License. | -+--------------------------------------------------------------------------*/ -package org.fortiss.af3.exploration.alg.dse.backend; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import javax.activation.UnsupportedDataTypeException; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.fortiss.af3.exploration.alg.dse.DSEFactory; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.IExplorationSolution; -import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.IConstraintEvaluator; -import org.fortiss.af3.exploration.alg.dse.sysmodel.random.RandomExploration; -import org.fortiss.af3.exploration.alg.dse.sysmodel.random.RandomExploration.RandomnessType; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; -import org.fortiss.af3.exploration.model.ExplorationConstraint; -import org.fortiss.af3.exploration.model.ExplorationSpecification; -import org.fortiss.af3.exploration.model.ExplorationTarget; -import org.fortiss.af3.exploration.moea.model.DseSpecification; -import org.fortiss.af3.exploration.moea.model.parameters.IOptimizer; -import org.opt4j.core.Value; -import org.opt4j.core.problem.Evaluator; - -import com.google.inject.AbstractModule; -import com.google.inject.Injector; - -/** - * Base class for general optimization backends. - * - * @author barner - */ -public abstract class ExplorerBackendBase<O extends IOptimizer> extends AbstractModule implements - IExplorerBackend<O> { - - /** DSE specification (optimizer parameters, goal specification, input model, ...) */ - protected DseSpecification dse; - - /** Contains all ExplorationTargets of the exploration. */ - protected ExplorationSpecification expSpec; - - /** - * Map that relates the {@link ExplorationTarget}s from input specification with the - * {@link ExplorationTarget}s that are actually used in the DSE. - */ - protected Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap; - - /** Representation of system model (=input) that is evaluated during this DSE run */ - protected Injector dseInjector; - - /** Set of requested {@link Phenotype}s that form the solution set. */ - protected Set<Class<? extends IExplorationEncoding>> requestedSolutions; - - /** - * {@link IProgressMonitor} used to visualize the progress of the exploration process (may be - * {@code null}). - */ - protected IProgressMonitor progressMonitor; - - /** - * Contains the EvaluatorWrapper factory. It is used to instantiate the objectives and - * constraints that are used during the exploration for specific execution models. - */ - protected DSEFactory explorationFactory; - - /** - * Constructor that initializes the DSE backend with the given optimizer independent parameters - * and the goal specification - */ - protected ExplorerBackendBase(DseSpecification dse, ExplorationSpecification expSpec, - Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap, Injector dseInjector, - Set<Class<? extends IExplorationEncoding>> requestedSolutions, - IProgressMonitor progressMonitor) { - this.dse = dse; - this.expSpec = expSpec; - this.targetAssocMap = targetAssocMap; - this.dseInjector = dseInjector; - this.requestedSolutions = requestedSolutions; - this.progressMonitor = progressMonitor; - - // TODO: Initialization of the TaskMappingFactory is currently done here to allow an - // instantiation of the Evaluators by the goals. Those are generified, and hence, the - // instance must exist already. - try { - DSEFactory.getInstance().createTaskMappingFactory( - dse.getParameters().getExecutionModel()); - } catch(UnsupportedDataTypeException e) { - // See todo above - e.printStackTrace(); - } - - // (Re-)Initialize the Random number generator - initCentralRandomGenerator(); - } - - /** - * (Re-)Initializes the central random number generator of the DSE. It must be re-initialized on - * successive runs to obtain deterministic behavior. - */ - private void initCentralRandomGenerator() { - if(!RandomExploration.getInstance().isInitialized()) { - try { - RandomExploration.getInstance().init(RandomnessType.realRandom, 30); - } catch(Exception e) { - // This is the correct place to initialize the central random generator. - assert (false) : "The centralized random number generator of the DSE has been initialized in another location, where it should not be initialized."; - } - } else { - try { - RandomExploration.getInstance().reInit(); - } catch(Exception e) { - // This is the correct place to re-initialize the central random generator, it has - // been initialized in this place before. - assert (false) : "The centralized random number generator of the DSE has not been initialized."; - } - } - } - - /** - * Performs the initialization of the optimizer backend. Must be called from constructor in - * concrete derived classes. - */ - protected abstract void init(O optimizer); - - /** - * Feasibility check for the results from the exploration. It validates that each constraint is - * fulfilled by applying the validate function of the {@link IConstraintEvaluator}s onto each - * possible solution. - */ - // protected CompositeExplorationSolution<?> validate( - // CompositeExplorationSolution<?> explorationResult, - // Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { - // CompositeExplorationSolution<?> feasibleExplorationResult = explorationResult.copy(); - // - // // Iterate over all (feasible + infeasible) solutions - // for(Entry<IExplorationSolution<?>, SolutionQuantification> solution : explorationResult - // .getSolutionQuantification().entrySet()) { - // boolean isFeasible = - // validateSolution(solution.getKey(), solution.getValue(), evalWrappers); - // - // // Remove the current solution if the feasibility check failed. - // if(!isFeasible) { - // feasibleExplorationResult.deleteSolutionQuantification(solution.getKey()); - // } - // } - // - // return feasibleExplorationResult; - // } - - /** */ - protected <M extends Phenotype> boolean validateSolution(IExplorationSolution<?> solution, - ExplorationConstraint<?> target, Value<?> value, - Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { - EvaluatorWrapper<?, ?, ?> evalWrapper = getEvaluatorOf(target, evalWrappers); - - assert (evalWrapper.getEvaluator() instanceof IConstraintEvaluator) : "The evaluator for the exploration constraint " + - target.getName() + " has an evaluator which is not an IConstraintEvaluator."; - - @SuppressWarnings("unchecked") Class<M> phenoClass = - (Class<M>)evalWrapper.getTargetPhenotypeType(); - M targetSubSolution = solution.getSubSolution(phenoClass); - return ((IConstraintEvaluator<?, ?, ?>)evalWrapper.getEvaluator()).validate(target, - targetSubSolution, phenoClass, value); - } - - /** - * From a given set of {@link Evaluator}s that are {@link EvaluatorWrapper}s, return the first - * found evaluator that is associated with the given {@link ExplorationTarget}. - */ - private <E extends EvaluatorWrapper<?, ?, ?>> E getEvaluatorOf(ExplorationTarget<?> expTarget, - Collection<E> evaluators) { - for(E evaluator : evaluators) { - if(expTarget.getClass().isAssignableFrom(evaluator.getTargetType())) { - return evaluator; - } - } - return null; - } -} +/*-------------------------------------------------------------------------+ +| Copyright 2014 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.dse.backend; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import javax.activation.UnsupportedDataTypeException; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.fortiss.af3.exploration.alg.dse.DSEFactory; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.IExplorationSolution; +import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.IConstraintEvaluator; +import org.fortiss.af3.exploration.alg.dse.sysmodel.random.RandomExploration; +import org.fortiss.af3.exploration.alg.dse.sysmodel.random.RandomExploration.RandomnessType; +import org.fortiss.af3.exploration.model.ExplorationConstraint; +import org.fortiss.af3.exploration.model.ExplorationSpecification; +import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.fortiss.af3.exploration.moea.model.DseSpecification; +import org.fortiss.af3.exploration.moea.model.parameters.IOptimizer; +import org.opt4j.core.Value; +import org.opt4j.core.problem.Evaluator; + +import com.google.inject.AbstractModule; +import com.google.inject.Injector; + +/** + * Base class for general optimization backends. + * + * @author barner + */ +public abstract class ExplorerBackendBase<O extends IOptimizer> extends AbstractModule implements + IExplorerBackend<O> { + + /** DSE specification (optimizer parameters, goal specification, input model, ...) */ + protected DseSpecification dse; + + /** Contains all ExplorationTargets of the exploration. */ + protected ExplorationSpecification expSpec; + + /** + * Map that relates the {@link ExplorationTarget}s from input specification with the + * {@link ExplorationTarget}s that are actually used in the DSE. + */ + protected Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap; + + /** Representation of system model (=input) that is evaluated during this DSE run */ + protected Injector dseInjector; + + /** Set of requested {@link Phenotype}s that form the solution set. */ + protected Set<Class<? extends Phenotype>> requestedSolutions; + + /** + * {@link IProgressMonitor} used to visualize the progress of the exploration process (may be + * {@code null}). + */ + protected IProgressMonitor progressMonitor; + + /** + * Contains the EvaluatorWrapper factory. It is used to instantiate the objectives and + * constraints that are used during the exploration for specific execution models. + */ + protected DSEFactory explorationFactory; + + /** + * Constructor that initializes the DSE backend with the given optimizer independent parameters + * and the goal specification + */ + protected ExplorerBackendBase(DseSpecification dse, ExplorationSpecification expSpec, + Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap, Injector dseInjector, + Set<Class<? extends Phenotype>> requestedSolutions, IProgressMonitor progressMonitor) { + this.dse = dse; + this.expSpec = expSpec; + this.targetAssocMap = targetAssocMap; + this.dseInjector = dseInjector; + this.requestedSolutions = requestedSolutions; + this.progressMonitor = progressMonitor; + + // TODO: Initialization of the TaskMappingFactory is currently done here to allow an + // instantiation of the Evaluators by the goals. Those are generified, and hence, the + // instance must exist already. + try { + DSEFactory.getInstance().createTaskMappingFactory( + dse.getParameters().getExecutionModel()); + } catch(UnsupportedDataTypeException e) { + // See todo above + e.printStackTrace(); + } + + // (Re-)Initialize the Random number generator + initCentralRandomGenerator(); + } + + /** + * (Re-)Initializes the central random number generator of the DSE. It must be re-initialized on + * successive runs to obtain deterministic behavior. + */ + private void initCentralRandomGenerator() { + if(!RandomExploration.getInstance().isInitialized()) { + try { + RandomExploration.getInstance().init(RandomnessType.realRandom, 30); + } catch(Exception e) { + // This is the correct place to initialize the central random generator. + assert (false) : "The centralized random number generator of the DSE has been initialized in another location, where it should not be initialized."; + } + } else { + try { + RandomExploration.getInstance().reInit(); + } catch(Exception e) { + // This is the correct place to re-initialize the central random generator, it has + // been initialized in this place before. + assert (false) : "The centralized random number generator of the DSE has not been initialized."; + } + } + } + + /** + * Performs the initialization of the optimizer backend. Must be called from constructor in + * concrete derived classes. + */ + protected abstract void init(O optimizer); + + /** + * Feasibility check for the results from the exploration. It validates that each constraint is + * fulfilled by applying the validate function of the {@link IConstraintEvaluator}s onto each + * possible solution. + */ + // protected CompositeExplorationSolution<?> validate( + // CompositeExplorationSolution<?> explorationResult, + // Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { + // CompositeExplorationSolution<?> feasibleExplorationResult = explorationResult.copy(); + // + // // Iterate over all (feasible + infeasible) solutions + // for(Entry<IExplorationSolution<?>, SolutionQuantification> solution : explorationResult + // .getSolutionQuantification().entrySet()) { + // boolean isFeasible = + // validateSolution(solution.getKey(), solution.getValue(), evalWrappers); + // + // // Remove the current solution if the feasibility check failed. + // if(!isFeasible) { + // feasibleExplorationResult.deleteSolutionQuantification(solution.getKey()); + // } + // } + // + // return feasibleExplorationResult; + // } + + /** */ + protected <M extends Phenotype> boolean validateSolution(IExplorationSolution<?> solution, + ExplorationConstraint<?> target, Value<?> value, + Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { + EvaluatorWrapper<?, ?, ?> evalWrapper = getEvaluatorOf(target, evalWrappers); + + assert (evalWrapper.getEvaluator() instanceof IConstraintEvaluator) : "The evaluator for the exploration constraint " + + target.getName() + " has an evaluator which is not an IConstraintEvaluator."; + + @SuppressWarnings("unchecked") Class<M> phenoClass = + (Class<M>)evalWrapper.getTargetPhenotypeType(); + M targetSubSolution = solution.getSubSolution(phenoClass); + return ((IConstraintEvaluator<?, ?, ?>)evalWrapper.getEvaluator()).validate(target, + targetSubSolution, phenoClass, value); + } + + /** + * From a given set of {@link Evaluator}s that are {@link EvaluatorWrapper}s, return the first + * found evaluator that is associated with the given {@link ExplorationTarget}. + */ + private <E extends EvaluatorWrapper<?, ?, ?>> E getEvaluatorOf(ExplorationTarget<?> expTarget, + Collection<E> evaluators) { + for(E evaluator : evaluators) { + if(expTarget.getClass().isAssignableFrom(evaluator.getTargetType())) { + return evaluator; + } + } + return null; + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings index 8861e953..f98c9147 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings @@ -1,5 +1,5 @@ -Opt4JDseTask.java b5cb9e664e7a8fc2b5157bcdcaca740c2fa85336 YELLOW -Opt4JDseTaskProvider.java ff2bbc6da2b21bd0bc64c3fa77dc8fa9939d10af RED -Opt4JExplorationSolutionSet.java 8578ee9c438bc3327a64172e996306a89606c782 RED -Opt4JExplorerBackend.java 143812e08f4ef9a803e0e24dc32612007c98cbd2 RED -Opt4JSingleExplorationSolution.java 41ce92d11b2e7a6a8c39bffa990c691160c36c8d RED +Opt4JDseTask.java b5cb9e664e7a8fc2b5157bcdcaca740c2fa85336 YELLOW +Opt4JDseTaskProvider.java ff2bbc6da2b21bd0bc64c3fa77dc8fa9939d10af RED +Opt4JExplorationSolutionSet.java 8578ee9c438bc3327a64172e996306a89606c782 RED +Opt4JExplorerBackend.java cddd1dc5ff5833b7e23cca7328682d88ee782677 RED +Opt4JSingleExplorationSolution.java 41ce92d11b2e7a6a8c39bffa990c691160c36c8d RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java index 143812e0..cddd1dc5 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java @@ -15,7 +15,8 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.backend.opt4j; -import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickFirstInstanceOf; +import static com.google.common.collect.Sets.newHashSet; +import static org.fortiss.af3.exploration.alg.service.ExplorationServiceManager.getService; import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickInstanceOf; import java.util.ArrayList; @@ -29,6 +30,8 @@ import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.fortiss.af3.exploration.alg.dse.CompositeExplorationSolution; import org.fortiss.af3.exploration.alg.dse.backend.ExplorerBackendBase; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.GuiceDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.mating.MatingCrossoverMutateRepairModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.partitionmapping.CopyPartitionMappingModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.platform.CopyPlatformCommunicationGraphModule; @@ -41,18 +44,19 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopC import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverSFArchModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.partitionmapping.PartitionMappingModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.platform.NopPlatformCommGraphMutateModule; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.safetyarch.MutateSafetyFunctionArchitectureModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskinstantiation.MutateTaskInstanceModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmapping.MutateTaskMappingModule; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureExplorationProblemModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.DseProcessProblemModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.ArchitectureSolution; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.IExplorationSolution; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.dse.module.DecoderModule; +import org.fortiss.af3.exploration.alg.exception.ExplorationRuntimeException; +import org.fortiss.af3.exploration.alg.feature.IExplorationFeature; +import org.fortiss.af3.exploration.alg.service.IExplorationFeatureService; import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.model.ExplorationSpecification; import org.fortiss.af3.exploration.model.ExplorationTarget; import org.fortiss.af3.exploration.moea.model.DseSpecification; -import org.fortiss.af3.exploration.moea.model.feature.SafetyExploration; import org.fortiss.af3.exploration.moea.model.parameters.EAOptimizer; import org.opt4j.core.Individual; import org.opt4j.core.Objective; @@ -64,9 +68,11 @@ import org.opt4j.core.config.Task; import org.opt4j.core.config.TaskStateListener; import org.opt4j.core.optimizer.Archive; import org.opt4j.core.optimizer.Control; +import org.opt4j.core.problem.Decoder; import org.opt4j.optimizers.ea.EvolutionaryAlgorithmModule; import org.opt4j.optimizers.ea.Spea2Module; +import com.google.inject.CreationException; import com.google.inject.Injector; import com.google.inject.Module; @@ -89,7 +95,7 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { * Contains the problem module that includes the evaluators associated with the goals of the * DSE. */ - private ArchitectureExplorationProblemModule archExplorationProblemModule; + private DseProcessProblemModule archExplorationProblemModule; /** * Constructor that initializes the Opt4J backend, and sets optimizer independent parameters @@ -99,8 +105,8 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { */ public Opt4JExplorerBackend(DseSpecification dse, ExplorationSpecification expSpec, Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap, Injector dseInjector, - Set<Class<? extends IExplorationEncoding>> requestedSolutions, - IProgressMonitor progressMonitor) throws Exception { + Set<Class<? extends Phenotype>> requestedSolutions, IProgressMonitor progressMonitor) + throws Exception { // Optimizer independent configuration super(dse, expSpec, targetAssocMap, dseInjector, requestedSolutions, progressMonitor); @@ -114,11 +120,12 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { } /** {@inheritDoc} */ - @SuppressWarnings("unchecked") @Override protected void init(EAOptimizer opt4JParameters) { this.opt4JParameters = opt4JParameters; + checkDseProcessExploration(requestedSolutions); + System.out.println("Initializing EA optimizer (generations: " + "" + opt4JParameters.getIterations() + ", alpha: " + opt4JParameters.getAlpha() + ")."); @@ -158,7 +165,7 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { // modules.add(multiEvaluatorModule); archExplorationProblemModule = - new ArchitectureExplorationProblemModule(dse, dseInjector, requestedSolutions); + new DseProcessProblemModule(dse, dseInjector, requestedSolutions); modules.add(archExplorationProblemModule); // Configure operators @@ -174,11 +181,11 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { // ===================================== // Safety functions (if the safety exploration module is enabled) - if(pickFirstInstanceOf(SafetyExploration.class, dse.getFeatures()) != null) { - MutateSafetyFunctionArchitectureModule sfArchModule = - new MutateSafetyFunctionArchitectureModule(); - modules.add(sfArchModule); - } + // if(pickFirstInstanceOf(SafetyExploration.class, dse.getFeatures()) != null) { + // MutateSafetyFunctionArchitectureModule sfArchModule = + // new MutateSafetyFunctionArchitectureModule(); + // modules.add(sfArchModule); + // } // NOP for PlatformCommunicationGraph modules.add(new NopPlatformCommGraphMutateModule()); @@ -241,10 +248,50 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { } /** - * {@inheritDoc} + * Consistency check for the DSE process configuration. + * An {@link Injector} for the decoding phase is setup to check whether the bindings of the + * {@link DecoderModule}s are correct given the current configuration of + * {@link IExplorationFeature}s and the desired result types. + * <p> + * Typical errors that are detected include: + * <ul> + * <li>Circular dependencies</li> + * <li>Two or more {@link DecoderModule}s that provide the same {@link Phenotype}</li> + * </ul> + */ + private void checkDseProcessExploration(Set<Class<? extends Phenotype>> resultTypes) { + Collection<IExplorationFeature> enabledFeatures = + getService(IExplorationFeatureService.class).getExplorationFeatures( + dse.getFeatures()); + Collection<DecoderModule<?>> enabledDecoders = newHashSet(); + enabledFeatures.forEach(f -> enabledDecoders.addAll(f.getDecoders())); + GuiceDecoder guiceDecoder = new GuiceDecoder(resultTypes, enabledDecoders); + buildCheckedDecodingInjector(guiceDecoder); + } + + /** + * Creates an decoding {@link Injector} for the DSE process decoding that throws an + * {@link ExplorationRuntimeException} if the {@link DecoderModule} setup is invalid. * - * @throws Exception + * @param guiceDecoder + * {@link Decoder} installing its sub-decoders. + * @return the {@link Injector} of the DSE process top-most {@link Decoder}. */ + private Injector buildCheckedDecodingInjector(GuiceDecoder guiceDecoder) { + Injector decodingInjector = null; + try { + decodingInjector = dseInjector.createChildInjector(guiceDecoder); + } catch(CreationException e) { + throw new ExplorationRuntimeException( + "Error while configuring the DSE process decoder chain.\n" + + "See the subsequent error message for details. Typical configuration faults include:\n" + + "1) 2 or more decoders attemp to provide the same type.\n" + "2) ...", + e); + } + return decodingInjector; + } + + /** {@inheritDoc} */ @Override public CompositeExplorationSolution<?> explore() throws Exception { @@ -335,6 +382,8 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { return rval; } + /** {@inheritDoc} */ + @Override protected void configure() { bind(Opt4JDseTask.class).toProvider(new Opt4JDseTaskProvider(opt4JTask)); } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings index dfd93834..0662f84a 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings @@ -1,5 +1,5 @@ -ComposableCreator.java 6d2d61205890a2b0b99f41d2caa4debc511c8b4a RED -ComposableCreatorBase.java e1a898541dd2b480e6c345ad2429bf93393957e6 RED -CompositeCreator.java bb054d281931f461ca67def20360cc767940e204 RED -CompositeCreatorBase.java d897947ff0db02ea1cac4034a4912f9afce283ec RED -GuiceCreator.java d97b10032981b574922d292afd9306a55df351bb RED +ComposableCreator.java 6d2d61205890a2b0b99f41d2caa4debc511c8b4a RED +ComposableCreatorBase.java e1a898541dd2b480e6c345ad2429bf93393957e6 RED +CompositeCreator.java bb054d281931f461ca67def20360cc767940e204 RED +CompositeCreatorBase.java d897947ff0db02ea1cac4034a4912f9afce283ec RED +GuiceCreator.java 3cea3607c0aae0a5ec1365294073d5970e0ab0cf RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/GuiceCreator.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/GuiceCreator.java index d97b1003..3cea3607 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/GuiceCreator.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/GuiceCreator.java @@ -15,13 +15,11 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create; -import static org.fortiss.af3.exploration.alg.service.ExplorationServiceManager.getService; - import java.util.Collection; +import java.util.Set; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.Opt4JDseTaskProvider; import org.fortiss.af3.exploration.alg.dse.module.CreatorModule; -import org.fortiss.af3.exploration.alg.service.IExplorationModuleService; import org.opt4j.core.Genotype; import org.opt4j.core.genotype.CompositeGenotype; import org.opt4j.core.problem.Creator; @@ -40,7 +38,10 @@ public class GuiceCreator extends AbstractModule implements Creator<CompositeGenotype<Class<? extends Genotype>, ? extends Genotype>> { /** Set of {@link Genotype}-Types for which instances shall be created. */ - private Collection<Class<? extends Genotype>> requiredGenotypes; + private Set<Class<? extends Genotype>> requiredGenotypes; + + /** Set of {@link CreatorModule}s provided by the enabled exploration features. */ + private Collection<CreatorModule<?>> enabledCreators; /** {@link Opt4JTask} provider used to obtain the opt4j injector. */ @Inject @@ -50,8 +51,10 @@ public class GuiceCreator extends AbstractModule implements protected Injector createInjector; /** Constructor. */ - public GuiceCreator(Collection<Class<? extends Genotype>> requiredGenotypes) { + public GuiceCreator(Set<Class<? extends Genotype>> requiredGenotypes, + Collection<CreatorModule<?>> enabledCreators) { this.requiredGenotypes = requiredGenotypes; + this.enabledCreators = enabledCreators; } /** {@inheritDoc} */ @@ -73,7 +76,7 @@ public class GuiceCreator extends AbstractModule implements protected void configure() { // bindScope(ThreadScoped.class, new ThreadScope()); - for(CreatorModule<?> module : getService(IExplorationModuleService.class).getCreators()) { + for(CreatorModule<?> module : enabledCreators) { install(module); } } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings index 63f97eac..db66ca2f 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings @@ -1,8 +1,9 @@ -ComposableDecoder.java 0ef247e0e8424968cd8dab8317df0e504c5018d4 RED -ComposableDecoderBase.java 7c47b41e609b6911128efa469c2dd65122276bcc RED -CompositeDecoder.java 68864146cbd7b0d1444d4157cf88023deb4a21ea RED -CompositeDecoderBase.java cc878483ec3dcf3afd60509579c7c17a3433893c RED -GuiceDecoder.java e118048ae4abd7dedc858845cda9bc67e7565835 RED -PhenotypeDecoder.java 042d35c9bcba9a2cddc5e82ca5abe6f52438d1c3 RED -ThreadScope.java f3a2b90fdbf0b2aabde4112c94623da5c262952b RED -ThreadScoped.java a8335b0831586ea6ced17a5e7adf2952b72957d9 RED +ComposableDecoder.java 0ef247e0e8424968cd8dab8317df0e504c5018d4 RED +ComposableDecoderBase.java 7c47b41e609b6911128efa469c2dd65122276bcc RED +CompositeDecoder.java 68864146cbd7b0d1444d4157cf88023deb4a21ea RED +CompositeDecoderBase.java cc878483ec3dcf3afd60509579c7c17a3433893c RED +Genotyped.java c74c870c570597bdb373308fa339ccf2c8e88942 YELLOW +GuiceDecoder.java ed4e3e79d95a7f0ab7f0dfdbf602a06af930c432 RED +PhenotypeDecoder.java 042d35c9bcba9a2cddc5e82ca5abe6f52438d1c3 RED +ThreadScope.java f3a2b90fdbf0b2aabde4112c94623da5c262952b RED +ThreadScoped.java a8335b0831586ea6ced17a5e7adf2952b72957d9 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/Genotyped.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/Genotyped.java new file mode 100644 index 00000000..c74c870c --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/Genotyped.java @@ -0,0 +1,43 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import org.opt4j.core.Genotype; +import org.opt4j.core.genotype.CompositeGenotype; + +import com.google.inject.BindingAnnotation; + +/** + * Marker for {@link Genotype}s that are retrieved in decoders. It is intended to be used by + * decoders that require an encoding from a previous iteration, not another decoder. Here, the + * encoding is provided from the {@link CompositeGenotype}. + * + * @author diewald + */ +@BindingAnnotation +@Target({FIELD, PARAMETER, METHOD}) +@Retention(RUNTIME) +public @interface Genotyped { + // Java annotation --> Empty. +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java index e118048a..ed4e3e79 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java @@ -15,27 +15,29 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode; -import static org.fortiss.af3.exploration.alg.service.ExplorationServiceManager.getService; +import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; +import java.util.Collection; import java.util.Set; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.Opt4JDseTaskProvider; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch.SafetyFunctionArchEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.exception.DecodingRuntimeException; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.GenotypeFinder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.module.CreatorModule; import org.fortiss.af3.exploration.alg.dse.module.DecoderModule; -import org.fortiss.af3.exploration.alg.service.IExplorationModuleService; import org.opt4j.core.Genotype; import org.opt4j.core.genotype.CompositeGenotype; import org.opt4j.core.problem.Decoder; import org.opt4j.core.start.Opt4JTask; -import com.google.common.collect.Sets; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provides; +import com.google.inject.name.Named; /** * {@link Decoder} that handles dependencies between {@link Decoder}s, {@link Genotype}s, and @@ -50,7 +52,10 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph /** Defines the desired exploration result type. */ // TODO: Remove this hard coded line and get the desired result from the backend interface. - protected Class<? extends Phenotype> resultType; + protected Set<Class<? extends Phenotype>> resultTypes; + + /** Set of {@link CreatorModule}s provided by the enabled exploration features. */ + private Collection<DecoderModule<?>> enabledDecoders; /** {@link Opt4JTask} provider used to obtain the opt4j injector. */ @Inject @@ -65,8 +70,10 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph new ThreadLocal<>(); /** Constructor. Remembers the demanded {@link Phenotype}ss to be produced. */ - public GuiceDecoder(Class<? extends Phenotype> resultType) { - this.resultType = resultType; + public GuiceDecoder(Set<Class<? extends Phenotype>> resultTypes, + Collection<DecoderModule<?>> enabledDecoders) { + this.resultTypes = resultTypes; + this.enabledDecoders = enabledDecoders; } // To be used later: Constructor injection is favorable. @@ -91,9 +98,8 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph // TODO(AD): See configure(): We need a service machenism and user configuration to select // the desired set of activated decoders. decodingInjector = opt4JProvider.get().get().createChildInjector(this); - GenotypeFinder genotypeFinder = new GenotypeFinder(); - @SuppressWarnings("unused") Set<Class<? extends Genotype>> reqGenotypes = - genotypeFinder.getGenotypesFor(Sets.newHashSet(resultType), decodingInjector); + // FIXME: Hack to get the correct instance: Is multiprovisioning supported by Guice? + Class<? extends Phenotype> resultType = getFirst(resultTypes).get(); decodingInjector.getInstance(resultType); return composedPhenotype; } @@ -116,7 +122,7 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph protected void configure() { // bindScope(ThreadScoped.class, new ThreadScope()); - for(DecoderModule<?> module : getService(IExplorationModuleService.class).getDecoders()) { + for(DecoderModule<?> module : enabledDecoders) { install(module); } } @@ -137,13 +143,24 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph return getGenotype(SafetyFunctionArchEncoding.class); } - // @Provides - // public SafetyFunctionArchEncoding getSFAEnc() { - // return getGenotype(SafetyFunctionArchEncoding.class); - // } - // - // @Provides - // public SafetyFunctionArchEncoding getSFAEnc() { - // return getGenotype(SafetyFunctionArchEncoding.class); - // } + /** + * Returns the {@link AbstractTaskMappingEncoding} sub-{@link Genotype} passed to this decoder. + * (Testing!!!) + */ + @Provides + @Named("Genotyped") + public AbstractTaskMappingEncoding getATMEnc() { + return getGenotype(AbstractTaskMappingEncoding.class); + } + + /** + * Returns the {@link FailSilentTaskMappingEncoding} sub-{@link Genotype} passed to this + * decoder. (Testing!!!) + */ + /** */ + @Provides + @Named("Genotyped") + public FailSilentTaskMappingEncoding getITMEnc() { + return getGenotype(FailSilentTaskMappingEncoding.class); + } } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/.ratings index 3c95bb39..564d087f 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/.ratings @@ -1,4 +1,5 @@ -DecoderDependencyGraph.java c2d1a8d6c86002c4faea11b6ab822b0d1bef408b RED -DecoderEdge.java b72d75a14a0cf4b7fd7c632951b6d88474a1ba56 RED -GenotypeFinder.java 675edad7a91117ef3df77cde2b48f769c02f707f YELLOW -TransitiveDependencyVisitor.java ecb9b5c57877654e45e0392d6532e8d7a0a8b6e6 YELLOW +BindingWalker.java 77b92051f6a3351cc88a36de9890111ce4df8170 YELLOW +DecoderDependencyGraph.java c2d1a8d6c86002c4faea11b6ab822b0d1bef408b RED +DecoderEdge.java b72d75a14a0cf4b7fd7c632951b6d88474a1ba56 RED +GenotypeFinder.java bc9b7ac2e403a3645bcdd592299438c3c009d027 YELLOW +TypeMemorizingDependencyVisitor.java ed2c9f746e6b4d0079ce3e6c7119117ff68639a9 YELLOW diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/BindingWalker.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/BindingWalker.java new file mode 100644 index 00000000..77b92051 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/BindingWalker.java @@ -0,0 +1,67 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.opt4j.core.Genotype; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.google.inject.Binding; +import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.spi.BindingTargetVisitor; + +/** + * Base class to trigger a walk over the bindings of an {@link Injector} using a specialized + * {@link BindingTargetVisitor} that extracts the relevant information. + * + * @author diewald + */ +public abstract class BindingWalker<T extends BindingTargetVisitor<Object, Collection<Key<?>>>> { + + /** Dependency tree visitor that remembers the visited {@link Genotype} bindings. */ + protected T keyVisitor; + + /** Constructor. */ + public BindingWalker(T keyVisitor) { + this.keyVisitor = keyVisitor; + } + + /** Iterates over the bindings for the root keys and their transitive dependencies. */ + protected void iterateBindings(Injector injector, Set<Key<?>> searchKeys) { + Set<Key<?>> keys = Sets.newHashSet(searchKeys); + Set<Key<?>> visitedKeys = Sets.newHashSet(); + List<Binding<?>> bindings = Lists.newArrayList(); + + while(!keys.isEmpty()) { + Iterator<Key<?>> iterator = keys.iterator(); + Key<?> key = iterator.next(); + iterator.remove(); + + if(!visitedKeys.contains(key)) { + Binding<?> binding = injector.getBinding(key); + bindings.add(binding); + visitedKeys.add(key); + keys.addAll(binding.acceptTargetVisitor(keyVisitor)); + } + } + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/GenotypeFinder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/GenotypeFinder.java index 675edad7..bc9b7ac2 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/GenotypeFinder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/GenotypeFinder.java @@ -15,17 +15,15 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph; +import static com.google.common.collect.Sets.newHashSet; + import java.util.Base64.Decoder; -import java.util.Iterator; -import java.util.List; import java.util.Set; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.opt4j.core.Genotype; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.google.inject.Binding; import com.google.inject.Injector; import com.google.inject.Key; @@ -38,12 +36,13 @@ import com.google.inject.Key; * * @author diewald */ -public class GenotypeFinder { +public class GenotypeFinder extends BindingWalker<TypeMemorizingDependencyVisitor<Genotype>> { - /** Dependency tree visitor that remembers the visited {@link Genotype} bindings. */ + /** Constructor. */ @SuppressWarnings("unchecked") - private TransitiveDependencyVisitor<Genotype> keyVisitor = new TransitiveDependencyVisitor<>( - Sets.newHashSet(Genotype.class)); + public GenotypeFinder() { + super(new TypeMemorizingDependencyVisitor<>(newHashSet(Genotype.class))); + } /** * Collects the set of {@link Genotype}s that is required to construct the set of given @@ -62,24 +61,4 @@ public class GenotypeFinder { iterateBindings(injector, phenotypeKeys); return keyVisitor.getFoundSubTypes(); } - - /** Iterates over the bindings for the root keys and their transitive dependencies. */ - private void iterateBindings(Injector injector, Set<Key<?>> phenotypeKeys) { - Set<Key<?>> keys = Sets.newHashSet(phenotypeKeys); - Set<Key<?>> visitedKeys = Sets.newHashSet(); - List<Binding<?>> bindings = Lists.newArrayList(); - - while(!keys.isEmpty()) { - Iterator<Key<?>> iterator = keys.iterator(); - Key<?> key = iterator.next(); - iterator.remove(); - - if(!visitedKeys.contains(key)) { - Binding<?> binding = injector.getBinding(key); - bindings.add(binding); - visitedKeys.add(key); - keys.addAll(binding.acceptTargetVisitor(keyVisitor)); - } - } - } } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/TransitiveDependencyVisitor.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/TypeMemorizingDependencyVisitor.java similarity index 97% rename from org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/TransitiveDependencyVisitor.java rename to org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/TypeMemorizingDependencyVisitor.java index ecb9b5c5..ed2c9f74 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/TransitiveDependencyVisitor.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/graph/TypeMemorizingDependencyVisitor.java @@ -47,7 +47,7 @@ import com.google.inject.spi.ProviderKeyBinding; * @author phopkins@gmail.com (Pete Hopkins) * @author diewald@fortiss.org (Alexander Diewald) */ -public class TransitiveDependencyVisitor<G> extends +public class TypeMemorizingDependencyVisitor<G> extends DefaultBindingTargetVisitor<Object, Collection<Key<?>>> { /** @@ -60,7 +60,7 @@ public class TransitiveDependencyVisitor<G> extends private Collection<Class<?>> seekTypes = Sets.newHashSet(); /** Constructor. */ - public TransitiveDependencyVisitor(Collection<Class<?>> seekTypes) { + public TypeMemorizingDependencyVisitor(Collection<Class<?>> seekTypes) { this.seekTypes = seekTypes; } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings index 135c19b0..2219771a 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings @@ -1,7 +1,7 @@ -ArchitectureDecoder.java d067dc995e0895860d98d717647c0f7b061f5908 RED -ArchitectureExplorationProblemModule.java a856314dfb6f0b4e3a0f7af28fcede66563dac74 RED -DseProblemModuleBase.java 0eba41852529e92e7255c7a7d8fce18354facbca RED -EvaluatorWrapper.java 3747e5b78b1dcef8e1595c1ae9354e8ef2738e79 RED -ExplorationGoalPriorityMultiEvaluator.java 1f6d2aa6ece8acdf4f57face0439f3429ab87329 RED -ProblemModuleBase.java 460f7a8a07435eb13634caa9072e425bdf20e399 RED -StrictTTDecoder.java d55ece0076bec24d74fd18dae3e33aaa9d2ac854 RED +ArchitectureDecoder.java d067dc995e0895860d98d717647c0f7b061f5908 RED +DseProblemModuleBase.java bfe6dadc48386308ccbf40dbb0da18f74e43a986 RED +DseProcessProblemModule.java c7f76c9926e6d49c058fe550ac8d0b31bd6b4d30 RED +EvaluatorWrapper.java 3747e5b78b1dcef8e1595c1ae9354e8ef2738e79 RED +ExplorationGoalPriorityMultiEvaluator.java 1f6d2aa6ece8acdf4f57face0439f3429ab87329 RED +ProblemModuleBase.java 460f7a8a07435eb13634caa9072e425bdf20e399 RED +StrictTTDecoder.java d55ece0076bec24d74fd18dae3e33aaa9d2ac854 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProblemModuleBase.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProblemModuleBase.java index 75c5c2a3..bfe6dadc 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProblemModuleBase.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProblemModuleBase.java @@ -1,201 +1,200 @@ -/*-------------------------------------------------------------------------+ -| Copyright 2015 fortiss GmbH | -| | -| Licensed under the Apache License, Version 2.0 (the "License"); | -| you may not use this file except in compliance with the License. | -| You may obtain a copy of the License at | -| | -| http://www.apache.org/licenses/LICENSE-2.0 | -| | -| Unless required by applicable law or agreed to in writing, software | -| distributed under the License is distributed on an "AS IS" BASIS, | -| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | -| See the License for the specific language governing permissions and | -| limitations under the License. | -+--------------------------------------------------------------------------*/ -package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.fortiss.af3.exploration.alg.dse.TaskMappingFactory; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.CompositeDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.evaluate.ComposableEvaluator; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.evaluate.CompositeEvaluator; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.ComposableGenotype; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.problem.CompositeProblemModuleBase; -import org.fortiss.af3.exploration.alg.dse.evaluator.ArchitectureEvaluator; -import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; -import org.fortiss.af3.exploration.model.ExplorationConstraint; -import org.fortiss.af3.exploration.model.ExplorationObjective; -import org.fortiss.af3.exploration.model.ExplorationTarget; -import org.fortiss.af3.exploration.model.MOExplorationObjective; -import org.fortiss.af3.exploration.moea.model.DseSpecification; -import org.fortiss.af3.exploration.smt.model.SMTObjective; -import org.opt4j.core.Objective; -import org.opt4j.core.genotype.CompositeGenotype; -import org.opt4j.core.problem.Evaluator; - -/** - * Base class for problems that are solved within this DSE. It allows to create - * {@link EvaluatorWrapper}s which associate {@link ExplorationTarget}s with {@link Evaluator}s of - * possible solutions to the problem that shall be solved by the DSE. - * - * @author diewald - */ -public abstract class DseProblemModuleBase<C extends CompositeGenotype<Class<? extends ComposableGenotype>, ComposableGenotype>, P extends Phenotype, CD extends CompositeDecoder<C, P>> - extends CompositeProblemModuleBase<C, P, CD> { - - /** DSE configuration */ - protected DseSpecification dse; - - /** Representation of input system */ - // TODO(#3270) - protected SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter; - - /** Set of requested {@link Phenotype}s that form the solution set. */ - Set<Class<? extends IExplorationEncoding>> requestedSolutions; - - /** - * Constructor the DSE specification and an adapter to the input system model has to be - * specified. - */ - public DseProblemModuleBase(DseSpecification dse, - SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, - Set<Class<? extends IExplorationEncoding>> requestedSolutions) { - this.dse = dse; - this.systemModelAdapter = systemModelAdapter; - this.requestedSolutions = requestedSolutions; - } - - /** - * Adds the evaluators of the sub problems of the architectural exploration. - * - * @throws Exception - */ - protected <RT, T extends ExplorationTarget<RT>, S extends Phenotype, E extends Evaluator<?>> - void addGoalEvaluators(CompositeEvaluator<P> dseEvaluator) throws Exception { - Collection<ExplorationTarget<?>> targets = dse.getTargetSpecification().getTargets(); - Collection<ExplorationConstraint<?>> constraints = - targets.stream().filter(t -> t instanceof ExplorationConstraint<?>) - .map(ExplorationConstraint.class::cast).collect(Collectors.toList()); - - int currentConstrPrio = 0; - Map<Class<? extends ExplorationTarget<?>>, Integer> priorityMap = new LinkedHashMap<>(); - for(ExplorationConstraint<?> currConstraint : constraints) { - if(!priorityMap.containsKey(currConstraint.getClass())) { - @SuppressWarnings("unchecked") Class<? extends ExplorationTarget<?>> contraintType = - (Class<? extends ExplorationTarget<?>>)currConstraint.getClass(); - priorityMap.put(contraintType, currentConstrPrio); - currentConstrPrio++; - } - } - - Collection<ExplorationObjective<?>> smtObjectives = - targets.stream().filter(t -> t instanceof SMTObjective) - .map(ExplorationObjective.class::cast).collect(Collectors.toList()); - for(ExplorationObjective<?> currObjective : smtObjectives) { - if(!priorityMap.containsKey(currObjective.getClass())) { - @SuppressWarnings("unchecked") Class<? extends ExplorationTarget<?>> objectiveType = - (Class<? extends ExplorationTarget<?>>)currObjective.getClass(); - priorityMap.put(objectiveType, currentConstrPrio); - currentConstrPrio++; - } - } - - int objectivePrioOffset = currentConstrPrio; - Collection<ExplorationObjective<?>> objectives = - targets.stream().filter(t -> t instanceof ExplorationObjective<?>) - .map(ExplorationObjective.class::cast).collect(Collectors.toList()); - for(ExplorationObjective<?> currObjective : objectives) { - if(MOExplorationObjective.class.isAssignableFrom(currObjective.getClass())) { - if(!priorityMap.containsKey(currObjective.getClass())) { - int objPrio = ((MOExplorationObjective<?>)currObjective).getPriority(); - @SuppressWarnings("unchecked") Class<? extends ExplorationTarget<?>> objectiveType = - (Class<? extends ExplorationTarget<?>>)currObjective.getClass(); - priorityMap.put(objectiveType, objectivePrioOffset + objPrio); - } - } /* - * else { - * throw new IllegalClassException( - * "Objectives that are not MOExplorationObjectives are currently not supported by this backend." - * ); - * } - */ - } - - for(ExplorationTarget<?> target : targets) { - @SuppressWarnings({"cast", "unchecked"}) EvaluatorWrapper<?, RT, T> evalWrapper = - (EvaluatorWrapper<?, RT, T>)addGoalEvaluator(dseEvaluator, (T)target, - priorityMap.get(target.getClass())); - Objective evalObjective = evalWrapper.getObjective(); - targetObjectiveAssoc.put(target, evalObjective); - } - } - - /** - * Adds an goal-specific {@link EvaluatorWrapper} to the {@link ArchitectureEvaluator}. - * - * @throws Exception - */ - protected - <RT, T extends ExplorationTarget<RT>, S extends Phenotype, E extends ComposableEvaluator<S>> - EvaluatorWrapper<?, RT, T> addGoalEvaluator(CompositeEvaluator<P> dseEvaluator, T goal, - int priority) throws Exception { - @SuppressWarnings("unchecked") EvaluatorWrapper<?, RT, T> wrappedEvaluator = - (EvaluatorWrapper<?, RT, T>)TaskMappingFactory.getInstance() - .createEvaluatorWrapper(goal, priority); - if(wrappedEvaluator != null) { - // Here, we check whether the goal evaluator is defined for composable phenotypes (only - // composable evaluators are allowed then). - if(Phenotype.class.isAssignableFrom(wrappedEvaluator.getTargetPhenotypeType())) { - - Class<?> phenotypeClass = wrappedEvaluator.getTargetPhenotypeType(); - - if(Phenotype.class.isAssignableFrom(phenotypeClass)) { - // if(phenoClass.isAssignableFrom(phenotypeClass) && - // evalClass.isAssignableFrom(wrappedEvaluator.getClass())) { - @SuppressWarnings("unchecked") Class<S> subPhenotypeClass = - (Class<S>)phenotypeClass; - @SuppressWarnings("unchecked") E wrappedSubEvaluator = (E)wrappedEvaluator; - - try { - dseEvaluator.registerSubEvaluator(subPhenotypeClass, wrappedSubEvaluator); - } catch(Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - // Register the wrapped Evaluator, - registerEvaluator(wrappedEvaluator); - // } - // else { - // throw new IllegalArgumentException("The sub-phenotye class " + - // phenotypeClass + " and the evaluator class " + - // wrappedEvaluator.getClass() + " does not match the classes " + - // phenoClass + " and " + evalClass + " used to describe the problem."); - // } - } else { - throw new Exception(); - } - } else if(!(Phenotype.class.isAssignableFrom(wrappedEvaluator.getTargetPhenotypeType()))) { - // Otherwise, a "simple" goal evaluator is created - addEvaluator(wrappedEvaluator); - } else { - throw new Exception(); - } - } else { - // TODO: Evaluate, if the optimization should stop here, i.e. throw an exception or - // similar (if possible). - System.out.println("Could not instantiate an evaluator for goal of dimension \"" + - goal.getName() + "\". Skipping."); - return null; - } - - return wrappedEvaluator; - } -} +/*-------------------------------------------------------------------------+ +| Copyright 2015 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.fortiss.af3.exploration.alg.dse.TaskMappingFactory; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.CompositeDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.evaluate.ComposableEvaluator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.evaluate.CompositeEvaluator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.ComposableGenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.problem.CompositeProblemModuleBase; +import org.fortiss.af3.exploration.alg.dse.evaluator.ArchitectureEvaluator; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; +import org.fortiss.af3.exploration.model.ExplorationConstraint; +import org.fortiss.af3.exploration.model.ExplorationObjective; +import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.fortiss.af3.exploration.model.MOExplorationObjective; +import org.fortiss.af3.exploration.moea.model.DseSpecification; +import org.fortiss.af3.exploration.smt.model.SMTObjective; +import org.opt4j.core.Objective; +import org.opt4j.core.genotype.CompositeGenotype; +import org.opt4j.core.problem.Evaluator; + +/** + * Base class for problems that are solved within this DSE. It allows to create + * {@link EvaluatorWrapper}s which associate {@link ExplorationTarget}s with {@link Evaluator}s of + * possible solutions to the problem that shall be solved by the DSE. + * + * @author diewald + */ +public abstract class DseProblemModuleBase<C extends CompositeGenotype<Class<? extends ComposableGenotype>, ComposableGenotype>, P extends Phenotype, CD extends CompositeDecoder<C, P>> + extends CompositeProblemModuleBase<C, P, CD> { + + /** DSE configuration */ + protected DseSpecification dse; + + /** Representation of input system */ + // TODO(#3270) + protected SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter; + + /** Set of requested {@link Phenotype}s that form the solution set. */ + protected Set<Class<? extends Phenotype>> requestedSolutions; + + /** + * Constructor the DSE specification and an adapter to the input system model has to be + * specified. + */ + public DseProblemModuleBase(DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, + Set<Class<? extends Phenotype>> requestedSolutions) { + this.dse = dse; + this.systemModelAdapter = systemModelAdapter; + this.requestedSolutions = requestedSolutions; + } + + /** + * Adds the evaluators of the sub problems of the architectural exploration. + * + * @throws Exception + */ + protected <RT, T extends ExplorationTarget<RT>, S extends Phenotype, E extends Evaluator<?>> + void addGoalEvaluators(CompositeEvaluator<P> dseEvaluator) throws Exception { + Collection<ExplorationTarget<?>> targets = dse.getTargetSpecification().getTargets(); + Collection<ExplorationConstraint<?>> constraints = + targets.stream().filter(t -> t instanceof ExplorationConstraint<?>) + .map(ExplorationConstraint.class::cast).collect(Collectors.toList()); + + int currentConstrPrio = 0; + Map<Class<? extends ExplorationTarget<?>>, Integer> priorityMap = new LinkedHashMap<>(); + for(ExplorationConstraint<?> currConstraint : constraints) { + if(!priorityMap.containsKey(currConstraint.getClass())) { + @SuppressWarnings("unchecked") Class<? extends ExplorationTarget<?>> contraintType = + (Class<? extends ExplorationTarget<?>>)currConstraint.getClass(); + priorityMap.put(contraintType, currentConstrPrio); + currentConstrPrio++; + } + } + + Collection<ExplorationObjective<?>> smtObjectives = + targets.stream().filter(t -> t instanceof SMTObjective) + .map(ExplorationObjective.class::cast).collect(Collectors.toList()); + for(ExplorationObjective<?> currObjective : smtObjectives) { + if(!priorityMap.containsKey(currObjective.getClass())) { + @SuppressWarnings("unchecked") Class<? extends ExplorationTarget<?>> objectiveType = + (Class<? extends ExplorationTarget<?>>)currObjective.getClass(); + priorityMap.put(objectiveType, currentConstrPrio); + currentConstrPrio++; + } + } + + int objectivePrioOffset = currentConstrPrio; + Collection<ExplorationObjective<?>> objectives = + targets.stream().filter(t -> t instanceof ExplorationObjective<?>) + .map(ExplorationObjective.class::cast).collect(Collectors.toList()); + for(ExplorationObjective<?> currObjective : objectives) { + if(MOExplorationObjective.class.isAssignableFrom(currObjective.getClass())) { + if(!priorityMap.containsKey(currObjective.getClass())) { + int objPrio = ((MOExplorationObjective<?>)currObjective).getPriority(); + @SuppressWarnings("unchecked") Class<? extends ExplorationTarget<?>> objectiveType = + (Class<? extends ExplorationTarget<?>>)currObjective.getClass(); + priorityMap.put(objectiveType, objectivePrioOffset + objPrio); + } + } /* + * else { + * throw new IllegalClassException( + * "Objectives that are not MOExplorationObjectives are currently not supported by this backend." + * ); + * } + */ + } + + for(ExplorationTarget<?> target : targets) { + @SuppressWarnings({"cast", "unchecked"}) EvaluatorWrapper<?, RT, T> evalWrapper = + (EvaluatorWrapper<?, RT, T>)addGoalEvaluator(dseEvaluator, (T)target, + priorityMap.get(target.getClass())); + Objective evalObjective = evalWrapper.getObjective(); + targetObjectiveAssoc.put(target, evalObjective); + } + } + + /** + * Adds an goal-specific {@link EvaluatorWrapper} to the {@link ArchitectureEvaluator}. + * + * @throws Exception + */ + protected + <RT, T extends ExplorationTarget<RT>, S extends Phenotype, E extends ComposableEvaluator<S>> + EvaluatorWrapper<?, RT, T> addGoalEvaluator(CompositeEvaluator<P> dseEvaluator, T goal, + int priority) throws Exception { + @SuppressWarnings("unchecked") EvaluatorWrapper<?, RT, T> wrappedEvaluator = + (EvaluatorWrapper<?, RT, T>)TaskMappingFactory.getInstance() + .createEvaluatorWrapper(goal, priority); + if(wrappedEvaluator != null) { + // Here, we check whether the goal evaluator is defined for composable phenotypes (only + // composable evaluators are allowed then). + if(Phenotype.class.isAssignableFrom(wrappedEvaluator.getTargetPhenotypeType())) { + + Class<?> phenotypeClass = wrappedEvaluator.getTargetPhenotypeType(); + + if(Phenotype.class.isAssignableFrom(phenotypeClass)) { + // if(phenoClass.isAssignableFrom(phenotypeClass) && + // evalClass.isAssignableFrom(wrappedEvaluator.getClass())) { + @SuppressWarnings("unchecked") Class<S> subPhenotypeClass = + (Class<S>)phenotypeClass; + @SuppressWarnings("unchecked") E wrappedSubEvaluator = (E)wrappedEvaluator; + + try { + dseEvaluator.registerSubEvaluator(subPhenotypeClass, wrappedSubEvaluator); + } catch(Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // Register the wrapped Evaluator, + registerEvaluator(wrappedEvaluator); + // } + // else { + // throw new IllegalArgumentException("The sub-phenotye class " + + // phenotypeClass + " and the evaluator class " + + // wrappedEvaluator.getClass() + " does not match the classes " + + // phenoClass + " and " + evalClass + " used to describe the problem."); + // } + } else { + throw new Exception(); + } + } else if(!(Phenotype.class.isAssignableFrom(wrappedEvaluator.getTargetPhenotypeType()))) { + // Otherwise, a "simple" goal evaluator is created + addEvaluator(wrappedEvaluator); + } else { + throw new Exception(); + } + } else { + // TODO: Evaluate, if the optimization should stop here, i.e. throw an exception or + // similar (if possible). + System.out.println("Could not instantiate an evaluator for goal of dimension \"" + + goal.getName() + "\". Skipping."); + return null; + } + + return wrappedEvaluator; + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ArchitectureExplorationProblemModule.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProcessProblemModule.java similarity index 65% rename from org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ArchitectureExplorationProblemModule.java rename to org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProcessProblemModule.java index a856314d..c7f76c99 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ArchitectureExplorationProblemModule.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProcessProblemModule.java @@ -16,6 +16,7 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem; import static com.google.common.collect.Sets.newHashSet; +import static org.fortiss.af3.exploration.alg.service.ExplorationServiceManager.getService; import static org.fortiss.af3.exploration.alg.util.ExplorationAlgUtils.rethrow; import java.util.Collection; @@ -23,45 +24,53 @@ import java.util.Set; import org.fortiss.af3.exploration.alg.dse.DSEFactory; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.ArchitectureExplorationEncoding; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create.GuiceCreator; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.GuiceDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.GenotypeFinder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.ArchitectureSolution; import org.fortiss.af3.exploration.alg.dse.evaluator.ArchitectureEvaluator; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.dse.module.CreatorModule; +import org.fortiss.af3.exploration.alg.dse.module.DecoderModule; +import org.fortiss.af3.exploration.alg.feature.IExplorationFeature; +import org.fortiss.af3.exploration.alg.service.IExplorationFeatureService; import org.fortiss.af3.exploration.moea.model.DseSpecification; import org.opt4j.core.Genotype; +import org.opt4j.core.problem.Creator; +import org.opt4j.core.problem.Decoder; +import org.opt4j.core.problem.Evaluator; import com.google.inject.Injector; /** - * Problem module for fail-silent execution model, that encapsulates a creator, a decoder and - * the set of goal-specific evaluators. + * Problem module that setups the main control entities constituting the DSE process exploration. It + * defines the top-most {@link Creator}s, {@link Decoder}s, and {@link Evaluator}s, which consists + * of sub-modules. Moreover, this class calculates the set of required decoders to be launched on + * the basis of the activated {@link IExplorationFeature}s and the demanded solutions. * - * @author huang + * @author diewald */ -public class ArchitectureExplorationProblemModule +public class DseProcessProblemModule extends DseProblemModuleBase<ArchitectureExplorationEncoding, ArchitectureSolution, ArchitectureDecoder> { /** To be removed. */ - DSEFactory dseFactory = DSEFactory.getInstance(); + private DSEFactory dseFactory = DSEFactory.getInstance(); /** Reference to the DSE-wide {@link Injector} to allow access to the system model parameters. */ private Injector dseInjector; /** Constructor. */ - public ArchitectureExplorationProblemModule(DseSpecification dse, Injector dseInjector, - Set<Class<? extends IExplorationEncoding>> requestedSolutions) { + public DseProcessProblemModule(DseSpecification dse, Injector dseInjector, + Set<Class<? extends Phenotype>> requestedSolutions) { super(dse, null, requestedSolutions); this.dseInjector = dseInjector; dseFactory.init(null); } /** - * Configure genotype creator (execution model dependent), problem decoder and goal evaluators. + * Configure {@link Genotype} creator (execution model dependent), problem decoder and goal + * evaluators. */ @Override protected void config() { @@ -74,16 +83,23 @@ public class ArchitectureExplorationProblemModule ArchitectureEvaluator archEvaluator = dseFactory.createArchitectureEvaluator(); + Collection<IExplorationFeature> enabledFeatures = + getService(IExplorationFeatureService.class).getExplorationFeatures( + dse.getFeatures()); + Collection<CreatorModule<?>> enabledCreators = newHashSet(); + enabledFeatures.forEach(f -> enabledCreators.addAll(f.getCreators())); + Collection<DecoderModule<?>> enabledDecoders = newHashSet(); + enabledFeatures.forEach(f -> enabledDecoders.addAll(f.getDecoders())); + // TODO: construct the execution dependency graph elsewhere? // bindProblem(dseFactory.createArchitectureExplorationCreator(), // dseFactory.createArchitectureDecoder(execDepGraph), archEvaluator); - Class<? extends Phenotype> resultType = FailSilentTaskMappingEncoding.class; - GuiceDecoder guiceDecoder = new GuiceDecoder(resultType); - Collection<Class<? extends Genotype>> requiredGenotypes = - findRequiredGenotypes(resultType, guiceDecoder); - bindProblem(new GuiceCreator(requiredGenotypes), new GuiceDecoder(resultType), - archEvaluator); + GuiceDecoder guiceDecoder = new GuiceDecoder(requestedSolutions, enabledDecoders); + + Set<Class<? extends Genotype>> requiredGenotypes = findRequiredGenotypes(guiceDecoder); + bindProblem(new GuiceCreator(requiredGenotypes, enabledCreators), new GuiceDecoder( + requestedSolutions, enabledDecoders), archEvaluator); // Create/Bind the subproblems of the architectural exploration problem. try { @@ -106,11 +122,9 @@ public class ArchitectureExplorationProblemModule * Returns the collection of {@link Genotype}s that are required as inputs to decoders to obtain * the requested {@link Phenotype}. */ - @SuppressWarnings("unchecked") - private Collection<Class<? extends Genotype>> findRequiredGenotypes( - Class<? extends Phenotype> resultType, GuiceDecoder guiceDecoder) { + private Set<Class<? extends Genotype>> findRequiredGenotypes(GuiceDecoder guiceDecoder) { Injector decodingInjector = dseInjector.createChildInjector(guiceDecoder); GenotypeFinder genotypeFinder = new GenotypeFinder(); - return genotypeFinder.getGenotypesFor(newHashSet(resultType), decodingInjector); + return genotypeFinder.getGenotypesFor(requestedSolutions, decodingInjector); } } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings index 9d13ec3c..8ad342ed 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings @@ -1,3 +1,3 @@ SFGraphDecoder.java 0b42b83465213eb13ae59765f6bf53c1c8bd3b66 RED SFMappingConstraintDecoder.java 01e8f450a78ffff9572a7f203b3699cff507e99f RED -SFMappingDecoder.java 8d890da23b7dab19ff11163a79f9ba6a2c0a9a3c RED +SFMappingDecoder.java 689365b0718847258decd9f20f3cca5b0ff3c6e3 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java index 8d890da2..689365b0 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java @@ -38,6 +38,7 @@ import org.fortiss.af3.exploration.alg.exception.ExplorationException; import org.opt4j.core.Genotype; import com.google.inject.Provides; +import com.google.inject.name.Named; /** * Decodes a {@link SafetyFunctionArchEncoding} into an {@link AbstractTaskMappingEncoding}. @@ -47,15 +48,36 @@ import com.google.inject.Provides; public class SFMappingDecoder<C> extends DecoderModule<AbstractTaskMappingEncoding> implements ConstraintGenerationDecoder { + /** {@inheritDoc} */ + @Override + protected void configure() { + // TODO: Check whether overriding is a reasonable approach to interchange decoders. + // Modules.override(AbstractTaskMappingIdentityDecoder()). + } + /** {@inheritDoc} */ @Override public AbstractTaskMappingEncoding decode(Genotype genotype) { return null; } + /** + * Decodes a {@link SafetyFunctionArchEncoding} into an {@link AbstractTaskMappingEncoding} + * where allocations are added or removed such that all Tasks of the (replicated) safety + * channels and their voters are mapped to the target platform. To calculate these updates, the + * {@link AbstractTaskMappingEncoding} from a previous iteration is required. + * + * @param sfaEnc + * Encoding of the architectures of safety functions present in the system. + * @param atmEnc + * Mapping of tasks to the target execution platform. + * @return Updated / Aligned task mapping. + * @throws DecodingException + * if the creation of some mapping entry fails. + */ @Provides public AbstractTaskMappingEncoding decode(SafetyFunctionArchEncoding sfaEnc, - AbstractTaskMappingEncoding atmEnc) throws DecodingException { + @Named("Genotyped") AbstractTaskMappingEncoding atmEnc) throws DecodingException { // TODO: replace with a dynamic mechanism for the retrieval of deployable components. for(SafetyFunctionArchEntry sFAEntry : sfaEnc.getAllEntries()) { diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings index b31ab899..8ba618a6 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings @@ -1,2 +1,2 @@ -AbstractTaskMappingIdentityDecoder.java 78febd451216d4635c565b352c4c9e895334ff2f RED +AbstractTaskMappingIdentityDecoder.java 88806dc773c1f8c5fdc899b119bd99d06087e835 RED TaskMappingDecoderBase.java 38993e58fbb58bb577827079cacf04d487670713 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java index 78febd45..88806dc7 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java @@ -22,6 +22,8 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.opt4j.core.Genotype; +import com.google.inject.Provides; + /** * Provides a {@link AbstractTaskMappingEncoding} to the set of {@link Phenotype} types. * This {@link ComposableDecoder} is an identity operation. @@ -35,6 +37,7 @@ public class AbstractTaskMappingIdentityDecoder extends TaskMappingDecoderBase<AbstractTaskMappingEntry, AbstractTaskMappingEncoding> { // FIXME: Update the mapping. --> Provides + @Provides public AbstractTaskMappingEncoding decode(AbstractTaskMappingEncoding atmEnc, PartitionMappingEncoding partEnc) { return alignWithResourceModifications(atmEnc, partEnc); diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings index 04941aa3..68dd117f 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings @@ -1,3 +1,3 @@ -FailSilentAbstractTaskMappingDecoder.java 40acf470cbc4f47ca0593e75a2aa060d67b04db4 RED +FailSilentAbstractTaskMappingDecoder.java 4ef8ebd557e31ad61fa0e90df06434c98e121452 RED FaultDetectionVotingAbstractTaskMappingDecoder.java fe6777288a89b1ca3e5eaf842653fbc768016a08 RED TaskInstanceResourceAlignmentDecoder.java 8567290ebc74927263f5265f44d7acdcbf99797f RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java index 40acf470..4ef8ebd5 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java @@ -29,6 +29,7 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; import org.opt4j.core.Genotype; import com.google.inject.Provides; +import com.google.inject.name.Named; /** * Decoder for instantiating an {@link AbstractTaskMappingEncoding} to a @@ -42,9 +43,20 @@ public class FailSilentAbstractTaskMappingDecoder extends // TODO: Abstract to the AbstractTaskMappingDecoder. // FIXME: Handle the case where no previous FailSilentTaskMappingEncoding exists. + /** + * Decodes an {@link AbstractTaskMappingEncoding} into a {@link FailSilentTaskMappingEncoding} + * by instantiating abstract tasks. If a {@link FailSilentTaskMappingEncoding} exists from a + * previous iteration, this encoding is updated. + * + * @param atmEnc + * task mapping that contains potentially abstract tasks (no implementation). + * @param fstmEnc + * task mapping that shall contain only tasks backed by an implementation. + * @return task mapping that contains only tasks backed by an implementation. + */ @Provides public FailSilentTaskMappingEncoding decode(AbstractTaskMappingEncoding atmEnc, - FailSilentTaskMappingEncoding fstmEnc) { + @Named("Genotyped") FailSilentTaskMappingEncoding fstmEnc) { fstmEnc.replaceConstraints(atmEnc.getConstraints()); for(ITaskAdapter<?> comp : atmEnc.getRequesters()) { diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings new file mode 100644 index 00000000..a32aa1c1 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings @@ -0,0 +1,7 @@ +DesignDiversityExploration.java 7769f449def9cc3cb147da5e1991074bc2669c8a RED +ExplorationFeature.java 9e077fed7f0485f1ccaa2b5b4d0407161ec787ca YELLOW +IExplorationFeature.java f0057888990fb5c35e7e97c5d74b7f22d09eabe9 YELLOW +PartitionArchitectureExploration.java 61ea586e3acade91d3c9cc0d37a349e0bb26b3af YELLOW +SafetyArchitectureExploration.java 89a5c8c5e42c8c55857699ba7d2503e6342cd401 RED +TTScheduleExploration.java 9d7e6b4eea4030881006fa85f0be4cb584383b09 RED +TaskMappingExploration.java a548b4757ad6560c3ae640f956910f83fd77b1e1 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/DesignDiversityExploration.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/DesignDiversityExploration.java new file mode 100644 index 00000000..7769f449 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/DesignDiversityExploration.java @@ -0,0 +1,37 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.feature; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedAcyclicTaskGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedTaskGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic; + +/** + * + * @author diewald + */ +public class DesignDiversityExploration extends ExplorationFeature { + + /** Constructor. */ + public DesignDiversityExploration() { + super("Exploration of diversely designed tasks"); + + addProblem(InstantiatedTaskGraphEncoding.class, new InstantiatedTaskMappingDecoder()); + addProblem(InstantiatedAcyclicTaskGraphEncoding.class, + new InstantiatedTaskMappingDecoderAcyclic()); + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationModuleService.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/ExplorationFeature.java similarity index 53% rename from org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationModuleService.java rename to org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/ExplorationFeature.java index c3ae40f2..9e077fed 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationModuleService.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/ExplorationFeature.java @@ -13,9 +13,8 @@ | See the License for the specific language governing permissions and | | limitations under the License. | +--------------------------------------------------------------------------*/ -package org.fortiss.af3.exploration.alg.service.internal; +package org.fortiss.af3.exploration.alg.feature; -import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -24,11 +23,9 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.module.CreatorModule; import org.fortiss.af3.exploration.alg.dse.module.DecoderModule; import org.fortiss.af3.exploration.alg.dse.module.EvaluatorModule; -import org.fortiss.af3.exploration.alg.exception.ExplorationServiceRuntimeException; -import org.fortiss.af3.exploration.alg.service.IExplorationModuleService; -import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem; -import org.fortiss.tooling.kernel.introspection.IIntrospectionItem; +import org.fortiss.af3.exploration.alg.service.IExplorationFeatureService; import org.opt4j.core.Genotype; +import org.opt4j.core.problem.Creator; import org.opt4j.core.problem.Decoder; import org.opt4j.operators.OperatorModule; @@ -37,78 +34,68 @@ import com.google.common.collect.MutableClassToInstanceMap; import com.google.inject.AbstractModule; /** - * Implementation of the {@link IExplorationModuleService}. + * Implementation of the {@link IExplorationFeatureService}. * * @author diewald */ -public class ExplorationModuleService implements IExplorationModuleService { +public abstract class ExplorationFeature implements IExplorationFeature { + + /** Name of the {@link IExplorationFeature}. */ + private String name; /** Set referencing all registered optimization variables. */ + // TODO: Do we really need sets here (leftover) or is a single genotype sufficient for + // exploration features. private Set<Class<? extends Genotype>> genotypes = new HashSet<>(); /** Set referencing all register candidate solution types. */ private Set<Class<? extends Phenotype>> phenotypes = new HashSet<>(); /** - * References all registered exploration modules. Differing between {@link Genotype}s, + * References all registered exploration modules. Differing between {@link Creator}s, * {@link Decoder}s etc. is currently not needed. */ private ClassToInstanceMap<AbstractModule> registeredExpModules = MutableClassToInstanceMap .create(); - /** Holds the instance of the evaluation service. */ - private volatile static ExplorationModuleService INSTANCE; - /** Constructor. */ - private ExplorationModuleService() { - // Prevent direct instantiation. - } - - /** The instance (singleton) of the ExplorationTransformationService. */ - public static synchronized ExplorationModuleService getInstance() { - if(INSTANCE == null) { - INSTANCE = new ExplorationModuleService(); - } - return INSTANCE; + public ExplorationFeature(String name) { + this.name = name; } - /** {@inheritDoc} */ - @Override - public void initializeService() { - // Typically used to read extension point configs. Not needed since we won't use eclipse - // extension points in the DSE any more. - } - - /** {@inheritDoc} */ - @Override - public void startService() { - // Not needed. - } - - /** {@inheritDoc} */ - @Override - public <G extends Genotype> void registerVariable(Class<G> genotype, CreatorModule<G> creator, + /** + * Registers an optimization variable ({@code genotype}) with the DSE, along with its + * initializer ({@code creator}) and modificator ({@code operator}). + * + * @param genotype + * optimization variable type. + * @param creator + * initializes the opt. variable. + * @param operator + * modifications applied during the process iterations. + */ + public <G extends Genotype> void addVariable(Class<G> genotype, CreatorModule<G> creator, OperatorModule<?> operator) { // Input check: Allow only fully specified variable registrations. if(genotype == null) { - throw new ExplorationServiceRuntimeException(getClass(), "The passed genotype is null!"); + throw new RuntimeException(getClass() + ": The passed genotype is null!"); } else if(creator == null) { - throw new ExplorationServiceRuntimeException(getClass(), "The passed creator is null!"); + throw new RuntimeException(getClass() + ": The passed creator is null!"); } else if(operator == null) { - throw new ExplorationServiceRuntimeException(getClass(), "The passed operator is null!"); + throw new RuntimeException(getClass() + ": The passed operator is null!"); } // Input check: Register modules only once. @SuppressWarnings("unchecked") Class<CreatorModule<G>> creatorClass = (Class<CreatorModule<G>>)creator.getClass(); if(registeredExpModules.getInstance(creatorClass) != null) { - throw new ExplorationServiceRuntimeException(getClass(), "The module " + - creatorClass.getSimpleName() + " has already been registered!"); + throw new RuntimeException(getClass() + ": The module " + creatorClass.getSimpleName() + + " has already been registered!"); } @SuppressWarnings("unchecked") Class<OperatorModule<?>> operatorClass = (Class<OperatorModule<?>>)operator.getClass(); if(registeredExpModules.getInstance(operatorClass) != null) { - throw new ExplorationServiceRuntimeException(getClass(), "The module " + + throw new RuntimeException(getClass() + ": The module " + operatorClass.getSimpleName() + " has already been registered!"); } @@ -117,43 +104,52 @@ public class ExplorationModuleService implements IExplorationModuleService { registeredExpModules.putInstance(operatorClass, operator); } - /** {@inheritDoc} */ - @Override - public <P extends Phenotype> void registerProblem(Class<P> phenotype, DecoderModule<P> decoder) { + /** + * Registers a problem definition with the DSE process. The {@code phenotype} is equivalent to + * a candidate solution that is produced by the given {@code decoder}. + * + * @param phenotype + * candidate solution type. + * @param decoder + * transforms variables (and/or other inputs) to candidate solutions. + */ + public <P extends Phenotype> void addProblem(Class<P> phenotype, DecoderModule<P> decoder) { // Input check: Allow only fully specified variable registrations. if(phenotype == null) { - throw new ExplorationServiceRuntimeException(getClass(), - "The passed phenotype is null!"); + throw new RuntimeException(getClass() + ": The passed phenotype is null!"); } else if(decoder == null) { - throw new ExplorationServiceRuntimeException(getClass(), "The passed decoder is null!"); + throw new RuntimeException(getClass() + ": The passed decoder is null!"); } // Input check: Register modules only once. @SuppressWarnings("unchecked") Class<DecoderModule<P>> decoderClass = (Class<DecoderModule<P>>)decoder.getClass(); if(registeredExpModules.getInstance(decoderClass) != null) { - throw new ExplorationServiceRuntimeException(getClass(), "The module " + - decoderClass.getSimpleName() + " has already been registered!"); + throw new RuntimeException(getClass() + ": The module " + decoderClass.getSimpleName() + + " has already been registered!"); } phenotypes.add(phenotype); registeredExpModules.putInstance(decoderClass, decoder); } - /** {@inheritDoc} */ - @Override - public void registerEvaluator(EvaluatorModule<Phenotype> evaluator) { + /** + * Registers the given {@code evaluator} to quantifies the quality of a solution by some metric. + * + * @param evaluator + * applies some metric to a candidate solution. + */ + public void addEvaluator(EvaluatorModule<Phenotype> evaluator) { // Input check: Allow only fully specified variable registrations. if(evaluator == null) { - throw new ExplorationServiceRuntimeException(getClass(), - "The passed evaluator is null!"); + throw new RuntimeException(getClass() + ": The passed evaluator is null!"); } // Input check: Register modules only once. @SuppressWarnings("unchecked") Class<EvaluatorModule<Phenotype>> evaluatorClass = (Class<EvaluatorModule<Phenotype>>)evaluator.getClass(); if(registeredExpModules.getInstance(evaluatorClass) != null) { - throw new ExplorationServiceRuntimeException(getClass(), "The module " + + throw new RuntimeException(getClass() + ": The module " + evaluatorClass.getSimpleName() + " has already been registered!"); } @@ -190,45 +186,7 @@ public class ExplorationModuleService implements IExplorationModuleService { /** {@inheritDoc} */ @Override - public String getIntrospectionDescription() { - // KEEP DESCRIPTION IN SYNC WITH THE SERVICE INTERFACE CLASS COMMENT!!!! - return "Service for adding Exploration Modules to the DSE. The define the concrete problems" - + " that shall be solved by the DSE process. Modules registered with this service" - + " are known to the DSE and can be selected by users to define a DSE process.\n" - + "The Modules registered here are not defining a a concrete DSE process, just the" - + " concrete problems. Exploration modules can be categorized into three classes:" - + " Variable definitions, Problem statements and transformations, and Evaluators" - + " (solution metrics). The variable definitions consist of a Genotypes" - + " (variables), Operators (modify variables), and Creators" - + " (variable initialization). Problem statements transform Genotypes into" - + " evaluable solutions implemented by Decoders that produce" - + " Phenotypes. Evaluators rate Phenotypes such that the quality of a solution can" - + " be quantified.\n" - + "The complete DSE process is based on DI: each of the elements composing" - + " exploration modules have to be implemented as Guice AbstractModules."; - } - - /** {@inheritDoc} */ - @Override - public String getIntrospectionLabel() { - return "Exploration Module Service"; - } - - /** {@inheritDoc} */ - @Override - public boolean showInIntrospectionNavigation() { - return true; - } - - /** {@inheritDoc} */ - @Override - public Collection<IIntrospectionItem> getIntrospectionItems() { - return null; - } - - /** {@inheritDoc} */ - @Override - public IIntrospectionDetailsItem getDetailsItem() { - return null; + public String getName() { + return name; } } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/IExplorationModuleService.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/IExplorationFeature.java similarity index 63% rename from org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/IExplorationModuleService.java rename to org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/IExplorationFeature.java index 55f602c4..f0057888 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/IExplorationModuleService.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/IExplorationFeature.java @@ -13,7 +13,7 @@ | See the License for the specific language governing permissions and | | limitations under the License. | +--------------------------------------------------------------------------*/ -package org.fortiss.af3.exploration.alg.service; +package org.fortiss.af3.exploration.alg.feature; import java.util.Set; @@ -31,10 +31,6 @@ import org.opt4j.operators.OperatorModule; import com.google.inject.AbstractModule; /** - * Service for adding Exploration Modules to the DSE. The define the concrete problems that shall - * be solved by the DSE process. Modules registered with this service are known to the DSE and - * can be selected by users to define a DSE process. The Modules registered here are not defining a - * concrete DSE process, just the concrete problems. * * Exploration modules can be categorized into three classes: Variable definitions, Problem * statements and transformations, and Evaluators (solution metrics). The variable definitions @@ -51,40 +47,10 @@ import com.google.inject.AbstractModule; * * @author diewald */ -public interface IExplorationModuleService extends IExplorationService { +public interface IExplorationFeature { - /** - * Registers an optimization variable ({@code genotype}) with the DSE, along with its - * initializer ({@code creator}) and modificator ({@code operator}). - * - * @param genotype - * optimization variable type. - * @param creator - * initializes the opt. variable. - * @param operator - * modifications applied during the process iterations. - */ - <G extends Genotype> void registerVariable(Class<G> genotype, CreatorModule<G> creator, - OperatorModule<?> operator); - - /** - * Registers a problem definition with the DSE process. The {@code phenotype} is equivalent to - * a candidate solution that is produced by the given {@code decoder}. - * - * @param phenotype - * candidate solution type. - * @param decoder - * transforms variables (and/or other inputs) to candidate solutions. - */ - <P extends Phenotype> void registerProblem(Class<P> phenotype, DecoderModule<P> decoder); - - /** - * Registers the given {@code evaluator} to quantifies the quality of a solution by some metric. - * - * @param evaluator - * applies some metric to a candidate solution. - */ - void registerEvaluator(EvaluatorModule<Phenotype> evaluator); + /** Returns the name of the {@link IExplorationFeature}. */ + String getName(); /** Returns the set of registered {@link Creator}s. */ Set<CreatorModule<?>> getCreators(); diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java new file mode 100644 index 00000000..61ea586e --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java @@ -0,0 +1,38 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.feature; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.partitionmapping.PartitionMappingCreator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.partitionmapping.PartitionMappingModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmapping.PartitionMappingDecoderGraph; + +/** + * + * @author diewald + */ +public class PartitionArchitectureExploration extends ExplorationFeature { + + /** Constructor. */ + public PartitionArchitectureExploration() { + super("Partition Architecture Exploration"); + + addVariable(PartitionMappingEncoding.class, new PartitionMappingCreator(), + new PartitionMappingModule()); + addProblem(PlatformCommunicationGraphEncoding.class, new PartitionMappingDecoderGraph()); + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/SafetyArchitectureExploration.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/SafetyArchitectureExploration.java new file mode 100644 index 00000000..89a5c8c5 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/SafetyArchitectureExploration.java @@ -0,0 +1,46 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.feature; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.safetyfunctionarch.SafetyFunctionArchCreator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch.SafetyFunctionArchEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.SafeTaskGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.safetyarch.MutateSafetyFunctionArchitectureModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFGraphDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFMappingDecoder; + +/** + * + * @author diewald + */ +public class SafetyArchitectureExploration extends ExplorationFeature { + + /** Constructor. */ + public SafetyArchitectureExploration() { + super("Safety Architecture Exploration"); + + // Variables + addVariable(SafetyFunctionArchEncoding.class, new SafetyFunctionArchCreator(), + new MutateSafetyFunctionArchitectureModule()); + // Decoding + addProblem(AbstractTaskMappingEncoding.class, new SFMappingDecoder()); + // TODO: ConstraintDecoder + // getService(IExplorationModuleService.class).registerProblem( + // AbstractTaskMappingEncoding.class, new SFMappingConstraintDecoder()); + addProblem(SafeTaskGraphEncoding.class, new SFGraphDecoder()); + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TTScheduleExploration.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TTScheduleExploration.java new file mode 100644 index 00000000..9d7e6b4e --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TTScheduleExploration.java @@ -0,0 +1,33 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.feature; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.StrictTTDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule; + +/** + * + * @author diewald + */ +public class TTScheduleExploration extends ExplorationFeature { + + /** Constructor. */ + public TTScheduleExploration() { + super("Decoding mappings -> schedules"); + + addProblem(StrictTTSchedule.class, new StrictTTDecoder()); + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TaskMappingExploration.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TaskMappingExploration.java new file mode 100644 index 00000000..a548b475 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/TaskMappingExploration.java @@ -0,0 +1,58 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.feature; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.taskmapping.AbstractTaskMappingCreator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.taskmapping.FailSilentTaskMappingCreator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm.MessageEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskinstantiation.MutateTaskInstanceModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmapping.MutateTaskMappingModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.comm.MessageDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.AbstractTaskMappingIdentityDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.FailSilentAbstractTaskMappingDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.TaskInstanceResourceAlignmentDecoder; + +/** + * + * @author diewald + */ +public class TaskMappingExploration extends ExplorationFeature { + + /** Constructor. */ + // FIXME: Split up in std task mapping and the instantiated one (Fail-Silent). + public TaskMappingExploration() { + super("Task Mapping Exploration"); + + // Variables + addVariable(AbstractTaskMappingEncoding.class, new AbstractTaskMappingCreator(), + new MutateTaskMappingModule()); + addVariable(FailSilentTaskMappingEncoding.class, new FailSilentTaskMappingCreator(), + new MutateTaskInstanceModule()); + + // Decoding + addProblem(AbstractTaskMappingEncoding.class, new AbstractTaskMappingIdentityDecoder()); + addProblem(FailSilentTaskMappingEncoding.class, new FailSilentAbstractTaskMappingDecoder()); + // getService(IExplorationModuleService.class).registerProblem( + // FaultDetectionVotingTaskMappingEncoding.class, + // new FaultDetectionVotingAbstractTaskMappingDecoder()); + addProblem(InstantiatedTaskMappingEncoding.class, + new TaskInstanceResourceAlignmentDecoder()); + addProblem(MessageEncoding.class, new MessageDecoder()); + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/.ratings index 4072df2b..efd393a9 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/.ratings @@ -1,14 +1,14 @@ -ExplorationEncodingMap.java aaea06f5731018d159a04266c92f1a701e461323 RED -ExplorationServiceManager.java 6b15f230dd0cac5f3a9b954da805526da7358ad1 RED -ExplorationTransformationInputs.java 3374ce609b50e69c3c29f1eb79bee25cd06b181d RED -IExplorationConstraintTransformationService.java 48b673e1fb69c05e35c4e60ecf73b8f708cfcf0e RED -IExplorationContraintTransformationModule.java 1d3560401275f719e2b9901d1639a6be6bd7c169 RED -IExplorationEncoding.java f58adbcf840af521333c2777f50041a60548bff3 RED -IExplorationEvaluatationService.java c79cd47a3eac58d56071e51bb5465efefa226fc5 RED -IExplorationExtension.java c2a148e18c580d2432357e93da45e7bf7df8eb0c RED -IExplorationModuleService.java 55f602c4ba4cb80de3d249e1722819482828a471 RED -IExplorationRepairService.java 879d73fce129cd3c4c6fd2819a5c4ed0a625c55b RED -IExplorationService.java 5aaf2b75e88e4ee1b1a206c00e77dd173a5cdeb5 RED -IExplorationTargetEvaluator.java 99c27a053a123462b8a4faadc9c3530fe6bc0c67 RED -IExplorationTransformationService.java eed8f4a86eda433c2fc0af00fbef31dbd942c9f0 RED -IRepairModule.java 0cca5fea3835e4fccc151eec42232ad0e6c88e66 RED +ExplorationEncodingMap.java aaea06f5731018d159a04266c92f1a701e461323 RED +ExplorationServiceManager.java 6b15f230dd0cac5f3a9b954da805526da7358ad1 RED +ExplorationTransformationInputs.java 3374ce609b50e69c3c29f1eb79bee25cd06b181d RED +IExplorationConstraintTransformationService.java 48b673e1fb69c05e35c4e60ecf73b8f708cfcf0e RED +IExplorationContraintTransformationModule.java 1d3560401275f719e2b9901d1639a6be6bd7c169 RED +IExplorationEncoding.java f58adbcf840af521333c2777f50041a60548bff3 RED +IExplorationEvaluatationService.java c79cd47a3eac58d56071e51bb5465efefa226fc5 RED +IExplorationExtension.java c2a148e18c580d2432357e93da45e7bf7df8eb0c YELLOW +IExplorationFeatureService.java e97bee18dc6f67689386849ace02ff79c262787e YELLOW +IExplorationRepairService.java 879d73fce129cd3c4c6fd2819a5c4ed0a625c55b RED +IExplorationService.java 5aaf2b75e88e4ee1b1a206c00e77dd173a5cdeb5 RED +IExplorationTargetEvaluator.java 99c27a053a123462b8a4faadc9c3530fe6bc0c67 RED +IExplorationTransformationService.java eed8f4a86eda433c2fc0af00fbef31dbd942c9f0 RED +IRepairModule.java 0cca5fea3835e4fccc151eec42232ad0e6c88e66 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/IExplorationFeatureService.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/IExplorationFeatureService.java new file mode 100644 index 00000000..e97bee18 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/IExplorationFeatureService.java @@ -0,0 +1,54 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.service; + +import java.util.Collection; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.feature.IExplorationFeature; + +/** + * Service for adding {@link IExplorationFeature}s to the DSE. They define the concrete problems + * that shall be solved by the DSE process. {@link IExplorationFeature}s registered with this + * service are known to the DSE and can be selected by users to define a DSE process. + * + * Each feature consists of so-called Exploration Modules that can be Variables, Decodings of these + * Variables (aka. Problem descriptions), or evaluators that rate {@link Phenotype}s to derive + * metrics for the quality of a solution. + * + * @author diewald + */ +public interface IExplorationFeatureService extends IExplorationService { + + /** + * Registers the given {@link IExplorationFeature} with this service to make it selectable by + * users of the DSE. + * + * @param feature + * {@link IExplorationFeature} to register with the DSE. + */ + void registerExplorationFeature(IExplorationFeature feature); + + /** Returns the registered {@link IExplorationFeature}s. */ + Collection<IExplorationFeature> getExplorationFeatures(); + + /** + * Returns the {@link IExplorationFeature}s that have the given types from the set of registered + * {@link IExplorationFeature}s. + */ + Collection<IExplorationFeature> getExplorationFeatures( + Collection<Class<? extends IExplorationFeature>> features); +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/.ratings index 78a31166..5249fc73 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/.ratings @@ -1,5 +1,6 @@ -ExplorationConstraintTransformationService.java 5e7117398827ae129b3c9a8a16457d816ba665a7 RED -ExplorationEvaluationService.java ed22af146e8230a39a47ba60224b824b6d0ac599 RED -ExplorationModuleService.java c3ae40f2c20e38c7aa7a3f24a9ace41b59e421d3 YELLOW -ExplorationRepairService.java 940ceda7c8c48f282132355249af1fe0a005c0f5 RED -ExplorationTransformationService.java 36e2368dd6098e1f3aa210a6defd4f269628e28a RED +ExplorationConstraintTransformationService.java 5e7117398827ae129b3c9a8a16457d816ba665a7 RED +ExplorationEvaluationService.java ed22af146e8230a39a47ba60224b824b6d0ac599 RED +ExplorationFeatureService.java 3521ed653a98e9ad09591faf5fdebb7ca57c45b7 YELLOW +ExplorationModuleService.java c3ae40f2c20e38c7aa7a3f24a9ace41b59e421d3 YELLOW +ExplorationRepairService.java 940ceda7c8c48f282132355249af1fe0a005c0f5 RED +ExplorationTransformationService.java 36e2368dd6098e1f3aa210a6defd4f269628e28a RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationFeatureService.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationFeatureService.java new file mode 100644 index 00000000..3521ed65 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationFeatureService.java @@ -0,0 +1,186 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.service.internal; + +import java.util.Collection; +import java.util.HashSet; + +import org.fortiss.af3.exploration.alg.dse.module.CreatorModule; +import org.fortiss.af3.exploration.alg.dse.module.DecoderModule; +import org.fortiss.af3.exploration.alg.dse.module.EvaluatorModule; +import org.fortiss.af3.exploration.alg.exception.ExplorationServiceRuntimeException; +import org.fortiss.af3.exploration.alg.feature.IExplorationFeature; +import org.fortiss.af3.exploration.alg.service.IExplorationFeatureService; +import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem; +import org.fortiss.tooling.kernel.introspection.IIntrospectionItem; +import org.opt4j.core.problem.Creator; +import org.opt4j.core.problem.Decoder; +import org.opt4j.operators.OperatorModule; + +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.MutableClassToInstanceMap; +import com.google.inject.AbstractModule; + +/** + * Implementation of the {@link IExplorationFeatureService}. + * + * @author diewald + */ +public class ExplorationFeatureService implements IExplorationFeatureService { + + /** Holds the registered {@link IExplorationFeature}s. */ + private ClassToInstanceMap<IExplorationFeature> explorationFeatures = MutableClassToInstanceMap + .create(); + + /** + * References all registered exploration modules of {@link IExplorationFeature}s for consistency + * checks. Differing between {@link Creator}s, {@link Decoder}s etc. is currently not needed. + */ + private ClassToInstanceMap<AbstractModule> registeredExpModules = MutableClassToInstanceMap + .create(); + + /** Holds the instance of the evaluation service. */ + private volatile static ExplorationFeatureService INSTANCE; + + /** Constructor. */ + private ExplorationFeatureService() { + // Prevent direct instantiation. + } + + /** The instance (singleton) of the ExplorationTransformationService. */ + public static synchronized ExplorationFeatureService getInstance() { + if(INSTANCE == null) { + INSTANCE = new ExplorationFeatureService(); + } + return INSTANCE; + } + + /** {@inheritDoc} */ + @Override + public void initializeService() { + // Typically used to read extension point configs. Not needed since we won't use eclipse + // extension points in the DSE any more. + } + + /** {@inheritDoc} */ + @Override + public void startService() { + // Not needed. + } + + /** {@inheritDoc} */ + @Override + public void registerExplorationFeature(IExplorationFeature feature) { + // Consistency checks. + for(CreatorModule<?> creatorModule : feature.getCreators()) { + Class<?> creatorClass = creatorModule.getClass(); + if(registeredExpModules.containsKey(creatorClass)) { + throw new ExplorationServiceRuntimeException(getClass(), "The module " + + creatorClass.getSimpleName() + " has already been registered!"); + } + } + for(DecoderModule<?> decoderModule : feature.getDecoders()) { + Class<?> decoderClass = decoderModule.getClass(); + if(registeredExpModules.containsKey(decoderClass)) { + throw new ExplorationServiceRuntimeException(getClass(), "The module " + + decoderClass.getSimpleName() + " has already been registered!"); + } + } + for(OperatorModule<?> operatorModule : feature.getOperators()) { + Class<?> operatorClass = operatorModule.getClass(); + if(registeredExpModules.containsKey(operatorClass)) { + throw new ExplorationServiceRuntimeException(getClass(), "The module " + + operatorClass.getSimpleName() + " has already been registered!"); + } + } + for(EvaluatorModule<?> evaluatorModule : feature.getEvaluators()) { + Class<?> evaluatorClass = evaluatorModule.getClass(); + if(registeredExpModules.containsKey(evaluatorClass)) { + throw new ExplorationServiceRuntimeException(getClass(), "The module " + + evaluatorClass.getSimpleName() + " has already been registered!"); + } + } + + explorationFeatures.put(feature.getClass(), feature); + } + + /** {@inheritDoc} */ + @Override + public Collection<IExplorationFeature> getExplorationFeatures() { + return explorationFeatures.values(); + } + + /** {@inheritDoc} */ + @Override + public Collection<IExplorationFeature> getExplorationFeatures( + Collection<Class<? extends IExplorationFeature>> features) { + Collection<IExplorationFeature> featureInstances = new HashSet<>(); + for(Class<? extends IExplorationFeature> featureType : features) { + IExplorationFeature featureInstance = explorationFeatures.getInstance(featureType); + if(featureInstance == null) { + throw new ExplorationServiceRuntimeException(getClass(), + "No exploration feature of the type " + featureType.getClass() + + " has been registered."); + } + featureInstances.add(explorationFeatures.getInstance(featureType)); + } + return featureInstances; + } + + /** {@inheritDoc} */ + @Override + public String getIntrospectionDescription() { + // KEEP DESCRIPTION IN SYNC WITH THE SERVICE INTERFACE CLASS COMMENT!!!! + return "Service for adding Exploration Modules to the DSE. The define the concrete problems" + + " that shall be solved by the DSE process. Modules registered with this service" + + " are known to the DSE and can be selected by users to define a DSE process.\n" + + "The Modules registered here are not defining a a concrete DSE process, just the" + + " concrete problems. Exploration modules can be categorized into three classes:" + + " Variable definitions, Problem statements and transformations, and Evaluators" + + " (solution metrics). The variable definitions consist of a Genotypes" + + " (variables), Operators (modify variables), and Creators" + + " (variable initialization). Problem statements transform Genotypes into" + + " evaluable solutions implemented by Decoders that produce" + + " Phenotypes. Evaluators rate Phenotypes such that the quality of a solution can" + + " be quantified.\n" + + "The complete DSE process is based on DI: each of the elements composing" + + " exploration modules have to be implemented as Guice AbstractModules."; + } + + /** {@inheritDoc} */ + @Override + public String getIntrospectionLabel() { + return "Exploration Module Service"; + } + + /** {@inheritDoc} */ + @Override + public boolean showInIntrospectionNavigation() { + return true; + } + + /** {@inheritDoc} */ + @Override + public Collection<IIntrospectionItem> getIntrospectionItems() { + return null; + } + + /** {@inheritDoc} */ + @Override + public IIntrospectionDetailsItem getDetailsItem() { + return null; + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/.ratings index 707cffe0..0d5278bf 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/.ratings @@ -1,5 +1,5 @@ AF3Utils.java a7269b4db6db75c4d3332c46fa62b7597711507b RED -DesignSpaceExplorationModelElementFactory.java bc6a6462bb655f3709afbc6b0c50ccd4f9764b5d RED +DesignSpaceExplorationModelElementFactory.java 088730563c404be12c4138fb96af59db387a1f32 RED ExplorationAlgDebugUtils.java acdb59e8a413c89e26f91b8829149afcb8328600 RED ExplorationAlgUtils.java 3ae0811b433c0be37af094086aff720cb42ea862 RED ExplorationEcoreUtils.java d816b750378d2bcbd307ff86e121c8d38ef5c28b RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java index bc6a6462..08873056 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java @@ -65,8 +65,8 @@ public class DesignSpaceExplorationModelElementFactory { } /** Creates a DseSpecification referencing the given {@link ExplorationSpecification}. */ - public static DseSpecification - createDefaultDesignSpaceExploration(ExplorationSpecification expSpec) { + public static DseSpecification createDefaultDesignSpaceExploration( + ExplorationSpecification expSpec) { ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(expSpec); return createDefaultDesignSpaceExploration(expSpec, modelContext); @@ -78,8 +78,9 @@ public class DesignSpaceExplorationModelElementFactory { */ public static DseSpecification createDefaultDesignSpaceExploration( ExplorationSpecification expSpec, ITopLevelElement modelContext) { - DseSpecification dseSpec = createDseSpecification("Default DSE model", - ExecutionModel.TT_FAIL_SILENCE, createDefaultEAOptimizer()); + DseSpecification dseSpec = + createDseSpecification("Default DSE model", ExecutionModel.TT_FAIL_SILENCE, + createDefaultEAOptimizer()); modelContext.runAsCommand(() -> dseSpec.setTargetSpecification(expSpec)); return dseSpec; } @@ -205,8 +206,8 @@ public class DesignSpaceExplorationModelElementFactory { /** * Creates a fixed deployment constraint within the goal specification of the current DSE model. */ - public static ComponentMultiAllocationConstraint - addMultiComponentAllocationConstraint(ExplorationSpecification targetSpec) { + public static ComponentMultiAllocationConstraint addMultiComponentAllocationConstraint( + ExplorationSpecification targetSpec) { ComponentMultiAllocationConstraint fixedDeploymentConstraint = createComponentMultiAllocationConstraint(); prepareUniqueID(fixedDeploymentConstraint, targetSpec); @@ -237,15 +238,15 @@ public class DesignSpaceExplorationModelElementFactory { * Creates a {@link ComponentMultiDislocationConstraint} to the given * {@link ExplorationSpecification}. */ - public static ComponentMultiDislocationConstraint - addComponentMultiDislocationConstraint(ExplorationSpecification targetSpec) { + public static ComponentMultiDislocationConstraint addComponentMultiDislocationConstraint( + ExplorationSpecification targetSpec) { ComponentMultiDislocationConstraint multiComponentDislocationConstraint = createComponentMultiDislocationConstraint(); prepareUniqueID(multiComponentDislocationConstraint, targetSpec); ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(targetSpec); - modelContext.runAsCommand( - () -> targetSpec.getTargets().add(multiComponentDislocationConstraint)); + modelContext.runAsCommand(() -> targetSpec.getTargets().add( + multiComponentDislocationConstraint)); return multiComponentDislocationConstraint; } @@ -261,8 +262,8 @@ public class DesignSpaceExplorationModelElementFactory { * Creates a safety integrity level constraint within the goal specification of the current DSE * model. */ - public static SafetyIntegrityLevelConstraint - addSafetyIntegrityLevelConstraint(ExplorationSpecification targetSpec) { + public static SafetyIntegrityLevelConstraint addSafetyIntegrityLevelConstraint( + ExplorationSpecification targetSpec) { SafetyIntegrityLevelConstraint safetyIntegrityLevelConstraint = PredefinedFactory.eINSTANCE.createSafetyIntegrityLevelConstraint(); safetyIntegrityLevelConstraint.setName("Safety Integrity Level Constraint"); -- GitLab