From f1d7631385a70fb7ad3dc83d16ba973e0411bf48 Mon Sep 17 00:00:00 2001 From: Alexander Diewald <diewald@fortiss.org> Date: Thu, 22 Jun 2017 18:00:14 +0000 Subject: [PATCH] - Correctly respect allocation constraints: Outdated if caused a random assignment for single components in the mutateAllocation Operation. - Re-add check for the allocation constraints in the corresponding evaluator. --- .../taskmapping/TaskMappingEncoding.java | 4 +-- .../mutate/taskmapping/MutateAllocation.java | 2 +- .../mutate/taskmapping/MutateRedundancy.java | 2 +- ...entMultiAllocationConstraintEvaluator.java | 26 ++++++++++++++++--- 4 files changed, 27 insertions(+), 7 deletions(-) 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 fbf29321..336efb43 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 @@ -610,8 +610,8 @@ public abstract class TaskMappingEncoding<T extends TaskMappingEntry> implements * Determines if a deployable component is subject to a * {@link ComponentMultiAllocationConstraint} */ - public boolean hasFixedDeployment(IDeployableComponentAdapter<?> deployableComponent) { - return fixAllocatedComponents.contains(deployableComponent); + public boolean hasLimitedDeployment(IDeployableComponentAdapter<?> deployableComponent) { + return allowedAllocations.containsKey(deployableComponent); } // TODO: Do not handle this in the encodings / mutation operators! diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateAllocation.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateAllocation.java index 065a02d1..88e26652 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateAllocation.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateAllocation.java @@ -111,7 +111,7 @@ public class MutateAllocation<S extends TaskMappingEntry, T extends TaskMappingE S selectedEntry = assignedResources.get(selIdx); // This respects {@link ExcludeDeploymentConstraint}s. - if(encoding.hasFixedDeployment(deployableComponent)) { + if(encoding.hasLimitedDeployment(deployableComponent)) { List<IExecutionUnitAdapter<?>> targets = new ArrayList<>(encoding.getAllowedAllocations(deployableComponent)); int selExecU = max(0, rand.nextInt(targets.size()) - 1); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateRedundancy.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateRedundancy.java index 1c2a70f7..04021472 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateRedundancy.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/taskmapping/MutateRedundancy.java @@ -51,7 +51,7 @@ public abstract class MutateRedundancy<S extends TaskMappingEntry, T extends Tas // TODO: remove filter for fixed Deployment: It is not needed. // No replication for Components with a fixed Deployment & Components which shall // not be replicated (see the SystemModelAdapter). - if(!encoding.hasFixedDeployment(deployableComponent) && + if(!encoding.hasLimitedDeployment(deployableComponent) && systemModelAdapter.getReplicableComponents().contains(deployableComponent)) { // TODO: Model minimum and maximum replication count as constraint? diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java index 17ee3331..6ca9f70d 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java @@ -32,6 +32,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; import org.fortiss.af3.exploration.model.ExplorationTarget; import org.fortiss.af3.exploration.moea.model.predefined.ComponentMultiAllocationConstraint; @@ -64,7 +65,12 @@ public class ComponentMultiAllocationConstraintEvaluator<S extends InstantiatedT @Override public DoubleValue evaluateGoal(T phenotype, FlatPhenotypeMap<Phenotype> phenotypeTypeMap, ClassToInstanceMap<EObject> transformedModels) { - // Already considered in the operators. + for(IMappingEntry mappingEntry : phenotype.getIMappingEntries()) { + if(optTarget.getAllRightMultiLocationModelElements().contains( + mappingEntry.getDeployableComponent().getObject())) { + return new DoubleValue(Double.MAX_VALUE); + } + } return new DoubleValue(0.0); } @@ -102,8 +108,22 @@ public class ComponentMultiAllocationConstraintEvaluator<S extends InstantiatedT @Override public boolean validateInternal(ExplorationTarget<?> expTarget, T solution, SolutionQuantification value) { - // Already considered in the operators. - // TODO: Just to be safe: add a real check. + + Collection<IMappingEntry> entries = + solution.getIMappingEntriesOf(systemModelAdapter + .getDeployableComponentOf(((ComponentMultiAllocationConstraint)expTarget) + .getComponent())); + + if(entries.isEmpty()) { + return false; + } + + for(IMappingEntry entry : entries) { + if(!((ComponentMultiAllocationConstraint)expTarget).getExecutionUnits().contains( + entry.getTarget().getObject())) { + return false; + } + } return true; } -- GitLab