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));
+ }
+ }
+
}