mirror of
https://github.com/Z3Prover/z3
synced 2025-06-24 14:53:40 +00:00
Perform clause simplification earlier
This commit is contained in:
parent
44f0f88172
commit
5f2fd039ba
8 changed files with 57 additions and 45 deletions
|
@ -72,7 +72,7 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bool_var_manager::eval(sat::literal lit, unsigned lvl) {
|
void bool_var_manager::eval(sat::literal lit, unsigned lvl) {
|
||||||
LOG_V("Evaluate " << lit << " @ " << lvl);
|
LOG_V(10, "Evaluate " << lit << " @ " << lvl);
|
||||||
assign(kind_t::evaluation, lit, lvl, nullptr);
|
assign(kind_t::evaluation, lit, lvl, nullptr);
|
||||||
SASSERT(is_evaluation(lit));
|
SASSERT(is_evaluation(lit));
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,6 +310,7 @@ namespace polysat {
|
||||||
|
|
||||||
LOG_H3("Lemma " << (name ? name : "<unknown>") << ": " << show_deref(lemma));
|
LOG_H3("Lemma " << (name ? name : "<unknown>") << ": " << show_deref(lemma));
|
||||||
SASSERT(lemma);
|
SASSERT(lemma);
|
||||||
|
s.m_simplify_clause.apply(*lemma);
|
||||||
lemma->set_redundant(true);
|
lemma->set_redundant(true);
|
||||||
for (sat::literal lit : *lemma) {
|
for (sat::literal lit : *lemma) {
|
||||||
LOG(lit_pp(s, lit));
|
LOG(lit_pp(s, lit));
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace polysat {
|
||||||
|
|
||||||
/** Add constraint to per-level storage */
|
/** Add constraint to per-level storage */
|
||||||
void constraint_manager::store(constraint* c) {
|
void constraint_manager::store(constraint* c) {
|
||||||
LOG_V("Store constraint: " << show_deref(c));
|
LOG_V(20, "Store constraint: " << show_deref(c));
|
||||||
m_constraints.push_back(c);
|
m_constraints.push_back(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,9 +65,11 @@ static LogLevel get_max_log_level(std::string const& fn, std::string const& pret
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Filter log messages
|
/// Filter log messages
|
||||||
bool polysat_should_log(LogLevel msg_level, std::string fn, std::string pretty_fn) {
|
bool polysat_should_log(unsigned verbose_lvl, LogLevel msg_level, std::string fn, std::string pretty_fn) {
|
||||||
if (!g_log_enabled)
|
if (!g_log_enabled)
|
||||||
return false;
|
return false;
|
||||||
|
if (get_verbosity_level() < verbose_lvl)
|
||||||
|
return false;
|
||||||
LogLevel max_log_level = get_max_log_level(fn, pretty_fn);
|
LogLevel max_log_level = get_max_log_level(fn, pretty_fn);
|
||||||
return msg_level <= max_log_level;
|
return msg_level <= max_log_level;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ enum class LogLevel : int {
|
||||||
|
|
||||||
/// Filter log messages
|
/// Filter log messages
|
||||||
bool
|
bool
|
||||||
polysat_should_log(LogLevel msg_level, std::string fn, std::string pretty_fn);
|
polysat_should_log(unsigned verbose_lvl, LogLevel msg_level, std::string fn, std::string pretty_fn);
|
||||||
|
|
||||||
std::pair<std::ostream&, bool>
|
std::pair<std::ostream&, bool>
|
||||||
polysat_log(LogLevel msg_level, std::string fn, std::string pretty_fn);
|
polysat_log(LogLevel msg_level, std::string fn, std::string pretty_fn);
|
||||||
|
@ -70,31 +70,36 @@ polysat_log(LogLevel msg_level, std::string fn, std::string pretty_fn);
|
||||||
#define __PRETTY_FUNCTION__ __FUNCSIG__
|
#define __PRETTY_FUNCTION__ __FUNCSIG__
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LOG_(lvl, x) \
|
#define LOG_(verbose_lvl, log_lvl, x) \
|
||||||
do { \
|
do { \
|
||||||
if (polysat_should_log(lvl, __func__, __PRETTY_FUNCTION__)) { \
|
if (polysat_should_log(verbose_lvl, log_lvl, __func__, __PRETTY_FUNCTION__)) { \
|
||||||
auto pair = polysat_log(lvl, __func__, __PRETTY_FUNCTION__); \
|
auto pair = polysat_log(log_lvl, __func__, __PRETTY_FUNCTION__); \
|
||||||
std::ostream& os = pair.first; \
|
std::ostream& os = pair.first; \
|
||||||
bool should_reset = pair.second; \
|
bool should_reset = pair.second; \
|
||||||
os << x; \
|
os << x; \
|
||||||
if (should_reset) \
|
if (should_reset) \
|
||||||
os << color_reset(); \
|
os << color_reset(); \
|
||||||
os << std::endl; \
|
os << std::endl; \
|
||||||
} \
|
} \
|
||||||
} while (false)
|
} while (false)
|
||||||
|
|
||||||
#define LOG_CONCAT_HELPER(a,b) a ## b
|
#define LOG_CONCAT_HELPER(a,b) a ## b
|
||||||
#define LOG_CONCAT(a,b) LOG_CONCAT_HELPER(a,b)
|
#define LOG_CONCAT(a,b) LOG_CONCAT_HELPER(a,b)
|
||||||
|
|
||||||
#define LOG_INDENT(lvl, x) \
|
#define LOG_INDENT(verbose_lvl, log_lvl, x) \
|
||||||
LOG_(lvl, x); \
|
LOG_(verbose_lvl, log_lvl, x); \
|
||||||
polysat_log_indent LOG_CONCAT(polysat_log_indent_obj_, __LINE__) (4);
|
polysat_log_indent LOG_CONCAT(polysat_log_indent_obj_, __LINE__) (4);
|
||||||
|
|
||||||
#define LOG_H1(x) LOG_INDENT(LogLevel::Heading1, x)
|
#define LOG_H1(x) LOG_INDENT(0, LogLevel::Heading1, x)
|
||||||
#define LOG_H2(x) LOG_INDENT(LogLevel::Heading2, x)
|
#define LOG_H2(x) LOG_INDENT(0, LogLevel::Heading2, x)
|
||||||
#define LOG_H3(x) LOG_INDENT(LogLevel::Heading3, x)
|
#define LOG_H3(x) LOG_INDENT(0, LogLevel::Heading3, x)
|
||||||
#define LOG(x) LOG_(LogLevel::Default , x)
|
#define LOG(x) LOG_(0, LogLevel::Default , x)
|
||||||
#define LOG_V(x) LOG_(LogLevel::Verbose , x)
|
|
||||||
|
#define LOG_H1_V(verbose_lvl, x) LOG_INDENT(verbose_lvl, LogLevel::Heading1, x)
|
||||||
|
#define LOG_H2_V(verbose_lvl, x) LOG_INDENT(verbose_lvl, LogLevel::Heading2, x)
|
||||||
|
#define LOG_H3_V(verbose_lvl, x) LOG_INDENT(verbose_lvl, LogLevel::Heading3, x)
|
||||||
|
#define LOG_V(verbose_lvl, x) LOG_(verbose_lvl, LogLevel::Verbose , x)
|
||||||
|
|
||||||
#define COND_LOG(c, x) if (c) LOG(x)
|
#define COND_LOG(c, x) if (c) LOG(x)
|
||||||
#define LOGE(x) LOG(#x << " = " << (x))
|
#define LOGE(x) LOG(#x << " = " << (x))
|
||||||
|
|
||||||
|
@ -110,18 +115,23 @@ inline void set_log_enabled(bool) {}
|
||||||
inline bool get_log_enabled() { return false; }
|
inline bool get_log_enabled() { return false; }
|
||||||
class scoped_set_log_enabled {};
|
class scoped_set_log_enabled {};
|
||||||
|
|
||||||
#define LOG_(lvl, x) \
|
#define LOG_(vlvl, lvl, x) \
|
||||||
do { \
|
do { \
|
||||||
/* do nothing */ \
|
/* do nothing */ \
|
||||||
} while (false)
|
} while (false)
|
||||||
|
|
||||||
#define LOG_H1(x) LOG_(0, x)
|
#define LOG_H1(x) LOG_(0, 0, x)
|
||||||
#define LOG_H2(x) LOG_(0, x)
|
#define LOG_H2(x) LOG_(0, 0, x)
|
||||||
#define LOG_H3(x) LOG_(0, x)
|
#define LOG_H3(x) LOG_(0, 0, x)
|
||||||
#define LOG(x) LOG_(0, x)
|
#define LOG(x) LOG_(0, 0, x)
|
||||||
#define LOG_V(x) LOG_(0, x)
|
|
||||||
#define COND_LOG(c, x) LOG_(c, x)
|
#define LOG_H1_V(v, x) LOG_(v, 0, x)
|
||||||
#define LOGE(x) LOG_(0, x)
|
#define LOG_H2_V(v, x) LOG_(v, 0, x)
|
||||||
|
#define LOG_H3_V(v, x) LOG_(v, 0, x)
|
||||||
|
#define LOG_V(v, x) LOG_(v, 0, x)
|
||||||
|
|
||||||
|
#define COND_LOG(c, x) LOG_(0, c, x)
|
||||||
|
#define LOGE(x) LOG_(0, 0, x)
|
||||||
|
|
||||||
#define IF_LOGGING(x) \
|
#define IF_LOGGING(x) \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -94,7 +94,7 @@ namespace polysat {
|
||||||
sat::literal eq = sat::null_literal;
|
sat::literal eq = sat::null_literal;
|
||||||
rational k;
|
rational k;
|
||||||
for (sat::literal lit : cl) {
|
for (sat::literal lit : cl) {
|
||||||
LOG_V("Examine " << lit_pp(s, lit));
|
LOG_V(10, "Examine " << lit_pp(s, lit));
|
||||||
lbool status = s.m_bvars.value(lit);
|
lbool status = s.m_bvars.value(lit);
|
||||||
// skip premise literals
|
// skip premise literals
|
||||||
if (status == l_false)
|
if (status == l_false)
|
||||||
|
@ -237,7 +237,7 @@ namespace polysat {
|
||||||
for (unsigned i = 0; i < cl.size(); ++i) {
|
for (unsigned i = 0; i < cl.size(); ++i) {
|
||||||
subs_entry& entry = m_entries[i];
|
subs_entry& entry = m_entries[i];
|
||||||
sat::literal lit = cl[i];
|
sat::literal lit = cl[i];
|
||||||
LOG("Literal " << lit_pp(s, lit));
|
LOG_V(10, "Literal " << lit_pp(s, lit));
|
||||||
signed_constraint c = s.lit2cnstr(lit);
|
signed_constraint c = s.lit2cnstr(lit);
|
||||||
prepare_subs_entry(entry, c);
|
prepare_subs_entry(entry, c);
|
||||||
}
|
}
|
||||||
|
@ -254,7 +254,7 @@ namespace polysat {
|
||||||
continue;
|
continue;
|
||||||
if (e.interval.currently_contains(f.interval)) {
|
if (e.interval.currently_contains(f.interval)) {
|
||||||
// f subset of e ==> f.src subsumed by e.src
|
// f subset of e ==> f.src subsumed by e.src
|
||||||
LOG("Removing " << s.lit2cnstr(cl[i]) << " because it subsumes " << s.lit2cnstr(cl[j]));
|
LOG("Removing " << cl[i] << ": " << s.lit2cnstr(cl[i]) << " because it subsumes " << cl[j] << ": " << s.lit2cnstr(cl[j]));
|
||||||
e.subsuming = true;
|
e.subsuming = true;
|
||||||
any_subsumed = true;
|
any_subsumed = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -397,7 +397,7 @@ namespace polysat {
|
||||||
|
|
||||||
void solver::add_pwatch(constraint* c, pvar v) {
|
void solver::add_pwatch(constraint* c, pvar v) {
|
||||||
SASSERT(m_locked_wlist != v); // the propagate loop will not discover the new size
|
SASSERT(m_locked_wlist != v); // the propagate loop will not discover the new size
|
||||||
LOG_V("Watching v" << v << " in constraint " << show_deref(c));
|
LOG_V(20, "Watching v" << v << " in constraint " << show_deref(c));
|
||||||
m_pwatch[v].push_back(c);
|
m_pwatch[v].push_back(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -498,7 +498,7 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
case trail_instr_t::assign_i: {
|
case trail_instr_t::assign_i: {
|
||||||
auto v = m_search.back().var();
|
auto v = m_search.back().var();
|
||||||
LOG_V("Undo assign_i: v" << v);
|
LOG_V(20, "Undo assign_i: v" << v);
|
||||||
unsigned active_level = get_level(v);
|
unsigned active_level = get_level(v);
|
||||||
|
|
||||||
if (active_level <= target_level) {
|
if (active_level <= target_level) {
|
||||||
|
@ -514,7 +514,7 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
case trail_instr_t::assign_bool_i: {
|
case trail_instr_t::assign_bool_i: {
|
||||||
sat::literal lit = m_search.back().lit();
|
sat::literal lit = m_search.back().lit();
|
||||||
LOG_V("Undo assign_bool_i: " << lit);
|
LOG_V(20, "Undo assign_bool_i: " << lit);
|
||||||
unsigned active_level = m_bvars.level(lit);
|
unsigned active_level = m_bvars.level(lit);
|
||||||
|
|
||||||
if (active_level <= target_level)
|
if (active_level <= target_level)
|
||||||
|
@ -944,7 +944,6 @@ namespace polysat {
|
||||||
clause* best_lemma = nullptr;
|
clause* best_lemma = nullptr;
|
||||||
|
|
||||||
auto appraise_lemma = [&](clause* lemma) {
|
auto appraise_lemma = [&](clause* lemma) {
|
||||||
m_simplify_clause.apply(*lemma);
|
|
||||||
auto score = compute_lemma_score(*lemma);
|
auto score = compute_lemma_score(*lemma);
|
||||||
if (score)
|
if (score)
|
||||||
LOG(" score: " << *score);
|
LOG(" score: " << *score);
|
||||||
|
|
|
@ -185,9 +185,9 @@ namespace polysat {
|
||||||
signed_constraint sc(this, is_positive);
|
signed_constraint sc(this, is_positive);
|
||||||
|
|
||||||
LOG_H3("Narrowing " << sc);
|
LOG_H3("Narrowing " << sc);
|
||||||
LOG_V("Assignment: " << assignments_pp(s));
|
LOG_V(10, "Assignment: " << assignments_pp(s));
|
||||||
LOG_V("Substituted LHS: " << lhs() << " := " << p);
|
LOG_V(10, "Substituted LHS: " << lhs() << " := " << p);
|
||||||
LOG_V("Substituted RHS: " << rhs() << " := " << q);
|
LOG_V(10, "Substituted RHS: " << rhs() << " := " << q);
|
||||||
|
|
||||||
if (is_always_false(is_positive, p, q)) {
|
if (is_always_false(is_positive, p, q)) {
|
||||||
s.set_conflict(sc);
|
s.set_conflict(sc);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue