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