From 252b9e8819fa6c158f326d83541bdea6c8c249e5 Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Fri, 9 May 2014 16:32:17 -0700 Subject: [PATCH] fix lower/upper bound estimate with respect to offset Signed-off-by: Nikolaj Bjorner --- src/opt/opt_context.cpp | 5 ++++- src/opt/weighted_maxsat.cpp | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/opt/opt_context.cpp b/src/opt/opt_context.cpp index ceab047b7..f227d3c04 100644 --- a/src/opt/opt_context.cpp +++ b/src/opt/opt_context.cpp @@ -710,22 +710,25 @@ namespace opt { void context::update_lower(bool override) { expr_ref val(m); - rational r(0); for (unsigned i = 0; i < m_objectives.size(); ++i) { objective const& obj = m_objectives[i]; + rational r; switch(obj.m_type) { case O_MINIMIZE: if (m_model->eval(obj.m_term, val) && is_numeral(val, r)) { + r += obj.m_offset; m_optsmt.update_lower(obj.m_index, inf_eps(-r), override); } break; case O_MAXIMIZE: if (m_model->eval(obj.m_term, val) && is_numeral(val, r)) { + r += obj.m_offset; m_optsmt.update_lower(obj.m_index, inf_eps(r), override); } break; case O_MAXSMT: { bool ok = true; + r = obj.m_offset; for (unsigned j = 0; ok && j < obj.m_terms.size(); ++j) { if (m_model->eval(obj.m_terms[j], val)) { if (!m.is_true(val)) { diff --git a/src/opt/weighted_maxsat.cpp b/src/opt/weighted_maxsat.cpp index 112b0522a..f19c5c77e 100644 --- a/src/opt/weighted_maxsat.cpp +++ b/src/opt/weighted_maxsat.cpp @@ -111,6 +111,7 @@ namespace opt { if (!m_assignment.back()) { m_upper += m_weights[i]; } + TRACE("opt", tout << "evaluate: " << val << "\n";); } } expr* mk_not(expr* e) {