mirror of
https://github.com/Z3Prover/z3
synced 2025-08-25 20:46:01 +00:00
* very basic setup * ensure solve_eqs is fully disabled when smt.solve_eqs=false, #7743 Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * respect smt configuration parameter in elim_unconstrained simplifier Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * indentation * add bash files for test runs * add option to selectively disable variable solving for only ground expressions Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove verbose output Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix #7745 axioms for len(substr(...)) escaped due to nested rewriting * ensure atomic constraints are processed by arithmetic solver * #7739 optimization add simplification rule for at(x, offset) = "" Introducing j just postpones some rewrites that prevent useful simplifications. Z3 already uses common sub-expressions. The example highlights some opportunities for simplification, noteworthy at(..) = "". The example is solved in both versions after adding this simplification. * fix unsound len(substr) axiom Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * FreshConst is_sort (#7748) * #7750 add pre-processing simplification * Add parameter validation for selected API functions * updates to ac-plugin fix incrementality bugs by allowing destructive updates during saturation at the cost of redoing saturation after a pop. * enable passive, add check for bloom up-to-date * add top-k fixed-sized min-heap priority queue for top scoring literals * set up worker thread batch manager for multithreaded batch cubes paradigm, need to debug as I am getting segfault still * fix bug in parallel solving batch setup * fix bug * allow for internalize implies * disable pre-processing during cubing * debugging * remove default constructor * remove a bunch of string copies * Update euf_ac_plugin.cpp include reduction rules in forward simplification * Update euf_completion.cpp try out restricting scope of equalities added by instantation * Update smt_parallel.cpp Drop non-relevant units from shared structures. * process cubes as lists of individual lits * merge * Add support for Algebraic Datatypes in JavaScript/TypeScript bindings (#7734) * Initial plan * Add datatype type definitions to types.ts (work in progress) Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Complete datatype type definitions with working TypeScript compilation Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Implement core datatype functionality with TypeScript compilation success Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Complete datatype implementation with full Context integration and tests Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * chipping away at the new code structure * comments * debug infinite recursion and split cubes on existing split atoms that aren't in the cube * share lemmas, learn from unsat core, try to debug a couple of things, there was a subtle bug that i have a hard time repro'ing * merge * resolve bad bug about l2g and g2l translators using wrong global context. add some debug prints * initial attempt at dynamically switching from greedy to frugal splitting strategy in return_cubes. need to test. also there is some bug where the threads take forever to cancel? --------- Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com> Co-authored-by: humnrdble <83878671+humnrdble@users.noreply.github.com> Co-authored-by: Nuno Lopes <nuno.lopes@tecnico.ulisboa.pt> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
127 lines
4 KiB
C++
127 lines
4 KiB
C++
/*++
|
|
Copyright (c) 2020 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
smt_parallel.h
|
|
|
|
Abstract:
|
|
|
|
Parallel SMT, portfolio loop specialized to SMT core.
|
|
|
|
Author:
|
|
|
|
nbjorner 2020-01-31
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#pragma once
|
|
|
|
#include "smt/smt_context.h"
|
|
#include <thread>
|
|
|
|
namespace smt {
|
|
|
|
class parallel {
|
|
context& ctx;
|
|
unsigned num_threads;
|
|
|
|
class batch_manager {
|
|
|
|
enum state {
|
|
is_running,
|
|
is_sat,
|
|
is_unsat,
|
|
is_exception_msg,
|
|
is_exception_code
|
|
};
|
|
|
|
ast_manager& m;
|
|
parallel& p;
|
|
std::mutex mux;
|
|
state m_state = state::is_running;
|
|
expr_ref_vector m_split_atoms; // atoms to split on
|
|
vector<expr_ref_vector> m_cubes;
|
|
unsigned m_max_batch_size = 10;
|
|
unsigned m_exception_code = 0;
|
|
std::string m_exception_msg;
|
|
|
|
// called from batch manager to cancel other workers if we've reached a verdict
|
|
void cancel_workers() {
|
|
IF_VERBOSE(0, verbose_stream() << "Canceling workers\n");
|
|
for (auto& w : p.m_workers)
|
|
w->cancel();
|
|
}
|
|
|
|
public:
|
|
batch_manager(ast_manager& m, parallel& p) : m(m), p(p), m_split_atoms(m) { }
|
|
|
|
void initialize();
|
|
|
|
void set_unsat(ast_translation& l2g, expr_ref_vector const& unsat_core);
|
|
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;
|
|
};
|
|
|
|
class worker {
|
|
unsigned id; // unique identifier for the 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(unsigned id, parallel& p, expr_ref_vector const& _asms);
|
|
void run();
|
|
expr_ref_vector get_split_atoms();
|
|
void cancel() {
|
|
IF_VERBOSE(0, verbose_stream() << "Worker " << id << " canceling\n");
|
|
m.limit().cancel();
|
|
}
|
|
void collect_statistics(::statistics& st) const {
|
|
IF_VERBOSE(0, verbose_stream() << "Collecting statistics for worker " << id << "\n");
|
|
ctx->collect_statistics(st);
|
|
}
|
|
reslimit& limit() {
|
|
return m.limit();
|
|
}
|
|
};
|
|
|
|
batch_manager m_batch_manager;
|
|
ptr_vector<worker> m_workers;
|
|
|
|
public:
|
|
parallel(context& ctx) :
|
|
ctx(ctx),
|
|
num_threads(std::min(
|
|
(unsigned)std::thread::hardware_concurrency(),
|
|
ctx.get_fparams().m_threads)),
|
|
m_batch_manager(ctx.m, *this) {}
|
|
|
|
lbool operator()(expr_ref_vector const& asms);
|
|
|
|
};
|
|
|
|
}
|