mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 22:23:22 +00:00
enable multiple local search threads
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
cd4a2701db
commit
ac59e7b6d3
4 changed files with 16 additions and 8 deletions
|
@ -259,6 +259,7 @@ namespace sat {
|
||||||
bool get_phase(bool_var v) const { return is_true(v); }
|
bool get_phase(bool_var v) const { return is_true(v); }
|
||||||
|
|
||||||
model& get_model() { return m_model; }
|
model& get_model() { return m_model; }
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -710,11 +710,11 @@ namespace sat {
|
||||||
m_watches.push_back(watch_list());
|
m_watches.push_back(watch_list());
|
||||||
m_bstamp.push_back(0);
|
m_bstamp.push_back(0);
|
||||||
m_bstamp.push_back(0);
|
m_bstamp.push_back(0);
|
||||||
|
m_dfs.push_back(dfs_info());
|
||||||
|
m_dfs.push_back(dfs_info());
|
||||||
|
m_lits.push_back(lit_info());
|
||||||
|
m_lits.push_back(lit_info());
|
||||||
m_rating.push_back(0);
|
m_rating.push_back(0);
|
||||||
m_dfs.push_back(dfs_info());
|
|
||||||
m_dfs.push_back(dfs_info());
|
|
||||||
m_lits.push_back(lit_info());
|
|
||||||
m_lits.push_back(lit_info());
|
|
||||||
m_prefix.push_back(prefix());
|
m_prefix.push_back(prefix());
|
||||||
m_freevars.insert(v);
|
m_freevars.insert(v);
|
||||||
}
|
}
|
||||||
|
@ -1125,6 +1125,7 @@ namespace sat {
|
||||||
unsigned scope_lvl() const { return m_trail_lim.size(); }
|
unsigned scope_lvl() const { return m_trail_lim.size(); }
|
||||||
|
|
||||||
void assign(literal l) {
|
void assign(literal l) {
|
||||||
|
SASSERT(m_level > 0);
|
||||||
if (is_undef(l)) {
|
if (is_undef(l)) {
|
||||||
set_true(l);
|
set_true(l);
|
||||||
m_trail.push_back(l);
|
m_trail.push_back(l);
|
||||||
|
|
|
@ -91,7 +91,7 @@ namespace sat {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
parallel::parallel(solver& s): m_scoped_rlimit(s.rlimit()) {}
|
parallel::parallel(solver& s): m_scoped_rlimit(s.rlimit()), m_num_clauses(0) {}
|
||||||
|
|
||||||
parallel::~parallel() {
|
parallel::~parallel() {
|
||||||
for (unsigned i = 0; i < m_solvers.size(); ++i) {
|
for (unsigned i = 0; i < m_solvers.size(); ++i) {
|
||||||
|
@ -227,9 +227,11 @@ namespace sat {
|
||||||
}
|
}
|
||||||
if (90 * m_num_clauses > 100 * s.m_clauses.size() && !m_solver_copy) {
|
if (90 * m_num_clauses > 100 * s.m_clauses.size() && !m_solver_copy) {
|
||||||
// time to update local search with new clauses.
|
// time to update local search with new clauses.
|
||||||
|
// there could be multiple local search engines runing at the same time.
|
||||||
IF_VERBOSE(1, verbose_stream() << "(sat-parallel refresh local search " << m_num_clauses << " -> " << s.m_clauses.size() << ")\n";);
|
IF_VERBOSE(1, verbose_stream() << "(sat-parallel refresh local search " << m_num_clauses << " -> " << s.m_clauses.size() << ")\n";);
|
||||||
m_solver_copy = alloc(solver, s.m_params, s.rlimit());
|
m_solver_copy = alloc(solver, s.m_params, s.rlimit());
|
||||||
m_solver_copy->copy(s);
|
m_solver_copy->copy(s);
|
||||||
|
m_num_clauses = s.m_clauses.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,16 +266,20 @@ namespace sat {
|
||||||
void parallel::get_phase(local_search& s) {
|
void parallel::get_phase(local_search& s) {
|
||||||
#pragma omp critical (par_solver)
|
#pragma omp critical (par_solver)
|
||||||
{
|
{
|
||||||
if (m_solver_copy) {
|
if (m_solver_copy && s.num_non_binary_clauses() > m_solver_copy->m_clauses.size()) {
|
||||||
s.import(*m_solver_copy.get(), true);
|
s.import(*m_solver_copy.get(), true);
|
||||||
|
m_num_clauses = s.num_non_binary_clauses();
|
||||||
|
SASSERT(s.num_non_binary_clauses() == m_solver_copy->m_clauses.size());
|
||||||
m_solver_copy = 0;
|
m_solver_copy = 0;
|
||||||
}
|
}
|
||||||
|
if (m_num_clauses < s.num_non_binary_clauses()) {
|
||||||
|
m_num_clauses = s.num_non_binary_clauses();
|
||||||
|
}
|
||||||
for (unsigned i = 0; i < m_phase.size(); ++i) {
|
for (unsigned i = 0; i < m_phase.size(); ++i) {
|
||||||
s.set_phase(i, m_phase[i]);
|
s.set_phase(i, m_phase[i]);
|
||||||
m_phase[i] = l_undef;
|
m_phase[i] = l_undef;
|
||||||
}
|
}
|
||||||
m_phase.reserve(s.num_vars(), l_undef);
|
m_phase.reserve(s.num_vars(), l_undef);
|
||||||
m_num_clauses = s.num_non_binary_clauses();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -863,7 +863,7 @@ namespace sat {
|
||||||
int num_local_search = static_cast<int>(m_config.m_local_search);
|
int num_local_search = static_cast<int>(m_config.m_local_search);
|
||||||
for (int i = 0; i < num_local_search; ++i) {
|
for (int i = 0; i < num_local_search; ++i) {
|
||||||
local_search* l = alloc(local_search);
|
local_search* l = alloc(local_search);
|
||||||
l->config().set_seed(m_config.m_random_seed);
|
l->config().set_seed(m_config.m_random_seed + i);
|
||||||
l->import(*this, false);
|
l->import(*this, false);
|
||||||
ls.push_back(l);
|
ls.push_back(l);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue