mirror of
https://github.com/Z3Prover/z3
synced 2025-07-03 19:35:42 +00:00
add hook to turn on xor solver
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
0e651eee04
commit
e4f57a13ba
5 changed files with 27 additions and 3 deletions
|
@ -62,6 +62,7 @@ def_module_params('sat',
|
||||||
('pb.resolve', SYMBOL, 'cardinality', 'resolution strategy for boolean algebra solver: cardinality, rounding'),
|
('pb.resolve', SYMBOL, 'cardinality', 'resolution strategy for boolean algebra solver: cardinality, rounding'),
|
||||||
('pb.lemma_format', SYMBOL, 'cardinality', 'generate either cardinality or pb lemmas'),
|
('pb.lemma_format', SYMBOL, 'cardinality', 'generate either cardinality or pb lemmas'),
|
||||||
('euf', BOOL, False, 'enable euf solver (this feature is preliminary and not ready for general consumption)'),
|
('euf', BOOL, False, 'enable euf solver (this feature is preliminary and not ready for general consumption)'),
|
||||||
|
('enable_xor', BOOL, False, 'enable xor solver plugin in combination with pure SAT solving'),
|
||||||
('ddfw_search', BOOL, False, 'use ddfw local search instead of CDCL'),
|
('ddfw_search', BOOL, False, 'use ddfw local search instead of CDCL'),
|
||||||
('ddfw.init_clause_weight', UINT, 8, 'initial clause weight for DDFW local search'),
|
('ddfw.init_clause_weight', UINT, 8, 'initial clause weight for DDFW local search'),
|
||||||
('ddfw.use_reward_pct', UINT, 15, 'percentage to pick highest reward variable when it has reward 0'),
|
('ddfw.use_reward_pct', UINT, 15, 'percentage to pick highest reward variable when it has reward 0'),
|
||||||
|
|
|
@ -44,6 +44,7 @@ z3_add_component(sat_smt
|
||||||
sat_th.cpp
|
sat_th.cpp
|
||||||
tseitin_theory_checker.cpp
|
tseitin_theory_checker.cpp
|
||||||
user_solver.cpp
|
user_solver.cpp
|
||||||
|
xor_solver.cpp
|
||||||
COMPONENT_DEPENDENCIES
|
COMPONENT_DEPENDENCIES
|
||||||
sat
|
sat
|
||||||
ast
|
ast
|
||||||
|
|
|
@ -19,9 +19,16 @@ Abstract:
|
||||||
|
|
||||||
namespace xr {
|
namespace xr {
|
||||||
|
|
||||||
|
|
||||||
solver::solver(euf::solver& ctx):
|
solver::solver(euf::solver& ctx):
|
||||||
th_solver(ctx.get_manager(), symbol("xor-solver"), ctx.get_manager().get_family_id("xor-solver"))
|
solver(ctx.get_manager(), ctx.get_si(), ctx.get_manager().get_family_id("xor")) {
|
||||||
{}
|
m_ctx = &ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
solver::solver(ast_manager& m, sat::sat_internalizer& si, euf::theory_id id)
|
||||||
|
: euf::th_solver(m, symbol("xor"), id),
|
||||||
|
si(si) {
|
||||||
|
}
|
||||||
|
|
||||||
euf::th_solver* solver::clone(euf::solver& ctx) {
|
euf::th_solver* solver::clone(euf::solver& ctx) {
|
||||||
// and relevant copy internal state
|
// and relevant copy internal state
|
||||||
|
|
|
@ -18,9 +18,11 @@ Abstract:
|
||||||
|
|
||||||
namespace xr {
|
namespace xr {
|
||||||
class solver : public euf::th_solver {
|
class solver : public euf::th_solver {
|
||||||
|
euf::solver* m_ctx = nullptr;
|
||||||
|
sat::sat_internalizer& si;
|
||||||
public:
|
public:
|
||||||
solver(euf::solver& ctx);
|
solver(euf::solver& ctx);
|
||||||
|
solver(ast_manager& m, sat::sat_internalizer& si, euf::theory_id id);
|
||||||
th_solver* clone(euf::solver& ctx) override;
|
th_solver* clone(euf::solver& ctx) override;
|
||||||
|
|
||||||
sat::literal internalize(expr* e, bool sign, bool root) override { UNREACHABLE(); return sat::null_literal; }
|
sat::literal internalize(expr* e, bool sign, bool root) override { UNREACHABLE(); return sat::null_literal; }
|
||||||
|
|
|
@ -42,6 +42,7 @@ Notes:
|
||||||
#include "sat/sat_drat.h"
|
#include "sat/sat_drat.h"
|
||||||
#include "sat/tactic/goal2sat.h"
|
#include "sat/tactic/goal2sat.h"
|
||||||
#include "sat/smt/pb_solver.h"
|
#include "sat/smt/pb_solver.h"
|
||||||
|
#include "sat/smt/xor_solver.h"
|
||||||
#include "sat/smt/euf_solver.h"
|
#include "sat/smt/euf_solver.h"
|
||||||
#include "sat/smt/sat_th.h"
|
#include "sat/smt/sat_th.h"
|
||||||
#include "sat/sat_params.hpp"
|
#include "sat/sat_params.hpp"
|
||||||
|
@ -75,6 +76,7 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
func_decl_ref_vector m_unhandled_funs;
|
func_decl_ref_vector m_unhandled_funs;
|
||||||
bool m_default_external;
|
bool m_default_external;
|
||||||
bool m_euf = false;
|
bool m_euf = false;
|
||||||
|
bool m_xor = false;
|
||||||
bool m_top_level = false;
|
bool m_top_level = false;
|
||||||
sat::literal_vector aig_lits;
|
sat::literal_vector aig_lits;
|
||||||
|
|
||||||
|
@ -100,6 +102,7 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
m_ite_extra = p.get_bool("ite_extra", true);
|
m_ite_extra = p.get_bool("ite_extra", true);
|
||||||
m_max_memory = megabytes_to_bytes(p.get_uint("max_memory", UINT_MAX));
|
m_max_memory = megabytes_to_bytes(p.get_uint("max_memory", UINT_MAX));
|
||||||
m_euf = sp.euf();
|
m_euf = sp.euf();
|
||||||
|
m_xor = sp.enable_xor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void throw_op_not_handled(std::string const& s) {
|
void throw_op_not_handled(std::string const& s) {
|
||||||
|
@ -658,6 +661,14 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
return m_unhandled_funs;
|
return m_unhandled_funs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ensure_xor() {
|
||||||
|
sat::extension* ext = m_solver.get_extension();
|
||||||
|
if (ext)
|
||||||
|
return;
|
||||||
|
auto* x = alloc(xr::solver, m, *this, m.get_family_id("xor"));
|
||||||
|
m_solver.set_extension(x);
|
||||||
|
}
|
||||||
|
|
||||||
euf::solver* ensure_euf() {
|
euf::solver* ensure_euf() {
|
||||||
SASSERT(m_euf);
|
SASSERT(m_euf);
|
||||||
sat::extension* ext = m_solver.get_extension();
|
sat::extension* ext = m_solver.get_extension();
|
||||||
|
@ -950,6 +961,8 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
expr_ref_vector fmls(m);
|
expr_ref_vector fmls(m);
|
||||||
if (m_euf)
|
if (m_euf)
|
||||||
ensure_euf();
|
ensure_euf();
|
||||||
|
else if (m_xor)
|
||||||
|
ensure_xor();
|
||||||
for (unsigned idx = 0; idx < size; idx++) {
|
for (unsigned idx = 0; idx < size; idx++) {
|
||||||
f = g.form(idx);
|
f = g.form(idx);
|
||||||
// Add assumptions.
|
// Add assumptions.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue