aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRncLsn <rnc.lsn@gmail.com>2015-07-03 19:09:31 +0100
committerRncLsn <rnc.lsn@gmail.com>2015-07-03 19:09:31 +0100
commit39b60d4225f5efa4e0287a2c6ce69d90391c69db (patch)
tree18c5b05726f39baa4d3ca8b228e24ad1f0182f2a
parent133dab6e21f263df2baca913d3d0b7a4fd152d08 (diff)
downloadACQuA-39b60d4225f5efa4e0287a2c6ce69d90391c69db.tar.gz
ACQuA-39b60d4225f5efa4e0287a2c6ce69d90391c69db.zip
Many little changes.
-rw-r--r--src/resources/pagoda.properties1
-rw-r--r--src/uk/ac/ox/cs/pagoda/Pagoda.java58
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java9
-rw-r--r--src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java2
-rw-r--r--src/uk/ac/ox/cs/pagoda/query/QueryRecord.java26
-rw-r--r--src/uk/ac/ox/cs/pagoda/query/rollup/QueryGraph.java5
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java19
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java27
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/Program.java7
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java4
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/clauses/Clause.java100
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java4
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java12
-rw-r--r--src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java19
-rw-r--r--src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java12
-rw-r--r--src/uk/ac/ox/cs/pagoda/util/SimpleProgressBar.java48
-rw-r--r--test/resources/BugTests.xml7
-rw-r--r--test/resources/MainTests.xml (renamed from test/resources/LightTests.xml)18
-rw-r--r--test/resources/SygeniaTests.xml5
-rw-r--r--test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java (renamed from test/uk/ac/ox/cs/pagoda/global_tests/MinimumCardinalityTest.java)89
-rw-r--r--test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java6
-rw-r--r--test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaLUBM.java10
-rw-r--r--test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaUOBM.java26
-rw-r--r--test/uk/ac/ox/cs/pagoda/util/SimpleProgressBarTester.java16
24 files changed, 435 insertions, 95 deletions
diff --git a/src/resources/pagoda.properties b/src/resources/pagoda.properties
index 64de225..98f8628 100644
--- a/src/resources/pagoda.properties
+++ b/src/resources/pagoda.properties
@@ -1,5 +1,6 @@
1debug=true 1debug=true
2useAlwaysSimpleUpperBound=false 2useAlwaysSimpleUpperBound=false
3useSkolemUpperBound=true 3useSkolemUpperBound=true
4toCallHermit=true
4 5
5statisticsDir=/home/alessandro/Dropbox/Oxford/PAGOdA/statistics \ No newline at end of file 6statisticsDir=/home/alessandro/Dropbox/Oxford/PAGOdA/statistics \ No newline at end of file
diff --git a/src/uk/ac/ox/cs/pagoda/Pagoda.java b/src/uk/ac/ox/cs/pagoda/Pagoda.java
index f5dce15..7d2317d 100644
--- a/src/uk/ac/ox/cs/pagoda/Pagoda.java
+++ b/src/uk/ac/ox/cs/pagoda/Pagoda.java
@@ -1,12 +1,21 @@
1package uk.ac.ox.cs.pagoda; 1package uk.ac.ox.cs.pagoda;
2 2
3import org.apache.commons.cli.*; 3import org.apache.commons.cli.*;
4import org.apache.commons.io.FilenameUtils;
5import uk.ac.ox.cs.pagoda.query.QueryRecord;
4import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner; 6import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner;
5import uk.ac.ox.cs.pagoda.util.PagodaProperties; 7import uk.ac.ox.cs.pagoda.util.PagodaProperties;
6import uk.ac.ox.cs.pagoda.util.Timer; 8import uk.ac.ox.cs.pagoda.util.Timer;
7import uk.ac.ox.cs.pagoda.util.Utility; 9import uk.ac.ox.cs.pagoda.util.Utility;
8 10
11import java.io.BufferedWriter;
12import java.io.IOException;
13import java.nio.file.Files;
9import java.nio.file.Path; 14import java.nio.file.Path;
15import java.nio.file.Paths;
16import java.util.Collection;
17import java.util.HashMap;
18import java.util.Map;
10 19
11/** 20/**
12 * Executable command line user interface. 21 * Executable command line user interface.
@@ -23,7 +32,7 @@ public class Pagoda implements Runnable {
23 32
24 /** 33 /**
25 * Do not use it 34 * Do not use it
26 * */ 35 */
27 private Pagoda() { 36 private Pagoda() {
28 properties = new PagodaProperties(); 37 properties = new PagodaProperties();
29 } 38 }
@@ -85,7 +94,7 @@ public class Pagoda implements Runnable {
85 94
86 /** 95 /**
87 * Get a builder. 96 * Get a builder.
88 * */ 97 */
89 public static PagodaBuilder builder() { 98 public static PagodaBuilder builder() {
90 return new PagodaBuilder(); 99 return new PagodaBuilder();
91 } 100 }
@@ -102,21 +111,48 @@ public class Pagoda implements Runnable {
102 try { 111 try {
103 Timer t = new Timer(); 112 Timer t = new Timer();
104 pagoda = QueryReasoner.getInstance(properties); 113 pagoda = QueryReasoner.getInstance(properties);
105 if (pagoda == null) return; 114 if(pagoda == null) return;
106 115
107 Utility.logInfo("Preprocessing Done in " + t.duration() + " seconds."); 116 Utility.logInfo("Preprocessing Done in " + t.duration() + " seconds.");
108 117
109 if (properties.getQueryPath() != null) 118 if(properties.getQueryPath() != null) {
110 for (String queryFile: properties.getQueryPath().split(";")) 119 for(String queryFile : properties.getQueryPath().split(";")) {
111 pagoda.evaluate(pagoda.getQueryManager().collectQueryRecords(queryFile)); 120 Collection<QueryRecord> queryRecords = pagoda.getQueryManager().collectQueryRecords(queryFile);
121 pagoda.evaluate(queryRecords);
122
123 if(PagodaProperties.isDebuggingMode()) {
124 HashMap<String, Map<String, String>> statistics = new HashMap<>();
125 for(QueryRecord queryRecord : queryRecords) {
126 statistics.put(queryRecord.getQueryID(), queryRecord.getStatistics());
127 }
128 String statisticsFilename = getStatisticsFilename(properties, queryFile);
129 try(BufferedWriter writer = Files.newBufferedWriter(Paths.get(statisticsFilename))) {
130 QueryRecord.GsonCreator.getInstance().toJson(statistics, writer);
131 } catch(IOException e) {
132 Utility.logError("Unable to save statistics");
133 }
134 }
135 }
136 }
112 } finally { 137 } finally {
113 if (pagoda != null) pagoda.dispose(); 138 if(pagoda != null) pagoda.dispose();
114 } 139 }
115 } 140 }
116 141
142 private String getStatisticsFilename(PagodaProperties properties, String queryFile) {
143 String statisticsFilename = "statistics_" +
144 FilenameUtils.removeExtension(FilenameUtils.getName(properties.getOntologyPath().replaceAll("_", "-")));
145 statisticsFilename += "_" + FilenameUtils.removeExtension(FilenameUtils.getName(queryFile).replaceAll("_", "-"));
146 statisticsFilename += "_" + ((properties.getUseSkolemUpperBound()) ? "skolem" : "");
147 statisticsFilename += ".json";
148 statisticsFilename = FilenameUtils.concat(properties.getStatisticsDir().toString(),
149 statisticsFilename);
150 return statisticsFilename;
151 }
152
117 /** 153 /**
118 * Allows to set the parameters before creating a Pagoda instance. 154 * Allows to set the parameters before creating a Pagoda instance.
119 * */ 155 */
120 public static class PagodaBuilder { 156 public static class PagodaBuilder {
121 157
122 private Pagoda instance; 158 private Pagoda instance;
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 73a27bf..a46da85 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
@@ -7,6 +7,7 @@ import uk.ac.ox.cs.pagoda.query.QueryRecord;
7import uk.ac.ox.cs.pagoda.query.QueryRecord.Step; 7import uk.ac.ox.cs.pagoda.query.QueryRecord.Step;
8import uk.ac.ox.cs.pagoda.reasoner.full.Checker; 8import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
9import uk.ac.ox.cs.pagoda.summary.NodeTuple; 9import uk.ac.ox.cs.pagoda.summary.NodeTuple;
10import uk.ac.ox.cs.pagoda.util.SimpleProgressBar;
10import uk.ac.ox.cs.pagoda.util.Timer; 11import uk.ac.ox.cs.pagoda.util.Timer;
11import uk.ac.ox.cs.pagoda.util.Utility; 12import uk.ac.ox.cs.pagoda.util.Utility;
12 13
@@ -40,7 +41,11 @@ public class OpenEndPlan implements CheckPlan {
40 Timer t = new Timer(); 41 Timer t = new Timer();
41 42
42 AnswerTuple answerTuple; 43 AnswerTuple answerTuple;
43 while (!topo.isEmpty()) { 44 int initialTopoSize = topo.size();
45 // TODO test progress bar
46 SimpleProgressBar progressBar = new SimpleProgressBar("Checking", initialTopoSize);
47 while (!topo.isEmpty()) {
48 progressBar.update(initialTopoSize - topo.size());
44 if (flag) { 49 if (flag) {
45 clique = topo.removeFirst(); 50 clique = topo.removeFirst();
46 if (redundant(clique)) continue; 51 if (redundant(clique)) continue;
@@ -70,6 +75,8 @@ public class OpenEndPlan implements CheckPlan {
70 } 75 }
71 } 76 }
72 } 77 }
78 progressBar.update(initialTopoSize - topo.size());
79 progressBar.dispose();
73 80
74// Utility.logDebug("HermiT was called " + times + " times."); 81// Utility.logDebug("HermiT was called " + times + " times.");
75 82
diff --git a/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java b/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java
index 530b97f..81c99a4 100644
--- a/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java
+++ b/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java
@@ -37,7 +37,7 @@ public class RuleHelper {
37 boolean lastSpace = true; 37 boolean lastSpace = true;
38 for (Atom headAtom: clause.getHeadAtoms()) { 38 for (Atom headAtom: clause.getHeadAtoms()) {
39 if ((atomText = getText(headAtom)) == null) continue; 39 if ((atomText = getText(headAtom)) == null) continue;
40 if (!lastSpace) buf.append(" | "); 40 if (!lastSpace) buf.append(" v ");
41 buf.append(atomText); 41 buf.append(atomText);
42 lastSpace = false; 42 lastSpace = false;
43 } 43 }
diff --git a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java
index 291af27..d88376f 100644
--- a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java
+++ b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java
@@ -171,14 +171,10 @@ public class QueryRecord extends Disposable {
171 } 171 }
172 172
173 public String getQueryText() { 173 public String getQueryText() {
174 if(isDisposed()) throw new DisposedException();
175
176 return queryText; 174 return queryText;
177 } 175 }
178 176
179 public String getQueryID() { 177 public String getQueryID() {
180 if(isDisposed()) throw new DisposedException();
181
182 return stringQueryID; 178 return stringQueryID;
183 } 179 }
184 180
@@ -193,8 +189,6 @@ public class QueryRecord extends Disposable {
193 } 189 }
194 190
195 public String toString() { 191 public String toString() {
196 if(isDisposed()) throw new DisposedException();
197
198 return queryText; 192 return queryText;
199 } 193 }
200 194
@@ -281,6 +275,20 @@ public class QueryRecord extends Disposable {
281 } 275 }
282 } 276 }
283 277
278 public Map<String, String> getStatistics() {
279 HashMap<String, String> result = new HashMap<>();
280
281 double totalTime = 0.0;
282 for(Step step : Step.values()) {
283 result.put(step.toString(), Double.toString(timer[step.ordinal()]));
284 totalTime += timer[step.ordinal()];
285 }
286 result.put("totalTime", Double.toString(totalTime));
287 result.put("difficulty", difficulty.toString());
288
289 return result;
290 }
291
284 public String outputSoundAnswerTuple() { 292 public String outputSoundAnswerTuple() {
285 if(isDisposed()) throw new DisposedException(); 293 if(isDisposed()) throw new DisposedException();
286 294
@@ -359,6 +367,8 @@ public class QueryRecord extends Disposable {
359 Utility.logError("The answer (" + answer + ") cannot be removed, because it is not in the upper bound."); 367 Utility.logError("The answer (" + answer + ") cannot be removed, because it is not in the upper bound.");
360 gapAnswerTuples.remove(answer); 368 gapAnswerTuples.remove(answer);
361 } 369 }
370 int numOfUpperBoundAnswers = soundAnswerTuples.size() + gapAnswerTuples.size();
371 Utility.logInfo("Upper bound answers updated: " + numOfUpperBoundAnswers);
362 } 372 }
363 373
364 public void addLowerBoundAnswers(Collection<AnswerTuple> answers) { 374 public void addLowerBoundAnswers(Collection<AnswerTuple> answers) {
@@ -722,7 +732,9 @@ public class QueryRecord extends Disposable {
722 732
723 @Override 733 @Override
724 public String toString() { 734 public String toString() {
725 return WordUtils.capitalizeFully(super.toString(), new char[]{'_'}).replace("_", ""); 735 String s = super.toString();
736 if(s == null) return null;
737 return WordUtils.capitalizeFully(s, new char[]{'_'}).replace("_", "");
726 } 738 }
727 } 739 }
728 740
diff --git a/src/uk/ac/ox/cs/pagoda/query/rollup/QueryGraph.java b/src/uk/ac/ox/cs/pagoda/query/rollup/QueryGraph.java
index a09cf5b..116e724 100644
--- a/src/uk/ac/ox/cs/pagoda/query/rollup/QueryGraph.java
+++ b/src/uk/ac/ox/cs/pagoda/query/rollup/QueryGraph.java
@@ -102,16 +102,17 @@ public class QueryGraph {
102// return axioms; 102// return axioms;
103// } 103// }
104 104
105 public Set<OWLAxiom> getExistentialAxioms() { 105 public Set<OWLAxiom> getExistentialAxioms(Map<Variable, Term> assignment) {
106 if(!rollable_edges.isEmpty()) return null; 106 if(!rollable_edges.isEmpty()) return null;
107 107
108 Visitor visitor = new Visitor(factory, assignment);
108 Set<OWLAxiom> axioms = new HashSet<>(); 109 Set<OWLAxiom> axioms = new HashSet<>();
109 for(Map.Entry<Term, Set<OWLClassExpression>> entry : concepts.map.entrySet()) { 110 for(Map.Entry<Term, Set<OWLClassExpression>> entry : concepts.map.entrySet()) {
110 if(existVars.contains(entry.getKey())) { 111 if(existVars.contains(entry.getKey())) {
111 OWLClassExpression conjunction = 112 OWLClassExpression conjunction =
112 factory.getOWLObjectIntersectionOf(factory.getOWLThing()); 113 factory.getOWLObjectIntersectionOf(factory.getOWLThing());
113 for(OWLClassExpression owlClassExpression : entry.getValue()) { 114 for(OWLClassExpression owlClassExpression : entry.getValue()) {
114 conjunction = factory.getOWLObjectIntersectionOf(conjunction, owlClassExpression); 115 conjunction = factory.getOWLObjectIntersectionOf(conjunction, owlClassExpression.accept(visitor));
115 } 116 }
116 axioms.add(factory.getOWLSubClassOfAxiom(conjunction, factory.getOWLNothing())); 117 axioms.add(factory.getOWLSubClassOfAxiom(conjunction, factory.getOWLNothing()));
117 } 118 }
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
index e5074d5..b419289 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
@@ -68,9 +68,9 @@ class MyQueryReasoner extends QueryReasoner {
68 68
69 ontology = o; 69 ontology = o;
70 program = new DatalogProgram(ontology, properties.getToClassify()); 70 program = new DatalogProgram(ontology, properties.getToClassify());
71 program.getLower().save(); 71// program.getLower().save();
72 program.getUpper().save(); 72// program.getUpper().save();
73 program.getGeneral().save(); 73// program.getGeneral().save();
74 74
75 if(!program.getGeneral().isHorn()) 75 if(!program.getGeneral().isHorn())
76 lazyUpperStore = new MultiStageQueryEngine("lazy-upper-bound", true); 76 lazyUpperStore = new MultiStageQueryEngine("lazy-upper-bound", true);
@@ -195,19 +195,24 @@ class MyQueryReasoner extends QueryReasoner {
195 195
196 Utility.logInfo("Summarisation..."); 196 Utility.logInfo("Summarisation...");
197 HermitSummaryFilter summarisedChecker = new HermitSummaryFilter(queryRecord, properties.getToCallHermiT()); 197 HermitSummaryFilter summarisedChecker = new HermitSummaryFilter(queryRecord, properties.getToCallHermiT());
198 if(summarisedChecker.check(queryRecord.getGapAnswers()) == 0) 198 if(summarisedChecker.check(queryRecord.getGapAnswers()) == 0) {
199 summarisedChecker.dispose();
199 return; 200 return;
201 }
200 202
201 if(properties.getUseSkolemUpperBound() && 203 if(properties.getUseSkolemUpperBound() &&
202 querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) 204 querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) {
205 summarisedChecker.dispose();
203 return; 206 return;
207 }
204 208
205 Utility.logInfo("Full reasoning..."); 209 Utility.logInfo("Full reasoning...");
206 Timer t = new Timer(); 210 Timer t = new Timer();
207 summarisedChecker.checkByFullReasoner(queryRecord.getGapAnswers()); 211 summarisedChecker.checkByFullReasoner(queryRecord.getGapAnswers());
208 Utility.logDebug("Total time for full reasoner: " + t.duration()); 212 Utility.logDebug("Total time for full reasoner: " + t.duration());
209 213
210 queryRecord.markAsProcessed(); 214 if(properties.getToCallHermiT())
215 queryRecord.markAsProcessed();
211 summarisedChecker.dispose(); 216 summarisedChecker.dispose();
212 } 217 }
213 218
@@ -377,7 +382,7 @@ class MyQueryReasoner extends QueryReasoner {
377 relevantStore.importDataFromABoxOf(relevantSubset); 382 relevantStore.importDataFromABoxOf(relevantSubset);
378 String relevantOriginalMarkProgram = OWLHelper.getOriginalMarkProgram(relevantSubset); 383 String relevantOriginalMarkProgram = OWLHelper.getOriginalMarkProgram(relevantSubset);
379 384
380 int queryDependentMaxTermDepth = 5; // TODO make it dynamic 385 int queryDependentMaxTermDepth = 1; // TODO make it dynamic
381 relevantStore.materialise("Mark original individuals", relevantOriginalMarkProgram); 386 relevantStore.materialise("Mark original individuals", relevantOriginalMarkProgram);
382 int materialisationTag = relevantStore.materialiseSkolemly(relevantProgram, null, 387 int materialisationTag = relevantStore.materialiseSkolemly(relevantProgram, null,
383 queryDependentMaxTermDepth); 388 queryDependentMaxTermDepth);
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java b/src/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java
index cfae88b..9574845 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java
@@ -99,7 +99,6 @@ public class HermitChecker extends Checker {
99 99
100 if(!toCheck) return false; 100 if(!toCheck) return false;
101 ++noOfCalls; 101 ++noOfCalls;
102
103 if(tag != 0) return tag == 1; 102 if(tag != 0) return tag == 1;
104 if(hermit == null) initialiseReasoner(); 103 if(hermit == null) initialiseReasoner();
105 104
@@ -107,19 +106,19 @@ public class HermitChecker extends Checker {
107 Map<Variable, Term> sub = answerTuple.getAssignment(answerVariable[1]); 106 Map<Variable, Term> sub = answerTuple.getAssignment(answerVariable[1]);
108 Set<OWLAxiom> toCheckAxioms = qGraph.getAssertions(sub); 107 Set<OWLAxiom> toCheckAxioms = qGraph.getAssertions(sub);
109 108
110 // TODO complete 109// // TODO complete
111 Set<OWLAxiom> toCheckExistentialAxioms = qGraph.getExistentialAxioms(); 110// Set<OWLAxiom> toCheckExistentialAxioms = qGraph.getExistentialAxioms(sub);
112 111//
113 // TODO possibly inefficient 112// // TODO possibly inefficient
114 for(OWLAxiom subclassAxiom : toCheckExistentialAxioms) { 113// for(OWLAxiom subclassAxiom : toCheckExistentialAxioms) {
115 Utility.logDebug("Checking consistency of ontology union " + subclassAxiom); 114// Utility.logInfo("Checking consistency of ontology union " + subclassAxiom);
116 ontology.getOWLOntologyManager().addAxiom(ontology, subclassAxiom); 115// ontology.getOWLOntologyManager().addAxiom(ontology, subclassAxiom);
117 if(hermit.isConsistent()) { 116// if(hermit.isConsistent()) {
118 Utility.logDebug("@TIME to check one tuple: " + t.duration()); 117// Utility.logDebug("@TIME to check one tuple: " + t.duration());
119 return false; 118// return false;
120 } 119// }
121 ontology.getOWLOntologyManager().removeAxiom(ontology, subclassAxiom); 120// ontology.getOWLOntologyManager().removeAxiom(ontology, subclassAxiom);
122 } 121// }
123 122
124 123
125// for (OWLAxiom axiom: toCheckAxioms) System.out.println(axiom.toString()); 124// for (OWLAxiom axiom: toCheckAxioms) System.out.println(axiom.toString());
diff --git a/src/uk/ac/ox/cs/pagoda/rules/Program.java b/src/uk/ac/ox/cs/pagoda/rules/Program.java
index 85000e3..a0edf85 100644
--- a/src/uk/ac/ox/cs/pagoda/rules/Program.java
+++ b/src/uk/ac/ox/cs/pagoda/rules/Program.java
@@ -316,9 +316,10 @@ protected PredicateDependency dependencyGraph;
316 private Atom getAtom(OWLObjectPropertyExpression exp, Variable x, Variable y) { 316 private Atom getAtom(OWLObjectPropertyExpression exp, Variable x, Variable y) {
317 if(exp instanceof OWLObjectProperty) 317 if(exp instanceof OWLObjectProperty)
318 return Atom.create(AtomicRole.create(((OWLObjectProperty) exp).toStringID()), x, y); 318 return Atom.create(AtomicRole.create(((OWLObjectProperty) exp).toStringID()), x, y);
319 OWLObjectInverseOf inverseOf; 319 // TODO fixed, test it
320 if(exp instanceof OWLObjectInverseOf && (inverseOf = 320 OWLObjectPropertyExpression inverseOf;
321 (OWLObjectInverseOf) exp).getInverse() instanceof OWLObjectProperty) 321 if(exp instanceof OWLObjectInverseOf && (inverseOf = (
322 (OWLObjectInverseOf) exp).getInverse()) instanceof OWLObjectProperty)
322 return Atom.create(AtomicRole.create(((OWLObjectProperty) inverseOf).toStringID()), x, y); 323 return Atom.create(AtomicRole.create(((OWLObjectProperty) inverseOf).toStringID()), x, y);
323 return null; 324 return null;
324 } 325 }
diff --git a/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java
index dfe1e59..d694b61 100644
--- a/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java
+++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java
@@ -64,14 +64,14 @@ public class LimitedSkolemisationApproximator implements TupleDependentApproxima
64 64
65 private Collection<DLClause> overApprox(DLClause clause, DLClause originalClause, Collection<Tuple<Individual>> violationTuples) { 65 private Collection<DLClause> overApprox(DLClause clause, DLClause originalClause, Collection<Tuple<Individual>> violationTuples) {
66 ArrayList<DLClause> result = new ArrayList<>(); 66 ArrayList<DLClause> result = new ArrayList<>();
67 for(Tuple<Individual> violationTuple : violationTuples) 67 for(Tuple<Individual> violationTuple : violationTuples) {
68 if(getMaxDepth(violationTuple) < maxTermDepth) { 68 if(getMaxDepth(violationTuple) < maxTermDepth) {
69 result.addAll(getGroundSkolemisation(clause, originalClause, violationTuple)); 69 result.addAll(getGroundSkolemisation(clause, originalClause, violationTuple));
70 Utility.logDebug("Approximating maximal individual by a constant in rule:" + originalClause); 70 Utility.logDebug("Approximating maximal individual by a constant in rule:" + originalClause);
71 } 71 }
72 else 72 else
73 result.addAll(alternativeApproximator.convert(clause, originalClause, null)); 73 result.addAll(alternativeApproximator.convert(clause, originalClause, null));
74 74 }
75 75
76 return result; 76 return result;
77 } 77 }
diff --git a/src/uk/ac/ox/cs/pagoda/rules/clauses/Clause.java b/src/uk/ac/ox/cs/pagoda/rules/clauses/Clause.java
new file mode 100644
index 0000000..2adb66b
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/rules/clauses/Clause.java
@@ -0,0 +1,100 @@
1package uk.ac.ox.cs.pagoda.rules.clauses;
2
3public class Clause {
4
5// public static final String IF = ":-";
6// public static final String OR = "|";
7// public static final String AND = ",";
8//
9// protected final List<List<Atom>> head;
10// protected final List<Atom> body;
11//
12// protected Clause(Atom[] headAtoms, Atom[] bodyAtoms) {
13// this.head = Collections.singletonList(Arrays.asList(headAtoms));
14// this.body= Arrays.asList(bodyAtoms);
15// }
16//
17// protected Clause(String s) {
18// this.headAtoms = null;
19// this.bodyAtoms = null;
20// }
21//
22// public int getHeadLength() {
23// return headAtoms.length;
24// }
25//
26// public Atom getHeadAtom(int atomIndex) {
27// return headAtoms[atomIndex];
28// }
29//
30// public Atom[] getHeadAtoms() {
31// return headAtoms.clone();
32// }
33//
34// public int getBodyLength() {
35// return bodyAtoms.length;
36// }
37//
38// public Atom getBodyAtom(int atomIndex) {
39// return bodyAtoms[atomIndex];
40// }
41//
42// public Atom[] getBodyAtoms() {
43// return bodyAtoms.clone();
44// }
45//
46// public String toString(Prefixes prefixes) {
47// StringBuilder buffer = new StringBuilder();
48// for(int headIndex = 0; headIndex < headAtoms.length; headIndex++) {
49// if(headIndex != 0)
50// buffer.append(" ").append(OR).append(" ");
51// buffer.append(headAtoms[headIndex].toString(prefixes));
52// }
53// buffer.append(" ").append(IF).append(" ");
54// for(int bodyIndex = 0; bodyIndex < bodyAtoms.length; bodyIndex++) {
55// if(bodyIndex != 0)
56// buffer.append(AND).append(" ");
57// buffer.append(bodyAtoms[bodyIndex].toString(prefixes));
58// }
59// return buffer.toString();
60// }
61//
62// public String toString() {
63// return toString(Prefixes.STANDARD_PREFIXES);
64// }
65//
66// protected static InterningManager<? extends Clause> s_interningManager = new InterningManager<Clause>() {
67// protected boolean equal(Clause object1, Clause object2) {
68// if(object1.head.length != object2.headAtoms.length
69// || object1.bodyAtoms.length != object2.bodyAtoms.length)
70// return false;
71// for(int index = object1.headAtoms.length - 1; index >= 0; --index)
72// if(object1.headAtoms[index] != object2.headAtoms[index])
73// return false;
74// for(int index = object1.bodyAtoms.length - 1; index >= 0; --index)
75// if(object1.bodyAtoms[index] != object2.bodyAtoms[index])
76// return false;
77// return true;
78// }
79//
80// protected int getHashCode(Clause object) {
81// int hashCode = 0;
82// for(int index = object.bodyAtoms.length - 1; index >= 0; --index)
83// hashCode += object.bodyAtoms[index].hashCode();
84// for(int index = object.headAtoms.length - 1; index >= 0; --index)
85// hashCode += object.headAtoms[index].hashCode();
86// return hashCode;
87// }
88// };
89//
90// /**
91// * Creates a clause from a string.
92// *
93// * @param s
94// * @return
95// */
96// public static Clause create(String s) {
97// return s_interningManager.intern(new Clause(s));
98// }
99
100}
diff --git a/src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java b/src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java
new file mode 100644
index 0000000..91bb3e7
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java
@@ -0,0 +1,4 @@
1package uk.ac.ox.cs.pagoda.rules.clauses;
2
3public class Conjunction {
4}
diff --git a/src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java b/src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java
new file mode 100644
index 0000000..7394be0
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java
@@ -0,0 +1,12 @@
1package uk.ac.ox.cs.pagoda.rules.clauses;
2
3public class DLClause extends Clause {
4
5// private DLClause(Atom[] headAtoms, Atom[] bodyAtoms) {
6// super(headAtoms, bodyAtoms);
7// }
8//
9// public static DLClause create(Atom[] headAtoms, Atom[] bodyAtoms) {
10// return s_interningManager.intern(new DLClause(headAtoms, bodyAtoms));
11// }
12}
diff --git a/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java b/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java
index 2d2198f..6fcf887 100644
--- a/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java
+++ b/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java
@@ -6,12 +6,12 @@ import uk.ac.ox.cs.pagoda.endomorph.Endomorph;
6import uk.ac.ox.cs.pagoda.owl.OWLHelper; 6import uk.ac.ox.cs.pagoda.owl.OWLHelper;
7import uk.ac.ox.cs.pagoda.query.AnswerTuple; 7import uk.ac.ox.cs.pagoda.query.AnswerTuple;
8import uk.ac.ox.cs.pagoda.query.AnswerTuples; 8import uk.ac.ox.cs.pagoda.query.AnswerTuples;
9import uk.ac.ox.cs.pagoda.query.AnswerTuplesImp;
10import uk.ac.ox.cs.pagoda.query.QueryRecord; 9import uk.ac.ox.cs.pagoda.query.QueryRecord;
11import uk.ac.ox.cs.pagoda.query.QueryRecord.Step; 10import uk.ac.ox.cs.pagoda.query.QueryRecord.Step;
12import uk.ac.ox.cs.pagoda.reasoner.full.Checker; 11import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
13import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker; 12import uk.ac.ox.cs.pagoda.reasoner.full.HermitChecker;
14import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder; 13import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder;
14import uk.ac.ox.cs.pagoda.util.SimpleProgressBar;
15import uk.ac.ox.cs.pagoda.util.Timer; 15import uk.ac.ox.cs.pagoda.util.Timer;
16import uk.ac.ox.cs.pagoda.util.Utility; 16import uk.ac.ox.cs.pagoda.util.Utility;
17import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; 17import uk.ac.ox.cs.pagoda.util.disposable.DisposedException;
@@ -122,12 +122,12 @@ public class HermitSummaryFilter extends Checker {
122 if(m_record.isProcessed()) 122 if(m_record.isProcessed())
123 return 0; 123 return 0;
124 124
125 Utility.logDebug("The number of answers to be checked with HermiT: " + passed.size() + "/" + counter); 125// Utility.logDebug("The number of answers to be checked with HermiT: " + passed.size() + "/" + counter);
126 m_record.setDifficulty(Step.FULL_REASONING); 126 m_record.setDifficulty(Step.FULL_REASONING);
127 127
128 if(summarisedConsistency) 128// if(summarisedConsistency)
129 return endomorphismChecker.check(new AnswerTuplesImp(m_record.getAnswerVariables(), passed)); 129// return endomorphismChecker.check(new AnswerTuplesImp(m_record.getAnswerVariables(), passed));
130 else 130// else
131 return endomorphismChecker.check(answers); 131 return endomorphismChecker.check(answers);
132 } 132 }
133 133
@@ -145,9 +145,17 @@ public class HermitSummaryFilter extends Checker {
145 Set<AnswerTuple> succ = new HashSet<AnswerTuple>(); 145 Set<AnswerTuple> succ = new HashSet<AnswerTuple>();
146 Set<AnswerTuple> falsified = new HashSet<AnswerTuple>(), fail = new HashSet<AnswerTuple>(); 146 Set<AnswerTuple> falsified = new HashSet<AnswerTuple>(), fail = new HashSet<AnswerTuple>();
147 147
148 int numOfAnswers = 0;
149 for(; answers.isValid(); answers.moveNext()) {
150 numOfAnswers++;
151 }
152 answers.reset();
153
148 counter = 0; 154 counter = 0;
149 AnswerTuple representative; 155 AnswerTuple representative;
156 SimpleProgressBar progressBar = new SimpleProgressBar("Summarised checking", numOfAnswers);
150 for(AnswerTuple answer; answers.isValid(); answers.moveNext()) { 157 for(AnswerTuple answer; answers.isValid(); answers.moveNext()) {
158 progressBar.update(counter);
151 ++counter; 159 ++counter;
152 answer = answers.getTuple(); 160 answer = answers.getTuple();
153 representative = summary.getSummary(answer); 161 representative = summary.getSummary(answer);
@@ -164,6 +172,7 @@ public class HermitSummaryFilter extends Checker {
164 falsified.add(answer); 172 falsified.add(answer);
165 } 173 }
166 } 174 }
175 progressBar.dispose();
167 answers.dispose(); 176 answers.dispose();
168 177
169 Utility.logDebug("@TIME to filter out non-answers by summarisation: " + t.duration()); 178 Utility.logDebug("@TIME to filter out non-answers by summarisation: " + t.duration());
diff --git a/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java
index 4991d0d..7b68400 100644
--- a/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java
+++ b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java
@@ -15,6 +15,7 @@ public class PagodaProperties {
15 public static final boolean DEFAULT_DEBUG = false; 15 public static final boolean DEFAULT_DEBUG = false;
16 private static final boolean DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND; 16 private static final boolean DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND;
17 private static final boolean DEFAULT_USE_SKOLEM_UPPER_BOUND; 17 private static final boolean DEFAULT_USE_SKOLEM_UPPER_BOUND;
18 private static final boolean DEFAULT_TO_CALL_HERMIT;
18 private static final Path DEFAULT_STATISTICS_DIR; 19 private static final Path DEFAULT_STATISTICS_DIR;
19 20
20 public static boolean shellModeDefault = false; 21 public static boolean shellModeDefault = false;
@@ -23,6 +24,7 @@ public class PagodaProperties {
23 static { 24 static {
24 boolean defaultUseAlwaysSimpleUpperBound = false; 25 boolean defaultUseAlwaysSimpleUpperBound = false;
25 boolean defaultUseSkolemUpperBound = true; 26 boolean defaultUseSkolemUpperBound = true;
27 boolean toCallHermit = true;
26 Path defaultStatisticsDir = null; 28 Path defaultStatisticsDir = null;
27 29
28 try(InputStream in = PagodaProperties.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) { 30 try(InputStream in = PagodaProperties.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) {
@@ -52,12 +54,20 @@ public class PagodaProperties {
52 else 54 else
53 logger.debug("By default the Skolem upper bound is disabled"); 55 logger.debug("By default the Skolem upper bound is disabled");
54 } 56 }
57 if(config.containsKey("toCallHermit")) {
58 toCallHermit = Boolean.parseBoolean(config.getProperty("toCallHermit"));
59 if(toCallHermit)
60 logger.debug("By default Hermit is enabled");
61 else
62 logger.debug("By default Hermit is disabled");
63 }
55 64
56 } catch(IOException e) { 65 } catch(IOException e) {
57 e.printStackTrace(); 66 e.printStackTrace();
58 } 67 }
59 DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND = defaultUseAlwaysSimpleUpperBound; 68 DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND = defaultUseAlwaysSimpleUpperBound;
60 DEFAULT_USE_SKOLEM_UPPER_BOUND = defaultUseSkolemUpperBound; 69 DEFAULT_USE_SKOLEM_UPPER_BOUND = defaultUseSkolemUpperBound;
70 DEFAULT_TO_CALL_HERMIT = toCallHermit;
61 DEFAULT_STATISTICS_DIR = defaultStatisticsDir; 71 DEFAULT_STATISTICS_DIR = defaultStatisticsDir;
62 } 72 }
63 73
@@ -66,7 +76,7 @@ public class PagodaProperties {
66 String queryPath = null; 76 String queryPath = null;
67 String answerPath = null; 77 String answerPath = null;
68 boolean toClassify = true; 78 boolean toClassify = true;
69 boolean toCallHermiT = true; 79 boolean toCallHermiT = DEFAULT_TO_CALL_HERMIT;
70 boolean shellMode = shellModeDefault; 80 boolean shellMode = shellModeDefault;
71 private boolean useAlwaysSimpleUpperBound = DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND; 81 private boolean useAlwaysSimpleUpperBound = DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND;
72 private boolean useSkolemUpperBound = DEFAULT_USE_SKOLEM_UPPER_BOUND; 82 private boolean useSkolemUpperBound = DEFAULT_USE_SKOLEM_UPPER_BOUND;
diff --git a/src/uk/ac/ox/cs/pagoda/util/SimpleProgressBar.java b/src/uk/ac/ox/cs/pagoda/util/SimpleProgressBar.java
new file mode 100644
index 0000000..3c4aad7
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/util/SimpleProgressBar.java
@@ -0,0 +1,48 @@
1package uk.ac.ox.cs.pagoda.util;
2
3import uk.ac.ox.cs.pagoda.util.disposable.Disposable;
4
5public class SimpleProgressBar extends Disposable {
6
7 private final String name;
8 private int lastPercent;
9 private int maxValue;
10
11 public SimpleProgressBar() {
12 this("");
13 }
14
15 public SimpleProgressBar(String name) {
16 this(name, 100);
17 }
18
19 public SimpleProgressBar(String name, int maxValue) {
20 this.name = name;
21 this.maxValue = maxValue;
22 }
23
24 public void update(int value) {
25 int percent = value * 100 / maxValue;
26 StringBuilder template = new StringBuilder("\r" + name + " [");
27 for (int i = 0; i < 50; i++) {
28 if (i < percent * .5) {
29 template.append("=");
30 } else if (i == percent * .5) {
31 template.append(">");
32 } else {
33 template.append(" ");
34 }
35 }
36 template.append("] %s ");
37 System.out.printf(template.toString(), percent + "%");
38 System.out.flush();
39 lastPercent = percent;
40 }
41
42 @Override
43 public void dispose() {
44 super.dispose();
45
46 System.out.println();
47 }
48}
diff --git a/test/resources/BugTests.xml b/test/resources/BugTests.xml
index 5782bd4..c7a80ba 100644
--- a/test/resources/BugTests.xml
+++ b/test/resources/BugTests.xml
@@ -4,13 +4,8 @@
4<suite name="BugTests"> 4<suite name="BugTests">
5 5
6 <test name="BugTest"> 6 <test name="BugTest">
7 <groups>
8 <run>
9 <include name="BugTesters"/>
10 </run>
11 </groups>
12 <classes> 7 <classes>
13 <class name="uk.ac.ox.cs.pagoda.global_tests.MinimumCardinalityTest"/> 8 <class name="uk.ac.ox.cs.pagoda.global_tests.BugTests"/>
14 </classes> 9 </classes>
15 </test> 10 </test>
16 11
diff --git a/test/resources/LightTests.xml b/test/resources/MainTests.xml
index bcdc4af..255b68e 100644
--- a/test/resources/LightTests.xml
+++ b/test/resources/MainTests.xml
@@ -1,21 +1,25 @@
1<?xml version="1.0" encoding="UTF-8"?> 1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 2<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
3 3
4<suite name="LightTests"> 4<suite name="MainTests">
5 <test name="light"> 5 <test name="main">
6 <groups> 6 <groups>
7 <run> 7 <run>
8 <include name="light"/> 8 <!--<include name="correctness"/>-->
9 <!--<include name="light"/>-->
9 <!--<include name="justExecute"/>--> 10 <!--<include name="justExecute"/>-->
10 <exclude name="nonOriginal"/> 11 <!--&lt;!&ndash;<include name="heavy"/>&ndash;&gt;-->
12 <include name="nonOriginal"/>
11 </run> 13 </run>
12 </groups> 14 </groups>
13 <classes> 15 <classes>
14 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaReactome"/>--> 16 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaReactome"/>-->
15 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaUOBM"/> 17 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaUOBM"/>-->
16 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaLUBM"/> 18 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaLUBM"/>-->
17 <!--Fly does not terminate: query-5 looks really hard--> 19 <!--Fly does not terminate: query-5 looks really hard-->
18 <!--<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"/>-->
22 <!--<class name="uk.ac.ox.cs.pagoda.util.SimpleProgressBarTester" />-->
19 </classes> 23 </classes>
20 </test> 24 </test>
21</suite> \ No newline at end of file 25</suite> \ No newline at end of file
diff --git a/test/resources/SygeniaTests.xml b/test/resources/SygeniaTests.xml
index 01c4eab..4daecf5 100644
--- a/test/resources/SygeniaTests.xml
+++ b/test/resources/SygeniaTests.xml
@@ -11,9 +11,10 @@
11 </groups> 11 </groups>
12 12
13 <classes> 13 <classes>
14 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaUOBM"/>--> 14 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaUOBM"/>
15 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaLUBM"/> 15 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaLUBM"/>
16 <!--<class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaFLY"/>--> 16 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaFLY"/>
17 <class name="uk.ac.ox.cs.pagoda.global_tests.TestPagodaReactome"/>
17 </classes> 18 </classes>
18 </test> 19 </test>
19 20
diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/MinimumCardinalityTest.java b/test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java
index 71c20c1..19e0b2a 100644
--- a/test/uk/ac/ox/cs/pagoda/global_tests/MinimumCardinalityTest.java
+++ b/test/uk/ac/ox/cs/pagoda/global_tests/BugTests.java
@@ -6,6 +6,7 @@ import org.testng.Assert;
6import org.testng.annotations.Test; 6import org.testng.annotations.Test;
7import uk.ac.ox.cs.pagoda.query.AnswerTuple; 7import uk.ac.ox.cs.pagoda.query.AnswerTuple;
8import uk.ac.ox.cs.pagoda.query.AnswerTuples; 8import uk.ac.ox.cs.pagoda.query.AnswerTuples;
9import uk.ac.ox.cs.pagoda.query.QueryRecord;
9import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner; 10import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner;
10import uk.ac.ox.cs.pagoda.util.TestUtil; 11import uk.ac.ox.cs.pagoda.util.TestUtil;
11 12
@@ -13,7 +14,7 @@ import java.io.IOException;
13import java.nio.file.Files; 14import java.nio.file.Files;
14import java.nio.file.Paths; 15import java.nio.file.Paths;
15 16
16public class MinimumCardinalityTest { 17public class BugTests {
17 18
18 public static final String NS = "http://example.org/test#%s"; 19 public static final String NS = "http://example.org/test#%s";
19 20
@@ -21,8 +22,8 @@ public class MinimumCardinalityTest {
21 return IRI.create(String.format(NS, name)); 22 return IRI.create(String.format(NS, name));
22 } 23 }
23 24
24 @Test(groups = {"BugTesters"}) 25 @Test
25 public void test() throws OWLOntologyCreationException, IOException, OWLOntologyStorageException { 26 public void minimumCardinalityAxiom() throws OWLOntologyCreationException, IOException, OWLOntologyStorageException {
26 27
27 /* 28 /*
28 * Build test ontology 29 * Build test ontology
@@ -98,4 +99,86 @@ public class MinimumCardinalityTest {
98 } 99 }
99 pagoda.dispose(); 100 pagoda.dispose();
100 } 101 }
102
103 /**
104 * Bug: the relevant ontology is not a subset of the original one.
105 *
106 * @throws OWLOntologyCreationException
107 * @throws IOException
108 * @throws OWLOntologyStorageException
109 */
110 @Test
111 public void rTest() throws OWLOntologyCreationException, IOException, OWLOntologyStorageException {
112
113 /*
114 * Build test ontology
115 * */
116
117 OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
118 OWLDataFactory factory = manager.getOWLDataFactory();
119 OWLOntology ontology = manager.createOntology();
120
121 OWLClass classA = factory.getOWLClass(getEntityIRI("A"));
122 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(classA));
123 OWLClass classB = factory.getOWLClass(getEntityIRI("B"));
124 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(classB));
125 OWLNamedIndividual a = factory.getOWLNamedIndividual(getEntityIRI("a"));
126 OWLNamedIndividual b = factory.getOWLNamedIndividual(getEntityIRI("b"));
127 OWLNamedIndividual c = factory.getOWLNamedIndividual(getEntityIRI("c"));
128 OWLObjectProperty roleR = factory.getOWLObjectProperty(IRI.create(String.format(NS, "R")));
129 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(roleR));
130 OWLObjectProperty roleP = factory.getOWLObjectProperty(IRI.create(String.format(NS, "P")));
131 manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(roleP));
132
133 // Class assertions
134 manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(classA, a)); // A(a)
135 manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(classA, b)); // A(b)
136 manager.addAxiom(ontology, factory.getOWLObjectPropertyAssertionAxiom(roleP, c, a)); // P(c,a)
137
138 // Axioms
139 // subsetOf(A someValuesFrom(R owl:Thing))
140 manager.addAxiom(ontology,
141 factory.getOWLSubClassOfAxiom(classA,
142 factory.getOWLObjectSomeValuesFrom(roleR,
143 factory.getOWLThing())));
144
145 // inverseFunctional(R)
146 manager.addAxiom(ontology,
147 factory.getOWLInverseFunctionalObjectPropertyAxiom(roleR));
148
149 // subsetOf(someValuesFrom(inverseOf(P) owl:thing) B)
150 manager.addAxiom(ontology,
151 factory.getOWLSubClassOfAxiom(factory.getOWLObjectSomeValuesFrom(roleP.getInverseProperty(),
152 factory.getOWLThing()),
153 classB));
154 /*
155 * Save the ontology
156 * */
157
158// manager.saveOntology(ontology, Files.newOutputStream(Paths.get("/home/alessandro/Desktop/test-ontology.owl")));
159
160 /*
161 * Test one query
162 * */
163
164 QueryReasoner pagoda = QueryReasoner.getInstance(ontology);
165 pagoda.loadOntology(ontology);
166 if(pagoda.preprocess()) {
167 String queryStr = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
168 "select distinct ?x" +
169 " where { "
170 + " ?x rdf:type " + classB +
171 " }";
172 QueryRecord queryRecord = pagoda.getQueryManager().create(queryStr);
173 System.out.println(queryRecord);
174 pagoda.evaluate(queryRecord);
175 AnswerTuples answers = queryRecord.getAnswers();
176 System.out.println("Difficulty: " + queryRecord.getDifficulty());
177 for(AnswerTuple ans; answers.isValid(); answers.moveNext()) {
178 ans = answers.getTuple();
179 TestUtil.logInfo(ans);
180 }
181 }
182 pagoda.dispose();
183 }
101} 184}
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 31d2eac..0ce3d69 100644
--- a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java
+++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java
@@ -25,7 +25,6 @@ public class TestPagodaFLY {
25 .query(Paths.get(ontoDir, "fly/queries/fly.sparql")) 25 .query(Paths.get(ontoDir, "fly/queries/fly.sparql"))
26 .answer(answers) 26 .answer(answers)
27 .classify(false) 27 .classify(false)
28 .hermit(true)
29 .build(); 28 .build();
30 29
31 pagoda.run(); 30 pagoda.run();
@@ -45,7 +44,6 @@ public class TestPagodaFLY {
45 .answer(answers) 44 .answer(answers)
46// .answer(Paths.get("/home/alessandro/Desktop/answers.json")) 45// .answer(Paths.get("/home/alessandro/Desktop/answers.json"))
47 .classify(false) 46 .classify(false)
48 .hermit(true)
49 .build(); 47 .build();
50 48
51 pagoda.run(); 49 pagoda.run();
@@ -57,8 +55,8 @@ public class TestPagodaFLY {
57 String ontoDir = TestUtil.getConfig().getProperty("ontoDir"); 55 String ontoDir = TestUtil.getConfig().getProperty("ontoDir");
58 56
59 Pagoda.builder() 57 Pagoda.builder()
60 .ontology(Paths.get(ontoDir, "fly/fly_rolledUp.owl")) 58// .ontology(Paths.get(ontoDir, "fly/fly_rolledUp.owl"))
61// .ontology(Paths.get(ontoDir, "fly/fly_anatomy_XP_with_GJ_FC_individuals.owl")) 59 .ontology(Paths.get(ontoDir, "fly/fly_anatomy_XP_with_GJ_FC_individuals.owl"))
62 .query(Paths.get(ontoDir, "fly/queries/new_queries.sparql")) 60 .query(Paths.get(ontoDir, "fly/queries/new_queries.sparql"))
63// .answer(Paths.get("/home/alessandro/Desktop/answers.json")) 61// .answer(Paths.get("/home/alessandro/Desktop/answers.json"))
64 .classify(false) 62 .classify(false)
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 fdbfc42..c893f96 100644
--- a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaLUBM.java
+++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaLUBM.java
@@ -23,8 +23,6 @@ public class TestPagodaLUBM {
23 .data(Paths.get(ontoDir, "lubm/data/lubm" + number + ".ttl")) 23 .data(Paths.get(ontoDir, "lubm/data/lubm" + number + ".ttl"))
24 .query(Paths.get(ontoDir, "lubm/queries/test.sparql")) 24 .query(Paths.get(ontoDir, "lubm/queries/test.sparql"))
25 .answer(answers) 25 .answer(answers)
26 .classify(true)
27 .hermit(true)
28 .build(); 26 .build();
29 27
30 pagoda.run(); 28 pagoda.run();
@@ -45,11 +43,9 @@ public class TestPagodaLUBM {
45 Pagoda pagoda = Pagoda.builder() 43 Pagoda pagoda = Pagoda.builder()
46 .ontology(Paths.get(ontoDir, "lubm/univ-bench.owl")) 44 .ontology(Paths.get(ontoDir, "lubm/univ-bench.owl"))
47 .data(Paths.get(ontoDir, "lubm/data/lubm" + number + ".ttl")) 45 .data(Paths.get(ontoDir, "lubm/data/lubm" + number + ".ttl"))
48 .query(Paths.get(ontoDir, "lubm/queries/lubm_sygenia.sparql")) 46 .query(Paths.get(ontoDir, "lubm/queries/lubm_sygenia.sparql"))
49// .answer(answers) 47// .answer(answers)
50 .classify(true) 48 .build();
51 .hermit(true)
52 .build();
53 49
54 pagoda.run(); 50 pagoda.run();
55// CheckAnswers.assertSameAnswers(answers, givenAnswers); 51// CheckAnswers.assertSameAnswers(answers, givenAnswers);
@@ -71,8 +67,6 @@ public class TestPagodaLUBM {
71 .data(Paths.get(ontoDir, "lubm/data/lubm" + number + ".ttl")) 67 .data(Paths.get(ontoDir, "lubm/data/lubm" + number + ".ttl"))
72 .query(Paths.get(ontoDir, "lubm/queries/lubm_sygenia_all-blanks.sparql")) 68 .query(Paths.get(ontoDir, "lubm/queries/lubm_sygenia_all-blanks.sparql"))
73// .answer(answers) 69// .answer(answers)
74 .classify(true)
75 .hermit(true)
76 .build(); 70 .build();
77 71
78 pagoda.run(); 72 pagoda.run();
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 9fb6cbe..c5b272c 100644
--- a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaUOBM.java
+++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaUOBM.java
@@ -41,8 +41,6 @@ public class TestPagodaUOBM {
41 .data(Paths.get(ontoDir, "uobm/data/uobm" + number + ".ttl")) 41 .data(Paths.get(ontoDir, "uobm/data/uobm" + number + ".ttl"))
42 .query(Paths.get(ontoDir, "uobm/queries/test.sparql")) 42 .query(Paths.get(ontoDir, "uobm/queries/test.sparql"))
43 .answer(answers) 43 .answer(answers)
44 .classify(true)
45 .hermit(true)
46 .build(); 44 .build();
47 45
48 pagoda.run(); 46 pagoda.run();
@@ -65,8 +63,6 @@ public class TestPagodaUOBM {
65 .ontology(Paths.get(ontoDir, "uobm/univ-bench-dl.owl")) 63 .ontology(Paths.get(ontoDir, "uobm/univ-bench-dl.owl"))
66 .data(Paths.get(ontoDir, "uobm/data/uobm" + number + ".ttl")) 64 .data(Paths.get(ontoDir, "uobm/data/uobm" + number + ".ttl"))
67 .query(Paths.get(ontoDir, "uobm/queries/uobm_sygenia.sparql")) 65 .query(Paths.get(ontoDir, "uobm/queries/uobm_sygenia.sparql"))
68 .classify(true)
69 .hermit(true)
70 .build(); 66 .build();
71 67
72 pagoda.run(); 68 pagoda.run();
@@ -85,22 +81,30 @@ public class TestPagodaUOBM {
85 .ontology(Paths.get(ontoDir, "uobm/univ-bench-dl.owl")) 81 .ontology(Paths.get(ontoDir, "uobm/univ-bench-dl.owl"))
86 .data(Paths.get(ontoDir, "uobm/data/uobm" + number + ".ttl")) 82 .data(Paths.get(ontoDir, "uobm/data/uobm" + number + ".ttl"))
87 .query(Paths.get(ontoDir, "uobm/queries/uobm_sygenia_all-blanks.sparql")) 83 .query(Paths.get(ontoDir, "uobm/queries/uobm_sygenia_all-blanks.sparql"))
88 .classify(true) 84 .build()
89 .hermit(true) 85 .run();
86 }
87
88 @Test(groups = {"justExecute", "heavy", "nonOriginal"})
89 public void justExecute_modifiedUOBM() throws IOException {
90 String ontoDir = TestUtil.getConfig().getProperty("ontoDir");
91
92 Pagoda.builder()
93 .ontology(Paths.get(ontoDir, "uobm_modified/univ-bench-dl-modified.owl"))
94 .data(Paths.get(ontoDir, "uobm_modified/data/uobm1.ttl"))
95 .query(Paths.get(ontoDir, "uobm_modified/queries/additional_queries.sparql"))
90 .build() 96 .build()
91 .run(); 97 .run();
92 } 98 }
93 99
94 @Test(groups = {"justExecute"}) 100 @Test(groups = {"justExecute"})
95 public void justExecute_existentialQueries() throws IOException { 101 public void justExecute_additionalQueries() throws IOException {
96 String ontoDir = TestUtil.getConfig().getProperty("ontoDir"); 102 String ontoDir = TestUtil.getConfig().getProperty("ontoDir");
97 103
98 Pagoda.builder() 104 Pagoda.builder()
99 .ontology(Paths.get(ontoDir, "uobm/univ-bench-dl-modified.owl")) 105 .ontology(Paths.get(ontoDir, "uobm/univ-bench-dl.owl"))
100 .data(Paths.get(ontoDir, "uobm/data/uobm1.ttl")) 106 .data(Paths.get(ontoDir, "uobm/data/uobm1.ttl"))
101 .query(Paths.get(ontoDir, "uobm/queries/existential_queries.sparql")) 107 .query(Paths.get(ontoDir, "uobm/queries/additional_queries.sparql"))
102 .classify(true)
103 .hermit(true)
104 .build() 108 .build()
105 .run(); 109 .run();
106 } 110 }
diff --git a/test/uk/ac/ox/cs/pagoda/util/SimpleProgressBarTester.java b/test/uk/ac/ox/cs/pagoda/util/SimpleProgressBarTester.java
new file mode 100644
index 0000000..3de30e4
--- /dev/null
+++ b/test/uk/ac/ox/cs/pagoda/util/SimpleProgressBarTester.java
@@ -0,0 +1,16 @@
1package uk.ac.ox.cs.pagoda.util;
2
3import org.testng.annotations.Test;
4
5public class SimpleProgressBarTester {
6
7 @Test
8 public void test() throws InterruptedException {
9 SimpleProgressBar simpleProgressBar = new SimpleProgressBar("TestBar", 1000);
10 for(int i = 0; i < 1000; i++) {
11 simpleProgressBar.update(i);
12 Thread.sleep(10);
13 }
14 simpleProgressBar.dispose();
15 }
16}