summaryrefslogtreecommitdiff
path: root/src/theory
diff options
context:
space:
mode:
authorTim King <taking@cs.nyu.edu>2011-03-03 18:00:35 +0000
committerTim King <taking@cs.nyu.edu>2011-03-03 18:00:35 +0000
commit43bf1fc1ba1770715fbe9fa15fa0be2cf6fb164a (patch)
tree83ba0646f082451e93ffb848d7c4976a6a72b0cf /src/theory
parent41aba7156ae5954db53daf69cca2816a2c4d774d (diff)
- Creates a queue for lemmas discovered during the simplex procedure. Lemmas are sent to the sat solver during theory propagation. The lemmas currently come from additional conflicts that are discovered by findConflictOnTheQueue(...).
Diffstat (limited to 'src/theory')
-rw-r--r--src/theory/arith/arith_utilities.h12
-rw-r--r--src/theory/arith/simplex.cpp17
-rw-r--r--src/theory/arith/simplex.h40
-rw-r--r--src/theory/arith/theory_arith.cpp7
4 files changed, 67 insertions, 9 deletions
diff --git a/src/theory/arith/arith_utilities.h b/src/theory/arith/arith_utilities.h
index 2053379d9..59b4e9bef 100644
--- a/src/theory/arith/arith_utilities.h
+++ b/src/theory/arith/arith_utilities.h
@@ -224,6 +224,18 @@ struct RightHandRationalLT
}
};
+inline Node negateConjunctionAsClause(TNode conjunction){
+ Assert(conjunction.getKind() == kind::AND);
+ NodeBuilder<> orBuilder(kind::OR);
+
+ for(TNode::iterator i = conjunction.begin(), end=conjunction.end(); i != end; ++i){
+ TNode child = *i;
+ Node negatedChild = NodeBuilder<1>(kind::NOT)<<(child);
+ orBuilder << negatedChild;
+ }
+ return orBuilder;
+}
+
}; /* namesapce arith */
}; /* namespace theory */
}; /* namespace CVC4 */
diff --git a/src/theory/arith/simplex.cpp b/src/theory/arith/simplex.cpp
index 0809e0788..68ab429ca 100644
--- a/src/theory/arith/simplex.cpp
+++ b/src/theory/arith/simplex.cpp
@@ -22,6 +22,7 @@ SimplexDecisionProcedure::Statistics::Statistics():
d_successAfterDiffSearch("theory::arith::successAfterDiffSearch",0),
d_attemptDuringVarOrderSearch("theory::arith::attemptDuringVarOrderSearch",0),
d_successDuringVarOrderSearch("theory::arith::successDuringVarOrderSearch",0),
+ d_delayedConflicts("theory::arith::delayedConflicts",0),
d_pivotTime("theory::arith::pivotTime"),
d_avgNumRowsNotContainingOnUpdate("theory::arith::avgNumRowsNotContainingOnUpdate"),
d_avgNumRowsNotContainingOnPivot("theory::arith::avgNumRowsNotContainingOnPivot")
@@ -41,6 +42,8 @@ SimplexDecisionProcedure::Statistics::Statistics():
StatisticsRegistry::registerStat(&d_attemptDuringVarOrderSearch);
StatisticsRegistry::registerStat(&d_successDuringVarOrderSearch);
+ StatisticsRegistry::registerStat(&d_delayedConflicts);
+
StatisticsRegistry::registerStat(&d_pivotTime);
StatisticsRegistry::registerStat(&d_avgNumRowsNotContainingOnUpdate);
@@ -63,6 +66,7 @@ SimplexDecisionProcedure::Statistics::~Statistics(){
StatisticsRegistry::unregisterStat(&d_attemptDuringVarOrderSearch);
StatisticsRegistry::unregisterStat(&d_successDuringVarOrderSearch);
+ StatisticsRegistry::unregisterStat(&d_delayedConflicts);
StatisticsRegistry::unregisterStat(&d_pivotTime);
StatisticsRegistry::unregisterStat(&d_avgNumRowsNotContainingOnUpdate);
@@ -401,7 +405,7 @@ Node SimplexDecisionProcedure::findConflictOnTheQueue(SearchPeriod type) {
case DuringVarOrderSearch: ++(d_statistics.d_attemptDuringVarOrderSearch); break;
}
- Node bestConflict = Node::null();
+ Node firstConflict = Node::null();
ArithPriorityQueue::const_iterator i = d_queue.begin();
ArithPriorityQueue::const_iterator end = d_queue.end();
for(; i != end; ++i){
@@ -410,19 +414,22 @@ Node SimplexDecisionProcedure::findConflictOnTheQueue(SearchPeriod type) {
if(d_tableau.isBasic(x_i)){
Node possibleConflict = checkBasicForConflict(x_i);
if(!possibleConflict.isNull()){
-
- bestConflict = betterConflict(bestConflict, possibleConflict);
+ if(firstConflict.isNull()){
+ firstConflict = possibleConflict;
+ }else{
+ delayConflictAsLemma(possibleConflict);
+ }
}
}
}
- if(!bestConflict.isNull()){
+ if(!firstConflict.isNull()){
switch(type){
case BeforeDiffSearch: ++(d_statistics.d_successBeforeDiffSearch); break;
case AfterDiffSearch: ++(d_statistics.d_successAfterDiffSearch); break;
case DuringVarOrderSearch: ++(d_statistics.d_successDuringVarOrderSearch); break;
}
}
- return bestConflict;
+ return firstConflict;
}
Node SimplexDecisionProcedure::updateInconsistentVars(){
diff --git a/src/theory/arith/simplex.h b/src/theory/arith/simplex.h
index a32a188b4..b847259a0 100644
--- a/src/theory/arith/simplex.h
+++ b/src/theory/arith/simplex.h
@@ -16,7 +16,7 @@
#include "util/stats.h"
-#include <queue>
+#include <vector>
namespace CVC4 {
namespace theory {
@@ -42,6 +42,9 @@ private:
ArithVar d_numVariables;
+ std::vector<Node> d_delayedLemmas;
+ uint32_t d_delayedLemmasPos;
+
public:
SimplexDecisionProcedure(const ArithConstants& constants,
ArithPartialModel& pm,
@@ -52,10 +55,13 @@ public:
d_out(out),
d_tableau(tableau),
d_queue(pm, tableau),
- d_numVariables(0)
+ d_numVariables(0),
+ d_delayedLemmas(),
+ d_delayedLemmasPos(0)
{}
- void increaseMax() {d_numVariables++;}
+
+public:
/**
* Assert*(n, orig) takes an bound n that is implied by orig.
@@ -183,7 +189,33 @@ public:
*/
DeltaRational computeRowValue(ArithVar x, bool useSafe);
+
+ void increaseMax() {d_numVariables++;}
+
+ /** Returns true if the simplex procedure has more delayed lemmas in its queue.*/
+ bool hasMoreLemmas() const {
+ return d_delayedLemmasPos < d_delayedLemmas.size();
+ }
+ /** Returns the next delayed lemmas on the queue.*/
+ Node popLemma(){
+ Assert(hasMoreLemmas());
+ Node lemma = d_delayedLemmas[d_delayedLemmasPos];
+ ++d_delayedLemmasPos;
+ return lemma;
+ }
+
private:
+ /** Adds a lemma to the queue. */
+ void pushLemma(Node lemma){
+ d_delayedLemmas.push_back(lemma);
+ ++(d_statistics.d_delayedConflicts);
+ }
+
+ /** Adds a conflict as a lemma to the queue. */
+ void delayConflictAsLemma(Node conflict){
+ Node negatedConflict = negateConjunctionAsClause(conflict);
+ pushLemma(negatedConflict);
+ }
/**
* Checks a basic variable, b, to see if it is in conflict.
@@ -206,6 +238,8 @@ private:
IntStat d_attemptAfterDiffSearch, d_successAfterDiffSearch;
IntStat d_attemptDuringVarOrderSearch, d_successDuringVarOrderSearch;
+ IntStat d_delayedConflicts;
+
TimerStat d_pivotTime;
AverageStat d_avgNumRowsNotContainingOnUpdate;
diff --git a/src/theory/arith/theory_arith.cpp b/src/theory/arith/theory_arith.cpp
index 3899e5e80..60eed27d1 100644
--- a/src/theory/arith/theory_arith.cpp
+++ b/src/theory/arith/theory_arith.cpp
@@ -556,7 +556,12 @@ void TheoryArith::explain(TNode n) {
}
void TheoryArith::propagate(Effort e) {
-
+ if(quickCheckOrMore(e)){
+ while(d_simplex.hasMoreLemmas()){
+ Node lemma = d_simplex.popLemma();
+ d_out->lemma(lemma);
+ }
+ }
// if(quickCheckOrMore(e)){
// std::vector<Node> implied = d_propagator.getImpliedLiterals();
// for(std::vector<Node>::iterator i = implied.begin();
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback