diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/DataFiltering.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/DataFiltering.java
index e6df458..15bb603 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/DataFiltering.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/DataFiltering.java
@@ -1,5 +1,9 @@
package br.ufrgs.inf.prosoft.adaptivecaching.sampling.metrics;
+import br.ufrgs.inf.prosoft.adaptivecaching.analysis.decision.flowchart.FlowchartWorkFlow;
+import br.ufrgs.inf.prosoft.adaptivecaching.analysis.decision.flowchart.model.MethodStats;
+import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.MethodInfo;
+import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.cache.CacheInfo;
import br.ufrgs.inf.prosoft.adaptivecaching.sampling.statistics.StatisticalTest;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
@@ -20,21 +24,11 @@ public class DataFiltering {
switch (group){
case "normal":
if (isNormal)
- return (value >= (criteria.getMean() - criteria.getStandardDeviation()) &&
- value <= (criteria.getMean() + criteria.getStandardDeviation()));
+ return (value > (criteria.getMean() - criteria.getStandardDeviation()) &&
+ value < (criteria.getMean() + criteria.getStandardDeviation()));
else
- return (value >= criteria.getPercentile(25) &&
- value <= criteria.getPercentile(75));
- case "more":
- if (isNormal)
- return value >= (criteria.getMean() + criteria.getStandardDeviation());
- else
- return value >= criteria.getPercentile(75);
- case "less":
- if (isNormal)
- return value <= (criteria.getMean() - criteria.getStandardDeviation());
- else
- return value <= criteria.getPercentile(25);
+ return (value > criteria.getPercentile(25) &&
+ value < criteria.getPercentile(75));
case "most":
if (isNormal)
return value >= (criteria.getMean() + (2*criteria.getStandardDeviation()));
@@ -45,11 +39,76 @@ public class DataFiltering {
return value <= (criteria.getMean() + (2*criteria.getStandardDeviation()));
else
return value <= half.getPercentile(50);
+ case "more":
+ if (isNormal)
+ return value >= (criteria.getMean() + criteria.getStandardDeviation());
+ else
+ return value >= criteria.getPercentile(75);
+ case "less":
+ if (isNormal)
+ return value <= (criteria.getMean() - criteria.getStandardDeviation());
+ else
+ return value <= criteria.getPercentile(25);
+ }
+
+ throw new RuntimeException("Não foi possível classificar...");
+ }
+
+ public static String getGroup(DescriptiveStatistics criteria, double value){
+
+ boolean isNormal = StatisticalTest.isNormalDistribution(criteria.getValues(), 0.05);
+ DescriptiveStatistics upperHalf = new DescriptiveStatistics();
+ DescriptiveStatistics lowerHalf = new DescriptiveStatistics();
+ if(!isNormal) {
+ for(double val : criteria.getValues())
+ if(val >= criteria.getPercentile(75))
+ upperHalf.addValue(val);
+ else if(val <= criteria.getPercentile(25))
+ lowerHalf.addValue(val);
+ }
+
+ if (isNormal){
+ if(value > (criteria.getMean() - criteria.getStandardDeviation()) &&
+ value < (criteria.getMean() + criteria.getStandardDeviation()))
+ return "normal";
+ else if(value >= (criteria.getMean() + (2*criteria.getStandardDeviation())))
+ return "most";
+ else if(value <= (criteria.getMean() + (2*criteria.getStandardDeviation())))
+ return "least";
+ else if(value >= (criteria.getMean() + criteria.getStandardDeviation()))
+ return "more";
+ else if(value <= (criteria.getMean() - criteria.getStandardDeviation()))
+ return "less";
+ } else {
+ if(value > criteria.getPercentile(25) &&
+ value < criteria.getPercentile(75))
+ return "normal";
+ else if(value >= upperHalf.getPercentile(50))
+ return "most";
+ else if(value <= lowerHalf.getPercentile(50))
+ return "least";
+ else if(value >= criteria.getPercentile(75))
+ return "more";
+ else if(value <= criteria.getPercentile(25))
+ return "less";
}
throw new RuntimeException("Não foi possível classificar...");
}
+ public static String allMetricsToString(LightweightMetrics lightweightMetrics) {
+ //frequency,maintainability,changeability,userBehavior,concurrency,errorprone,expensiveness,globalimpact,latency
+ return lightweightMetrics.getFrequency() +
+ "," + lightweightMetrics.getMaintainability() +
+ "," + lightweightMetrics.getChangeability() +
+ "," + lightweightMetrics.getUserBehavior() +
+ "," + lightweightMetrics.getConcurrency() +
+ "," + lightweightMetrics.getErrorprone() +
+ "," + lightweightMetrics.getExpensiveness() +
+ "," + lightweightMetrics.getGlobalImpact() +
+ "," + lightweightMetrics.getLatency();
+ }
+
//
// //Example: less frequent
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/LightweightAnalyzer.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/LightweightAnalyzer.java
index c799306..b533011 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/LightweightAnalyzer.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/LightweightAnalyzer.java
@@ -1,12 +1,18 @@
package br.ufrgs.inf.prosoft.adaptivecaching.sampling.metrics;
+import br.ufrgs.inf.prosoft.adaptivecaching.analysis.decision.flowchart.model.MethodEntry;
+import br.ufrgs.inf.prosoft.adaptivecaching.analysis.decision.flowchart.stats.CacheabilityMetrics;
import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.aspects.TracerAspect;
import br.ufrgs.inf.prosoft.adaptivecaching.sampling.statistics.StatisticalTest;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
public class LightweightAnalyzer implements Runnable {
@@ -101,12 +107,35 @@ public class LightweightAnalyzer implements Runnable {
allowedFineGrained.add(sc.getLongName());
}
-
logger.info("Selected methods for fine-grained: {}", allowedFineGrained);
// TracerAspect.enabled = true;
TracerAspect.analyzerEnabled = true;
// LightweightMetricAspect.enabled = true;
+
+ //TODO remove: print all unique methods and metrics to csv file
+ logger.info("Printing lightweigth metrics...");
+ try {
+ final PrintWriter pw = new PrintWriter(new File("lightweightanalysis.csv"));
+ pw.write("method,frequency,maintainability,changeability,userBehavior,concurrency,errorprone,expensiveness,globalimpact,latency,vfrequency,vmaintainability,vchangeability,vuserBehavior,vconcurrency,verrorprone,vexpensiveness,vglobalimpact,vlatency\n");
+ for(String name : TracerAspect.metrics.keySet()){
+ pw.write(TracerAspect.metrics.get(name).getName() + "," +
+ DataFiltering.getGroup(frequencies, TracerAspect.metrics.get(name).getFrequency()) +
+ "," + DataFiltering.getGroup(maintainabilities, TracerAspect.metrics.get(name).getMaintainability()) +
+ "," + DataFiltering.getGroup(changeabilities, TracerAspect.metrics.get(name).getChangeability()) +
+ "," + DataFiltering.getGroup(userBehaviors, TracerAspect.metrics.get(name).getUserBehavior()) +
+ "," + DataFiltering.getGroup(concurrencies, TracerAspect.metrics.get(name).getConcurrency()) +
+ "," + DataFiltering.getGroup(errorprones, TracerAspect.metrics.get(name).getErrorprone()) +
+ "," + DataFiltering.getGroup(expensiveness, TracerAspect.metrics.get(name).getExpensiveness()) +
+ "," + DataFiltering.getGroup(globalimpacts, TracerAspect.metrics.get(name).getGlobalImpact()) +
+ "," + DataFiltering.getGroup(latencies, TracerAspect.metrics.get(name).getLatency()) +
+ "," +
+ DataFiltering.allMetricsToString(TracerAspect.metrics.get(name)) + '\n');
+ }
+ pw.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
}
@Override