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