PropResult HyperEngine::prop_tri_clause_with_acestor_info( watch_subarray_const::const_iterator i , const Lit lit1 , PropBy& confl ) { const Lit lit2 = i->lit2(); lbool val2 = value(lit2); //literal is already satisfied, nothing to do if (val2 == l_True) return PROP_NOTHING; const Lit lit3 = i->lit3(); lbool val3 = value(lit3); //literal is already satisfied, nothing to do if (val3 == l_True) return PROP_NOTHING; if (val2 == l_False && val3 == l_False) { return handle_prop_tri_fail(i, lit1, confl); } if (val2 == l_Undef && val3 == l_False) { return propTriHelperComplex(lit2, ~lit1, lit3, i->red()); } if (val3 == l_Undef && val2 == l_False) { return propTriHelperComplex(lit3, ~lit1, lit2, i->red()); } return PROP_NOTHING; }
inline bool PropEngine::propTriClauseAnyOrder( watch_subarray_const::const_iterator i , const Lit lit1 , PropBy& confl ) { const Lit lit2 = i->lit2(); lbool val2 = value(lit2); //literal is already satisfied, nothing to do if (val2 == l_True) return true; const Lit lit3 = i->lit3(); lbool val3 = value(lit3); //literal is already satisfied, nothing to do if (val3 == l_True) return true; if (val2 == l_False && val3 == l_False) { #ifdef VERBOSE_DEBUG_FULLPROP cout << "Conflict from " << lit1 << " , " << i->lit2() << " , " << i->lit3() << endl; #endif //VERBOSE_DEBUG_FULLPROP confl = PropBy(~lit1, i->lit3(), i->red()); //Update stats if (i->red()) lastConflictCausedBy = ConflCausedBy::trired; else lastConflictCausedBy = ConflCausedBy::triirred; failBinLit = i->lit2(); qhead = trail.size(); return false; } if (val2 == l_Undef && val3 == l_False) { propTriHelperAnyOrder<update_bogoprops>( lit1 , lit2 , lit3 , i->red() ); return true; } if (val3 == l_Undef && val2 == l_False) { propTriHelperAnyOrder<update_bogoprops>( lit1 , lit3 , lit2 , i->red() ); return true; } return true; }
inline bool PropEngine::propBinaryClause( watch_subarray_const::const_iterator i , const Lit p , PropBy& confl ) { const lbool val = value(i->lit2()); if (val == l_Undef) { #ifdef STATS_NEEDED if (i->red()) propStats.propsBinRed++; else propStats.propsBinIrred++; #endif enqueue<update_bogoprops>(i->lit2(), PropBy(~p, i->red())); } else if (val == l_False) { //Update stats if (i->red()) lastConflictCausedBy = ConflCausedBy::binred; else lastConflictCausedBy = ConflCausedBy::binirred; confl = PropBy(~p, i->red()); failBinLit = i->lit2(); qhead = trail.size(); return false; } return true; }
PropResult PropEngine::handle_prop_tri_fail( watch_subarray_const::const_iterator i , Lit lit1 , PropBy& confl ) { #ifdef VERBOSE_DEBUG_FULLPROP cout << "Conflict from " << lit1 << " , " << i->lit2() << " , " << i->lit3() << endl; #endif //VERBOSE_DEBUG_FULLPROP confl = PropBy(~lit1, i->lit3(), i->red()); //Update stats if (i->red()) lastConflictCausedBy = ConflCausedBy::trired; else lastConflictCausedBy = ConflCausedBy::triirred; failBinLit = i->lit2(); qhead = trail.size(); return PROP_FAIL; }