12 : internal (i), file (f), with_antecedents (a), checked_deletions (c),
13 num_clauses (0), size_clauses (0), clauses (0), last_hash (0),
14 last_id (0), last_clause (0)
17 added (0), deleted (0)
25 for (
unsigned n = 0; n < num_nonces; n++) {
26 uint64_t nonce =
random.next ();
41 file->connect_internal (internal);
42 LOG (
"VERIPB TRACER connected to internal");
46 LOG (
"VERIPB TRACER delete");
48 for (
size_t i = 0; i < size_clauses; i++)
49 for (
HashId *c = clauses[i], *next; c; c = next)
50 next = c->next, delete_clause (c);
56void VeripbTracer::enlarge_clauses () {
58 const uint64_t new_size_clauses = size_clauses ? 2 * size_clauses : 1;
59 LOG (
"VeriPB Tracer enlarging clauses from %" PRIu64
" to %" PRIu64,
60 (uint64_t) size_clauses, (uint64_t) new_size_clauses);
62 new_clauses =
new HashId *[new_size_clauses];
63 clear_n (new_clauses, new_size_clauses);
64 for (uint64_t i = 0; i < size_clauses; i++) {
65 for (
HashId *c = clauses[i], *next; c; c = next) {
67 const uint64_t h = reduce_hash (c->hash, new_size_clauses);
68 c->next = new_clauses[h];
73 clauses = new_clauses;
74 size_clauses = new_size_clauses;
77HashId *VeripbTracer::new_clause () {
78 HashId *res =
new HashId ();
80 res->hash = last_hash;
87void VeripbTracer::delete_clause (
HashId *c) {
93uint64_t VeripbTracer::reduce_hash (uint64_t hash, uint64_t size) {
97 while ((((uint64_t) 1) << shift) > size) {
106uint64_t VeripbTracer::compute_hash (
const int64_t
id) {
108 unsigned j =
id % num_nonces;
109 uint64_t tmp = nonces[j] * (uint64_t)
id;
110 return last_hash = tmp;
113bool VeripbTracer::find_and_delete (
const int64_t
id) {
124 HashId **res = 0, *c;
125 const uint64_t hash = compute_hash (
id);
126 const uint64_t h = reduce_hash (hash, size_clauses);
127 for (res = clauses + h; (c = *res); res = &c->next) {
128 if (c->hash == hash && c->id ==
id) {
142void VeripbTracer::insert () {
143 if (num_clauses == size_clauses)
145 const uint64_t h = reduce_hash (compute_hash (last_id), size_clauses);
146 HashId *c = new_clause ();
147 c->next = clauses[h];
153inline void VeripbTracer::put_binary_zero () {
156 file->put ((
unsigned char) 0);
159inline void VeripbTracer::put_binary_lit (
int lit) {
163 unsigned x = 2 * abs (
lit) + (
lit < 0);
166 ch = (x & 0x7f) | 0x80;
174inline void VeripbTracer::put_binary_id (int64_t
id,
bool can_be_negative) {
177 uint64_t x = abs (
id);
178 if (can_be_negative) {
179 x = 2 * x + (
id < 0);
183 ch = (x & 0x7f) | 0x80;
193void VeripbTracer::veripb_add_derived_clause (
194 int64_t
id,
bool redundant,
const vector<int> &
clause,
195 const vector<int64_t> &chain) {
198 for (
auto p = chain.rbegin ();
p != chain.rend ();
p++) {
211 for (
const auto &external_lit :
clause) {
213 if (external_lit < 0)
216 file->put (abs (external_lit));
219 file->put (
">= 1 ; ");
222 if (!redundant && checked_deletions) {
223 file->put (
"core id ");
229void VeripbTracer::veripb_add_derived_clause (int64_t
id,
bool redundant,
230 const vector<int> &
clause) {
232 for (
const auto &external_lit :
clause) {
234 if (external_lit < 0)
237 file->put (abs (external_lit));
240 file->put (
">= 1 ;\n");
241 if (!redundant && checked_deletions) {
242 file->put (
"core id ");
248void VeripbTracer::veripb_begin_proof (int64_t reserved_ids) {
249 file->put (
"pseudo-Boolean proof version 2.0\n");
251 file->put (reserved_ids);
255void VeripbTracer::veripb_delete_clause (int64_t
id,
bool redundant) {
256 if (!redundant && checked_deletions && find_and_delete (
id))
258 if (redundant || !checked_deletions)
259 file->put (
"del id ");
267void VeripbTracer::veripb_report_status (
bool unsat, int64_t conflict_id) {
268 file->put (
"output NONE\n");
270 file->put (
"conclusion UNSAT : ");
271 file->put (conflict_id);
274 file->put (
"conclusion NONE\n");
275 file->put (
"end pseudo-Boolean proof\n");
278void VeripbTracer::veripb_strengthen (int64_t
id) {
279 if (!checked_deletions)
281 file->put (
"core id ");
291 LOG (
"VERIPB TRACER tracing start of proof with %" PRId64
294 veripb_begin_proof (
id);
302 LOG (
"VERIPB TRACER tracing addition of derived clause[%" PRId64
"]",
id);
303 if (with_antecedents)
304 veripb_add_derived_clause (
id, redundant,
clause, chain);
306 veripb_add_derived_clause (
id, redundant,
clause);
312void VeripbTracer::delete_clause (int64_t
id,
bool redundant,
316 LOG (
"VERIPB TRACER tracing deletion of clause[%" PRId64
"]",
id);
317 veripb_delete_clause (
id, redundant);
328 LOG (
"VERIPB TRACER tracing finalization of proof with empty "
329 "clause[%" PRId64
"]",
336 if (!checked_deletions)
340 LOG (
"VERIPB TRACER tracing weaken minus of clause[%" PRId64
"]",
id);
348 LOG (
"VERIPB TRACER tracing strengthen of clause[%" PRId64
"]",
id);
349 veripb_strengthen (
id);
358void VeripbTracer::print_statistics () {
361 uint64_t total = added + deleted;
362 MSG (
"VeriPB %" PRId64
" added clauses %.2f%%", added,
364 MSG (
"VeriPB %" PRId64
" deleted clauses %.2f%%", deleted,
366 MSG (
"VeriPB %" PRId64
" bytes (%.2f MB)", bytes,
367 bytes / (
double) (1 << 20));
377 MSG (
"VeriPB proof file '%s' closed", file->name ());
390 MSG (
"VeriPB proof file '%s' flushed", file->name ());
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
void connect_internal(Internal *i) override
void flush(bool) override
void begin_proof(int64_t) override
VeripbTracer(Internal *, File *file, bool, bool, bool)
void add_derived_clause(int64_t, bool, const vector< int > &, const vector< int64_t > &) override
void report_status(int, int64_t) override
void close(bool) override
void weaken_minus(int64_t, const vector< int > &) override
void strengthen(int64_t) override
void clear_n(T *base, size_t n)
double percent(double a, double b)
struct clause_t clause
STRUCTURE DEFINITIONS ///.