mirror of
https://github.com/Z3Prover/z3
synced 2025-08-13 14:40:55 +00:00
avoid creating full tables when negated variables are unitary, add lazy table infrastructure, fix coi_filter for relations, reduce dependencies on fixedpoing_parameters.hpp header file
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
0f9160a738
commit
716663b04a
40 changed files with 1221 additions and 126 deletions
|
@ -27,6 +27,7 @@ Revision History:
|
|||
#include"ast_smt2_pp.h"
|
||||
#include"datatype_decl_plugin.h"
|
||||
#include"scoped_proof.h"
|
||||
#include"fixedpoint_params.hpp"
|
||||
|
||||
|
||||
namespace datalog {
|
||||
|
@ -199,7 +200,7 @@ namespace datalog {
|
|||
m_register_engine(re),
|
||||
m_fparams(fp),
|
||||
m_params_ref(pa),
|
||||
m_params(m_params_ref),
|
||||
m_params(alloc(fixedpoint_params, m_params_ref)),
|
||||
m_decl_util(m),
|
||||
m_rewriter(m),
|
||||
m_var_subst(m),
|
||||
|
@ -263,6 +264,31 @@ namespace datalog {
|
|||
return *m_sorts.find(s);
|
||||
}
|
||||
|
||||
|
||||
bool context::generate_proof_trace() const { return m_params->generate_proof_trace(); }
|
||||
bool context::output_profile() const { return m_params->output_profile(); }
|
||||
bool context::output_tuples() const { return m_params->output_tuples(); }
|
||||
bool context::use_map_names() const { return m_params->use_map_names(); }
|
||||
bool context::fix_unbound_vars() const { return m_params->fix_unbound_vars(); }
|
||||
symbol context::default_table() const { return m_params->default_table(); }
|
||||
symbol context::default_relation() const { return m_params->default_relation(); } // external_relation_plugin::get_name());
|
||||
symbol context::default_table_checker() const { return m_params->default_table_checker(); }
|
||||
bool context::default_table_checked() const { return m_params->default_table_checked(); }
|
||||
bool context::dbg_fpr_nonempty_relation_signature() const { return m_params->dbg_fpr_nonempty_relation_signature(); }
|
||||
unsigned context::dl_profile_milliseconds_threshold() const { return m_params->profile_timeout_milliseconds(); }
|
||||
bool context::all_or_nothing_deltas() const { return m_params->all_or_nothing_deltas(); }
|
||||
bool context::compile_with_widening() const { return m_params->compile_with_widening(); }
|
||||
bool context::unbound_compressor() const { return m_params->unbound_compressor(); }
|
||||
bool context::similarity_compressor() const { return m_params->similarity_compressor(); }
|
||||
unsigned context::similarity_compressor_threshold() const { return m_params->similarity_compressor_threshold(); }
|
||||
unsigned context::soft_timeout() const { return m_fparams.m_soft_timeout; }
|
||||
unsigned context::initial_restart_timeout() const { return m_params->initial_restart_timeout(); }
|
||||
bool context::generate_explanations() const { return m_params->generate_explanations(); }
|
||||
bool context::explanations_on_relation_level() const { return m_params->explanations_on_relation_level(); }
|
||||
bool context::magic_sets_for_queries() const { return m_params->magic_sets_for_queries(); }
|
||||
bool context::eager_emptiness_checking() const { return m_params->eager_emptiness_checking(); }
|
||||
|
||||
|
||||
void context::register_finite_sort(sort * s, sort_kind k) {
|
||||
m_pinned.push_back(s);
|
||||
SASSERT(!m_sorts.contains(s));
|
||||
|
@ -861,7 +887,7 @@ namespace datalog {
|
|||
};
|
||||
|
||||
void context::configure_engine() {
|
||||
symbol e = m_params.engine();
|
||||
symbol e = m_params->engine();
|
||||
|
||||
if (e == symbol("datalog")) {
|
||||
m_engine_type = DATALOG_ENGINE;
|
||||
|
@ -1082,9 +1108,9 @@ namespace datalog {
|
|||
expr_ref fml(m);
|
||||
expr_ref_vector rules(m);
|
||||
svector<symbol> names;
|
||||
bool use_fixedpoint_extensions = m_params.print_with_fixedpoint_extensions();
|
||||
bool print_low_level = m_params.print_low_level_smt2();
|
||||
bool do_declare_vars = m_params.print_with_variable_declarations();
|
||||
bool use_fixedpoint_extensions = m_params->print_with_fixedpoint_extensions();
|
||||
bool print_low_level = m_params->print_low_level_smt2();
|
||||
bool do_declare_vars = m_params->print_with_variable_declarations();
|
||||
|
||||
#define PP(_e_) if (print_low_level) out << mk_smt_pp(_e_, m); else ast_smt2_pp(out, _e_, env);
|
||||
|
||||
|
|
|
@ -43,6 +43,8 @@ Revision History:
|
|||
#include"expr_functors.h"
|
||||
#include"dl_engine_base.h"
|
||||
|
||||
struct fixedpoint_params;
|
||||
|
||||
namespace datalog {
|
||||
|
||||
enum execution_result {
|
||||
|
@ -168,7 +170,7 @@ namespace datalog {
|
|||
register_engine_base& m_register_engine;
|
||||
smt_params & m_fparams;
|
||||
params_ref m_params_ref;
|
||||
fixedpoint_params m_params;
|
||||
fixedpoint_params* m_params;
|
||||
dl_decl_util m_decl_util;
|
||||
th_rewriter m_rewriter;
|
||||
var_subst m_var_subst;
|
||||
|
@ -231,33 +233,35 @@ namespace datalog {
|
|||
ast_manager & get_manager() const { return m; }
|
||||
rule_manager & get_rule_manager() { return m_rule_manager; }
|
||||
smt_params & get_fparams() const { return m_fparams; }
|
||||
fixedpoint_params const& get_params() const { return m_params; }
|
||||
fixedpoint_params const& get_params() const { return *m_params; }
|
||||
DL_ENGINE get_engine() { configure_engine(); return m_engine_type; }
|
||||
register_engine_base& get_register_engine() { return m_register_engine; }
|
||||
th_rewriter& get_rewriter() { return m_rewriter; }
|
||||
var_subst & get_var_subst() { return m_var_subst; }
|
||||
dl_decl_util & get_decl_util() { return m_decl_util; }
|
||||
|
||||
bool generate_proof_trace() const { return m_params.generate_proof_trace(); }
|
||||
bool output_profile() const { return m_params.output_profile(); }
|
||||
bool fix_unbound_vars() const { return m_params.fix_unbound_vars(); }
|
||||
symbol default_table() const { return m_params.default_table(); }
|
||||
symbol default_relation() const { return m_params.default_relation(); } // external_relation_plugin::get_name());
|
||||
symbol default_table_checker() const { return m_params.default_table_checker(); }
|
||||
bool default_table_checked() const { return m_params.default_table_checked(); }
|
||||
bool dbg_fpr_nonempty_relation_signature() const { return m_params.dbg_fpr_nonempty_relation_signature(); }
|
||||
unsigned dl_profile_milliseconds_threshold() const { return m_params.profile_timeout_milliseconds(); }
|
||||
bool all_or_nothing_deltas() const { return m_params.all_or_nothing_deltas(); }
|
||||
bool compile_with_widening() const { return m_params.compile_with_widening(); }
|
||||
bool unbound_compressor() const { return m_params.unbound_compressor(); }
|
||||
bool similarity_compressor() const { return m_params.similarity_compressor(); }
|
||||
unsigned similarity_compressor_threshold() const { return m_params.similarity_compressor_threshold(); }
|
||||
unsigned soft_timeout() const { return m_fparams.m_soft_timeout; }
|
||||
unsigned initial_restart_timeout() const { return m_params.initial_restart_timeout(); }
|
||||
bool generate_explanations() const { return m_params.generate_explanations(); }
|
||||
bool explanations_on_relation_level() const { return m_params.explanations_on_relation_level(); }
|
||||
bool magic_sets_for_queries() const { return m_params.magic_sets_for_queries(); }
|
||||
bool eager_emptiness_checking() const { return m_params.eager_emptiness_checking(); }
|
||||
bool generate_proof_trace() const;
|
||||
bool output_profile() const;
|
||||
bool output_tuples() const;
|
||||
bool use_map_names() const;
|
||||
bool fix_unbound_vars() const;
|
||||
symbol default_table() const;
|
||||
symbol default_relation() const;
|
||||
symbol default_table_checker() const;
|
||||
bool default_table_checked() const;
|
||||
bool dbg_fpr_nonempty_relation_signature() const;
|
||||
unsigned dl_profile_milliseconds_threshold() const;
|
||||
bool all_or_nothing_deltas() const;
|
||||
bool compile_with_widening() const;
|
||||
bool unbound_compressor() const;
|
||||
bool similarity_compressor() const;
|
||||
unsigned similarity_compressor_threshold() const;
|
||||
unsigned soft_timeout() const;
|
||||
unsigned initial_restart_timeout() const;
|
||||
bool generate_explanations() const;
|
||||
bool explanations_on_relation_level() const;
|
||||
bool magic_sets_for_queries() const;
|
||||
bool eager_emptiness_checking() const;
|
||||
|
||||
void register_finite_sort(sort * s, sort_kind k);
|
||||
|
||||
|
|
|
@ -30,9 +30,32 @@ Revision History:
|
|||
#include"dl_context.h"
|
||||
#include"dl_rule.h"
|
||||
#include"dl_util.h"
|
||||
#include"stopwatch.h"
|
||||
|
||||
namespace datalog {
|
||||
|
||||
static unsigned verbose_action_inside = 0;
|
||||
|
||||
verbose_action::verbose_action(char const* msg, unsigned lvl): m_lvl(lvl), m_sw(0) {
|
||||
IF_VERBOSE(m_lvl,
|
||||
(verbose_stream() << msg << "...").flush();
|
||||
m_sw = alloc(stopwatch);
|
||||
m_sw->start(););
|
||||
}
|
||||
|
||||
verbose_action::~verbose_action() {
|
||||
double sec = 0.0;
|
||||
if (m_sw) m_sw->stop();
|
||||
sec = m_sw?m_sw->get_seconds():0.0;
|
||||
if (sec < 0.001) sec = 0.0;
|
||||
IF_VERBOSE(m_lvl,
|
||||
(verbose_stream() << sec << "s\n").flush();
|
||||
);
|
||||
dealloc(m_sw);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool contains_var(expr * trm, unsigned var_idx) {
|
||||
ptr_vector<sort> vars;
|
||||
|
|
|
@ -26,7 +26,6 @@ Revision History:
|
|||
#include"horn_subsume_model_converter.h"
|
||||
#include"replace_proof_converter.h"
|
||||
#include"substitution.h"
|
||||
#include"fixedpoint_params.hpp"
|
||||
#include"ast_counter.h"
|
||||
#include"statistics.h"
|
||||
#include"lbool.h"
|
||||
|
@ -43,6 +42,14 @@ namespace datalog {
|
|||
class relation_fact;
|
||||
class relation_signature;
|
||||
|
||||
class verbose_action {
|
||||
unsigned m_lvl;
|
||||
class stopwatch* m_sw;
|
||||
public:
|
||||
verbose_action(char const* msg, unsigned lvl = 1);
|
||||
~verbose_action();
|
||||
};
|
||||
|
||||
enum PDR_CACHE_MODE {
|
||||
NO_CACHE,
|
||||
HASH_CACHE,
|
||||
|
@ -706,29 +713,6 @@ namespace datalog {
|
|||
dealloc(ptr);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
class scoped_rel {
|
||||
T* m_t;
|
||||
public:
|
||||
scoped_rel(T* t) : m_t(t) {}
|
||||
~scoped_rel() { if (m_t) { universal_delete(m_t); } }
|
||||
scoped_rel() : m_t(0) {}
|
||||
scoped_rel& operator=(T* t) { if (m_t) { universal_delete(m_t); } m_t = t; return *this; }
|
||||
T* operator->() { return m_t; }
|
||||
const T* operator->() const { return m_t; }
|
||||
T& operator*() { return *m_t; }
|
||||
const T& operator*() const { return *m_t; }
|
||||
operator bool() const { return m_t!=0; }
|
||||
T* get() const { return m_t; }
|
||||
/**
|
||||
\brief Remove object from \c scoped_rel without deleting it.
|
||||
*/
|
||||
T* release() {
|
||||
T* res = m_t;
|
||||
m_t = 0;
|
||||
return res;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
\brief If it is possible to convert the beginning of \c s to uint64,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue