summaryrefslogtreecommitdiff
path: root/src/theory/uf
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2018-03-23 14:13:38 -0500
committerGitHub <noreply@github.com>2018-03-23 14:13:38 -0500
commitf3d010e07f30dd658d4532a43b3813654376162d (patch)
tree1080a71e07f906f6af5b5144c0a83207c40c1b2a /src/theory/uf
parent4f506ac50e43a71a92094a478deeaa2c2cd1df4a (diff)
Remove unused code (#1700)
Diffstat (limited to 'src/theory/uf')
-rw-r--r--src/theory/uf/theory_uf_strong_solver.cpp257
-rw-r--r--src/theory/uf/theory_uf_strong_solver.h35
2 files changed, 14 insertions, 278 deletions
diff --git a/src/theory/uf/theory_uf_strong_solver.cpp b/src/theory/uf/theory_uf_strong_solver.cpp
index eb9e5e987..b32a50eb4 100644
--- a/src/theory/uf/theory_uf_strong_solver.cpp
+++ b/src/theory/uf/theory_uf_strong_solver.cpp
@@ -144,10 +144,6 @@ void Region::setEqual( Node a, Node b ){
if( !isDisequal( a, n, t ) ){
setDisequal( a, n, t, true );
nr->setDisequal( n, a, t, true );
- //notify the disequality propagator
- if( options::ufssDiseqPropagation() ){
- d_cf->d_thss->getDisequalityPropagator()->assertDisequal(a, n, Node::null());
- }
if( options::ufssSymBreak() ){
d_cf->d_thss->getSymmetryBreaker()->assertDisequal( a, n );
}
@@ -614,10 +610,6 @@ void SortModel::merge( Node a, Node b ){
d_reps = d_reps - 1;
if( !d_conflict ){
- if( options::ufssDiseqPropagation() ){
- //notify the disequality propagator
- d_thss->getDisequalityPropagator()->merge(a, b);
- }
if( options::ufssSymBreak() ){
d_thss->getSymmetryBreaker()->merge(a, b);
}
@@ -669,10 +661,6 @@ void SortModel::assertDisequal( Node a, Node b, Node reason ){
}
if( !d_conflict ){
- if( options::ufssDiseqPropagation() ){
- //notify the disequality propagator
- d_thss->getDisequalityPropagator()->assertDisequal(a, b, Node::null());
- }
if( options::ufssSymBreak() ){
d_thss->getSymmetryBreaker()->assertDisequal(a, b);
}
@@ -1284,144 +1272,21 @@ void SortModel::addCliqueLemma( std::vector< Node >& clique, OutputChannel* out
clique_vec.insert( clique_vec.begin(), clique.begin(), clique.end() );
addClique( d_cardinality, clique_vec );
}
- if( options::ufssSimpleCliques() && !options::ufssExplainedCliques() ){
- //add as lemma
- std::vector< Node > eqs;
- for( int i=0; i<(int)clique.size(); i++ ){
- for( int j=0; j<i; j++ ){
- Node r1 = d_thss->getTheory()->d_equalityEngine.getRepresentative(clique[i]);
- Node r2 = d_thss->getTheory()->d_equalityEngine.getRepresentative(clique[j]);
- eqs.push_back( clique[i].eqNode( clique[j] ) );
- }
- }
- eqs.push_back( d_cardinality_literal[ d_cardinality ].notNode() );
- Node lem = NodeManager::currentNM()->mkNode( OR, eqs );
- if( doSendLemma( lem ) ){
- Trace("uf-ss-lemma") << "*** Add clique lemma " << lem << std::endl;
- ++( d_thss->d_statistics.d_clique_lemmas );
- }
- }else{
- //found a clique
- Debug("uf-ss-cliques") << "Found a clique (cardinality=" << d_cardinality << ") :" << std::endl;
- Debug("uf-ss-cliques") << " ";
- for( int i=0; i<(int)clique.size(); i++ ){
- Debug("uf-ss-cliques") << clique[i] << " ";
- }
- Debug("uf-ss-cliques") << std::endl;
- Debug("uf-ss-cliques") << "Finding clique disequalities..." << std::endl;
-
- //we will scan through each of the disequaltities
- bool isSatConflict = true;
- std::vector< Node > conflict;
- //collect disequalities, and nodes that must be equal within representatives
- std::map< Node, std::map< Node, bool > > explained;
- std::map< Node, std::map< Node, bool > > nodesWithinRep;
- //map from the reprorted clique members to those reported in the lemma
- std::map< Node, Node > cliqueRepMap;
- for( int i=0; i<(int)d_disequalities_index; i++ ){
- //if both sides of disequality exist in clique
- Node r1 = d_thss->getTheory()->d_equalityEngine.getRepresentative( d_disequalities[i][0][0] );
- Node r2 = d_thss->getTheory()->d_equalityEngine.getRepresentative( d_disequalities[i][0][1] );
- if( r1!=r2 && ( explained.find( r1 )==explained.end() || explained[r1].find( r2 )==explained[r1].end() ) &&
- std::find( clique.begin(), clique.end(), r1 )!=clique.end() &&
- std::find( clique.begin(), clique.end(), r2 )!=clique.end() ){
- explained[r1][r2] = true;
- explained[r2][r1] = true;
- if( options::ufssExplainedCliques() ){
- conflict.push_back( d_disequalities[i] );
- Debug("uf-ss-cliques") << " -> disequality : " << d_disequalities[i] << std::endl;
- nodesWithinRep[r1][ d_disequalities[i][0][0] ] = true;
- nodesWithinRep[r2][ d_disequalities[i][0][1] ] = true;
- }else{
- //get the terms we report in the lemma
- Node ru1 = r1;
- if( cliqueRepMap.find( r1 )==cliqueRepMap.end() ){
- ru1 = d_disequalities[i][0][0];
- cliqueRepMap[r1] = ru1;
- }else{
- ru1 = cliqueRepMap[r1];
- }
- Node ru2 = r2;
- if( cliqueRepMap.find( r2 )==cliqueRepMap.end() ){
- ru2 = d_disequalities[i][0][1];
- cliqueRepMap[r2] = ru2;
- }else{
- ru2 = cliqueRepMap[r2];
- }
- if( ru1!=d_disequalities[i][0][0] || ru2!=d_disequalities[i][0][1] ){
- //disequalities have endpoints that are not connected within an equivalence class
- // we will be producing a lemma, introducing a new literal ru1 != ru2
- conflict.push_back( ru1.eqNode( ru2 ).notNode() );
- isSatConflict = false;
- }else{
- conflict.push_back( d_disequalities[i] );
- }
- }
- if( conflict.size()==(clique.size()*( clique.size()-1 )/2) ){
- break;
- }
- }
+ // add as lemma
+ std::vector<Node> eqs;
+ for (unsigned i = 0, size = clique.size(); i < size; i++)
+ {
+ for (unsigned j = 0; j < i; j++)
+ {
+ eqs.push_back(clique[i].eqNode(clique[j]));
}
- if( options::ufssExplainedCliques() ){
- //Debug("uf-ss-cliques") << conflict.size() << " " << clique.size() << std::endl;
- Assert( (int)conflict.size()==((int)clique.size()*( (int)clique.size()-1 )/2) );
- //Assert( (int)conflict.size()==(int)clique.size()*( (int)clique.size()-1 )/2 );
- Debug("uf-ss-cliques") << "Finding clique equalities internal to eq classes..." << std::endl;
- //now, we must explain equalities within each equivalence class
- for( std::map< Node, std::map< Node, bool > >::iterator it = nodesWithinRep.begin(); it != nodesWithinRep.end(); ++it ){
- if( it->second.size()>1 ){
- Node prev;
- //add explanation of t1 = t2 = ... = tn
- Debug("uf-ss-cliques") << "Explain ";
- for( std::map< Node, bool >::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2 ){
- if( prev!=Node::null() ){
- Debug("uf-ss-cliques") << " = ";
- //explain it2->first and prev
- std::vector< TNode > expl;
- d_thss->getTheory()->d_equalityEngine.explainEquality( it2->first, prev, true, expl );
- for( int i=0; i<(int)expl.size(); i++ ){
- if( std::find( conflict.begin(), conflict.end(), expl[i] )==conflict.end() ){
- conflict.push_back( expl[i] );
- }
- }
- }
- prev = it2->first;
- Debug("uf-ss-cliques") << prev;
- }
- Debug("uf-ss-cliques") << std::endl;
- }
- }
- Debug("uf-ss-cliques") << "Explanation of clique (size=" << conflict.size() << ") = " << std::endl;
- for( int i=0; i<(int)conflict.size(); i++ ){
- Debug("uf-ss-cliques") << conflict[i] << " ";
- }
- Debug("uf-ss-cliques") << std::endl;
- }
- //now, make the conflict
- if( isSatConflict ){
- conflict.push_back( d_cardinality_literal[ d_cardinality ] );
- Node conflictNode = NodeManager::currentNM()->mkNode( AND, conflict );
- Trace("uf-ss-lemma") << "*** Add clique conflict " << conflictNode << std::endl;
- //Notice() << "*** Add clique conflict " << conflictNode << std::endl;
- out->conflict( conflictNode );
- d_conflict = true;
- ++( d_thss->d_statistics.d_clique_conflicts );
- }else{
- Node conflictNode = conflict.size()==1 ? conflict[0] : NodeManager::currentNM()->mkNode( AND, conflict );
- //add cardinality constraint
- Node cardNode = d_cardinality_literal[ d_cardinality ];
- //bool value;
- //bool hasValue = d_th->getValuation().hasSatValue( cardNode, value );
- //Assert( hasValue );
- //Assert( value );
- conflictNode = NodeManager::currentNM()->mkNode( IMPLIES, conflictNode, cardNode.notNode() );
- if( doSendLemma( conflictNode ) ){
- Trace("uf-ss-lemma") << "*** Add clique lemma " << conflictNode << std::endl;
- ++( d_thss->d_statistics.d_clique_lemmas );
- }
- }
-
- //DO_THIS: ensure that the same clique is not reported??? Check standard effort after assertDisequal can produce same clique.
+ }
+ eqs.push_back(d_cardinality_literal[d_cardinality].notNode());
+ Node lem = NodeManager::currentNM()->mkNode(OR, eqs);
+ if (doSendLemma(lem))
+ {
+ Trace("uf-ss-lemma") << "*** Add clique lemma " << lem << std::endl;
+ ++(d_thss->d_statistics.d_clique_lemmas);
}
}
@@ -1653,11 +1518,7 @@ StrongSolverTheoryUF::StrongSolverTheoryUF(context::Context* c,
d_card_assertions_eqv_lemma(u),
d_min_pos_tn_master_card(c, -1),
d_rel_eqc(c),
- d_deq_prop(NULL),
d_sym_break(NULL) {
- if (options::ufssDiseqPropagation()) {
- d_deq_prop = new DisequalityPropagator(th->getQuantifiersEngine(), this);
- }
if (options::ufssSymBreak()) {
d_sym_break = new SubsortSymmetryBreaker(th->getQuantifiersEngine(), c);
}
@@ -1671,9 +1532,6 @@ StrongSolverTheoryUF::~StrongSolverTheoryUF() {
if (d_sym_break) {
delete d_sym_break;
}
- if (d_deq_prop) {
- delete d_deq_prop;
- }
}
SortInference* StrongSolverTheoryUF::getSortInference() {
@@ -1758,10 +1616,6 @@ void StrongSolverTheoryUF::merge( Node a, Node b ){
c->merge( a, b );
Trace("uf-ss-solver") << "StrongSolverTheoryUF: Done Merge." << std::endl;
#endif
- }else{
- if( options::ufssDiseqPropagation() ){
- d_deq_prop->merge(a, b);
- }
}
}
@@ -1778,10 +1632,6 @@ void StrongSolverTheoryUF::assertDisequal( Node a, Node b, Node reason ){
//Assert( d_th->d_equalityEngine.getRepresentative( b )==b );
c->assertDisequal( a, b, reason );
Trace("uf-ss-solver") << "StrongSolverTheoryUF: Done Assert disequal." << std::endl;
- }else{
- if( options::ufssDiseqPropagation() ){
- d_deq_prop->assertDisequal(a, b, reason);
- }
}
}
@@ -1894,12 +1744,6 @@ void StrongSolverTheoryUF::assertNode( Node n, bool isDecision ){
}
}
}
- if( lit.getKind()!=EQUAL ){
- //it is a predicate
- if( options::ufssDiseqPropagation() ){
- d_deq_prop->assertPredicate(lit, polarity);
- }
- }
}
}else{
if( lit.getKind()==CARDINALITY_CONSTRAINT || lit.getKind()==COMBINED_CARDINALITY_CONSTRAINT ){
@@ -2303,79 +2147,6 @@ StrongSolverTheoryUF::Statistics::~Statistics(){
smtStatisticsRegistry()->unregisterStat(&d_max_model_size);
}
-
-DisequalityPropagator::DisequalityPropagator(QuantifiersEngine* qe,
- StrongSolverTheoryUF* ufss)
- : d_qe(qe), d_ufss(ufss)
-{
- d_true = NodeManager::currentNM()->mkConst( true );
- d_false = NodeManager::currentNM()->mkConst( false );
-}
-
-void DisequalityPropagator::checkEquivalenceClass( Node t, Node eqc ) {
- if( t.getKind()==APPLY_UF ){
- Node op = t.getOperator();
- eqc = d_ufss->getTheory()->getEqualityEngine()->getRepresentative( eqc );
- eq::EqClassIterator eqc_i(eqc, d_ufss->getTheory()->getEqualityEngine());
- while( !eqc_i.isFinished() ){
- Node s = *eqc_i;
- if( s.getKind()==APPLY_UF && s.getOperator()==op ){
- int unkIndex = -1;
- for( size_t i=0; i<t.getNumChildren(); i++ ){
- //should consult strong solver since it knows more disequalities
- if( d_ufss->areDisequal( t[i], s[i] ) ){
- //if( d_qe->getEqualityQuery()->areDisequal( t[i], s[i] ) ){
- unkIndex = -1;
- break;
- }else if( !d_qe->getEqualityQuery()->areEqual( t[i], s[i] ) ){
- if( unkIndex==-1 ){
- unkIndex = i;
- }else{
- unkIndex = -1;
- break;
- }
- }
- }
- if( unkIndex!=-1 ){
- Trace("deq-prop") << "propagate disequality " << t[unkIndex] << " " << s[unkIndex] << std::endl;
- d_ufss->assertDisequal(t[unkIndex], s[unkIndex], Node::null());
- ++( d_statistics.d_propagations );
- if( d_ufss->isConflict() ){
- return;
- }
- }
- }
- ++eqc_i;
- }
- }
-}
-
-/** merge */
-void DisequalityPropagator::merge( Node a, Node b ){
-
-}
-
-/** assert terms are disequal */
-void DisequalityPropagator::assertDisequal( Node a, Node b, Node reason ){
- Trace("deq-prop") << "Notify disequal : " << a << " " << b << std::endl;
-}
-
-
-void DisequalityPropagator::assertPredicate( Node p, bool polarity ) {
- Trace("deq-prop") << "Assert predicate : " << p << " " << polarity << std::endl;
- checkEquivalenceClass( p, polarity ? d_false : d_true );
-}
-
-DisequalityPropagator::Statistics::Statistics():
- d_propagations("StrongSolverTheoryUF::Disequality_Propagations", 0)
-{
- smtStatisticsRegistry()->registerStat(& d_propagations);
-}
-
-DisequalityPropagator::Statistics::~Statistics(){
- smtStatisticsRegistry()->unregisterStat(& d_propagations);
-}
-
}/* CVC4::theory namespace::uf */
}/* CVC4::theory namespace */
}/* CVC4 namespace */
diff --git a/src/theory/uf/theory_uf_strong_solver.h b/src/theory/uf/theory_uf_strong_solver.h
index 0166bd947..f634a493c 100644
--- a/src/theory/uf/theory_uf_strong_solver.h
+++ b/src/theory/uf/theory_uf_strong_solver.h
@@ -29,7 +29,6 @@ namespace theory {
class SubsortSymmetryBreaker;
namespace uf {
class TheoryUF;
-class DisequalityPropagator;
} /* namespace CVC4::theory::uf */
} /* namespace CVC4::theory */
} /* namespace CVC4 */
@@ -371,8 +370,6 @@ public:
~StrongSolverTheoryUF();
/** get theory */
TheoryUF* getTheory() { return d_th; }
- /** disequality propagator */
- DisequalityPropagator* getDisequalityPropagator() { return d_deq_prop; }
/** symmetry breaker */
SubsortSymmetryBreaker* getSymmetryBreaker() { return d_sym_break; }
/** get sort inference module */
@@ -471,42 +468,10 @@ public:
context::CDO<int> d_min_pos_tn_master_card;
/** relevant eqc */
NodeBoolMap d_rel_eqc;
- /** disequality propagator */
- DisequalityPropagator* d_deq_prop;
/** symmetry breaking techniques */
SubsortSymmetryBreaker* d_sym_break;
}; /* class StrongSolverTheoryUF */
-class DisequalityPropagator {
-public:
- DisequalityPropagator(QuantifiersEngine* qe, StrongSolverTheoryUF* ufss);
- /** merge */
- void merge( Node a, Node b );
- /** assert terms are disequal */
- void assertDisequal( Node a, Node b, Node reason );
- /** assert predicate */
- void assertPredicate( Node p, bool polarity );
-
- class Statistics {
- public:
- IntStat d_propagations;
- Statistics();
- ~Statistics();
- };
- /** statistics class */
- Statistics d_statistics;
-
-private:
- /** quantifiers engine */
- QuantifiersEngine* d_qe;
- /** strong solver */
- StrongSolverTheoryUF* d_ufss;
- /** true,false */
- Node d_true;
- Node d_false;
- /** check term t against equivalence class that t is disequal from */
- void checkEquivalenceClass( Node t, Node eqc );
-}; /* class DisequalityPropagator */
}/* CVC4::theory namespace::uf */
}/* CVC4::theory namespace */
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback