diff options
author | ajreynol <andrew.j.reynolds@gmail.com> | 2015-05-29 11:47:28 +0200 |
---|---|---|
committer | ajreynol <andrew.j.reynolds@gmail.com> | 2015-05-29 22:02:28 +0200 |
commit | 7f85896a9f1c9d3c8f65c53c16fea2156bc4dfab (patch) | |
tree | 7c320149a84197f26cc78b4ba8fe0919230de55a /src/theory/quantifiers/ce_guided_instantiation.cpp | |
parent | 331f8cccb1f5fc8806774652deb71f23c7572772 (diff) |
Do not enforce dt fairness when single invocation sygus.
Diffstat (limited to 'src/theory/quantifiers/ce_guided_instantiation.cpp')
-rw-r--r-- | src/theory/quantifiers/ce_guided_instantiation.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/theory/quantifiers/ce_guided_instantiation.cpp b/src/theory/quantifiers/ce_guided_instantiation.cpp index 5e6bcf0b4..aaab8f3f9 100644 --- a/src/theory/quantifiers/ce_guided_instantiation.cpp +++ b/src/theory/quantifiers/ce_guided_instantiation.cpp @@ -112,7 +112,7 @@ Node CegConjecture::getLiteral( QuantifiersEngine * qe, int i ) { qe->getOutputChannel().lemma( lem ); qe->getOutputChannel().requirePhase( lit, true ); - if( options::ceGuidedInstFair()==CEGQI_FAIR_DT_HEIGHT_PRED ){ + if( getCegqiFairMode()==CEGQI_FAIR_DT_HEIGHT_PRED ){ //implies height bounds on each candidate variable std::vector< Node > lem_c; for( unsigned j=0; j<d_candidates.size(); j++ ){ @@ -129,6 +129,14 @@ Node CegConjecture::getLiteral( QuantifiersEngine * qe, int i ) { } } +CegqiFairMode CegConjecture::getCegqiFairMode() { + return isSingleInvocation() ? CEGQI_FAIR_NONE : options::ceGuidedInstFair(); +} + +bool CegConjecture::isSingleInvocation() { + return d_ceg_si->isSingleInvocation(); +} + CegInstantiation::CegInstantiation( QuantifiersEngine * qe, context::Context* c ) : QuantifiersModule( qe ){ d_conj = new CegConjecture( qe->getSatContext() ); d_last_inst_si = false; @@ -139,7 +147,7 @@ bool CegInstantiation::needsCheck( Theory::Effort e ) { } unsigned CegInstantiation::needsModel( Theory::Effort e ) { - return QuantifiersEngine::QEFFORT_MODEL; + return QuantifiersEngine::QEFFORT_MODEL; } void CegInstantiation::check( Theory::Effort e, unsigned quant_e ) { @@ -161,21 +169,21 @@ void CegInstantiation::registerQuantifier( Node q ) { d_conj->assign( d_quantEngine, q ); //fairness - if( options::ceGuidedInstFair()!=CEGQI_FAIR_NONE ){ + if( d_conj->getCegqiFairMode()!=CEGQI_FAIR_NONE ){ std::vector< Node > mc; for( unsigned j=0; j<d_conj->d_candidates.size(); j++ ){ TypeNode tn = d_conj->d_candidates[j].getType(); - if( options::ceGuidedInstFair()==CEGQI_FAIR_DT_SIZE ){ + if( d_conj->getCegqiFairMode()==CEGQI_FAIR_DT_SIZE ){ if( tn.isDatatype() ){ mc.push_back( NodeManager::currentNM()->mkNode( DT_SIZE, d_conj->d_candidates[j] ) ); } - }else if( options::ceGuidedInstFair()==CEGQI_FAIR_UF_DT_SIZE ){ + }else if( d_conj->getCegqiFairMode()==CEGQI_FAIR_UF_DT_SIZE ){ registerMeasuredType( tn ); std::map< TypeNode, Node >::iterator it = d_uf_measure.find( tn ); if( it!=d_uf_measure.end() ){ mc.push_back( NodeManager::currentNM()->mkNode( APPLY_UF, it->second, d_conj->d_candidates[j] ) ); } - }else if( options::ceGuidedInstFair()==CEGQI_FAIR_DT_HEIGHT_PRED ){ + }else if( d_conj->getCegqiFairMode()==CEGQI_FAIR_DT_HEIGHT_PRED ){ //measure term is a fresh constant mc.push_back( NodeManager::currentNM()->mkSkolem( "K", NodeManager::currentNM()->integerType() ) ); } @@ -208,15 +216,15 @@ Node CegInstantiation::getNextDecisionRequest() { d_conj->initializeGuard( d_quantEngine ); bool value; if( !d_quantEngine->getValuation().hasSatValue( d_conj->d_guard, value ) ) { - if( d_conj->d_guard_split.isNull() ){ - Node lem = NodeManager::currentNM()->mkNode( OR, d_conj->d_guard.negate(), d_conj->d_guard ); - d_quantEngine->getOutputChannel().lemma( lem ); - } + //if( d_conj->d_guard_split.isNull() ){ + // Node lem = NodeManager::currentNM()->mkNode( OR, d_conj->d_guard.negate(), d_conj->d_guard ); + // d_quantEngine->getOutputChannel().lemma( lem ); + //} Trace("cegqi-debug") << "CEGQI : Decide next on : " << d_conj->d_guard << "..." << std::endl; return d_conj->d_guard; } //enforce fairness - if( d_conj->isAssigned() && options::ceGuidedInstFair()!=CEGQI_FAIR_NONE ){ + if( d_conj->isAssigned() && d_conj->getCegqiFairMode()!=CEGQI_FAIR_NONE ){ Node lit = d_conj->getLiteral( d_quantEngine, d_conj->d_curr_lit.get() ); if( d_quantEngine->getValuation().hasSatValue( lit, value ) ) { if( !value ){ @@ -242,7 +250,7 @@ void CegInstantiation::checkCegConjecture( CegConjecture * conj ) { Trace("cegqi-engine-debug") << conj->d_candidates[i] << " "; } Trace("cegqi-engine-debug") << std::endl; - if( options::ceGuidedInstFair()!=CEGQI_FAIR_NONE ){ + if( conj->getCegqiFairMode()!=CEGQI_FAIR_NONE ){ Trace("cegqi-engine") << " * Current term size : " << conj->d_curr_lit.get() << std::endl; } @@ -266,7 +274,7 @@ void CegInstantiation::checkCegConjecture( CegConjecture * conj ) { std::vector< Node > model_values; if( getModelValues( conj, conj->d_candidates, model_values ) ){ //check if we must apply fairness lemmas - if( options::ceGuidedInstFair()==CEGQI_FAIR_UF_DT_SIZE ){ + if( conj->getCegqiFairMode()==CEGQI_FAIR_UF_DT_SIZE ){ std::vector< Node > lems; for( unsigned j=0; j<conj->d_candidates.size(); j++ ){ getMeasureLemmas( conj->d_candidates[j], model_values[j], lems ); |