From 8e5c1fcfd150e6b51040f1802f86e831e674f134 Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner <nbjorner@microsoft.com> Date: Wed, 23 Jan 2019 16:06:25 -0800 Subject: [PATCH] make context_solve configurable and exposed as top-level tactic parameter Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> --- src/tactic/CMakeLists.txt | 2 ++ src/tactic/core/blast_term_ite_tactic.cpp | 13 ++++----- src/tactic/core/propagate_values_tactic.cpp | 6 +++-- src/tactic/core/solve_eqs_tactic.cpp | 29 ++++++++++----------- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/tactic/CMakeLists.txt b/src/tactic/CMakeLists.txt index c9554b76a..495078afc 100644 --- a/src/tactic/CMakeLists.txt +++ b/src/tactic/CMakeLists.txt @@ -22,4 +22,6 @@ z3_add_component(tactic probe.h sine_filter.h tactic.h + PYG_FILES + tactic_params.pyg ) diff --git a/src/tactic/core/blast_term_ite_tactic.cpp b/src/tactic/core/blast_term_ite_tactic.cpp index eefb9418e..259b479c5 100644 --- a/src/tactic/core/blast_term_ite_tactic.cpp +++ b/src/tactic/core/blast_term_ite_tactic.cpp @@ -16,11 +16,12 @@ Author: Notes: --*/ -#include "tactic/tactical.h" +#include "util/cooperate.h" #include "ast/normal_forms/defined_names.h" #include "ast/rewriter/rewriter_def.h" -#include "util/cooperate.h" #include "ast/scoped_proof.h" +#include "tactic/tactical.h" +#include "tactic/tactic_params.hpp" @@ -50,9 +51,10 @@ class blast_term_ite_tactic : public tactic { } void updt_params(params_ref const & p) { + tactic_params tp(p); m_max_memory = megabytes_to_bytes(p.get_uint("max_memory", UINT_MAX)); - m_max_steps = p.get_uint("max_steps", UINT_MAX); - m_max_inflation = p.get_uint("max_inflation", UINT_MAX); // multiplicative factor of initial term size. + m_max_steps = p.get_uint("max_steps", tp.blast_term_ite_max_steps()); + m_max_inflation = p.get_uint("max_inflation", tp.blast_term_ite_max_inflation()); // multiplicative factor of initial term size. } @@ -182,8 +184,7 @@ public: void collect_param_descrs(param_descrs & r) override { insert_max_memory(r); insert_max_steps(r); - r.insert("max_args", CPK_UINT, - "(default: 128) maximum number of arguments (per application) that will be considered by the greedy (quadratic) heuristic."); + r.insert("max_inflation", CPK_UINT, "(default: infinity) multiplicative factor of initial term size."); } void operator()(goal_ref const & in, goal_ref_buffer & result) override { diff --git a/src/tactic/core/propagate_values_tactic.cpp b/src/tactic/core/propagate_values_tactic.cpp index f9712120f..351b606e6 100644 --- a/src/tactic/core/propagate_values_tactic.cpp +++ b/src/tactic/core/propagate_values_tactic.cpp @@ -23,6 +23,7 @@ Revision History: #include "ast/ast_smt2_pp.h" #include "ast/expr_substitution.h" #include "tactic/goal_shared_occs.h" +#include "tactic/tactic_params.hpp" namespace { class propagate_values_tactic : public tactic { @@ -37,7 +38,8 @@ class propagate_values_tactic : public tactic { params_ref m_params; void updt_params_core(params_ref const & p) { - m_max_rounds = p.get_uint("max_rounds", 4); + tactic_params tp(p); + m_max_rounds = p.get_uint("max_rounds", tp.propagate_values_max_rounds()); } bool is_shared(expr * t) { @@ -215,7 +217,7 @@ public: void collect_param_descrs(param_descrs & r) override { th_rewriter::get_param_descrs(r); - r.insert("max_rounds", CPK_UINT, "(default: 2) maximum number of rounds."); + r.insert("max_rounds", CPK_UINT, "(default: 4) maximum number of rounds."); } void operator()(goal_ref const & in, goal_ref_buffer & result) override { diff --git a/src/tactic/core/solve_eqs_tactic.cpp b/src/tactic/core/solve_eqs_tactic.cpp index 1ed230886..623f83db4 100644 --- a/src/tactic/core/solve_eqs_tactic.cpp +++ b/src/tactic/core/solve_eqs_tactic.cpp @@ -25,6 +25,7 @@ Revision History: #include "tactic/goal_shared_occs.h" #include "tactic/tactical.h" #include "tactic/generic_model_converter.h" +#include "tactic/tactic_params.hpp" class solve_eqs_tactic : public tactic { struct imp { @@ -40,6 +41,7 @@ class solve_eqs_tactic : public tactic { bool m_theory_solver; bool m_ite_solver; unsigned m_max_occs; + bool m_context_solve; scoped_ptr<expr_substitution> m_subst; scoped_ptr<expr_substitution> m_norm_subst; expr_sparse_mark m_candidate_vars; @@ -72,9 +74,11 @@ class solve_eqs_tactic : public tactic { ast_manager & m() const { return m_manager; } void updt_params(params_ref const & p) { - m_ite_solver = p.get_bool("ite_solver", true); - m_theory_solver = p.get_bool("theory_solver", true); - m_max_occs = p.get_uint("solve_eqs_max_occs", UINT_MAX); + tactic_params tp(p); + m_ite_solver = p.get_bool("ite_solver", tp.solve_eqs_ite_solver()); + m_theory_solver = p.get_bool("theory_solver", tp.solve_eqs_theory_solver()); + m_max_occs = p.get_uint("solve_eqs_max_occs", tp.solve_eqs_max_occs()); + m_context_solve = p.get_bool("context_solve", tp.solve_eqs_context_solve()); } void checkpoint() { @@ -555,7 +559,7 @@ class solve_eqs_tactic : public tactic { insert_solution(g, idx, arg, var, def, pr); } else { - IF_VERBOSE(0, + IF_VERBOSE(10000, verbose_stream() << "eq not solved " << mk_pp(arg, m()) << "\n"; verbose_stream() << is_uninterp_const(lhs) << " " << !m_candidate_vars.is_marked(lhs) << " " << !occurs(lhs, rhs) << " " << check_occs(lhs) << "\n";); @@ -726,7 +730,7 @@ class solve_eqs_tactic : public tactic { ++idx; } - IF_VERBOSE(10, + IF_VERBOSE(10000, verbose_stream() << "ordered vars: "; for (app* v : m_ordered_vars) verbose_stream() << mk_pp(v, m()) << " "; verbose_stream() << "\n";); @@ -811,12 +815,6 @@ class solve_eqs_tactic : public tactic { } m_r->operator()(f, new_f, new_pr, new_dep); -#if 0 - pb_util pb(m()); - if (pb.is_ge(f) && f != new_f) { - IF_VERBOSE(0, verbose_stream() << mk_ismt2_pp(f, m()) << "\n--->\n" << mk_ismt2_pp(new_f, m()) << "\n"); - } -#endif TRACE("solve_eqs_subst", tout << mk_ismt2_pp(f, m()) << "\n--->\n" << mk_ismt2_pp(new_f, m()) << "\n";); m_num_steps += m_r->get_num_steps() + 1; @@ -922,8 +920,9 @@ class solve_eqs_tactic : public tactic { while (true) { collect_num_occs(*g); collect(*g); - // TBD Disabled until tested more: - // collect_hoist(*g); + if (m_context_solve) { + collect_hoist(*g); + } if (m_subst->empty()) break; sort_vars(); @@ -941,7 +940,6 @@ class solve_eqs_tactic : public tactic { g->inc_depth(); g->add(mc.get()); result.push_back(g.get()); - //IF_VERBOSE(0, g->display(verbose_stream())); TRACE("solve_eqs", g->display(tout);); SASSERT(g->is_well_sorted()); } @@ -968,10 +966,11 @@ public: m_imp->updt_params(p); } - void collect_param_descrs(param_descrs & r) override { + void collect_param_descrs(param_descrs & r) override { r.insert("solve_eqs_max_occs", CPK_UINT, "(default: infty) maximum number of occurrences for considering a variable for gaussian eliminations."); r.insert("theory_solver", CPK_BOOL, "(default: true) use theory solvers."); r.insert("ite_solver", CPK_BOOL, "(default: true) use if-then-else solver."); + r.insert("context_solve", CPK_BOOL, "(default: false) solve equalities under disjunctions."); } void operator()(goal_ref const & in,