From b2e5be517c6f7880a7019fcfddf4205dc6cdffbd Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Sat, 17 Apr 2021 18:31:34 +0200
Subject: [PATCH] Start with reusable variant.

---
 .gitignore                                    |  1 +
 .gitlab-ci.yml                                | 31 +++++++++
 namelookup-xml-flush/build.gradle             |  2 +
 namelookup-xml-flush/jastadd_modules          | 10 +--
 namelookup-xml-inc/build.gradle               |  2 +
 namelookup-xml-inc/jastadd_modules            | 10 +--
 relast-reusable-inc/.gitignore                |  6 ++
 relast-reusable-inc/build.gradle              | 23 +++++++
 relast-reusable-inc/jastadd_modules           | 13 ++++
 relast-reusable-inc/libs                      |  1 +
 relast-reusable-inc/src/main                  |  1 +
 relast-reusable-inc/src/test                  |  1 +
 relast-xml-flush/build.gradle                 |  2 +
 relast-xml-flush/jastadd_modules              |  6 +-
 relast-xml-inc/build.gradle                   |  2 +
 relast-xml-inc/jastadd_modules                |  6 +-
 settings.gradle                               |  5 +-
 solve/build.gradle                            |  2 +
 solve/gradle-parts/base.gradle                |  6 +-
 solve/jastadd_modules                         |  6 +-
 .../main/jastadd/{ => base}/ApplyChanges.jadd |  0
 .../src/main/jastadd/{ => base}/Checking.jrag |  0
 .../src/main/jastadd/{ => base}/Helpers.jadd  |  0
 .../jastadd/{ => base}/ModelNavigation.jrag   |  0
 solve/src/main/jastadd/{ => base}/NTA.jrag    |  0
 .../src/main/jastadd/{ => base}/Printing.jrag |  0
 .../jastadd/{ => base}/SocialNetwork.relast   |  0
 .../src/main/jastadd/{ => base}/Tracing.jadd  |  0
 solve/src/main/jastadd/{ => base}/changes.ast |  0
 .../src/main/jastadd/{ => base}/queries.jrag  |  0
 .../namelookup}/Refs.jadd                     |  0
 .../namelookup}/SocialNetworkNamelookup.ast   |  0
 .../main/jastadd/reusable/CommentToDG.jrag    | 20 ++++++
 .../main/jastadd/reusable/CommentToDG.relast  |  2 +
 .../main/jastadd/reusable/dg/DGtoDotG.jrag    | 65 +++++++++++++++++++
 .../main/jastadd/reusable/dg/DGtoDotG.relast  |  2 +
 .../reusable/dg/DependencyGraph.relast        |  3 +
 .../dg/DependencyGraphReachability.jrag       | 59 +++++++++++++++++
 .../main/jastadd/reusable/dg/DotGraph.jrag    | 58 +++++++++++++++++
 .../main/jastadd/reusable/dg/DotGraph.relast  |  4 ++
 .../main/jastadd/reusable/queriesRefined.jrag | 12 ++++
 time-q1.sh                                    |  2 -
 timedBenchmark.sh                             |  6 ++
 43 files changed, 343 insertions(+), 26 deletions(-)
 create mode 100644 .gitlab-ci.yml
 create mode 100644 relast-reusable-inc/.gitignore
 create mode 100644 relast-reusable-inc/build.gradle
 create mode 100644 relast-reusable-inc/jastadd_modules
 create mode 120000 relast-reusable-inc/libs
 create mode 120000 relast-reusable-inc/src/main
 create mode 120000 relast-reusable-inc/src/test
 rename solve/src/main/jastadd/{ => base}/ApplyChanges.jadd (100%)
 rename solve/src/main/jastadd/{ => base}/Checking.jrag (100%)
 rename solve/src/main/jastadd/{ => base}/Helpers.jadd (100%)
 rename solve/src/main/jastadd/{ => base}/ModelNavigation.jrag (100%)
 rename solve/src/main/jastadd/{ => base}/NTA.jrag (100%)
 rename solve/src/main/jastadd/{ => base}/Printing.jrag (100%)
 rename solve/src/main/jastadd/{ => base}/SocialNetwork.relast (100%)
 rename solve/src/main/jastadd/{ => base}/Tracing.jadd (100%)
 rename solve/src/main/jastadd/{ => base}/changes.ast (100%)
 rename solve/src/main/jastadd/{ => base}/queries.jrag (100%)
 rename solve/src/main/{namelookup-jastadd => jastadd/namelookup}/Refs.jadd (100%)
 rename solve/src/main/{namelookup-jastadd => jastadd/namelookup}/SocialNetworkNamelookup.ast (100%)
 create mode 100644 solve/src/main/jastadd/reusable/CommentToDG.jrag
 create mode 100644 solve/src/main/jastadd/reusable/CommentToDG.relast
 create mode 100644 solve/src/main/jastadd/reusable/dg/DGtoDotG.jrag
 create mode 100644 solve/src/main/jastadd/reusable/dg/DGtoDotG.relast
 create mode 100644 solve/src/main/jastadd/reusable/dg/DependencyGraph.relast
 create mode 100644 solve/src/main/jastadd/reusable/dg/DependencyGraphReachability.jrag
 create mode 100644 solve/src/main/jastadd/reusable/dg/DotGraph.jrag
 create mode 100644 solve/src/main/jastadd/reusable/dg/DotGraph.relast
 create mode 100644 solve/src/main/jastadd/reusable/queriesRefined.jrag
 delete mode 100755 time-q1.sh
 create mode 100755 timedBenchmark.sh

diff --git a/.gitignore b/.gitignore
index 5b81dcb..6b6d7a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
 /.idea/
 logs/
 out/
+/events*.csv
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..c3e1e6d
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,31 @@
+stages:
+  - build
+  - test
+
+before_script:
+  - export GRADLE_USER_HOME=`pwd`/.gradle
+
+cache:
+  paths:
+    - .gradle/wrapper
+    - .gradle/caches
+
+build:
+  image: openjdk:11
+  stage: build
+  script:
+    - ./gradlew --console=plain assemble
+
+test:
+  image: openjdk:11
+  tags:
+    - docker
+  stage: test
+  needs:
+    - build
+  script:
+    - ./gradlew --console=plain --info test
+  artifacts:
+    when: always
+    reports:
+      junit: "*/build/test-results/test/**/TEST-*.xml"
diff --git a/namelookup-xml-flush/build.gradle b/namelookup-xml-flush/build.gradle
index ad75fcf..f4790d8 100644
--- a/namelookup-xml-flush/build.gradle
+++ b/namelookup-xml-flush/build.gradle
@@ -12,6 +12,8 @@ plugins {
     id 'idea'
 }
 
+ext.relastFiles = []
+
 apply from: '../solve/gradle-parts/base.gradle'
 
 apply from: '../solve/gradle-parts/inc-flush.gradle'
diff --git a/namelookup-xml-flush/jastadd_modules b/namelookup-xml-flush/jastadd_modules
index 9efe1ba..c6034b0 100644
--- a/namelookup-xml-flush/jastadd_modules
+++ b/namelookup-xml-flush/jastadd_modules
@@ -1,10 +1,10 @@
 module("solve") {
     jastadd {
         basedir "src/"
-        include "main/jastadd/**/*.ast"
-        include "main/jastadd/**/*.jadd"
-        include "main/jastadd/**/*.jrag"
-        include "main/namelookup-jastadd/**/*.jadd"
-        include "main/namelookup-jastadd/**/*.ast"
+        include "main/jastadd/base/**/*.ast"
+        include "main/jastadd/base/**/*.jadd"
+        include "main/jastadd/base/**/*.jrag"
+        include "main/jastadd/namelookup/**/*.ast"
+        include "main/jastadd/namelookup/**/*.jadd"
     }
 }
diff --git a/namelookup-xml-inc/build.gradle b/namelookup-xml-inc/build.gradle
index 9072536..a998254 100644
--- a/namelookup-xml-inc/build.gradle
+++ b/namelookup-xml-inc/build.gradle
@@ -12,6 +12,8 @@ plugins {
     id 'idea'
 }
 
+ext.relastFiles = []
+
 apply from: '../solve/gradle-parts/base.gradle'
 
 apply from: '../solve/gradle-parts/inc-incremental.gradle'
diff --git a/namelookup-xml-inc/jastadd_modules b/namelookup-xml-inc/jastadd_modules
index 9efe1ba..c6034b0 100644
--- a/namelookup-xml-inc/jastadd_modules
+++ b/namelookup-xml-inc/jastadd_modules
@@ -1,10 +1,10 @@
 module("solve") {
     jastadd {
         basedir "src/"
-        include "main/jastadd/**/*.ast"
-        include "main/jastadd/**/*.jadd"
-        include "main/jastadd/**/*.jrag"
-        include "main/namelookup-jastadd/**/*.jadd"
-        include "main/namelookup-jastadd/**/*.ast"
+        include "main/jastadd/base/**/*.ast"
+        include "main/jastadd/base/**/*.jadd"
+        include "main/jastadd/base/**/*.jrag"
+        include "main/jastadd/namelookup/**/*.ast"
+        include "main/jastadd/namelookup/**/*.jadd"
     }
 }
diff --git a/relast-reusable-inc/.gitignore b/relast-reusable-inc/.gitignore
new file mode 100644
index 0000000..bef26b5
--- /dev/null
+++ b/relast-reusable-inc/.gitignore
@@ -0,0 +1,6 @@
+/src/gen/
+/src/gen-res/
+/build/
+events.txt
+/src/main/jastadd/SocialNetworkGen.ast
+/src/main/jastadd/SocialNetworkGen.jadd
diff --git a/relast-reusable-inc/build.gradle b/relast-reusable-inc/build.gradle
new file mode 100644
index 0000000..9b02e1f
--- /dev/null
+++ b/relast-reusable-inc/build.gradle
@@ -0,0 +1,23 @@
+buildscript {
+    repositories.mavenCentral()
+    dependencies {
+        classpath group: 'org.jastadd', name: 'jastaddgradle', version: '1.13.3'
+    }
+}
+
+plugins {
+    id 'application'
+    id 'maven'
+    id 'java'
+    id 'idea'
+}
+
+project.ext.relastFiles = ["src/main/jastadd/base/SocialNetwork.relast",
+                   "src/main/jastadd/reusable/dg/DependencyGraph.relast",
+                   "src/main/jastadd/reusable/CommentToDG.relast"]
+
+apply from: '../solve/gradle-parts/base.gradle'
+
+apply from: '../solve/gradle-parts/inc-incremental.gradle'
+
+apply from: '../solve/gradle-parts/rel-relast.gradle'
diff --git a/relast-reusable-inc/jastadd_modules b/relast-reusable-inc/jastadd_modules
new file mode 100644
index 0000000..b1c7ae2
--- /dev/null
+++ b/relast-reusable-inc/jastadd_modules
@@ -0,0 +1,13 @@
+module("solve") {
+    jastadd {
+        basedir "src/"
+        include "main/jastadd/base/**/*.ast"
+        include "main/jastadd/base/**/*.jadd"
+        include "main/jastadd/base/**/*.jrag"
+        include "main/jastadd/reusable/dg/DependencyGraphReachability.jrag"
+        include "main/jastadd/reusable/CommentToDG.jrag"
+        include "main/jastadd/reusable/queriesRefined.jrag"
+        include "gen/jastadd/**/*.ast"
+        include "gen/jastadd/**/*.jadd"
+    }
+}
diff --git a/relast-reusable-inc/libs b/relast-reusable-inc/libs
new file mode 120000
index 0000000..8810c45
--- /dev/null
+++ b/relast-reusable-inc/libs
@@ -0,0 +1 @@
+../solve/libs
\ No newline at end of file
diff --git a/relast-reusable-inc/src/main b/relast-reusable-inc/src/main
new file mode 120000
index 0000000..009e6af
--- /dev/null
+++ b/relast-reusable-inc/src/main
@@ -0,0 +1 @@
+../../solve/src/main
\ No newline at end of file
diff --git a/relast-reusable-inc/src/test b/relast-reusable-inc/src/test
new file mode 120000
index 0000000..86aebbf
--- /dev/null
+++ b/relast-reusable-inc/src/test
@@ -0,0 +1 @@
+../../solve/src/test
\ No newline at end of file
diff --git a/relast-xml-flush/build.gradle b/relast-xml-flush/build.gradle
index f4619e2..cf5bca3 100644
--- a/relast-xml-flush/build.gradle
+++ b/relast-xml-flush/build.gradle
@@ -12,6 +12,8 @@ plugins {
     id 'idea'
 }
 
+ext.relastFiles = ["src/main/jastadd/base/SocialNetwork.relast"]
+
 apply from: '../solve/gradle-parts/base.gradle'
 
 apply from: '../solve/gradle-parts/inc-flush.gradle'
diff --git a/relast-xml-flush/jastadd_modules b/relast-xml-flush/jastadd_modules
index e126e37..161d3a2 100644
--- a/relast-xml-flush/jastadd_modules
+++ b/relast-xml-flush/jastadd_modules
@@ -1,9 +1,9 @@
 module("solve") {
     jastadd {
         basedir "src/"
-        include "main/jastadd/**/*.ast"
-        include "main/jastadd/**/*.jadd"
-        include "main/jastadd/**/*.jrag"
+        include "main/jastadd/base/**/*.ast"
+        include "main/jastadd/base/**/*.jadd"
+        include "main/jastadd/base/**/*.jrag"
         include "gen/jastadd/**/*.ast"
         include "gen/jastadd/**/*.jadd"
     }
diff --git a/relast-xml-inc/build.gradle b/relast-xml-inc/build.gradle
index 36dae73..ac6352f 100644
--- a/relast-xml-inc/build.gradle
+++ b/relast-xml-inc/build.gradle
@@ -12,6 +12,8 @@ plugins {
     id 'idea'
 }
 
+ext.relastFiles = ["src/main/jastadd/base/SocialNetwork.relast"]
+
 apply from: '../solve/gradle-parts/base.gradle'
 
 apply from: '../solve/gradle-parts/inc-incremental.gradle'
diff --git a/relast-xml-inc/jastadd_modules b/relast-xml-inc/jastadd_modules
index e126e37..161d3a2 100644
--- a/relast-xml-inc/jastadd_modules
+++ b/relast-xml-inc/jastadd_modules
@@ -1,9 +1,9 @@
 module("solve") {
     jastadd {
         basedir "src/"
-        include "main/jastadd/**/*.ast"
-        include "main/jastadd/**/*.jadd"
-        include "main/jastadd/**/*.jrag"
+        include "main/jastadd/base/**/*.ast"
+        include "main/jastadd/base/**/*.jadd"
+        include "main/jastadd/base/**/*.jrag"
         include "gen/jastadd/**/*.ast"
         include "gen/jastadd/**/*.jadd"
     }
diff --git a/settings.gradle b/settings.gradle
index b50f78c..ba25857 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,5 +1,6 @@
 include ':solve'
-include ':relast-xml-flush'
-include ':relast-xml-inc'
 include ':namelookup-xml-flush'
 include ':namelookup-xml-inc'
+include ':relast-reusable-inc'
+include ':relast-xml-flush'
+include ':relast-xml-inc'
diff --git a/solve/build.gradle b/solve/build.gradle
index 36dae73..ac6352f 100644
--- a/solve/build.gradle
+++ b/solve/build.gradle
@@ -12,6 +12,8 @@ plugins {
     id 'idea'
 }
 
+ext.relastFiles = ["src/main/jastadd/base/SocialNetwork.relast"]
+
 apply from: '../solve/gradle-parts/base.gradle'
 
 apply from: '../solve/gradle-parts/inc-incremental.gradle'
diff --git a/solve/gradle-parts/base.gradle b/solve/gradle-parts/base.gradle
index 19543bf..6851c02 100644
--- a/solve/gradle-parts/base.gradle
+++ b/solve/gradle-parts/base.gradle
@@ -1,3 +1,4 @@
+//project.ext.relastFiles = project.ext.has("relastFiles") ? project.ext.get("relastFiles") : []
 
 group 'de.tudresden.inf.st'
 version '1.0-SNAPSHOT'
@@ -52,10 +53,9 @@ task preprocess(type: JavaExec) {
             "--listClass=java.util.ArrayList",
             "--useJastAddNames",
             "--file",
-            "src/main/jastadd/SocialNetwork.relast"
-    ]
+    ] + project.ext.relastFiles
 
-    inputs.files file("./src/main/jastadd/SocialNetwork.relast")
+    inputs.files file("./src/main/jastadd/base/SocialNetwork.relast")
     outputs.files file("./src/main/jastadd/SocialNetworkGen.ast"), file("./src/main/jastadd/SocialNetworkGen.jadd")
 }
 
diff --git a/solve/jastadd_modules b/solve/jastadd_modules
index e126e37..161d3a2 100644
--- a/solve/jastadd_modules
+++ b/solve/jastadd_modules
@@ -1,9 +1,9 @@
 module("solve") {
     jastadd {
         basedir "src/"
-        include "main/jastadd/**/*.ast"
-        include "main/jastadd/**/*.jadd"
-        include "main/jastadd/**/*.jrag"
+        include "main/jastadd/base/**/*.ast"
+        include "main/jastadd/base/**/*.jadd"
+        include "main/jastadd/base/**/*.jrag"
         include "gen/jastadd/**/*.ast"
         include "gen/jastadd/**/*.jadd"
     }
diff --git a/solve/src/main/jastadd/ApplyChanges.jadd b/solve/src/main/jastadd/base/ApplyChanges.jadd
similarity index 100%
rename from solve/src/main/jastadd/ApplyChanges.jadd
rename to solve/src/main/jastadd/base/ApplyChanges.jadd
diff --git a/solve/src/main/jastadd/Checking.jrag b/solve/src/main/jastadd/base/Checking.jrag
similarity index 100%
rename from solve/src/main/jastadd/Checking.jrag
rename to solve/src/main/jastadd/base/Checking.jrag
diff --git a/solve/src/main/jastadd/Helpers.jadd b/solve/src/main/jastadd/base/Helpers.jadd
similarity index 100%
rename from solve/src/main/jastadd/Helpers.jadd
rename to solve/src/main/jastadd/base/Helpers.jadd
diff --git a/solve/src/main/jastadd/ModelNavigation.jrag b/solve/src/main/jastadd/base/ModelNavigation.jrag
similarity index 100%
rename from solve/src/main/jastadd/ModelNavigation.jrag
rename to solve/src/main/jastadd/base/ModelNavigation.jrag
diff --git a/solve/src/main/jastadd/NTA.jrag b/solve/src/main/jastadd/base/NTA.jrag
similarity index 100%
rename from solve/src/main/jastadd/NTA.jrag
rename to solve/src/main/jastadd/base/NTA.jrag
diff --git a/solve/src/main/jastadd/Printing.jrag b/solve/src/main/jastadd/base/Printing.jrag
similarity index 100%
rename from solve/src/main/jastadd/Printing.jrag
rename to solve/src/main/jastadd/base/Printing.jrag
diff --git a/solve/src/main/jastadd/SocialNetwork.relast b/solve/src/main/jastadd/base/SocialNetwork.relast
similarity index 100%
rename from solve/src/main/jastadd/SocialNetwork.relast
rename to solve/src/main/jastadd/base/SocialNetwork.relast
diff --git a/solve/src/main/jastadd/Tracing.jadd b/solve/src/main/jastadd/base/Tracing.jadd
similarity index 100%
rename from solve/src/main/jastadd/Tracing.jadd
rename to solve/src/main/jastadd/base/Tracing.jadd
diff --git a/solve/src/main/jastadd/changes.ast b/solve/src/main/jastadd/base/changes.ast
similarity index 100%
rename from solve/src/main/jastadd/changes.ast
rename to solve/src/main/jastadd/base/changes.ast
diff --git a/solve/src/main/jastadd/queries.jrag b/solve/src/main/jastadd/base/queries.jrag
similarity index 100%
rename from solve/src/main/jastadd/queries.jrag
rename to solve/src/main/jastadd/base/queries.jrag
diff --git a/solve/src/main/namelookup-jastadd/Refs.jadd b/solve/src/main/jastadd/namelookup/Refs.jadd
similarity index 100%
rename from solve/src/main/namelookup-jastadd/Refs.jadd
rename to solve/src/main/jastadd/namelookup/Refs.jadd
diff --git a/solve/src/main/namelookup-jastadd/SocialNetworkNamelookup.ast b/solve/src/main/jastadd/namelookup/SocialNetworkNamelookup.ast
similarity index 100%
rename from solve/src/main/namelookup-jastadd/SocialNetworkNamelookup.ast
rename to solve/src/main/jastadd/namelookup/SocialNetworkNamelookup.ast
diff --git a/solve/src/main/jastadd/reusable/CommentToDG.jrag b/solve/src/main/jastadd/reusable/CommentToDG.jrag
new file mode 100644
index 0000000..b092faf
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/CommentToDG.jrag
@@ -0,0 +1,20 @@
+aspect CommentToDG {
+  syn nta DependencyGraph Comment.toDependencyGraph() {
+    java.util.Map<User, Component> users = new java.util.HashMap<>();
+    DependencyGraph result = new DependencyGraph();
+    for (User commentLiker : this.getLikedByList()) {
+      Component userComponent = new Component();
+      users.put(commentLiker, userComponent);
+      result.addComponent(userComponent);
+    }
+    for (User commentLiker : this.getLikedByList()) {
+      for (User friend : commentLiker.getFriendList()) {
+        if (users.containsKey(friend)) {
+          // we ignore users up until now, because they do not like the comment anyway
+          users.get(commentLiker).addTo(users.get(friend));
+        }
+      }
+    }
+    return result;
+  }
+}
diff --git a/solve/src/main/jastadd/reusable/CommentToDG.relast b/solve/src/main/jastadd/reusable/CommentToDG.relast
new file mode 100644
index 0000000..c32529f
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/CommentToDG.relast
@@ -0,0 +1,2 @@
+rel DependencyGraph.Comment -> Comment ;
+rel Component.User -> User ;
diff --git a/solve/src/main/jastadd/reusable/dg/DGtoDotG.jrag b/solve/src/main/jastadd/reusable/dg/DGtoDotG.jrag
new file mode 100644
index 0000000..27c54fb
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/dg/DGtoDotG.jrag
@@ -0,0 +1,65 @@
+aspect DGtoDotG {
+
+  syn DotGraph DependencyGraph.dotGraph() {
+    DotGraph dg = new DotGraph();
+    //create DotGraph
+    dg.setDependencyGraph(this);
+    Map<Component,DotNode> componentMap = new HashMap<>();
+    for (Component component: getComponentList()) {
+      DotNode n = new DotNode();
+      n.setComponent(component);
+      dg.addDotNode(n);
+      componentMap.put(component, n);
+    }
+
+    for (Component from: getComponentList()) {
+      for (Component to: from.getToList()) {
+        if (to.getToList().contains(from)) {
+          if (to.hashCode() < from.hashCode()) {
+            componentMap.get(from).addRel(componentMap.get(to));
+          }
+        } else {
+          componentMap.get(from).addRef(componentMap.get(to));
+        }
+      }
+    }
+
+    return dg;
+  }
+
+  syn DotGraph DependencyGraph.dotGraph(Set<Component> components) {
+    DotGraph dg = new DotGraph();
+    //Ensure that components are part of DependencyGraph
+    Set<Component> subset=new HashSet();
+    for (Component c:getComponentList())
+      subset.add(c);
+    subset.retainAll(components);
+
+    //create DotGraph
+    dg.setDependencyGraph(this);
+    Map<Component,DotNode> componentMap = new HashMap<>();
+    for (Component component: subset) {
+      DotNode n = new DotNode();
+      n.setComponent(component);
+      dg.addDotNode(n);
+      componentMap.put(component, n);
+    }
+
+    for (Component from: subset) {
+      for (Component to: from.getToList()) {
+        if (subset.contains(to)) {
+          if (to.getToList().contains(from)) {
+            if (to.hashCode() < from.hashCode()) {
+              componentMap.get(from).addRel(componentMap.get(to));
+            }
+          } else {
+            componentMap.get(from).addRef(componentMap.get(to));
+          }
+        }
+      }
+    }
+
+    return dg;
+  }
+
+}
diff --git a/solve/src/main/jastadd/reusable/dg/DGtoDotG.relast b/solve/src/main/jastadd/reusable/dg/DGtoDotG.relast
new file mode 100644
index 0000000..17412cf
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/dg/DGtoDotG.relast
@@ -0,0 +1,2 @@
+rel DotGraph.DependencyGraph -> DependencyGraph;
+rel DotNode.Component -> Component;
diff --git a/solve/src/main/jastadd/reusable/dg/DependencyGraph.relast b/solve/src/main/jastadd/reusable/dg/DependencyGraph.relast
new file mode 100644
index 0000000..8501137
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/dg/DependencyGraph.relast
@@ -0,0 +1,3 @@
+DependencyGraph ::= Component*;
+Component;
+rel Component.From* <-> Component.To*;
diff --git a/solve/src/main/jastadd/reusable/dg/DependencyGraphReachability.jrag b/solve/src/main/jastadd/reusable/dg/DependencyGraphReachability.jrag
new file mode 100644
index 0000000..757ab2a
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/dg/DependencyGraphReachability.jrag
@@ -0,0 +1,59 @@
+import java.util.*;
+import java.util.stream.Collectors;
+
+aspect Naviagation {
+  inh DependencyGraph Component.dg();
+  eq DependencyGraph.getComponent().dg() = this;
+}
+
+aspect Reachability {
+
+// old, dependency-based algorithm for SCC
+
+//  coll Set<Component> Component.successors() circular [new HashSet<>()] with add root DependencyGraph;
+//  Component contributes this to Component.successors() for each getToList();
+//  Component contributes each this.successors() to Component.successors() for each getToList();
+
+//  coll Set<Component> Component.predecessors() [new HashSet<>()] with add root DependencyGraph;
+//  Component contributes this to Component.predecessors() for each successors();
+
+//  coll HashSet<Component> Component.SCC() with add root DependencyGraph;
+//  Component contributes each predecessors() when (successors().contains(this)) to Component.SCC() for this;
+
+//  coll HashSet<Set<Component>> DependencyGraph.SCC() with add root DependencyGraph;
+//  Component contributes SCC() when SCC().size() > 0 to DependencyGraph.SCC();
+
+  /**
+   * Kosaraju's algorithm
+   */
+  syn Set<Set<Component>> DependencyGraph.SCC() {
+    Map<Component, Set> visited = new HashMap<>();
+    LinkedList<Component> locked = new LinkedList<>();
+
+    for (Component c : getComponentList())
+      if (!visited.containsKey(c))
+        c.visit(visited, locked);              // forward search
+
+    for (Component c : locked)
+      if (visited.get(c) == null)
+        c.assign(visited, new HashSet());      // backward search
+
+    return new HashSet(visited.values());
+  }
+
+  void Component.visit(Map<Component, Set> visited, LinkedList<Component> locked) {
+    visited.put(this, null);
+    for (Component c : getFromList())
+      if (!visited.containsKey(c))
+        c.visit(visited, locked);
+    locked.addFirst(this);
+  }
+
+  void Component.assign(Map<Component, Set> visited, Set scc) {
+    scc.add(this);
+    visited.put(this, scc);
+    for (Component c : getToList())
+      if (visited.get(c) == null)
+        c.assign(visited, scc);
+  }
+}
diff --git a/solve/src/main/jastadd/reusable/dg/DotGraph.jrag b/solve/src/main/jastadd/reusable/dg/DotGraph.jrag
new file mode 100644
index 0000000..a6ee204
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/dg/DotGraph.jrag
@@ -0,0 +1,58 @@
+aspect DotGraphToPlantUML {
+
+  inh String DotNode.name();
+  eq DotGraph.getDotNode(int i).name() = "v" + i;
+
+  syn String DotNode.label() = name();
+
+  syn String DotGraph.toDot() {
+    StringBuilder b = new StringBuilder();
+    b.append("strict digraph cycles {\n");
+
+    for (DotNode from: getDotNodeList()) {
+      b.append("  ").append(from.name()).append("[label=\"").append(from.label()).append("\"];\n");
+
+      for (DotNode to: from.getRefList()) {
+        b.append("  ").append(from.name()).append(" -> ").append(to.name()).append(";\n");
+      }
+      for (DotNode to: from.getRelList()) {
+        b.append("  ").append(from.name()).append(" -> ").append(to.name()).append("[dir=\"both\"];\n");
+      }
+    }
+
+    b.append("}\n");
+    return b.toString();
+  }
+
+  syn String DotGraph.toPlant(String shape, String relation) {
+    StringBuilder b = new StringBuilder();
+    b.append("@startuml\n")
+      .append("hide circle\n")
+      .append("skinparam shadowing false\n")
+      .append("skinparam monochrome true\n")
+      .append("skinparam classAttributeIconSize 0\n")
+      .append("/'Remove automatic namespace generation'/\n")
+      .append("set namespaceSeparator none\n");
+
+    for (DotNode from: getDotNodeList()) {
+      b.append(shape).append(" ")
+        .append(from.label()).append("\n");
+    }
+
+    for (DotNode from: getDotNodeList()) {
+      for (DotNode to: from.getRefList()) {
+          b.append(from.label())
+            .append(" ").append(relation).append("> ")
+            .append(to.label()).append("\n");
+      }
+      for (DotNode to: from.getRelList()) {
+        b.append(from.label())
+          .append(" <").append(relation).append("> ")
+          .append(to.label()).append("\n");
+      }
+    }
+
+    b.append("@enduml\n");
+    return b.toString();
+  }
+}
diff --git a/solve/src/main/jastadd/reusable/dg/DotGraph.relast b/solve/src/main/jastadd/reusable/dg/DotGraph.relast
new file mode 100644
index 0000000..1bb8ddf
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/dg/DotGraph.relast
@@ -0,0 +1,4 @@
+DotGraph ::= DotNode*;
+DotNode;
+rel DotNode.Ref* -> DotNode;
+rel DotNode.Rel* -> DotNode;
diff --git a/solve/src/main/jastadd/reusable/queriesRefined.jrag b/solve/src/main/jastadd/reusable/queriesRefined.jrag
new file mode 100644
index 0000000..9b17247
--- /dev/null
+++ b/solve/src/main/jastadd/reusable/queriesRefined.jrag
@@ -0,0 +1,12 @@
+aspect QueriesRefined {
+  refine Queries eq Comment.score() {
+    int score = 0;
+    Set<Set<Component>> sccs = this.toDependencyGraph().SCC();
+    for (Set<Component> userSet : sccs) {
+      int usize = userSet.size();
+      score += usize * usize;
+    }
+    return score;
+  }
+
+}
diff --git a/time-q1.sh b/time-q1.sh
deleted file mode 100755
index 67987dc..0000000
--- a/time-q1.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-# ./gradlew installDist
-time ChangeSet=$1 ChangePath=solve/src/test/resources/models/$1/ Sequences=20 Query=Q1 java -jar solve/build/libs/solve-1.0-SNAPSHOT.jar
diff --git a/timedBenchmark.sh b/timedBenchmark.sh
new file mode 100755
index 0000000..7ca7e21
--- /dev/null
+++ b/timedBenchmark.sh
@@ -0,0 +1,6 @@
+# Example call: "./timedBenchmark.sh relast-xml-inc 2 8"
+project=$1
+query=$2
+size=$3
+./gradlew :${project}:installDist
+time ChangeSet=$size ChangePath=solve/src/test/resources/models/$size/ Sequences=20 Query=Q$query java -jar $project/build/libs/solve-1.0-SNAPSHOT.jar
-- 
GitLab