12 : internal (i), file (f), binary (b), num_clauses (0), size_clauses (0),
13 clauses (0), last_hash (0), last_id (0), last_clause (0)
16 added (0), deleted (0)
24 for (
unsigned n = 0; n < num_nonces; n++) {
25 uint64_t nonce =
random.next ();
36 piping = file->piping ();
41 file->connect_internal (internal);
42 LOG (
"LIDRUP TRACER connected to internal");
46 LOG (
"LIDRUP TRACER delete");
48 for (
size_t i = 0; i < size_clauses; i++)
50 next = c->next, delete_clause (c);
56void LidrupTracer::enlarge_clauses () {
58 const uint64_t new_size_clauses = size_clauses ? 2 * size_clauses : 1;
59 LOG (
"LIDRUP Tracer enlarging clauses of tracer from %" PRIu64
61 (uint64_t) size_clauses, (uint64_t) new_size_clauses);
64 clear_n (new_clauses, new_size_clauses);
65 for (uint64_t i = 0; i < size_clauses; i++) {
68 const uint64_t h = reduce_hash (c->hash, new_size_clauses);
69 c->next = new_clauses[h];
74 clauses = new_clauses;
75 size_clauses = new_size_clauses;
79 LidrupClause *res =
new LidrupClause;
81 res->
hash = last_hash;
83 for (
const auto &
id : imported_chain) {
84 res->chain.push_back (
id);
86 for (
const auto &
lit : imported_clause) {
87 res->literals.push_back (
lit);
100uint64_t LidrupTracer::reduce_hash (uint64_t hash, uint64_t size) {
104 while ((((uint64_t) 1) << shift) > size) {
113uint64_t LidrupTracer::compute_hash (
const int64_t
id) {
115 unsigned j =
id % num_nonces;
116 uint64_t tmp = nonces[j] * (uint64_t)
id;
117 return last_hash = tmp;
120bool LidrupTracer::find_and_delete (
const int64_t
id) {
123 LidrupClause **res = 0, *c;
124 const uint64_t hash = compute_hash (
id);
125 const uint64_t h = reduce_hash (hash, size_clauses);
126 for (res = clauses + h; (c = *res); res = &c->next) {
127 if (c->hash == hash && c->id ==
id) {
137 for (
auto &
lit : c->literals) {
138 imported_clause.push_back (
lit);
140 for (
auto &cid : c->chain) {
141 imported_chain.push_back (cid);
147void LidrupTracer::insert () {
148 if (num_clauses == size_clauses)
150 const uint64_t h = reduce_hash (compute_hash (last_id), size_clauses);
151 LidrupClause *c = new_clause ();
152 c->next = clauses[h];
158inline void LidrupTracer::flush_if_piping () {
163inline void LidrupTracer::put_binary_zero () {
166 file->put ((
unsigned char) 0);
169inline void LidrupTracer::put_binary_lit (
int lit) {
173 unsigned x = 2 * abs (
lit) + (
lit < 0);
176 ch = (x & 0x7f) | 0x80;
184inline void LidrupTracer::put_binary_id (int64_t
id,
bool can_be_negative) {
187 uint64_t x = abs (
id);
188 if (can_be_negative) {
189 x = 2 * x + (
id < 0);
193 ch = (x & 0x7f) | 0x80;
203void LidrupTracer::lidrup_add_restored_clause (int64_t
id) {
204 if (!batch_weaken.empty () || !batch_delete.empty ())
205 lidrup_batch_weaken_restore_and_delete ();
206 batch_restore.push_back (
id);
209void LidrupTracer::lidrup_add_derived_clause (
210 int64_t
id,
const vector<int> &
clause,
const vector<int64_t> &chain) {
211 lidrup_batch_weaken_restore_and_delete ();
220 for (
const auto &external_lit :
clause)
222 put_binary_lit (external_lit);
224 file->put (external_lit), file->put (
' ');
229 for (
const auto &cid : chain)
233 file->put (cid), file->put (
' ');
240void LidrupTracer::lidrup_add_original_clause (int64_t
id,
241 const vector<int> &
clause) {
242 lidrup_batch_weaken_restore_and_delete ();
251 for (
const auto &external_lit :
clause)
253 put_binary_lit (external_lit);
255 file->put (external_lit), file->put (
' ');
262void LidrupTracer::lidrup_batch_weaken_restore_and_delete () {
264 if (!batch_weaken.empty ()) {
270 for (
const auto &
id : batch_weaken) {
274 file->put (
id), file->put (
' ');
276 batch_weaken.clear ();
285 if (!batch_delete.empty ()) {
291 for (
const auto &
id : batch_delete) {
295 file->put (
id), file->put (
' ');
297 batch_delete.clear ();
306 if (!batch_restore.empty ()) {
312 for (
const auto &
id : batch_restore) {
316 file->put (
id), file->put (
' ');
318 batch_restore.clear ();
329void LidrupTracer::lidrup_conclude_and_delete (
330 const vector<int64_t> &conclusion) {
331 lidrup_batch_weaken_restore_and_delete ();
336 put_binary_id (size);
339 file->put (size), file->put (
"\n");
342 for (
auto &
id : conclusion) {
347 if (!find_and_delete (
id)) {
360 for (
const auto &external_lit : imported_clause) {
362 const auto not_elit = -external_lit;
364 put_binary_lit (not_elit);
366 file->put (not_elit), file->put (
' ');
372 for (
const auto &cid : imported_chain) {
376 file->put (cid), file->put (
' ');
382 imported_clause.clear ();
383 imported_chain.clear ();
389void LidrupTracer::lidrup_report_status (
int status) {
390 lidrup_batch_weaken_restore_and_delete ();
396 file->put (
"SATISFIABLE");
398 file->put (
"UNSATISFIABLE");
400 file->put (
"UNKNOWN");
406void LidrupTracer::lidrup_conclude_sat (
const vector<int> &model) {
407 lidrup_batch_weaken_restore_and_delete ();
412 for (
auto &
lit : model) {
414 put_binary_lit (
lit);
416 file->put (
lit), file->put (
' ');
425void LidrupTracer::lidrup_conclude_unknown (
const vector<int> &trail) {
426 lidrup_batch_weaken_restore_and_delete ();
431 for (
auto &
lit : trail) {
433 put_binary_lit (
lit);
435 file->put (
lit), file->put (
' ');
444void LidrupTracer::lidrup_solve_query () {
445 lidrup_batch_weaken_restore_and_delete ();
450 for (
auto &
lit : assumptions) {
452 put_binary_lit (
lit);
454 file->put (
lit), file->put (
' ');
471 LOG (
clause,
"LIDRUP TRACER tracing addition of derived clause");
472 lidrup_add_derived_clause (
id,
clause, chain);
485 "LIDRUP TRACER tracing addition of assumption clause[%" PRId64
"]",
488 imported_clause.push_back (
lit);
489 for (
auto &cid : chain)
490 imported_chain.push_back (cid);
493 imported_clause.clear ();
494 imported_chain.clear ();
497void LidrupTracer::delete_clause (int64_t
id,
bool,
const vector<int> &) {
501 LOG (
"LIDRUP TRACER tracing deletion of clause[%" PRId64
"]",
id);
502 if (find_and_delete (
id)) {
504 if (!batch_delete.empty () || !batch_restore.empty ())
505 lidrup_batch_weaken_restore_and_delete ();
506 batch_weaken.push_back (
id);
511 if (!batch_weaken.empty () || !batch_restore.empty ())
512 lidrup_batch_weaken_restore_and_delete ();
513 batch_delete.push_back (
id);
524 LOG (
"LIDRUP TRACER tracing weaken minus of clause[%" PRId64
"]",
id);
534 LOG (conclusion,
"LIDRUP TRACER tracing conclusion of clause(s)");
535 lidrup_conclude_and_delete (conclusion);
544 LOG (
clause,
"LIDRUP TRACER tracing addition of original clause");
548 return lidrup_add_original_clause (
id,
clause);
551 if (find_and_delete (
id)) {
553 "LIDRUP TRACER the clause was not yet weakened, so no restore");
556 LOG (
clause,
"LIDRUP TRACER tracing addition of restored clause");
557 lidrup_add_restored_clause (
id);
566 LOG (
"LIDRUP TRACER tracing report of status %d", status);
567 lidrup_report_status (status);
573 LOG (model,
"LIDRUP TRACER tracing conclusion of model");
574 lidrup_conclude_sat (model);
580 LOG (entrailed,
"LIDRUP TRACER tracing conclusion of UNK");
581 lidrup_conclude_unknown (entrailed);
587 LOG (assumptions,
"LIDRUP TRACER tracing solve query with assumptions");
588 lidrup_solve_query ();
595 LOG (
"LIDRUP TRACER tracing addition of assumption %d",
lit);
596 assumptions.push_back (
lit);
600 LOG (assumptions,
"LIDRUP TRACER tracing reset of assumptions");
601 assumptions.clear ();
610void LidrupTracer::print_statistics () {
613 uint64_t total = added + deleted + weakened + restore + original;
614 MSG (
"LIDRUP %" PRId64
" original clauses %.2f%%", original,
616 MSG (
"LIDRUP %" PRId64
" learned clauses %.2f%%", added,
618 MSG (
"LIDRUP %" PRId64
" deleted clauses %.2f%%", deleted,
620 MSG (
"LIDRUP %" PRId64
" weakened clauses %.2f%%", weakened,
622 MSG (
"LIDRUP %" PRId64
" restored clauses %.2f%%", restore,
624 MSG (
"LIDRUP %" PRId64
" batches of deletions, weaken and restores %.2f",
625 batched,
relative (batched, deleted + restore + weakened));
626 MSG (
"LIDRUP %" PRId64
" queries %.2f", solved,
relative (solved, total));
627 MSG (
"LIDRUP %" PRId64
" bytes (%.2f MB)", bytes,
628 bytes / (
double) (1 << 20));
638 MSG (
"LIDRUP proof file '%s' closed", file->name ());
648 lidrup_batch_weaken_restore_and_delete ();
652 MSG (
"LIDRUP proof file '%s' flushed", file->name ());
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
void conclude_sat(const vector< int > &) override
void solve_query() override
void flush(bool) override
void conclude_unsat(ConclusionType, const vector< int64_t > &) override
void conclude_unknown(const vector< int > &) override
void add_derived_clause(int64_t, bool, const vector< int > &, const vector< int64_t > &) override
void close(bool) override
void connect_internal(Internal *i) override
LidrupTracer(Internal *, File *file, bool)
void reset_assumptions() override
void report_status(int, int64_t) override
void add_assumption(int) override
void add_original_clause(int64_t, bool, const vector< int > &, bool=false) override
void add_assumption_clause(int64_t, const vector< int > &, const vector< int64_t > &) override
void weaken_minus(int64_t, const vector< int > &) override
double relative(double a, double b)
void clear_n(T *base, size_t n)
double percent(double a, double b)
struct clause_t clause
STRUCTURE DEFINITIONS ///.