diff --git a/src/ast/rewriter/pb2bv_rewriter.cpp b/src/ast/rewriter/pb2bv_rewriter.cpp index d39d41cd6..c277ba704 100644 --- a/src/ast/rewriter/pb2bv_rewriter.cpp +++ b/src/ast/rewriter/pb2bv_rewriter.cpp @@ -926,6 +926,8 @@ struct pb2bv_rewriter::imp { void set_cardinality_encoding(sorting_network_encoding enc) { m_sort.cfg().m_encoding = enc; } + void set_min_arity(unsigned ma) { m_min_arity = ma; } + }; struct card2bv_rewriter_cfg : public default_rewriter_cfg { @@ -940,6 +942,7 @@ struct pb2bv_rewriter::imp { void keep_cardinality_constraints(bool f) { m_r.keep_cardinality_constraints(f); } void set_pb_solver(symbol const& s) { m_r.set_pb_solver(s); } void set_cardinality_encoding(sorting_network_encoding enc) { m_r.set_cardinality_encoding(enc); } + void set_min_arity(unsigned ma) { m_r.set_min_arity(ma); } }; @@ -952,6 +955,7 @@ struct pb2bv_rewriter::imp { void keep_cardinality_constraints(bool f) { m_cfg.keep_cardinality_constraints(f); } void set_pb_solver(symbol const& s) { m_cfg.set_pb_solver(s); } void set_cardinality_encoding(sorting_network_encoding e) { m_cfg.set_cardinality_encoding(e); } + void set_min_arity(unsigned ma) { m_cfg.set_min_arity(ma); } void rewrite(bool full, expr* e, expr_ref& r, proof_ref& p) { expr_ref ee(e, m()); if (m_cfg.m_r.mk_app(full, e, r)) { @@ -982,6 +986,15 @@ struct pb2bv_rewriter::imp { return gparams::get_module("sat").get_sym("pb.solver", symbol("solver")); } + unsigned min_arity() const { + params_ref const& p = m_params; + unsigned r = p.get_uint("sat.pb.min_arity", UINT_MAX); + if (r != UINT_MAX) return r; + r = p.get_uint("pb.min_arity", UINT_MAX); + if (r != UINT_MAX) return r; + return gparams::get_module("sat").get_uint("pb.min_arity", 9); + } + sorting_network_encoding cardinality_encoding() const { symbol enc = m_params.get_sym("cardinality.encoding", symbol()); if (enc == symbol()) { @@ -1011,6 +1024,7 @@ struct pb2bv_rewriter::imp { m_rw.keep_cardinality_constraints(keep_cardinality()); m_rw.set_pb_solver(pb_solver()); m_rw.set_cardinality_encoding(cardinality_encoding()); + m_rw.set_min_arity(min_arity()); } void collect_param_descrs(param_descrs& r) const { diff --git a/src/sat/ba_solver.cpp b/src/sat/ba_solver.cpp index 6dd5f3f09..d1225ced9 100644 --- a/src/sat/ba_solver.cpp +++ b/src/sat/ba_solver.cpp @@ -1400,6 +1400,12 @@ namespace sat { unsigned ci = ineq.coeff(i); unsigned q = ci % c; if (q != 0 && !is_false(ineq.lit(i))) { +#if 1 + // code review by Elffers: + ineq.weaken(i); + --i; + --sz; +#else if (q == ci) { ineq.weaken(i); --i; @@ -1409,6 +1415,7 @@ namespace sat { ineq.m_wlits[i].first -= q; ineq.m_k -= q; } +#endif } } ineq.divide(c); diff --git a/src/sat/sat_params.pyg b/src/sat/sat_params.pyg index 7fefb7711..4075d4425 100644 --- a/src/sat/sat_params.pyg +++ b/src/sat/sat_params.pyg @@ -48,6 +48,7 @@ def_module_params('sat', ('drat.check_sat', BOOL, False, 'build up internal trace, check satisfying model'), ('cardinality.solver', BOOL, True, 'use cardinality solver'), ('pb.solver', SYMBOL, 'solver', 'method for handling Pseudo-Boolean constraints: circuit (arithmetical circuit), sorting (sorting circuit), totalizer (use totalizer encoding), binary_merge, segmented, solver (use native solver)'), + ('pb.min_arity', UINT, 9, 'minimal arity to compile pb/cardinality constraints to CNF'), ('xor.solver', BOOL, False, 'use xor solver'), ('cardinality.encoding', SYMBOL, 'grouped', 'encoding used for at-most-k constraints: grouped, bimander, ordered, unate, circuit'), ('pb.resolve', SYMBOL, 'cardinality', 'resolution strategy for boolean algebra solver: cardinality, rounding'), diff --git a/src/sat/sat_solver.cpp b/src/sat/sat_solver.cpp index 79e8d1a00..e4a5f86a4 100644 --- a/src/sat/sat_solver.cpp +++ b/src/sat/sat_solver.cpp @@ -3161,12 +3161,42 @@ namespace sat { m_activity_inc = 128; svector vars; for (bool_var v = num_vars(); v-- > 0; ) { - vars.push_back(v); + if (!was_eliminated(v) && value(v) == l_undef) { + vars.push_back(v); + } } +#if 1 + // + // exp(logits[i]) / sum(exp(logits)) + // = + // exp(log(exp(logits[i]) / sum(exp(logits)))) + // = + // exp(log(exp(logits[i])) - log(sum(exp(logits)))) + // = + // exp(logits[i] - lse) + svector logits(vars.size(), 0.0); + float itau = 4.0; + float lse = 0; + float mid = m_rand.max_value()/2; + float max = 0; + for (float& f : logits) { + f = itau * (m_rand() - mid)/mid; + if (f > max) max = f; + } + for (float f : logits) { + lse += log(f - max); + } + lse = max + exp(lse); + + for (unsigned i = 0; i < vars.size(); ++i) { + update_activity(vars[i], exp(logits[i] - lse)); + } +#else shuffle(vars.size(), vars.c_ptr(), m_rand); for (bool_var v : vars) { - update_activity(v, m_rand(10)); + update_activity(v, m_rand(10)/10.0); } +#endif m_reorder_inc += m_config.m_reorder_base; m_reorder_lim += m_reorder_inc; }