ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cadical_lratchecker.cpp
Go to the documentation of this file.
1#include "global.h"
2
3#include "internal.hpp"
4
6
7namespace CaDiCaL {
8
9/*------------------------------------------------------------------------*/
10
11inline unsigned LratChecker::l2u (int lit) {
13 CADICAL_assert (lit != INT_MIN);
14 unsigned res = 2 * (abs (lit) - 1);
15 if (lit < 0)
16 res++;
17 return res;
18}
19
20signed char &LratChecker::mark (int lit) {
21 const unsigned u = l2u (lit);
22 CADICAL_assert (u < marks.size ());
23 return marks[u];
24}
25
26signed char &LratChecker::checked_lit (int lit) {
27 const unsigned u = l2u (lit);
28 CADICAL_assert (u < checked_lits.size ());
29 return checked_lits[u];
30}
31
32/*------------------------------------------------------------------------*/
33
34LratCheckerClause *LratChecker::new_clause () {
35 const size_t size = imported_clause.size ();
36 CADICAL_assert (size <= UINT_MAX);
37 const int off = size ? 1 : 0;
38 const size_t bytes =
39 sizeof (LratCheckerClause) + (size - off) * sizeof (int);
40 LratCheckerClause *res = (LratCheckerClause *) new char[bytes];
41 res->garbage = false;
42 res->next = 0;
43 res->hash = last_hash;
44 res->id = last_id;
45 res->size = size;
46 res->used = false;
47 res->tautological = false;
48 int *literals = res->literals, *p = literals;
49#ifndef CADICAL_NDEBUG
50 for (auto &b : checked_lits)
51 CADICAL_assert (!b); // = false;
52#endif
53 for (const auto &lit : imported_clause) {
54 *p++ = lit;
55 checked_lit (-lit) = true;
56 if (checked_lit (lit)) {
57 LOG (imported_clause, "LRAT CHECKER clause tautological");
58 res->tautological = true;
59 }
60 }
61 for (const auto &lit : imported_clause)
62 checked_lit (-lit) = false;
63 num_clauses++;
64
65 return res;
66}
67
68void LratChecker::delete_clause (LratCheckerClause *c) {
70 if (!c->garbage) {
71 CADICAL_assert (num_clauses);
72 num_clauses--;
73 } else {
74 CADICAL_assert (num_garbage);
75 num_garbage--;
76 }
77 delete[] (char *) c;
78}
79
80void LratChecker::enlarge_clauses () {
81 CADICAL_assert (num_clauses == size_clauses);
82 const uint64_t new_size_clauses = size_clauses ? 2 * size_clauses : 1;
83 LOG ("LRAT CHECKER enlarging clauses of checker from %" PRIu64
84 " to %" PRIu64,
85 (uint64_t) size_clauses, (uint64_t) new_size_clauses);
86 LratCheckerClause **new_clauses;
87 new_clauses = new LratCheckerClause *[new_size_clauses];
88 clear_n (new_clauses, new_size_clauses);
89 for (uint64_t i = 0; i < size_clauses; i++) {
90 for (LratCheckerClause *c = clauses[i], *next; c; c = next) {
91 next = c->next;
92 const uint64_t h = reduce_hash (c->hash, new_size_clauses);
93 c->next = new_clauses[h];
94 new_clauses[h] = c;
95 }
96 }
97 delete[] clauses;
98 clauses = new_clauses;
99 size_clauses = new_size_clauses;
100}
101
102// Probably not necessary since we have no watches.
103//
104void LratChecker::collect_garbage_clauses () {
105
106 stats.collections++;
107
108 LOG ("LRAT CHECKER collecting %" PRIu64 " garbage clauses %.0f%%",
109 num_garbage, percent (num_garbage, num_clauses));
110
111 for (LratCheckerClause *c = garbage, *next; c; c = next)
112 next = c->next, delete_clause (c);
113
114 CADICAL_assert (!num_garbage);
115 garbage = 0;
116}
117
118/*------------------------------------------------------------------------*/
119
121 : internal (i), size_vars (0), concluded (false), num_clauses (0),
122 num_finalized (0), num_garbage (0), size_clauses (0), clauses (0),
123 garbage (0), last_hash (0), last_id (0), current_id (0) {
124
125 // Initialize random number table for hash function.
126 //
127 Random random (42);
128 for (unsigned n = 0; n < num_nonces; n++) {
129 uint64_t nonce = random.next ();
130 if (!(nonce & 1))
131 nonce++;
132 CADICAL_assert (nonce), CADICAL_assert (nonce & 1);
133 nonces[n] = nonce;
134 }
135
136 memset (&stats, 0, sizeof (stats)); // Initialize statistics.
137}
138
140 internal = i;
141 LOG ("connected to internal");
142}
143
145 LOG ("LRAT CHECKER delete");
146 for (size_t i = 0; i < size_clauses; i++)
147 for (LratCheckerClause *c = clauses[i], *next; c; c = next)
148 next = c->next, delete_clause (c);
149 for (LratCheckerClause *c = garbage, *next; c; c = next)
150 next = c->next, delete_clause (c);
151 delete[] clauses;
152}
153
154/*------------------------------------------------------------------------*/
155
156void LratChecker::enlarge_vars (int64_t idx) {
157
158 CADICAL_assert (0 < idx), CADICAL_assert (idx <= INT_MAX);
159
160 int64_t new_size_vars = size_vars ? 2 * size_vars : 2;
161 while (idx >= new_size_vars)
162 new_size_vars *= 2;
163 LOG ("LRAT CHECKER enlarging variables of checker from %" PRId64
164 " to %" PRId64 "",
165 size_vars, new_size_vars);
166
167 marks.resize (2 * new_size_vars);
168 checked_lits.resize (2 * new_size_vars);
169
170 CADICAL_assert (idx < new_size_vars);
171 size_vars = new_size_vars;
172}
173
174inline void LratChecker::import_literal (int lit) {
176 CADICAL_assert (lit != INT_MIN);
177 int idx = abs (lit);
178 if (idx >= size_vars)
179 enlarge_vars (idx);
180 imported_clause.push_back (lit);
181}
182
183void LratChecker::import_clause (const vector<int> &c) {
184 for (const auto &lit : c)
185 import_literal (lit);
186}
187
188/*------------------------------------------------------------------------*/
189
190uint64_t LratChecker::reduce_hash (uint64_t hash, uint64_t size) {
191 CADICAL_assert (size > 0);
192 unsigned shift = 32;
193 uint64_t res = hash;
194 while ((((uint64_t) 1) << shift) > size) {
195 res ^= res >> shift;
196 shift >>= 1;
197 }
198 res &= size - 1;
199 CADICAL_assert (res < size);
200 return res;
201}
202
203uint64_t LratChecker::compute_hash (const int64_t id) {
204 CADICAL_assert (id > 0);
205 unsigned j = id % num_nonces;
206 uint64_t tmp = nonces[j] * (uint64_t) id;
207 return last_hash = tmp;
208}
209
210LratCheckerClause **LratChecker::find (const int64_t id) {
211 stats.searches++;
212 LratCheckerClause **res, *c;
213 const uint64_t hash = compute_hash (id);
214 const uint64_t h = reduce_hash (hash, size_clauses);
215 for (res = clauses + h; (c = *res); res = &c->next) {
216 if (c->hash == hash && c->id == id) {
217 break;
218 }
219 stats.collisions++;
220 }
221 return res;
222}
223
224void LratChecker::insert () {
225 stats.insertions++;
226 if (num_clauses == size_clauses)
227 enlarge_clauses ();
228 const uint64_t h = reduce_hash (compute_hash (last_id), size_clauses);
229 LratCheckerClause *c = new_clause ();
230 c->next = clauses[h];
231 clauses[h] = c;
232}
233
234/*------------------------------------------------------------------------*/
235
236// "strict" resolution check instead of rup check
237bool LratChecker::check_resolution (vector<int64_t> proof_chain) {
238 if (proof_chain.empty ()) {
239 LOG ("LRAT CHECKER resolution check skipped clause is tautological");
240 return true;
241 }
242 // LOG (imported_clause, "LRAT CHECKER checking clause with resolution");
243#ifndef CADICAL_NDEBUG
244 for (auto &b : checked_lits)
245 CADICAL_assert (!b); // = false;
246#endif
247 if (!proof_chain.size () || proof_chain.back () < 0)
248 return false;
249 LratCheckerClause *c = *find (proof_chain.back ());
250 CADICAL_assert (c);
251 for (int *i = c->literals; i < c->literals + c->size; i++) {
252 int lit = *i;
253 checked_lit (lit) = true;
254 CADICAL_assert (!checked_lit (-lit));
255 }
256 for (auto p = proof_chain.end () - 2; p >= proof_chain.begin (); p--) {
257 auto &id = *p;
258 c = *find (id);
259 CADICAL_assert (c); // since this is checked in check already
260 for (int *i = c->literals; i < c->literals + c->size; i++) {
261 int lit = *i;
262 if (!checked_lit (-lit))
263 checked_lit (lit) = true;
264 else
265 checked_lit (-lit) = false;
266 }
267 }
268 for (const auto &lit : imported_clause) {
269 if (checked_lit (-lit)) {
270 LOG ("LRAT CHECKER resolution failed, resolved literal %d in learned "
271 "clause",
272 lit);
273 for (auto &b : checked_lits)
274 b = false; // clearing checking bits
275 return false;
276 }
277 if (!checked_lit (lit)) {
278 // learned clause is subsumed by resolvents
279 checked_lit (lit) = true;
280 }
281 checked_lit (-lit) = true;
282 }
283 bool failed = false;
284 for (int64_t lit = 1; lit < size_vars; lit++) {
285 bool ok = checked_lit (lit) && checked_lit (-lit);
286 ok = ok || (!checked_lit (lit) && !checked_lit (-lit));
287 checked_lit (lit) = checked_lit (-lit) = false;
288 if (!ok && !failed) {
289 LOG ("LRAT CHECKER resolution failed, learned clause does not match "
290 "on "
291 "variable %" PRId64,
292 lit);
293 failed = true;
294 }
295 }
296
297 return !failed;
298}
299
300/*------------------------------------------------------------------------*/
301
302bool LratChecker::check (vector<int64_t> proof_chain) {
303 LOG (imported_clause, "LRAT CHECKER checking clause");
304 stats.checks++;
305#ifndef CADICAL_NDEBUG
306 for (auto &b : checked_lits)
307 CADICAL_assert (!b); // = false;
308#endif
309 bool taut = false;
310 for (const auto &lit : imported_clause) { // tautological clauses
311 checked_lit (-lit) = true;
312 if (checked_lit (lit)) {
313 LOG (imported_clause, "LRAT CHECKER clause tautological");
314 CADICAL_assert (!proof_chain.size ()); // would be unnecessary hence a bug
315 taut = true;
316 }
317 }
318 // we assume that we can have RUP and ER clauses. One side of the ER
319 // clauses are pure, i.e. without any chain, the long clause is blocked,
320 // so the chain consists only of negative ids. Therefore these checks are
321 // enough to distiguish between RUP and ER
322 if (taut || !proof_chain.size () || proof_chain.back () < 0) {
323 for (const auto &lit : imported_clause) { // tautological clauses
324 checked_lit (-lit) = false;
325 }
326 return taut;
327 }
328
329 vector<LratCheckerClause *> used_clauses;
330 bool checking = false;
331 for (auto &id : proof_chain) {
332 LratCheckerClause *c = *find (id);
333 if (!c) {
334 LOG ("LRAT CHECKER LRAT failed. Did not find clause with id %" PRIu64,
335 id);
336 break;
337 }
338 if (c->tautological) {
339 LOG ("LRAT CHECKER LRAT failed. Clause with id %" PRId64
340 " is tautological",
341 id);
342 break;
343 }
344 used_clauses.push_back (c);
345 if (c->used) {
346 LOG ("LRAT CHECKER LRAT failed. Id %" PRId64
347 " was used multiple times",
348 id);
349 break;
350 } else
351 c->used = true;
352 int unit = 0;
353 for (int *i = c->literals; i < c->literals + c->size; i++) {
354 int lit = *i;
355 if (checked_lit (-lit))
356 continue;
357 if (unit && unit != lit) {
358 unit = INT_MIN; // multiple unfalsified literals
359 break;
360 }
361 unit = lit; // potential unit
362 }
363 if (unit == INT_MIN) {
364 LOG ("LRAT CHECKER check failed, found non unit clause %" PRId64, id);
365 break;
366 }
367 if (!unit) {
368 LOG ("LRAT CHECKER check succeded, clause falsified %" PRId64, id);
369 checking = true;
370 break;
371 }
372 // LOG ("LRAT CHECKER found unit clause %" PRIu64 ", assign %d", id,
373 // unit);
374 checked_lit (unit) = true;
375 }
376 for (auto &lc : used_clauses) {
377 lc->used = false;
378 }
379 for (auto &b : checked_lits)
380 b = false;
381 if (!checking) {
382 LOG ("LRAT CHECKER failed, no conflict found");
383 return false; // check failed because no empty clause was found
384 }
385 return true;
386}
387
388bool LratChecker::check_blocked (vector<int64_t> proof_chain) {
389 for (const auto &lit : imported_clause) {
390 checked_lit (-lit) = true;
391 mark (-lit) = true;
392 }
393 for (size_t i = 0; i < size_clauses; i++) {
394 for (LratCheckerClause *c = clauses[i], *next; c; c = next) {
395 next = c->next;
396 if (c->garbage)
397 continue;
398 // if c is part of the proof chain its id occurs negatively there.
399 if (std::find (proof_chain.begin (), proof_chain.end (), -c->id) !=
400 proof_chain.end ()) {
401 // clause needs to be blocked
402 unsigned count = 0;
403 vector<int> candidates;
404 for (unsigned i = 0; i < c->size; i++) {
405 const int lit = c->literals[i];
406 if (checked_lit (lit)) {
407 count++;
408 }
409 if (mark (lit)) {
410 candidates.push_back (lit);
411 }
412 }
413 if (count < 2) {
414 // check failed
415 for (const auto &lit : imported_clause) {
416 checked_lit (-lit) = false;
417 mark (-lit) = false;
418 }
419 return false;
420 } else {
421 // all literals outside of candidates are not valid RAT candidates
422 for (auto &lit : imported_clause) {
423 if (mark (-lit) &&
424 std::find (candidates.begin (), candidates.end (), -lit) ==
425 candidates.end ()) {
426 mark (-lit) = false;
427 }
428 }
429 }
430 } else {
431 // any literal contained in the clause is not a valid RAT candidate
432 for (unsigned i = 0; i < c->size; i++) {
433 const int lit = c->literals[i];
434 if (checked_lit (lit)) {
435 mark (lit) = false;
436 }
437 }
438 }
439 }
440 }
441 bool success = false;
442 for (const auto &lit : imported_clause) {
443 if (mark (-lit))
444 success = true;
445 checked_lit (-lit) = mark (-lit) = false;
446 }
447 return success;
448}
449
450/*------------------------------------------------------------------------*/
451
452void LratChecker::add_original_clause (int64_t id, bool,
453 const vector<int> &c, bool restore) {
454 START (checking);
455 LOG (c, "LRAT CHECKER addition of original clause[%" PRId64 "]", id);
456 if (restore)
457 restore_clause (id, c);
458 stats.added++;
459 stats.original++;
460 import_clause (c);
461 last_id = id;
462 if (!restore && id == 1 + current_id)
463 current_id = id;
464
465 if (size_clauses && !restore) {
466 LratCheckerClause **p = find (id), *d = *p;
467 if (d) {
469 fputs ("different clause with id ", stderr);
470 fprintf (stderr, "%" PRId64, id);
471 fputs (" already present\n", stderr);
473 }
474 }
475 CADICAL_assert (id);
476 insert ();
477 imported_clause.clear ();
478 STOP (checking);
479}
480
481void LratChecker::add_derived_clause (int64_t id, bool,
482 const vector<int> &c,
483 const vector<int64_t> &proof_chain) {
484 START (checking);
485 LOG (c, "LRAT CHECKER addition of derived clause[%" PRId64 "]", id);
486 stats.added++;
487 stats.derived++;
488 import_clause (c);
489 last_id = id;
490 CADICAL_assert (id == current_id + 1);
491 current_id = id;
492 if (size_clauses) {
493 LratCheckerClause **p = find (id), *d = *p;
494 if (d) {
496 fputs ("different clause with id ", stderr);
497 fprintf (stderr, "%" PRId64, id);
498 fputs (" already present\n", stderr);
500 }
501 }
502 CADICAL_assert (id);
503 bool failed = true;
504 if (check (proof_chain) && check_resolution (proof_chain)) {
505 failed = false;
506 } else if (check_blocked (proof_chain)) {
507 failed = false;
508 }
509 if (failed) {
510 LOG (proof_chain, "LRAT CHECKER check failed with chain");
511#ifdef LOGGING
512 for (const auto &pid : proof_chain) {
513 const int64_t aid = abs (pid);
514 LratCheckerClause **p = find (aid), *d = *p;
515 LOG (d->literals, d->size, "clause[%" PRId64 "]", pid);
516 }
517#endif
519 fputs ("failed to check derived clause:\n", stderr);
520 for (const auto &lit : imported_clause)
521 fprintf (stderr, "%d ", lit);
522 fputc ('0', stderr);
524 } else
525 insert ();
526 imported_clause.clear ();
527 STOP (checking);
528}
529
531 const vector<int64_t> &chain) {
532 for (auto &lit : c) {
533 if (std::find (assumptions.begin (), assumptions.end (), -lit) !=
534 assumptions.end ())
535 continue;
536 if (std::find (constraint.begin (), constraint.end (), -lit) !=
537 constraint.end ())
538 continue;
540 fputs ("clause contains non assumptions or constraint literals\n",
541 stderr);
543 }
544 add_derived_clause (id, true, c, chain);
545 delete_clause (id, true, c);
546 assumption_clauses.push_back (id);
547}
548
549void LratChecker::add_assumption (int a) { assumptions.push_back (a); }
550
552 constraint.clear ();
553 for (auto &lit : c) {
555 if (std::find (constraint.begin (), constraint.end (), lit) !=
556 constraint.end ())
557 continue;
558 constraint.push_back (lit);
559 }
560}
561
563 assumption_clauses.clear ();
564 assumptions.clear ();
565 concluded = false;
566 // constraint.clear ();
567}
568
570 const vector<int64_t> &ids) {
571 if (concluded) {
573 fputs ("already concluded\n", stderr);
575 }
576 concluded = true;
577 if (conclusion == CONFLICT) {
578 LratCheckerClause **p = find (ids.back ()), *d = *p;
579 if (!d || d->size) {
581 fputs ("empty clause not in proof\n", stderr);
583 }
584 return;
585 } else if (conclusion == ASSUMPTIONS) {
586 if (ids.size () != 1 || assumption_clauses.size () != 1) {
588 fputs ("expected exactly one assumption clause\n", stderr);
590 }
591 if (ids.back () != assumption_clauses.back ()) {
593 fputs ("conclusion is not an assumption clause\n", stderr);
595 }
596 return;
597 } else {
598 CADICAL_assert (conclusion == CONSTRAINT);
599 if (constraint.size () != ids.size ()) {
601 fputs ("not complete conclusion given for constraint\n", stderr);
602 fputs ("The constraint contains the literals: ", stderr);
603 for (auto c : constraint) {
604 fprintf (stderr, "%d ", c);
605 }
606
607 fputs ("\nThe ids are: ", stderr);
608 for (auto c : ids) {
609 fprintf (stderr, "%" PRId64 " ", c);
610 }
612 }
613 for (auto &id : ids) {
614 if (std::find (assumption_clauses.begin (), assumption_clauses.end (),
615 id) != assumption_clauses.end ())
616 continue;
618 fputs ("assumption clause for constraint missing\n", stderr);
620 }
621 }
622}
623
624/*------------------------------------------------------------------------*/
625
626void LratChecker::delete_clause (int64_t id, bool, const vector<int> &c) {
627 START (checking);
628 LOG (c, "LRAT CHECKER checking deletion of clause[%" PRId64 "]", id);
629 stats.deleted++;
630 import_clause (c);
631 last_id = id;
632 LratCheckerClause **p = find (id), *d = *p;
633 if (d) {
634 for (const auto &lit : imported_clause)
635 mark (lit) = true;
636 const int *dp = d->literals;
637 for (unsigned i = 0; i < d->size; i++) {
638 int lit = *(dp + i);
639 if (!mark (lit)) { // should never happen since ids
640 fatal_message_start (); // are unique.
641 fputs ("deleted clause not in proof:\n", stderr);
642 for (const auto &lit : imported_clause)
643 fprintf (stderr, "%d ", lit);
644 fputc ('0', stderr);
646 }
647 }
648 for (const auto &lit : imported_clause)
649 mark (lit) = false;
650
651 // Remove from hash table, mark as garbage, connect to garbage list.
652 num_garbage++;
653 CADICAL_assert (num_clauses);
654 num_clauses--;
655 *p = d->next;
656 d->next = garbage;
657 garbage = d;
658 d->garbage = true;
659
660 // If there are enough garbage clauses collect them.
661 // TODO: probably can just delete clause directly without
662 // specific garbage collection phase.
663 if (num_garbage > 0.5 * max ((size_t) size_clauses, (size_t) size_vars))
664 collect_garbage_clauses ();
665 } else {
667 fputs ("deleted clause not in proof:\n", stderr);
668 for (const auto &lit : imported_clause)
669 fprintf (stderr, "%d ", lit);
670 fputc ('0', stderr);
672 }
673 imported_clause.clear ();
674 STOP (checking);
675}
676
677/*------------------------------------------------------------------------*/
678
679void LratChecker::weaken_minus (int64_t id, const vector<int> &c) {
680 LOG (c, "LRAT CHECKER saving clause[%" PRId64 "] to restore later", id);
681 import_clause (c);
682
683 CADICAL_assert (id <= current_id);
684 last_id = id;
685 LratCheckerClause **p = find (id), *d = *p;
686 if (d) {
687 for (const auto &lit : imported_clause)
688 mark (lit) = true;
689 const int *dp = d->literals;
690 for (unsigned i = 0; i < d->size; i++) {
691 int lit = *(dp + i);
692 if (!mark (lit)) { // should never happen since ids
693 fatal_message_start (); // are unique.
694 fputs ("deleted clause not in proof:\n", stderr);
695 for (const auto &lit : imported_clause)
696 fprintf (stderr, "%d ", lit);
697 fputc ('0', stderr);
699 }
700 }
701 for (const auto &lit : imported_clause)
702 mark (lit) = false;
703 } else {
705 fputs ("weakened clause not in proof:\n", stderr);
706 for (const auto &lit : imported_clause)
707 fprintf (stderr, "%d ", lit);
708 fputc ('0', stderr);
710 }
711 imported_clause.clear ();
712
713 vector<int> e = c;
714 sort (begin (e), end (e));
715 clauses_to_reconstruct[id] = e;
716}
717
718void LratChecker::restore_clause (int64_t id, const vector<int> &c) {
719 LOG (c, "LRAT CHECKER check of restoration of clause[%" PRId64 "]", id);
720 if (clauses_to_reconstruct.find (id) == end (clauses_to_reconstruct)) {
722 fputs ("restoring clauses not deleted previously:\n", stderr);
723 for (const auto &lit : c)
724 fprintf (stderr, "%d ", lit);
725 fputc ('0', stderr);
727 }
728 vector<int> e = c;
729 sort (begin (e), end (e));
730 const vector<int> &d = clauses_to_reconstruct.find (id)->second;
731 bool eq = true;
732 if (c.size () != d.size ()) {
733 eq = false;
734 }
735
736 for (std::vector<int>::size_type i = 0; i < e.size () && eq; ++i) {
737 eq = (e[i] == d[i]);
738 }
739
740 if (!eq) {
742 fputs ("restoring clause that is different than the one imported:\n",
743 stderr);
744 for (const auto &lit : c)
745 fprintf (stderr, "%d ", lit);
746 fputc ('0', stderr);
747 fputs ("vs:\n", stderr);
748 for (const auto &lit : d)
749 fprintf (stderr, "%d ", lit);
750 fputc ('0', stderr);
752 }
753
754 clauses_to_reconstruct.erase (id);
755}
756
757void LratChecker::finalize_clause (int64_t id, const vector<int> &c) {
758 START (checking);
759 LOG (c, "LRAT CHECKER checking finalize of clause[%" PRId64 "]", id);
760 stats.finalized++;
761 num_finalized++;
762 import_clause (c);
763 CADICAL_assert (id <= current_id);
764 last_id = id;
765 LratCheckerClause **p = find (id), *d = *p;
766 if (d) {
767 for (const auto &lit : imported_clause)
768 mark (lit) = true;
769 const int *dp = d->literals;
770 for (unsigned i = 0; i < d->size; i++) {
771 int lit = *(dp + i);
772 if (!mark (lit)) { // should never happen since ids
773 fatal_message_start (); // are unique.
774 fputs ("deleted clause not in proof:\n", stderr);
775 for (const auto &lit : imported_clause)
776 fprintf (stderr, "%d ", lit);
777 fputc ('0', stderr);
779 }
780 }
781 for (const auto &lit : imported_clause)
782 mark (lit) = false;
783
784 } else {
786 fputs ("deleted clause not in proof:\n", stderr);
787 for (const auto &lit : imported_clause)
788 fprintf (stderr, "%d ", lit);
789 fputc ('0', stderr);
791 }
792 imported_clause.clear ();
793 STOP (checking);
794}
795
796// check if all clauses have been deleted
797void LratChecker::report_status (int, int64_t) {
798 START (checking);
799 if (num_finalized == num_clauses) {
800 num_finalized = 0;
801 LOG ("LRAT CHECKER successful finalize check, all clauses have been "
802 "deleted");
803 } else {
805 fputs ("finalize check failed ", stderr);
806 fprintf (stderr, "%" PRIu64, num_clauses);
807 fputs (" are not finalized", stderr);
809 }
810 STOP (checking);
811}
812
813/*------------------------------------------------------------------------*/
814
816 int max_var = 0;
817 for (uint64_t i = 0; i < size_clauses; i++)
818 for (LratCheckerClause *c = clauses[i]; c; c = c->next)
819 for (unsigned i = 0; i < c->size; i++)
820 if (abs (c->literals[i]) > max_var)
821 max_var = abs (c->literals[i]);
822 printf ("p cnf %d %" PRIu64 "\n", max_var, num_clauses);
823 for (uint64_t i = 0; i < size_clauses; i++)
824 for (LratCheckerClause *c = clauses[i]; c; c = c->next) {
825 for (unsigned i = 0; i < c->size; i++)
826 printf ("%d ", c->literals[i]);
827 printf ("0\n");
828 }
829}
830
831void LratChecker::begin_proof (int64_t id) { current_id = id; }
832
833} // namespace CaDiCaL
834
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
Definition global.h:14
#define LOG(...)
void report_status(int, int64_t) override
void add_constraint(const vector< int > &) override
void begin_proof(int64_t) override
void weaken_minus(int64_t, const vector< int > &) override
void conclude_unsat(ConclusionType, const vector< int64_t > &) override
void reset_assumptions() 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 restore_clause(int64_t, const vector< int > &)
void add_original_clause(int64_t, bool, const vector< int > &, bool restore) override
void connect_internal(Internal *i) override
void add_assumption(int) override
void finalize_clause(int64_t, const vector< int > &) override
Cube * p
Definition exorList.c:222
void fatal_message_start()
void fatal_message_end()
ConclusionType
Definition tracer.hpp:15
@ CONFLICT
Definition tracer.hpp:15
@ ASSUMPTIONS
Definition tracer.hpp:15
@ CONSTRAINT
Definition tracer.hpp:15
void clear_n(T *base, size_t n)
Definition util.hpp:149
double percent(double a, double b)
Definition util.hpp:21
unsigned long long size
Definition giaNewBdd.h:39
#define false
Definition place_base.h:29
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
int lit
Definition satVec.h:130
LratCheckerClause * next
unsigned size
Definition vector.h:35
char * memset()
long random()
signed char mark
Definition value.h:8
struct vector vector
Definition vector.h:24