From 729f08f792e6cab6cc614ed2b1b34819bc448435 Mon Sep 17 00:00:00 2001 From: Alexander Diewald <diewald@fortiss.org> Date: Wed, 24 Jan 2018 16:44:52 +0000 Subject: [PATCH] Exploration.alg: First running version of the Partition Exploration. * Introduce the following Decoders: * PartitionMappingDecoderGraph: Updates a PlatformCommunicationGraph to align to an updated PartitionMapping. * PartitionMappingIdentityDecoder: Forwards a PartitionMappingEncoding to the Genotype * TaskInstanceResourceAlignmentDecoder: Adjusts the sets of valid target resources for allocations & reallocates invalid entries. * Add the following Exploration Sub Problems: * PartitionMappingProblem: Mapping of Partitions to cores. TaskMappings are now defined as Task --> Partition. * PlatformCommGraphProblem: Recalculation of communication paths existing in the platform. Required for Message Routing. * Add corresponding operators: vary the number of Partitions and their allocation to cores. Also add NOP Operators where needed (Esp. Crossover). * Add Copy operations. * Restructure the MessageRouter(s) to consider changes of the PlatfromCommunicationGraphs. * Various Adpations to existing task mappings due to the changed target resources. * Update the DependencyGraph: * Simplify the calculation of dependencies. * Correctly consider "Pure" identity decoders, i.e., Decoders that only take one input genotype into account and output the same: They would be neglected otherwise. * Restructure the Mapping class. * --- .../af3/exploration/alg/dse/DSEFactory.java | 66 ++++++++- .../af3/exploration/alg/dse/Explorer.java | 2 + .../alg/dse/TaskMappingFactory.java | 2 +- .../backend/opt4j/Opt4JExplorerBackend.java | 25 ++-- .../PartitionMappingCreator.java | 2 +- .../PlatformCommunicationGraphCreator.java | 58 ++++++++ .../opt4j/encoding/MappingEncoding.java | 28 +++- .../opt4j/encoding/MappingEntryBase.java | 5 + .../PartitionMappingEncoding.java | 48 +++---- .../PartitionMappingEntry.java | 14 +- .../PlatformCommunicationGraphEncoding.java | 103 ++++++++++++++ .../taskmapping/TaskMappingEncoding.java | 23 +-- .../taskmapping/TaskMappingEntry.java | 3 +- .../AbstractTaskMappingEncoding.java | 55 ++------ .../FailSilentTaskMappingEncoding.java | 61 ++------ ...ultDetectionVotingTaskMappingEncoding.java | 45 ------ .../InstantiatedTaskMappingEncoding.java | 8 ++ .../create/ComposableCreatorBase.java | 12 +- .../decode/ComposableDecoder.java | 2 + .../decode/CompositeDecoderBase.java | 20 ++- .../evaluate/CompositeEvaluatorBase.java | 3 +- .../CopyPartitionMapping.java | 2 +- .../CopyPlatformCommunicationGraph.java | 33 +++++ .../CopyPlatformCommunicationGraphModule.java | 32 +++++ .../taskmapping/CopyAbstractTaskMapping.java | 2 +- .../NopCrossoverPartitionMappingModule.java | 31 ++++ ...soverPlatformCommunicationGraphModule.java | 31 ++++ .../operator/mutate/NopMutateOperator.java | 32 +++++ .../partitionmapping/MutatePartitionBase.java | 3 +- .../NopPlatformCommGraphMutateModule.java | 31 ++++ .../opt4j/problem/StrictTTDecoder.java | 13 +- .../opt4j/problem/comm/MessageDecoder.java | 25 +++- .../InstantiatedTaskMappingDecoder.java | 6 + ...InstantiatedTaskMappingDecoderAcyclic.java | 6 + .../PartitionMappingDecoderGraph.java | 133 ++++++++++++++++++ .../PartitionMappingIdentityDecoder.java | 75 ++++++++++ .../safetyfunction/SFEncodingDecoder.java | 17 ++- .../safetyfunction/SFGraphDecoder.java | 16 ++- .../SFMappingConstraintDecoder.java | 6 + .../safetyfunction/SFMappingDecoder.java | 6 + .../AbstractTaskMappingIdentityDecoder.java | 24 +++- .../taskmapping/TaskMappingDecoderBase.java | 77 ++++++++++ .../AbstractTaskMappingDecoder.java | 2 +- .../FailSilentAbstractTaskMappingDecoder.java | 8 +- ...ctionVotingAbstractTaskMappingDecoder.java | 8 +- .../TaskInstanceResourceAlignmentDecoder.java | 88 ++++++++++++ .../opt4j/solution/StrictTTSchedule.java | 4 +- ...aluator.java => TaskMappingEvaluator.java} | 25 +++- .../MappingEvaluatorConstraint.java | 15 +- .../objective/MappingEvaluatorObjective.java | 13 +- .../sysmodel/FailSilentExecModelFactory.java | 4 +- .../FaultDetectionVotingExecModelFactory.java | 4 +- .../arch/PlatformCommunicationGraph.java | 128 ----------------- .../dse/sysmodel/arch/SystemModelAdapter.java | 87 +++++++++++- .../af3/AF3DeployableComponentAdapter.java | 5 +- .../arch/af3/AF3SystemModelAdapter.java | 5 +- .../sysmodel/mapping/IMappingEncoding.java | 2 + .../sysmodel/mapping/comm/IMessageRouter.java | 12 +- ...sageRouterBase.java => MessageRouter.java} | 43 ++++-- .../mapping/comm/ShortestPathRouter.java | 33 +++-- .../sysmodel/sched/comm/TDMABusScheduler.java | 12 +- .../alg/graph/DependencyGraph.java | 124 ++++++++-------- .../alg/graph/display/NamedVertex.java | 3 + 63 files changed, 1319 insertions(+), 492 deletions(-) create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/{instantiatemapping => taskmapping/instantiate}/AbstractTaskMappingDecoder.java (99%) rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/{instantiatemapping => taskmapping/instantiate}/FailSilentAbstractTaskMappingDecoder.java (97%) rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/{instantiatemapping => taskmapping/instantiate}/FaultDetectionVotingAbstractTaskMappingDecoder.java (97%) create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/{MappingEvaluator.java => TaskMappingEvaluator.java} (80%) delete mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/{MessageRouterBase.java => MessageRouter.java} (67%) diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java index fae01031..59585161 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java @@ -23,10 +23,14 @@ import java.util.List; import javax.activation.UnsupportedDataTypeException; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.ArchitectureExplorationCreator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.partitionmapping.PartitionMappingCreator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.platform.PlatformCommunicationGraphCreator; 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.TaskMappingCreator; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +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.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry; @@ -40,14 +44,17 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureDec import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureExplorationProblemModule; 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.instantiatemapping.AbstractTaskMappingDecoder; 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.partitionmapping.PartitionMappingIdentityDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFEncodingDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFGraphDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFMappingConstraintDecoder; 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.AbstractTaskMappingDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.TaskInstanceResourceAlignmentDecoder; import org.fortiss.af3.exploration.alg.dse.evaluator.ArchitectureEvaluator; import org.fortiss.af3.exploration.alg.dse.sysmodel.FailSilentExecModelFactory; import org.fortiss.af3.exploration.alg.dse.sysmodel.FaultDetectionVotingExecModelFactory; @@ -56,6 +63,7 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; 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.ExecutionModel; +import org.jgrapht.experimental.dag.DirectedAcyclicGraph.CycleFoundException; /** * Factory to create exploration problems solved by the DSE. It is used to create the single parts @@ -113,6 +121,9 @@ public class DSEFactory { systemModelAdapter.addSafetyFunctionAdapters(sfExplorationModule.getAdapters()); createSafetyFunctionArchProblem(archExpProblemModule, systemModelAdapter, execDepGraph); } + createPartitionMappingProblem(archExpProblemModule, dse, systemModelAdapter, execDepGraph); + createPlatformCommunicationGraphProblem(archExpProblemModule, dse, systemModelAdapter, + execDepGraph); createAbstractTaskMappingProblem(tmFactory, archExpProblemModule, dse, systemModelAdapter, execDepGraph); createTaskMappingInstantiationProblem(tmFactory, archExpProblemModule, dse, @@ -121,8 +132,7 @@ public class DSEFactory { /** * Creates the safety function architecture exploration sub-problem, or, more specifically, - * the - * creators of this sub-problem. + * the creators of this sub-problem. * * @param archExpProblemModule * The {@link CompositeProblemModuleBase} declaring the architectural exploration @@ -167,6 +177,56 @@ public class DSEFactory { sfDecoders); } + /** + * Creates a Partition Mapping sub-problem: Partition --> ExecutionUnit. + * + * @param archExpProblemModule + * The {@link CompositeProblemModuleBase} declaring the architectural exploration + * problem. + * @param dse + * The design space exploration description. + * @param systemModelAdapter + * The adapter to model of the system on which the dse is executed. + * @param execDepGraph + * Dependency graph defining the execution order. + * @throws CycleFoundException + * if a cyclic dependency is discovered when registering the problem. + */ + @SuppressWarnings("unchecked") + private void createPartitionMappingProblem( + ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + DecoderDependencyGraph execDepGraph) throws CycleFoundException { + Class<PartitionMappingEncoding> pmEnodingClass = PartitionMappingEncoding.class; + PartitionMappingCreator pmCreator = + new PartitionMappingCreator(systemModelAdapter, execDepGraph); + + @SuppressWarnings("rawtypes") List<ComposableDecoder> pmDecoders = new ArrayList<>(); + PartitionMappingIdentityDecoder pmDecoder = new PartitionMappingIdentityDecoder(); + TaskInstanceResourceAlignmentDecoder tiraDecoder = + new TaskInstanceResourceAlignmentDecoder(); + pmDecoders.add(pmDecoder); + pmDecoders.add(tiraDecoder); + pmCreator.registerAssocDecoders(pmDecoder); + archExpProblemModule.registerSubProblem(pmEnodingClass, pmCreator, pmDecoders); + } + + private void createPlatformCommunicationGraphProblem( + ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + DecoderDependencyGraph execDepGraph) throws CycleFoundException { + Class<PlatformCommunicationGraphEncoding> pmEnodingClass = + PlatformCommunicationGraphEncoding.class; + PlatformCommunicationGraphCreator pmCreator = + new PlatformCommunicationGraphCreator(systemModelAdapter, execDepGraph); + + @SuppressWarnings("rawtypes") List<ComposableDecoder> pmDecoders = new ArrayList<>(); + PartitionMappingDecoderGraph pmgDecoder = new PartitionMappingDecoderGraph(); + pmDecoders.add(pmgDecoder); + // pmCreator.registerAssocDecoders(pmgDecoder); + archExpProblemModule.registerSubProblem(pmEnodingClass, pmCreator, pmDecoders); + } + /** * Creates a task mapping sub-problem (see {@link AbstractTaskMappingEncoding}) which describes * the problem of mapping a logical/functional application architecture to a defined platform diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java index a4d04fec..554a98ed 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java @@ -80,6 +80,8 @@ public class Explorer { 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)); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java index 0815c889..518ebf3e 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java @@ -32,9 +32,9 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmap import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper; 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.instantiatemapping.AbstractTaskMappingDecoder; 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.taskmapping.instantiate.AbstractTaskMappingDecoder; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.IMessageRouter; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java index fcc00dfb..f934f458 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java @@ -30,12 +30,17 @@ 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.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; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.safetyfunctionarch.CopySafetyFunctionArchModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.taskmapping.CopyTaskMappingModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.CrossoverAbstractTaskMappingModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverInstantiatedTaskMappingModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverPartitionMappingModule; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverPlatformCommunicationGraphModule; 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; @@ -160,14 +165,11 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { // Configure operators // 1. Crossover - CrossoverAbstractTaskMappingModule crossoverModule = - new CrossoverAbstractTaskMappingModule(systemModelAdapter, 0.3); - modules.add(crossoverModule); - NopCrossoverInstantiatedTaskMappingModule nopCrossoverInstMapping = - new NopCrossoverInstantiatedTaskMappingModule(); - modules.add(nopCrossoverInstMapping); - NopCrossoverSFArchModule nopCrossoverSFArch = new NopCrossoverSFArchModule(); - modules.add(nopCrossoverSFArch); + modules.add(new CrossoverAbstractTaskMappingModule(systemModelAdapter, 0.3)); + modules.add(new NopCrossoverInstantiatedTaskMappingModule()); + modules.add(new NopCrossoverSFArchModule()); + modules.add(new NopCrossoverPartitionMappingModule()); + modules.add(new NopCrossoverPlatformCommunicationGraphModule()); // ===================================== // 2. Mutation (in order) @@ -180,6 +182,9 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { modules.add(sfArchModule); } + // NOP for PlatformCommunicationGraph + modules.add(new NopPlatformCommGraphMutateModule()); + // Partition Exploration modules.add(new PartitionMappingModule(systemModelAdapter)); @@ -195,9 +200,13 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { // mutateModule.setMutationRate(0.125); modules.add(mutateModule); + // ===================================== // 3. Genotype copy + // ===================================== modules.add(new CopyTaskMappingModule()); modules.add(new CopySafetyFunctionArchModule()); + modules.add(new CopyPartitionMappingModule()); + modules.add(new CopyPlatformCommunicationGraphModule()); // Define a completer module that "controls" the execution of the decode and the evaluation // phases. It also allows to parallelize the execution of these phases. diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java index 2e175344..46350306 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java @@ -15,8 +15,8 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.partitionmapping; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding.CREATE_STARTEGY; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding.CREATE_STARTEGY; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create.ComposableCreatorBase; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.FlatGenotypeMap; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.DecoderDependencyGraph; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java new file mode 100644 index 00000000..7178369b --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.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.dse.backend.opt4j.create.platform; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create.ComposableCreatorBase; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.FlatGenotypeMap; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.DecoderDependencyGraph; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; +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.IExplorationEncoding; + +/** + * + * @author diewald + */ +public class PlatformCommunicationGraphCreator + extends ComposableCreatorBase<PlatformCommunicationGraphEncoding> { + /** Constructor. */ + public PlatformCommunicationGraphCreator( + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + DecoderDependencyGraph depGraph) { + super(systemModelAdapter, depGraph); + } + + /** {@inheritDoc} */ + @Override + public PlatformCommunicationGraphEncoding createComposable(FlatGenotypeMap createdGenotypes, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + PlatformCommunicationGraphEncoding pcgEncoding = new PlatformCommunicationGraphEncoding( + systemModelAdapter, systemModelAdapter.createGraph()); + // Debug code + // if(isDebugVerboseEnabled()) { + // pcgEncoding.display(); + // } + return pcgEncoding; + } + + /** {@inheritDoc} */ + @Override + public Class<? extends IExplorationEncoding> getCreatedEncodingType() { + return PlatformCommunicationGraphEncoding.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java index 044eecaf..80c2fe78 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java @@ -17,6 +17,7 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -50,10 +51,6 @@ public abstract class MappingEncoding<G extends Genotype, S extends IRequestAdap */ protected ListMultimap<S, M> allocationMap = LinkedListMultimap.create(); - public enum CREATE_STARTEGY { - MIN_SET, RANDOM_SET, MAX_SET - } - /** * Creates a copy of the internal allocation map of {@code this} {@link TaskMappingEncoding}. */ @@ -70,13 +67,34 @@ public abstract class MappingEncoding<G extends Genotype, S extends IRequestAdap /** {@inheritDoc} */ @Override public synchronized Collection<T> getAllocatedResourcesFor(S requester) { - Collection<T> allocatedResourcesForRequester = new ArrayList<>(); + Collection<T> allocatedResourcesForRequester = new HashSet<>(); for(IMappingEntry<S, T> currentMappingEntry : allocationMap.get(requester)) { allocatedResourcesForRequester.add(currentMappingEntry.getTarget()); } return allocatedResourcesForRequester; } + /** {@inheritDoc} */ + @Override + public synchronized Collection<T> getResources() { + Collection<T> allocatedResourcesForRequester = new HashSet<>(); + for(IMappingEntry<S, T> currentMappingEntry : allocationMap.values()) { + allocatedResourcesForRequester.add(currentMappingEntry.getTarget()); + } + return allocatedResourcesForRequester; + } + + /** NOTE: ONLY for one to one mappings! */ + public List<S> getRequesters(T resource) { + List<S> allocatedRequesters = new ArrayList<>(); + for(IMappingEntry<S, T> currentMappingEntry : allocationMap.values()) { + if(currentMappingEntry.getTarget() == resource) { + allocatedRequesters.add(currentMappingEntry.getSource()); + } + } + return allocatedRequesters; + } + /** {@inheritDoc} */ @Override public List<M> getMappingEntriesOf(S source) { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java index 5c618d4e..057c56f8 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java @@ -42,6 +42,11 @@ public abstract class MappingEntryBase<S extends IRequestAdapter<?>, T extends I protected ClassToInstanceMap<IMappingEntry<S, T>> associatedEntries = MutableClassToInstanceMap.create(); + public MappingEntryBase(S source, T target) { + this.source = source; + this.target = target; + } + /** {@inheritDoc} */ @Override public S getSource() { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java index fb22cc96..1ad321a3 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java @@ -23,14 +23,10 @@ import java.util.Map; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding; 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.ComposablePhenotype; -import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.random.RandomExploration; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; - /** * Encoding that maps partition, which host tasks, to execution units. Typically, these are cores. * The encoding is essentially a two-dimensional table. @@ -38,14 +34,14 @@ import com.google.common.collect.ListMultimap; * @author diewald */ public class PartitionMappingEncoding extends - MappingEncoding<PartitionMappingEncoding, Partition, IExecutionUnitAdapter<?>, PartitionMappingEntry> + MappingEncoding<PartitionMappingEncoding, Partition, IResourceAdapter<?>, PartitionMappingEntry> implements ComposableGenotype, Cloneable { - /** The allocation table. */ - private ListMultimap<IResourceAdapter<?>, Partition> allocationTable = - ArrayListMultimap.create(); - private Collection<? extends IResourceAdapter<?>> targetSet; + public enum CREATE_STARTEGY { + MIN_SET, RANDOM_SET, MAX_SET + } + /** Constructor. */ // TODO: The strategy can be replaced by lambdas for a cleaner design. public PartitionMappingEncoding(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, @@ -56,19 +52,24 @@ public class PartitionMappingEncoding extends targetSet = systemModelAdapter.getDeploymentTargets(); if(strategy == CREATE_STARTEGY.MIN_SET) { for(IResourceAdapter<?> target : targetSet) { - allocationTable.put(target, new Partition()); + Partition part = new Partition(); + allocationMap.put(part, new PartitionMappingEntry(part, target)); } } else if(strategy == CREATE_STARTEGY.RANDOM_SET) { for(IResourceAdapter<?> target : targetSet) { int randMaxPartitions = RandomExploration.getInstance().nextInt(taskNum); + // Ensure at least one partition per phys. execution unit. + randMaxPartitions = (randMaxPartitions < 1) ? 1 : randMaxPartitions; for(int i = 0; i < randMaxPartitions; ++i) { - allocationTable.put(target, new Partition()); + Partition part = new Partition(); + allocationMap.put(part, new PartitionMappingEntry(part, target)); } } } else if(strategy == CREATE_STARTEGY.MAX_SET) { for(IResourceAdapter<?> target : targetSet) { for(int i = 0; i < taskNum; ++i) { - allocationTable.put(target, new Partition()); + Partition part = new Partition(); + allocationMap.put(part, new PartitionMappingEntry(part, target)); } } } @@ -79,36 +80,33 @@ public class PartitionMappingEncoding extends // Prototype for newInstance(). } - public Collection<IResourceAdapter<?>> getResources() { - return allocationTable.keySet(); - } - - public List<Partition> getRequesters(IResourceAdapter<?> resource) { - return allocationTable.get(resource); - } - /** Creates a {@link Partition} that is allocated to the given {@link IResourceAdapter}. */ public void createPartition(IResourceAdapter<?> resource) { - allocationTable.put(resource, new Partition()); + Partition newPartition = new Partition(); + allocationMap.put(newPartition, new PartitionMappingEntry(newPartition, resource)); } /** Removes a random {@link Partition} allocation to the given {@link IResourceAdapter}. */ - public void removeRandomPartition(IResourceAdapter<?> resource) { - List<Partition> partitions = allocationTable.get(resource); + public boolean removeRandomPartition(IResourceAdapter<?> resource) { + List<Partition> partitions = getRequesters(resource); + if(partitions.size() == 1) { + return false; + } int randIdx = RandomExploration.getInstance().nextInt(partitions.size()); Partition rmPartition = partitions.get(randIdx); removePartition(resource, rmPartition); + return true; } /** Removes the given {@link Partition} allocation to the given {@link IResourceAdapter}. */ public void removePartition(IResourceAdapter<?> resource, Partition partition) { - allocationTable.remove(resource, partition); + allocationMap.remove(resource, partition); } /** {@inheritDoc} */ @Override public int size() { - return allocationTable.keySet().size(); + return allocationMap.keySet().size(); } /** {@inheritDoc} */ diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java index b9a9289f..1af8d4e9 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java @@ -16,19 +16,23 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEntryBase; -import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; /** * * @author diewald */ -public class PartitionMappingEntry extends MappingEntryBase<Partition, IExecutionUnitAdapter<?>> { +public class PartitionMappingEntry extends MappingEntryBase<Partition, IResourceAdapter<?>> { + + /** Constructor. */ + public PartitionMappingEntry(Partition partition, IResourceAdapter<?> execUnit) { + super(partition, execUnit); + } /** {@inheritDoc} */ @Override - public IMappingEntry<Partition, IExecutionUnitAdapter<?>> clone() { - // TODO Auto-generated method stub - return null; + public IMappingEntry<Partition, IResourceAdapter<?>> clone() { + return new PartitionMappingEntry(getSource(), getTarget()); } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java new file mode 100644 index 00000000..7128803a --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java @@ -0,0 +1,103 @@ +/*-------------------------------------------------------------------------+ +| 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.opt4j.encoding.platform; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +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.ComposablePhenotype; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; +import org.fortiss.af3.exploration.alg.graph.display.JGraphTVisualizer; +import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.jgrapht.DirectedGraph; +import org.jgrapht.graph.DefaultEdge; + +/** + * Abstracts the communication network present in a platform system meta-model to a flat graph. This + * graph is needed to manage the communication of logical {@link IDeployableComponentAdapter}s after + * they have been deployed onto a concrete platform. More precisely, the graph is used for routing + * of (physical) messages and their scheduling on the communication resources, like busses. + * + * @author diewald + */ +public class PlatformCommunicationGraphEncoding implements IExplorationEncoding, ComposableGenotype, + ComposablePhenotype<PartitionMappingEncoding>, Cloneable { + + /** Representation of input system model */ + protected SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter; + + /** The graph representing the communication structure of a platform. */ + protected DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph; + + /** Constructor for the initial version of the Graph w/o available Partitions. */ + public PlatformCommunicationGraphEncoding( + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph) { + this.systemModelAdapter = systemModelAdapter; + this.platformGraph = platformGraph; + } + + /** Copy constructor. */ + protected PlatformCommunicationGraphEncoding( + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) { + this.systemModelAdapter = systemModelAdapter; + } + + /** Creates a Dialog that illustrates this {@link DirectedGraph}. */ + public void display() { + JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge> taskViz = + new JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge>(platformGraph); + taskViz.displayGraph("Platform communication graph"); + } + + /** + * Returns the actual graph that contains information about the {@link IResourceAdapter}s and + * their connections. + */ + public DirectedGraph<IResourceAdapter<?>, DefaultEdge> getActualGraph() { + return platformGraph; + } + + /** {@inheritDoc} */ + @Override + public int size() { + return platformGraph.vertexSet().size() + platformGraph.edgeSet().size(); + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Override + public PlatformCommunicationGraphEncoding newInstance() { + PlatformCommunicationGraphEncoding pcgEncoding = + new PlatformCommunicationGraphEncoding(systemModelAdapter, this.platformGraph); + + // Graphs.addGraph(pcgEncoding.platformGraph, this.platformGraph); + return pcgEncoding; + } + + /** {@inheritDoc} */ + @Override + public Class<? extends ComposableGenotype> getGTypeToRegister() { + return PlatformCommunicationGraphEncoding.class; + } + + /** {@inheritDoc} */ + @Override + public Class<? extends ComposablePhenotype<?>> getPTypeToRegister() { + return PlatformCommunicationGraphEncoding.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java index 690e2fc5..2b7476fd 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java @@ -38,7 +38,6 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.Task import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.constraint.InternalReplicationConstraint; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.constraint.InternalSeparationConstraint; 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.CompositePhenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.encoding.ConstrainedEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; @@ -69,9 +68,8 @@ import com.google.common.collect.Multimap; // for the subclass of TaskMappingEncoding and passed to the CompositePhenotype. public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter<?>, T extends TaskMappingEntry<S, Partition>> extends MappingEncoding<TaskMappingEncoding<S, T>, S, Partition, T> - implements IMappingEncoding<S, Partition, T>, ComposableGenotype, - CompositePhenotype<TaskMappingEncoding<S, T>>, ArchExpSubEncoding, IExplorationEncoding, - ConstrainedEncoding, Cloneable { + implements IMappingEncoding<S, Partition, T>, ComposableGenotype, ArchExpSubEncoding, + IExplorationEncoding, ConstrainedEncoding, Cloneable { /** Random generator */ private RandomExploration rand = RandomExploration.getInstance(); @@ -148,7 +146,8 @@ public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter< public TaskMappingEncoding(DseSpecification dse, SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, boolean initialize) throws ExplorationException { - this(dse, systemModelAdapter, null, new TaskGraphEncoding<>(systemModelAdapter)); + this(dse, systemModelAdapter, new PartitionMappingEncoding(systemModelAdapter, null), + new TaskGraphEncoding<>(systemModelAdapter)); if(initialize) { resetEncoding(); } @@ -187,6 +186,12 @@ public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter< completeEncoding(incompleteEncoding); } + // TODO: This is a HACK, which is required to get the recent set of target partitions. Here, the + // task mapping class architecture needs to be reworked. + public void updatePartitionMapping(PartitionMappingEncoding partMappingEncoding) { + this.partMappingEncoding = partMappingEncoding; + } + /** * Adds the given {@link TaskMappingEntry} to the internal allocation table and adds the * references between {@link TaskMappingEntry}s accordingly. @@ -472,14 +477,14 @@ public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter< * {@link TaskMappingEntry} defines the source and the target for the created * {@link TaskMappingEntry}. * - * @param allocEntry + * @param mappingEntry * Existing {@link TaskMappingEntry} serving as a template for the created * {@link TaskMappingEntry}. * @return The created {@link TaskMappingEntry}. */ - public <S extends TaskMappingEntry<IDeployableComponentAdapter<?>, Partition>> T - createAndAddEntry(S allocEntry) { - T newEntry = createEntry(allocEntry); + public <U extends TaskMappingEntry<IDeployableComponentAdapter<?>, Partition>> T + createAndAddEntry(U mappingEntry) { + T newEntry = createEntry(mappingEntry); addAllocation(newEntry); return newEntry; } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java index 4f4ca634..da713dc7 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java @@ -32,8 +32,7 @@ public abstract class TaskMappingEntry<S extends IRequestAdapter<?>, T extends I /** Constructs a mapping entry the represents the mapping to a given deployment target. */ protected TaskMappingEntry(S deployableComponent, T target) { - this.source = deployableComponent; - this.target = target; + super(deployableComponent, target); } /** {@inheritDoc} */ diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java index b2ae6901..7b087250 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java @@ -16,16 +16,13 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping; import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.SafeTaskGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.TaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.ComposableGenotype; @@ -69,6 +66,14 @@ public class AbstractTaskMappingEncoding super(dse, systemModelAdapter, partEnc, tgEncoding, initialize); } + /** Copy Constructor. */ + public AbstractTaskMappingEncoding(DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + PartitionMappingEncoding partEnc, TaskGraphEncoding<?, ?, ?> tgEncoding) + throws ExplorationException { + super(dse, systemModelAdapter, partEnc, tgEncoding); + } + /** * Constructor that optionally initializes the encoding to a random encoding * @@ -150,7 +155,8 @@ public class AbstractTaskMappingEncoding public AbstractTaskMappingEncoding clone() { AbstractTaskMappingEncoding clonedEncoding; try { - clonedEncoding = new AbstractTaskMappingEncoding(dse, systemModelAdapter, false); + clonedEncoding = new AbstractTaskMappingEncoding(dse, systemModelAdapter, + partMappingEncoding, tgEncoding); } catch(ExplorationException e) { // Opt4J does not allow to throw Exceptions here. throw new RuntimeException(e); @@ -171,47 +177,8 @@ public class AbstractTaskMappingEncoding } /** {@inheritDoc} */ - @SuppressWarnings("unchecked") @Override public Class<? extends ComposablePhenotype<?>> getPTypeToRegister() { return AbstractTaskMappingEncoding.class; } - - /** {@inheritDoc} */ - @Override - public <GT extends Genotype, CP extends ComposablePhenotype<GT>> CP - getSubPhenotype(Class<CP> subPhenotype) { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public <GT extends Genotype, CP extends ComposablePhenotype<GT>> void - putSubPhenotype(Class<CP> subGenotype, CP curPhenotype) { - // TODO Auto-generated method stub - - } - - /** {@inheritDoc} */ - @Override - public List<ComposablePhenotype<? extends Genotype>> getSubPhenotypes() { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public Set<Class<? extends ComposablePhenotype<? extends Genotype>>> keySet() { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public Iterator<Entry<Class<? extends ComposablePhenotype<? extends Genotype>>, ComposablePhenotype<? extends Genotype>>> - iterator() { - // TODO Auto-generated method stub - return null; - } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java index dcfe74af..3ff346fe 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java @@ -16,23 +16,17 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; - import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.TaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.exception.ExplorationException; import org.fortiss.af3.exploration.moea.model.DseSpecification; -import org.opt4j.core.Genotype; /** * Problem encoding consisting of redundant {@link TaskMappingEntry}s with fail-silent assumption. @@ -52,6 +46,13 @@ public class FailSilentTaskMappingEncoding super(dse, systemModelAdapter, partEnc, tgEncoding); } + /** Copy Constructor. */ + FailSilentTaskMappingEncoding(DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + PartitionMappingEncoding partEnc, TaskGraphEncoding<?, ?, ?> tgEncoding) { + super(dse, systemModelAdapter, partEnc, tgEncoding); + } + // TODO: Check whether the two constructors below are actually needed. /** * Constructor that optionally initializes the encoding to a random encoding @@ -126,50 +127,8 @@ public class FailSilentTaskMappingEncoding public FailSilentTaskMappingEncoding clone() { // TODO: Here, we should maintain the mapping. FailSilentTaskMappingEncoding clonedEncoding; - try { - clonedEncoding = new FailSilentTaskMappingEncoding(dse, systemModelAdapter, false); - } catch(ExplorationException e) { - // Opt4J does not allow to throw Exceptions here. - throw new RuntimeException(e); - } + clonedEncoding = new FailSilentTaskMappingEncoding(dse, systemModelAdapter, + partMappingEncoding, tgEncoding); return clonedEncoding; } - - /** {@inheritDoc} */ - @Override - public <GT extends Genotype, CP extends ComposablePhenotype<GT>> CP - getSubPhenotype(Class<CP> subPhenotype) { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public <GT extends Genotype, CP extends ComposablePhenotype<GT>> void - putSubPhenotype(Class<CP> subGenotype, CP curPhenotype) { - // TODO Auto-generated method stub - - } - - /** {@inheritDoc} */ - @Override - public List<ComposablePhenotype<? extends Genotype>> getSubPhenotypes() { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public Set<Class<? extends ComposablePhenotype<? extends Genotype>>> keySet() { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public Iterator<Entry<Class<? extends ComposablePhenotype<? extends Genotype>>, ComposablePhenotype<? extends Genotype>>> - iterator() { - // TODO Auto-generated method stub - return null; - } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java index a6f89aae..6a4183ae 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java @@ -15,11 +15,6 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; - import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding; @@ -27,12 +22,10 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.Ta import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.exception.ExplorationException; import org.fortiss.af3.exploration.moea.model.DseSpecification; -import org.opt4j.core.Genotype; /** * Problem encoding of redundant {@link TaskMappingEncoding}s with fault detection and voting. @@ -142,42 +135,4 @@ public class FaultDetectionVotingTaskMappingEncoding extends } return clonedEncoding; } - - /** {@inheritDoc} */ - @Override - public <GT extends Genotype, CP extends ComposablePhenotype<GT>> CP - getSubPhenotype(Class<CP> subPhenotype) { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public <GT extends Genotype, CP extends ComposablePhenotype<GT>> void - putSubPhenotype(Class<CP> subGenotype, CP curPhenotype) { - // TODO Auto-generated method stub - - } - - /** {@inheritDoc} */ - @Override - public List<ComposablePhenotype<? extends Genotype>> getSubPhenotypes() { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public Set<Class<? extends ComposablePhenotype<? extends Genotype>>> keySet() { - // TODO Auto-generated method stub - return null; - } - - /** {@inheritDoc} */ - @Override - public Iterator<Entry<Class<? extends ComposablePhenotype<? extends Genotype>>, ComposablePhenotype<? extends Genotype>>> - iterator() { - // TODO Auto-generated method stub - return null; - } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java index d89ea963..a1aba735 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java @@ -19,6 +19,7 @@ import java.util.Collection; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.TaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry; @@ -52,6 +53,13 @@ public abstract class InstantiatedTaskMappingEncoding<T extends InstantiatedTask super(dse, systemModelAdapter, partEnc, tgEncoding); } + /** Copy Constructor. */ + protected InstantiatedTaskMappingEncoding(DseSpecification dse, + SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + PartitionMappingEncoding partEnc, TaskGraphEncoding<?, ?, ?> tgEncoding) { + super(dse, systemModelAdapter, partEnc, tgEncoding); + } + // TODO: Check whether the two constructors below are actually needed. /** * Constructor that optionally initializes the encoding to a random encoding diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java index f9c8b7b5..b63db253 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java @@ -119,11 +119,13 @@ public abstract class ComposableCreatorBase<G extends ComposableGenotype> .findAny(); for(ComposableDecoder<G, ? extends ComposablePhenotype<G>> decoder : subDecoders) { - if(!isHybridPhenoRequiredAndCreated(createdGenotypeTypeSet, - decoder.getRequiredTypes()) || - Genotype.class.isAssignableFrom(decoder.getOutputType())) { - continue; - } + /* + * if(!isHybridPhenoRequiredAndCreated(createdGenotypeTypeSet, + * decoder.getRequiredTypes()) || + * Genotype.class.isAssignableFrom(decoder.getOutputType())) { + * continue; + * } + */ @SuppressWarnings("unchecked") ComposableDecoder<G, P> castedDecoder = (ComposableDecoder<G, P>)decoder; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java index eaf66fe6..fc32f1b3 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java @@ -36,6 +36,8 @@ import org.opt4j.core.problem.Decoder; public interface ComposableDecoder<G extends ComposableGenotype, P extends ComposablePhenotype<?>> extends IDependencyModule<IExplorationEncoding, P> { + Class<?> getPrimaryInputType(); + /** * Passes the {@link ComposableGenotype} to the concrete decode method of the concrete * {@link ComposableDecoder} and returns the resulting {@link ComposablePhenotype}. diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java index fdd5d9d0..b631f18f 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java @@ -130,12 +130,9 @@ public abstract class CompositeDecoderBase<C extends CompositeGenotype<Class<? e (ComposableDecoder<ComposableGenotype, ComposablePhenotype<?>>)decoder; subDecoders.put(castedDecoder, registeredSubDecoders.get(decoder)); } else { - throw new DecodingException( - genotype, - decoder, - "The sub-decoder " + - decoder.getClass().getSimpleName() + - " has been found in the dependency graph but it has not been regirstered at this composite decoder."); + throw new DecodingException(genotype, decoder, "The sub-decoder " + + decoder.getClass().getSimpleName() + + " has been found in the dependency graph but it has not been regirstered at this composite decoder."); } } } @@ -156,9 +153,8 @@ public abstract class CompositeDecoderBase<C extends CompositeGenotype<Class<? e // shall not be just overridden. if(Genotype.class.isAssignableFrom(decType)) { CP oldGenotype = genotype.get(decType); - curPhenotype = - castedDecoder.updateComposable(decodeableGenotype, oldGenotype, - decodedPhenotypes); + curPhenotype = castedDecoder.updateComposable(decodeableGenotype, oldGenotype, + decodedPhenotypes); } else { curPhenotype = castedDecoder.decodeComposable(decodeableGenotype, decodedPhenotypes); @@ -241,14 +237,14 @@ public abstract class CompositeDecoderBase<C extends CompositeGenotype<Class<? e * @throws CycleFoundException */ @Override - public - <G extends ComposableGenotype, CP extends ComposablePhenotype<G>, D extends ComposableDecoder<G, CP>> + public <G extends ComposableGenotype, CP extends ComposablePhenotype<G>, D extends ComposableDecoder<G, CP>> void registerSubDecoder(Class<G> subGenotype, D subDecoder) throws CycleFoundException { if(subGenotype == null || subDecoder == null) { return; } - registeredSubDecoders.put(subDecoder, subGenotype); + registeredSubDecoders.put(subDecoder, + (Class<? extends ComposableGenotype>)subDecoder.getPrimaryInputType()); @SuppressWarnings("unchecked") ComposableDecoder<ComposableGenotype, ComposablePhenotype<?>> castedSubDecoder = (ComposableDecoder<ComposableGenotype, ComposablePhenotype<?>>)subDecoder; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java index 1633c9c5..06b23dd5 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java @@ -264,8 +264,7 @@ public abstract class CompositeEvaluatorBase<P extends CompositePhenotype<?>> (Class<SP>)currSubPhenotype.getClass(); phenotypeTypeMap.putEncoding(currSupPhenotypeType, currSubPhenotype); if(CompositePhenotype.class.isAssignableFrom(currSubPhenotype.getClass())) { - @SuppressWarnings("unchecked") List<SP> subPhenos = - (List<SP>)phenotype.getSubPhenotypes(); + List<SP> subPhenos = ((CompositePhenotype)currSubPhenotype).getSubPhenotypes(); subPhenotypes.addAll(0, subPhenos); } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java index 2a5e12e6..641348ea 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java @@ -28,6 +28,6 @@ public class CopyPartitionMapping implements Copy<PartitionMappingEncoding> { /** {@inheritDoc} */ @Override public PartitionMappingEncoding copy(PartitionMappingEncoding other) { - return ((PartitionMappingEncoding)other).clone(); + return other.clone(); } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.java new file mode 100644 index 00000000..940b8a0b --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.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.dse.backend.opt4j.operator.copy.platform; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; +import org.opt4j.operators.copy.Copy; + +/** + * + * @author diewald + */ +public class CopyPlatformCommunicationGraph implements Copy<PlatformCommunicationGraphEncoding> { + + /** {@inheritDoc} */ + @Override + public PlatformCommunicationGraphEncoding copy(PlatformCommunicationGraphEncoding genotype) { + return genotype.newInstance(); + } + +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java new file mode 100644 index 00000000..ff27643c --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java @@ -0,0 +1,32 @@ +/*-------------------------------------------------------------------------+ +| 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.operator.copy.platform; + +import org.opt4j.operators.copy.CopyModule; + +/** + * + * @author diewald + */ +public class CopyPlatformCommunicationGraphModule extends CopyModule { + + /** {@inheritDoc} */ + @Override + protected void config() { + addOperator(CopyPlatformCommunicationGraph.class); + } + +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java index 7dd68378..41356d99 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java @@ -28,6 +28,6 @@ public class CopyAbstractTaskMapping implements Copy<AbstractTaskMappingEncoding /** {@inheritDoc} */ @Override public AbstractTaskMappingEncoding copy(AbstractTaskMappingEncoding other) { - return (AbstractTaskMappingEncoding)other.clone(); + return other.clone(); } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java new file mode 100644 index 00000000..b7589a43 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java @@ -0,0 +1,31 @@ +/*-------------------------------------------------------------------------+ +| 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.operator.crossover; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; + +/** + * + * @author diewald + */ +public class NopCrossoverPartitionMappingModule extends CrossoverOperatorModuleBase { + /** {@inheritDoc} */ + @Override + public void config() { + super.config(); + addOperatorInstance(PartitionMappingEncoding.class, new NopCrossover()); + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java new file mode 100644 index 00000000..fbad012d --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java @@ -0,0 +1,31 @@ +/*-------------------------------------------------------------------------+ +| 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.operator.crossover; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; + +/** + * + * @author diewald + */ +public class NopCrossoverPlatformCommunicationGraphModule extends CrossoverOperatorModuleBase { + /** {@inheritDoc} */ + @Override + public void config() { + super.config(); + addOperatorInstance(PlatformCommunicationGraphEncoding.class, new NopCrossover()); + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java new file mode 100644 index 00000000..6cc7d102 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java @@ -0,0 +1,32 @@ +/*-------------------------------------------------------------------------+ +| 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.operator.mutate; + +import org.opt4j.core.Genotype; +import org.opt4j.operators.mutate.Mutate; + +/** + * No-Op Mutation for Identity Decoders. + * + * @author diewald + */ +public class NopMutateOperator implements Mutate<Genotype> { + /** {@inheritDoc} */ + @Override + public void mutate(Genotype genotype, double p) { + return; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java index e983d69f..ee5d6032 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java @@ -16,6 +16,7 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.partitionmapping; import java.util.Collection; +import java.util.HashSet; import java.util.function.Consumer; import java.util.function.Function; @@ -32,7 +33,7 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; */ public abstract class MutatePartitionBase extends MutateBase<PartitionMappingEncoding> { /** Elements to which other elements may be allocated. */ - private Collection<IResourceAdapter<?>> allocationTargets; + private Collection<IResourceAdapter<?>> allocationTargets = new HashSet<>(); /** Defines the rate at which mutations shall happen: Typically 1 / size of the gene. */ private double rate; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java new file mode 100644 index 00000000..65589cc7 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java @@ -0,0 +1,31 @@ +/*-------------------------------------------------------------------------+ +| 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.operator.mutate.platform; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.NopMutateOperator; +import org.opt4j.operators.mutate.MutateModule; + +/** + * + * @author diewald + */ +public class NopPlatformCommGraphMutateModule extends MutateModule { + /** {@inheritDoc} */ + @Override + protected void config() { + addOperator(NopMutateOperator.class); + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java index 92aeaecf..03916df2 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java @@ -21,6 +21,7 @@ import java.util.Collections; import org.fortiss.af3.exploration.alg.dse.TaskMappingFactory; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm.MessageEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; 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.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; @@ -84,6 +85,8 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I @SuppressWarnings("unchecked") InstantiatedAcyclicTaskGraphEncoding<S, ?> acycItgEnc = phenotypeTypeMap.getEncoding(InstantiatedAcyclicTaskGraphEncoding.class); assert (acycItgEnc != null) : "The required acyclic and instantiated task graph encoding could not be found in the map of already decoded phenotypes."; + PlatformCommunicationGraphEncoding pcgEncoding = + phenotypeTypeMap.getEncoding(PlatformCommunicationGraphEncoding.class); // TODO: Externalize the validation such that the encoding is not required to be passed to // the constructor (is there for validation purposes) @@ -94,7 +97,8 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I // TODO: Find out why the message scheduler does not require the task graph. Actually, it // should require it... - simpleBusScheduler.schedule(schedule, msgEnc.getPeriodicMessages(), acycItgEnc); + simpleBusScheduler.schedule(schedule, msgEnc.getPeriodicMessages(), acycItgEnc, + pcgEncoding); assert (schedule.validateSchedule(true)); return schedule; @@ -119,6 +123,7 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I Collection<Class<?>> reqTypes = new ArrayList<>(); reqTypes.add(InstantiatedTaskMappingEncoding.class); reqTypes.add(MessageEncoding.class); + reqTypes.add(PlatformCommunicationGraphEncoding.class); reqTypes.add(InstantiatedAcyclicTaskGraphEncoding.class); // FIXME: Remove as soon as the evaluators can declare their required Phenotypes!!! (Needed // for the period evaluator) @@ -140,4 +145,10 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I public Collection<Class<?>> getOptionalTypes() { return Collections.emptySet(); } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return InstantiatedTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java index b1128015..9a90cb32 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java @@ -20,9 +20,9 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; -import org.fortiss.af3.exploration.alg.dse.TaskMappingFactory; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm.MessageEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedTaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry; @@ -38,6 +38,8 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message; import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.MessageGenerator; import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.IMessageRouter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.IMessageRouter.RoutingStrategy; +import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.MessageRouter; import org.jgrapht.DirectedGraph; import org.jgrapht.graph.DefaultEdge; @@ -69,11 +71,8 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt @Inject public MessageDecoder(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) { this.systemModelAdapter = systemModelAdapter; - - TaskMappingFactory<?, ?> tmFactory = TaskMappingFactory.getInstance(); - messageGenerator = new MessageGenerator<S, T>(systemModelAdapter); - messageRouter = tmFactory.createShortestPathRouter(systemModelAdapter); + messageRouter = new MessageRouter(systemModelAdapter); } /** @@ -84,10 +83,15 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt @Override public MessageEncoding<S, T> decodeComposable(T genotype, FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException { - Collection<Message> generatedMessages = messageGenerator.generateMessages(genotype); + PlatformCommunicationGraphEncoding pcgEncoding = + decodedPhenotypes.getEncoding(PlatformCommunicationGraphEncoding.class); + assert (pcgEncoding != null) : "The required platform communication graph encoding could not" + + " be found in the map of already decoded phenotypes."; + Collection<Message> generatedMessages = messageGenerator.generateMessages(genotype); Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> messageRouteMap = - messageRouter.calculateMessageRoutes(generatedMessages); + messageRouter.calculateMessageRoutes(generatedMessages, pcgEncoding, + RoutingStrategy.SHORTEST_PATH); if(messageRouteMap == null) { // At least one *invalid* communication link is required by the given mapping => // infeasible mapping. @@ -123,6 +127,7 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt Collection<Class<?>> reqTypes = new ArrayList<>(); reqTypes.add(InstantiatedTaskMappingEncoding.class); reqTypes.add(InstantiatedTaskGraphEncoding.class); + reqTypes.add(PlatformCommunicationGraphEncoding.class); return reqTypes; } @@ -138,4 +143,10 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt public Class<MessageEncoding> getOutputType() { return MessageEncoding.class; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return InstantiatedTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java index c626056e..c029197c 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java @@ -281,4 +281,10 @@ public class InstantiatedTaskMappingDecoder<T extends InstantiatedTaskMappingEnt public Class<InstantiatedTaskGraphEncoding> getOutputType() { return InstantiatedTaskGraphEncoding.class; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return InstantiatedTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java index e03b667c..42983f82 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java @@ -114,4 +114,10 @@ public class InstantiatedTaskMappingDecoderAcyclic<T extends InstantiatedTaskMap public Class<InstantiatedAcyclicTaskGraphEncoding> getOutputType() { return InstantiatedAcyclicTaskGraphEncoding.class; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return InstantiatedTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java new file mode 100644 index 00000000..eef9693b --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java @@ -0,0 +1,133 @@ +/*-------------------------------------------------------------------------+ +| 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.problem.partitionmapping; + +import java.util.ArrayList; +import java.util.Collection; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +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.extensions.compositegene.decode.ComposableDecoderBase; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecoder; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ICommunicationResourceAdapter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; +import org.fortiss.tooling.common.util.LambdaUtils; +import org.jgrapht.Graphs; +import org.jgrapht.graph.DefaultEdge; + +/** + * + * @author diewald + */ +public class PartitionMappingDecoderGraph extends + ComposableDecoderBase<PlatformCommunicationGraphEncoding, PlatformCommunicationGraphEncoding> + implements ArchExpSubDecoder { + /** {@inheritDoc} */ + @Override + public PlatformCommunicationGraphEncoding decodeComposable( + PlatformCommunicationGraphEncoding genotype, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + PartitionMappingEncoding pmEnc = + decodedPhenotypes.getEncoding(PartitionMappingEncoding.class); + assert (pmEnc != null) : "The required platform communication graph encoding could not" + + " be found in the map of already decoded phenotypes."; + + for(IResourceAdapter<?> execUnit : genotype.getActualGraph().vertexSet()) { + for(IResourceAdapter<?> partition : pmEnc.getRequesters(execUnit)) { + genotype.getActualGraph().addVertex(partition); + genotype.getActualGraph().addEdge(partition, execUnit); + genotype.getActualGraph().addEdge(execUnit, partition); + } + } + + return genotype; + } + + /** {@inheritDoc} */ + @Override + public PlatformCommunicationGraphEncoding updateComposable( + PlatformCommunicationGraphEncoding inGenotype, + PlatformCommunicationGraphEncoding outGenotype, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + PartitionMappingEncoding pmEnc = + decodedPhenotypes.getEncoding(PartitionMappingEncoding.class); + assert (pmEnc != null) : "The required partition mapping encoding could not" + + " be found in the map of already decoded phenotypes."; + // Remove non-existing Partitions (from a previous iteration). + Collection<IResourceAdapter<?>> removeVertices = new ArrayList<>(); + for(IResourceAdapter<?> resource : inGenotype.getActualGraph().vertexSet()) { + if((resource instanceof Partition) && !pmEnc.getRequesters().contains(resource)) { + Collection<DefaultEdge> edgeSet = inGenotype.getActualGraph().edgesOf(resource); + inGenotype.getActualGraph().removeAllEdges(edgeSet); + removeVertices.add(resource); + } + } + inGenotype.getActualGraph().removeAllVertices(removeVertices); + // Add missing Partitions. + for(Partition partition : pmEnc.getRequesters()) { + if(!inGenotype.getActualGraph().containsVertex(partition)) { + // We have only one Partition per entry --> Multiples for task mappings. + // TODO: Correct the return type for single and multi returns. + IResourceAdapter<?> execUnit = + pmEnc.getAllocatedResourcesFor(partition).iterator().next(); + inGenotype.getActualGraph().addVertex(partition); + // FIXME: HACK!!! Connects the Partitions to the communication resource attached to + // the phys exec unit. This is used to avoid larger reworks in the TDMA Message + // scheduler. The scheduler must be reconsidered to reflect internal comm. of a + // core/processor correctly. + Collection<IResourceAdapter<?>> commResources = + Graphs.neighborListOf(inGenotype.getActualGraph(), execUnit); + IResourceAdapter<?> commresource = LambdaUtils + .getFirst(commResources, r -> r instanceof ICommunicationResourceAdapter) + .get(); + inGenotype.getActualGraph().addEdge(partition, commresource); + inGenotype.getActualGraph().addEdge(commresource, partition); + } + } + return inGenotype; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + Collection<Class<?>> reqTypes = new ArrayList<>(); + reqTypes.add(PlatformCommunicationGraphEncoding.class); + reqTypes.add(PartitionMappingEncoding.class); + return reqTypes; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getOptionalTypes() { + Collection<Class<?>> optTypes = new ArrayList<>(); + return optTypes; + } + + /** {@inheritDoc} */ + @Override + public Class<PlatformCommunicationGraphEncoding> getOutputType() { + return PlatformCommunicationGraphEncoding.class; + } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return PlatformCommunicationGraphEncoding.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java new file mode 100644 index 00000000..dcdd804f --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java @@ -0,0 +1,75 @@ +/*-------------------------------------------------------------------------+ +| 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.problem.partitionmapping; + +import java.util.ArrayList; +import java.util.Collection; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoderBase; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecoder; + +/** + * + * @author diewald + */ +public class PartitionMappingIdentityDecoder + extends ComposableDecoderBase<PartitionMappingEncoding, PartitionMappingEncoding> + implements ArchExpSubDecoder { + /** {@inheritDoc} */ + @Override + public PartitionMappingEncoding decodeComposable(PartitionMappingEncoding genotype, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + return genotype; + } + + /** {@inheritDoc} */ + @Override + public PartitionMappingEncoding updateComposable(PartitionMappingEncoding inGenotype, + PartitionMappingEncoding outGenotype, FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + return inGenotype; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + Collection<Class<?>> reqTypes = new ArrayList<>(); + reqTypes.add(PartitionMappingEncoding.class); + return reqTypes; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getOptionalTypes() { + Collection<Class<?>> optTypes = new ArrayList<>(); + optTypes.add(PartitionMappingEncoding.class); + return optTypes; + } + + /** {@inheritDoc} */ + @Override + public Class<PartitionMappingEncoding> getOutputType() { + return PartitionMappingEncoding.class; + } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return PartitionMappingEncoding.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java index 247cd214..e4ada07b 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java @@ -33,8 +33,8 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecod * * @author diewald */ -public class SFEncodingDecoder<C> extends - ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafetyFunctionArchEncoding<C>> +public class SFEncodingDecoder<C> + extends ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafetyFunctionArchEncoding<C>> implements ArchExpSubDecoder { /** @@ -56,10 +56,9 @@ public class SFEncodingDecoder<C> extends * see {@link ComposableDecoderBase}. */ @Override - public SafetyFunctionArchEncoding<C> - updateComposable(SafetyFunctionArchEncoding<C> inGenotype, - SafetyFunctionArchEncoding<C> outGenotype, - FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException { + public SafetyFunctionArchEncoding<C> updateComposable(SafetyFunctionArchEncoding<C> inGenotype, + SafetyFunctionArchEncoding<C> outGenotype, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException { return inGenotype; } @@ -85,4 +84,10 @@ public class SFEncodingDecoder<C> extends Class<? super SafetyFunctionArchEncoding<C>> retType = SafetyFunctionArchEncoding.class; return (Class<SafetyFunctionArchEncoding<C>>)retType; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return SafetyFunctionArchEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java index a87044ac..39eaf80f 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java @@ -43,9 +43,9 @@ import com.google.inject.Inject; * * @author diewald */ -public class SFGraphDecoder<C> extends - ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafeTaskGraphEncoding<C>> implements - ArchExpSubDecoder { +public class SFGraphDecoder<C> + extends ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafeTaskGraphEncoding<C>> + implements ArchExpSubDecoder { /** Reference to the {@link SystemModelAdapter} that handles input models for the DSE. */ SystemModelAdapter<C, ?, ?, ?, ?, ?> systemModelAdapter; @@ -112,8 +112,8 @@ public class SFGraphDecoder<C> extends * Adds the diagnostic units from the {@link SafetyFunctionArchEntry} to the * {@link TaskGraphEncoding}. */ - private void - addDiagUnits(SafetyFunctionArchEntry<C> sFAEntry, SafeTaskGraphEncoding<C> encoding) { + private void addDiagUnits(SafetyFunctionArchEntry<C> sFAEntry, + SafeTaskGraphEncoding<C> encoding) { Collection<IDeployableComponentAdapter<C>> diagComps = sFAEntry.getSafetyFunctionAdapter().getDiagnosticComponents(); addTasks(diagComps, encoding); @@ -160,4 +160,10 @@ public class SFGraphDecoder<C> extends public Class<AbstractTaskGraphEncoding> getOutputType() { return AbstractTaskGraphEncoding.class; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return AbstractTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java index ac569f6a..e83a6b85 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java @@ -132,4 +132,10 @@ public class SFMappingConstraintDecoder<C> public Class<? super AbstractTaskMappingEncoding> getOutputType() { return AbstractTaskMappingEncoding.class; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return AbstractTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java index 35fc4334..65136325 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java @@ -296,4 +296,10 @@ public class SFMappingDecoder<C> public Class<AbstractTaskMappingEncoding> getOutputType() { return AbstractTaskMappingEncoding.class; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return AbstractTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java index 1726e6d8..65d9b47f 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java @@ -20,8 +20,8 @@ import java.util.Collection; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoderBase; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; @@ -33,10 +33,12 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecod * * @author diewald */ -public class AbstractTaskMappingIdentityDecoder - extends ComposableDecoderBase<AbstractTaskMappingEncoding, AbstractTaskMappingEncoding> +// TODO: We actually need an additional AbstractTaskMappingDecoder, as this one is not an identity +// decoder anymore. We'd need a clearer concept when to use which operators anyways (Dependent on +// the selected features of the DSE). +public class AbstractTaskMappingIdentityDecoder extends + TaskMappingDecoderBase<AbstractTaskMappingEntry, AbstractTaskMappingEncoding, AbstractTaskMappingEncoding> implements ArchExpSubDecoder { - /** {@inheritDoc} */ @Override public AbstractTaskMappingEncoding decodeComposable(AbstractTaskMappingEncoding genotype, @@ -49,7 +51,11 @@ public class AbstractTaskMappingIdentityDecoder public AbstractTaskMappingEncoding updateComposable(AbstractTaskMappingEncoding inGenotype, AbstractTaskMappingEncoding outGenotype, FlatPhenotypeMap<Phenotype> decodedPhenotypes) { - return inGenotype; + PartitionMappingEncoding pmEncoding = + decodedPhenotypes.getEncoding(PartitionMappingEncoding.class); + assert (pmEncoding != null); + inGenotype.updatePartitionMapping(pmEncoding); + return alignWithResourceModifications(inGenotype, decodedPhenotypes); } /** {@inheritDoc} */ @@ -57,6 +63,7 @@ public class AbstractTaskMappingIdentityDecoder public Collection<Class<?>> getRequiredTypes() { Collection<Class<?>> reqTypes = new ArrayList<>(); reqTypes.add(AbstractTaskMappingEncoding.class); + reqTypes.add(PartitionMappingEncoding.class); return reqTypes; } @@ -64,7 +71,6 @@ public class AbstractTaskMappingIdentityDecoder @Override public Collection<Class<?>> getOptionalTypes() { Collection<Class<?>> optTypes = new ArrayList<>(); - optTypes.add(PartitionMappingEncoding.class); return optTypes; } @@ -73,4 +79,10 @@ public class AbstractTaskMappingIdentityDecoder public Class<AbstractTaskMappingEncoding> getOutputType() { return AbstractTaskMappingEncoding.class; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return AbstractTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java new file mode 100644 index 00000000..98eea0ce --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java @@ -0,0 +1,77 @@ +/*-------------------------------------------------------------------------+ +| 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.problem.taskmapping; + +import java.util.ArrayList; +import java.util.Collection; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoderBase; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; +import org.fortiss.af3.exploration.alg.exception.ExplorationException; + +/** + * + * @author diewald + */ +public abstract class TaskMappingDecoderBase<S extends TaskMappingEntry<IDeployableComponentAdapter<?>, Partition>, T extends TaskMappingEncoding<IDeployableComponentAdapter<?>, S>, P extends ComposablePhenotype<?>> + extends ComposableDecoderBase<T, P> { + + /** + * Reallocates the {@link IResourceAdapter}s if the set of {@link IResourceAdapter}s was changed + * by a previous module. This is required to stay consistent. + * + * @param taskMapping + * {@link TaskMappingEncoding} to adapt. + * @param decodedPhenotypes + * {@link Phenotype} set required to gather the alignment information, .e.g., + * resource encodings. + * @return Aligned {@link TaskMappingEncoding}. + */ + protected T alignWithResourceModifications(T taskMapping, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + PartitionMappingEncoding pmEncoding = + decodedPhenotypes.getEncoding(PartitionMappingEncoding.class); + assert (pmEncoding != null); + + Collection<S> relocateEntries = new ArrayList<>(); + Collection<IResourceAdapter<?>> existingPartitions = pmEncoding.getResources(); + for(S mappingEntry : taskMapping.getMappingEntries()) { + if(!existingPartitions.contains(mappingEntry.getTarget())) { + relocateEntries.add(mappingEntry); + } + } + + for(S mappingEntry : relocateEntries) { + taskMapping.removeEntry(mappingEntry); + try { + taskMapping.createAndAddRandomEntry(mappingEntry.getSource()); + } catch(ExplorationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return taskMapping; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/AbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java similarity index 99% rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/AbstractTaskMappingDecoder.java rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java index 2eb9f2fb..bf042302 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/AbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.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.dse.backend.opt4j.problem.instantiatemapping; +package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate; import java.util.ArrayList; import java.util.Collection; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FailSilentAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java similarity index 97% rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FailSilentAbstractTaskMappingDecoder.java rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java index 897e4276..ecb43eb9 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FailSilentAbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.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.dse.backend.opt4j.problem.instantiatemapping; +package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate; import static org.fortiss.tooling.common.util.LambdaUtils.filterSet; @@ -126,4 +126,10 @@ public class FailSilentAbstractTaskMappingDecoder extends return outGenotype; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return AbstractTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FaultDetectionVotingAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java similarity index 97% rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FaultDetectionVotingAbstractTaskMappingDecoder.java rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java index 66bab92a..9e0033f5 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FaultDetectionVotingAbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.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.dse.backend.opt4j.problem.instantiatemapping; +package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate; import static org.fortiss.tooling.common.util.LambdaUtils.filterSet; @@ -126,4 +126,10 @@ public class FaultDetectionVotingAbstractTaskMappingDecoder extends return outGenotype; } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return AbstractTaskMappingEncoding.class; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java new file mode 100644 index 00000000..0a40b2db --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java @@ -0,0 +1,88 @@ +/*-------------------------------------------------------------------------+ +| 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.problem.taskmapping.instantiate; + +import java.util.ArrayList; +import java.util.Collection; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.TaskMappingDecoderBase; + +/** + * + * @author diewald + */ +public class TaskInstanceResourceAlignmentDecoder extends + TaskMappingDecoderBase<InstantiatedTaskMappingEntry, InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry>, InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry>> { + + /** {@inheritDoc} */ + @Override + public InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> decodeComposable( + InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> genotype, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + PartitionMappingEncoding pmEncoding = + decodedPhenotypes.getEncoding(PartitionMappingEncoding.class); + assert (pmEncoding != null); + genotype.updatePartitionMapping(pmEncoding); + return genotype; + } + + /** {@inheritDoc} */ + @Override + public InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> updateComposable( + InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> inGenotype, + InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> outGenotype, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) { + PartitionMappingEncoding pmEncoding = + decodedPhenotypes.getEncoding(PartitionMappingEncoding.class); + assert (pmEncoding != null); + inGenotype.updatePartitionMapping(pmEncoding); + return alignWithResourceModifications(inGenotype, decodedPhenotypes); + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + Collection<Class<?>> reqTypes = new ArrayList<>(); + reqTypes.add(InstantiatedTaskMappingEncoding.class); + reqTypes.add(PartitionMappingEncoding.class); + return reqTypes; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getOptionalTypes() { + Collection<Class<?>> optTypes = new ArrayList<>(); + return optTypes; + } + + /** {@inheritDoc} */ + @SuppressWarnings("rawtypes") + @Override + public Class<InstantiatedTaskMappingEncoding> getOutputType() { + return InstantiatedTaskMappingEncoding.class; + } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return InstantiatedTaskMappingEncoding.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java index db33fd92..ca518264 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java @@ -359,7 +359,9 @@ public class StrictTTSchedule<S extends TaskMappingEntry<IDeployableComponentAda if(!(resource instanceof ITransmissionUnitAdapter || resource instanceof IGatewayUnitAdapter) && resource != systemModelAdapter.getHardwareResource(resource)) { - str += "@" + systemModelAdapter.getHardwareResource(resource).getName(); + // FIXME: Use the name of the partition. + str += "@" + resource + .toString();/* systemModelAdapter.getHardwareResource(resource).getName(); */ } return str; } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/MappingEvaluator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/TaskMappingEvaluator.java similarity index 80% rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/MappingEvaluator.java rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/TaskMappingEvaluator.java index dabe0f2c..c3746755 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/MappingEvaluator.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/TaskMappingEvaluator.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.Collection; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IRequestAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; @@ -34,19 +36,23 @@ import org.fortiss.tooling.base.model.element.IModelElement; * * @author diewald */ -public abstract class MappingEvaluator - extends ExpressionEvaluatorBase<MappingEncoding, Double, ExplorationTarget<Double>> { +public abstract class TaskMappingEvaluator + extends ExpressionEvaluatorBase<TaskMappingEncoding, Double, ExplorationTarget<Double>> { /** Reference to the mapping which shall be evaluated here. */ protected MappingEncoding mapping; + // FIXME: HACK in order to validate the mapping of components/tasks to phys exec units if + // partitions are used. + protected MappingEncoding virtMapping; + /** Empty prototype constructor. */ - public MappingEvaluator() { + public TaskMappingEvaluator() { super(); } /** Constructor. */ - public MappingEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, + public TaskMappingEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, ExplorationTarget<Double> explorationTarget) throws Exception { super(systemModelAdapter, explorationTarget); } @@ -66,6 +72,13 @@ public abstract class MappingEvaluator for(IResourceAdapter<?> allocResource : allocResourceAdps) { if(allocResource.getObject() == resource) { return Boolean.valueOf(true); + } else if(allocResource instanceof Partition) { + // TODO: HACK, remove after transition to full table based representation. + IResourceAdapter<?> physResource = (IResourceAdapter<?>)virtMapping + .getAllocatedResourcesFor((Partition)allocResource).iterator().next(); + if(physResource.getObject() == resource) { + return Boolean.valueOf(true); + } } } @@ -108,13 +121,13 @@ public abstract class MappingEvaluator @Override public Collection<Class<?>> getRequiredInputTypes() { Collection<Class<?>> requiredTypes = new ArrayList<>(); - requiredTypes.add(MappingEncoding.class); + requiredTypes.add(TaskMappingEncoding.class); return requiredTypes; } /** {@inheritDoc} */ @Override public Class<?> getPrimaryInputType() { - return MappingEncoding.class; + return TaskMappingEncoding.class; } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java index 172690d0..629b43d6 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java @@ -16,10 +16,11 @@ package org.fortiss.af3.exploration.alg.dse.evaluator.constraint; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; -import org.fortiss.af3.exploration.alg.dse.evaluator.MappingEvaluator; +import org.fortiss.af3.exploration.alg.dse.evaluator.TaskMappingEvaluator; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; import org.fortiss.af3.exploration.dsl_v2.model.function.Maximize; @@ -35,8 +36,8 @@ import com.google.common.collect.ClassToInstanceMap; * * @author diewald */ -public class MappingEvaluatorConstraint extends MappingEvaluator - implements IConstraintEvaluator<MappingEncoding, Boolean, ExplorationConstraint<Boolean>> { +public class MappingEvaluatorConstraint extends TaskMappingEvaluator implements + IConstraintEvaluator<TaskMappingEncoding, Boolean, ExplorationConstraint<Boolean>> { /** Prototype constructor. */ public MappingEvaluatorConstraint() { @@ -53,10 +54,12 @@ public class MappingEvaluatorConstraint extends MappingEvaluator /** {@inheritDoc} */ @Override - public Value<?> evaluateGoal(MappingEncoding phenotype, + public Value<?> evaluateGoal(TaskMappingEncoding phenotype, FlatPhenotypeMap<Phenotype> phenotypeTypeMap, ClassToInstanceMap<EObject> transformedModels) { mapping = phenotype; + virtMapping = phenotypeTypeMap.getEncoding(PartitionMappingEncoding.class); + assert (virtMapping != null); Boolean retVal = null; // FIXME: pass parsing exception to upper layers. @@ -88,7 +91,7 @@ public class MappingEvaluatorConstraint extends MappingEvaluator /** {@inheritDoc} */ @Override - public IExplorationTargetEvaluator<MappingEncoding, Double, ExplorationTarget<Double>> + public IExplorationTargetEvaluator<TaskMappingEncoding, Double, ExplorationTarget<Double>> createEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, ExplorationTarget<Double> explorationTarget) throws InstantiationException, Exception { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java index 5d0e67ba..a3a217f4 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java @@ -18,10 +18,11 @@ package org.fortiss.af3.exploration.alg.dse.evaluator.objective; import java.math.BigInteger; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; -import org.fortiss.af3.exploration.alg.dse.evaluator.MappingEvaluator; +import org.fortiss.af3.exploration.alg.dse.evaluator.TaskMappingEvaluator; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; import org.fortiss.af3.exploration.dsl_v2.model.arithmetic.IArithmeticExpression; @@ -39,7 +40,7 @@ import com.google.common.collect.ClassToInstanceMap; * * @author diewald */ -public class MappingEvaluatorObjective extends MappingEvaluator { +public class MappingEvaluatorObjective extends TaskMappingEvaluator { /** Prototype Constructor. */ public MappingEvaluatorObjective() { @@ -62,10 +63,12 @@ public class MappingEvaluatorObjective extends MappingEvaluator { /** {@inheritDoc} */ @Override - public Value<?> evaluateGoal(MappingEncoding phenotype, + public Value<?> evaluateGoal(TaskMappingEncoding phenotype, FlatPhenotypeMap<Phenotype> phenotypeTypeMap, ClassToInstanceMap<EObject> transformedModels) throws Exception { mapping = phenotype; + virtMapping = phenotypeTypeMap.getEncoding(PartitionMappingEncoding.class); + assert (virtMapping != null); // For ExplorationObjectives the expression begins either with a Minimize or Maximize // operation. @@ -101,7 +104,7 @@ public class MappingEvaluatorObjective extends MappingEvaluator { /** {@inheritDoc} */ @Override - public IExplorationTargetEvaluator<MappingEncoding, Double, ExplorationTarget<Double>> + public IExplorationTargetEvaluator<TaskMappingEncoding, Double, ExplorationTarget<Double>> createEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, ExplorationTarget<Double> explorationTarget) throws InstantiationException, Exception { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java index 98d295f4..24efbb94 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java @@ -31,9 +31,9 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmap import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper; 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.instantiatemapping.AbstractTaskMappingDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.FailSilentAbstractTaskMappingDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.AbstractTaskMappingDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.FailSilentAbstractTaskMappingDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule; import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiAllocationConstraintEvaluator; import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiDislocationConstraintEvaluator; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java index db78fd26..7153d4be 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java @@ -31,9 +31,9 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmap import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper; 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.instantiatemapping.AbstractTaskMappingDecoder; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.FaultDetectionVotingAbstractTaskMappingDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.AbstractTaskMappingDecoder; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.FaultDetectionVotingAbstractTaskMappingDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule; import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiAllocationConstraintEvaluator; import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiDislocationConstraintEvaluator; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java deleted file mode 100644 index 9d243ce5..00000000 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java +++ /dev/null @@ -1,128 +0,0 @@ -/*-------------------------------------------------------------------------+ -| 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.sysmodel.arch; - -import static org.fortiss.af3.exploration.util.ExplorationUtils.isDebugVerboseEnabled; - -import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceConnectionAdapter.ConnectionType; -import org.fortiss.af3.exploration.alg.graph.display.JGraphTVisualizer; -import org.jgrapht.DirectedGraph; -import org.jgrapht.Graphs; -import org.jgrapht.graph.DefaultDirectedGraph; -import org.jgrapht.graph.DefaultEdge; - -/** - * Abstracts the communication network present in a platform system meta-model to a flat graph. This - * graph is needed to manage the communication of logical {@link IDeployableComponentAdapter}s after - * they have been deployed onto a concrete platform. More precisely, the graph is used for routing - * of (physical) messages and their scheduling on the communication resources, like busses. - * - * @author diewald - */ -public class PlatformCommunicationGraph { - - /** Representation of input system model */ - protected SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter; - - /** The graph representing the communication structure of a platform. */ - protected DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph; - - /** - * /** - * Constructor. - * - * @param systemModelAdapter - * The adapter for the input model which contains the platform - */ - public PlatformCommunicationGraph(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) { - this.systemModelAdapter = systemModelAdapter; - - platformGraph = - new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class); - - createGraph(); - } - - /** - * Creates the communication (or connection) graph which is implicitly given by the platform - * referenced in the {@link SystemModelAdapter}. This graph is used for routing messages. - */ - private void createGraph() { - DirectedGraph<IResourceAdapter<?>, DefaultEdge> tempPlatformCommGraph = - new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class); - - // Add all resources present in the platform as vertices to the "connection graph" - for(IResourceAdapter<?> resource : systemModelAdapter.getDeploymentTargets()) { - tempPlatformCommGraph.addVertex(resource); - } - for(IResourceAdapter<?> resource : systemModelAdapter.getMemoryUnits()) { - tempPlatformCommGraph.addVertex(resource); - } - for(IResourceAdapter<?> resource : systemModelAdapter.getGatewayUnits()) { - tempPlatformCommGraph.addVertex(resource); - } - for(IResourceAdapter<?> resource : systemModelAdapter.getTransmissionUnits()) { - tempPlatformCommGraph.addVertex(resource); - } - - // Successively connect the resources in the graph. The edges are given within the - // collection resource connectors are assumed to be fully connected. - for(IResourceConnectionAdapter connection : systemModelAdapter.deploymentTargetConnectors) { - // We add edges for each receiver in order to support broadcast connections - for(IResourceAdapter<?> currentReceiverResource : connection.getTargetResources()) { - // If the current resource is a child of a {@link TransmissionUnit} (like a NoC - // router), respect the direction of connections such that complex networks are - // correctly reflected. - if(connection.getConnectionType(currentReceiverResource) == ConnectionType.OUTGOING) { - Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(), - currentReceiverResource); - } else if(connection.getConnectionType(currentReceiverResource) == ConnectionType.INCOMING) { - Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource, - connection.getSourceResource()); - } else { - // Add the edges of a single connection. We add to edges for each connection - // such that an undirected graph is generated effectively. It is required to use - // this "trick" in order to be able to use the standard shortest path - // algorithms. - Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(), - currentReceiverResource); - Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource, - connection.getSourceResource()); - } - } - } - - // Debug code - if(isDebugVerboseEnabled()) { - display(); - } - } - - /** Creates a Dialog that illustrates this {@link DirectedGraph}. */ - public void display() { - JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge> taskViz = - new JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge>(platformGraph); - taskViz.displayGraph("Platform communication graph"); - } - - /** - * Returns the actual graph that contains information about the {@link IResourceAdapter}s and - * their connections. - */ - public DirectedGraph<IResourceAdapter<?>, DefaultEdge> getActualGraph() { - return platformGraph; - } -} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java index 3683f263..ac3d139e 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java @@ -38,6 +38,7 @@ import org.eclipse.emf.ecore.EObject; import org.fortiss.af3.component.model.Component; import org.fortiss.af3.component.model.ComponentArchitecture; import org.fortiss.af3.component.model.Port; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceConnectionAdapter.ConnectionType; @@ -64,8 +65,11 @@ import org.fortiss.tooling.base.model.element.IConnection; import org.fortiss.tooling.base.model.element.IConnector; import org.fortiss.tooling.base.model.element.IHierarchicElement; import org.fortiss.tooling.base.model.element.IModelElement; +import org.jgrapht.DirectedGraph; import org.jgrapht.Graphs; import org.jgrapht.alg.ConnectivityInspector; +import org.jgrapht.graph.DefaultDirectedGraph; +import org.jgrapht.graph.DefaultEdge; /** * Adapter to the system model used as input for the DSE which is created for a specific DSE run. @@ -164,7 +168,7 @@ public class SystemModelAdapter<C, E, S, G, TR, M> { protected Collection<IResourceAdapter<?>> deploymentTargetResources; /** Contains the connections between the {@link IResourceAdapter}s of the platform. */ - protected Collection<IResourceConnectionAdapter> deploymentTargetConnectors; + private Collection<IResourceConnectionAdapter> deploymentTargetConnectors; /** * Collection of the safety functions adapters that represent the safety functions from the @@ -172,8 +176,8 @@ public class SystemModelAdapter<C, E, S, G, TR, M> { */ protected Collection<ISafetyFunctionAdapter<C>> safetyFunctionAdapters = new ArrayList<>(); - /** The {@link PlatformCommunicationGraph} that is given by the current platform. */ - protected PlatformCommunicationGraph platformCommunicationGraph; + /** The {@link PlatformCommunicationGraphEncoding} that is given by the current platform. */ + protected PlatformCommunicationGraphEncoding platformCommunicationGraph; /** The set of independent {@link DefaultTaskGraph}s derived from the logical architecture. */ protected Collection<TaskGraph> taskGraphs; @@ -528,12 +532,69 @@ public class SystemModelAdapter<C, E, S, G, TR, M> { } /** - * Creates the {@link PlatformCommunicationGraph} that is used to determine the routing of + * Creates the {@link PlatformCommunicationGraphEncoding} that is used to determine the routing + * of * messages between {@link IDeployableComponentAdapter}s and their respective * {@link IExecutionUnitAdapter}s. */ protected void setupPlatformGraph() { - platformCommunicationGraph = new PlatformCommunicationGraph(this); + platformCommunicationGraph = new PlatformCommunicationGraphEncoding(this, createGraph()); + } + + /** + * Creates the communication (or connection) graph which is implicitly given by the platform + * referenced in the {@link SystemModelAdapter}. This graph is used for routing messages. + */ + public DirectedGraph<IResourceAdapter<?>, DefaultEdge> createGraph() { + DirectedGraph<IResourceAdapter<?>, DefaultEdge> tempPlatformCommGraph = + new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class); + DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph = + new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class); + + // Add all resources present in the platform as vertices to the "connection graph" + for(IResourceAdapter<?> resource : getDeploymentTargets()) { + tempPlatformCommGraph.addVertex(resource); + } + for(IResourceAdapter<?> resource : getMemoryUnits()) { + tempPlatformCommGraph.addVertex(resource); + } + for(IResourceAdapter<?> resource : getGatewayUnits()) { + tempPlatformCommGraph.addVertex(resource); + } + for(IResourceAdapter<?> resource : getTransmissionUnits()) { + tempPlatformCommGraph.addVertex(resource); + } + + // Successively connect the resources in the graph. The edges are given within the + // collection resource connectors are assumed to be fully connected. + for(IResourceConnectionAdapter connection : getDeploymentTargetConnectors()) { + // We add edges for each receiver in order to support broadcast connections + for(IResourceAdapter<?> currentReceiverResource : connection.getTargetResources()) { + // If the current resource is a child of a {@link TransmissionUnit} (like a NoC + // router), respect the direction of connections such that complex networks are + // correctly reflected. + if(connection + .getConnectionType(currentReceiverResource) == ConnectionType.OUTGOING) { + Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(), + currentReceiverResource); + } else if(connection + .getConnectionType(currentReceiverResource) == ConnectionType.INCOMING) { + Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource, + connection.getSourceResource()); + } else { + // Add the edges of a single connection. We add to edges for each connection + // such that an undirected graph is generated effectively. It is required to use + // this "trick" in order to be able to use the standard shortest path + // algorithms. + Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(), + currentReceiverResource); + Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource, + connection.getSourceResource()); + } + } + } + + return platformGraph; } /** @@ -707,10 +768,11 @@ public class SystemModelAdapter<C, E, S, G, TR, M> { } /** - * Returns the {@link PlatformCommunicationGraph} required for routing of the messages located + * Returns the {@link PlatformCommunicationGraphEncoding} required for routing of the messages + * located * in different parts of the platform. */ - public PlatformCommunicationGraph getPlatformCommunicationGraph() { + public PlatformCommunicationGraphEncoding getPlatformCommunicationGraph() { return platformCommunicationGraph; } @@ -1125,4 +1187,15 @@ public class SystemModelAdapter<C, E, S, G, TR, M> { public Class<? extends IPlatformResource> getFaultContainmentRegion() { return faultContainmentRegion; } + + /** Returns deploymentTargetConnectors. */ + public Collection<IResourceConnectionAdapter> getDeploymentTargetConnectors() { + return deploymentTargetConnectors; + } + + /** Sets deploymentTargetConnectors. */ + public void setDeploymentTargetConnectors( + Collection<IResourceConnectionAdapter> deploymentTargetConnectors) { + this.deploymentTargetConnectors = deploymentTargetConnectors; + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java index 87be31ed..14cb34aa 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java @@ -135,7 +135,10 @@ public class AF3DeployableComponentAdapter extends AF3RequestAdapter<Component> /** {@inheritDoc} */ @Override public Double getWcet(IExecutionUnitAdapter<?> executionUnit) { - return wcetMap.get(executionUnit); + // TODO: HACK More flexible approach is needed: We distinguish between phys. exec Units and + // Partitions. + return 10.0; + // return wcetMap.get(executionUnit); } /** {@inheritDoc} */ diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java index 481b0e77..623841b5 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java @@ -180,8 +180,8 @@ public class AF3SystemModelAdapter extends parameterAdapter = createDeploymentParameterMap(componentArchitecture, platformArchitecture, systemParameters.getReplacementComponents()); - deploymentTargetConnectors = - createDeploymentTargetConnectors(systemParameters.getDeploymentTargets()); + setDeploymentTargetConnectors( + createDeploymentTargetConnectors(systemParameters.getDeploymentTargets())); Multimap<Component, IDeployableComponentAdapter<Component>> componentToReplacementAdapter = createComponentReplacementAdapters(systemParameters.getReplacementComponents()); deployableComponents = createDeployableComponents(componentToReplacementAdapter, @@ -201,6 +201,7 @@ public class AF3SystemModelAdapter extends setupTaskGraphs(); setupEmittedMessages(); setupPlatformGraph(); + registerInputEncoding(getPlatformCommunicationGraph()); createAbstractTaskGraphEncoding(); // Re-enable annotation view updates. diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java index ac16e64e..84560179 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java @@ -34,6 +34,8 @@ public interface IMappingEncoding<S extends IRequestAdapter<?>, T extends IResou */ public Collection<T> getAllocatedResourcesFor(S source); + public Collection<T> getResources(); + /** * Returns the collection of {@link IMappingEntry}s which represent the (multi-)allocation of * the given {@link IRequestAdapter}s to {@link IResourceAdapter}s. diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java index 1ec90ec9..d70bea0a 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java @@ -18,6 +18,7 @@ package org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm; import java.util.Collection; import java.util.Map; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ICommunicationResourceAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message; @@ -31,6 +32,10 @@ import org.jgrapht.graph.DefaultEdge; */ public interface IMessageRouter { + public enum RoutingStrategy { + SHORTEST_PATH; + } + /** * Calculates the message routes for each {@link Message} given in the {@link Collection} {#link * messagesToRoute}. @@ -38,7 +43,8 @@ public interface IMessageRouter { * @return {@link Map} that relates the Message to its route. */ Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> calculateMessageRoutes( - Collection<Message> messagesToRoute); + Collection<Message> messagesToRoute, PlatformCommunicationGraphEncoding pcgEncoding, + RoutingStrategy strategy); /** * Returns the remaining {@link Message}/communication graphs for the given {@link Message}, @@ -46,6 +52,7 @@ public interface IMessageRouter { */ // TODO: replace the IResourceAdapter with an ICommunicationResourceAdapter. Map<IResourceAdapter<?>, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> + getRemainingMessageGraphs(Message message, IResourceAdapter<?> processedResource, DirectedGraph<IResourceAdapter<?>, DefaultEdge> messageRoute); @@ -54,7 +61,8 @@ public interface IMessageRouter { * {@link DirectedGraph} whose leaves are the target {@link IResourceAdapter}s. */ DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculateMessageRoute( - IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources); + IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources, + PlatformCommunicationGraphEncoding pcgEncoding); /** Returns the route which the given {@link Message} must traverse to deliver its content. */ DirectedGraph<IResourceAdapter<?>, DefaultEdge> getRouteOf(Message msg); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouterBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouter.java similarity index 67% rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouterBase.java rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouter.java index d37da328..9548c8bb 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouterBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouter.java @@ -20,11 +20,11 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message; import org.jgrapht.DirectedGraph; -import org.jgrapht.Graph; import org.jgrapht.graph.DefaultEdge; /** @@ -33,30 +33,34 @@ import org.jgrapht.graph.DefaultEdge; * * @author diewald */ -public abstract class MessageRouterBase implements IMessageRouter { +public class MessageRouter implements IMessageRouter { /** Representation of input system model */ protected SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter; - /** Graph containing the communication graph of the platform onto which the deployment is done. */ - protected Graph<IResourceAdapter<?>, DefaultEdge> platformCommunicationGraph; + private IMessageRouter delegate; /** Contains the calculated routes of the generated {@link Message}s. */ private Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> messagesRoutes; /** Constructs a scheduler for a given input model. */ - protected MessageRouterBase(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) { + public MessageRouter(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) { this.systemModelAdapter = systemModelAdapter; messagesRoutes = new ConcurrentHashMap<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>>(); - platformCommunicationGraph = - systemModelAdapter.getPlatformCommunicationGraph().getActualGraph(); } /** {@inheritDoc} */ @Override public synchronized Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> - calculateMessageRoutes(Collection<Message> messagesToRoute) { + calculateMessageRoutes(Collection<Message> messagesToRoute, + PlatformCommunicationGraphEncoding pcgEncoding, RoutingStrategy strategy) { + // For now, we have only one routing strategy, so define the delegate if it is not already + // constructed. Later, the specific routers can be constructed here, if needed. + if(delegate == null) { + delegate = new ShortestPathRouter(systemModelAdapter); + } + Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> messagesRoutes = new HashMap<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>>(); @@ -64,15 +68,14 @@ public abstract class MessageRouterBase implements IMessageRouter { for(Message currentMessage : messagesToRoute) { DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculatedMessageRoute = calculateMessageRoute(currentMessage.getSender().getTarget(), - currentMessage.getReceiverResources()); + currentMessage.getReceiverResources(), pcgEncoding); // Check if any *invalid* communication were required by the mapping. if(calculatedMessageRoute == null) { return null; } - messagesRoutes.put( - currentMessage, + messagesRoutes.put(currentMessage, calculateMessageRoute(currentMessage.getSender().getTarget(), - currentMessage.getReceiverResources())); + currentMessage.getReceiverResources(), pcgEncoding)); } return messagesRoutes; @@ -83,4 +86,20 @@ public abstract class MessageRouterBase implements IMessageRouter { public DirectedGraph<IResourceAdapter<?>, DefaultEdge> getRouteOf(Message msg) { return messagesRoutes.get(msg); } + + /** {@inheritDoc} */ + @Override + public Map<IResourceAdapter<?>, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> + getRemainingMessageGraphs(Message message, IResourceAdapter<?> processedResource, + DirectedGraph<IResourceAdapter<?>, DefaultEdge> messageRoute) { + return delegate.getRemainingMessageGraphs(message, processedResource, messageRoute); + } + + /** {@inheritDoc} */ + @Override + public DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculateMessageRoute( + IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources, + PlatformCommunicationGraphEncoding pcgEncoding) { + return delegate.calculateMessageRoute(source, receiverResources, pcgEncoding); + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java index 3c85c604..86878edf 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message; @@ -40,7 +41,7 @@ import org.jgrapht.graph.DirectedSubgraph; * * @author diewald */ -public class ShortestPathRouter extends MessageRouterBase { +public class ShortestPathRouter extends MessageRouter { /** Buffers the already calculated shortest paths for the sender {@link IResourceAdapter}. */ private Map<IResourceAdapter<?>, BellmanFordShortestPath<IResourceAdapter<?>, DefaultEdge>> shortestPathForSender; @@ -58,7 +59,8 @@ public class ShortestPathRouter extends MessageRouterBase { /** {@inheritDoc} */ @Override public synchronized DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculateMessageRoute( - IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources) { + IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources, + PlatformCommunicationGraphEncoding pcgEncoding) { // Generates a graph that contains the message's path to each receiver in the following // manner: // - Find the shortest path from the sender to each receiver (using BellmanFord) @@ -68,24 +70,39 @@ public class ShortestPathRouter extends MessageRouterBase { // Check, if the shortest paths have already been calculated for the given sender/source. If // not start a new shortest path analysis using BellmanFord. + // TODO: Disabled caching for now. BellmanFordShortestPath<IResourceAdapter<?>, DefaultEdge> shortestPathForCurrentMessage = - shortestPathForSender.get(source); + null; + // try { + // shortestPathForCurrentMessage = shortestPathForSender.get(source); + // } catch(IllegalArgumentException e) { + // pcgEncoding.display(); + // throw e; + // } + if(shortestPathForCurrentMessage == null) { shortestPathForCurrentMessage = new BellmanFordShortestPath<IResourceAdapter<?>, DefaultEdge>( - platformCommunicationGraph, source); - shortestPathForSender.put(source, shortestPathForCurrentMessage); + pcgEncoding.getActualGraph(), source); + // shortestPathForSender.put(source, shortestPathForCurrentMessage); } for(IResourceAdapter<?> currentReceiver : receiverResources) { - List<DefaultEdge> shortestMessagePath = - shortestPathForCurrentMessage.getPathEdgeList(currentReceiver); + List<DefaultEdge> shortestMessagePath = null; + try { + shortestMessagePath = + shortestPathForCurrentMessage.getPathEdgeList(currentReceiver); + } catch(IllegalArgumentException e) { + pcgEncoding.display(); + throw e; + } + // No valid path between source and receiver => invalid mapping; if(shortestMessagePath == null) { return null; } // Add all vertices and edges. - Graphs.addAllEdges(messageGraph, platformCommunicationGraph, shortestMessagePath); + Graphs.addAllEdges(messageGraph, pcgEncoding.getActualGraph(), shortestMessagePath); } return messageGraph; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java index 67f5294c..ae189da1 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedAcyclicTaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; @@ -80,10 +81,10 @@ public class TDMABusScheduler<S extends InstantiatedTaskMappingEntry, T extends /** Add simple TDMA bus schedule / communication time to a pure task schedule. */ public void schedule(StrictTTSchedule<S, T> schedule, Collection<Message> generatedMessages, - InstantiatedAcyclicTaskGraphEncoding<S, ?> acycItgEnc) { + InstantiatedAcyclicTaskGraphEncoding<S, ?> acycItgEnc, + PlatformCommunicationGraphEncoding pcgEncoding) { Multimap<TimeSlot, Message> emitableMessagesPerSlot = HashMultimap.create(); Map<TimeSlot, Integer> reqRecvMsgsPerSlot = new HashMap<TimeSlot, Integer>(); - // Add the information about the allocated TimeSlots for the senders and the receivers of // the messages to the generated messages. This information stems from the schedule of the // the execution units @@ -99,7 +100,6 @@ public class TDMABusScheduler<S extends InstantiatedTaskMappingEntry, T extends senderSlot.getDeployedRequester().getSource(); message.addMessageSenderTimeSlot(senderSlot); emitableMessagesPerSlot.put(senderSlot, message); - for(InstantiatedTaskMappingEntry receiverEntry : message.getReceiverMappingEntries()) { // If the receiver entry is only executed during the next hyperperiod, do not // consider this receiver here. @@ -118,8 +118,10 @@ public class TDMABusScheduler<S extends InstantiatedTaskMappingEntry, T extends reqRecvMsgsPerSlot.put(recvTimeSlot, numReqMsgs); } } - messageRoutes.put(message, messageRouter.calculateMessageRoute( - message.getSenderTimeSlot().getResource(), message.getReceiverResources())); + // TODO: Why is this needed here? Conceptually, we have a seperate message router. + messageRoutes.put(message, + messageRouter.calculateMessageRoute(message.getSenderTimeSlot().getResource(), + message.getReceiverResources(), pcgEncoding)); } // Construct a message queue whose ordering defines the type of scheduling, i.e. ESF, EDF diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java index a107f56a..7c5b263a 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java @@ -16,6 +16,8 @@ package org.fortiss.af3.exploration.alg.graph; import static org.apache.commons.collections4.CollectionUtils.isEqualCollection; +import static org.fortiss.af3.exploration.util.ExplorationUtils.isDebugVerboseEnabled; +import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; import java.util.ArrayList; import java.util.Collection; @@ -35,12 +37,11 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.exception.MissingDependencyException; 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.graph.display.ObjectJGraphTVisualizer; import org.fortiss.af3.exploration.alg.util.GraphUtils; -import org.jgrapht.DirectedGraph; import org.jgrapht.Graphs; import org.jgrapht.experimental.dag.DirectedAcyclicGraph; import org.jgrapht.experimental.dag.DirectedAcyclicGraph.CycleFoundException; -import org.jgrapht.graph.DefaultDirectedGraph; import org.opt4j.core.optimizer.IncompatibilityException; import org.opt4j.core.problem.Creator; import org.opt4j.core.problem.Decoder; @@ -78,8 +79,11 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend /** Operators which implement an identity operation. */ private Multimap<Class<? extends V>, T> identityOperators = HashMultimap.create(); + private Map<Class<? extends V>, T> pureIdentityOperators = new HashMap<>(); + /** Constructor. */ - public DependencyGraph(Set<Class<? extends V>> reqTypeCollection, Class<? extends V> vertexType) { + public DependencyGraph(Set<Class<? extends V>> reqTypeCollection, + Class<? extends V> vertexType) { requestedTypes = reqTypeCollection; this.vertexType = vertexType; } @@ -102,14 +106,18 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend // Decoder graph. Add vertices, then edges. dependencyDagGraph.addVertex(outType); requiredTypes.forEach(p -> dependencyDagGraph.addVertex(p)); + if(requiredTypes.size() == 1 && + (getFirst(requiredTypes).orElse(null) == edgeOperator.getOutputType())) { + pureIdentityOperators.put(getFirst(requiredTypes).get(), edgeOperator); + } for(Class<? extends V> inputPheno : requiredTypes) { // Allow Identity Decoders. if(inputPheno.equals(edgeOperator.getOutputType())) { identityOperators.put(inputPheno, edgeOperator); } else { - E edge = dependencyDagGraph.getEdge(inputPheno, outType); + E edge = dependencyDagGraph.getEdge(outType, inputPheno); if(edge == null) { - edge = dependencyDagGraph.addDagEdge(inputPheno, outType); + edge = dependencyDagGraph.addDagEdge(outType, inputPheno); } edge.addDecoder(edgeOperator); } @@ -127,9 +135,9 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend Collection<Class<? extends V>> castedInputTypes = new HashSet<>(); for(Class<?> curInputType : module.getRequiredTypes()) { if(curInputType.isAssignableFrom(vertexType)) { - throw new IncompatibilityException("The required input type " + - curInputType.getSimpleName() + " is not an " + vertexType.getSimpleName() + - "."); + throw new IncompatibilityException( + "The required input type " + curInputType.getSimpleName() + " is not an " + + vertexType.getSimpleName() + "."); } castedInputTypes.add((Class<? extends V>)curInputType); } @@ -161,17 +169,17 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend */ private void calculateExecutionOrder() throws MissingDependencyException { // TODO: add comments to explain the resoning inside this method. - @SuppressWarnings("unchecked") DirectedGraph<Class<? extends V>, E> execOrderGraph = - new DefaultDirectedGraph<>((Class<? extends E>)DependencyEdge.class); + @SuppressWarnings("unchecked") DirectedAcyclicGraph<Class<? extends V>, E> execOrderGraph = + new DirectedAcyclicGraph<>((Class<? extends E>)DependencyEdge.class); Queue<Class<? extends V>> inputTypes = new LinkedList<>(); Set<Class<? extends V>> traversedTypes = new HashSet<>(); Set<E> requiredOperators = new HashSet<>(); inputTypes.addAll(requestedTypes); while(!inputTypes.isEmpty()) { @SuppressWarnings("unchecked") Class<V> operatorInputType = (Class<V>)inputTypes.poll(); - requiredOperators.addAll(dependencyDagGraph.incomingEdgesOf(operatorInputType)); + requiredOperators.addAll(dependencyDagGraph.outgoingEdgesOf(operatorInputType)); for(E edge : requiredOperators) { - Class<? extends V> srcType = dependencyDagGraph.getEdgeSource(edge); + Class<? extends V> srcType = dependencyDagGraph.getEdgeTarget(edge); if(!traversedTypes.contains(srcType)) { inputTypes.add(srcType); traversedTypes.add(srcType); @@ -179,13 +187,13 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend } } - Collection<Class<? extends V>> inTypes = - requiredOperators.stream().map(d -> dependencyDagGraph.getEdgeSource(d)) - .collect(Collectors.toList()); - getIdentityOperatorsOf(inTypes).entrySet().forEach( - e -> identityOperators.put(e.getKey(), e.getValue())); - getIdentityOperatorsOf(requestedTypes).entrySet().forEach( - e -> identityOperators.put(e.getKey(), e.getValue())); + // required Operators --> additional Identity decoders. + Collection<Class<? extends V>> inTypes = requiredOperators.stream() + .map(d -> dependencyDagGraph.getEdgeSource(d)).collect(Collectors.toList()); + getIdentityOperatorsOf(inTypes).entrySet() + .forEach(e -> identityOperators.put(e.getKey(), e.getValue())); + getIdentityOperatorsOf(requestedTypes).entrySet() + .forEach(e -> identityOperators.put(e.getKey(), e.getValue())); for(E edge : requiredOperators) { Graphs.addEdgeWithVertices(execOrderGraph, dependencyDagGraph, edge); @@ -193,19 +201,19 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend // DEBUG code: only include if the dependency graph shall be debugged. Otherwise, two // windows for each individual and iteration will be produced. - // if(isDebugVerboseEnabled()) { - // ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz = - // new ObjectJGraphTVisualizer<Class<? extends V>, E>(dependencyDagGraph); - // graphViz.displayGraph("Dependency graph"); - // - // } - // - // if(isDebugVerboseEnabled()) { - // ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz = - // new ObjectJGraphTVisualizer<Class<? extends V>, E>(execOrderGraph); - // graphViz.displayGraph("Dependency graph (Exec Order)"); - // - // } + if(isDebugVerboseEnabled()) { + ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz = + new ObjectJGraphTVisualizer<Class<? extends V>, E>(dependencyDagGraph); + graphViz.displayGraph("Dependency graph"); + + } + + if(isDebugVerboseEnabled()) { + ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz = + new ObjectJGraphTVisualizer<Class<? extends V>, E>(execOrderGraph); + graphViz.displayGraph("Dependency graph (Exec Order)"); + + } calculateExecOrderList(execOrderGraph); @@ -226,30 +234,26 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend * Calculates the effective execution order of the operators and adds them to the internal list * of {@code this} {@link DependencyGraph}. */ - private void calculateExecOrderList(DirectedGraph<Class<? extends V>, E> execOrderGraph) { - Queue<Class<? extends V>> traversalQueue = new LinkedList<>(); - traversalQueue.addAll(requestedTypes); - - while(!traversalQueue.isEmpty()) { - Class<? extends V> encType = traversalQueue.poll(); - - if(execOrderGraph.containsVertex(encType)) { - for(E decoderEdge : execOrderGraph.incomingEdgesOf(encType)) { - decoderEdge.getElements().forEach(e -> operatorExecOrder.addFirst(e)); - - // If not yet present, consider the results for the iteration over the next - // "graph layer". - Class<? extends V> decInputType = execOrderGraph.getEdgeSource(decoderEdge); - if(decInputType != null && !traversalQueue.contains(decInputType)) { - traversalQueue.add(decInputType); + private void + calculateExecOrderList(DirectedAcyclicGraph<Class<? extends V>, E> execOrderGraph) { + Iterator<Class<? extends V>> encodingIter = execOrderGraph.iterator(); + while(encodingIter.hasNext()) { + Class<? extends V> encoding = encodingIter.next(); + // Itentity Decoders must be launched as soon as possible to forward the produced + // phenoytpes to the later steps. + T identDec = pureIdentityOperators.get(encoding); + if(identDec != null) { + operatorExecOrder.addFirst(identDec); + } + Collection<E> launchableDecoders = execOrderGraph.outgoingEdgesOf(encoding); + for(E decoderEdge : launchableDecoders) { + // assert (decoderEdge.getElements().size() == 1); + for(T dec : decoderEdge.getElements()) { + if(!operatorExecOrder.contains(dec)) { + operatorExecOrder.addFirst(dec); } } } - - if(identityOperators.containsKey(encType)) { - identityOperators.get(encType).stream().filter(i -> !operatorExecOrder.contains(i)) - .forEach(i -> operatorExecOrder.addFirst(i)); - } } if(getSubExecListComparator() != null) { @@ -325,20 +329,28 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend * Returns a collection of identity operators which operate on the given input types. The set of * operators to be checked equals the set of operators in the graph. */ - private Map<Class<? extends V>, T> getIdentityOperatorsOf( - Collection<Class<? extends V>> encodingTypes) { + private Map<Class<? extends V>, T> + getIdentityOperatorsOf(Collection<Class<? extends V>> encodingTypes) { Map<Class<? extends V>, T> filteredIdentityOperators = new HashMap<>(); for(E edge : dependencyDagGraph.edgeSet()) { Class<? extends V> srcType = dependencyDagGraph.getEdgeSource(edge); if((srcType == dependencyDagGraph.getEdgeTarget(edge)) && encodingTypes.contains(srcType)) { - assert (edge.getElements().size() > 1) : "Only one identity decoder for each element type is supported."; + assert (edge.getElements() + .size() > 1) : "Only one identity decoder for each element type is supported."; filteredIdentityOperators.put(srcType, edge.getElements().stream().findAny().get()); } } return filteredIdentityOperators; } + // private Map<Class<? extends V>, T> + // getPureIdentityOperators(Collection<Class<? extends V>> encodingTypes) { + // for(Class<? extends V> encoding : encodingTypes) { + // + // } + // } + /** * Comparator to allow ordering of operator lists by means of the execution * order defined in a {@link DependencyGraph}. diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java index eab4f4f6..a2cdd4a5 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java @@ -39,6 +39,9 @@ public class NamedVertex<V extends IModelElementAdapter<?>> implements Serializa /** {@inheritDoc} */ @Override public String toString() { + if(namedElement == null) { + return super.toString(); + } return namedElement.getName() + "(ID: " + namedElement.getId() + ")"; } } -- GitLab