aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs
diff options
context:
space:
mode:
authorRncLsn <rnc.lsn@gmail.com>2015-06-03 19:24:50 +0100
committerRncLsn <rnc.lsn@gmail.com>2015-06-03 19:24:50 +0100
commita840a197549ced185f212b2aa74abed8774c8b5c (patch)
tree91168e111df7245b0cc1bf52c2738597a1a4a2e4 /src/uk/ac/ox/cs
parentb3b822d187a6402a39d30e471fe90a5dfad64312 (diff)
downloadACQuA-a840a197549ced185f212b2aa74abed8774c8b5c.tar.gz
ACQuA-a840a197549ced185f212b2aa74abed8774c8b5c.zip
Reintroduced extended queries. Successfully tested on LightTests and GapAnswers.
Diffstat (limited to 'src/uk/ac/ox/cs')
-rw-r--r--src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java6
-rw-r--r--src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java2
-rw-r--r--src/uk/ac/ox/cs/pagoda/query/QueryRecord.java116
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java54
-rw-r--r--src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java50
5 files changed, 111 insertions, 117 deletions
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 4022c1d..73a27bf 100644
--- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
+++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java
@@ -94,14 +94,14 @@ public class OpenEndPlan implements CheckPlan {
94 94
95 private boolean redundant(Clique clique) { 95 private boolean redundant(Clique clique) {
96 for (NodeTuple nodeTuple: clique.getNodeTuples()) 96 for (NodeTuple nodeTuple: clique.getNodeTuples())
97 if (!passedAnswers.contains(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity))) 97 if(!passedAnswers.contains(AnswerTuple.create(nodeTuple.getAnswerTuple(), m_answerArity)))
98 return false; 98 return false;
99 return true; 99 return true;
100 } 100 }
101 101
102 private void addProjections(Clique clique) { 102 private void addProjections(Clique clique) {
103 for (NodeTuple nodeTuple: clique.getNodeTuples()) 103 for (NodeTuple nodeTuple: clique.getNodeTuples())
104 passedAnswers.add(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity)); 104 passedAnswers.add(AnswerTuple.create(nodeTuple.getAnswerTuple(), m_answerArity));
105 } 105 }
106 106
107 private void setMarkCascadelyValidated(Clique clique) { 107 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 9a9d0de..1e5fbd4 100644
--- a/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java
+++ b/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java
@@ -49,7 +49,7 @@ public class AnswerTuple {
49 /** 49 /**
50 * It returns the first argument if its arity equals length, a new AnswerTuple otherwise. 50 * It returns the first argument if its arity equals length, a new AnswerTuple otherwise.
51 */ 51 */
52 public static AnswerTuple getInstance(AnswerTuple extendedTuple, int length) { 52 public static AnswerTuple create(AnswerTuple extendedTuple, int length) {
53 if(length == extendedTuple.getArity()) return extendedTuple; 53 if(length == extendedTuple.getArity()) return extendedTuple;
54 else return new AnswerTuple(extendedTuple, length); 54 else return new AnswerTuple(extendedTuple, length);
55 } 55 }
diff --git a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java
index 3edb2c3..dee2966 100644
--- a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java
+++ b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java
@@ -9,7 +9,6 @@ import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxAnswerTuples;
9import uk.ac.ox.cs.pagoda.rules.GeneralProgram; 9import uk.ac.ox.cs.pagoda.rules.GeneralProgram;
10import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper; 10import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper;
11import uk.ac.ox.cs.pagoda.util.Namespace; 11import uk.ac.ox.cs.pagoda.util.Namespace;
12import uk.ac.ox.cs.pagoda.util.PagodaProperties;
13import uk.ac.ox.cs.pagoda.util.Utility; 12import uk.ac.ox.cs.pagoda.util.Utility;
14import uk.ac.ox.cs.pagoda.util.disposable.Disposable; 13import uk.ac.ox.cs.pagoda.util.disposable.Disposable;
15import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; 14import uk.ac.ox.cs.pagoda.util.disposable.DisposedException;
@@ -135,18 +134,6 @@ public class QueryRecord extends Disposable {
135 return updateUpperBoundAnswers(answerTuples, false); 134 return updateUpperBoundAnswers(answerTuples, false);
136 } 135 }
137 136
138 public boolean checkUpperBoundAnswers(AnswerTuples answerTuples) {
139 if(isDisposed()) throw new DisposedException();
140
141 return updateUpperBoundAnswers(answerTuples, true, false);
142 }
143
144 public boolean updateUpperBoundAnswers(AnswerTuples answerTuples, boolean toCheckAux) {
145 if(isDisposed()) throw new DisposedException();
146
147 return updateUpperBoundAnswers(answerTuples, toCheckAux, true);
148 }
149
150 public int getNumberOfAnswers() { 137 public int getNumberOfAnswers() {
151 if(isDisposed()) throw new DisposedException(); 138 if(isDisposed()) throw new DisposedException();
152 139
@@ -377,7 +364,7 @@ public class QueryRecord extends Disposable {
377 Utility.logError("The answer (" + answer + ") cannot be added, because it is not in the upper bound."); 364 Utility.logError("The answer (" + answer + ") cannot be added, because it is not in the upper bound.");
378 gapAnswerTuples.remove(answer); 365 gapAnswerTuples.remove(answer);
379 366
380 answer = AnswerTuple.getInstance(answer, answerVariables[0].length); 367 answer = AnswerTuple.create(answer, answerVariables[0].length);
381// if (soundAnswerTuples.contains(answer)) 368// if (soundAnswerTuples.contains(answer))
382// Utility.logError("The answer (" + answer + ") cannot be added, because it is in the lower bound."); 369// Utility.logError("The answer (" + answer + ") cannot be added, because it is in the lower bound.");
383 soundAnswerTuples.add(answer); 370 soundAnswerTuples.add(answer);
@@ -556,7 +543,6 @@ public class QueryRecord extends Disposable {
556 return false; 543 return false;
557 } 544 }
558 545
559 // TODO remove fully extended query
560 public Tuple<String> getExtendedQueryText() { 546 public Tuple<String> getExtendedQueryText() {
561 if(isDisposed()) throw new DisposedException(); 547 if(isDisposed()) throw new DisposedException();
562 548
@@ -655,75 +641,65 @@ public class QueryRecord extends Disposable {
655 return Objects.hash(queryText, soundAnswerTuples); 641 return Objects.hash(queryText, soundAnswerTuples);
656 } 642 }
657 643
658 private boolean updateUpperBoundAnswers(AnswerTuples answerTuples, boolean toCheckAux, boolean _check_containment) { 644 public boolean updateUpperBoundAnswers(AnswerTuples answerTuples, boolean toCheckAux) {
659 if(!(answerTuples instanceof RDFoxAnswerTuples)) { 645 RDFoxAnswerTuples rdfAnswerTuples;
660 String msg = "The upper bound must be computed by RDFox!"; 646 if(answerTuples instanceof RDFoxAnswerTuples)
661 Utility.logError(msg); 647 rdfAnswerTuples = (RDFoxAnswerTuples) answerTuples;
662 throw new IllegalArgumentException(msg); 648 else {
649 Utility.logError("The upper bound must be computed by RDFox!");
650 return false;
663 } 651 }
664 652
665 RDFoxAnswerTuples rdfoxAnswerTuples = (RDFoxAnswerTuples) answerTuples; 653 if(soundAnswerTuples.size() > 0) {
654 int number = 0;
655 for(; answerTuples.isValid(); answerTuples.moveNext()) {
656 ++number;
657 }
658 Utility.logDebug("The number of answers returned by an upper bound: " + number);
659 if(number <= soundAnswerTuples.size()) {
660 if(gapAnswerTuples != null) gapAnswerTuples.clear();
661 else gapAnswerTuples = new HashSet<AnswerTuple>();
666 662
667 Set<AnswerTuple> candidateGapAnswerTuples = new HashSet<AnswerTuple>(); 663 Utility.logInfo("Upper bound answers updated: " + (soundAnswerTuples.size() + gapAnswerTuples.size()));
668 AnswerTuple tuple; 664 return false;
669 for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { 665 }
670 tuple = rdfoxAnswerTuples.getTuple(); 666 answerTuples.reset();
671 if(isBottom() || !tuple.hasAnonymousIndividual())
672 if((!toCheckAux || !tuple.hasAuxPredicate()) && !soundAnswerTuples.contains(tuple))
673 candidateGapAnswerTuples.add(tuple);
674 } 667 }
675 668
676 /*** START: debugging ***/ 669 boolean justCheck = (answerTuples.getArity() != answerVariables[1].length);
677 if(PagodaProperties.isDebuggingMode() && _check_containment) { 670
678 if(rdfoxAnswerTuples.getArity() != getAnswerVariables().length) 671 Set<AnswerTuple> tupleSet = new HashSet<AnswerTuple>();
679 throw new IllegalArgumentException( 672 AnswerTuple tuple, extendedTuple;
680 "The arity of answers (" + rdfoxAnswerTuples.getArity() + ") " + 673 for(; answerTuples.isValid(); answerTuples.moveNext()) {
681 "is different from the number of answer variables (" + 674 extendedTuple = rdfAnswerTuples.getTuple();
682 getAnswerVariables().length + ")"); 675 if(isBottom() || !extendedTuple.hasAnonymousIndividual()) {
683 676 tuple = AnswerTuple.create(extendedTuple, answerVariables[0].length);
684 Set<AnswerTuple> namedAnswerTuples = new HashSet<>(); 677 if((!toCheckAux || !tuple.hasAuxPredicate()) && !soundAnswerTuples.contains(tuple)) {
685 rdfoxAnswerTuples.reset(); 678 if(!toCheckAux && justCheck) return false;
686 int numberOfAnswers = 0; 679 tupleSet.add(extendedTuple);
687 for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { 680 }
688 tuple = rdfoxAnswerTuples.getTuple();
689// if(isBottom() || !tuple.hasAnonymousIndividual()) {
690 namedAnswerTuples.add(tuple);
691// }
692 numberOfAnswers++;
693 } 681 }
694 Utility.logDebug("The number of answers returned by an upper bound: " + numberOfAnswers);
695 HashSet<AnswerTuple> difference = new HashSet<>(soundAnswerTuples);
696 difference.removeAll(namedAnswerTuples);
697 if(!difference.isEmpty())
698 throw new IllegalArgumentException("The upper bound does not contain the lower bound! Missing answers: " + difference
699 .size());
700 } 682 }
701 /*** END: debugging ***/
702 683
703 boolean update;
704 if(gapAnswerTuples == null) { 684 if(gapAnswerTuples == null) {
705 gapAnswerTuples = candidateGapAnswerTuples; 685 gapAnswerTuples = tupleSet;
706 update = true; 686
687 Utility.logInfo("Upper bound answers updated: " + (soundAnswerTuples.size() + gapAnswerTuples.size()));
688 return true;
707 } 689 }
708 else { 690
709 update = gapAnswerTuples.retainAll(candidateGapAnswerTuples); 691 boolean update = false;
692 for(Iterator<AnswerTuple> iter = gapAnswerTuples.iterator(); iter.hasNext(); ) {
693 tuple = iter.next();
694 if(!tupleSet.contains(tuple)) {
695 iter.remove();
696 update = true;
697 }
710 } 698 }
711 699
712 if(update) 700 Utility.logInfo("Upper bound answers updated: " + (soundAnswerTuples.size() + gapAnswerTuples.size()));
713 Utility.logInfo("Upper bound answers updated: " + getNumberOfAnswers());
714 else
715 Utility.logInfo("Upper bound answers unchanged");
716 701
717 return update; 702 return update;
718
719// boolean update = false;
720// for(Iterator<AnswerTuple> iter = gapAnswerTuples.iterator(); iter.hasNext(); ) {
721// tuple = iter.next();
722// if(!candidateGapAnswerTuples.contains(tuple)) {
723// iter.remove();
724// update = true;
725// }
726// }
727 } 703 }
728 704
729 public enum Step { 705 public enum Step {
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
index b4e2f5a..3027a73 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
@@ -19,6 +19,7 @@ import uk.ac.ox.cs.pagoda.tracking.QueryTracker;
19import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder; 19import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder;
20import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderDisjVar1; 20import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderDisjVar1;
21import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderWithGap; 21import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderWithGap;
22import uk.ac.ox.cs.pagoda.util.PagodaProperties;
22import uk.ac.ox.cs.pagoda.util.Timer; 23import uk.ac.ox.cs.pagoda.util.Timer;
23import uk.ac.ox.cs.pagoda.util.Utility; 24import uk.ac.ox.cs.pagoda.util.Utility;
24import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; 25import uk.ac.ox.cs.pagoda.util.disposable.DisposedException;
@@ -44,7 +45,6 @@ class MyQueryReasoner extends QueryReasoner {
44 private Collection<String> predicatesWithGap = null; 45 private Collection<String> predicatesWithGap = null;
45 private ConsistencyStatus isConsistent; 46 private ConsistencyStatus isConsistent;
46 private ConsistencyManager consistency = new ConsistencyManager(this); 47 private ConsistencyManager consistency = new ConsistencyManager(this);
47 private boolean useSkolemisation = false; // now only debugging
48 48
49 public MyQueryReasoner() { 49 public MyQueryReasoner() {
50 setup(true); 50 setup(true);
@@ -192,7 +192,8 @@ class MyQueryReasoner extends QueryReasoner {
192 OWLOntology relevantOntologySubset = extractRelevantOntologySubset(queryRecord); 192 OWLOntology relevantOntologySubset = extractRelevantOntologySubset(queryRecord);
193 queryRecord.saveRelevantOntology("/home/alessandro/Desktop/fragment_query" + queryRecord.getQueryID() + ".owl"); 193 queryRecord.saveRelevantOntology("/home/alessandro/Desktop/fragment_query" + queryRecord.getQueryID() + ".owl");
194 194
195 if(useSkolemisation && querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) 195 if(PagodaProperties.getDefaultUseSkolemUpperBound() &&
196 querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord))
196 return; 197 return;
197 198
198 Timer t = new Timer(); 199 Timer t = new Timer();
@@ -263,10 +264,12 @@ class MyQueryReasoner extends QueryReasoner {
263 private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, 264 private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord,
264 Tuple<String> extendedQuery, Step step) { 265 Tuple<String> extendedQuery, Step step) {
265 t.reset(); 266 t.reset();
266 if(queryRecord.hasNonAnsDistinguishedVariables()) 267
268 queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables());
269 if(!queryRecord.isProcessed() && !queryRecord.getQueryText().equals(extendedQuery.get(0)))
267 queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); 270 queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables());
268 else 271 if(!queryRecord.isProcessed() && queryRecord.hasNonAnsDistinguishedVariables())
269 queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); 272 queryUpperBound(upperStore, queryRecord, extendedQuery.get(1), queryRecord.getDistinguishedVariables());
270 273
271 queryRecord.addProcessingTime(step, t.duration()); 274 queryRecord.addProcessingTime(step, t.duration());
272 if(queryRecord.isProcessed()) { 275 if(queryRecord.isProcessed()) {
@@ -276,34 +279,6 @@ class MyQueryReasoner extends QueryReasoner {
276 return false; 279 return false;
277 } 280 }
278 281
279 private boolean checkGapAnswers(BasicQueryEngine relevantStore, QueryRecord queryRecord) {
280 t.reset();
281 Tuple<String> extendedQueries = queryRecord.getExtendedQueryText();
282 if(queryRecord.hasNonAnsDistinguishedVariables())
283 checkGapAnswers(relevantStore, queryRecord, extendedQueries.get(0), queryRecord.getAnswerVariables());
284 else
285 checkGapAnswers(relevantStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables());
286
287 queryRecord.addProcessingTime(Step.L_SKOLEM_UPPER_BOUND, t.duration());
288 if(queryRecord.isProcessed()) {
289 queryRecord.setDifficulty(Step.L_SKOLEM_UPPER_BOUND);
290 return true;
291 }
292 return false;
293 }
294
295 private void checkGapAnswers(BasicQueryEngine relevantStore, QueryRecord queryRecord, String queryText, String[] answerVariables) {
296 AnswerTuples rlAnswer = null;
297 try {
298 Utility.logDebug(queryText);
299 rlAnswer = relevantStore.evaluate(queryText, answerVariables);
300 Utility.logDebug(t.duration());
301 queryRecord.checkUpperBoundAnswers(rlAnswer);
302 } finally {
303 if(rlAnswer != null) rlAnswer.dispose();
304 }
305 }
306
307 /** 282 /**
308 * Returns the part of the ontology relevant for Hermit, while computing the bound answers. 283 * Returns the part of the ontology relevant for Hermit, while computing the bound answers.
309 */ 284 */
@@ -322,9 +297,11 @@ class MyQueryReasoner extends QueryReasoner {
322 297
323 Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); 298 Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText();
324 299
325 Utility.logDebug("Tracking store"); 300 if(PagodaProperties.getDefaultUseAlwaysSimpleUpperBound() || lazyUpperStore == null) {
326 if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND)) 301 Utility.logDebug("Tracking store");
327 return true; 302 if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND))
303 return true;
304 }
328 305
329 if(!queryRecord.isBottom()) { 306 if(!queryRecord.isBottom()) {
330 Utility.logDebug("Lazy store"); 307 Utility.logDebug("Lazy store");
@@ -362,7 +339,6 @@ class MyQueryReasoner extends QueryReasoner {
362 339
363 queryRecord.addProcessingTime(Step.FRAGMENT, t.duration()); 340 queryRecord.addProcessingTime(Step.FRAGMENT, t.duration());
364 341
365 // just statistics
366 int numOfABoxAxioms = relevantOntologySubset.getABoxAxioms(true).size(); 342 int numOfABoxAxioms = relevantOntologySubset.getABoxAxioms(true).size();
367 int numOfTBoxAxioms = relevantOntologySubset.getAxiomCount() - numOfABoxAxioms; 343 int numOfTBoxAxioms = relevantOntologySubset.getAxiomCount() - numOfABoxAxioms;
368 Utility.logInfo("Relevant ontology-subset has been extracted: |ABox|=" 344 Utility.logInfo("Relevant ontology-subset has been extracted: |ABox|="
@@ -407,7 +383,9 @@ class MyQueryReasoner extends QueryReasoner {
407 return false; 383 return false;
408 } 384 }
409 385
410 boolean isFullyProcessed = checkGapAnswers(relevantStore, queryRecord); 386 boolean isFullyProcessed = queryUpperStore(relevantStore, queryRecord,
387 queryRecord.getExtendedQueryText(),
388 Step.L_SKOLEM_UPPER_BOUND);
411 Utility.logInfo("Semi-Skolemised relevant upper store has been evaluated"); 389 Utility.logInfo("Semi-Skolemised relevant upper store has been evaluated");
412 return isFullyProcessed; 390 return isFullyProcessed;
413 } 391 }
diff --git a/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java
index 7b7d48d..e07d54f 100644
--- a/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java
+++ b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java
@@ -10,24 +10,41 @@ import java.util.Properties;
10public class PagodaProperties { 10public class PagodaProperties {
11 11
12 public static final String CONFIG_FILE = "pagoda.properties"; 12 public static final String CONFIG_FILE = "pagoda.properties";
13
14 public static final boolean DEFAULT_DEBUG = false; 13 public static final boolean DEFAULT_DEBUG = false;
14 private static final boolean DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND;
15 private static final boolean DEFAULT_USE_SKOLEM_UPPER_BOUND;
16
15 public static boolean shellModeDefault = false; 17 public static boolean shellModeDefault = false;
16 private static boolean debug = DEFAULT_DEBUG; 18 private static boolean debug = DEFAULT_DEBUG;
17 19
18 static { 20 static {
21 boolean defaultUseAlwaysSimpleUpperBound = false;
22 boolean defaultUseSkolemUpperBound = true;
23
19 try(InputStream in = PagodaProperties.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) { 24 try(InputStream in = PagodaProperties.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) {
20 Properties config = new Properties(); 25 Properties config = new Properties();
21 config.load(in); 26 config.load(in);
22 in.close(); 27 in.close();
28 Logger logger = Logger.getLogger("PagodaProperties");
23 if(config.containsKey("debug")) { 29 if(config.containsKey("debug")) {
24 debug = Boolean.parseBoolean(config.getProperty("debug")); 30 debug = Boolean.parseBoolean(config.getProperty("debug"));
25 Logger.getLogger("PagodaProperties") 31// logger.info("Debugging mode is enabled (you can disable it from file \"pagoda.properties\")");
26 .info("Debugging mode is enabled (you can disable it from file \"pagoda.properties\")"); 32 logger.info("Debugging mode is enabled");
33 }
34 if(config.containsKey("useAlwaysSimpleUpperBound")) {
35 defaultUseAlwaysSimpleUpperBound =
36 Boolean.parseBoolean(config.getProperty("useAlwaysSimpleUpperBound"));
37 logger.info("The simple upper bound is always used");
38 }
39 if(config.containsKey("useSkolemUpperBound")) {
40 defaultUseSkolemUpperBound = Boolean.parseBoolean(config.getProperty("useSkolemUpperBound"));
41 logger.info("The Skolem upper bound is enabled");
27 } 42 }
28 } catch(IOException e) { 43 } catch(IOException e) {
29 e.printStackTrace(); 44 e.printStackTrace();
30 } 45 }
46 DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND = defaultUseAlwaysSimpleUpperBound;
47 DEFAULT_USE_SKOLEM_UPPER_BOUND = defaultUseSkolemUpperBound;
31 } 48 }
32 49
33 String dataPath = null; 50 String dataPath = null;
@@ -37,7 +54,8 @@ public class PagodaProperties {
37 boolean toClassify = true; 54 boolean toClassify = true;
38 boolean toCallHermiT = true; 55 boolean toCallHermiT = true;
39 boolean shellMode = shellModeDefault; 56 boolean shellMode = shellModeDefault;
40 57 private boolean useAlwaysSimpleUpperBound = DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND;
58 private boolean useSkolemUpperBound = DEFAULT_USE_SKOLEM_UPPER_BOUND;
41 public PagodaProperties(String path) { 59 public PagodaProperties(String path) {
42 java.util.Properties m_properties = new java.util.Properties(); 60 java.util.Properties m_properties = new java.util.Properties();
43 InputStream inputStream = null; 61 InputStream inputStream = null;
@@ -63,7 +81,6 @@ public class PagodaProperties {
63 } 81 }
64 } 82 }
65 } 83 }
66
67 public PagodaProperties() { 84 public PagodaProperties() {
68 } 85 }
69 86
@@ -71,6 +88,14 @@ public class PagodaProperties {
71 return debug; 88 return debug;
72 } 89 }
73 90
91 public static boolean getDefaultUseAlwaysSimpleUpperBound() {
92 return DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND;
93 }
94
95 public static boolean getDefaultUseSkolemUpperBound() {
96 return DEFAULT_USE_SKOLEM_UPPER_BOUND;
97 }
98
74 public String getDataPath() { 99 public String getDataPath() {
75 return dataPath; 100 return dataPath;
76 } 101 }
@@ -127,4 +152,19 @@ public class PagodaProperties {
127 shellMode = flag; 152 shellMode = flag;
128 } 153 }
129 154
155 public boolean getUseAlwaysSimpleUpperBound() {
156 return useAlwaysSimpleUpperBound;
157 }
158
159 public void setUseAlwaysSimpleUpperBound(boolean flag) {
160 useAlwaysSimpleUpperBound = flag;
161 }
162
163 public boolean getUseSkolemUpperBound() {
164 return useSkolemUpperBound;
165 }
166
167 public void setUseSkolemUpperBound(boolean flag) {
168 useSkolemUpperBound = flag;
169 }
130} 170}