aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/endomorph/plan
diff options
context:
space:
mode:
authorRncLsn <rnc.lsn@gmail.com>2015-05-28 17:11:35 +0100
committerRncLsn <rnc.lsn@gmail.com>2015-05-28 17:11:35 +0100
commitde3749532d060f26c966a81c03f9a5d846c33d06 (patch)
tree6cc5ba2837dc3c167b100f5e8be4e8c16da7be98 /src/uk/ac/ox/cs/pagoda/endomorph/plan
parent4298cdef8e551325cd16b4e24ae6699c44b60751 (diff)
downloadACQuA-de3749532d060f26c966a81c03f9a5d846c33d06.tar.gz
ACQuA-de3749532d060f26c966a81c03f9a5d846c33d06.zip
Merged updates from upstream.
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/endomorph/plan')
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java85
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java74
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java6
3 files changed, 91 insertions, 74 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java
index 8c7ce6a..862fdc8 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java
@@ -1,88 +1,81 @@
1package uk.ac.ox.cs.pagoda.endomorph.plan; 1package uk.ac.ox.cs.pagoda.endomorph.plan;
2 2
3import java.util.Collection;
4import java.util.Collections;
5import java.util.LinkedList;
6import java.util.Map;
7import java.util.Set;
8import java.util.concurrent.ConcurrentHashMap;
9import java.util.concurrent.ConcurrentLinkedDeque;
10import java.util.concurrent.atomic.AtomicInteger;
11
12import uk.ac.ox.cs.pagoda.endomorph.DependencyGraph;
13import uk.ac.ox.cs.pagoda.endomorph.Clique; 3import uk.ac.ox.cs.pagoda.endomorph.Clique;
4import uk.ac.ox.cs.pagoda.endomorph.DependencyGraph;
14import uk.ac.ox.cs.pagoda.query.AnswerTuple; 5import uk.ac.ox.cs.pagoda.query.AnswerTuple;
15import uk.ac.ox.cs.pagoda.reasoner.full.Checker; 6import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
16import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker; 7import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker;
17import uk.ac.ox.cs.pagoda.util.Utility; 8import uk.ac.ox.cs.pagoda.util.Utility;
18 9
10import java.util.*;
11import java.util.concurrent.ConcurrentHashMap;
12import java.util.concurrent.ConcurrentLinkedDeque;
13import java.util.concurrent.atomic.AtomicInteger;
14
19public class OpenEndMultiThreadPlan implements CheckPlan { 15public class OpenEndMultiThreadPlan implements CheckPlan {
20 16
21 Checker checker; 17 Checker checker;
22 DependencyGraph dGraph; 18 DependencyGraph dGraph;
23 19 // Clique[] topo;
20// AtomicInteger open, end;
21 ConcurrentLinkedDeque<Clique> topo;
22 Set<Clique> validated, falsified;
23 AtomicInteger counter = new AtomicInteger();
24
24 public OpenEndMultiThreadPlan(Checker checker, DependencyGraph dGraph) { 25 public OpenEndMultiThreadPlan(Checker checker, DependencyGraph dGraph) {
25 this.checker = checker; 26 this.checker = checker;
26 this.dGraph = dGraph; 27 this.dGraph = dGraph;
27 } 28 }
28 29
29// Clique[] topo;
30// AtomicInteger open, end;
31 ConcurrentLinkedDeque<Clique> topo;
32
33 Set<Clique> validated, falsified;
34
35 @Override 30 @Override
36 public int check() { 31 public int check() {
37 Collection<Clique> cliques = dGraph.getTopologicalOrder(); 32 Collection<Clique> cliques = dGraph.getTopologicalOrder();
38// topo = new LinkedBlockingDeque<Clique>(cliques); 33// topo = new LinkedBlockingDeque<Clique>(cliques);
39 topo = new ConcurrentLinkedDeque<Clique>(cliques); 34 topo = new ConcurrentLinkedDeque<Clique>(cliques);
40 35
41// topo = new Clique[cliques.size()]; 36// topo = new Clique[cliques.size()];
42// int index = 0; 37// int index = 0;
43// for (Clique clique: cliques) topo[index++] = clique; 38// for (Clique clique: cliques) topo[index++] = clique;
44// open = new AtomicInteger(); 39// open = new AtomicInteger();
45// end = new AtomicInteger(cliques.size() - 1); 40// end = new AtomicInteger(cliques.size() - 1);
46 41
47// validated = Collections.synchronizedSet(new HashSet<Clique>()); 42// validated = Collections.synchronizedSet(new HashSet<Clique>());
48// falsified = Collections.synchronizedSet(new HashSet<Clique>()); 43// falsified = Collections.synchronizedSet(new HashSet<Clique>());
49 validated = Collections.newSetFromMap(new ConcurrentHashMap<Clique, Boolean>()); 44 validated = Collections.newSetFromMap(new ConcurrentHashMap<Clique, Boolean>());
50 falsified = Collections.newSetFromMap(new ConcurrentHashMap<Clique, Boolean>()); 45 falsified = Collections.newSetFromMap(new ConcurrentHashMap<Clique, Boolean>());
51 46
52 int numOfThreads = 10; 47 int numOfThreads = 10;
53 Collection<Thread> threads = new LinkedList<Thread>(); 48 Collection<Thread> threads = new LinkedList<Thread>();
54 for (int i = 0; i < numOfThreads; ++i) 49 for(int i = 0; i < numOfThreads; ++i)
55 threads.add(new Thread(new SubThread(new HermitChecker(checker), i))); 50 threads.add(new Thread(new SubThread(new HermitChecker(checker), i)));
56 51
57 for (Thread thread: threads) thread.start(); 52 for (Thread thread: threads) thread.start();
58 53
59 for (Thread thread: threads) { 54 for (Thread thread: threads) {
60 try { 55 try {
61 thread.join(); 56 thread.join();
62 } catch (InterruptedException e) { 57 } catch (InterruptedException e) {
63 e.printStackTrace(); 58 e.printStackTrace();
64 } 59 }
65 } 60 }
66 61
67 Utility.logDebug("HermiT was called " + counter.get() + " times."); 62 Utility.logDebug("HermiT was called " + counter.get() + " times.");
68 63
69 int count = 0; 64 int count = 0;
70 for (Clique c: dGraph.getTopologicalOrder()) { 65 for (Clique c: dGraph.getTopologicalOrder()) {
71 if (validated.contains(c)) 66 if (validated.contains(c))
72 count += c.getNodeTuples().size() + 1; 67 count += c.getNodeTuples().size();
73 } 68 }
74 return count; 69 return count;
75 } 70 }
76 71
77 private void setMarkCascadely(Clique clique, Set<Clique> marked, Map<Clique, Collection<Clique>> edges) { 72 private void setMarkCascadely(Clique clique, Set<Clique> marked, Map<Clique, Collection<Clique>> edges) {
78 marked.add(clique); 73 marked.add(clique);
79 if (edges.containsKey(clique)) 74 if (edges.containsKey(clique))
80 for (Clique c: edges.get(clique)) 75 for (Clique c: edges.get(clique))
81 if (!marked.contains(c)) 76 if(!marked.contains(c))
82 setMarkCascadely(c, marked, edges); 77 setMarkCascadely(c, marked, edges);
83 } 78 }
84
85 AtomicInteger counter = new AtomicInteger();
86 79
87 class SubThread implements Runnable { 80 class SubThread implements Runnable {
88 81
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
index 19d567a..3294c31 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
@@ -17,37 +17,39 @@ public class OpenEndPlan implements CheckPlan {
17 public static final int TIME_OUT_MIN = 1; 17 public static final int TIME_OUT_MIN = 1;
18 18
19 Checker checker; 19 Checker checker;
20 DependencyGraph dGraph; 20 DependencyGraph dGraph;
21 QueryRecord m_record; 21 QueryRecord m_record;
22 22 int m_answerArity;
23 Set<Clique> validated = new HashSet<Clique>();
24 Set<Clique> falsified = new HashSet<Clique>();
25 Set<AnswerTuple> passedAnswers = new HashSet<AnswerTuple>();
23 public OpenEndPlan(Checker checker, DependencyGraph dGraph, QueryRecord record) { 26 public OpenEndPlan(Checker checker, DependencyGraph dGraph, QueryRecord record) {
24 this.checker = checker; 27 this.checker = checker;
25 this.dGraph = dGraph; 28 this.dGraph = dGraph;
26 m_record = record; 29 m_record = record;
30 m_answerArity = record.getAnswerVariables().length;
27 } 31 }
28 32
29 @Override 33 @Override
30 public int check() { 34 public int check() {
31 Deque<Clique> topo = new LinkedList<Clique>(dGraph.getTopologicalOrder()); 35 LinkedList<Clique> topo = new LinkedList<Clique>(dGraph.getTopologicalOrder());
32 Utility.logInfo("Entrances: " + dGraph.getEntrances().size() + " Exists: " + dGraph.getExits().size()); 36 Utility.logInfo("Entrances: " + dGraph.getEntrances().size() + " Exists: " + dGraph.getExits().size());
33 Set<Clique> validated = new HashSet<Clique>();
34 Set<Clique> falsified = new HashSet<Clique>();
35 37
36 boolean flag = true; 38 boolean flag = true;
37 Clique clique; 39 Clique clique;
38 Timer t = new Timer(); 40 Timer t = new Timer();
39
40 41
41 AnswerTuple answerTuple; 42 AnswerTuple answerTuple;
42 while (!topo.isEmpty()) { 43 while (!topo.isEmpty()) {
43 if (flag) { 44 if (flag) {
44 clique = topo.removeFirst(); 45 clique = topo.removeFirst();
46 if(redundant(clique)) continue;
45 if (validated.contains(clique)) continue; 47 if (validated.contains(clique)) continue;
46 if (falsified.contains(clique)) { flag = false; continue; } 48 if (falsified.contains(clique)) { flag = false; continue; }
47 Utility.logDebug("start checking front ... " + (answerTuple = clique.getRepresentative().getAnswerTuple())); 49 Utility.logDebug("start checking front ... " + (answerTuple = clique.getRepresentative().getAnswerTuple()));
48 if (checker.check(answerTuple)) { 50 if (checker.check(answerTuple)) {
49 Utility.logDebug(answerTuple.toString() + " is verified."); 51 Utility.logDebug(answerTuple.toString() + " is verified.");
50 setMarkCascadely(clique, validated, dGraph.getOutGoingEdges()); 52 setMarkCascadelyValidated(clique);
51 } 53 }
52 else { 54 else {
53 falsified.add(clique); 55 falsified.add(clique);
@@ -58,12 +60,12 @@ public class OpenEndPlan implements CheckPlan {
58 clique = topo.removeLast(); 60 clique = topo.removeLast();
59 if (falsified.contains(clique)) continue; 61 if (falsified.contains(clique)) continue;
60 if (validated.contains(clique)) { flag = true; continue; } 62 if (validated.contains(clique)) { flag = true; continue; }
61 Utility.logDebug("start checking back ... " + (answerTuple = clique.getRepresentative().getAnswerTuple())); 63 Utility.logDebug("start checking back ... " + (answerTuple = clique.getRepresentative().getAnswerTuple()));
62 if (!checker.check(answerTuple)) 64 if(!checker.check(answerTuple))
63 setMarkCascadely(clique, falsified, dGraph.getInComingEdges()); 65 setMarkCascadelyFasified(clique);
64 else { 66 else {
65 Utility.logDebug(answerTuple.toString() + " is verified."); 67 Utility.logDebug(answerTuple.toString() + " is verified.");
66 validated.add(clique); 68 addProjections(clique);
67 flag = true; 69 flag = true;
68 } 70 }
69 } 71 }
@@ -76,9 +78,8 @@ public class OpenEndPlan implements CheckPlan {
76 Collection<AnswerTuple> validAnswers = new LinkedList<AnswerTuple>(); 78 Collection<AnswerTuple> validAnswers = new LinkedList<AnswerTuple>();
77 for (Clique c: dGraph.getTopologicalOrder()) 79 for (Clique c: dGraph.getTopologicalOrder())
78 if (validated.contains(c)) { 80 if (validated.contains(c)) {
79 count += c.getNodeTuples().size() + 1; 81 count += c.getNodeTuples().size();
80 validAnswers.add(c.getRepresentative().getAnswerTuple()); 82// validAnswers.add(c.getRepresentative().getAnswerTuple());
81
82 for (NodeTuple nodeTuple: c.getNodeTuples()) { 83 for (NodeTuple nodeTuple: c.getNodeTuples()) {
83 ans = nodeTuple.getAnswerTuple(); 84 ans = nodeTuple.getAnswerTuple();
84 validAnswers.add(ans); 85 validAnswers.add(ans);
@@ -91,12 +92,35 @@ public class OpenEndPlan implements CheckPlan {
91 return count; 92 return count;
92 } 93 }
93 94
94 private void setMarkCascadely(Clique clique, Set<Clique> marked, Map<Clique, Collection<Clique>> edges) { 95 private boolean redundant(Clique clique) {
95 marked.add(clique); 96 for(NodeTuple nodeTuple : clique.getNodeTuples())
97 if(!passedAnswers.contains(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity)))
98 return false;
99 return true;
100 }
101
102 private void addProjections(Clique clique) {
103 for(NodeTuple nodeTuple : clique.getNodeTuples())
104 passedAnswers.add(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity));
105 }
106
107 private void setMarkCascadelyValidated(Clique clique) {
108 validated.add(clique);
109 addProjections(clique);
110 Map<Clique, Collection<Clique>> edges = dGraph.getOutGoingEdges();
96 if (edges.containsKey(clique)) 111 if (edges.containsKey(clique))
97 for (Clique c: edges.get(clique)) 112 for (Clique c: edges.get(clique))
98 if (!marked.contains(c)) 113 if(!validated.contains(c))
99 setMarkCascadely(c, marked, edges); 114 setMarkCascadelyValidated(c);
115 }
116
117 private void setMarkCascadelyFasified(Clique clique) {
118 falsified.add(clique);
119 Map<Clique, Collection<Clique>> edges = dGraph.getInComingEdges();
120 if(edges.containsKey(clique))
121 for(Clique c : edges.get(clique))
122 if(!falsified.contains(c))
123 setMarkCascadelyFasified(c);
100 } 124 }
101 125
102} 126}
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java
index d6067d0..5e1a700 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java
@@ -1,12 +1,12 @@
1package uk.ac.ox.cs.pagoda.endomorph.plan; 1package uk.ac.ox.cs.pagoda.endomorph.plan;
2 2
3import java.util.Set;
4
5import uk.ac.ox.cs.pagoda.endomorph.Clique; 3import uk.ac.ox.cs.pagoda.endomorph.Clique;
6import uk.ac.ox.cs.pagoda.reasoner.full.Checker; 4import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
7import uk.ac.ox.cs.pagoda.summary.NodeTuple; 5import uk.ac.ox.cs.pagoda.summary.NodeTuple;
8import uk.ac.ox.cs.pagoda.util.Utility; 6import uk.ac.ox.cs.pagoda.util.Utility;
9 7
8import java.util.Set;
9
10public class PlainPlan implements CheckPlan { 10public class PlainPlan implements CheckPlan {
11 11
12 Checker checker; 12 Checker checker;
@@ -22,7 +22,7 @@ public class PlainPlan implements CheckPlan {
22 int count = 0; 22 int count = 0;
23 for (Clique clique: toCheck) 23 for (Clique clique: toCheck)
24 if (checker.check(clique.getRepresentative().getAnswerTuple())) { 24 if (checker.check(clique.getRepresentative().getAnswerTuple())) {
25 count += clique.getNodeTuples().size() + 1; 25 count += clique.getNodeTuples().size();
26 for (NodeTuple nodeTuple: clique.getNodeTuples()) 26 for (NodeTuple nodeTuple: clique.getNodeTuples())
27 Utility.logDebug(nodeTuple.getAnswerTuple().toString()); 27 Utility.logDebug(nodeTuple.getAnswerTuple().toString());
28 } 28 }