3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

tuning based on benchmarks from Robert White

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2014-05-05 14:43:06 -07:00
parent 182fea2d7b
commit 25ad9d2ee1
5 changed files with 65 additions and 40 deletions

View file

@ -90,6 +90,8 @@ namespace smt {
struct stats {
stats() { reset(); }
void reset() { memset(this, 0, sizeof(*this)); }
unsigned m_num_flips;
unsigned m_num_improvements;
};
ast_manager& m;
@ -116,6 +118,7 @@ namespace smt {
unsigned m_non_greedy_percent; // percent of moves to do non-greedy style
random_gen m_rng;
scoped_mpz one;
stats m_stats;
imp(ast_manager& m):
m(m),
@ -238,6 +241,8 @@ namespace smt {
}
void collect_statistics(::statistics& st) const {
st.update("sls.num_flips", m_stats.m_num_flips);
st.update("sls.num_improvements", m_stats.m_num_improvements);
}
void updt_params(params_ref& p) {
@ -347,6 +352,7 @@ namespace smt {
}
literal flip() {
m_stats.m_num_flips++;
literal result;
if (m_hard_false.empty()) {
result = flip_soft();
@ -359,6 +365,7 @@ namespace smt {
m_best_assignment.reset();
m_best_assignment.append(m_assignment);
m_best_penalty = m_penalty;
m_stats.m_num_improvements++;
init_max_flips();
}
if (!m_assignment[result.var()]) {

View file

@ -60,17 +60,24 @@ namespace opt {
params_ref m_params; // config
bool m_enable_sls; // config
bool m_enable_sat; // config
bool m_sls_enabled;
bool m_sat_enabled;
public:
maxsmt_solver_base(solver* s, ast_manager& m):
m_s(s), m(m), m_cancel(false), m_soft(m),
m_enable_sls(false), m_enable_sat(false) {}
m_enable_sls(false), m_enable_sat(false),
m_sls_enabled(false), m_sat_enabled(false) {}
virtual ~maxsmt_solver_base() {}
virtual rational get_lower() const { return m_lower; }
virtual rational get_upper() const { return m_upper; }
virtual bool get_assignment(unsigned index) const { return m_assignment[index]; }
virtual void set_cancel(bool f) { m_cancel = f; m_s->set_cancel(f); }
virtual void collect_statistics(statistics& st) const { }
virtual void collect_statistics(statistics& st) const {
if (m_sls_enabled || m_sat_enabled) {
m_s->collect_statistics(st);
}
}
virtual void get_model(model_ref& mdl) { mdl = m_model.get(); }
virtual void updt_params(params_ref& p) {
m_params.copy(p);
@ -121,7 +128,6 @@ namespace opt {
fid != pb.get_family_id() &&
fid != bv.get_family_id() &&
!is_uninterp_const(n)) {
std::cout << mk_pp(n, m) << "\n";
throw found();
}
}
@ -147,7 +153,7 @@ namespace opt {
}
void enable_bvsat() {
if (probe_bv()) {
if (m_enable_sat && !m_sat_enabled && probe_bv()) {
tactic_ref pb2bv = mk_card2bv_tactic(m, m_params);
tactic_ref bv2sat = mk_qfbv_tactic(m, m_params);
tactic_ref tac = and_then(pb2bv.get(), bv2sat.get());
@ -159,15 +165,17 @@ namespace opt {
unsigned lvl = m_s->get_scope_level();
while (lvl > 0) { sat_solver->push(); --lvl; }
m_s = sat_solver;
m_sat_enabled = true;
}
}
void enable_sls() {
if (m_enable_sls && probe_bv()) {
if (m_enable_sls && !m_sls_enabled && probe_bv()) {
m_params.set_uint("restarts", 20);
unsigned lvl = m_s->get_scope_level();
m_s = alloc(sls_solver, m, m_s.get(), m_soft, m_weights, m_params);
while (lvl > 0) { m_s->push(); --lvl; }
m_sls_enabled = true;
}
}
@ -249,19 +257,18 @@ namespace opt {
m_soft_aux(m),
m_trail(m),
m_soft_constraints(m),
m_enable_lazy(false) {
m_enable_lazy(true) {
m_enable_lazy = true;
enable_sls();
}
virtual ~bcd2() {}
virtual lbool operator()() {
expr_ref fml(m), r(m);
lbool is_sat = l_undef;
expr_ref_vector asms(m);
bool first = true;
enable_sls();
solver::scoped_push _scope1(s());
init();
init_bcd();
@ -557,13 +564,14 @@ namespace opt {
public:
pbmax(solver* s, ast_manager& m, bool use_aux):
maxsmt_solver_base(s, m), m_use_aux(use_aux) {
enable_bvsat();
enable_sls();
}
virtual ~pbmax() {}
lbool operator()() {
enable_bvsat();
enable_sls();
TRACE("opt", s().display(tout); tout << "\n";
for (unsigned i = 0; i < m_soft.size(); ++i) {
tout << mk_pp(m_soft[i].get(), m) << " " << m_weights[i] << "\n";
@ -636,12 +644,12 @@ namespace opt {
public:
wpm2(solver* s, ast_manager& m, maxsmt_solver_base* _maxs):
maxsmt_solver_base(s, m), maxs(_maxs) {
enable_sls();
}
virtual ~wpm2() {}
lbool operator()() {
enable_sls();
IF_VERBOSE(1, verbose_stream() << "(wmaxsat.wpm2 solve)\n";);
solver::scoped_push _s(s());
pb_util u(m);
@ -839,12 +847,12 @@ namespace opt {
public:
sls(solver* s, ast_manager& m):
maxsmt_solver_base(s, m) {
enable_bvsat();
enable_sls();
}
virtual ~sls() {}
lbool operator()() {
IF_VERBOSE(1, verbose_stream() << "(sls solve)\n";);
enable_bvsat();
enable_sls();
init();
lbool is_sat = s().check_sat(0, 0);
if (is_sat == l_true) {