mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
fix bug in unsat core extraction in sat solver
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
1c56d6ee95
commit
a47f3df703
14 changed files with 70 additions and 53 deletions
|
@ -57,7 +57,7 @@ namespace opt {
|
|||
es.push_back(m.mk_not(*it));
|
||||
}
|
||||
}
|
||||
void bcd2_init_soft(vector<rational> const& weights, expr_ref_vector const& soft) {
|
||||
void bcd2_init_soft(weights_t& weights, expr_ref_vector const& soft) {
|
||||
|
||||
// normalize weights to be integral:
|
||||
m_den = rational::one();
|
||||
|
@ -100,7 +100,7 @@ namespace opt {
|
|||
|
||||
public:
|
||||
bcd2(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft):
|
||||
weights_t& ws, expr_ref_vector const& soft):
|
||||
maxsmt_solver_base(c, ws, soft),
|
||||
pb(m),
|
||||
m_soft_aux(m),
|
||||
|
@ -116,7 +116,6 @@ namespace opt {
|
|||
expr_ref fml(m), r(m);
|
||||
lbool is_sat = l_undef;
|
||||
expr_ref_vector asms(m);
|
||||
solver::scoped_push _scope1(s());
|
||||
init();
|
||||
init_bcd();
|
||||
if (m_cancel) {
|
||||
|
@ -399,8 +398,8 @@ namespace opt {
|
|||
}
|
||||
};
|
||||
|
||||
maxsmt_solver_base* opt::mk_bcd2(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft) {
|
||||
maxsmt_solver_base* opt::mk_bcd2(
|
||||
context& c, weights_t& ws, expr_ref_vector const& soft) {
|
||||
return alloc(bcd2, c, ws, soft);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,6 @@ Notes:
|
|||
#include "maxsmt.h"
|
||||
|
||||
namespace opt {
|
||||
maxsmt_solver_base* mk_bcd2(context& c, vector<rational> const& ws, expr_ref_vector const& soft);
|
||||
maxsmt_solver_base* mk_bcd2(context& c, weights_t& ws, expr_ref_vector const& soft);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -75,7 +75,7 @@ namespace opt {
|
|||
|
||||
|
||||
public:
|
||||
maxhs(context& c, vector<rational> const& ws, expr_ref_vector const& soft):
|
||||
maxhs(context& c, weights_t& ws, expr_ref_vector const& soft):
|
||||
maxsmt_solver_base(c, ws, soft),
|
||||
m_aux(m),
|
||||
m_at_lower_bound(false) {
|
||||
|
@ -554,8 +554,8 @@ namespace opt {
|
|||
|
||||
};
|
||||
|
||||
maxsmt_solver_base* opt::mk_maxhs(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft) {
|
||||
maxsmt_solver_base* opt::mk_maxhs(
|
||||
context& c, weights_t& ws, expr_ref_vector const& soft) {
|
||||
return alloc(maxhs, c, ws, soft);
|
||||
}
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ private:
|
|||
|
||||
public:
|
||||
maxres(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft,
|
||||
weights_t& ws, expr_ref_vector const& soft,
|
||||
strategy_t st):
|
||||
maxsmt_solver_base(c, ws, soft),
|
||||
m_B(m), m_asms(m),
|
||||
|
@ -658,18 +658,18 @@ public:
|
|||
|
||||
};
|
||||
|
||||
opt::maxsmt_solver_base* opt::mk_maxres(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft) {
|
||||
opt::maxsmt_solver_base* opt::mk_maxres(
|
||||
context& c, weights_t& ws, expr_ref_vector const& soft) {
|
||||
return alloc(maxres, c, ws, soft, maxres::s_mus);
|
||||
}
|
||||
|
||||
opt::maxsmt_solver_base* opt::mk_mus_mss_maxres(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft) {
|
||||
opt::maxsmt_solver_base* opt::mk_mus_mss_maxres(
|
||||
context& c, weights_t& ws, expr_ref_vector const& soft) {
|
||||
return alloc(maxres, c, ws, soft, maxres::s_mus_mss);
|
||||
}
|
||||
|
||||
opt::maxsmt_solver_base* opt::mk_mss_maxres(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft) {
|
||||
opt::maxsmt_solver_base* opt::mk_mss_maxres(
|
||||
context& c, weights_t& ws, expr_ref_vector const& soft) {
|
||||
return alloc(maxres, c, ws, soft, maxres::s_mss);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,17 +22,11 @@ Notes:
|
|||
|
||||
namespace opt {
|
||||
|
||||
maxsmt_solver_base* mk_maxres(
|
||||
context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft);
|
||||
maxsmt_solver_base* mk_maxres(context& c, weights_t & ws, expr_ref_vector const& soft);
|
||||
|
||||
maxsmt_solver_base* mk_mus_mss_maxres(
|
||||
context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft);
|
||||
maxsmt_solver_base* mk_mus_mss_maxres(context& c, weights_t & ws, expr_ref_vector const& soft);
|
||||
|
||||
maxsmt_solver_base* mk_mss_maxres(
|
||||
context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft);
|
||||
maxsmt_solver_base* mk_mss_maxres(context& c, weights_t & ws, expr_ref_vector const& soft);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace opt {
|
|||
|
||||
class sls : public maxsmt_solver_base {
|
||||
public:
|
||||
sls(context& c, vector<rational> const& ws, expr_ref_vector const& soft):
|
||||
sls(context& c, weights_t& ws, expr_ref_vector const& soft):
|
||||
maxsmt_solver_base(c, ws, soft) {
|
||||
}
|
||||
virtual ~sls() {}
|
||||
|
@ -52,8 +52,8 @@ namespace opt {
|
|||
|
||||
};
|
||||
|
||||
maxsmt_solver_base* opt::mk_sls(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft) {
|
||||
maxsmt_solver_base* opt::mk_sls(
|
||||
context& c, weights_t& ws, expr_ref_vector const& soft) {
|
||||
return alloc(sls, c, ws, soft);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,8 +27,7 @@ Notes:
|
|||
namespace opt {
|
||||
|
||||
|
||||
maxsmt_solver_base* mk_sls(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft);
|
||||
maxsmt_solver_base* mk_sls(context& c, weights_t& ws, expr_ref_vector const& soft);
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -27,6 +27,8 @@ Notes:
|
|||
|
||||
namespace opt {
|
||||
|
||||
typedef vector<rational> const weights_t;
|
||||
|
||||
class context;
|
||||
|
||||
class maxsmt_solver {
|
||||
|
@ -63,7 +65,7 @@ namespace opt {
|
|||
params_ref m_params; // config
|
||||
|
||||
public:
|
||||
maxsmt_solver_base(context& c, vector<rational> const& ws, expr_ref_vector const& soft);
|
||||
maxsmt_solver_base(context& c, weights_t& ws, expr_ref_vector const& soft);
|
||||
|
||||
virtual ~maxsmt_solver_base() {}
|
||||
virtual rational get_lower() const { return m_lower; }
|
||||
|
@ -74,14 +76,14 @@ namespace opt {
|
|||
virtual void get_model(model_ref& mdl) { mdl = m_model.get(); }
|
||||
void set_model() { s().get_model(m_model); }
|
||||
virtual void updt_params(params_ref& p);
|
||||
virtual void init_soft(vector<rational> const& weights, expr_ref_vector const& soft);
|
||||
virtual void init_soft(weights_t& weights, expr_ref_vector const& soft);
|
||||
solver& s() { return m_s; }
|
||||
void init();
|
||||
expr* mk_not(expr* e);
|
||||
void set_mus(bool f);
|
||||
app* mk_fresh_bool(char const* name);
|
||||
protected:
|
||||
void enable_sls(expr_ref_vector const& soft, vector<rational> const& ws);
|
||||
void enable_sls(expr_ref_vector const& soft, weights_t& ws);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -122,7 +124,7 @@ namespace opt {
|
|||
void display_answer(std::ostream& out) const;
|
||||
void collect_statistics(statistics& st) const;
|
||||
private:
|
||||
bool is_maxsat_problem(vector<rational> const& ws) const;
|
||||
bool is_maxsat_problem(weights_t& ws) const;
|
||||
void verify_assignment();
|
||||
};
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ namespace opt {
|
|||
|
||||
class opt_solver;
|
||||
|
||||
|
||||
class context : public opt_wrapper, public pareto_callback {
|
||||
struct free_func_visitor;
|
||||
typedef map<symbol, maxsmt*, symbol_hash_proc, symbol_eq_proc> map_t;
|
||||
|
@ -175,7 +176,7 @@ namespace opt {
|
|||
solver& get_solver();
|
||||
ast_manager& get_manager() { return this->m; }
|
||||
params_ref& params() { return m_params; }
|
||||
void enable_sls(expr_ref_vector const& soft, vector<rational> const& weights);
|
||||
void enable_sls(expr_ref_vector const& soft, weights_t& weights);
|
||||
symbol const& maxsat_engine() const { return m_maxsat_engine; }
|
||||
|
||||
|
||||
|
|
|
@ -31,8 +31,7 @@ namespace opt {
|
|||
|
||||
class pbmax : public maxsmt_solver_base {
|
||||
public:
|
||||
pbmax(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft):
|
||||
pbmax(context& c, weights_t& ws, expr_ref_vector const& soft):
|
||||
maxsmt_solver_base(c, ws, soft) {
|
||||
}
|
||||
|
||||
|
@ -88,8 +87,8 @@ namespace opt {
|
|||
}
|
||||
};
|
||||
|
||||
maxsmt_solver_base* opt::mk_pbmax(context & c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft) {
|
||||
maxsmt_solver_base* opt::mk_pbmax(
|
||||
context & c, weights_t& ws, expr_ref_vector const& soft) {
|
||||
return alloc(pbmax, c, ws, soft);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,8 +23,7 @@ Notes:
|
|||
#include "maxsmt.h"
|
||||
|
||||
namespace opt {
|
||||
maxsmt_solver_base* mk_pbmax(context& c,
|
||||
vector<rational> const& ws, expr_ref_vector const& soft);
|
||||
maxsmt_solver_base* mk_pbmax(context& c, weights_t& ws, expr_ref_vector const& soft);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -84,11 +84,13 @@ namespace opt {
|
|||
lbool operator()() {
|
||||
TRACE("opt", tout << "weighted maxsat\n";);
|
||||
scoped_ensure_theory wth(*this);
|
||||
solver::scoped_push _s1(s());
|
||||
lbool is_sat = l_true;
|
||||
bool was_sat = false;
|
||||
for (unsigned i = 0; i < m_soft.size(); ++i) {
|
||||
wth().assert_weighted(m_soft[i].get(), m_weights[i]);
|
||||
}
|
||||
solver::scoped_push _s2(s());
|
||||
while (l_true == is_sat) {
|
||||
is_sat = s().check_sat(0,0);
|
||||
if (m_cancel) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue