3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-02 01:13:18 +00:00

update parameters

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-09-03 17:22:48 -07:00
parent c8730daea7
commit 9ad17296c2
5 changed files with 38 additions and 14 deletions

View file

@ -1341,7 +1341,7 @@ namespace sat {
if (!create_asserting_lemma()) { if (!create_asserting_lemma()) {
goto bail_out; goto bail_out;
} }
active2card(); active2lemma();
DEBUG_CODE(VERIFY(validate_conflict(m_lemma, m_A));); DEBUG_CODE(VERIFY(validate_conflict(m_lemma, m_A)););
@ -1654,19 +1654,16 @@ namespace sat {
while (m_num_marks > 0 && !m_overflow); while (m_num_marks > 0 && !m_overflow);
TRACE("ba", active2pb(m_A); display(tout, m_A, true);); TRACE("ba", active2pb(m_A); display(tout, m_A, true););
#if 0 // TBD: check if this is useful
// why this?
if (!m_overflow && consequent != null_literal) { if (!m_overflow && consequent != null_literal) {
round_to_one(consequent.var()); round_to_one(consequent.var());
} }
#endif
if (!m_overflow && create_asserting_lemma()) { if (!m_overflow && create_asserting_lemma()) {
active2constraint(); active2lemma();
return l_true; return l_true;
} }
bail_out: bail_out:
IF_VERBOSE(1, verbose_stream() << "bail " << m_overflow << "\n");
TRACE("ba", tout << "bail " << m_overflow << "\n";); TRACE("ba", tout << "bail " << m_overflow << "\n";);
if (m_overflow) { if (m_overflow) {
++m_stats.m_num_overflow; ++m_stats.m_num_overflow;
@ -4142,6 +4139,8 @@ namespace sat {
st.update("ba gc", m_stats.m_num_gc); st.update("ba gc", m_stats.m_num_gc);
st.update("ba overflow", m_stats.m_num_overflow); st.update("ba overflow", m_stats.m_num_overflow);
st.update("ba big strengthenings", m_stats.m_num_big_strengthenings); st.update("ba big strengthenings", m_stats.m_num_big_strengthenings);
st.update("ba lemmas", m_stats.m_num_lemmas);
st.update("ba subsumes", m_stats.m_num_bin_subsumes + m_stats.m_num_clause_subsumes + m_stats.m_num_pb_subsumes);
} }
bool ba_solver::validate_unit_propagation(card const& c, literal alit) const { bool ba_solver::validate_unit_propagation(card const& c, literal alit) const {
@ -4297,6 +4296,18 @@ namespace sat {
m_overflow |= sum >= UINT_MAX/2; m_overflow |= sum >= UINT_MAX/2;
} }
ba_solver::constraint* ba_solver::active2lemma() {
switch (s().m_config.m_pb_lemma_format) {
case PB_LEMMA_CARDINALITY:
return active2card();
case PB_LEMMA_PB:
return active2constraint();
default:
UNREACHABLE();
return nullptr;
}
}
ba_solver::constraint* ba_solver::active2constraint() { ba_solver::constraint* ba_solver::active2constraint() {
active2wlits(); active2wlits();
if (m_overflow) { if (m_overflow) {
@ -4304,6 +4315,7 @@ namespace sat {
} }
constraint* c = add_pb_ge(null_literal, m_wlits, m_bound, true); constraint* c = add_pb_ge(null_literal, m_wlits, m_bound, true);
TRACE("ba", if (c) display(tout, *c, true);); TRACE("ba", if (c) display(tout, *c, true););
++m_stats.m_num_lemmas;
return c; return c;
} }
@ -4381,13 +4393,7 @@ namespace sat {
} }
if (slack >= k) { if (slack >= k) {
#if 0 return nullptr;
return active2constraint();
active2pb(m_A);
std::cout << "not asserting\n";
display(std::cout, m_A, true);
#endif
return 0;
} }
// produce asserting cardinality constraint // produce asserting cardinality constraint
@ -4397,8 +4403,9 @@ namespace sat {
} }
constraint* c = add_at_least(null_literal, lits, k, true); constraint* c = add_at_least(null_literal, lits, k, true);
++m_stats.m_num_lemmas;
if (c) { if (c) {
// IF_VERBOSE(0, verbose_stream() << *c << "\n";);
lits.reset(); lits.reset();
for (wliteral wl : m_wlits) { for (wliteral wl : m_wlits) {
if (value(wl.second) == l_false) lits.push_back(wl.second); if (value(wl.second) == l_false) lits.push_back(wl.second);

View file

@ -46,6 +46,7 @@ namespace sat {
unsigned m_num_cut; unsigned m_num_cut;
unsigned m_num_gc; unsigned m_num_gc;
unsigned m_num_overflow; unsigned m_num_overflow;
unsigned m_num_lemmas;
stats() { reset(); } stats() { reset(); }
void reset() { memset(this, 0, sizeof(*this)); } void reset() { memset(this, 0, sizeof(*this)); }
}; };
@ -498,6 +499,7 @@ namespace sat {
ineq m_A, m_B, m_C; ineq m_A, m_B, m_C;
void active2pb(ineq& p); void active2pb(ineq& p);
constraint* active2lemma();
constraint* active2constraint(); constraint* active2constraint();
constraint* active2card(); constraint* active2card();
void active2wlits(); void active2wlits();

View file

@ -204,6 +204,14 @@ namespace sat {
else else
throw sat_param_exception("invalid PB resolve: 'cardinality' or 'resolve' expected"); throw sat_param_exception("invalid PB resolve: 'cardinality' or 'resolve' expected");
s = p.pb_lemma_format();
if (s == "cardinality")
m_pb_lemma_format = PB_LEMMA_CARDINALITY;
else if (s == "pb")
m_pb_lemma_format = PB_LEMMA_PB;
else
throw sat_param_exception("invalid PB lemma format: 'cardinality' or 'pb' expected");
m_card_solver = p.cardinality_solver(); m_card_solver = p.cardinality_solver();
sat_simplifier_params sp(_p); sat_simplifier_params sp(_p);

View file

@ -65,6 +65,11 @@ namespace sat {
PB_ROUNDING PB_ROUNDING
}; };
enum pb_lemma_format {
PB_LEMMA_CARDINALITY,
PB_LEMMA_PB
};
enum reward_t { enum reward_t {
ternary_reward, ternary_reward,
unit_literal_reward, unit_literal_reward,
@ -154,6 +159,7 @@ namespace sat {
pb_solver m_pb_solver; pb_solver m_pb_solver;
bool m_card_solver; bool m_card_solver;
pb_resolve m_pb_resolve; pb_resolve m_pb_resolve;
pb_lemma_format m_pb_lemma_format;
// branching heuristic settings. // branching heuristic settings.
branching_heuristic m_branching_heuristic; branching_heuristic m_branching_heuristic;

View file

@ -45,6 +45,7 @@ def_module_params('sat',
('xor.solver', BOOL, False, 'use xor solver'), ('xor.solver', BOOL, False, 'use xor solver'),
('cardinality.encoding', SYMBOL, 'grouped', 'encoding used for at-most-k constraints: grouped, bimander, ordered, unate, circuit'), ('cardinality.encoding', SYMBOL, 'grouped', 'encoding used for at-most-k constraints: grouped, bimander, ordered, unate, circuit'),
('pb.resolve', SYMBOL, 'cardinality', 'resolution strategy for boolean algebra solver: cardinality, rounding'), ('pb.resolve', SYMBOL, 'cardinality', 'resolution strategy for boolean algebra solver: cardinality, rounding'),
('pb.lemma_format', SYMBOL, 'cardinality', 'generate either cardinality or pb lemmas'),
('local_search', BOOL, False, 'use local search instead of CDCL'), ('local_search', BOOL, False, 'use local search instead of CDCL'),
('local_search_threads', UINT, 0, 'number of local search threads to find satisfiable solution'), ('local_search_threads', UINT, 0, 'number of local search threads to find satisfiable solution'),
('local_search_mode', SYMBOL, 'wsat', 'local search algorithm, either default wsat or qsat'), ('local_search_mode', SYMBOL, 'wsat', 'local search algorithm, either default wsat or qsat'),