3
0
Fork 0
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:
Nikolaj Bjorner 2014-09-11 18:47:21 -07:00
parent 72f09e4729
commit 019ff77613
15 changed files with 350 additions and 100 deletions

View file

@ -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());
}
}

View file

@ -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:

View file

@ -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)
{}

View file

@ -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: