Skip to content

Commit 2510686

Browse files
fix dotnet build
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 9f0b303 commit 2510686

File tree

9 files changed

+153
-99
lines changed

9 files changed

+153
-99
lines changed

src/api/dotnet/Goal.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ public override string ToString()
227227
/// <returns>A string representation of the Goal.</returns>
228228
public string ToDimacs(bool include_names = true)
229229
{
230-
return Native.Z3_goal_to_dimacs_string(Context.nCtx, NativeObject, include_names);
230+
return Native.Z3_goal_to_dimacs_string(Context.nCtx, NativeObject, (byte)(include_names ? 1 : 0));
231231
}
232232

233233
/// <summary>

src/ast/euf/euf_egraph.cpp

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -341,31 +341,36 @@ namespace euf {
341341
n->invariant();
342342
}
343343

344+
std::ostream& egraph::display(std::ostream& out, unsigned max_args, enode* n) const {
345+
out << std::setw(5)
346+
<< n->get_owner_id() << " := ";
347+
out << n->get_root()->get_owner_id() << " ";
348+
expr* f = n->get_owner();
349+
if (is_app(f))
350+
out << to_app(f)->get_decl()->get_name() << " ";
351+
else if (is_quantifier(f))
352+
out << "q ";
353+
else
354+
out << "v ";
355+
for (enode* arg : enode_args(n))
356+
out << arg->get_owner_id() << " ";
357+
for (unsigned i = n->num_args(); i < max_args; ++i)
358+
out << " ";
359+
out << "\t";
360+
for (enode* p : enode_parents(n))
361+
out << p->get_owner_id() << " ";
362+
out << "\n";
363+
return out;
364+
}
365+
344366
std::ostream& egraph::display(std::ostream& out) const {
345367
m_table.display(out);
346368
unsigned max_args = 0;
347369
for (enode* n : m_nodes)
348370
max_args = std::max(max_args, n->num_args());
349371

350372
for (enode* n : m_nodes) {
351-
out << std::setw(5)
352-
<< n->get_owner_id() << " := ";
353-
out << n->get_root()->get_owner_id() << " ";
354-
expr* f = n->get_owner();
355-
if (is_app(f))
356-
out << to_app(f)->get_decl()->get_name() << " ";
357-
else if (is_quantifier(f))
358-
out << "q ";
359-
else
360-
out << "v ";
361-
for (enode* arg : enode_args(n))
362-
out << arg->get_owner_id() << " ";
363-
for (unsigned i = n->num_args(); i < max_args; ++i)
364-
out << " ";
365-
out << "\t";
366-
for (enode* p : enode_parents(n))
367-
out << p->get_owner_id() << " ";
368-
out << "\n";
373+
display(out, max_args, n);
369374
}
370375
return out;
371376
}
@@ -392,16 +397,16 @@ namespace euf {
392397
}
393398
expr* e2 = tr(e1);
394399
enode* n2 = mk(e2, args.size(), args.c_ptr());
395-
m_exprs.push_back(e2);
396-
m_nodes.push_back(n2);
397400
old_expr2new_enode.setx(e1->get_id(), n2, nullptr);
398401
}
399-
for (unsigned i = 0; i < src.m_nodes.size(); ++i) {
402+
for (unsigned i = 0; i < src.m_nodes.size(); ++i) {
400403
enode* n1 = src.m_nodes[i];
401-
enode* n1t = n1->m_target;
404+
enode* n1t = n1->m_target;
402405
enode* n2 = m_nodes[i];
403-
enode* n2t = n1t ? old_expr2new_enode[n1t->get_owner_id()] : nullptr;
406+
enode* n2t = n1t ? old_expr2new_enode[n1->get_owner_id()] : nullptr;
404407
SASSERT(!n1t || n2t);
408+
SASSERT(!n1t || src.m.get_sort(n1->get_owner()) == src.m.get_sort(n1t->get_owner()));
409+
SASSERT(!n1t || m.get_sort(n2->get_owner()) == m.get_sort(n2t->get_owner()));
405410
if (n1t && n2->get_root() != n2t->get_root()) {
406411
merge(n2, n2t, n1->m_justification.copy(copy_justification));
407412
}

src/ast/euf/euf_egraph.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ namespace euf {
101101
}
102102
template <typename T>
103103
void explain_todo(ptr_vector<T>& justifications);
104+
105+
std::ostream& display(std::ostream& out, unsigned max_args, enode* n) const;
104106

105107
public:
106108
egraph(ast_manager& m): m(m), m_table(m), m_exprs(m) {}
@@ -140,9 +142,17 @@ namespace euf {
140142
enode_vector const& nodes() const { return m_nodes; }
141143
void invariant();
142144
void copy_from(egraph const& src, std::function<void*(void*)>& copy_justification);
143-
std::ostream& display(std::ostream& out) const;
145+
struct e_pp {
146+
egraph const& g;
147+
enode* n;
148+
e_pp(egraph const& g, enode* n) : g(g), n(n) {}
149+
std::ostream& display(std::ostream& out) const { return g.display(out, 0, n); }
150+
};
151+
e_pp pp(enode* n) const { return e_pp(*this, n); }
152+
std::ostream& display(std::ostream& out) const;
144153
void collect_statistics(statistics& st) const;
145154
};
146155

147156
inline std::ostream& operator<<(std::ostream& out, egraph const& g) { return g.display(out); }
157+
inline std::ostream& operator<<(std::ostream& out, egraph::e_pp const& p) { return p.display(out); }
148158
}

src/sat/smt/euf_solver.cpp

Lines changed: 51 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ namespace euf {
3232
* retrieve extension that is associated with Boolean variable.
3333
*/
3434
sat::th_solver* solver::get_solver(sat::bool_var v) {
35-
if (v >= m_var2node.size())
35+
unsigned idx = literal(v, false).index();
36+
if (idx >= m_lit2node.size())
3637
return nullptr;
37-
euf::enode* n = m_var2node[v].first;
38+
euf::enode* n = m_lit2node[idx];
3839
if (!n)
3940
return nullptr;
4041
return get_solver(n->get_owner());
@@ -53,6 +54,8 @@ namespace euf {
5354
auto* ext = m_id2solver.get(fid, nullptr);
5455
if (ext)
5556
return ext;
57+
if (fid == m.get_basic_family_id())
58+
return nullptr;
5659
pb_util pb(m);
5760
if (pb.get_family_id() == fid) {
5861
ext = alloc(sat::ba_solver, m, si);
@@ -74,8 +77,11 @@ namespace euf {
7477
}
7578

7679
void solver::unhandled_function(func_decl* f) {
80+
if (m_unhandled_functions.contains(f))
81+
return;
82+
m_unhandled_functions.push_back(f);
83+
m_trail.push_back(new (m_region) push_back_vector<solver, func_decl_ref_vector>(m_unhandled_functions));
7784
IF_VERBOSE(0, verbose_stream() << mk_pp(f, m) << " not handled\n");
78-
// TBD: set some state with the unhandled function.
7985
}
8086

8187
bool solver::propagate(literal l, ext_constraint_idx idx) {
@@ -88,16 +94,14 @@ namespace euf {
8894
void solver::get_antecedents(literal l, ext_justification_idx idx, literal_vector& r) {
8995
auto* ext = sat::constraint_base::to_extension(idx);
9096
if (ext == this)
91-
get_antecedents(l, *constraint::from_idx(idx), r);
97+
get_antecedents(l, constraint::from_idx(idx), r);
9298
else
9399
ext->get_antecedents(l, idx, r);
94100
}
95101

96102
void solver::get_antecedents(literal l, constraint& j, literal_vector& r) {
97103
m_explain.reset();
98104
euf::enode* n = nullptr;
99-
bool sign = false;
100-
enode_bool_pair p;
101105

102106
// init_ackerman();
103107

@@ -107,20 +111,19 @@ namespace euf {
107111
m_egraph.explain<unsigned>(m_explain);
108112
break;
109113
case constraint::kind_t::eq:
110-
n = m_var2node[l.var()].first;
114+
n = m_lit2node[l.index()];
111115
SASSERT(n);
112116
SASSERT(m_egraph.is_equality(n));
113117
m_egraph.explain_eq<unsigned>(m_explain, n->get_arg(0), n->get_arg(1), n->commutative());
114118
break;
115119
case constraint::kind_t::lit:
116-
p = m_var2node[l.var()];
117-
n = p.first;
118-
sign = l.sign() != p.second;
120+
n = m_lit2node[l.index()];
119121
SASSERT(n);
120122
SASSERT(m.is_bool(n->get_owner()));
121-
m_egraph.explain_eq<unsigned>(m_explain, n, (sign ? mk_false() : mk_true()), false);
123+
m_egraph.explain_eq<unsigned>(m_explain, n, (l.sign() ? mk_false() : mk_true()), false);
122124
break;
123125
default:
126+
std::cout << (unsigned)j.kind() << "\n";
124127
UNREACHABLE();
125128
}
126129
for (unsigned* idx : m_explain)
@@ -135,20 +138,22 @@ namespace euf {
135138
return;
136139
}
137140

138-
auto p = m_var2node.get(l.var(), enode_bool_pair(nullptr, false));
139-
if (!p.first)
141+
bool sign = l.sign();
142+
unsigned idx = sat::literal(l.var(), false).index();
143+
auto n = m_lit2node.get(idx, nullptr);
144+
if (!n)
140145
return;
141146
force_push();
142-
bool sign = p.second != l.sign();
143-
euf::enode* n = p.first;
147+
144148
expr* e = n->get_owner();
145149
if (m.is_eq(e) && !sign) {
146150
euf::enode* na = n->get_arg(0);
147151
euf::enode* nb = n->get_arg(1);
148152
m_egraph.merge(na, nb, base_ptr() + l.index());
149153
}
150-
else {
154+
else {
151155
euf::enode* nb = sign ? mk_false() : mk_true();
156+
std::cout << "merge " << n->get_owner_id() << " " << sign << " " << nb->get_owner_id() << "\n";
152157
m_egraph.merge(n, nb, base_ptr() + l.index());
153158
}
154159
// TBD: delay propagation?
@@ -216,39 +221,36 @@ namespace euf {
216221
}
217222

218223
void solver::push() {
219-
++m_num_scopes;
224+
scope s;
225+
s.m_lit_lim = m_lit_trail.size();
226+
s.m_trail_lim = m_trail.size();
227+
m_scopes.push_back(s);
228+
m_region.push_scope();
229+
for (auto* e : m_solvers)
230+
e->push();
231+
m_egraph.push();
220232
}
221233

222234
void solver::force_push() {
223235
for (; m_num_scopes > 0; --m_num_scopes) {
224-
scope s;
225-
s.m_bool_var_lim = m_bool_var_trail.size();
226-
s.m_trail_lim = m_trail.size();
227-
m_scopes.push_back(s);
228-
for (auto* e : m_solvers)
229-
e->push();
230-
m_egraph.push();
236+
231237
}
232238
}
233239

234240
void solver::pop(unsigned n) {
235-
if (n <= m_num_scopes) {
236-
m_num_scopes -= n;
237-
return;
238-
}
239-
n -= m_num_scopes;
240241
m_egraph.pop(n);
241242
for (auto* e : m_solvers)
242243
e->pop(n);
243244

244-
scope & s = m_scopes[m_scopes.size() - n];
245+
scope const & s = m_scopes[m_scopes.size() - n];
245246

246-
for (unsigned i = m_bool_var_trail.size(); i-- > s.m_bool_var_lim; )
247-
m_var2node[m_bool_var_trail[i]] = enode_bool_pair(nullptr, false);
248-
m_bool_var_trail.shrink(s.m_bool_var_lim);
247+
for (unsigned i = m_lit_trail.size(); i-- > s.m_lit_lim; )
248+
m_lit2node[m_lit_trail[i]] = nullptr;
249+
m_lit_trail.shrink(s.m_lit_lim);
249250

250251
undo_trail_stack(*this, m_trail, s.m_trail_lim);
251-
252+
253+
m_region.pop_scope(n);
252254
m_scopes.shrink(m_scopes.size() - n);
253255
}
254256

@@ -278,6 +280,10 @@ namespace euf {
278280

279281
std::ostream& solver::display(std::ostream& out) const {
280282
m_egraph.display(out);
283+
for (unsigned idx : m_lit_trail) {
284+
euf::enode* n = m_lit2node[idx];
285+
out << sat::to_literal(idx) << ": " << m_egraph.pp(n);
286+
}
281287
for (auto* e : m_solvers)
282288
e->display(out);
283289
return out;
@@ -363,8 +369,8 @@ namespace euf {
363369
unsigned solver::max_var(unsigned w) const {
364370
for (auto* e : m_solvers)
365371
w = e->max_var(w);
366-
for (unsigned sz = m_var2node.size(); sz-- > 0; ) {
367-
euf::enode* n = m_var2node[sz].first;
372+
for (unsigned sz = m_lit2node.size(); sz-- > 0; ) {
373+
euf::enode* n = m_lit2node[sz];
368374
if (n && m.is_bool(n->get_owner())) {
369375
w = std::max(w, sz);
370376
break;
@@ -452,13 +458,12 @@ namespace euf {
452458
return n;
453459
if (si.is_bool_op(e)) {
454460
sat::literal lit = si.internalize(e);
455-
enode_bool_pair bp(nullptr, false);
456-
n = m_var2node.get(lit.var(), bp).first;
461+
n = m_lit2node.get(lit.index(), nullptr);
457462
if (n)
458463
return n;
459464

460465
n = m_egraph.mk(e, 0, nullptr);
461-
attach_bool_var(lit.var(), lit.sign(), n);
466+
attach_lit(lit, n);
462467
if (!m.is_true(e) && !m.is_false(e))
463468
s().set_external(lit.var());
464469
return n;
@@ -476,15 +481,16 @@ namespace euf {
476481
expr* e = n->get_owner();
477482
if (m.is_bool(e)) {
478483
sat::bool_var v = si.add_bool_var(e);
479-
attach_bool_var(v, false, n);
484+
attach_lit(literal(v, false), n);
480485
}
481486
}
482487

483-
void solver::attach_bool_var(sat::bool_var v, bool sign, euf::enode* n) {
484-
m_var2node.reserve(v + 1, enode_bool_pair(nullptr, false));
485-
SASSERT(m_var2node[v].first == nullptr);
486-
m_var2node[v] = euf::enode_bool_pair(n, sign);
487-
m_bool_var_trail.push_back(v);
488+
void solver::attach_lit(literal lit, euf::enode* n) {
489+
unsigned v = lit.index();
490+
m_lit2node.reserve(v + 1, nullptr);
491+
SASSERT(m_lit2node[v] == nullptr);
492+
m_lit2node[v] = n;
493+
m_lit_trail.push_back(v);
488494
}
489495

490496
bool solver::to_formulas(std::function<expr_ref(sat::literal)>& l2e, expr_ref_vector& fmls) {

0 commit comments

Comments
 (0)