memoizeittf
Details
.gitignore 34(+34 -0)
diff --git a/.gitignore b/.gitignore
new file mode 100755
index 0000000..4a482b8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,34 @@
+# ignore eclipse project files
+.project
+.classpath
+
+# ignore Intellij Idea project files
+.idea
+*.iml
+
+# Netbeans
+/nbproject/
+/nbactions.xml
+
+# Netbeans deploy
+/build/
+
+# Maven deploy
+/target/
+
+# Ant deploy
+/dist/
+
+# Class files
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
pom.xml 75(+75 -0)
diff --git a/pom.xml b/pom.xml
new file mode 100755
index 0000000..9612303
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <name>MemoizeItTF</name>
+ <groupId>br.ufrgs.inf.prosoft.memoizeittf</groupId>
+ <artifactId>MemoizeItTF</artifactId>
+ <version>1.0</version>
+ <packaging>jar</packaging>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <maven.compiler.source>1.8</maven.compiler.source>
+ <maven.compiler.target>1.8</maven.compiler.target>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>br.ufrgs.inf.prosoft.trace</groupId>
+ <artifactId>Trace</artifactId>
+ <version>1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>br.ufrgs.inf.prosoft.cache</groupId>
+ <artifactId>Cache</artifactId>
+ <version>1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>br.ufrgs.inf.prosoft.tfcache</groupId>
+ <artifactId>TFCache</artifactId>
+ <version>1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>br.ufrgs.inf.prosoft.memoizeit</groupId>
+ <artifactId>MemoizeIt</artifactId>
+ <version>1.0</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy</id>
+ <phase>package</phase>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>
+ ${project.build.directory}/lib
+ </outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>3.1.0</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <classpathPrefix>lib</classpathPrefix>
+ <mainClass>br.ufrgs.inf.prosoft.memoizeittf.Main</mainClass>
+ </manifest>
+ <manifestEntries>
+ <Class-Path>lib/</Class-Path>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/TraceReader.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/TraceReader.java
new file mode 100644
index 0000000..e6d6c82
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/TraceReader.java
@@ -0,0 +1,72 @@
+/*
+ * 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 br.ufrgs.inf.prosoft.memoizeit.Parameter;
+import br.ufrgs.inf.prosoft.memoizeittf.facade.Method;
+import br.ufrgs.inf.prosoft.memoizeittf.facade.Occurrence;
+import br.ufrgs.inf.prosoft.memoizeittf.facade.OccurrenceConcrete;
+import br.ufrgs.inf.prosoft.memoizeittf.facade.OccurrenceReference;
+import br.ufrgs.inf.prosoft.trace.Trace;
+import br.ufrgs.inf.prosoft.trace.TraceReference;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author romulo
+ */
+public class TraceReader extends br.ufrgs.inf.prosoft.trace.reader.TraceReader {
+
+ private static final Logger LOGGER = Logger.getLogger(TraceReader.class.getName());
+
+ public static List<Method> groupByMethods(List<Trace> traces) {
+ Map<String, List<Occurrence>> methodHasOccurrences = new HashMap<>();
+ Set<String> staticMethods = new HashSet<>();
+ while (!traces.isEmpty()) {
+ Trace trace = traces.remove(0);
+ try {
+ Occurrence occurrence;
+ if (trace instanceof TraceReference) {
+ TraceReference traceReference = (TraceReference) trace;
+ occurrence = new OccurrenceReference(traceReference.getIndex(), traceReference.getInstance(), trace.getStartTime(), trace.getEndTime(), trace.getUserSession());
+ } else {
+ occurrence = new OccurrenceConcrete(trace.getInstance(),
+ trace.getParameters().stream()
+ .map(parameter -> new Parameter(parameter.getType(), parameter.getData()))
+ .collect(Collectors.toList()),
+ trace.getReturn().getData(),
+ trace.getStartTime(),
+ trace.getEndTime(),
+ trace.getUserSession());
+ }
+ try {
+ methodHasOccurrences.get(trace.getName()).add(occurrence);
+ } catch (Exception ex) {
+ List<Occurrence> occurrences = new ArrayList<>();
+ occurrences.add(occurrence);
+ methodHasOccurrences.put(trace.getName(), occurrences);
+ if (trace.getModifiers().contains("static")) {
+ staticMethods.add(trace.getName());
+ }
+ }
+ } catch (Exception e) {
+ LOGGER.log(Level.INFO, "Trace discarted: {0}", trace);
+ }
+ }
+ return methodHasOccurrences.entrySet().stream()
+ .map(entry -> new Method(entry.getKey(), staticMethods.contains(entry.getKey()), entry.getValue()))
+ .collect(Collectors.toList());
+ }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/Method.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/Method.java
new file mode 100644
index 0000000..2ab8a7a
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/Method.java
@@ -0,0 +1,33 @@
+/*
+ * 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.facade;
+
+import br.ufrgs.inf.prosoft.memoizeittf.utils.Occurrences;
+import java.util.List;
+
+/**
+ *
+ * @author romulo
+ */
+public class Method {
+
+ private final br.ufrgs.inf.prosoft.memoizeit.Method memoizeitMethod;
+ private final br.ufrgs.inf.prosoft.tfcache.metadata.Method tfcacheMethod;
+
+ public Method(String name, boolean isStatic, List<Occurrence> occurrences) {
+ this.memoizeitMethod = new br.ufrgs.inf.prosoft.memoizeit.Method(name, isStatic, Occurrences.getMemoizeitOccurrences(occurrences));
+ this.tfcacheMethod = new br.ufrgs.inf.prosoft.tfcache.metadata.Method(name, Occurrences.getTfcacheOccurrences(occurrences));
+ }
+
+ public br.ufrgs.inf.prosoft.memoizeit.Method getMemoizeitMethod() {
+ return this.memoizeitMethod;
+ }
+
+ public br.ufrgs.inf.prosoft.tfcache.metadata.Method getTfcacheMethod() {
+ return this.tfcacheMethod;
+ }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/Occurrence.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/Occurrence.java
new file mode 100644
index 0000000..e41681e
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/Occurrence.java
@@ -0,0 +1,18 @@
+/*
+ * 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.facade;
+
+/**
+ *
+ * @author romulo
+ */
+public interface Occurrence {
+
+ public br.ufrgs.inf.prosoft.memoizeit.Occurrence getMemoizeitOccurrence();
+
+ public br.ufrgs.inf.prosoft.tfcache.metadata.Occurrence getTfcacheOccurrence();
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/OccurrenceConcrete.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/OccurrenceConcrete.java
new file mode 100644
index 0000000..0cd1bd5
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/OccurrenceConcrete.java
@@ -0,0 +1,38 @@
+/*
+ * 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.facade;
+
+import br.ufrgs.inf.prosoft.memoizeit.Parameter;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author romulo
+ */
+public class OccurrenceConcrete implements Occurrence {
+
+ private final br.ufrgs.inf.prosoft.memoizeit.OccurrenceConcrete memoizeitOccurrence;
+ private final br.ufrgs.inf.prosoft.tfcache.metadata.OccurrenceConcrete tfcacheOccurrence;
+
+ public OccurrenceConcrete(String instance, List<Parameter> parameters, Object returnedValue, long startTime, long endTime, String userId) {
+ this.memoizeitOccurrence = new br.ufrgs.inf.prosoft.memoizeit.OccurrenceConcrete(instance, returnedValue, parameters, startTime, endTime);
+ this.tfcacheOccurrence = new br.ufrgs.inf.prosoft.tfcache.metadata.OccurrenceConcrete(instance,
+ parameters.stream().map(Parameter::getData).collect(Collectors.toList()).toArray(),
+ returnedValue, startTime, endTime, userId);
+ }
+
+ @Override
+ public br.ufrgs.inf.prosoft.memoizeit.Occurrence getMemoizeitOccurrence() {
+ return this.memoizeitOccurrence;
+ }
+
+ @Override
+ public br.ufrgs.inf.prosoft.tfcache.metadata.Occurrence getTfcacheOccurrence() {
+ return this.tfcacheOccurrence;
+ }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/OccurrenceReference.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/OccurrenceReference.java
new file mode 100644
index 0000000..4b59d55
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/facade/OccurrenceReference.java
@@ -0,0 +1,32 @@
+/*
+ * 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.facade;
+
+/**
+ *
+ * @author romulo
+ */
+public class OccurrenceReference implements Occurrence {
+
+ private final br.ufrgs.inf.prosoft.memoizeit.OccurrenceReference memoizeitOccurrence;
+ private final br.ufrgs.inf.prosoft.tfcache.metadata.OccurrenceReference tfcacheOccurrence;
+
+ public OccurrenceReference(int index, String instance, long startTime, long endTime, String userId) {
+ this.memoizeitOccurrence = new br.ufrgs.inf.prosoft.memoizeit.OccurrenceReference(index, instance, startTime, endTime);
+ this.tfcacheOccurrence = new br.ufrgs.inf.prosoft.tfcache.metadata.OccurrenceReference(index, instance, startTime, endTime, userId);
+ }
+
+ @Override
+ public br.ufrgs.inf.prosoft.memoizeit.Occurrence getMemoizeitOccurrence() {
+ return this.memoizeitOccurrence;
+ }
+
+ @Override
+ public br.ufrgs.inf.prosoft.tfcache.metadata.Occurrence getTfcacheOccurrence() {
+ return this.tfcacheOccurrence;
+ }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/Main.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/Main.java
new file mode 100755
index 0000000..0d4962a
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/Main.java
@@ -0,0 +1,106 @@
+/*
+ * 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;
+
+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.facade.Method;
+import br.ufrgs.inf.prosoft.memoizeittf.utils.Methods;
+import br.ufrgs.inf.prosoft.tfcache.TFCache;
+import br.ufrgs.inf.prosoft.trace.Trace;
+import br.ufrgs.inf.prosoft.trace.reader.Mode;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ *
+ * @author romulo
+ */
+public class Main {
+
+ private static final Logger LOGGER = Logger.getLogger(Main.class.getName());
+
+ public static void main(String[] args) {
+ 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.exit(1);
+ }
+
+ Map<String, String> arguments = Stream.of(args).map(arg -> {
+ arg = arg.replaceFirst("--", "");
+ int indexOf = arg.indexOf("=");
+ if (indexOf == -1) {
+ return new String[]{arg, ""};
+ }
+ return new String[]{arg.substring(0, indexOf), arg.substring(indexOf + 1)};
+ }).collect(Collectors.toMap(array -> {
+ return array[0];
+ }, array -> {
+ return array[1];
+ }));
+
+ String tracePath = arguments.get("trace");
+ if (tracePath == null) {
+ System.err.println("<TracePath> is required");
+ System.exit(1);
+ }
+ String callGraphPath = arguments.get("callgraph");
+ if (callGraphPath == null) {
+ System.err.println("<CallGraphPath> is required");
+ System.exit(1);
+ }
+ String mode = arguments.get("mode");
+ if (mode == null) {
+ mode = "complete";
+ LOGGER.log(Level.INFO, "Using default mode: {0}", mode);
+ }
+ String kernel = arguments.get("kernel");
+ if (kernel == null) {
+ kernel = "exhaustive";
+ LOGGER.log(Level.INFO, "Using default kernel: {0}", kernel);
+ }
+
+ Long window = null;
+ try {
+ window = Long.valueOf(arguments.get("window"));
+ } catch (NumberFormatException ex) {
+ }
+ Long shift = null;
+ try {
+ shift = Long.valueOf(arguments.get("shift"));
+ } catch (NumberFormatException ex) {
+ }
+
+ LOGGER.log(Level.INFO, "Reading callgraph");
+ Graph<String> graph = CallGraphReader.parseFile(callGraphPath);
+ LOGGER.log(Level.INFO, "Reading traces");
+ List<Trace> traces = TraceReader.parseFile(tracePath, Mode.valueOf(mode.toUpperCase()), window, shift);
+ LOGGER.log(Level.INFO, "Grouping {0} traces by methods", traces.size());
+ 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);
+ }
+}
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
new file mode 100644
index 0000000..db0560b
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Methods.java
@@ -0,0 +1,57 @@
+/*
+ * 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.utils;
+
+import br.ufrgs.inf.prosoft.memoizeittf.facade.Method;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author romulo
+ */
+public class Methods {
+
+ private final List<br.ufrgs.inf.prosoft.memoizeit.Method> memoizeitMethods;
+ private final List<br.ufrgs.inf.prosoft.tfcache.metadata.Method> tfcacheMethods;
+
+ public Methods(List<Method> methods) {
+ this.memoizeitMethods = getMemoizeitMethods(methods);
+ this.tfcacheMethods = getTfcacheMethods(methods);
+
+ }
+
+ public void synchronize() {
+ if (this.memoizeitMethods.size() == this.tfcacheMethods.size()) {
+ return;
+ }
+ {
+ List<String> remainingMethodReferences = this.memoizeitMethods.stream().map(method -> method.getName()).collect(Collectors.toList());
+ this.tfcacheMethods.removeIf(method -> !remainingMethodReferences.contains(method.getName()));
+ }
+ {
+ List<String> remainingMethodReferences = this.tfcacheMethods.stream().map(method -> method.getName()).collect(Collectors.toList());
+ this.memoizeitMethods.removeIf(method -> !remainingMethodReferences.contains(method.getName()));
+ }
+ }
+
+ public static List<br.ufrgs.inf.prosoft.memoizeit.Method> getMemoizeitMethods(List<Method> methods) {
+ return methods.stream().map(Method::getMemoizeitMethod).collect(Collectors.toList());
+ }
+
+ public List<br.ufrgs.inf.prosoft.memoizeit.Method> getMemoizeitMethods() {
+ return this.memoizeitMethods;
+ }
+
+ public static List<br.ufrgs.inf.prosoft.tfcache.metadata.Method> getTfcacheMethods(List<Method> methods) {
+ return methods.stream().map(Method::getTfcacheMethod).collect(Collectors.toList());
+ }
+
+ public List<br.ufrgs.inf.prosoft.tfcache.metadata.Method> getTfcacheMethods() {
+ return this.tfcacheMethods;
+ }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Occurrences.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Occurrences.java
new file mode 100644
index 0000000..a2d18b2
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/utils/Occurrences.java
@@ -0,0 +1,26 @@
+/*
+ * 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.utils;
+
+import br.ufrgs.inf.prosoft.memoizeittf.facade.Occurrence;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author romulo
+ */
+public class Occurrences {
+
+ public static List<br.ufrgs.inf.prosoft.memoizeit.Occurrence> getMemoizeitOccurrences(List<Occurrence> occurrences) {
+ return occurrences.stream().map(Occurrence::getMemoizeitOccurrence).collect(Collectors.toList());
+ }
+
+ public static List<br.ufrgs.inf.prosoft.tfcache.metadata.Occurrence> getTfcacheOccurrences(List<Occurrence> occurrences) {
+ return occurrences.stream().map(Occurrence::getTfcacheOccurrence).collect(Collectors.toList());
+ }
+
+}