From 4f2ac2c617a7f5f061ea5a766bb270784121152a Mon Sep 17 00:00:00 2001
From: Nikolaus Huber <nikolaus.huber@uni-wuerzburg.de>
Date: Wed, 29 May 2013 14:45:52 +0000
Subject: [PATCH] - evaluation of objectives implemented - some changes when
 initializing the process, ie., creating the event

git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/code/DMM/trunk@11815 9e42b895-fcda-4063-8a3b-11be15eb1bbd
---
 .../adaptation/AdaptationControl.java         | 62 ++++++++++---------
 .../WeightedSumCalculator.java                |  1 -
 .../WeightingFunctionHelper.java              | 12 ++--
 .../model/dmm/util/ObjectivesHelper.java      | 46 ++++++++++++++
 .../IPerformanceDataRepositoryHandler.java    |  6 +-
 .../ObservationRepositoryHandler.java         |  9 +++
 .../PerformanceDataRepositoryHandler.java     |  7 +++
 7 files changed, 105 insertions(+), 38 deletions(-)
 rename edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/{model/dmm/util => evaluation/weightingfunction}/WeightingFunctionHelper.java (88%)
 create mode 100644 edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/ObjectivesHelper.java

diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
index 27667da1..ec5d51dd 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
@@ -15,9 +15,9 @@ import edu.kit.ipd.descartes.adaptation.model.analysis.IModelAnalyzer;
 import edu.kit.ipd.descartes.adaptation.model.analysis.pcm.PcmModelAnalyzer;
 import edu.kit.ipd.descartes.adaptation.model.dmm.AdaptationProcessModelLoader;
 import edu.kit.ipd.descartes.adaptation.model.dmm.DmmModelActionHandler;
+import edu.kit.ipd.descartes.adaptation.model.dmm.util.ObjectivesHelper;
 import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.IPerformanceDataRepositoryHandler;
 import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerformanceDataRepositoryHandlerFactory;
-import edu.kit.ipd.descartes.mm.adaptation.AdaptationFactory;
 import edu.kit.ipd.descartes.mm.adaptation.AdaptationProcess;
 import edu.kit.ipd.descartes.mm.adaptation.Event;
 import edu.kit.ipd.descartes.mm.adaptation.Strategy;
