aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/endomorph/plan
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/endomorph/plan')
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/CheckPlan.java7
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java136
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java106
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java32
4 files changed, 281 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/CheckPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/CheckPlan.java
new file mode 100644
index 0000000..ab3735f
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/CheckPlan.java
@@ -0,0 +1,7 @@
1package uk.ac.ox.cs.pagoda.endomorph.plan;
2
3public interface CheckPlan {
4
5 public int check();
6
7}
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java
new file mode 100644
index 0000000..8c7ce6a
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndMultiThreadPlan.java
@@ -0,0 +1,136 @@
1package uk.ac.ox.cs.pagoda.endomorph.plan;
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;
14import uk.ac.ox.cs.pagoda.query.AnswerTuple;
15import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
16import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker;
17import uk.ac.ox.cs.pagoda.util.Utility;
18
19public class OpenEndMultiThreadPlan implements CheckPlan {
20
21 Checker checker;
22 DependencyGraph dGraph;
23
24 public OpenEndMultiThreadPlan(Checker checker, DependencyGraph dGraph) {
25 this.checker = checker;
26 this.dGraph = dGraph;
27 }
28
29// Clique[] topo;
30// AtomicInteger open, end;
31 ConcurrentLinkedDeque<Clique> topo;
32
33 Set<Clique> validated, falsified;
34
35 @Override
36 public int check() {
37 Collection<Clique> cliques = dGraph.getTopologicalOrder();
38// topo = new LinkedBlockingDeque<Clique>(cliques);
39 topo = new ConcurrentLinkedDeque<Clique>(cliques);
40
41// topo = new Clique[cliques.size()];
42// int index = 0;
43// for (Clique clique: cliques) topo[index++] = clique;
44// open = new AtomicInteger();
45// end = new AtomicInteger(cliques.size() - 1);
46
47// validated = Collections.synchronizedSet(new HashSet<Clique>());
48// falsified = Collections.synchronizedSet(new HashSet<Clique>());
49 validated = Collections.newSetFromMap(new ConcurrentHashMap<Clique, Boolean>());
50 falsified = Collections.newSetFromMap(new ConcurrentHashMap<Clique, Boolean>());
51
52 int numOfThreads = 10;
53 Collection<Thread> threads = new LinkedList<Thread>();
54 for (int i = 0; i < numOfThreads; ++i)
55 threads.add(new Thread(new SubThread(new HermitChecker(checker), i)));
56
57 for (Thread thread: threads) thread.start();
58
59 for (Thread thread: threads) {
60 try {
61 thread.join();
62 } catch (InterruptedException e) {
63 e.printStackTrace();
64 }
65 }
66
67 Utility.logDebug("HermiT was called " + counter.get() + " times.");
68
69 int count = 0;
70 for (Clique c: dGraph.getTopologicalOrder()) {
71 if (validated.contains(c))
72 count += c.getNodeTuples().size() + 1;
73 }
74 return count;
75 }
76
77 private void setMarkCascadely(Clique clique, Set<Clique> marked, Map<Clique, Collection<Clique>> edges) {
78 marked.add(clique);
79 if (edges.containsKey(clique))
80 for (Clique c: edges.get(clique))
81 if (!marked.contains(c))
82 setMarkCascadely(c, marked, edges);
83 }
84
85 AtomicInteger counter = new AtomicInteger();
86
87 class SubThread implements Runnable {
88
89 HermitChecker m_checker;
90 int m_ID;
91
92 public SubThread(HermitChecker checker, int ID) {
93 m_checker = checker;
94 m_ID = ID;
95 }
96
97 @Override
98 public void run() {
99 boolean flag = ((m_ID & 1) == 0);
100 Clique clique;
101 AnswerTuple answerTuple;
102 while (!topo.isEmpty())
103 if (flag) {
104 clique = topo.removeFirst();
105 if (validated.contains(clique)) continue;
106 if (falsified.contains(clique)) { flag = false; continue; }
107 counter.incrementAndGet();
108 Utility.logDebug("Thread " + m_ID + ": start checking front ... " + (answerTuple = clique.getRepresentative().getAnswerTuple()));
109 if (m_checker.check(answerTuple)) {
110 setMarkCascadely(clique, validated, dGraph.getOutGoingEdges());
111 }
112 else {
113 falsified.add(clique);
114 flag = false;
115 }
116 }
117 else {
118 clique = topo.removeLast();
119 if (falsified.contains(clique)) continue;
120 if (validated.contains(clique)) { flag = true; continue; }
121 counter.incrementAndGet();
122 Utility.logDebug("Thread " + m_ID + ": start checking back ... " + (answerTuple = clique.getRepresentative().getAnswerTuple()));
123 if (!m_checker.check(answerTuple))
124 setMarkCascadely(clique, falsified, dGraph.getInComingEdges());
125 else {
126 validated.add(clique);
127 flag = true;
128 }
129 }
130
131 m_checker.dispose();
132 }
133
134 }
135}
136
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
new file mode 100644
index 0000000..202021d
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
@@ -0,0 +1,106 @@
1package uk.ac.ox.cs.pagoda.endomorph.plan;
2
3import java.util.Collection;
4import java.util.Deque;
5import java.util.HashSet;
6import java.util.LinkedList;
7import java.util.Map;
8import java.util.Set;
9
10import uk.ac.ox.cs.pagoda.endomorph.*;
11import uk.ac.ox.cs.pagoda.query.AnswerTuple;
12import uk.ac.ox.cs.pagoda.query.QueryRecord;
13import uk.ac.ox.cs.pagoda.query.QueryRecord.Step;
14import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
15import uk.ac.ox.cs.pagoda.summary.NodeTuple;
16import uk.ac.ox.cs.pagoda.util.Timer;
17import uk.ac.ox.cs.pagoda.util.Utility;
18
19public class OpenEndPlan implements CheckPlan {
20
21 public static final int TIME_OUT_MIN = 1;
22
23 Checker checker;
24 DependencyGraph dGraph;
25 QueryRecord m_record;
26
27 public OpenEndPlan(Checker checker, DependencyGraph dGraph, QueryRecord record) {
28 this.checker = checker;
29 this.dGraph = dGraph;
30 m_record = record;
31 }
32
33 @Override
34 public int check() {
35 Deque<Clique> topo = new LinkedList<Clique>(dGraph.getTopologicalOrder());
36 Utility.logInfo("Entrances: " + dGraph.getEntrances().size() + " Exists: " + dGraph.getExits().size());
37 Set<Clique> validated = new HashSet<Clique>();
38 Set<Clique> falsified = new HashSet<Clique>();
39
40 boolean flag = true;
41 Clique clique;
42 Timer t = new Timer();
43
44
45 AnswerTuple answerTuple;
46 while (!topo.isEmpty()) {
47 if (flag) {
48 clique = topo.removeFirst();
49 if (validated.contains(clique)) continue;
50 if (falsified.contains(clique)) { flag = false; continue; }
51 Utility.logDebug("start checking front ... " + (answerTuple = clique.getRepresentative().getAnswerTuple()));
52 if (checker.check(answerTuple)) {
53 Utility.logDebug(answerTuple.toString() + " is verified.");
54 setMarkCascadely(clique, validated, dGraph.getOutGoingEdges());
55 }
56 else {
57 falsified.add(clique);
58 flag = false;
59 }
60 }
61 else {
62 clique = topo.removeLast();
63 if (falsified.contains(clique)) continue;
64 if (validated.contains(clique)) { flag = true; continue; }
65 Utility.logDebug("start checking back ... " + (answerTuple = clique.getRepresentative().getAnswerTuple()));
66 if (!checker.check(answerTuple))
67 setMarkCascadely(clique, falsified, dGraph.getInComingEdges());
68 else {
69 Utility.logDebug(answerTuple.toString() + " is verified.");
70 validated.add(clique);
71 flag = true;
72 }
73 }
74 }
75
76// Utility.logDebug("HermiT was called " + times + " times.");
77
78 int count = 0;
79 AnswerTuple ans;
80 Collection<AnswerTuple> validAnswers = new LinkedList<AnswerTuple>();
81 for (Clique c: dGraph.getTopologicalOrder())
82 if (validated.contains(c)) {
83 count += c.getNodeTuples().size() + 1;
84 validAnswers.add(c.getRepresentative().getAnswerTuple());
85
86 for (NodeTuple nodeTuple: c.getNodeTuples()) {
87 ans = nodeTuple.getAnswerTuple();
88 validAnswers.add(ans);
89 Utility.logDebug(ans + " is verified.");
90 }
91 }
92
93 m_record.addLowerBoundAnswers(validAnswers);
94 m_record.addProcessingTime(Step.FullReasoning, t.duration());
95 return count;
96 }
97
98 private void setMarkCascadely(Clique clique, Set<Clique> marked, Map<Clique, Collection<Clique>> edges) {
99 marked.add(clique);
100 if (edges.containsKey(clique))
101 for (Clique c: edges.get(clique))
102 if (!marked.contains(c))
103 setMarkCascadely(c, marked, edges);
104 }
105
106}
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java
new file mode 100644
index 0000000..d6067d0
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/PlainPlan.java
@@ -0,0 +1,32 @@
1package uk.ac.ox.cs.pagoda.endomorph.plan;
2
3import java.util.Set;
4
5import uk.ac.ox.cs.pagoda.endomorph.Clique;
6import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
7import uk.ac.ox.cs.pagoda.summary.NodeTuple;
8import uk.ac.ox.cs.pagoda.util.Utility;
9
10public class PlainPlan implements CheckPlan {
11
12 Checker checker;
13 Set<Clique> toCheck;
14
15 public PlainPlan(Checker checker, Set<Clique> toCheck) {
16 this.checker = checker;
17 this.toCheck = toCheck;
18 }
19
20 @Override
21 public int check() {
22 int count = 0;
23 for (Clique clique: toCheck)
24 if (checker.check(clique.getRepresentative().getAnswerTuple())) {
25 count += clique.getNodeTuples().size() + 1;
26 for (NodeTuple nodeTuple: clique.getNodeTuples())
27 Utility.logDebug(nodeTuple.getAnswerTuple().toString());
28 }
29 return count;
30 }
31
32}