3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-27 16:38:45 +00:00

reworking pd-maxres

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2015-08-20 12:20:30 -07:00
parent e3cb0e2d8b
commit a9807878ea
7 changed files with 23 additions and 18 deletions

View file

@ -104,6 +104,7 @@ private:
bool m_wmax; // Block upper bound using wmax bool m_wmax; // Block upper bound using wmax
// this option is disabled if SAT core is used. // this option is disabled if SAT core is used.
std::string m_trace_id;
typedef ptr_vector<expr> exprs; typedef ptr_vector<expr> exprs;
public: public:
@ -125,6 +126,14 @@ public:
m_maximize_assignment(false), m_maximize_assignment(false),
m_max_correction_set_size(3) m_max_correction_set_size(3)
{ {
switch(st) {
case s_primal:
m_trace_id = "maxres";
break;
case s_primal_dual:
m_trace_id = "pd-maxres";
break;
}
} }
virtual ~maxres() {} virtual ~maxres() {}
@ -168,10 +177,14 @@ public:
m_trail.push_back(e); m_trail.push_back(e);
} }
void trace() {
trace_bounds(m_trace_id.c_str());
}
lbool mus_solver() { lbool mus_solver() {
init(); init();
init_local(); init_local();
trace_bounds("maxres"); trace();
while (m_lower < m_upper) { while (m_lower < m_upper) {
TRACE("opt", TRACE("opt",
display_vec(tout, m_asms); display_vec(tout, m_asms);
@ -197,16 +210,15 @@ public:
break; break;
} }
} }
trace_bounds("maxres"); trace();
return l_true; return l_true;
} }
lbool primal_dual_solver() { lbool primal_dual_solver() {
init(); init();
init_local(); init_local();
set_soft_assumptions();
lbool is_sat = l_true; lbool is_sat = l_true;
trace_bounds("maxres"); trace();
exprs cs; exprs cs;
while (m_lower < m_upper) { while (m_lower < m_upper) {
is_sat = check_sat_hill_climb(m_asms); is_sat = check_sat_hill_climb(m_asms);
@ -235,7 +247,7 @@ public:
break; break;
} }
} }
trace_bounds("maxres"); trace();
return l_true; return l_true;
} }
@ -456,7 +468,7 @@ public:
fml = mk_not(m, mk_and(m, m_B.size(), m_B.c_ptr())); fml = mk_not(m, mk_and(m, m_B.size(), m_B.c_ptr()));
s().assert_expr(fml); s().assert_expr(fml);
m_lower += w; m_lower += w;
trace_bounds("maxres"); trace();
} }
bool get_mus_model(model_ref& mdl) { bool get_mus_model(model_ref& mdl) {
@ -652,7 +664,7 @@ public:
} }
m_upper = upper; m_upper = upper;
DEBUG_CODE(verify_assignment();); DEBUG_CODE(verify_assignment(););
trace_bounds("maxres"); trace();
add_upper_bound_block(); add_upper_bound_block();
} }

View file

