mirror of
https://github.com/Z3Prover/z3
synced 2025-04-13 12:28:44 +00:00
131 lines
2.7 KiB
C++
131 lines
2.7 KiB
C++
/*++
|
|
Copyright (c) 2020 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sls_solver
|
|
|
|
Abstract:
|
|
|
|
Interface to Concurrent SLS solver
|
|
|
|
Author:
|
|
|
|
Nikolaj Bjorner (nbjorner) 2024-02-21
|
|
|
|
|
|
--*/
|
|
|
|
#include "sat/smt/sls_solver.h"
|
|
#include "sat/smt/euf_solver.h"
|
|
#include "ast/sls/sls_context.h"
|
|
#include "ast/for_each_expr.h"
|
|
|
|
namespace sls {
|
|
|
|
|
|
solver::solver(euf::solver& ctx) :
|
|
th_euf_solver(ctx, symbol("sls"), ctx.get_manager().mk_family_id("sls"))
|
|
{}
|
|
|
|
#ifdef SINGLE_THREAD
|
|
|
|
#else
|
|
|
|
solver::~solver() {
|
|
finalize();
|
|
}
|
|
|
|
params_ref solver::get_params() {
|
|
return s().params();
|
|
}
|
|
|
|
void solver::set_value(expr* t, expr* v) {
|
|
ctx.user_propagate_initialize_value(t, v);
|
|
}
|
|
|
|
void solver::force_phase(sat::literal lit) {
|
|
ctx.s().set_phase(lit);
|
|
}
|
|
|
|
void solver::set_has_new_best_phase(bool b) {
|
|
|
|
}
|
|
|
|
bool solver::get_best_phase(sat::bool_var v) {
|
|
return false;
|
|
}
|
|
|
|
expr* solver::bool_var2expr(sat::bool_var v) {
|
|
return ctx.bool_var2expr(v);
|
|
}
|
|
|
|
void solver::set_finished() {
|
|
ctx.s().set_canceled();
|
|
}
|
|
|
|
unsigned solver::get_num_bool_vars() const {
|
|
return s().num_vars();
|
|
}
|
|
|
|
void solver::finalize() {
|
|
if (!m_smt_plugin)
|
|
return;
|
|
|
|
m_smt_plugin->finalize(m_model, m_st);
|
|
m_model = nullptr;
|
|
m_smt_plugin = nullptr;
|
|
}
|
|
|
|
bool solver::unit_propagate() {
|
|
force_push();
|
|
if (m_smt_plugin && !m_checking) {
|
|
expr_ref_vector fmls(m);
|
|
m_checking = true;
|
|
m_smt_plugin->check(fmls, ctx.top_level_clauses());
|
|
return true;
|
|
}
|
|
if (!m_smt_plugin)
|
|
return false;
|
|
if (!m_smt_plugin->completed())
|
|
return false;
|
|
m_smt_plugin->finalize(m_model, m_st);
|
|
m_smt_plugin = nullptr;
|
|
return true;
|
|
}
|
|
|
|
void solver::pop_core(unsigned n) {
|
|
if (!m_smt_plugin)
|
|
return;
|
|
|
|
unsigned scope_lvl = s().scope_lvl();
|
|
if (s().search_lvl() == scope_lvl - n) {
|
|
for (; m_trail_lim < s().init_trail_size(); ++m_trail_lim) {
|
|
auto lit = s().trail_literal(m_trail_lim);
|
|
m_smt_plugin->add_unit(lit);
|
|
}
|
|
}
|
|
#if 0
|
|
if (ctx.has_new_best_phase())
|
|
m_smt_plugin->import_phase_from_smt();
|
|
|
|
#endif
|
|
|
|
m_smt_plugin->import_from_sls();
|
|
}
|
|
|
|
void solver::init_search() {
|
|
if (m_smt_plugin)
|
|
finalize();
|
|
m_smt_plugin = alloc(sls::smt_plugin, *this);
|
|
m_checking = false;
|
|
}
|
|
|
|
std::ostream& solver::display(std::ostream& out) const {
|
|
return out << "theory-sls\n";
|
|
}
|
|
|
|
|
|
#endif
|
|
}
|