mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
make visited_helper independent of literals
re-introduce shorthands in sat::solver for visited and have them convert literals to unsigned.
This commit is contained in:
parent
070c5c624a
commit
90490cb22f
7 changed files with 53 additions and 39 deletions
|
@ -1,5 +1,21 @@
|
|||
/*++
|
||||
Copyright (c) 2011 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
visit_helper.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Routine for marking and counting visited occurrences
|
||||
|
||||
Author:
|
||||
|
||||
Clemens Eisenhofer 2022-11-03
|
||||
|
||||
--*/
|
||||
#pragma once
|
||||
#include "sat_literal.h"
|
||||
|
||||
|
||||
class visit_helper {
|
||||
|
||||
|
@ -7,7 +23,9 @@ class visit_helper {
|
|||
unsigned m_visited_begin = 0;
|
||||
unsigned m_visited_end = 0;
|
||||
|
||||
void init_ts(unsigned n, unsigned lim = 1) {
|
||||
public:
|
||||
|
||||
void init_visited(unsigned n, unsigned lim = 1) {
|
||||
SASSERT(lim > 0);
|
||||
if (m_visited_end >= m_visited_end + lim) { // overflow
|
||||
m_visited_begin = 0;
|
||||
|
@ -18,22 +36,14 @@ class visit_helper {
|
|||
m_visited_begin = m_visited_end;
|
||||
m_visited_end = m_visited_end + lim;
|
||||
}
|
||||
while (m_visited.size() < n)
|
||||
m_visited.push_back(0);
|
||||
while (m_visited.size() < n)
|
||||
m_visited.push_back(0);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
void init_visited(unsigned num_vars, unsigned lim = 1) {
|
||||
init_ts(2 * num_vars, lim);
|
||||
void mark_visited(unsigned v) { m_visited[v] = m_visited_begin + 1; }
|
||||
void inc_visited(unsigned v) {
|
||||
m_visited[v] = std::min(m_visited_end, std::max(m_visited_begin, m_visited[v]) + 1);
|
||||
}
|
||||
void mark_visited(sat::literal l) { m_visited[l.index()] = m_visited_begin + 1; }
|
||||
void mark_visited(sat::bool_var v) { mark_visited(sat::literal(v, false)); }
|
||||
void inc_visited(sat::literal l) {
|
||||
m_visited[l.index()] = std::min(m_visited_end, std::max(m_visited_begin, m_visited[l.index()]) + 1);
|
||||
}
|
||||
void inc_visited(sat::bool_var v) { inc_visited(sat::literal(v, false)); }
|
||||
bool is_visited(sat::bool_var v) const { return is_visited(sat::literal(v, false)); }
|
||||
bool is_visited(sat::literal l) const { return m_visited[l.index()] > m_visited_begin; }
|
||||
unsigned num_visited(unsigned i) { return std::max(m_visited_begin, m_visited[i]) - m_visited_begin; }
|
||||
bool is_visited(unsigned v) const { return m_visited[v] > m_visited_begin; }
|
||||
unsigned num_visited(unsigned v) { return std::max(m_visited_begin, m_visited[v]) - m_visited_begin; }
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue