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