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 27667da17cbef079786a9ac573370de22fb18658..ec5d51ddc384677ca35d8cae715512363b28f116 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 3b25a9ec03bcc908e1f2819b19c47f4212241ae6..ebc3697a1fa7a2e25f554fe5ca8ed54140c5b082 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 7a3d953d6ce6b51e5daf98405698223d3f609271..75ecdd9d6adfb320ca277aa672e3c593946fb1bf 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 0000000000000000000000000000000000000000..65851ed94b33e8ebb842a376645b7f96b19fc0ee --- /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 041da5dd5dd9dc65343b3a6c037008c6e20484ab..7e55c871ad63d9f703f2138cd7fa33db238f947c 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 c2022c9289a63a2ffa788890e3616cdc26fea909..7fccdc8a4e4daf1168e25457898da435a8ac4c9b 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 72305a2d17c3972b1a4dd0266b7b287cec6d5643..2c2f14f0b9cf8ef295b8928ce4c64db44ad9aa9b 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; + } + }