mirror of
https://github.com/Z3Prover/z3
synced 2025-06-07 06:33:23 +00:00
Dump benchmarks in pool_solver
This commit is contained in:
parent
b50da20531
commit
bebfac047e
1 changed files with 59 additions and 41 deletions
|
@ -32,8 +32,11 @@ class pool_solver : public solver_na2as {
|
||||||
expr_ref_vector m_flat;
|
expr_ref_vector m_flat;
|
||||||
bool m_pushed;
|
bool m_pushed;
|
||||||
bool m_in_delayed_scope;
|
bool m_in_delayed_scope;
|
||||||
|
bool m_dump_benchmarks;
|
||||||
|
double m_dump_threshold;
|
||||||
unsigned m_dump_counter;
|
unsigned m_dump_counter;
|
||||||
|
|
||||||
|
|
||||||
bool is_virtual() const { return !m.is_true(m_pred); }
|
bool is_virtual() const { return !m.is_true(m_pred); }
|
||||||
public:
|
public:
|
||||||
pool_solver(solver* b, solver_pool& pool, app_ref& pred):
|
pool_solver(solver* b, solver_pool& pool, app_ref& pred):
|
||||||
|
@ -47,10 +50,13 @@ public:
|
||||||
m_flat(m),
|
m_flat(m),
|
||||||
m_pushed(false),
|
m_pushed(false),
|
||||||
m_in_delayed_scope(false),
|
m_in_delayed_scope(false),
|
||||||
|
m_dump_benchmarks(false),
|
||||||
|
m_dump_threshold(5.0),
|
||||||
m_dump_counter(0) {
|
m_dump_counter(0) {
|
||||||
if (is_virtual()) {
|
if (is_virtual()) {
|
||||||
solver_na2as::assert_expr_core2(m.mk_true(), pred);
|
solver_na2as::assert_expr_core2(m.mk_true(), pred);
|
||||||
}
|
}
|
||||||
|
updt_params(m_base->get_params());
|
||||||
}
|
}
|
||||||
|
|
||||||
~pool_solver() override {
|
~pool_solver() override {
|
||||||
|
@ -64,7 +70,11 @@ public:
|
||||||
solver* base_solver() { return m_base.get(); }
|
solver* base_solver() { return m_base.get(); }
|
||||||
|
|
||||||
solver* translate(ast_manager& m, params_ref const& p) override { UNREACHABLE(); return nullptr; }
|
solver* translate(ast_manager& m, params_ref const& p) override { UNREACHABLE(); return nullptr; }
|
||||||
void updt_params(params_ref const& p) override { solver::updt_params(p); m_base->updt_params(p); }
|
void updt_params(params_ref const& p) override {
|
||||||
|
solver::updt_params(p); m_base->updt_params(p);
|
||||||
|
m_dump_benchmarks = solver::get_params().get_bool("dump_benchmarks", false);
|
||||||
|
m_dump_threshold = solver::get_params().get_double("dump_threshold", 5.0);
|
||||||
|
}
|
||||||
void push_params() override {m_base->push_params();}
|
void push_params() override {m_base->push_params();}
|
||||||
void pop_params() override {m_base->pop_params();}
|
void pop_params() override {m_base->pop_params();}
|
||||||
|
|
||||||
|
@ -132,8 +142,10 @@ public:
|
||||||
}
|
}
|
||||||
set_status(res);
|
set_status(res);
|
||||||
|
|
||||||
if (false /*m_dump_benchmarks && sw.get_seconds() >= m_pool.fparams().m_dump_min_time*/) {
|
if (m_dump_benchmarks && sw.get_seconds() >= m_dump_threshold) {
|
||||||
dump_benchmark(num_assumptions, assumptions, res, sw);
|
expr_ref_vector cube(m, num_assumptions, assumptions);
|
||||||
|
expr_ref_vector clause(m);
|
||||||
|
dump_benchmark(cube, clause, res, sw.get_seconds());
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -164,9 +176,9 @@ public:
|
||||||
}
|
}
|
||||||
set_status(res);
|
set_status(res);
|
||||||
|
|
||||||
// if (false /*m_dump_benchmarks && sw.get_seconds() >= m_pool.fparams().m_dump_min_time*/) {
|
if (m_dump_benchmarks && sw.get_seconds() >= m_dump_threshold) {
|
||||||
// dump_benchmark(num_assumptions, assumptions, res, sw);
|
dump_benchmark(cube, clause, res, sw.get_seconds());
|
||||||
// }
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,7 +265,8 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void dump_benchmark(unsigned num_assumptions, expr * const * assumptions, lbool res, stopwatch& sw) {
|
void dump_benchmark(const expr_ref_vector &cube, const expr_ref_vector &clause,
|
||||||
|
lbool last_status, double last_time) {
|
||||||
std::string file_name = mk_file_name();
|
std::string file_name = mk_file_name();
|
||||||
std::ofstream out(file_name);
|
std::ofstream out(file_name);
|
||||||
if (!out) {
|
if (!out) {
|
||||||
|
@ -261,17 +274,23 @@ private:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
out << "(set-info :status " << lbool2status(res) << ")\n";
|
out << "(set-info :status " << lbool2status(last_status) << ")\n";
|
||||||
m_base->display(out, num_assumptions, assumptions);
|
m_base->display(out, cube.size(), cube.c_ptr());
|
||||||
out << "(check-sat";
|
if (!clause.empty()) {
|
||||||
for (unsigned i = 0; i < num_assumptions; ++i) {
|
out << ";; extra clause\n";
|
||||||
out << " " << mk_pp(assumptions[i], m);
|
out << "(assert (or ";
|
||||||
|
for (auto *lit : clause) out << mk_pp(lit, m) << " ";
|
||||||
|
out << "))\n";
|
||||||
}
|
}
|
||||||
out << ")";
|
|
||||||
|
out << "(check-sat";
|
||||||
|
for (auto * lit : cube) out << " " << mk_pp(lit, m);
|
||||||
|
out << ")\n";
|
||||||
|
|
||||||
out << "(exit)\n";
|
out << "(exit)\n";
|
||||||
::statistics st;
|
::statistics st;
|
||||||
m_base->collect_statistics(st);
|
m_base->collect_statistics(st);
|
||||||
st.update("time", sw.get_seconds());
|
st.update("time", last_time);
|
||||||
st.display_smt2(out);
|
st.display_smt2(out);
|
||||||
out.close();
|
out.close();
|
||||||
}
|
}
|
||||||
|
@ -287,7 +306,7 @@ private:
|
||||||
|
|
||||||
std::string mk_file_name() {
|
std::string mk_file_name() {
|
||||||
std::stringstream file_name;
|
std::stringstream file_name;
|
||||||
file_name << "virt_solver";
|
file_name << "pool_solver";
|
||||||
if (is_virtual()) file_name << "_" << m_pred->get_decl()->get_name();
|
if (is_virtual()) file_name << "_" << m_pred->get_decl()->get_name();
|
||||||
file_name << "_" << (m_dump_counter++) << ".smt2";
|
file_name << "_" << (m_dump_counter++) << ".smt2";
|
||||||
return file_name.str();
|
return file_name.str();
|
||||||
|
@ -317,8 +336,7 @@ ptr_vector<solver> solver_pool::get_base_solvers() const {
|
||||||
|
|
||||||
void solver_pool::updt_params(const params_ref &p) {
|
void solver_pool::updt_params(const params_ref &p) {
|
||||||
m_base_solver->updt_params(p);
|
m_base_solver->updt_params(p);
|
||||||
ptr_vector<solver> solvers = get_base_solvers();
|
for (solver *s : m_solvers) s->updt_params(p);
|
||||||
for (solver *s : solvers) s->updt_params(p);
|
|
||||||
}
|
}
|
||||||
void solver_pool::collect_statistics(statistics &st) const {
|
void solver_pool::collect_statistics(statistics &st) const {
|
||||||
ptr_vector<solver> solvers = get_base_solvers();
|
ptr_vector<solver> solvers = get_base_solvers();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue