diff --git a/src/cmd_context/tactic_cmds.cpp b/src/cmd_context/tactic_cmds.cpp index c183a816c..f1a8dee04 100644 --- a/src/cmd_context/tactic_cmds.cpp +++ b/src/cmd_context/tactic_cmds.cpp @@ -232,7 +232,9 @@ public: } ctx.validate_check_sat_result(r); } - t.collect_statistics(result->m_stats); + statistics stats; + t.collect_statistics(stats); + result->add_statistics(stats); } if (ctx.produce_unsat_cores()) { diff --git a/src/muz/spacer/spacer_iuc_solver.cpp b/src/muz/spacer/spacer_iuc_solver.cpp index 0bc72190b..4bdb2f414 100644 --- a/src/muz/spacer/spacer_iuc_solver.cpp +++ b/src/muz/spacer/spacer_iuc_solver.cpp @@ -185,7 +185,7 @@ namespace spacer { return m_base_defs.is_proxy (a, def); } - void iuc_solver::collect_statistics (statistics &st) const { + void iuc_solver::collect_statistics_core (statistics &st) const { m_solver.collect_statistics (st); st.update ("time.iuc_solver.get_iuc", m_iuc_sw.get_seconds()); st.update ("time.iuc_solver.get_iuc.hyp_reduce1", m_hyp_reduce1_sw.get_seconds()); diff --git a/src/muz/spacer/spacer_iuc_solver.h b/src/muz/spacer/spacer_iuc_solver.h index cdf355f03..18ff4da34 100644 --- a/src/muz/spacer/spacer_iuc_solver.h +++ b/src/muz/spacer/spacer_iuc_solver.h @@ -147,7 +147,7 @@ public: /* check_sat_result interface */ - void collect_statistics(statistics &st) const override ; + void collect_statistics_core(statistics &st) const override ; virtual void reset_statistics(); void get_unsat_core(expr_ref_vector &r) override; diff --git a/src/opt/opt_context.cpp b/src/opt/opt_context.cpp index 0b79f6a31..b3a1661d6 100644 --- a/src/opt/opt_context.cpp +++ b/src/opt/opt_context.cpp @@ -1745,7 +1745,7 @@ namespace opt { m_pareto1 = p != nullptr; } - void context::collect_statistics(statistics& stats) const { + void context::collect_statistics_core(statistics& stats) const { if (m_solver) m_solver->collect_statistics(stats); if (m_simplify) diff --git a/src/opt/opt_context.h b/src/opt/opt_context.h index 2d6c329c0..95bb33d86 100644 --- a/src/opt/opt_context.h +++ b/src/opt/opt_context.h @@ -235,7 +235,7 @@ namespace opt { void get_model_core(model_ref& _m) override; void get_box_model(model_ref& _m, unsigned index) override; void fix_model(model_ref& _m) override; - void collect_statistics(statistics& stats) const override; + void collect_statistics_core(statistics& stats) const override; proof* get_proof_core() override { return nullptr; } void get_labels(svector & r) override; void get_unsat_core(expr_ref_vector & r) override; diff --git a/src/opt/opt_sls_solver.h b/src/opt/opt_sls_solver.h index c7a0cd998..a360de329 100644 --- a/src/opt/opt_sls_solver.h +++ b/src/opt/opt_sls_solver.h @@ -66,7 +66,7 @@ namespace opt { virtual void collect_param_descrs(param_descrs & r) { m_solver->collect_param_descrs(r); } - virtual void collect_statistics(statistics & st) const { + virtual void collect_statistics_core(statistics & st) const { m_solver->collect_statistics(st); if (m_bvsls) m_bvsls->collect_statistics(st); if (m_pbsls) m_pbsls->collect_statistics(st); diff --git a/src/opt/opt_solver.cpp b/src/opt/opt_solver.cpp index af19f9182..586f22698 100644 --- a/src/opt/opt_solver.cpp +++ b/src/opt/opt_solver.cpp @@ -76,7 +76,7 @@ namespace opt { m_context.collect_param_descrs(r); } - void opt_solver::collect_statistics(statistics & st) const { + void opt_solver::collect_statistics_core(statistics & st) const { m_context.collect_statistics(st); } diff --git a/src/opt/opt_solver.h b/src/opt/opt_solver.h index 74da51b96..d11e97520 100644 --- a/src/opt/opt_solver.h +++ b/src/opt/opt_solver.h @@ -89,7 +89,7 @@ namespace opt { solver* translate(ast_manager& m, params_ref const& p) override; void updt_params(params_ref const& p) override; void collect_param_descrs(param_descrs & r) override; - void collect_statistics(statistics & st) const override; + void collect_statistics_core(statistics & st) const override; void assert_expr_core(expr * t) override; void push_core() override; void pop_core(unsigned n) override; diff --git a/src/sat/sat_solver/inc_sat_solver.cpp b/src/sat/sat_solver/inc_sat_solver.cpp index 11b5c771d..2a98bc3ae 100644 --- a/src/sat/sat_solver/inc_sat_solver.cpp +++ b/src/sat/sat_solver/inc_sat_solver.cpp @@ -387,7 +387,7 @@ public: if (p1.euf() && !get_euf()) ensure_euf(); } - void collect_statistics(statistics & st) const override { + void collect_statistics_core(statistics & st) const override { if (m_preprocess) m_preprocess->collect_statistics(st); m_solver.collect_statistics(st); } diff --git a/src/sat/sat_solver/sat_smt_solver.cpp b/src/sat/sat_solver/sat_smt_solver.cpp index 8548749be..5c960d7da 100644 --- a/src/sat/sat_solver/sat_smt_solver.cpp +++ b/src/sat/sat_solver/sat_smt_solver.cpp @@ -334,7 +334,7 @@ public: ensure_euf(); } - void collect_statistics(statistics & st) const override { + void collect_statistics_core(statistics & st) const override { m_solver.collect_statistics(st); } diff --git a/src/smt/smt_solver.cpp b/src/smt/smt_solver.cpp index e82f4277c..d1e5e5a6b 100644 --- a/src/smt/smt_solver.cpp +++ b/src/smt/smt_solver.cpp @@ -142,7 +142,7 @@ namespace { insert_ctrl_c(r); } - void collect_statistics(statistics & st) const override { + void collect_statistics_core(statistics & st) const override { m_context.collect_statistics(st); } diff --git a/src/solver/check_sat_result.cpp b/src/solver/check_sat_result.cpp index 1f86ca4f2..ad528644d 100644 --- a/src/solver/check_sat_result.cpp +++ b/src/solver/check_sat_result.cpp @@ -70,9 +70,6 @@ simple_check_sat_result::simple_check_sat_result(ast_manager & m): m_proof(m) { } -void simple_check_sat_result::collect_statistics(statistics & st) const { - st.copy(m_stats); -} void simple_check_sat_result::get_unsat_core(expr_ref_vector & r) { if (m_status == l_false) { diff --git a/src/solver/check_sat_result.h b/src/solver/check_sat_result.h index 8a48d3277..0db1c3d1a 100644 --- a/src/solver/check_sat_result.h +++ b/src/solver/check_sat_result.h @@ -46,6 +46,8 @@ protected: lbool m_status = l_undef; model_converter_ref m_mc0; double m_time = 0; + statistics m_stats; + public: check_sat_result(ast_manager& m): m(m), m_log(m), m_proof(m) {} virtual ~check_sat_result() = default; @@ -53,7 +55,18 @@ public: void dec_ref() { SASSERT(m_ref_count > 0); m_ref_count--; if (m_ref_count == 0) dealloc(this); } lbool set_status(lbool r) { return m_status = r; } lbool status() const { return m_status; } - virtual void collect_statistics(statistics & st) const = 0; + void collect_statistics(statistics &st) const { + collect_statistics_core(st); + st.copy(m_stats); + } + void add_statistics(statistics const &st) { + m_stats.copy(st); + } + void reset_statistics() { + m_stats.reset(); + } + + virtual void collect_statistics_core(statistics &st) const = 0; virtual void get_unsat_core(expr_ref_vector & r) = 0; void set_model_converter(model_converter* mc) { m_mc0 = mc; } model_converter* mc0() const { return m_mc0.get(); } @@ -92,7 +105,6 @@ public: \brief Very simple implementation of the check_sat_result object. */ struct simple_check_sat_result : public check_sat_result { - statistics m_stats; model_ref m_model; expr_ref_vector m_core; proof_ref m_proof; @@ -100,9 +112,9 @@ struct simple_check_sat_result : public check_sat_result { simple_check_sat_result(ast_manager & m); ast_manager& get_manager() const override { return m_proof.get_manager(); } - void collect_statistics(statistics & st) const override; void get_unsat_core(expr_ref_vector & r) override; void get_model_core(model_ref & m) override; + void collect_statistics_core(statistics &st) const override {} proof * get_proof_core() override; std::string reason_unknown() const override; void get_labels(svector & r) override; diff --git a/src/solver/combined_solver.cpp b/src/solver/combined_solver.cpp index 44bda3ddf..f324b64b2 100644 --- a/src/solver/combined_solver.cpp +++ b/src/solver/combined_solver.cpp @@ -290,7 +290,7 @@ public: return m_solver1->display(out, n, es); } - void collect_statistics(statistics & st) const override { + void collect_statistics_core(statistics & st) const override { m_solver2->collect_statistics(st); if (m_use_solver1_results) m_solver1->collect_statistics(st); diff --git a/src/solver/simplifier_solver.cpp b/src/solver/simplifier_solver.cpp index c75d574eb..79f5ea44e 100644 --- a/src/solver/simplifier_solver.cpp +++ b/src/solver/simplifier_solver.cpp @@ -229,7 +229,7 @@ public: return s->check_sat_core(num_assumptions, _assumptions.data()); } - void collect_statistics(statistics& st) const override { + void collect_statistics_core(statistics& st) const override { s->collect_statistics(st); m_preprocess.collect_statistics(st); } diff --git a/src/solver/slice_solver.cpp b/src/solver/slice_solver.cpp index ee95cfa94..e300d83af 100644 --- a/src/solver/slice_solver.cpp +++ b/src/solver/slice_solver.cpp @@ -319,7 +319,7 @@ public: return s->check_sat_core(num_assumptions, assumptions); } - void collect_statistics(statistics& st) const override { s->collect_statistics(st); } + void collect_statistics_core(statistics& st) const override { s->collect_statistics(st); } void get_model_core(model_ref& mdl) override { s->get_model_core(mdl); } diff --git a/src/solver/solver_pool.cpp b/src/solver/solver_pool.cpp index c98a2b57a..3cf97ce3b 100644 --- a/src/solver/solver_pool.cpp +++ b/src/solver/solver_pool.cpp @@ -83,7 +83,7 @@ public: void pop_params() override {m_base->pop_params();} void collect_param_descrs(param_descrs & r) override { m_base->collect_param_descrs(r); } - void collect_statistics(statistics & st) const override { m_base->collect_statistics(st); } + void collect_statistics_core(statistics & st) const override { m_base->collect_statistics(st); } unsigned get_num_assertions() const override { return m_base->get_num_assertions(); } expr * get_assertion(unsigned idx) const override { return m_base->get_assertion(idx); } diff --git a/src/solver/tactic2solver.cpp b/src/solver/tactic2solver.cpp index 7fd5fec56..1ed4d995e 100644 --- a/src/solver/tactic2solver.cpp +++ b/src/solver/tactic2solver.cpp @@ -49,7 +49,7 @@ class tactic2solver : public solver_na2as { bool m_produce_models; bool m_produce_proofs; bool m_produce_unsat_cores; - statistics m_stats; +// statistics m_stats; bool m_minimizing = false; public: @@ -70,7 +70,7 @@ public: void pop_core(unsigned n) override; lbool check_sat_core2(unsigned num_assumptions, expr * const * assumptions) override; - void collect_statistics(statistics & st) const override; + void collect_statistics_core(statistics & st) const override; void get_unsat_core(expr_ref_vector & r) override; void get_model_core(model_ref & m) override; proof * get_proof_core() override; @@ -284,8 +284,9 @@ lbool tactic2solver::check_sat_core2(unsigned num_assumptions, expr * const * as m_result->m_unknown = ex.what(); m_result->m_proof = pr; } - m_tactic->collect_statistics(m_result->m_stats); - m_tactic->collect_statistics(m_stats); + statistics stats; + m_tactic->collect_statistics(stats); + m_result->add_statistics(stats); m_result->m_model = md; m_result->m_proof = pr; if (m_produce_unsat_cores) { @@ -311,7 +312,7 @@ solver* tactic2solver::translate(ast_manager& m, params_ref const& p) { } -void tactic2solver::collect_statistics(statistics & st) const { +void tactic2solver::collect_statistics_core(statistics & st) const { st.copy(m_stats); if (m_stats.size() == 0 && m_tactic) m_tactic->collect_statistics(st); diff --git a/src/tactic/fd_solver/bounded_int2bv_solver.cpp b/src/tactic/fd_solver/bounded_int2bv_solver.cpp index 8ef39d0af..28cb5823a 100644 --- a/src/tactic/fd_solver/bounded_int2bv_solver.cpp +++ b/src/tactic/fd_solver/bounded_int2bv_solver.cpp @@ -159,7 +159,7 @@ public: void collect_param_descrs(param_descrs & r) override { m_solver->collect_param_descrs(r); } void set_produce_models(bool f) override { m_solver->set_produce_models(f); } void set_progress_callback(progress_callback * callback) override { m_solver->set_progress_callback(callback); } - void collect_statistics(statistics & st) const override { m_solver->collect_statistics(st); } + void collect_statistics_core(statistics & st) const override { m_solver->collect_statistics(st); } void get_unsat_core(expr_ref_vector & r) override { m_solver->get_unsat_core(r); } void set_phase(expr* e) override { m_solver->set_phase(e); } phase* get_phase() override { return m_solver->get_phase(); } diff --git a/src/tactic/fd_solver/enum2bv_solver.cpp b/src/tactic/fd_solver/enum2bv_solver.cpp index 061f67010..d420aa796 100644 --- a/src/tactic/fd_solver/enum2bv_solver.cpp +++ b/src/tactic/fd_solver/enum2bv_solver.cpp @@ -85,7 +85,7 @@ public: void collect_param_descrs(param_descrs & r) override { m_solver->collect_param_descrs(r); } void set_produce_models(bool f) override { m_solver->set_produce_models(f); } void set_progress_callback(progress_callback * callback) override { m_solver->set_progress_callback(callback); } - void collect_statistics(statistics & st) const override { m_solver->collect_statistics(st); } + void collect_statistics_core(statistics & st) const override { m_solver->collect_statistics(st); } void get_unsat_core(expr_ref_vector & r) override { m_solver->get_unsat_core(r); } void set_phase(expr* e) override { m_solver->set_phase(e); } phase* get_phase() override { return m_solver->get_phase(); } diff --git a/src/tactic/fd_solver/pb2bv_solver.cpp b/src/tactic/fd_solver/pb2bv_solver.cpp index 7bc0f27dd..12ac45042 100644 --- a/src/tactic/fd_solver/pb2bv_solver.cpp +++ b/src/tactic/fd_solver/pb2bv_solver.cpp @@ -82,7 +82,7 @@ public: void collect_param_descrs(param_descrs & r) override { m_solver->collect_param_descrs(r); m_rewriter.collect_param_descrs(r);} void set_produce_models(bool f) override { m_solver->set_produce_models(f); } void set_progress_callback(progress_callback * callback) override { m_solver->set_progress_callback(callback); } - void collect_statistics(statistics & st) const override { + void collect_statistics_core(statistics & st) const override { m_rewriter.collect_statistics(st); m_solver->collect_statistics(st); } diff --git a/src/tactic/fd_solver/smtfd_solver.cpp b/src/tactic/fd_solver/smtfd_solver.cpp index 8b765a04e..d20d5b706 100644 --- a/src/tactic/fd_solver/smtfd_solver.cpp +++ b/src/tactic/fd_solver/smtfd_solver.cpp @@ -2032,7 +2032,7 @@ namespace smtfd { void set_produce_models(bool f) override { } void set_progress_callback(progress_callback * callback) override { } - void collect_statistics(statistics & st) const override { + void collect_statistics_core(statistics & st) const override { if (m_fd_sat_solver) { m_fd_sat_solver->collect_statistics(st); m_fd_core_solver->collect_statistics(st);