@ -101,10 +101,6 @@ namespace opt {
m_c.enable_sls(force); m_c.enable_sls(force);
} }
void maxsmt_solver_base::set_soft_assumptions() {
m_c.set_soft_assumptions();
}
app* maxsmt_solver_base::mk_fresh_bool(char const* name) { app* maxsmt_solver_base::mk_fresh_bool(char const* name) {
app* result = m.mk_fresh_const(name, m.mk_bool_sort()); app* result = m.mk_fresh_const(name, m.mk_bool_sort());
m_c.fm().insert(result->get_decl()); m_c.fm().insert(result->get_decl());

View file

@ -101,7 +101,6 @@ namespace opt {
protected: protected:
void enable_sls(bool force); void enable_sls(bool force);
void set_soft_assumptions();
void trace_bounds(char const* solver); void trace_bounds(char const* solver);
}; };

View file

@ -530,10 +530,6 @@ namespace opt {
} }
} }
void context::set_soft_assumptions() {
// TBD no-op
}
void context::enable_sls(bool force) { void context::enable_sls(bool force) {
if ((force || m_enable_sls) && m_sat_solver.get()) { if ((force || m_enable_sls) && m_sat_solver.get()) {
m_params.set_bool("optimize_model", true); m_params.set_bool("optimize_model", true);

View file

@ -51,7 +51,6 @@ namespace opt {
virtual ast_manager& get_manager() = 0; virtual ast_manager& get_manager() = 0;
virtual params_ref& params() = 0; virtual params_ref& params() = 0;
virtual void enable_sls(bool force) = 0; // stochastic local search virtual void enable_sls(bool force) = 0; // stochastic local search
virtual void set_soft_assumptions() = 0; // configure SAT solver to skip assumptions assigned by unit-propagation
virtual symbol const& maxsat_engine() const = 0; // retrieve maxsat engine configuration parameter. virtual symbol const& maxsat_engine() const = 0; // retrieve maxsat engine configuration parameter.
virtual void get_base_model(model_ref& _m) = 0; // retrieve model from initial satisfiability call. virtual void get_base_model(model_ref& _m) = 0; // retrieve model from initial satisfiability call.
virtual smt::context& smt_context() = 0; // access SMT context for SMT based MaxSMT solver (wmax requires SMT core) virtual smt::context& smt_context() = 0; // access SMT context for SMT based MaxSMT solver (wmax requires SMT core)
@ -216,7 +215,6 @@ namespace opt {
virtual ast_manager& get_manager() { return this->m; } virtual ast_manager& get_manager() { return this->m; }
virtual params_ref& params() { return m_params; } virtual params_ref& params() { return m_params; }
virtual void enable_sls(bool force); virtual void enable_sls(bool force);
virtual void set_soft_assumptions();
virtual symbol const& maxsat_engine() const { return m_maxsat_engine; } virtual symbol const& maxsat_engine() const { return m_maxsat_engine; }
virtual void get_base_model(model_ref& _m); virtual void get_base_model(model_ref& _m);

View file

@ -925,6 +925,7 @@ namespace sat {
else { else {
svector<literal> blocker; svector<literal> blocker;
if (!init_weighted_assumptions(num_lits, lits, weights, max_weight, blocker)) { if (!init_weighted_assumptions(num_lits, lits, weights, max_weight, blocker)) {
++m_stats.m_blocked_corr_sets;
pop_to_base_level(); pop_to_base_level();
mk_clause(blocker.size(), blocker.c_ptr()); mk_clause(blocker.size(), blocker.c_ptr());
goto retry_init_assumptions; goto retry_init_assumptions;
@ -2811,6 +2812,7 @@ namespace sat {
st.update("restarts", m_restart); st.update("restarts", m_restart);
st.update("minimized lits", m_minimized_lits); st.update("minimized lits", m_minimized_lits);
st.update("dyn subsumption resolution", m_dyn_sub_res); st.update("dyn subsumption resolution", m_dyn_sub_res);
st.update("blocked correction sets", m_blocked_corr_sets);
} }
void stats::reset() { void stats::reset() {
@ -2829,6 +2831,7 @@ namespace sat {
m_minimized_lits = 0; m_minimized_lits = 0;
m_dyn_sub_res = 0; m_dyn_sub_res = 0;
m_non_learned_generation = 0; m_non_learned_generation = 0;
m_blocked_corr_sets = 0;
} }
void mk_stat::display(std::ostream & out) const { void mk_stat::display(std::ostream & out) const {

View file

@ -60,6 +60,7 @@ namespace sat {
unsigned m_minimized_lits; unsigned m_minimized_lits;
unsigned m_dyn_sub_res; unsigned m_dyn_sub_res;
unsigned m_non_learned_generation; unsigned m_non_learned_generation;
unsigned m_blocked_corr_sets;
stats() { reset(); } stats() { reset(); }
void reset(); void reset();
void collect_statistics(statistics & st) const; void collect_statistics(statistics & st) const;