aboutsummaryrefslogtreecommitdiff
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
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.
-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
-rw-r--r--test/resources/BugTests.xml1
-rw-r--r--test/resources/MainTests.xml8
-rw-r--r--test/uk/ac/ox/cs/pagoda/endomorph/DependencyGraphTest.java59
-rw-r--r--test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java14
-rw-r--r--test/uk/ac/ox/cs/pagoda/util/TestUtil.java7
10 files changed, 128 insertions, 35 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 }
diff --git a/test/resources/BugTests.xml b/test/resources/BugTests.xml
index c7a80ba..1413b5b 100644
--- a/test/resources/BugTests.xml
+++ b/test/resources/BugTests.xml
@@ -6,6 +6,7 @@
6 <test name="BugTest"> 6 <test name="BugTest">
7 <classes> 7 <classes>
8 <class name="uk.ac.ox.cs.pagoda.global_tests.BugTests"/> 8 <class name="uk.ac.ox.cs.pagoda.global_tests.BugTests"/>
9 <!--<class name="uk.ac.ox.cs.pagoda.endomorph.DependencyGraphTest"/>-->
9 </classes> 10 </classes>
10 </test> 11 </test>
11 12
diff --git a/test/resources/MainTests.xml b/test/resources/MainTests.xml
index db8d977..255b68e 100644
--- a/test/resources/MainTests.xml
+++ b/test/resources/MainTests.xml
@@ -5,19 +5,19 @@
5 <test name="main"> 5 <test name="main">
6 <groups> 6 <groups>
7 <run> 7 <run>
8 <include name="correctness"/> 8 <!--<include name="correctness"/>-->
9 <!--<include name="light"/>--> 9 <!--<include name="light"/>-->
10 <!--<include name="justExecute"/>--> 10 <!--<include name="justExecute"/>-->
11 <!--&lt;!&ndash;<include name="heavy"/>&ndash;&gt;--> 11 <!--&lt;!&ndash;<include name="heavy"/>&ndash;&gt;-->
12 <!--<include name="nonOriginal"/>--> 12 <include name="nonOriginal"/>
13 </run> 13 </run>
14 </groups> 14 </groups>
15 <classes> 15 <classes>
16 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaReactome"/>--> 16 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaReactome"/>-->
17 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaUOBM"/>--> 17 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaUOBM"/>-->
18 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaLUBM"/> 18 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaLUBM"/>-->
19 <!--Fly does not terminate: query-5 looks really hard--> 19 <!--Fly does not terminate: query-5 looks really hard-->
20 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaFLY"/>--> 20 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaFLY"/>
21 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.SkolemisationTests"/>--> 21 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.SkolemisationTests"/>-->
22 <!--<class name="uk.ac.ox.cs.pagoda.util.SimpleProgressBarTester" />--> 22 <!--<class name="uk.ac.ox.cs.pagoda.util.SimpleProgressBarTester" />-->
23 </classes> 23 </classes>
diff --git a/test/uk/ac/ox/cs/pagoda/endomorph/DependencyGraphTest.java b/test/uk/ac/ox/cs/pagoda/endomorph/DependencyGraphTest.java
new file mode 100644
index 0000000..eec1e8f
--- /dev/null
+++ b/test/uk/ac/ox/cs/pagoda/endomorph/DependencyGraphTest.java
@@ -0,0 +1,59 @@
1package uk.ac.ox.cs.pagoda.endomorph;
2
3import org.semanticweb.owlapi.apibinding.OWLManager;
4import org.semanticweb.owlapi.model.*;
5import org.testng.annotations.Test;
6import uk.ac.ox.cs.JRDFox.model.GroundTerm;
7import uk.ac.ox.cs.JRDFox.model.Individual;
8import uk.ac.ox.cs.pagoda.query.AnswerTuple;
9import uk.ac.ox.cs.pagoda.summary.Graph;
10import uk.ac.ox.cs.pagoda.summary.NodeTuple;
11import uk.ac.ox.cs.pagoda.util.TestUtil;
12
13import java.util.HashSet;
14
15import static uk.ac.ox.cs.pagoda.util.TestUtil.getEntityIRI;
16
17public class DependencyGraphTest {
18
19 private OWLOntology getOntology() throws OWLOntologyCreationException {
20 OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
21 OWLDataFactory factory = manager.getOWLDataFactory();
22 OWLOntology ontology = manager.createOntology();
23
24 OWLClass hardWorkingStudent = factory.getOWLClass(getEntityIRI("HardWorkingStudent"));
25 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(hardWorkingStudent));
26 OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a"));
27 OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b"));
28 OWLObjectProperty takesCourse = factory.getOWLObjectProperty(IRI.create(String.format(TestUtil.NS, "takesCourse")));
29 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(takesCourse));
30
31 // Class assertions
32 manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(hardWorkingStudent, a)); // HardWorkingStudent(a)
33 manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(hardWorkingStudent, b)); // HardWorkingStudent(b)
34
35 // Minimum cardinality axiom
36 manager.addAxiom(ontology,
37 factory.getOWLEquivalentClassesAxiom(hardWorkingStudent,
38 factory.getOWLObjectMinCardinality(3,
39 takesCourse)));
40 return ontology;
41 }
42
43 @Test
44 public void test() throws OWLOntologyCreationException {
45 OWLOntology ontology = getOntology();
46 Graph graph = new Graph(ontology);
47 DependencyGraph dependencyGraph = new DependencyGraph(graph);
48
49 HashSet<NodeTuple> tuples = new HashSet<>();
50 tuples.add(graph.getNodeTuple(new AnswerTuple(new GroundTerm[]{Individual.create(String.format(TestUtil.NS, "a")), Individual.create(String.format(TestUtil.NS, "a"))})));
51 tuples.add(graph.getNodeTuple(new AnswerTuple(new GroundTerm[]{Individual.create(String.format(TestUtil.NS, "a")), Individual.create(String.format(TestUtil.NS, "b"))})));
52 tuples.add(graph.getNodeTuple(new AnswerTuple(new GroundTerm[]{Individual.create(String.format(TestUtil.NS, "b")), Individual.create(String.format(TestUtil.NS, "a"))})));
53 tuples.add(graph.getNodeTuple(new AnswerTuple(new GroundTerm[]{Individual.create(String.format(TestUtil.NS, "b")), Individual.create(String.format(TestUtil.NS, "b"))})));
54
55 dependencyGraph.build(tuples);
56
57 System.out.println(dependencyGraph.getTopologicalOrder());
58 }
59}
diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java b/test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java
index 6e60e24..3f14ec7 100644
--- a/test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java
+++ b/test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java
@@ -14,13 +14,11 @@ import java.io.IOException;
14import java.nio.file.Files; 14import java.nio.file.Files;
15import java.nio.file.Paths; 15import java.nio.file.Paths;
16 16
17import static uk.ac.ox.cs.pagoda.util.TestUtil.getEntityIRI;
18
17public class BugTests { 19public class BugTests {
18 20
19 public static final String NS = "http://example.org/test#%s";
20 21
21 private IRI getEntityIRI(String name) {
22 return IRI.create(String.format(NS, name));
23 }
24 22
25 @Test 23 @Test
26 public void minimumCardinalityAxiom2() throws OWLOntologyCreationException, IOException, OWLOntologyStorageException { 24 public void minimumCardinalityAxiom2() throws OWLOntologyCreationException, IOException, OWLOntologyStorageException {
@@ -41,7 +39,7 @@ public class BugTests {
41 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(hardWorkingStudent)); 39 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(hardWorkingStudent));
42 OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a")); 40 OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a"));
43 OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b")); 41 OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b"));
44 OWLObjectProperty takesCourse = factory.getOWLObjectProperty(IRI.create(String.format(NS, "takesCourse"))); 42 OWLObjectProperty takesCourse = factory.getOWLObjectProperty(IRI.create(String.format(TestUtil.NS, "takesCourse")));
45 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(takesCourse)); 43 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(takesCourse));
46 44
47 // Class assertions 45 // Class assertions
@@ -105,7 +103,7 @@ public class BugTests {
105 OWLNamedIndividual d1 = factory.getOWLNamedIndividual(getEntityIRI("d1")); 103 OWLNamedIndividual d1 = factory.getOWLNamedIndividual(getEntityIRI("d1"));
106 OWLNamedIndividual d2 = factory.getOWLNamedIndividual(getEntityIRI("d2")); 104 OWLNamedIndividual d2 = factory.getOWLNamedIndividual(getEntityIRI("d2"));
107 OWLNamedIndividual d3 = factory.getOWLNamedIndividual(getEntityIRI("d3")); 105 OWLNamedIndividual d3 = factory.getOWLNamedIndividual(getEntityIRI("d3"));
108 OWLObjectProperty takesCourse = factory.getOWLObjectProperty(IRI.create(String.format(NS, "takesCourse"))); 106 OWLObjectProperty takesCourse = factory.getOWLObjectProperty(IRI.create(String.format(TestUtil.NS, "takesCourse")));
109 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(takesCourse)); 107 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(takesCourse));
110 108
111 // Class assertions 109 // Class assertions
@@ -183,9 +181,9 @@ public class BugTests {
183 OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a")); 181 OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a"));
184 OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b")); 182 OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b"));
185 OWLNamedIndividual c = factory.getOWLNamedIndividual(getEntityIRI("c")); 183 OWLNamedIndividual c = factory.getOWLNamedIndividual(getEntityIRI("c"));
186 OWLObjectProperty roleR = factory.getOWLObjectProperty(IRI.create(String.format(NS, "R"))); 184 OWLObjectProperty roleR = factory.getOWLObjectProperty(IRI.create(String.format(TestUtil.NS, "R")));
187 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(roleR)); 185 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(roleR));
188 OWLObjectProperty roleP = factory.getOWLObjectProperty(IRI.create(String.format(NS, "P"))); 186 OWLObjectProperty roleP = factory.getOWLObjectProperty(IRI.create(String.format(TestUtil.NS, "P")));
189 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(roleP)); 187 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(roleP));
190 188
191 // Class assertions 189 // Class assertions
diff --git a/test/uk/ac/ox/cs/pagoda/util/TestUtil.java b/test/uk/ac/ox/cs/pagoda/util/TestUtil.java
index fdd242a..c7f024a 100644
--- a/test/uk/ac/ox/cs/pagoda/util/TestUtil.java
+++ b/test/uk/ac/ox/cs/pagoda/util/TestUtil.java
@@ -3,6 +3,7 @@ package uk.ac.ox.cs.pagoda.util;
3import org.apache.log4j.Appender; 3import org.apache.log4j.Appender;
4import org.apache.log4j.FileAppender; 4import org.apache.log4j.FileAppender;
5import org.apache.log4j.Logger; 5import org.apache.log4j.Logger;
6import org.semanticweb.owlapi.model.IRI;
6 7
7import java.io.File; 8import java.io.File;
8import java.io.IOException; 9import java.io.IOException;
@@ -87,4 +88,10 @@ public class TestUtil {
87 LOGGER.error(msg, t); 88 LOGGER.error(msg, t);
88 } 89 }
89 90
91 public static final String NS = "http://example.org/test#%s";
92
93 public static IRI getEntityIRI(String name) {
94 return IRI.create(String.format(NS, name));
95 }
96
90} 97}