mirror of
https://github.com/Z3Prover/z3
synced 2025-10-09 09:21:56 +00:00
simplify
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
ec9a01cd6e
commit
9f72a95e9e
1 changed files with 0 additions and 69 deletions
|
@ -79,11 +79,6 @@ namespace nlsat {
|
||||||
std::vector<property> m_to_refine;
|
std::vector<property> m_to_refine;
|
||||||
std::vector<symbolic_interval> m_I; // intervals per level (indexed by variable/level)
|
std::vector<symbolic_interval> m_I; // intervals per level (indexed by variable/level)
|
||||||
bool m_fail = false;
|
bool m_fail = false;
|
||||||
// Property precedence relation stored as pairs (lesser, greater)
|
|
||||||
std::vector<std::pair<prop_enum, prop_enum>> m_p_relation;
|
|
||||||
// Transitive closure matrix: dom[a][b] == true iff a ▹ b (a strictly dominates b).
|
|
||||||
// Invert edges when populating dom: greater ▹ lesser.
|
|
||||||
std::vector<std::vector<bool>> m_prop_dom;
|
|
||||||
|
|
||||||
assignment const & sample() const { return m_solver.sample();}
|
assignment const & sample() const { return m_solver.sample();}
|
||||||
assignment & sample() { return m_solver.sample(); }
|
assignment & sample() { return m_solver.sample(); }
|
||||||
|
@ -94,7 +89,6 @@ namespace nlsat {
|
||||||
TRACE(levelwise, tout << "m_n:" << m_n << "\n";);
|
TRACE(levelwise, tout << "m_n:" << m_n << "\n";);
|
||||||
m_I.resize(m_n);
|
m_I.resize(m_n);
|
||||||
m_Q.resize(m_n+1);
|
m_Q.resize(m_n+1);
|
||||||
init_property_relation();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,62 +110,6 @@ namespace nlsat {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Z3DEBUG
|
|
||||||
bool check_prop_init() {
|
|
||||||
for (unsigned k = 0; k < prop_count(); ++k)
|
|
||||||
if (m_prop_dom[k][k])
|
|
||||||
return false;
|
|
||||||
return !dominates(prop_enum::ord_inv_irreducible, prop_enum::non_null);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void init_property_relation() {
|
|
||||||
m_p_relation.clear();
|
|
||||||
auto add = [&](prop_enum lesser, prop_enum greater) { m_p_relation.emplace_back(lesser, greater); };
|
|
||||||
// m_p_relation stores edges (lesser -> greater).
|
|
||||||
// The edges below follow Figure 8. Examples include: an_del -> ir_ord, sample -> ir_ord.
|
|
||||||
add(prop_enum::holds, prop_enum::repr);
|
|
||||||
add(prop_enum::repr, prop_enum::sample);
|
|
||||||
add(prop_enum::sample, prop_enum::an_sub);
|
|
||||||
add(prop_enum::an_sub, prop_enum::connected);
|
|
||||||
// connected < sgn_inv_*
|
|
||||||
add(prop_enum::connected, prop_enum::sgn_inv_reducible);
|
|
||||||
add(prop_enum::connected, prop_enum::sgn_inv_irreducible);
|
|
||||||
// sgn_inv_* < ord_inv_* (same reducibility)
|
|
||||||
add(prop_enum::sgn_inv_reducible, prop_enum::ord_inv_reducible);
|
|
||||||
add(prop_enum::sgn_inv_irreducible, prop_enum::ord_inv_irreducible);
|
|
||||||
// ord_inv_* < non_null
|
|
||||||
|
|
||||||
add(prop_enum::ord_inv_reducible, prop_enum::non_null);
|
|
||||||
add(prop_enum::ord_inv_irreducible, prop_enum::non_null);
|
|
||||||
// non_null < an_del
|
|
||||||
add(prop_enum::non_null, prop_enum::an_del);
|
|
||||||
// an_del < ir_ord
|
|
||||||
add(prop_enum::an_del, prop_enum::ir_ord);
|
|
||||||
// Additional explicit edge from Fig 8
|
|
||||||
add(prop_enum::sample, prop_enum::ir_ord);
|
|
||||||
|
|
||||||
// Build transitive closure matrix for quick comparisons
|
|
||||||
unsigned N = prop_count();
|
|
||||||
m_prop_dom.assign(N, std::vector<bool>(N, false));
|
|
||||||
for (auto const& pr : m_p_relation) {
|
|
||||||
unsigned lesser = static_cast<unsigned>(pr.first);
|
|
||||||
unsigned greater = static_cast<unsigned>(pr.second);
|
|
||||||
// Build dominance relation as: greater ▹ lesser
|
|
||||||
m_prop_dom[greater][lesser] = true;
|
|
||||||
}
|
|
||||||
// Floyd-Warshall style closure on a tiny fixed-size set
|
|
||||||
for (unsigned k = 0; k < N; ++k)
|
|
||||||
for (unsigned i = 0; i < N; ++i)
|
|
||||||
if (m_prop_dom[i][k])
|
|
||||||
for (unsigned j = 0; j < N; ++j)
|
|
||||||
if (m_prop_dom[k][j])
|
|
||||||
m_prop_dom[i][j] = true;
|
|
||||||
|
|
||||||
#ifdef Z3DEBUG
|
|
||||||
SASSERT(check_prop_init());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Short: build the initial property set Q so the one-cell algorithm can generalize the
|
Short: build the initial property set Q so the one-cell algorithm can generalize the
|
||||||
|
@ -734,13 +672,6 @@ or
|
||||||
return m_I; // the order of intervals is reversed
|
return m_I; // the order of intervals is reversed
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dominates(const property& a, const property& b) const {
|
|
||||||
return a.poly == b.poly && dominates(a.prop_tag, b.prop_tag);
|
|
||||||
}
|
|
||||||
bool dominates(prop_enum a, prop_enum b) const {
|
|
||||||
return m_prop_dom[static_cast<unsigned>(a)][static_cast<unsigned>(b)];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pretty-print helpers
|
// Pretty-print helpers
|
||||||
static const char* prop_name(prop_enum p) {
|
static const char* prop_name(prop_enum p) {
|
||||||
switch (p) {
|
switch (p) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue