adaptive-caching-framework

Details

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