mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
fix sorting network bug, add network compilation,...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
72f09e4729
commit
019ff77613
15 changed files with 350 additions and 100 deletions
|
@ -397,8 +397,12 @@ public:
|
|||
*/
|
||||
sort_assumptions(asms);
|
||||
unsigned index = 0;
|
||||
unsigned last_index = 0;
|
||||
while (index < asms.size() && is_sat != l_false) {
|
||||
index = next_index(asms, index);
|
||||
while (asms.size() > 10*(index - last_index) && index < asms.size()) {
|
||||
index = next_index(asms, index);
|
||||
}
|
||||
last_index = index;
|
||||
is_sat = s().check_sat(index, asms.c_ptr());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,7 +69,6 @@ namespace opt {
|
|||
m_objectives_lim.pop_back();
|
||||
m_hard_lim.pop_back();
|
||||
}
|
||||
|
||||
|
||||
void context::scoped_state::add(expr* hard) {
|
||||
m_hard.push_back(hard);
|
||||
|
@ -608,7 +607,7 @@ namespace opt {
|
|||
for (unsigned i = 0; i < a->get_num_args(); ++i) {
|
||||
expr* arg = a->get_arg(i);
|
||||
if (m.is_true(arg)) {
|
||||
|
||||
// skip
|
||||
}
|
||||
else if (m.is_false(arg)) {
|
||||
offset += m_objectives[index].m_weights[i];
|
||||
|
@ -764,8 +763,8 @@ namespace opt {
|
|||
SASSERT(obj.m_id == id);
|
||||
obj.m_terms.reset();
|
||||
obj.m_terms.append(terms);
|
||||
obj.m_offset = offset;
|
||||
obj.m_neg = neg;
|
||||
obj.m_adjust_bound.set_offset(offset);
|
||||
obj.m_adjust_bound.set_negate(neg);
|
||||
TRACE("opt", tout << "maxsat: " << id << " offset:" << offset << "\n";);
|
||||
}
|
||||
else if (is_maximize(fml, tr, orig_term, index)) {
|
||||
|
@ -835,23 +834,23 @@ namespace opt {
|
|||
switch(obj.m_type) {
|
||||
case O_MINIMIZE:
|
||||
if (m_model->eval(obj.m_term, val) && is_numeral(val, r)) {
|
||||
r += obj.m_offset;
|
||||
inf_eps val = obj.m_adjust_bound.neg_add(r);
|
||||
if (is_lower) {
|
||||
m_optsmt.update_lower(obj.m_index, inf_eps(-r), override);
|
||||
m_optsmt.update_lower(obj.m_index, val, override);
|
||||
}
|
||||
else {
|
||||
m_optsmt.update_upper(obj.m_index, inf_eps(-r), override);
|
||||
m_optsmt.update_upper(obj.m_index, val, override);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case O_MAXIMIZE:
|
||||
if (m_model->eval(obj.m_term, val) && is_numeral(val, r)) {
|
||||
r += obj.m_offset;
|
||||
inf_eps val = obj.m_adjust_bound.neg_add(r);
|
||||
if (is_lower) {
|
||||
m_optsmt.update_lower(obj.m_index, inf_eps(r), override);
|
||||
m_optsmt.update_lower(obj.m_index, val, override);
|
||||
}
|
||||
else {
|
||||
m_optsmt.update_upper(obj.m_index, inf_eps(r), override);
|
||||
m_optsmt.update_upper(obj.m_index, val, override);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -921,10 +920,7 @@ namespace opt {
|
|||
switch(obj.m_type) {
|
||||
case O_MAXSMT: {
|
||||
rational r = m_maxsmts.find(obj.m_id)->get_lower();
|
||||
TRACE("opt", tout << "maxsmt: " << r << " negate: " << obj.m_neg << " offset: " << obj.m_offset << "\n";);
|
||||
if (obj.m_neg) r.neg();
|
||||
r += obj.m_offset;
|
||||
return inf_eps(r);
|
||||
return obj.m_adjust_bound.neg_add(r);
|
||||
}
|
||||
case O_MINIMIZE:
|
||||
return -m_optsmt.get_upper(obj.m_index);
|
||||
|
@ -942,13 +938,9 @@ namespace opt {
|
|||
}
|
||||
objective const& obj = m_objectives[idx];
|
||||
switch(obj.m_type) {
|
||||
case O_MAXSMT: {
|
||||
rational r = m_maxsmts.find(obj.m_id)->get_upper();
|
||||
TRACE("opt", tout << "maxsmt: " << r << " negate: " << obj.m_neg << " offset: " << obj.m_offset << "\n";);
|
||||
if (obj.m_neg) r.neg();
|
||||
r += obj.m_offset;
|
||||
return inf_eps(r);
|
||||
}
|
||||
case O_MAXSMT:
|
||||
return obj.m_adjust_bound.neg_add(m_maxsmts.find(obj.m_id)->get_upper());
|
||||
// TBD: adjust bound
|
||||
case O_MINIMIZE:
|
||||
return -m_optsmt.get_lower(obj.m_index);
|
||||
case O_MAXIMIZE:
|
||||
|
|
|
@ -51,8 +51,7 @@ namespace opt {
|
|||
app_ref m_term; // for maximize, minimize term
|
||||
expr_ref_vector m_terms; // for maxsmt
|
||||
vector<rational> m_weights; // for maxsmt
|
||||
rational m_offset; // for maxsmt
|
||||
bool m_neg; // negate
|
||||
bound_adjustment m_adjust_bound;
|
||||
symbol m_id; // for maxsmt
|
||||
unsigned m_index; // for maximize/minimize index
|
||||
|
||||
|
@ -60,18 +59,18 @@ namespace opt {
|
|||
m_type(is_max?O_MAXIMIZE:O_MINIMIZE),
|
||||
m_term(t),
|
||||
m_terms(t.get_manager()),
|
||||
m_offset(0),
|
||||
m_neg(false),
|
||||
m_id(),
|
||||
m_index(idx)
|
||||
{}
|
||||
{
|
||||
if (!is_max) {
|
||||
m_adjust_bound.set_negate(true);
|
||||
}
|
||||
}
|
||||
|
||||
objective(ast_manager& m, symbol id):
|
||||
m_type(O_MAXSMT),
|
||||
m_term(m),
|
||||
m_terms(m),
|
||||
m_offset(0),
|
||||
m_neg(false),
|
||||
m_id(id),
|
||||
m_index(0)
|
||||
{}
|
||||
|
|
|
@ -36,6 +36,33 @@ namespace opt {
|
|||
|
||||
typedef inf_eps_rational<inf_rational> inf_eps;
|
||||
|
||||
// Adjust bound bound |-> (m_negate?-1:1)*(m_offset + bound)
|
||||
class bound_adjustment {
|
||||
rational m_offset;
|
||||
bool m_negate;
|
||||
public:
|
||||
bound_adjustment(rational const& offset, bool neg):
|
||||
m_offset(offset),
|
||||
m_negate(neg)
|
||||
{}
|
||||
bound_adjustment(): m_offset(0), m_negate(false) {}
|
||||
void set_offset(rational const& o) { m_offset = o; }
|
||||
void set_negate(bool neg) { m_negate = neg; }
|
||||
rational const& get_offset() const { return m_offset; }
|
||||
bool get_negate() { return m_negate; }
|
||||
inf_eps add_neg(rational const& r) const {
|
||||
rational result = r + m_offset;
|
||||
if (m_negate) result.neg();
|
||||
return inf_eps(result);
|
||||
}
|
||||
inf_eps neg_add(rational const& r) const {
|
||||
rational result = r;
|
||||
if (m_negate) result.neg();
|
||||
result += m_offset;
|
||||
return inf_eps(result);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class opt_solver : public solver_na2as {
|
||||
private:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue