mirror of
https://github.com/Z3Prover/z3
synced 2025-06-03 04:41:21 +00:00
add logging to lookahead
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
0c7603e925
commit
51951a3683
1 changed files with 95 additions and 8 deletions
|
@ -160,6 +160,15 @@ namespace sat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool active_prefix(bool_var x) {
|
||||||
|
unsigned lvl = m_trail_lim.size();
|
||||||
|
unsigned p = m_vprefix[x].m_prefix;
|
||||||
|
unsigned l = m_vprefix[x].m_length;
|
||||||
|
if (l > lvl) return false;
|
||||||
|
if (l == lvl || l >= 32) return m_prefix == p;
|
||||||
|
return (m_prefix & ((1 << l) - 1)) == p;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
|
|
||||||
void add_binary(literal l1, literal l2) {
|
void add_binary(literal l1, literal l2) {
|
||||||
|
@ -315,6 +324,7 @@ namespace sat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TRACE("sat", display_candidates(tout););
|
||||||
SASSERT(!m_candidates.empty());
|
SASSERT(!m_candidates.empty());
|
||||||
if (m_candidates.size() > max_num_cand) {
|
if (m_candidates.size() > max_num_cand) {
|
||||||
unsigned j = m_candidates.size()/2;
|
unsigned j = m_candidates.size()/2;
|
||||||
|
@ -330,6 +340,7 @@ namespace sat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SASSERT(!m_candidates.empty() && m_candidates.size() <= max_num_cand);
|
SASSERT(!m_candidates.empty() && m_candidates.size() <= max_num_cand);
|
||||||
|
TRACE("sat", display_candidates(tout););
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,15 +364,22 @@ namespace sat {
|
||||||
for (bool_var const* it = m_freevars.begin(), * end = m_freevars.end(); it != end; ++it) {
|
for (bool_var const* it = m_freevars.begin(), * end = m_freevars.end(); it != end; ++it) {
|
||||||
SASSERT(is_undef(*it));
|
SASSERT(is_undef(*it));
|
||||||
bool_var x = *it;
|
bool_var x = *it;
|
||||||
if (!newbies) {
|
if (newbies || active_prefix(x)) {
|
||||||
// TBD filter out candidates based on prefix strings or similar method
|
m_candidates.push_back(candidate(x, m_rating[x]));
|
||||||
}
|
sum += m_rating[x];
|
||||||
m_candidates.push_back(candidate(x, m_rating[x]));
|
}
|
||||||
sum += m_rating[x];
|
}
|
||||||
}
|
TRACE("sat", display_candidates(tout << "sum: " << sum << "\n"););
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::ostream& display_candidates(std::ostream& out) const {
|
||||||
|
for (unsigned i = 0; i < m_candidates.size(); ++i) {
|
||||||
|
out << "var: " << m_candidates[i].m_var << " rating: " << m_candidates[i].m_rating << "\n";
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
bool is_sat() const {
|
bool is_sat() const {
|
||||||
for (bool_var const* it = m_freevars.begin(), * end = m_freevars.end(); it != end; ++it) {
|
for (bool_var const* it = m_freevars.begin(), * end = m_freevars.end(); it != end; ++it) {
|
||||||
literal l(*it, false);
|
literal l(*it, false);
|
||||||
|
@ -437,7 +455,33 @@ namespace sat {
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
if (is_undef(*it)) sum += h[it->index()];
|
if (is_undef(*it)) sum += h[it->index()];
|
||||||
}
|
}
|
||||||
// TBD walk ternary clauses.
|
watch_list& wlist = m_watches[l.index()];
|
||||||
|
watch_list::iterator wit = wlist.begin(), wend = wlist.end();
|
||||||
|
for (; wit != wend; ++wit) {
|
||||||
|
switch (wit->get_kind()) {
|
||||||
|
case watched::BINARY:
|
||||||
|
UNREACHABLE();
|
||||||
|
break;
|
||||||
|
case watched::TERNARY:
|
||||||
|
UNREACHABLE();
|
||||||
|
tsum += h[wit->get_literal1().index()] * h[wit->get_literal2().index()];
|
||||||
|
break;
|
||||||
|
case watched::CLAUSE: {
|
||||||
|
clause_offset cls_off = wit->get_clause_offset();
|
||||||
|
clause & c = *(s.m_cls_allocator.get_clause(cls_off));
|
||||||
|
// approximation compared to ternary clause case:
|
||||||
|
// we pick two other literals from the clause.
|
||||||
|
if (c[0] == ~l) {
|
||||||
|
tsum += h[c[1].index()] * h[c[2].index()];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SASSERT(c[1] == ~l);
|
||||||
|
tsum += h[c[0].index()] * h[c[2].index()];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
sum = (float)(0.1 + afactor*sum + sqfactor*tsum);
|
sum = (float)(0.1 + afactor*sum + sqfactor*tsum);
|
||||||
return std::min(m_config.m_max_score, sum);
|
return std::min(m_config.m_max_score, sum);
|
||||||
}
|
}
|
||||||
|
@ -486,6 +530,7 @@ namespace sat {
|
||||||
if (get_rank(lit) == 0) get_scc(lit);
|
if (get_rank(lit) == 0) get_scc(lit);
|
||||||
if (get_rank(~lit) == 0) get_scc(~lit);
|
if (get_rank(~lit) == 0) get_scc(~lit);
|
||||||
}
|
}
|
||||||
|
TRACE("sat", display_scc(tout););
|
||||||
}
|
}
|
||||||
void init_scc() {
|
void init_scc() {
|
||||||
inc_bstamp();
|
inc_bstamp();
|
||||||
|
@ -502,6 +547,7 @@ namespace sat {
|
||||||
// set nextp = 0?
|
// set nextp = 0?
|
||||||
m_rank = 0;
|
m_rank = 0;
|
||||||
m_active = null_literal;
|
m_active = null_literal;
|
||||||
|
TRACE("sat", display_dfs(tout););
|
||||||
}
|
}
|
||||||
void init_dfs_info(literal l) {
|
void init_dfs_info(literal l) {
|
||||||
unsigned idx = l.index();
|
unsigned idx = l.index();
|
||||||
|
@ -523,6 +569,7 @@ namespace sat {
|
||||||
}
|
}
|
||||||
void add_arc(literal u, literal v) { m_dfs[u.index()].m_next.push_back(v); }
|
void add_arc(literal u, literal v) { m_dfs[u.index()].m_next.push_back(v); }
|
||||||
bool has_arc(literal v) const { return m_dfs[v.index()].m_next.size() > m_dfs[v.index()].m_nextp; }
|
bool has_arc(literal v) const { return m_dfs[v.index()].m_next.size() > m_dfs[v.index()].m_nextp; }
|
||||||
|
arcs get_arcs(literal v) const { return m_dfs[v.index()].m_next; }
|
||||||
literal pop_arc(literal u) { return m_dfs[u.index()].m_next[m_dfs[u.index()].m_nextp++]; }
|
literal pop_arc(literal u) { return m_dfs[u.index()].m_next[m_dfs[u.index()].m_nextp++]; }
|
||||||
unsigned num_next(literal u) const { return m_dfs[u.index()].m_next.size(); }
|
unsigned num_next(literal u) const { return m_dfs[u.index()].m_next.size(); }
|
||||||
literal get_next(literal u, unsigned i) const { return m_dfs[u.index()].m_next[i]; }
|
literal get_next(literal u, unsigned i) const { return m_dfs[u.index()].m_next[i]; }
|
||||||
|
@ -602,6 +649,30 @@ namespace sat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::ostream& display_dfs(std::ostream& out) const {
|
||||||
|
for (unsigned i = 0; i < m_candidates.size(); ++i) {
|
||||||
|
literal l(m_candidates[i].m_var, false);
|
||||||
|
arcs const& a1 = get_arcs(l);
|
||||||
|
if (!a1.empty()) {
|
||||||
|
out << l << " -> " << a1 << "\n";
|
||||||
|
}
|
||||||
|
arcs const& a2 = get_arcs(~l);
|
||||||
|
if (!a2.empty()) {
|
||||||
|
out << ~l << " -> " << a2 << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& display_scc(std::ostream& out) const {
|
||||||
|
display_dfs(out);
|
||||||
|
for (unsigned i = 0; i < m_candidates.size(); ++i) {
|
||||||
|
literal l(m_candidates[i].m_var, false);
|
||||||
|
out << l << " := " << get_parent(l) << "\n";
|
||||||
|
out << ~l << " := " << get_parent(~l) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// lookahead forest
|
// lookahead forest
|
||||||
// sat11.w 115-121
|
// sat11.w 115-121
|
||||||
|
@ -1026,6 +1097,7 @@ namespace sat {
|
||||||
|
|
||||||
void compute_wnb() {
|
void compute_wnb() {
|
||||||
init_wnb();
|
init_wnb();
|
||||||
|
TRACE("sat", display_lookahead(tout); );
|
||||||
for (unsigned i = 0; !inconsistent() && i < m_lookahead.size(); ++i) {
|
for (unsigned i = 0; !inconsistent() && i < m_lookahead.size(); ++i) {
|
||||||
literal lit = m_lookahead[i].m_lit;
|
literal lit = m_lookahead[i].m_lit;
|
||||||
if (!is_undef(lit)) {
|
if (!is_undef(lit)) {
|
||||||
|
@ -1045,6 +1117,7 @@ namespace sat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
reset_wnb();
|
reset_wnb();
|
||||||
|
TRACE("sat", display_lookahead(tout); );
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_wnb() {
|
void init_wnb() {
|
||||||
|
@ -1083,6 +1156,7 @@ namespace sat {
|
||||||
l = diff1 < diff2 ? lit : ~lit;
|
l = diff1 < diff2 ? lit : ~lit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TRACE("sat", tout << l << "\n";);
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1150,12 +1224,13 @@ namespace sat {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void set_conflict() { m_inconsistent = true; }
|
void set_conflict() { TRACE("sat", tout << "conflict\n";); m_inconsistent = true; }
|
||||||
bool inconsistent() { return m_inconsistent; }
|
bool inconsistent() { return m_inconsistent; }
|
||||||
|
|
||||||
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) {
|
||||||
|
TRACE("sat", tout << "assign: " << l << "\n";);
|
||||||
SASSERT(m_level > 0);
|
SASSERT(m_level > 0);
|
||||||
if (is_undef(l)) {
|
if (is_undef(l)) {
|
||||||
set_true(l);
|
set_true(l);
|
||||||
|
@ -1239,6 +1314,18 @@ namespace sat {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::ostream& display_lookahead(std::ostream& out) const {
|
||||||
|
for (unsigned i = 0; i < m_lookahead.size(); ++i) {
|
||||||
|
literal lit = m_lookahead[i].m_lit;
|
||||||
|
unsigned offset = m_lookahead[i].m_offset;
|
||||||
|
out << lit << " offset: " << offset;
|
||||||
|
out << (is_undef(lit)?" undef": (is_true(lit) ? " true": " false"));
|
||||||
|
out << " wnb: " << get_wnb(lit);
|
||||||
|
out << "\n";
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
lookahead(solver& s) :
|
lookahead(solver& s) :
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue