diff options
| author | RncLsn <rnc.lsn@gmail.com> | 2015-05-28 17:11:35 +0100 |
|---|---|---|
| committer | RncLsn <rnc.lsn@gmail.com> | 2015-05-28 17:11:35 +0100 |
| commit | de3749532d060f26c966a81c03f9a5d846c33d06 (patch) | |
| tree | 6cc5ba2837dc3c167b100f5e8be4e8c16da7be98 /src/uk/ac/ox/cs/pagoda/endomorph | |
| parent | 4298cdef8e551325cd16b4e24ae6699c44b60751 (diff) | |
| download | ACQuA-de3749532d060f26c966a81c03f9a5d846c33d06.tar.gz ACQuA-de3749532d060f26c966a81c03f9a5d846c33d06.zip | |
Merged updates from upstream.
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/endomorph')
4 files changed, 94 insertions, 76 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/Clique.java b/src/uk/ac/ox/cs/pagoda/endomorph/Clique.java index 1c269ea..9b0d88e 100644 --- a/src/uk/ac/ox/cs/pagoda/endomorph/Clique.java +++ b/src/uk/ac/ox/cs/pagoda/endomorph/Clique.java | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.endomorph; | 1 | package uk.ac.ox.cs.pagoda.endomorph; |
| 2 | 2 | ||
| 3 | import uk.ac.ox.cs.pagoda.summary.NodeTuple; | ||
| 4 | |||
| 3 | import java.util.Collection; | 5 | import java.util.Collection; |
| 4 | import java.util.HashSet; | 6 | import java.util.HashSet; |
| 5 | import java.util.Set; | 7 | import java.util.Set; |
| 6 | 8 | ||
| 7 | import uk.ac.ox.cs.pagoda.summary.NodeTuple; | ||
| 8 | |||
| 9 | public class Clique { | 9 | public class Clique { |
| 10 | NodeTuple representative; | 10 | NodeTuple representative; |
| 11 | Set<NodeTuple> nodeTuples = null; | 11 | Set<NodeTuple> nodeTuples = null; |
| @@ -13,6 +13,7 @@ public class Clique { | |||
| 13 | public Clique(NodeTuple u) { | 13 | public Clique(NodeTuple u) { |
| 14 | nodeTuples = new HashSet<NodeTuple>(); | 14 | nodeTuples = new HashSet<NodeTuple>(); |
| 15 | representative = u; | 15 | representative = u; |
| 16 | nodeTuples.add(u); | ||
| 16 | } | 17 | } |
| 17 | 18 | ||
| 18 | public boolean addNodeTuple(NodeTuple nodeTuple) { | 19 | public boolean addNodeTuple(NodeTuple nodeTuple) { |
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 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; | 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; |
| 2 | 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; | 3 | import uk.ac.ox.cs.pagoda.endomorph.Clique; |
| 4 | import uk.ac.ox.cs.pagoda.endomorph.DependencyGraph; | ||
| 14 | import uk.ac.ox.cs.pagoda.query.AnswerTuple; | 5 | import uk.ac.ox.cs.pagoda.query.AnswerTuple; |
| 15 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; | 6 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; |
| 16 | import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker; | 7 | import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker; |
| 17 | import uk.ac.ox.cs.pagoda.util.Utility; | 8 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 18 | 9 | ||
| 10 | import java.util.*; | ||
| 11 | import java.util.concurrent.ConcurrentHashMap; | ||
| 12 | import java.util.concurrent.ConcurrentLinkedDeque; | ||
| 13 | import java.util.concurrent.atomic.AtomicInteger; | ||
| 14 | |||
| 19 | public class OpenEndMultiThreadPlan implements CheckPlan { | 15 | public 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 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; | 1 | package uk.ac.ox.cs.pagoda.endomorph.plan; |
| 2 | 2 | ||
| 3 | import java.util.Set; | ||
| 4 | |||
| 5 | import uk.ac.ox.cs.pagoda.endomorph.Clique; | 3 | import uk.ac.ox.cs.pagoda.endomorph.Clique; |
| 6 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; | 4 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; |
| 7 | import uk.ac.ox.cs.pagoda.summary.NodeTuple; | 5 | import uk.ac.ox.cs.pagoda.summary.NodeTuple; |
| 8 | import uk.ac.ox.cs.pagoda.util.Utility; | 6 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 9 | 7 | ||
| 8 | import java.util.Set; | ||
| 9 | |||
| 10 | public class PlainPlan implements CheckPlan { | 10 | public 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 | } |
