mirror of
https://github.com/Z3Prover/z3
synced 2025-12-13 15:16:23 +00:00
t
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
63db413a86
commit
5f6de08b5d
3 changed files with 78 additions and 21 deletions
|
|
@ -65,8 +65,9 @@ namespace nlsat {
|
||||||
|
|
||||||
// max_x plays the role of n in algorith 1 of the levelwise paper.
|
// max_x plays the role of n in algorith 1 of the levelwise paper.
|
||||||
impl(solver& solver, polynomial_ref_vector const& ps, var max_x, assignment const& s, pmanager& pm, anum_manager& am)
|
impl(solver& solver, polynomial_ref_vector const& ps, var max_x, assignment const& s, pmanager& pm, anum_manager& am)
|
||||||
: m_solver(solver), m_P(ps), m_n(max_x), m_pm(pm), m_am(am) {
|
: m_solver(solver), m_P(ps), m_n(max_x), m_pm(pm), m_am(am) {
|
||||||
TRACE(levelwise, tout << "m_n:" << m_n << "\n";);
|
TRACE(levelwise, tout << "m_n:" << m_n << "\n";);
|
||||||
|
m_I.resize(max_x);
|
||||||
init_property_relation();
|
init_property_relation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -347,7 +348,7 @@ namespace nlsat {
|
||||||
std::vector<indexed_root_expr> E;
|
std::vector<indexed_root_expr> E;
|
||||||
collect_E_and_roots(p_non_null, i, E, roots);
|
collect_E_and_roots(p_non_null, i, E, roots);
|
||||||
// Ensure m_I can hold interval for this level
|
// Ensure m_I can hold interval for this level
|
||||||
if (m_I.size() <= i) m_I.resize(i+1);
|
SASSERT(m_I.size() > i);
|
||||||
std::sort(roots.begin(), roots.end(), [&](root_item_t const& a, root_item_t const& b){
|
std::sort(roots.begin(), roots.end(), [&](root_item_t const& a, root_item_t const& b){
|
||||||
return m_am.lt(a.val, b.val);
|
return m_am.lt(a.val, b.val);
|
||||||
});
|
});
|
||||||
|
|
@ -684,25 +685,46 @@ namespace nlsat {
|
||||||
erase_from_Q(p);
|
erase_from_Q(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The property repr(I, s) holds on R if and only if I.l ∈ irExpr(I.l.p, s) (if I.l ̸= −∞), I.u ∈ irExpr(I.u.p, s)
|
||||||
|
(if I.u ̸= ∞) respectively I.b ∈ irExpr(I.b.p, s) and one of the following holds:
|
||||||
|
• I = (sector, l, u), dom(θl,s ) ∩ dom(θu,s ) ⊇ R ↓[i−1] and R = {(r, r′) | r ∈ R ↓[i−1], r′ ∈ (θl,s (r), θu,s (r))};
|
||||||
|
or
|
||||||
|
• I = (sector, −∞, u), dom(θu,s ) ⊇ R ↓[i−1] and R = {(r, r′) | r ∈ R ↓[i−1], r′ ∈ (−∞, θu,s (r))}; or
|
||||||
|
• I = (sector, l, ∞), dom(θl,s ) ⊇ R ↓[i−1] and R = {(r, r′) | r ∈ R ↓[i−1], r′ ∈ (θl,s (r), ∞)}; or
|
||||||
|
• I = (sector, −∞, ∞) and R = {(r, r′) | r ∈ R ↓[i−1], r′ ∈ R}; or
|
||||||
|
• I = (section, b), dom(θb,s ) ⊇ R ↓[i−1] and R = {(r, r′) | r ∈ R ↓[i−1], r′
|
||||||
|
= θb,s (r)},
|
||||||
|
*/
|
||||||
|
void apply_pre_repr(const property& p) {
|
||||||
|
const auto& I = m_I[p.level];
|
||||||
|
TRACE(levelwise, display(tout << "interval m_I[" << p.level << "]\n", I) << "\n";);
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
}
|
||||||
|
|
||||||
void apply_pre(const property& p, bool has_repr) {
|
void apply_pre(const property& p, bool has_repr) {
|
||||||
TRACE(levelwise, tout << "apply_pre BEGIN m_Q:"; display(tout) << std::endl;
|
TRACE(levelwise, tout << "apply_pre BEGIN m_Q:"; display(tout) << std::endl;
|
||||||
display(tout << "pre p:", p) << std::endl;);
|
display(tout << "pre p:", p) << std::endl;);
|
||||||
switch (p.prop_tag) {
|
switch (p.prop_tag) {
|
||||||
case prop_enum::an_del:
|
case prop_enum::an_del:
|
||||||
apply_pre_an_del(p);
|
apply_pre_an_del(p);
|
||||||
break;
|
break;
|
||||||
case prop_enum::connected:
|
case prop_enum::connected:
|
||||||
apply_pre_connected(p, has_repr);
|
apply_pre_connected(p, has_repr);
|
||||||
break;
|
break;
|
||||||
case prop_enum::non_null:
|
case prop_enum::non_null:
|
||||||
apply_pre_non_null(p);
|
apply_pre_non_null(p);
|
||||||
break;
|
break;
|
||||||
case prop_enum::an_sub:
|
case prop_enum::an_sub:
|
||||||
apply_pre_an_sub(p);
|
apply_pre_an_sub(p);
|
||||||
break;
|
break;
|
||||||
default:
|
case prop_enum::repr:
|
||||||
NOT_IMPLEMENTED_YET();
|
apply_pre_repr(p);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
TRACE(levelwise, display(tout << "not impl: p", p));
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
TRACE(levelwise, tout << "apply_pre END m_Q:"; display(tout) << std::endl;);
|
TRACE(levelwise, tout << "apply_pre END m_Q:"; display(tout) << std::endl;);
|
||||||
}
|
}
|
||||||
|
|
@ -775,6 +797,37 @@ namespace nlsat {
|
||||||
out << "}";
|
out << "}";
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::ostream& display(std::ostream& out, const indexed_root_expr& ire ) const {
|
||||||
|
out << "RootExpr: p=";
|
||||||
|
::nlsat::display(out, m_solver, ire.p);
|
||||||
|
out << ", i=" << ire.i;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& display(std::ostream& out, const symbolic_interval& I) const {
|
||||||
|
if (I.section) {
|
||||||
|
out << "Section:\n";
|
||||||
|
if (I.l == nullptr)
|
||||||
|
out << "not defined\n";
|
||||||
|
else
|
||||||
|
::nlsat::display(out, m_solver, I.l);
|
||||||
|
} else {
|
||||||
|
out << "Sector: (";
|
||||||
|
if (I.l_inf())
|
||||||
|
out << "-oo,";
|
||||||
|
else
|
||||||
|
::nlsat::display(out, m_solver, I.l) << ",";
|
||||||
|
if (I.u_inf())
|
||||||
|
out << "+oo)";
|
||||||
|
else
|
||||||
|
::nlsat::display(out, m_solver, I.u) << ")";
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
// constructor
|
// constructor
|
||||||
levelwise::levelwise(nlsat::solver& solver, polynomial_ref_vector const& ps, var n, assignment const& s, pmanager& pm, anum_manager& am)
|
levelwise::levelwise(nlsat::solver& solver, polynomial_ref_vector const& ps, var n, assignment const& s, pmanager& pm, anum_manager& am)
|
||||||
|
|
@ -783,7 +836,7 @@ namespace nlsat {
|
||||||
levelwise::~levelwise() { delete m_impl; }
|
levelwise::~levelwise() { delete m_impl; }
|
||||||
|
|
||||||
std::vector<levelwise::symbolic_interval> levelwise::single_cell() {
|
std::vector<levelwise::symbolic_interval> levelwise::single_cell() {
|
||||||
return m_impl->single_cell();
|
return m_impl->single_cell();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace nlsat
|
} // namespace nlsat
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ namespace nlsat {
|
||||||
unsigned i;
|
unsigned i;
|
||||||
};
|
};
|
||||||
struct symbolic_interval {
|
struct symbolic_interval {
|
||||||
bool section = true;
|
bool section = false;
|
||||||
poly* l = nullptr;
|
poly* l = nullptr;
|
||||||
unsigned l_index; // the root index
|
unsigned l_index; // the root index
|
||||||
poly* u = nullptr;
|
poly* u = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,10 @@ namespace nlsat {
|
||||||
return display(out, s.pm(), p, s.display_proc());
|
return display(out, s.pm(), p, s.display_proc());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline std::ostream& display(std::ostream& out, solver& s, poly* p) {
|
||||||
|
return display(out, s.pm(), polynomial_ref(p, s.pm()), s.display_proc());
|
||||||
|
}
|
||||||
|
|
||||||
inline std::ostream& display(std::ostream& out, solver& s, polynomial_ref_vector const& ps, char const* delim = "\n") {
|
inline std::ostream& display(std::ostream& out, solver& s, polynomial_ref_vector const& ps, char const* delim = "\n") {
|
||||||
return display(out, s.pm(), ps, s.display_proc(), delim);
|
return display(out, s.pm(), ps, s.display_proc(), delim);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue