Skip to content
Snippets Groups Projects
Commit 4f2ac2c6 authored by Nikolaus Huber's avatar Nikolaus Huber
Browse files

- 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
parent 9fa45fa0
No related branches found
No related tags found
No related merge requests found
Showing with 105 additions and 38 deletions
......@@ -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;
}
}
......
......@@ -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;
......
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()));
}
}
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;
}
}
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();
}
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));
}
}
......@@ -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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment