memoizeittf

added kernel options for tfcache. fixed behaviour by replacing

9/3/2020 3:20:44 PM

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/Thresholds.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/Thresholds.java
new file mode 100644
index 0000000..f904ce7
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/Thresholds.java
@@ -0,0 +1,74 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package br.ufrgs.inf.prosoft.memoizeittf.adapter;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.MathContext;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author romulo
+ */
+public class Thresholds {
+
+    private static final List<BigDecimal> SAVED_TIME_PER_TIME_IN_CACHE = new ArrayList<>();
+    private static final BigDecimal SAVED_TIME_PER_TIME_IN_CACHE_THRESHOLD = new BigDecimal(0.1);
+
+    private static BigDecimal averageSavedTimePerTimeInCache;
+    private static BigDecimal stdDevSavedTimePerTimeInCache;
+
+    public static void reset() {
+        Thresholds.SAVED_TIME_PER_TIME_IN_CACHE.clear();
+        Thresholds.averageSavedTimePerTimeInCache = null;
+        Thresholds.stdDevSavedTimePerTimeInCache = null;
+    }
+
+    public static BigDecimal getAverageSavedTimePerTimeInCache() {
+        if (averageSavedTimePerTimeInCache != null) {
+            return averageSavedTimePerTimeInCache;
+        }
+        if (SAVED_TIME_PER_TIME_IN_CACHE.isEmpty()) {
+            return new BigDecimal(BigInteger.ZERO);
+        }
+        averageSavedTimePerTimeInCache = SAVED_TIME_PER_TIME_IN_CACHE.stream().reduce(BigDecimal::add).orElse(new BigDecimal(BigInteger.ZERO))
+                .divide(new BigDecimal(SAVED_TIME_PER_TIME_IN_CACHE.size()), MathContext.DECIMAL128);
+        return averageSavedTimePerTimeInCache;
+    }
+
+    public static BigDecimal getStdDevSavedTimePerTimeInCache() {
+        if (stdDevSavedTimePerTimeInCache != null) {
+            return stdDevSavedTimePerTimeInCache;
+        }
+        if (SAVED_TIME_PER_TIME_IN_CACHE.isEmpty()) {
+            return new BigDecimal(BigInteger.ZERO);
+        }
+        BigDecimal mean = getAverageSavedTimePerTimeInCache();
+        BigDecimal temp = SAVED_TIME_PER_TIME_IN_CACHE.stream()
+                .map(frequency -> frequency.subtract(mean).multiply(frequency.subtract(mean)))
+                .reduce(BigDecimal::add)
+                .orElse(new BigDecimal(BigInteger.ZERO));
+        stdDevSavedTimePerTimeInCache = temp.divide(new BigDecimal(SAVED_TIME_PER_TIME_IN_CACHE.size()), MathContext.DECIMAL128).sqrt(MathContext.DECIMAL128);
+        return stdDevSavedTimePerTimeInCache;
+    }
+
+    public static BigDecimal savedTimePerTimeInCacheThreshold(int kStdDev) {
+        return getAverageSavedTimePerTimeInCache().add(getStdDevSavedTimePerTimeInCache().multiply(new BigDecimal(kStdDev)));
+    }
+
+    public static BigDecimal savedTimePerTimeInCacheThreshold() {
+        return SAVED_TIME_PER_TIME_IN_CACHE_THRESHOLD;
+    }
+
+    public static void add(BigDecimal savedTimePerTimeInCache) {
+        SAVED_TIME_PER_TIME_IN_CACHE.add(savedTimePerTimeInCache);
+        Thresholds.averageSavedTimePerTimeInCache = null;
+        Thresholds.stdDevSavedTimePerTimeInCache = null;
+    }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/Main.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/Main.java
index 0d4962a..106851b 100755
--- a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/Main.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/Main.java
@@ -5,13 +5,11 @@
  */
 package br.ufrgs.inf.prosoft.memoizeittf;
 
-import br.ufrgs.inf.prosoft.memoizeit.MemoizeIt;
-import br.ufrgs.inf.prosoft.memoizeittf.adapter.TraceReader;
 import br.ufrgs.inf.prosoft.memoizeit.adapter.CallGraphReader;
 import br.ufrgs.inf.prosoft.memoizeit.graph.Graph;
+import br.ufrgs.inf.prosoft.memoizeittf.adapter.TraceReader;
 import br.ufrgs.inf.prosoft.memoizeittf.facade.Method;
-import br.ufrgs.inf.prosoft.memoizeittf.utils.Methods;
-import br.ufrgs.inf.prosoft.tfcache.TFCache;
+import br.ufrgs.inf.prosoft.tfcache.configuration.Configuration;
 import br.ufrgs.inf.prosoft.trace.Trace;
 import br.ufrgs.inf.prosoft.trace.reader.Mode;
 import java.util.List;
@@ -33,7 +31,7 @@ public class Main {
         System.setProperty("java.util.logging.SimpleFormatter.format", "[%1$tF %1$tT+%1$tL] [%4$-7s] [MemoizeItTF] %5$s %n");
 
         if (args.length < 2) {
-            System.err.println("--trace=<TracePath> --callgraph=<CallGraphPath> [--mode=<complete|hashed|partial>] [--kernel=<iterative|exhaustive>] [--window=<windowSize>] [--shift=<shiftTime>]");
+            System.err.println("--trace=<TracePath> --callgraph=<CallGraphPath> [--tfkernel=<exhaustive|optimised>] [--mode=<complete|hashed|partial>] [--kernel=<iterative|exhaustive>] [--window=<windowSize>] [--shift=<shiftTime>]");
             System.exit(1);
         }
 
@@ -90,17 +88,9 @@ public class Main {
         List<Method> methods = TraceReader.groupByMethods(traces);
         LOGGER.log(Level.INFO, "grouped traces into {0} methods", methods.size());
 
-        Methods methodsController = new Methods(methods);
-        
-        MemoizeIt memoizeIt = new MemoizeIt();
-        memoizeIt.setCallGraph(graph);
-        
-        memoizeIt.setMethods(methodsController.getMemoizeitMethods());
-        memoizeIt.removeChangefulMethods(kernel.equals("iterative"));
-        
-        methodsController.synchronize();
-        
-        TFCache tfCache = new TFCache(methodsController.getTfcacheMethods());
-        tfCache.recommend(true);
+        Configuration.setKernel(arguments.get("tfkernel"));
+        Configuration.setStaleness("ignore");
+        MemoizeItTF memoizeItTF = new MemoizeItTF(methods, graph);
+        memoizeItTF.recommend(kernel.equals("iterative"));
     }
 }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/MemoizeItTF.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/MemoizeItTF.java
new file mode 100644
index 0000000..24e32bf
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/MemoizeItTF.java
@@ -0,0 +1,64 @@
+package br.ufrgs.inf.prosoft.memoizeittf;
+
+import br.ufrgs.inf.prosoft.memoizeit.MemoizeIt;
+import br.ufrgs.inf.prosoft.memoizeit.graph.Graph;
+import br.ufrgs.inf.prosoft.memoizeittf.adapter.Thresholds;
+import br.ufrgs.inf.prosoft.memoizeittf.facade.Method;
+import br.ufrgs.inf.prosoft.memoizeittf.utils.Methods;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class MemoizeItTF extends MemoizeIt {
+
+    private static final Logger LOGGER = Logger.getLogger(MemoizeItTF.class.getName());
+
+    private Methods methods;
+
+    public MemoizeItTF(List<Method> methods) {
+        this(methods, new Graph<String>());
+    }
+
+    public MemoizeItTF(List<Method> methods, Graph<String> callgraph) {
+        this.methods = new Methods(methods);
+        setMethods(Methods.getMemoizeitMethods(methods));
+        setCallGraph(callgraph);
+        setMinimumHitRatio(0D);
+    }
+
+    public void recommend() {
+        recommend(false);
+    }
+
+    public void recommend(boolean iteratively) {
+        removeChangefulMethods(iteratively);
+
+        this.methods.synchronize();
+        List<br.ufrgs.inf.prosoft.tfcache.metadata.Method> tfcacheMethods = this.methods.getTfcacheMethods();
+
+        LOGGER.log(Level.INFO, "Removing not reusable from {0} methods", tfcacheMethods.size());
+        tfcacheMethods.removeIf(br.ufrgs.inf.prosoft.tfcache.metadata.Method::isNotReusable);
+        LOGGER.log(Level.INFO, "Recommending TTL to {0} methods", tfcacheMethods.size());
+        tfcacheMethods.stream().parallel().forEach(br.ufrgs.inf.prosoft.tfcache.metadata.Method::recommendTTL);
+        LOGGER.log(Level.INFO, "Removing not recommended from {0}", tfcacheMethods.size());
+        tfcacheMethods.removeIf(method -> method.getSavedTime() == 0);
+
+        LOGGER.log(Level.INFO, "Removing methods according to the STpTiC Threshold from {0}", tfcacheMethods.size());
+        tfcacheMethods.removeIf(method -> method.getSavedTimePerTimeInCache().compareTo(Thresholds.savedTimePerTimeInCacheThreshold()) < 0);
+
+        LOGGER.log(Level.INFO, "Ranking {0} methods according STpTiC", tfcacheMethods.size());
+        tfcacheMethods.sort((method1, method2) -> method2.getSavedTimePerTimeInCache().compareTo(method1.getSavedTimePerTimeInCache()));
+        LOGGER.log(Level.INFO, "Printing recommendations for {0} methods", tfcacheMethods.size());
+        tfcacheMethods.forEach(method -> {
+            System.out.println(method.getName()
+                    + " Occurrences " + method.getOccurrencesSize()
+                    + " Inputs " + method.groupsOfOccurrences().count()
+                    + " TTL " + method.getTtl()
+                    + " STpTiC " + method.getSavedTimePerTimeInCache()
+                    + " Saves " + method.getSavedTime()
+                    + " Hits " + method.getBestMetrics().getHits()
+                    + " Stales " + method.getBestMetrics().getStales());
+        });
+    }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Methods.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Methods.java
index db0560b..66a935a 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Methods.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Methods.java
@@ -7,6 +7,7 @@ package br.ufrgs.inf.prosoft.memoizeittf.utils;
 
 import br.ufrgs.inf.prosoft.memoizeittf.facade.Method;
 import java.util.List;
+import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
 
 /**
@@ -21,7 +22,6 @@ public class Methods {
     public Methods(List<Method> methods) {
         this.memoizeitMethods = getMemoizeitMethods(methods);
         this.tfcacheMethods = getTfcacheMethods(methods);
-
     }
 
     public void synchronize() {
@@ -54,4 +54,13 @@ public class Methods {
         return this.tfcacheMethods;
     }
 
+    public void iterate(BiConsumer<br.ufrgs.inf.prosoft.memoizeit.Method, br.ufrgs.inf.prosoft.tfcache.metadata.Method> consumer) {
+        if (this.memoizeitMethods.size() != this.tfcacheMethods.size()) {
+            throw new RuntimeException("Unsync lists");
+        }
+        for (int i = 0; i < this.memoizeitMethods.size(); i++) {
+            consumer.accept(this.memoizeitMethods.get(i), this.tfcacheMethods.get(i));
+        }
+    }
+
 }