summaryrefslogtreecommitdiff
path: root/src/theory/uf
diff options
context:
space:
mode:
authorajreynol <andrew.j.reynolds@gmail.com>2015-09-29 15:17:03 +0200
committerajreynol <andrew.j.reynolds@gmail.com>2015-09-29 15:17:03 +0200
commit4182943e7accc8a0e05f6dfdf9db7db06e94c6cd (patch)
treed4f3bad70e464321a4e7fe977f1528f783dcd1b1 /src/theory/uf
parentef7b7bba7bc9b207d5a2198518f21b13490caa32 (diff)
Fix for fmf+incremental. Restrict cbqi to literals from ce body. Add regressions.
Diffstat (limited to 'src/theory/uf')
-rw-r--r--src/theory/uf/theory_uf.cpp3
-rw-r--r--src/theory/uf/theory_uf_strong_solver.cpp42
-rw-r--r--src/theory/uf/theory_uf_strong_solver.h6
3 files changed, 36 insertions, 15 deletions
diff --git a/src/theory/uf/theory_uf.cpp b/src/theory/uf/theory_uf.cpp
index 073399894..858761078 100644
--- a/src/theory/uf/theory_uf.cpp
+++ b/src/theory/uf/theory_uf.cpp
@@ -265,6 +265,9 @@ void TheoryUF::presolve() {
d_out->lemma(*i);
}
}
+ if( d_thss ){
+ d_thss->presolve();
+ }
Debug("uf") << "uf: end presolve()" << endl;
}
diff --git a/src/theory/uf/theory_uf_strong_solver.cpp b/src/theory/uf/theory_uf_strong_solver.cpp
index 2a33b8b36..29e726da7 100644
--- a/src/theory/uf/theory_uf_strong_solver.cpp
+++ b/src/theory/uf/theory_uf_strong_solver.cpp
@@ -706,6 +706,11 @@ void StrongSolverTheoryUF::SortModel::check( Theory::Effort level, OutputChannel
}
}
+void StrongSolverTheoryUF::SortModel::presolve() {
+ d_initialized = false;
+ d_aloc_cardinality = 0;
+}
+
void StrongSolverTheoryUF::SortModel::propagate( Theory::Effort level, OutputChannel* out ){
}
@@ -719,11 +724,14 @@ Node StrongSolverTheoryUF::SortModel::getNextDecisionRequest(){
if( d_cardinality_assertions.find( cn )==d_cardinality_assertions.end() ){
Trace("uf-ss-dec") << "UFSS : Get next decision " << d_type << " " << i << std::endl;
return cn;
+ }else{
+ Trace("uf-ss-dec-debug") << " dec : " << cn << " already asserted " << d_cardinality_assertions[cn].get() << std::endl;
}
}
}
Trace("uf-ss-dec") << "UFSS : no decisions for " << d_type << "." << std::endl;
Trace("uf-ss-dec-debug") << " aloc_cardinality = " << d_aloc_cardinality << ", cardinality = " << d_cardinality << ", hasCard = " << d_hasCard << std::endl;
+ Assert( d_hasCard );
return Node::null();
}
@@ -834,6 +842,7 @@ void StrongSolverTheoryUF::SortModel::assertCardinality( OutputChannel* out, int
if( !d_conflict ){
Trace("uf-ss-assert") << "Assert cardinality " << d_type << " " << c << " " << val << " level = ";
Trace("uf-ss-assert") << d_thss->getTheory()->d_valuation.getAssertionLevel() << std::endl;
+ Assert( c>0 );
Node cl = getCardinalityLiteral( c );
d_cardinality_assertions[ cl ] = val;
if( val ){
@@ -878,10 +887,12 @@ void StrongSolverTheoryUF::SortModel::assertCardinality( OutputChannel* out, int
if( !d_hasCard ){
bool needsCard = true;
for( std::map< int, Node >::iterator it = d_cardinality_literal.begin(); it!=d_cardinality_literal.end(); ++it ){
- if( d_cardinality_assertions.find( it->second )==d_cardinality_assertions.end() ){
- Debug("fmf-card-debug") << "..does not need allocate because of " << it->second << std::endl;
- needsCard = false;
- break;
+ if( it->first<=d_aloc_cardinality.get() ){
+ if( d_cardinality_assertions.find( it->second )==d_cardinality_assertions.end() ){
+ Debug("fmf-card-debug") << "..does not need allocate because of " << it->second << std::endl;
+ needsCard = false;
+ break;
+ }
}
}
if( needsCard ){
@@ -1702,6 +1713,14 @@ void StrongSolverTheoryUF::check( Theory::Effort level ){
}
}
+void StrongSolverTheoryUF::presolve() {
+ d_aloc_com_card.set( 0 );
+ for( std::map< TypeNode, SortModel* >::iterator it = d_rep_model.begin(); it != d_rep_model.end(); ++it ){
+ it->second->presolve();
+ it->second->initialize( d_out );
+ }
+}
+
/** propagate */
void StrongSolverTheoryUF::propagate( Theory::Effort level ){
//for( std::map< TypeNode, SortModel* >::iterator it = d_rep_model.begin(); it != d_rep_model.end(); ++it ){
@@ -1779,14 +1798,14 @@ void StrongSolverTheoryUF::preRegisterTerm( TNode n ){
}
}
-void StrongSolverTheoryUF::registerQuantifier( Node f ){
- Debug("uf-ss-register") << "Register quantifier " << f << std::endl;
+//void StrongSolverTheoryUF::registerQuantifier( Node f ){
+// Debug("uf-ss-register") << "Register quantifier " << f << std::endl;
//must ensure the quantifier does not quantify over arithmetic
//for( int i=0; i<(int)f[0].getNumChildren(); i++ ){
// TypeNode tn = f[0][i].getType();
// preRegisterType( tn, true );
//}
-}
+//}
StrongSolverTheoryUF::SortModel* StrongSolverTheoryUF::getSortModel( Node n ){
@@ -1798,15 +1817,10 @@ StrongSolverTheoryUF::SortModel* StrongSolverTheoryUF::getSortModel( Node n ){
it = d_rep_model.find( tn );
}
if( it!=d_rep_model.end() ){
- //initialize the type if necessary
- //if( d_rep_model_init.find( tn )==d_rep_model_init.end() ){
- ////initialize the model
- //it->second->initialize( d_out );
- //d_rep_model_init[tn] = true;
- //}
return it->second;
+ }else{
+ return NULL;
}
- return NULL;
}
void StrongSolverTheoryUF::notifyRestart(){
diff --git a/src/theory/uf/theory_uf_strong_solver.h b/src/theory/uf/theory_uf_strong_solver.h
index 3619a8ba7..3e612ff1f 100644
--- a/src/theory/uf/theory_uf_strong_solver.h
+++ b/src/theory/uf/theory_uf_strong_solver.h
@@ -268,6 +268,8 @@ public:
bool areDisequal( Node a, Node b );
/** check */
void check( Theory::Effort level, OutputChannel* out );
+ /** presolve */
+ void presolve();
/** propagate */
void propagate( Theory::Effort level, OutputChannel* out );
/** get next decision request */
@@ -365,6 +367,8 @@ public:
public:
/** check */
void check( Theory::Effort level );
+ /** presolve */
+ void presolve();
/** propagate */
void propagate( Theory::Effort level );
/** get next decision request */
@@ -372,7 +376,7 @@ public:
/** preregister a term */
void preRegisterTerm( TNode n );
/** preregister a quantifier */
- void registerQuantifier( Node f );
+ //void registerQuantifier( Node f );
/** notify restart */
void notifyRestart();
public:
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback