3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-29 11:55:51 +00:00

memory throttling (#108)

* fixes to use list bookkeeping

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>

* fix reset logic

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>

* fix non-termination bug in simplifier

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>

* missing reset of values

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>

* add configuration to throttle memory usage

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-12-30 14:13:41 -08:00 committed by Lev Nachmanson
parent 361964f173
commit a9a602c1aa
4 changed files with 49 additions and 11 deletions

View file

@ -1419,13 +1419,40 @@ void core::run_pdd_grobner() {
for (unsigned i : m_rows) {
add_row_to_pdd_grobner(m_lar_solver.A_r().m_rows[i]);
}
// configure grobner
// TBD: move this code somewhere self-contained, and tune it.
double tree_size = 100;
for (auto* e : m_pdd_grobner.equations()) {
tree_size = std::max(tree_size, e->poly().tree_size());
}
tree_size *= 10;
struct dd::grobner::config cfg;
cfg.m_expr_size_limit = (unsigned)tree_size;
cfg.m_eqs_threshold = m_pdd_grobner.equations().size()*5;
cfg.m_max_steps = m_pdd_grobner.equations().size();
m_pdd_grobner = cfg;
m_pdd_manager.set_max_num_nodes(10000); // or something proportional to the number of initial nodes.
m_pdd_grobner.saturate();
bool conflict = false;
for (auto eq : m_pdd_grobner.equations()) {
check_pdd_eq(eq);
if (check_pdd_eq(eq)) {
conflict = true;
break;
}
}
if (conflict) {
IF_VERBOSE(2, verbose_stream() << "grobner conflict\n");
}
else {
IF_VERBOSE(2, verbose_stream() << "grobner miss\n");
}
}
void core::check_pdd_eq(const dd::grobner::equation* e) {
bool core::check_pdd_eq(const dd::grobner::equation* e) {
dd::pdd_interval eval(m_pdd_manager, m_reslim);
eval.var2interval() =
[this](lpvar j, bool deps) {
@ -1437,7 +1464,7 @@ void core::check_pdd_eq(const dd::grobner::equation* e) {
auto i = eval.get_interval<dd::w_dep::without_deps>(e->poly());
dep_intervals di(m_reslim);
if (!di.separated_from_zero(i))
return;
return false;
auto i_wd = eval.get_interval<dd::w_dep::with_deps>(e->poly());
std::function<void (const lp::explanation&)> f = [this](const lp::explanation& e) {
add_empty_lemma();
@ -1445,10 +1472,10 @@ void core::check_pdd_eq(const dd::grobner::equation* e) {
};
if (di.check_interval_for_conflict_on_zero(i_wd, e->dep(), f)) {
lp_settings().stats().m_grobner_conflicts++;
IF_VERBOSE(2, verbose_stream() << "grobner conflict\n");
return true;
}
else {
IF_VERBOSE(2, verbose_stream() << "grobner miss\n");
return false;
}
}

View file

@ -401,7 +401,7 @@ public:
void set_active_vars_weights(nex_creator&);
unsigned get_var_weight(lpvar) const;
void add_row_to_pdd_grobner(const vector<lp::row_cell<rational>> & row);
void check_pdd_eq(const dd::grobner::equation*);
bool check_pdd_eq(const dd::grobner::equation*);
dd::pdd pdd_expr(const rational& c, lpvar j, u_dependency*&);
void set_level2var_for_pdd_grobner();
}; // end of core