aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRncLsn <rnc.lsn@gmail.com>2015-07-09 16:01:01 +0100
committerRncLsn <rnc.lsn@gmail.com>2015-07-09 16:01:01 +0100
commit3d44aee6069175038266c65f945147569e6343f6 (patch)
treee4eb3f166c28339701636cec513a387673e4ac0a /src
parent8241a535a55508b6c504f4f0b426612fe95d15a5 (diff)
downloadACQuA-3d44aee6069175038266c65f945147569e6343f6.tar.gz
ACQuA-3d44aee6069175038266c65f945147569e6343f6.zip
Bug-fix for answer dependencies analysis: now it checks whether the endomorphism makes the first tuple identical to the second one.
Diffstat (limited to 'src')
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/DependencyGraph.java7
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker.java1
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker1.java10
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker2.java53
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java3
5 files changed, 51 insertions, 23 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/DependencyGraph.java b/src/uk/ac/ox/cs/pagoda/endomorph/DependencyGraph.java
index 8514808..320af09 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/DependencyGraph.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/DependencyGraph.java
@@ -240,6 +240,11 @@ public class DependencyGraph {
240 private boolean checkHomomorphism(NodeTuple u, NodeTuple v) { 240 private boolean checkHomomorphism(NodeTuple u, NodeTuple v) {
241 ++homomorphismCheckCounter; 241 ++homomorphismCheckCounter;
242 homomorphismChecker.setMapping(u, v); 242 homomorphismChecker.setMapping(u, v);
243
244 // TODO recently added, test it
245 if(!homomorphismChecker.isMappingTo(u, v))
246 return false;
247
243 try { 248 try {
244 Node node1, node2; 249 Node node1, node2;
245 for (Iterator<Node> iter1 = u.getNodes().iterator(), iter2 = v.getNodes().iterator(); iter1.hasNext(); ) { 250 for (Iterator<Node> iter1 = u.getNodes().iterator(), iter2 = v.getNodes().iterator(); iter1.hasNext(); ) {
@@ -251,7 +256,7 @@ public class DependencyGraph {
251 } 256 }
252 return true; 257 return true;
253 } finally { 258 } finally {
254 homomorphismChecker.clearMappings(); 259 homomorphismChecker.clearMappings();
255 } 260 }
256 } 261 }
257 262
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker.java b/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker.java
index 8f5ea07..46ddbb3 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker.java
@@ -11,4 +11,5 @@ public interface EndomorphChecker {
11 11
12 boolean check(Node next, Node next2); 12 boolean check(Node next, Node next2);
13 13
14 boolean isMappingTo(NodeTuple u, NodeTuple v);
14} 15}
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker1.java b/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker1.java
index ca1256c..c2117b6 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker1.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker1.java
@@ -15,9 +15,13 @@ public class EndomorphChecker1 implements EndomorphChecker {
15 15
16 public boolean check(Node u, Node v) { 16 public boolean check(Node u, Node v) {
17 if (!u.isSubConceptOf(v)) return false; 17 if (!u.isSubConceptOf(v)) return false;
18 if (!isSubsetOf(graph.getOutGoingEdges(u), graph.getOutGoingEdges(v), true)) return false; 18 if (!isSubsetOf(graph.getOutGoingEdges(u), graph.getOutGoingEdges(v), true)) return false;
19 if (!isSubsetOf(graph.getInComingEdges(u), graph.getInComingEdges(v), false)) return false; 19 return isSubsetOf(graph.getInComingEdges(u), graph.getInComingEdges(v), false);
20 return true; 20 }
21
22 @Override
23 public boolean isMappingTo(NodeTuple u, NodeTuple v) {
24 throw new UnsupportedOperationException();
21 } 25 }
22 26
23 private boolean isSubsetOf(Edge[] e1, Edge[] e2, boolean out) { 27 private boolean isSubsetOf(Edge[] e1, Edge[] e2, boolean out) {
diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker2.java b/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker2.java
index 7ad271a..aac5f3c 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker2.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/EndomorphChecker2.java
@@ -1,17 +1,13 @@
1package uk.ac.ox.cs.pagoda.endomorph; 1package uk.ac.ox.cs.pagoda.endomorph;
2 2
3import java.util.HashMap;
4import java.util.HashSet;
5import java.util.Iterator;
6import java.util.Map;
7import java.util.Set;
8
9import uk.ac.ox.cs.pagoda.summary.Edge; 3import uk.ac.ox.cs.pagoda.summary.Edge;
10import uk.ac.ox.cs.pagoda.summary.Graph; 4import uk.ac.ox.cs.pagoda.summary.Graph;
11import uk.ac.ox.cs.pagoda.summary.Node; 5import uk.ac.ox.cs.pagoda.summary.Node;
12import uk.ac.ox.cs.pagoda.summary.NodeTuple; 6import uk.ac.ox.cs.pagoda.summary.NodeTuple;
13import uk.ac.ox.cs.pagoda.util.Timer; 7import uk.ac.ox.cs.pagoda.util.Timer;
14 8
9import java.util.*;
10
15public class EndomorphChecker2 implements EndomorphChecker { 11public class EndomorphChecker2 implements EndomorphChecker {
16 12
17 private Graph graph; 13 private Graph graph;
@@ -24,7 +20,8 @@ public class EndomorphChecker2 implements EndomorphChecker {
24 private Timer timer = new Timer(); 20 private Timer timer = new Timer();
25 private boolean time_out = false; 21 private boolean time_out = false;
26 private static final int TIME_OUT = 60; 22 private static final int TIME_OUT = 60;
27 23// private static final int TIME_OUT = 99999999;
24
28 public boolean check(NodeTuple u, NodeTuple v) { 25 public boolean check(NodeTuple u, NodeTuple v) {
29 int length = u.getNodes().size(); 26 int length = u.getNodes().size();
30 Edge[][] ss = new Edge[1][length], tt = new Edge[1][length]; 27 Edge[][] ss = new Edge[1][length], tt = new Edge[1][length];
@@ -39,15 +36,35 @@ public class EndomorphChecker2 implements EndomorphChecker {
39 } 36 }
40 37
41 public boolean check(Node u, Node v) { 38 public boolean check(Node u, Node v) {
42 if (!u.isSubConceptOf(v)) return false; 39 if (!u.isSubConceptOf(v)) return false;
43 if (!checkSortedEdges(new Edge[][] {graph.getOutGoingEdges(u), graph.getInComingEdges(u) }, 40 return checkSortedEdges(new Edge[][]{graph.getOutGoingEdges(u), graph.getInComingEdges(u)},
44 new Edge[][] {graph.getOutGoingEdges(v), graph.getInComingEdges(v)}, 0, 0)) { 41 new Edge[][]{graph.getOutGoingEdges(v), graph.getInComingEdges(v)}, 0, 0);
45 return false; 42 }
46 } 43
47 return true; 44 /***
48 } 45 * Checks whether the found mapping is actually a mapping from tuple u to tuple v.
46 *
47 * @param u
48 * @param v
49 * @return
50 */
51 @Override
52 public boolean isMappingTo(NodeTuple u, NodeTuple v) {
53 Iterator<Node> uIterator = u.getNodes().iterator();
54 Iterator<Node> vIterator = v.getNodes().iterator();
55
56 while(uIterator.hasNext() && vIterator.hasNext()) {
57 Node uNode = uIterator.next();
58 Node vNode = vIterator.next();
59 if(mappings.containsKey(uNode) && !mappings.get(uNode).equals(vNode))
60 return false;
61 else if(!mappings.containsKey(uNode) && !uNode.equals(vNode))
62 return false;
63 }
64 return !uIterator.hasNext() && !vIterator.hasNext();
65 }
49 66
50 Map<Node, Node> mappings = new HashMap<Node, Node>(); 67 Map<Node, Node> mappings = new HashMap<Node, Node>();
51 68
52 public void clearMappings() { 69 public void clearMappings() {
53 mappings.clear(); 70 mappings.clear();
@@ -100,9 +117,9 @@ public class EndomorphChecker2 implements EndomorphChecker {
100 return true; 117 return true;
101 mappings.remove(u); 118 mappings.remove(u);
102 return false; 119 return false;
103 }; 120 }
104 121
105 for (Node v: candidates) { 122 for (Node v: candidates) {
106 mappings.put(u, v); 123 mappings.put(u, v);
107 if (check(u, v) && checkSortedEdges(ss, st, dim, index + 1)) 124 if (check(u, v) && checkSortedEdges(ss, st, dim, index + 1))
108 return true; 125 return true;
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 a46da85..076427e 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
@@ -71,7 +71,8 @@ public class OpenEndPlan implements CheckPlan {
71 else { 71 else {
72 Utility.logDebug(answerTuple.toString() + " is verified."); 72 Utility.logDebug(answerTuple.toString() + " is verified.");
73 addProjections(clique); 73 addProjections(clique);
74 flag = true; 74 flag = true;
75 validated.add(clique);
75 } 76 }
76 } 77 }
77 } 78 }