mirror of
https://github.com/Z3Prover/z3
synced 2025-08-26 04:56:03 +00:00
pair programming
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d190c83984
commit
03f2e6775c
2 changed files with 187 additions and 14 deletions
|
@ -25,23 +25,70 @@ namespace smt {
|
|||
class parallel {
|
||||
context& ctx;
|
||||
|
||||
class worker {
|
||||
ast_manager m;
|
||||
context ctx;
|
||||
expr_ref_vector asms;
|
||||
class batch_manager {
|
||||
ast_manager& m;
|
||||
parallel& p;
|
||||
std::mutex mux;
|
||||
expr_ref_vector m_split_atoms; // atoms to split on
|
||||
vector<expr_ref_vector> m_cubes;
|
||||
lbool m_result = l_false;
|
||||
unsigned m_max_batch_size = 10;
|
||||
|
||||
public:
|
||||
worker(context& ctx, expr_ref_vector const& asms);
|
||||
void run();
|
||||
void cancel();
|
||||
batch_manager(ast_manager& m, parallel& p) : m(m), p(p), m_split_atoms(m) { m_cubes.push_back(expr_ref_vector(m)); }
|
||||
void set_unsat();
|
||||
void set_sat(ast_translation& l2g, model& m);
|
||||
void set_exception(std::string const& msg);
|
||||
void set_exception(unsigned error_code);
|
||||
|
||||
//
|
||||
// worker threads ask the batch manager for a supply of cubes to check.
|
||||
// they pass in a translation function from the global context to local context (ast-manager). It is called g2l.
|
||||
// The batch manager returns a list of cubes to solve.
|
||||
//
|
||||
void get_cubes(ast_translation& g2l, vector<expr_ref_vector>& cubes);
|
||||
|
||||
//
|
||||
// worker threads return unprocessed cubes to the batch manager together with split literal candidates.
|
||||
// the batch manager re-enqueues unprocessed cubes and optionally splits them using the split_atoms returned by this and workers.
|
||||
//
|
||||
void return_cubes(ast_translation& l2g, vector<expr_ref_vector>const& cubes, expr_ref_vector const& split_atoms);
|
||||
void share_lemma(ast_translation& l2g, expr* lemma);
|
||||
lbool get_result() const { return m.limit().is_canceled() ? l_undef : m_result; }
|
||||
};
|
||||
|
||||
std::mutex mux;
|
||||
void set_unsat();
|
||||
void set_sat(ast_translation& tr, model& m);
|
||||
void get_cubes(ast_translation& tr, expr_ref_vector& cubes);
|
||||
class worker {
|
||||
parallel& p;
|
||||
batch_manager& b;
|
||||
ast_manager m;
|
||||
expr_ref_vector asms;
|
||||
smt_params m_smt_params;
|
||||
scoped_ptr<context> ctx;
|
||||
unsigned m_max_conflicts = 100;
|
||||
unsigned m_num_shared_units = 0;
|
||||
void share_units();
|
||||
lbool check_cube(expr_ref_vector const& cube);
|
||||
public:
|
||||
worker(parallel& p, context& _ctx, expr_ref_vector const& _asms);
|
||||
void run();
|
||||
void cancel() {
|
||||
m.limit().cancel();
|
||||
}
|
||||
void collect_statistics(::statistics& st) const {
|
||||
ctx->collect_statistics(st);
|
||||
}
|
||||
reslimit& limit() {
|
||||
return m.limit();
|
||||
}
|
||||
};
|
||||
|
||||
batch_manager m_batch_manager;
|
||||
ptr_vector<worker> m_workers;
|
||||
|
||||
lbool new_check(expr_ref_vector const& asms);
|
||||
|
||||
public:
|
||||
parallel(context& ctx): ctx(ctx) {}
|
||||
parallel(context& ctx): ctx(ctx), m_batch_manager(ctx.m, *this) {}
|
||||
|
||||
lbool operator()(expr_ref_vector const& asms);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue