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

evaluation interface introduced

git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/code/DMM/trunk@11547 9e42b895-fcda-4063-8a3b-11be15eb1bbd
parent 64a2146c
No related branches found
No related tags found
No related merge requests found
...@@ -9,14 +9,14 @@ import org.apache.log4j.Level; ...@@ -9,14 +9,14 @@ import org.apache.log4j.Level;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.URI; import org.eclipse.emf.common.util.URI;
import edu.kit.ipd.descartes.adaptation.evaluation.IEvaluator;
import edu.kit.ipd.descartes.adaptation.evaluation.WeightingFunctionEvaluator;
import edu.kit.ipd.descartes.adaptation.model.analysis.IModelAnalyzer; 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.analysis.pcm.PcmModelAnalyzer;
import edu.kit.ipd.descartes.adaptation.model.dmm.AdaptationProcessModelManager; import edu.kit.ipd.descartes.adaptation.model.dmm.AdaptationProcessModelManager;
import edu.kit.ipd.descartes.adaptation.model.dmm.DmmModelActionHandler; import edu.kit.ipd.descartes.adaptation.model.dmm.DmmModelActionHandler;
import edu.kit.ipd.descartes.adaptation.model.dmm.PerformanceDataRepositoryModelManager; import edu.kit.ipd.descartes.adaptation.model.dmm.PerformanceDataRepositoryModelManager;
import edu.kit.ipd.descartes.adaptation.model.dmm.util.PerfDataRepoHelper; import edu.kit.ipd.descartes.adaptation.model.dmm.util.PerfDataRepoHelper;
import edu.kit.ipd.descartes.adaptation.weightingfunction.IWeightingFunctionCalculator;
import edu.kit.ipd.descartes.adaptation.weightingfunction.WeightedSumCalculator;
import edu.kit.ipd.descartes.mm.adaptation.AdaptationFactory; import edu.kit.ipd.descartes.mm.adaptation.AdaptationFactory;
import edu.kit.ipd.descartes.mm.adaptation.AdaptationProcess; import edu.kit.ipd.descartes.mm.adaptation.AdaptationProcess;
import edu.kit.ipd.descartes.mm.adaptation.Event; import edu.kit.ipd.descartes.mm.adaptation.Event;
...@@ -28,106 +28,108 @@ import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository; ...@@ -28,106 +28,108 @@ import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository;
public class AdaptationControl { public class AdaptationControl {
public enum EventType { public enum EventType {
SLA_VIOLATION ("SlaViolatedEvent", "12345"), SLA_VIOLATION("SlaViolatedEvent", "12345"), SCHEDULED_OPTIMIZATION("ScheduledOptimizationEvent",
SCHEDULED_OPTIMIZATION ("ScheduledOptimizationEvent", "_H_MTgIAnEeKW2vVcg5ekRw"), "_H_MTgIAnEeKW2vVcg5ekRw"), BOTTLENECK_FOUND("BottleneckFoundEvent", "_VvZEwKEoEeKDl52Xojo4CQ");
BOTTLENECK_FOUND ("BottleneckFoundEvent", "_VvZEwKEoEeKDl52Xojo4CQ");
private final String name;
private final String name; private final String id;
private final String id;
EventType(String name, String id) { EventType(String name, String id) {
this.name = name; this.name = name;
this.id = id; this.id = id;
} }
public static EventType getEventType(String eventTypeName) { public static EventType getEventType(String eventTypeName) {
if (eventTypeName.equals(SLA_VIOLATION.name)) return SLA_VIOLATION; if (eventTypeName.equals(SLA_VIOLATION.name))
if (eventTypeName.equals(SCHEDULED_OPTIMIZATION.name)) return SCHEDULED_OPTIMIZATION; return SLA_VIOLATION;
if (eventTypeName.equals(BOTTLENECK_FOUND.name)) return BOTTLENECK_FOUND; if (eventTypeName.equals(SCHEDULED_OPTIMIZATION.name))
return SCHEDULED_OPTIMIZATION;
if (eventTypeName.equals(BOTTLENECK_FOUND.name))
return BOTTLENECK_FOUND;
return null; return null;
} }
} }
private static final String DEFAULT_PROP_FILE_PATH = "./default.properties"; private static final String DEFAULT_PROP_FILE_PATH = "./default.properties";
private static final String PROP_ADAPTATION_PROCESS_XMI_FILE_PATH_NAME = "adaptationProcessModel"; private static final String PROP_ADAPTATION_PROCESS_XMI_FILE_PATH_NAME = "adaptationProcessModel";
private static final String PROP_PERF_DATA_REPO_XMI_FILE_PATH_NAME = "performanceDataRepositoryModel"; private static final String PROP_PERF_DATA_REPO_XMI_FILE_PATH_NAME = "performanceDataRepositoryModel";
private static final String PROP_ADAPTATION_PROCESS_NAME = "processName"; private static final String PROP_ADAPTATION_PROCESS_NAME = "processName";
private static final String PROP_MAX_ITERATIONS = "maxIterations"; private static final String PROP_MAX_ITERATIONS = "maxIterations";
private static final String PROP_TRIGGERING_EVENT_TYPE = "eventType"; private static final String PROP_TRIGGERING_EVENT_TYPE = "eventType";
private static Logger logger = Logger.getLogger(AdaptationControl.class); private static Logger logger = Logger.getLogger(AdaptationControl.class);
private String adaptationProcessXmiFilePath = null; private String adaptationProcessXmiFilePath = null;
private String performanceDataRepoXmiFilePath = null; private String performanceDataRepoXmiFilePath = null;
private String eventType = null; private String eventType = null;
private AdaptationProcessModelManager adaptationProcessModelManager = AdaptationProcessModelManager.getInstance(); private AdaptationProcessModelManager adaptationProcessModelManager = AdaptationProcessModelManager.getInstance();
private PerformanceDataRepositoryModelManager perfDataModelManager = PerformanceDataRepositoryModelManager private PerformanceDataRepositoryModelManager perfDataModelManager = PerformanceDataRepositoryModelManager
.getInstance(); .getInstance();
private AdaptationProcess adaptationProcess = null; private AdaptationProcess adaptationProcess = null;
private PerformanceDataRepository perfDataRepo = null; private PerformanceDataRepository perfDataRepo = null;
private TacticExecutor executor = null; private TacticExecutor executor = null;
private IWeightingFunctionCalculator wFunction = null; private IModelAnalyzer modelAnalyzer = null;
private IModelAnalyzer modelAnalyzer = null; private WeightingFunctionEvaluator evaluator = null;
private boolean problemSolved = false; private boolean problemSolved = false;
private int iteration = 0; private int iteration = 0;
private int maxIterations = 0; private int maxIterations = 0;
/** /**
* @param args * @param args
* @throws IOException * @throws IOException
*/ */
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
BasicConfigurator.configure(); BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.DEBUG); Logger.getRootLogger().setLevel(Level.DEBUG);
AdaptationControl adaptationController = new AdaptationControl(); AdaptationControl adaptationController = new AdaptationControl();
// Initialize controller (load models, create Action handler, etc.) // Initialize controller (load models, create Action handler, etc.)
adaptationController.init(); adaptationController.init();
Event triggeringEvent = adaptationController.createTriggeringEvent(); Event triggeringEvent = adaptationController.createTriggeringEvent();
// trigger adaptation process // trigger adaptation process
adaptationController.doAdaptation(triggeringEvent); adaptationController.doAdaptation(triggeringEvent);
} }
private void loadProperties(String propertiesFilePath) throws IOException { private void loadProperties(String propertiesFilePath) throws IOException {
Properties properties = new Properties(); Properties properties = new Properties();
FileInputStream propFile = new FileInputStream(propertiesFilePath); FileInputStream propFile = new FileInputStream(propertiesFilePath);
properties.load(propFile); properties.load(propFile);
logger.debug("Loaded properties of " + properties.getProperty(PROP_ADAPTATION_PROCESS_NAME)); logger.debug("Loaded properties of " + properties.getProperty(PROP_ADAPTATION_PROCESS_NAME));
adaptationProcessXmiFilePath=properties.getProperty(PROP_ADAPTATION_PROCESS_XMI_FILE_PATH_NAME); adaptationProcessXmiFilePath = properties.getProperty(PROP_ADAPTATION_PROCESS_XMI_FILE_PATH_NAME);
performanceDataRepoXmiFilePath=properties.getProperty(PROP_PERF_DATA_REPO_XMI_FILE_PATH_NAME); performanceDataRepoXmiFilePath = properties.getProperty(PROP_PERF_DATA_REPO_XMI_FILE_PATH_NAME);
maxIterations=Integer.parseInt(properties.getProperty(PROP_MAX_ITERATIONS)); maxIterations = Integer.parseInt(properties.getProperty(PROP_MAX_ITERATIONS));
eventType=properties.getProperty(PROP_TRIGGERING_EVENT_TYPE).trim(); eventType = properties.getProperty(PROP_TRIGGERING_EVENT_TYPE).trim();
logger.debug("Maximum iterations till abort: " + maxIterations); logger.debug("Maximum iterations till abort: " + maxIterations);
} }
public void init() { public void init() {
try { try {
loadProperties(DEFAULT_PROP_FILE_PATH); loadProperties(DEFAULT_PROP_FILE_PATH);
adaptationProcess = adaptationProcessModelManager.load(URI adaptationProcess = adaptationProcessModelManager.load(URI.createFileURI(adaptationProcessXmiFilePath));
.createFileURI(adaptationProcessXmiFilePath)); perfDataRepo = perfDataModelManager.load(URI.createFileURI(performanceDataRepoXmiFilePath));
perfDataRepo = perfDataModelManager.load(URI executor = new TacticExecutor(new DmmModelActionHandler());
.createFileURI(performanceDataRepoXmiFilePath)); modelAnalyzer = new PcmModelAnalyzer();
executor = new TacticExecutor(new DmmModelActionHandler()); evaluator = new WeightingFunctionEvaluator();
modelAnalyzer = new PcmModelAnalyzer(); } catch (IOException e) {
} catch (IOException e) { logger.error("Error while loading configuration files", e);
logger.error("Error while loading configuration files", e); abort();
abort(); return;
return; }
} }
}
// Creates an "artifical event". Will be replaced later when integrated in the system
// Creates an "artifical event". Will be replaced later when integrated in the system
private Event createTriggeringEvent() { private Event createTriggeringEvent() {
EventType type = EventType.getEventType(eventType); EventType type = EventType.getEventType(eventType);
if(type==null) { if (type == null) {
logger.error("Could not create event " + eventType); logger.error("Could not create event " + eventType);
abort(); abort();
} }
Event triggeringEvent = AdaptationFactory.eINSTANCE.createEvent(); Event triggeringEvent = AdaptationFactory.eINSTANCE.createEvent();
triggeringEvent.setName(type.name); triggeringEvent.setName(type.name);
triggeringEvent.setId(type.id); triggeringEvent.setId(type.id);
...@@ -135,48 +137,45 @@ public class AdaptationControl { ...@@ -135,48 +137,45 @@ public class AdaptationControl {
return triggeringEvent; return triggeringEvent;
} }
public void doAdaptation(Event triggeringEvent) { public void doAdaptation(Event triggeringEvent) {
// Determine the suitable strategy via the objective // Determine the suitable strategy via the objective
// which is currently implemented as the first element // which is currently implemented as the first element
Strategy currentStrategy = AdaptationControl.findTriggeredStrategy( Strategy currentStrategy = AdaptationControl.findTriggeredStrategy(adaptationProcess, triggeringEvent);
adaptationProcess, triggeringEvent); if (currentStrategy == null) {
if (currentStrategy == null) { logger.error("No strategy found to handle this event!");
logger.error("No strategy found to handle this event!"); abort();
abort(); return;
return; }
}
while (!isProblemSolved() && iteration < maxIterations) {
while (!isProblemSolved() && iteration < maxIterations) { // Execute the strategie's tactic with the currently highest weight
// Execute the strategie's tactic with the currently highest weight WeightedTactic currentTactic = currentStrategy.getTacticWithHighestWeight();
WeightedTactic currentTactic = currentStrategy.getTacticWithHighestWeight();
WeightingFunction currentWeightingFunction = currentStrategy.getWeightingFunction(); applyTactic(currentTactic);
analyzeModel();
applyTactic(currentTactic); processResults(currentTactic);
analyzeModel(); evaluate(currentTactic);
processResults(currentTactic);
evaluate(currentWeightingFunction, currentTactic); // save results
try {
iteration++; logger.debug("Saving tactics evaluation results...");
} adaptationProcessModelManager.saveAll();
} catch (IOException e) {
printLogInformation(); logger.error("Error while persisting evaluation results.", e);
}
}
iteration++;
private void evaluate(WeightingFunction function, WeightedTactic tactic) {
// Caluclate the new weight of the tactic
wFunction = new WeightedSumCalculator(function);
wFunction.updateWeight(tactic);
//save results
try {
logger.debug("Saving tactics evaluation results...");
adaptationProcessModelManager.saveAll();
} catch (IOException e) {
logger.error("Error while persisting evaluation results.", e);
} }
}
printLogInformation();
}
private void evaluate(WeightedTactic currentTactic) {
WeightingFunction f = currentTactic.getParentStrategy().getWeightingFunction();
evaluator.evaluate(currentTactic);
}
private void processResults(WeightedTactic tactic) { private void processResults(WeightedTactic tactic) {
Impact latestImpact = PerfDataRepoHelper.getImpactAt(perfDataRepo, iteration); Impact latestImpact = PerfDataRepoHelper.getImpactAt(perfDataRepo, iteration);
...@@ -185,59 +184,57 @@ public class AdaptationControl { ...@@ -185,59 +184,57 @@ public class AdaptationControl {
tactic.setLastImpact(latestImpact); tactic.setLastImpact(latestImpact);
} }
private void analyzeModel() { private void analyzeModel() {
modelAnalyzer.analyze(); modelAnalyzer.analyze();
} }
private void applyTactic(WeightedTactic weightedTactic) { private void applyTactic(WeightedTactic weightedTactic) {
executor.applyTactic(weightedTactic); executor.applyTactic(weightedTactic);
} }
private boolean isProblemSolved() { private boolean isProblemSolved() {
//TODO evaluate the results (problem solved?) // TODO evaluate the results (problem solved?)
//TODO Implement correct check of objective // TODO Implement correct check of objective
return problemSolved; return problemSolved;
} }
private void printLogInformation() { private void printLogInformation() {
TacticsHistory hist = TacticsHistory.getInstance(); TacticsHistory hist = TacticsHistory.getInstance();
hist.printToSysOut(); hist.printToSysOut();
} }
private static Strategy findTriggeredStrategy(AdaptationProcess staRepo, private static Strategy findTriggeredStrategy(AdaptationProcess staRepo, Event triggeringEvent) {
Event triggeringEvent) {
String eventName = triggeringEvent.getName();
String eventName = triggeringEvent.getName(); String eventId = triggeringEvent.getId();
String eventId = triggeringEvent.getId();
logger.debug("Caught event: " + eventName + " (ID: " + eventId + ")");
logger.debug("Caught event: " + eventName + " (ID: " + eventId + ")");
for (Strategy strategy : staRepo.getStrategies()) {
for (Strategy strategy : staRepo.getStrategies()) { if (strategy.getTriggeringEvents().getId().equals(eventId)
if (strategy.getTriggeringEvents().getId().equals(eventId) && strategy.getTriggeringEvents().getName().equals(eventName)) {
&& strategy.getTriggeringEvents().getName() logger.debug("Found suitable strategy " + strategy.getName() + " for event "
.equals(eventName)) { + triggeringEvent.getName());
logger.debug("Found suitable strategy " + strategy.getName() return strategy;
+ " for event " + triggeringEvent.getName()); }
return strategy; }
}
} return null;
}
return null;
} /**
* Graceful stop the adaptation process.
/** */
* Graceful stop the adaptation process. public void stop() {
*/ logger.info("Stopping adaptation process");
public void stop() { return;
logger.info("Stopping adaptation process"); }
return;
} /**
* Aborts the adaptation process because of errors
/** */
* Aborts the adaptation process because of errors public void abort() {
*/ logger.error("Stopping adaptation process due to errors.");
public void abort() { stop();
logger.error("Stopping adaptation process due to errors."); }
stop();
}
} }
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