diff options
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/endomorph/plan')
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 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; | ||
| 2 | |||
| 3 | public 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 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; | ||
| 2 | |||
| 3 | import java.util.Collection; | ||
| 4 | import java.util.Collections; | ||
| 5 | import java.util.LinkedList; | ||
| 6 | import java.util.Map; | ||
| 7 | import java.util.Set; | ||
| 8 | import java.util.concurrent.ConcurrentHashMap; | ||
| 9 | import java.util.concurrent.ConcurrentLinkedDeque; | ||
| 10 | import java.util.concurrent.atomic.AtomicInteger; | ||
| 11 | |||
| 12 | import uk.ac.ox.cs.pagoda.endomorph.DependencyGraph; | ||
| 13 | import uk.ac.ox.cs.pagoda.endomorph.Clique; | ||
| 14 | import uk.ac.ox.cs.pagoda.query.AnswerTuple; | ||
| 15 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; | ||
| 16 | import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker; | ||
| 17 | import uk.ac.ox.cs.pagoda.util.Utility; | ||
| 18 | |||
| 19 | public 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 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; | ||
| 2 | |||
| 3 | import java.util.Collection; | ||
| 4 | import java.util.Deque; | ||
| 5 | import java.util.HashSet; | ||
| 6 | import java.util.LinkedList; | ||
| 7 | import java.util.Map; | ||
| 8 | import java.util.Set; | ||
| 9 | |||
| 10 | import uk.ac.ox.cs.pagoda.endomorph.*; | ||
| 11 | import uk.ac.ox.cs.pagoda.query.AnswerTuple; | ||
| 12 | import uk.ac.ox.cs.pagoda.query.QueryRecord; | ||
| 13 | import uk.ac.ox.cs.pagoda.query.QueryRecord.Step; | ||
| 14 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; | ||
| 15 | import uk.ac.ox.cs.pagoda.summary.NodeTuple; | ||
| 16 | import uk.ac.ox.cs.pagoda.util.Timer; | ||
| 17 | import uk.ac.ox.cs.pagoda.util.Utility; | ||
| 18 | |||
| 19 | public 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 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; | ||
| 2 | |||
| 3 | import java.util.Set; | ||
| 4 | |||
| 5 | import uk.ac.ox.cs.pagoda.endomorph.Clique; | ||
| 6 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; | ||
| 7 | import uk.ac.ox.cs.pagoda.summary.NodeTuple; | ||
| 8 | import uk.ac.ox.cs.pagoda.util.Utility; | ||
| 9 | |||
| 10 | public 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 | } | ||