@@ -68,15 +68,15 @@ public class AdaptationControl {
     private String eventType = null;
 
     private AdaptationProcessModelLoader adaptationProcessModelLoader = AdaptationProcessModelLoader.getInstance();
-    private IPerformanceDataRepositoryHandler handler;
+    private IPerformanceDataRepositoryHandler perfdatarepo;
     private AdaptationProcess adaptationProcess = null;
     private TacticExecutor executor = null;
     private IModelAnalyzer modelAnalyzer = null;
     private WeightingFunctionEvaluator evaluator = null;
 
-    private boolean problemSolved = false;
     private int iteration = 0;
     private int maxIterations = 0;
+    private Event cause;
 
     /**
      * @param args
@@ -89,19 +89,19 @@ public class AdaptationControl {
         String propertiesfile = args[0];
 
         AdaptationControl adaptationController = new AdaptationControl();
-        // Initialize controller (load models, create Action handler, etc.)
+        // Initialize controller (load models, create Action perfdatarepo, etc.)
         adaptationController.init(propertiesfile);
-        Event triggeringEvent = adaptationController.createTriggeringEvent();
+        Event triggeringEvent = adaptationController.findTriggeringEvent();
 
         // trigger adaptation process
         adaptationController.doAdaptation(triggeringEvent);
     }
 
-    public void doAdaptation(Event triggeringEvent) {
+    public void doAdaptation(Event event) {
 
         // Determine the suitable strategy via the objective
         // which is currently implemented as the first element
-        Strategy currentStrategy = AdaptationControl.findTriggeredStrategy(adaptationProcess, triggeringEvent);
+        Strategy currentStrategy = findTriggeredStrategy(event);
         if (currentStrategy == null) {
             logger.error("No strategy found to handle this event!");
             abort();
@@ -135,6 +135,13 @@ public class AdaptationControl {
 
     }
 
+    private boolean isProblemSolved() {
+        boolean flag = ObjectivesHelper.isProblemSolved(cause, perfdatarepo.getCurrentSystemState());
+        if (flag)
+            logger.debug("Problem that caused event " + cause.getName() + " has been solved.");
+        return flag;
+    }
+
     public void init(String propertiesFile) {
         try {
             // load properties file
@@ -145,8 +152,8 @@ public class AdaptationControl {
 
             // load required models
             adaptationProcess = adaptationProcessModelLoader.load(URI.createFileURI(adaptationProcessXmiFilePath));
-            handler = PerformanceDataRepositoryHandlerFactory.createHandler(pdrMetamodelType);
-            handler.load(performanceDataRepoXmiFilePath);
+            perfdatarepo = PerformanceDataRepositoryHandlerFactory.createHandler(pdrMetamodelType);
+            perfdatarepo.load(performanceDataRepoXmiFilePath);
 
             // set handlers
             executor = new TacticExecutor(new DmmModelActionHandler());
@@ -188,7 +195,7 @@ public class AdaptationControl {
     }
 
     // Creates an "artifical event". Will be replaced later when integrated in the system
-    private Event createTriggeringEvent() {
+    private Event findTriggeringEvent() {
         EventType type = EventType.getEventType(eventType);
 
         if (type == null) {
@@ -196,16 +203,20 @@ public class AdaptationControl {
             abort();
         }
 
-        Event triggeringEvent = AdaptationFactory.eINSTANCE.createEvent();
-        triggeringEvent.setName(type.name);
-        triggeringEvent.setId(type.id);
+        for (Strategy strategy : adaptationProcess.getStrategies()) {
+            Event event = strategy.getTriggeringEvents();
+            if (event.getId().equals(type.id)&&event.getName().equals(type.name)){
+                cause = event;
+                return event;
+            }
+        }
 
-        return triggeringEvent;
+        return null;
     }
 
     private void processResults(WeightedTactic tactic) {
 
-        Impact latestImpact = handler.getImpactAt(iteration);
+        Impact latestImpact = perfdatarepo.getImpactAt(iteration);
         // Connect parsed results to the executed tactic
         if (latestImpact != null)
             tactic.setLastImpact(latestImpact);
@@ -219,29 +230,20 @@ public class AdaptationControl {
         executor.applyTactic(weightedTactic);
     }
 
-    private boolean isProblemSolved() {
-        // TODO evaluate the results (problem solved?)
-        // TODO Implement correct check of objective
-        return problemSolved;
-    }
-
     private void printLogInformation() {
         TacticsHistory hist = TacticsHistory.getInstance();
         hist.printToSysOut();
     }
 
-    private static Strategy findTriggeredStrategy(AdaptationProcess staRepo, Event triggeringEvent) {
-
-        String eventName = triggeringEvent.getName();
-        String eventId = triggeringEvent.getId();
+    private Strategy findTriggeredStrategy(Event event) {
 
-        logger.debug("Caught event: " + eventName + " (ID: " + eventId + ")");
+        logger.debug("Searching for suitable strategy for caught event: " + event.getName() + " (ID: " + event.getId() + ")");
 
-        for (Strategy strategy : staRepo.getStrategies()) {
-            if (strategy.getTriggeringEvents().getId().equals(eventId)
-                    && strategy.getTriggeringEvents().getName().equals(eventName)) {
+        for (Strategy strategy : adaptationProcess.getStrategies()) {
+            if (strategy.getTriggeringEvents().getId().equals(event.getId())
+                    && strategy.getTriggeringEvents().getName().equals(event.getName())) {
                 logger.debug("Found suitable strategy " + strategy.getName() + " for event "
-                        + triggeringEvent.getName());
+                        + event.getName());
                 return strategy;
             }
         }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java
index 3b25a9ec..ebc3697a 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java
@@ -3,7 +3,6 @@ package edu.kit.ipd.descartes.adaptation.evaluation.weightingfunction;
 import org.apache.log4j.Logger;
 import org.eclipse.emf.common.util.EList;
 
-import edu.kit.ipd.descartes.adaptation.model.dmm.util.WeightingFunctionHelper;
 import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
 import edu.kit.ipd.descartes.mm.adaptation.WeightingFunction;
 import edu.kit.ipd.descartes.perfdatarepo.Impact;
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/WeightingFunctionHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightingFunctionHelper.java
similarity index 88%
rename from edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/WeightingFunctionHelper.java
rename to edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightingFunctionHelper.java
index 7a3d953d..75ecdd9d 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/WeightingFunctionHelper.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightingFunctionHelper.java
@@ -1,4 +1,4 @@
-package edu.kit.ipd.descartes.adaptation.model.dmm.util;
+package edu.kit.ipd.descartes.adaptation.evaluation.weightingfunction;
 
 import org.apache.log4j.Logger;
 import org.eclipse.emf.common.util.EList;
@@ -42,12 +42,12 @@ public class WeightingFunctionHelper {
      * 
      * @param metricType
      *            The type of the metric to find
-     * @param resultBefore
+     * @param result
      *            The result to search
      * @return
      */
-    public static double getValueForMetricType(MetricType metricType, Result resultBefore) {
-        EList<MetricValue> metricValues = resultBefore.getMetricValues();
+    public static double getValueForMetricType(MetricType metricType, Result result) {
+        EList<MetricValue> metricValues = result.getMetricValues();
 
         for (MetricValue metricValue : metricValues) {
             if (sameMetricType(metricValue, metricType))
@@ -58,7 +58,7 @@ public class WeightingFunctionHelper {
 
     public static boolean sameMetricType(MetricValue metricValue, MetricType metricType) {
 //        return metricValue.getMetricType().equals(metricType);
-        return (metricValue.getMetricType().getName().equals(metricType.getName()) 
-                && metricValue.getMetricType().getId().equals(metricType.getId()));
+        return (metricValue.getMetricType().getName().equals(metricType.getName())); 
+//                && metricValue.getMetricType().getId().equals(metricType.getId()));
     }
 }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/ObjectivesHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/ObjectivesHelper.java
new file mode 100644
index 00000000..65851ed9
--- /dev/null
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/ObjectivesHelper.java
@@ -0,0 +1,46 @@
+package edu.kit.ipd.descartes.adaptation.model.dmm.util;
+
+import java.util.List;
+
+import edu.kit.ipd.descartes.adaptation.evaluation.weightingfunction.WeightingFunctionHelper;
+import edu.kit.ipd.descartes.mm.adaptation.Event;
+import edu.kit.ipd.descartes.mm.adaptation.RelationalOperator;
+import edu.kit.ipd.descartes.mm.adaptation.Specification;
+import edu.kit.ipd.descartes.perfdatarepo.MetricType;
+import edu.kit.ipd.descartes.perfdatarepo.Result;
+
+public class ObjectivesHelper {
+
+    public static boolean compare(double left, double right, RelationalOperator operator) {
+        switch (operator) {
+        case EQUAL:
+            return left == right;
+        case NOT_EQUAL:
+            return left != right;
+        case LESS:
+            return left < right;
+        case LESS_EQUAL:
+            return left <= right;
+        case GREATER:
+            return left > right;
+        case GREATER_EQUAL:
+            return left >= right;
+        default:
+            return false;
+        }
+    }
+
+    public static boolean isProblemSolved(Event event, Result result) {
+        List<Specification> specs = event.getTriggers().getObjective().getSpecifications();
+        for (Specification specification : specs) {
+            MetricType m = specification.getMetricType();
+            Double actualValue = WeightingFunctionHelper.getValueForMetricType(m, result);
+            Double threshold = specification.getValue();
+            if (!ObjectivesHelper.compare(actualValue, threshold, specification.getRelationalOperator()))
+                return false;
+
+        }
+        return true;
+    }
+
+}
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/IPerformanceDataRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/IPerformanceDataRepositoryHandler.java
index 041da5dd..7e55c871 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/IPerformanceDataRepositoryHandler.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/IPerformanceDataRepositoryHandler.java
@@ -1,12 +1,16 @@
 package edu.kit.ipd.descartes.adaptation.model.perfdatarepo;
 
 import edu.kit.ipd.descartes.perfdatarepo.Impact;
+import edu.kit.ipd.descartes.perfdatarepo.Result;
 
 public interface IPerformanceDataRepositoryHandler {
     
+    public void load(String modelFileUri);
+
+    
     public Impact getLatestImpact();
     public Impact getImpactAt(int position);
 
-    public void load(String modelFileUri);
+    public Result getCurrentSystemState();
 
 }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java
index c2022c92..7fccdc8a 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java
@@ -1,12 +1,14 @@
 package edu.kit.ipd.descartes.adaptation.model.perfdatarepo;
 
 import static edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter.convertObservableImpact;
+import static edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter.convertResult;
 
 import org.apache.log4j.Logger;
 import org.eclipse.emf.common.util.URI;
 
 import edu.kit.ipd.descartes.adaptation.model.AbstractEcoreModelLoader;
 import edu.kit.ipd.descartes.perfdatarepo.Impact;
+import edu.kit.ipd.descartes.perfdatarepo.Result;
 import edu.kit.ipd.descartes.ql.models.repository.ObservationRepository;
 
 public class ObservationRepositoryHandler implements IPerformanceDataRepositoryHandler {
@@ -14,6 +16,7 @@ public class ObservationRepositoryHandler implements IPerformanceDataRepositoryH
     private static Logger logger = Logger.getLogger(ObservationRepositoryHandler.class);
     private AbstractEcoreModelLoader modelLoader = null;
     private ObservationRepository repository = null;
+    private int iteration = 0;
     
     public ObservationRepositoryHandler() {
         modelLoader = new ObservationRepositoryModelLoader();
@@ -27,6 +30,7 @@ public class ObservationRepositoryHandler implements IPerformanceDataRepositoryH
 
     @Override
     public Impact getImpactAt(int position) {
+        iteration++; //This is a hack, see getCurrentSystemState()
         if (position > repository.getImpacts().size() - 1)
             return null;
         return convertObservableImpact(repository.getImpacts().get(position));
@@ -37,4 +41,9 @@ public class ObservationRepositoryHandler implements IPerformanceDataRepositoryH
         repository = (ObservationRepository) modelLoader.load(URI.createFileURI(modelFileUri));
     }
 
+    @Override
+    public Result getCurrentSystemState() {
+        return convertResult(repository.getObservations().get(iteration));
+    }
+
 }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java
index 72305a2d..2c2f14f0 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java
@@ -5,6 +5,7 @@ import org.eclipse.emf.common.util.URI;
 
 import edu.kit.ipd.descartes.perfdatarepo.Impact;
 import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository;
+import edu.kit.ipd.descartes.perfdatarepo.Result;
 
 public class PerformanceDataRepositoryHandler implements IPerformanceDataRepositoryHandler {
     
@@ -32,4 +33,10 @@ public class PerformanceDataRepositoryHandler implements IPerformanceDataReposit
         return PerfDataRepoHelper.getImpactAt(repository, position);
     }
 
+    @Override
+    public Result getCurrentSystemState() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }
-- 
GitLab