diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/IEvaluator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/IEvaluator.java new file mode 100644 index 0000000000000000000000000000000000000000..c789ef4dec5176b990120a6bc219a16a34b0e2f0 --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/IEvaluator.java @@ -0,0 +1,20 @@ +package edu.kit.ipd.descartes.adaptation.evaluation; + +import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic; + +/** + * Evaluates a tactic. + * + * @author nhuber + * + */ +public interface IEvaluator { + + /** + * Evaluates the impact of a {@link WeightedTactic}. + * + * @param wt The weighted tactic to evaluate + */ + public void evaluate(WeightedTactic wt); + +} diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/WeightingFunctionEvaluator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/WeightingFunctionEvaluator.java new file mode 100644 index 0000000000000000000000000000000000000000..1aa5c0dba566f883c991cb6ddada59cece315c2d --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/WeightingFunctionEvaluator.java @@ -0,0 +1,32 @@ +package edu.kit.ipd.descartes.adaptation.evaluation; + +import edu.kit.ipd.descartes.adaptation.evaluation.weightingfunction.WeightedSumCalculator; +import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic; +import edu.kit.ipd.descartes.mm.adaptation.WeightingFunction; + +/** + * Evaluates a given {@link WeightedTactic} using the weighted tactic's {@link WeightingFunction}. + * + * @author nhuber + * + */ +public class WeightingFunctionEvaluator implements IEvaluator { + + private WeightedSumCalculator calculator = null; + + public WeightingFunctionEvaluator() { + calculator = new WeightedSumCalculator(); + } + + /* + * (non-Javadoc) + * + * @see edu.kit.ipd.descartes.adaptation.evaluation.IEvaluator#evaluate() + */ + @Override + public void evaluate(WeightedTactic tactic) { + WeightingFunction f = tactic.getParentStrategy().getWeightingFunction(); + calculator.setWeightingFunction(f); + calculator.updateWeight(tactic); + } +} diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/IWeightingFunctionCalculator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/IWeightingFunctionCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..72068f516abb3a19e789517b55b7328f73537995 --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/IWeightingFunctionCalculator.java @@ -0,0 +1,24 @@ +package edu.kit.ipd.descartes.adaptation.weightingfunction; + +import edu.kit.ipd.descartes.mm.adaptation.Tactic; +import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic; + +public interface IWeightingFunctionCalculator { + + /** + * Calculates the new weight of the given {@link Tactic}. + * + * @param impact + * @return + */ + double calculateWeight(WeightedTactic weightedTactic); + + /** + * Calculates and sets the new weight of the given {@link WeightedTactic}. + * + * @param impact + * @return + */ + void updateWeight(WeightedTactic weightedTactic); + +} diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/RandomWeightCalculator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/RandomWeightCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..244fae639d4345fb210ad248387fda40355bd430 --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/RandomWeightCalculator.java @@ -0,0 +1,19 @@ +package edu.kit.ipd.descartes.adaptation.weightingfunction; + +import java.util.Random; + +import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic; + +public class RandomWeightCalculator implements IWeightingFunctionCalculator { + + @Override + public double calculateWeight(WeightedTactic weightedTactic) { + Random r = new Random(System.currentTimeMillis()); + return r.nextDouble(); + } + + @Override + public void updateWeight(WeightedTactic weightedTactic) { + weightedTactic.setCurrentWeight(calculateWeight(weightedTactic)); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..67c304e35187c43fa71a630159354eac5689f6dd --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java @@ -0,0 +1,62 @@ +package edu.kit.ipd.descartes.adaptation.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; +import edu.kit.ipd.descartes.perfdatarepo.MetricValue; +import edu.kit.ipd.descartes.perfdatarepo.Result; + +public class WeightedSumCalculator implements IWeightingFunctionCalculator { + + private Logger logger = Logger.getLogger(WeightedSumCalculator.class); + private WeightingFunction weightingFunction = null; + + public WeightedSumCalculator(WeightingFunction weightingFunction) { + this.weightingFunction = weightingFunction; + } + + @Override + public double calculateWeight(WeightedTactic weightedtactic) { + + double newWeight = 0.0; + Impact impact = weightedtactic.getLastImpact(); + Result before = impact.getBefore(); + Result after = impact.getAfter(); + EList<MetricValue> afterMetricValues = after.getMetricValues(); + + for (MetricValue afterMetricValue : afterMetricValues) { + // calculated delta=(after-before) + double afterValue = afterMetricValue.getValue(); + double beforeValue = WeightingFunctionHelper + .getValueForMetricType(afterMetricValue.getMetricType(), before); + double delta = afterValue - beforeValue; + + // get the corresponding weight + double weightOfMetric = WeightingFunctionHelper.getWeightForMetricType(weightingFunction, + afterMetricValue.getMetricType()); + + if (Double.isNaN(weightOfMetric)) + logger.error("No weight found for metric type: " + afterMetricValue.getMetricType().getName()); + else { + // add it + newWeight += weightOfMetric * delta; + logger.debug("Delta for metric type " + afterMetricValue.getMetricType().getName() + " was: " + delta + + " and weight is " + weightOfMetric); + } + } + + return newWeight; + } + + @Override + public void updateWeight(WeightedTactic weightedTactic) { + double newWeight = calculateWeight(weightedTactic); + logger.debug("Setting new weight of " + weightedTactic.getName() + " to " + newWeight); + weightedTactic.setCurrentWeight(newWeight); + } + +}