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 (
"IDRUP TRACER connected to internal");
46 LOG (
"IDRUP TRACER delete");
48 for (
size_t i = 0; i < size_clauses; i++)
49 for (
IdrupClause *c = clauses[i], *next; c; c = next)
50 next = c->next, delete_clause (c);
56void IdrupTracer::enlarge_clauses () {
58 const uint64_t new_size_clauses = size_clauses ? 2 * size_clauses : 1;
59 LOG (
"IDRUP 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++) {
66 for (
IdrupClause *c = clauses[i], *next; c; c = next) {
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 const size_t size = imported_clause.size ();
81 const int off =
size ? -1 : 0;
82 const size_t bytes =
sizeof (IdrupClause) + (size - off) *
sizeof (int);
83 IdrupClause *res = (IdrupClause *)
new char[bytes];
85 res->hash = last_hash;
88 int *literals = res->literals, *
p = literals;
89 for (
const auto &
lit : imported_clause) {
103uint64_t IdrupTracer::reduce_hash (uint64_t hash, uint64_t size) {
107 while ((((uint64_t) 1) << shift) > size) {
116uint64_t IdrupTracer::compute_hash (
const int64_t
id) {
118 unsigned j =
id % num_nonces;
119 uint64_t tmp = nonces[j] * (uint64_t)
id;
120 return last_hash = tmp;
123bool IdrupTracer::find_and_delete (
const int64_t
id) {
126 IdrupClause **res = 0, *c;
127 const uint64_t hash = compute_hash (
id);
128 const uint64_t h = reduce_hash (hash, size_clauses);
129 for (res = clauses + h; (c = *res); res = &c->next) {
130 if (c->hash == hash && c->id ==
id) {
140 int *begin = c->literals;
141 for (
size_t i = 0; i < c->size; i++) {
142 imported_clause.push_back (begin[i]);
148void IdrupTracer::insert () {
149 if (num_clauses == size_clauses)
151 const uint64_t h = reduce_hash (compute_hash (last_id), size_clauses);
152 IdrupClause *c = new_clause ();
153 c->next = clauses[h];
159inline void IdrupTracer::flush_if_piping () {
164inline void IdrupTracer::put_binary_zero () {
167 file->put ((
unsigned char) 0);
170inline void IdrupTracer::put_binary_lit (
int lit) {
174 unsigned x = 2 * abs (
lit) + (
lit < 0);
177 ch = (x & 0x7f) | 0x80;
185inline void IdrupTracer::put_binary_id (int64_t
id,
bool can_be_negative) {
188 uint64_t x = abs (
id);
189 if (can_be_negative) {
190 x = 2 * x + (
id < 0);
194 ch = (x & 0x7f) | 0x80;
204void IdrupTracer::idrup_add_restored_clause (
const vector<int> &
clause) {
209 for (
const auto &external_lit :
clause)
211 put_binary_lit (external_lit);
213 file->put (external_lit), file->put (
' ');
221void IdrupTracer::idrup_add_derived_clause (
const vector<int> &
clause) {
226 for (
const auto &external_lit :
clause)
228 put_binary_lit (external_lit);
230 file->put (external_lit), file->put (
' ');
238void IdrupTracer::idrup_add_original_clause (
const vector<int> &
clause) {
243 for (
const auto &external_lit :
clause)
245 put_binary_lit (external_lit);
247 file->put (external_lit), file->put (
' ');
255void IdrupTracer::idrup_delete_clause (int64_t
id,
256 const vector<int> &
clause) {
257 if (find_and_delete (
id)) {
275 for (
const auto &external_lit :
clause)
277 put_binary_lit (external_lit);
279 file->put (external_lit), file->put (
' ');
287void IdrupTracer::idrup_conclude_and_delete (
288 const vector<int64_t> &conclusion) {
293 put_binary_id (size);
296 file->put (size), file->put (
"\n");
299 for (
auto &
id : conclusion) {
304 (void) find_and_delete (
id);
305 for (
const auto &external_lit : imported_clause) {
307 const auto not_elit = -external_lit;
309 put_binary_lit (not_elit);
311 file->put (not_elit), file->put (
' ');
317 imported_clause.clear ();
322void IdrupTracer::idrup_report_status (
int status) {
328 file->put (
"SATISFIABLE");
330 file->put (
"UNSATISFIABLE");
332 file->put (
"UNKNOWN");
338void IdrupTracer::idrup_conclude_sat (
const vector<int> &model) {
343 for (
auto &
lit : model) {
345 put_binary_lit (
lit);
347 file->put (
lit), file->put (
' ');
356void IdrupTracer::idrup_conclude_unknown (
const vector<int> &trail) {
361 for (
auto &
lit : trail) {
363 put_binary_lit (
lit);
365 file->put (
lit), file->put (
' ');
374void IdrupTracer::idrup_solve_query () {
379 for (
auto &
lit : assumptions) {
381 put_binary_lit (
lit);
383 file->put (
lit), file->put (
' ');
400 LOG (
clause,
"IDRUP TRACER tracing addition of derived clause");
401 idrup_add_derived_clause (
clause);
413 LOG (
clause,
"IDRUP TRACER tracing addition of assumption clause");
415 imported_clause.push_back (
lit);
418 imported_clause.clear ();
421void IdrupTracer::delete_clause (int64_t
id,
bool,
426 LOG (
"IDRUP TRACER tracing deletion of clause[%" PRId64
"]",
id);
427 idrup_delete_clause (
id,
clause);
434 LOG (
"IDRUP TRACER tracing weaken minus of clause[%" PRId64
"]",
id);
447 LOG (conclusion,
"IDRUP TRACER tracing conclusion of clause(s)");
448 idrup_conclude_and_delete (conclusion);
457 LOG (
clause,
"IDRUP TRACER tracing addition of original clause");
461 return idrup_add_original_clause (
clause);
464 if (find_and_delete (
id)) {
466 "IDRUP TRACER the clause was not yet weakened, so no restore");
469 LOG (
clause,
"IDRUP TRACER tracing addition of restored clause");
470 idrup_add_restored_clause (
clause);
479 LOG (
"IDRUP TRACER tracing report of status %d", status);
480 idrup_report_status (status);
486 LOG (model,
"IDRUP TRACER tracing conclusion of model");
487 idrup_conclude_sat (model);
493 LOG (trail,
"IDRUP TRACER tracing conclusion of unknown state");
494 idrup_conclude_unknown (trail);
500 LOG (assumptions,
"IDRUP TRACER tracing solve query with assumptions");
501 idrup_solve_query ();
508 LOG (
"IDRUP TRACER tracing addition of assumption %d",
lit);
509 assumptions.push_back (
lit);
513 LOG (assumptions,
"IDRUP TRACER tracing reset of assumptions");
514 assumptions.clear ();
523void IdrupTracer::print_statistics () {
526 uint64_t total = added + deleted + weakened + restore + original;
527 MSG (
"LIDRUP %" PRId64
" original clauses %.2f%%", original,
529 MSG (
"LIDRUP %" PRId64
" learned clauses %.2f%%", added,
531 MSG (
"LIDRUP %" PRId64
" deleted clauses %.2f%%", deleted,
533 MSG (
"LIDRUP %" PRId64
" weakened clauses %.2f%%", weakened,
535 MSG (
"LIDRUP %" PRId64
" restored clauses %.2f%%", restore,
537 MSG (
"LIDRUP %" PRId64
" queries %.2f", solved,
relative (solved, total));
538 MSG (
"IDRUP %" PRId64
" bytes (%.2f MB)", bytes,
539 bytes / (
double) (1 << 20));
549 MSG (
"IDRUP proof file '%s' closed", file->name ());
562 MSG (
"IDRUP proof file '%s' flushed", file->name ());
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
void conclude_unknown(const vector< int > &) override
void flush(bool) override
void connect_internal(Internal *i) override
void add_derived_clause(int64_t, bool, const vector< int > &, const vector< int64_t > &) override
void add_assumption_clause(int64_t, const vector< int > &, const vector< int64_t > &) override
void reset_assumptions() override
void report_status(int, int64_t) override
void solve_query() override
void conclude_sat(const vector< int > &) override
void add_assumption(int) override
IdrupTracer(Internal *, File *file, bool)
void weaken_minus(int64_t, const vector< int > &) override
void conclude_unsat(ConclusionType, const vector< int64_t > &) override
void close(bool) override
void add_original_clause(int64_t, bool, const vector< int > &, bool=false) 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 ///.