From 2bcb875559f65ff7894ad79801b9c3f612bbdc8b Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Thu, 16 Feb 2017 08:36:16 -0800 Subject: [PATCH 1/2] add option to disable cardinality solver Signed-off-by: Nikolaj Bjorner --- src/ast/pb_decl_plugin.cpp | 10 ++++++++++ src/ast/pb_decl_plugin.h | 3 +++ src/sat/sat_params.pyg | 1 + src/sat/sat_solver/inc_sat_solver.cpp | 6 +++--- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/ast/pb_decl_plugin.cpp b/src/ast/pb_decl_plugin.cpp index 09f020ca6..16ece2d40 100644 --- a/src/ast/pb_decl_plugin.cpp +++ b/src/ast/pb_decl_plugin.cpp @@ -44,6 +44,7 @@ func_decl * pb_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, p case OP_PB_LE: sym = m_pble_sym; break; case OP_PB_GE: sym = m_pbge_sym; break; case OP_PB_EQ: sym = m_pbeq_sym; break; + case OP_PB_ODD: sym = symbol("is-odd"); break; default: break; } switch(k) { @@ -55,6 +56,14 @@ func_decl * pb_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, p func_decl_info info(m_family_id, k, 1, parameters); return m.mk_func_decl(sym, arity, domain, m.mk_bool_sort(), info); } + case OP_PB_ODD:{ + if (num_parameters != 0) { + m.raise_exception("function expects no parameters"); + } + func_decl_info info(m_family_id, k, 0, parameters); + return m.mk_func_decl(sym, arity, domain, m.mk_bool_sort(), info); + } + case OP_PB_GE: case OP_PB_LE: case OP_PB_EQ: { @@ -97,6 +106,7 @@ void pb_decl_plugin::get_op_names(svector & op_names, symbol const op_names.push_back(builtin_name(m_pble_sym.bare_str(), OP_PB_LE)); op_names.push_back(builtin_name(m_pbge_sym.bare_str(), OP_PB_GE)); op_names.push_back(builtin_name(m_pbeq_sym.bare_str(), OP_PB_EQ)); + op_names.push_back(builtin_name("is-odd", OP_PB_ODD)); } } diff --git a/src/ast/pb_decl_plugin.h b/src/ast/pb_decl_plugin.h index 0750dcac7..fdd64561b 100644 --- a/src/ast/pb_decl_plugin.h +++ b/src/ast/pb_decl_plugin.h @@ -35,6 +35,7 @@ enum pb_op_kind { OP_PB_LE, // pseudo-Boolean <= (generalizes at_most_k) OP_PB_GE, // pseudo-Boolean >= OP_PB_EQ, // equality + OP_PB_ODD, // parity of arguments is odd OP_PB_AUX_BOOL, // auxiliary internal Boolean variable. LAST_PB_OP }; @@ -95,12 +96,14 @@ public: app * mk_ge(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k); app * mk_eq(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k); app * mk_lt(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k); + app * mk_odd(unsigned num_args, expr * const * args); bool is_at_most_k(func_decl *a) const; bool is_at_most_k(expr *a) const { return is_app(a) && is_at_most_k(to_app(a)->get_decl()); } bool is_at_most_k(expr *a, rational& k) const; bool is_at_least_k(func_decl *a) const; bool is_at_least_k(expr *a) const { return is_app(a) && is_at_least_k(to_app(a)->get_decl()); } bool is_at_least_k(expr *a, rational& k) const; + bool is_odd(expr* a) const; rational get_k(func_decl *a) const; rational get_k(expr *a) const { return get_k(to_app(a)->get_decl()); } bool is_le(func_decl *a) const; diff --git a/src/sat/sat_params.pyg b/src/sat/sat_params.pyg index 3413d5e6a..e3ca12b73 100644 --- a/src/sat/sat_params.pyg +++ b/src/sat/sat_params.pyg @@ -26,4 +26,5 @@ def_module_params('sat', ('dimacs.core', BOOL, False, 'extract core from DIMACS benchmarks'), ('drat.file', SYMBOL, '', 'file to dump DRAT proofs'), ('drat.check', BOOL, False, 'build up internal proof and check'), + ('cardinality.solver', BOOL, True, 'use cardinality solver'), )) diff --git a/src/sat/sat_solver/inc_sat_solver.cpp b/src/sat/sat_solver/inc_sat_solver.cpp index 02abebbb5..d2ae541a8 100644 --- a/src/sat/sat_solver/inc_sat_solver.cpp +++ b/src/sat/sat_solver/inc_sat_solver.cpp @@ -82,9 +82,7 @@ public: m_num_scopes(0), m_dep_core(m), m_unknown("no reason given") { - m_params.set_bool("elim_vars", false); - sat_params p1(m_params); - m_solver.updt_params(m_params); + updt_params(p); init_preprocess(); } @@ -218,8 +216,10 @@ public: m_params.append(p); sat_params p1(p); m_params.set_bool("elim_vars", false); + m_params.set_bool("keep_cardinality_constraints", p1.cardinality_solver()); m_solver.updt_params(m_params); m_optimize_model = m_params.get_bool("optimize_model", false); + } virtual void collect_statistics(statistics & st) const { if (m_preprocess) m_preprocess->collect_statistics(st); From 7e391a8a5780fd5dbcb304dced1ee954b743c0bd Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Thu, 16 Feb 2017 08:38:38 -0800 Subject: [PATCH 2/2] add option to disable cardinality solver Signed-off-by: Nikolaj Bjorner --- src/ast/pb_decl_plugin.cpp | 12 +----------- src/ast/pb_decl_plugin.h | 3 --- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/ast/pb_decl_plugin.cpp b/src/ast/pb_decl_plugin.cpp index 16ece2d40..bfe39e3ae 100644 --- a/src/ast/pb_decl_plugin.cpp +++ b/src/ast/pb_decl_plugin.cpp @@ -44,7 +44,6 @@ func_decl * pb_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, p case OP_PB_LE: sym = m_pble_sym; break; case OP_PB_GE: sym = m_pbge_sym; break; case OP_PB_EQ: sym = m_pbeq_sym; break; - case OP_PB_ODD: sym = symbol("is-odd"); break; default: break; } switch(k) { @@ -55,15 +54,7 @@ func_decl * pb_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, p } func_decl_info info(m_family_id, k, 1, parameters); return m.mk_func_decl(sym, arity, domain, m.mk_bool_sort(), info); - } - case OP_PB_ODD:{ - if (num_parameters != 0) { - m.raise_exception("function expects no parameters"); - } - func_decl_info info(m_family_id, k, 0, parameters); - return m.mk_func_decl(sym, arity, domain, m.mk_bool_sort(), info); - } - + } case OP_PB_GE: case OP_PB_LE: case OP_PB_EQ: { @@ -106,7 +97,6 @@ void pb_decl_plugin::get_op_names(svector & op_names, symbol const op_names.push_back(builtin_name(m_pble_sym.bare_str(), OP_PB_LE)); op_names.push_back(builtin_name(m_pbge_sym.bare_str(), OP_PB_GE)); op_names.push_back(builtin_name(m_pbeq_sym.bare_str(), OP_PB_EQ)); - op_names.push_back(builtin_name("is-odd", OP_PB_ODD)); } } diff --git a/src/ast/pb_decl_plugin.h b/src/ast/pb_decl_plugin.h index fdd64561b..0750dcac7 100644 --- a/src/ast/pb_decl_plugin.h +++ b/src/ast/pb_decl_plugin.h @@ -35,7 +35,6 @@ enum pb_op_kind { OP_PB_LE, // pseudo-Boolean <= (generalizes at_most_k) OP_PB_GE, // pseudo-Boolean >= OP_PB_EQ, // equality - OP_PB_ODD, // parity of arguments is odd OP_PB_AUX_BOOL, // auxiliary internal Boolean variable. LAST_PB_OP }; @@ -96,14 +95,12 @@ public: app * mk_ge(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k); app * mk_eq(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k); app * mk_lt(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k); - app * mk_odd(unsigned num_args, expr * const * args); bool is_at_most_k(func_decl *a) const; bool is_at_most_k(expr *a) const { return is_app(a) && is_at_most_k(to_app(a)->get_decl()); } bool is_at_most_k(expr *a, rational& k) const; bool is_at_least_k(func_decl *a) const; bool is_at_least_k(expr *a) const { return is_app(a) && is_at_least_k(to_app(a)->get_decl()); } bool is_at_least_k(expr *a, rational& k) const; - bool is_odd(expr* a) const; rational get_k(func_decl *a) const; rational get_k(expr *a) const { return get_k(to_app(a)->get_decl()); } bool is_le(func_decl *a) const;