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 fae01031651707e756ab95311533ab3f282a4d18..59585161d4a0b6de7ebc63e20254e43b9f363fdf 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 a4d04fec6271a42f85468f7612c1bda06718fdd2..554a98ede976ad4703868a2b69ab1b5190df27b8 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 0815c8897837e8c5ef154047f1a89b9e85439537..518ebf3e450edf2683f4fa7b9a71c09cce5d302d 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 fcc00dfbc6f79c6629eb77798ded1d80243d4966..f934f458f9f1a9bcebaf0c6e94d0053ea9a7d419 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 2e175344ebc6f860f9b2c1b7939477a84d7365e2..4635030612f9bead07f75917350464588be01d21 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 0000000000000000000000000000000000000000..7178369b995018a2b4f431577fd07c3f00d3ef15 --- /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 044eecaf018eda1b5396169559e93f723909a71b..80c2fe78cad8d05172a9b6c9a29b07c590879d59 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 5c618d4eb7e35323bc0b476e140f5b2ea32b43c0..057c56f8940e520cf9015b6ef6004a99a7116777 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 fb22cc96b117aa611f718a48b1a57d96d4088699..1ad321a36bb05cc343b939e2d6ce7f63a1ec1b79 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 b9a9289f12e0055900ff9e694e46fcd97c72c349..1af8d4e9544e3493329d93fc5d948b9d5e0bb158 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 0000000000000000000000000000000000000000..7128803a0c438a32e9c9868caa3161b3d3c94af9 --- /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 690e2fc5a2f04e8dc85263bb71046f93a32b4e1f..2b7476fd937094bbb7bae71dbf1db1558dece4e1 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 4f4ca6345654759a9f18718e2f33db422fa55cbe..da713dc7abeee26cf97935316ba178057dd6465e 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 b2ae690110e9261733592a4e04a7f9ac28a83237..7b08725024fc7386d57739e60d8865c5d61671b0 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 dcfe74af5ccdd9b02a394e8b438cba3b0583e4a5..3ff346fe82d68a65613d2aead325fd4967b53f6c 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 a6f89aae97ccc08a7136035a664fd239af80d100..6a4183ae1892e4c016ddfff291508ab2ebd0ed1d 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 d89ea96309f76aefaa9bada3421fe78360e215d8..a1aba7352f4b4dcef3443583cfe5aa7a2ed9103d 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 f9c8b7b5cbb1bd827c44a2da87655cf768b334d2..b63db2537140c5e9f4d48f0c2617cc37908793a6 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 eaf66fe60b01394575da9443dd5e4e10d9facb72..fc32f1b315506dfb255df78234e18ac868a782a4 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 fdd5d9d0d2e6b9bca769b61e54526568ed9e19b1..b631f18f29fe2c016a911baf661056d7222d6632 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 1633c9c5912603cd2746654885d39b25c1dc591f..06b23dd5cbc2004e8a8d7dfc47629cbaacedfea2 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 2a5e12e6093bcc4e25ad8c3a32a7abd2ce72bc40..641348ea8742dd1dc41770b434263c227aeecc87 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 0000000000000000000000000000000000000000..940b8a0b104f8ee9809c53fa8d364cd3c892854d --- /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 0000000000000000000000000000000000000000..ff27643cf25d732fd46106847a544d5a0bc4a39e --- /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 7dd68378b8233d955cb1a30363a34eb82b491d4f..41356d99a196d9e50c19653a395f6d33945420af 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 0000000000000000000000000000000000000000..b7589a430adad3c0221ab26ccedb68c45645875d --- /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 0000000000000000000000000000000000000000..fbad012d253b15353a0bd4d64b0a3ad93fdccd3e --- /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 0000000000000000000000000000000000000000..6cc7d102046e582360a62dcf12a24806f6525df5 --- /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 e983d69f5a64ac1d0eacb9d9d8d13ba332fa8aaa..ee5d6032c8e256b2f9130b958302ec1e608da571 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 0000000000000000000000000000000000000000..65589cc7a519b6acb1665724b22a7c3d837cf526 --- /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 92aeaecfda03a0d4d488bd32a53b5173a5e16c22..03916df25d10ce6940002dab8ca4c00da844a098 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 b1128015052d2b98a348f80f3614c444ba16c052..9a90cb321239c021118e5c520bb0772fafd6b5fd 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 c626056e9952638b6b4cb2e103f871eaecf9b0b0..c029197cc557a90b74dd9b67fb1c9e859460e213 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 e03b667c48cb3ff229089cd5cce93549c51ed83f..42983f8246ce3a6c13500c659c8f78ac659b337e 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 0000000000000000000000000000000000000000..eef9693bd5f05fb3aa8d7bfb870ad5f34e6ba75e --- /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 0000000000000000000000000000000000000000..dcdd804f5be4dcd62cedcd3f97d97a01546f2b5c --- /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 247cd21474676358ab279672bb218658cd6468dc..e4ada07b638432130b8e03cb7d858e856868356e 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 a87044ac0d7662bd90c362c12f36dc21cca3ef21..39eaf80fd19f63c24f8a6e51b71f36d9684f637f 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 ac569f6ad91c84c949136d4328e863908f711398..e83a6b85cd81a8e9e045246f67fb95c7a40bd5db 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 35fc43348abfa80f8503a1b380fdf9307d207946..651363256a2fb386dbb53c9e44da0ecb641895df 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 1726e6d8ddc8f3a56df166f9814b3f06c9100857..65d9b47f0b11ef1f4a58b0a6e330a0d110ca75e6 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 0000000000000000000000000000000000000000..98eea0ce4e8aa8fe5d572c5442eaf2dafbf23099 --- /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 2eb9f2fbb3c5fbc6537d069af86e138ea46bf8ea..bf0423025a24af20211e5af1af01d25a34550cef 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 897e427645239764a01a35b63e31162551523fd8..ecb43eb9736fbee52b21d8df75ee3c275e4fe140 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 66bab92a69e3bd41fc8c14794cb72a8a6b9308fd..9e0033f52aa4497dd9311c1a58688108a7003168 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 0000000000000000000000000000000000000000..0a40b2dbf9b21c13022894c49b3bde0ba67d2934 --- /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 db33fd924c23136b7b9402a94e1db3f7b689431a..ca518264c9e07182b66b878bdd2e3b7ae481ba23 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 dabe0f2c64dc6e856ec3fe4ff78152f926cecd6e..c3746755125fff2101f2fc43c91484ce1bc68cc9 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 172690d0b68a7c2ecb747d006d18fc4ddcc1084e..629b43d63e352c29bc7da0f3db53c75095abd9ce 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 5d0e67ba7171e68dd56ca5d8722c7a614c5a4dfc..a3a217f44d4e05f06069878ecd4d833a98a3af19 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 98d295f4510e53f8ff5fcc8cdc02c078323f3341..24efbb94777ecefa50eb14ccfe1f7f3c42924cdf 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 db78fd261a084f04d4346ad838418c28926c7351..7153d4bed804aa8b7673631b8e80237709f9d3e4 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 9d243ce574d2f0acc1cd7dcc14f0370e17570287..0000000000000000000000000000000000000000 --- 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 3683f263619818b2fd1b80c580fdc11003c9af2e..ac3d139ebe9644d5d078985add090745bff72afd 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 87be31ed7220d64fbd7f93328fc3886249a6fe06..14cb34aa0db6985c8c82f17b8c75fda73e29e9d1 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 481b0e7798918d11f5d896028bd23800453475e8..623841b578be1887b813db008f3f45631521cfc2 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 ac16e64e722e997c21f49b7110009c30f50c301c..84560179af261a2eb3ae1c3163ba3d2367810267 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 1ec90ec9a181fb9ffa2778dd0a04363b03d9bf00..d70bea0a6e06bc4d44f1fe2e9275e4f6668f3bac 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 d37da328c35e001388bcfc79c7936121a9859464..9548c8bb361df0a94b7a5c386bb0d8217e020827 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 3c85c604093478670035faa9911596c72be26972..86878edf838e472fdfb479ff0152a058029d6a9d 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 67f5294c40f046b6b595a3171139b15e9f7e82f7..ae189da1efb378babd41611cd9515bf980e7fee2 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 a107f56ac6bd8b91f3eb39e9a70011c3093a9bcd..7c5b263a7fd3dc96443ee6d842e94f10511774c6 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 eab4f4f6dfa2a6f091331eaf51ea0875015c67b0..a2cdd4a51ef197955fa34538524a97c7eac07ff0 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() + ")"; } }