mirror of
https://github.com/Z3Prover/z3
synced 2025-05-07 15:55:46 +00:00
fix tests
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
81e5589bc8
commit
792bf6c10b
8 changed files with 81 additions and 74 deletions
|
@ -34,16 +34,17 @@ Notes:
|
|||
namespace opt {
|
||||
|
||||
maxsmt_solver_base::maxsmt_solver_base(
|
||||
maxsat_context& c, vector<rational> const& ws, expr_ref_vector const& soft):
|
||||
maxsat_context& c, vector<rational> const& ws, expr_ref_vector const& softs):
|
||||
m(c.get_manager()),
|
||||
m_c(c),
|
||||
m_soft(soft),
|
||||
m_weights(ws),
|
||||
m_assertions(m),
|
||||
m_trail(m) {
|
||||
c.get_base_model(m_model);
|
||||
SASSERT(m_model);
|
||||
updt_params(c.params());
|
||||
for (unsigned i = 0; i < ws.size(); ++i) {
|
||||
m_soft.push_back(soft(expr_ref(softs.get(i), m), ws[i], false));
|
||||
}
|
||||
}
|
||||
|
||||
void maxsmt_solver_base::updt_params(params_ref& p) {
|
||||
|
@ -56,17 +57,21 @@ namespace opt {
|
|||
|
||||
void maxsmt_solver_base::commit_assignment() {
|
||||
expr_ref tmp(m);
|
||||
expr_ref_vector fmls(m);
|
||||
rational k(0), cost(0);
|
||||
for (unsigned i = 0; i < m_soft.size(); ++i) {
|
||||
if (get_assignment(i)) {
|
||||
k += m_weights[i];
|
||||
vector<rational> weights;
|
||||
for (soft const& s : m_soft) {
|
||||
if (s.is_true) {
|
||||
k += s.weight;
|
||||
}
|
||||
else {
|
||||
cost += m_weights[i];
|
||||
cost += s.weight;
|
||||
}
|
||||
weights.push_back(s.weight);
|
||||
fmls.push_back(s.s);
|
||||
}
|
||||
pb_util pb(m);
|
||||
tmp = pb.mk_ge(m_weights.size(), m_weights.c_ptr(), m_soft.c_ptr(), k);
|
||||
tmp = pb.mk_ge(weights.size(), weights.c_ptr(), fmls.c_ptr(), k);
|
||||
TRACE("opt", tout << "cost: " << cost << "\n" << tmp << "\n";);
|
||||
s().assert_expr(tmp);
|
||||
}
|
||||
|
@ -74,19 +79,14 @@ namespace opt {
|
|||
bool maxsmt_solver_base::init() {
|
||||
m_lower.reset();
|
||||
m_upper.reset();
|
||||
m_assignment.reset();
|
||||
for (unsigned i = 0; i < m_weights.size(); ++i) {
|
||||
m_assignment.push_back(m.is_true(m_soft[i]));
|
||||
if (!m_assignment.back()) {
|
||||
m_upper += m_weights[i];
|
||||
}
|
||||
for (soft& s : m_soft) {
|
||||
s.is_true = m.is_true(s.s);
|
||||
if (!s.is_true) m_upper += s.weight;
|
||||
}
|
||||
|
||||
TRACE("opt",
|
||||
tout << "upper: " << m_upper << " assignments: ";
|
||||
for (unsigned i = 0; i < m_weights.size(); ++i) {
|
||||
tout << (m_assignment[i]?"T":"F");
|
||||
}
|
||||
for (soft& s : m_soft) tout << (s.is_true?"T":"F");
|
||||
tout << "\n";);
|
||||
return true;
|
||||
}
|
||||
|
@ -141,6 +141,7 @@ namespace opt {
|
|||
maxsmt_solver_base::scoped_ensure_theory::scoped_ensure_theory(maxsmt_solver_base& s) {
|
||||
m_wth = s.ensure_wmax_theory();
|
||||
}
|
||||
|
||||
maxsmt_solver_base::scoped_ensure_theory::~scoped_ensure_theory() {
|
||||
if (m_wth) {
|
||||
m_wth->reset_local();
|
||||
|
@ -159,11 +160,13 @@ namespace opt {
|
|||
|
||||
lbool maxsmt_solver_base::find_mutexes(obj_map<expr, rational>& new_soft) {
|
||||
m_lower.reset();
|
||||
for (unsigned i = 0; i < m_soft.size(); ++i) {
|
||||
new_soft.insert(m_soft[i], m_weights[i]);
|
||||
expr_ref_vector fmls(m);
|
||||
for (soft& s : m_soft) {
|
||||
new_soft.insert(s.s, s.weight);
|
||||
fmls.push_back(s.s);
|
||||
}
|
||||
vector<expr_ref_vector> mutexes;
|
||||
lbool is_sat = s().find_mutexes(m_soft, mutexes);
|
||||
lbool is_sat = s().find_mutexes(fmls, mutexes);
|
||||
if (is_sat != l_true) {
|
||||
return is_sat;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue