ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
CaDiCaL::LratChecker Class Reference

#include <lratchecker.hpp>

Inheritance diagram for CaDiCaL::LratChecker:
Collaboration diagram for CaDiCaL::LratChecker:

Public Member Functions

 LratChecker (Internal *)
 
virtual ~LratChecker ()
 
void connect_internal (Internal *i) override
 
void begin_proof (int64_t) override
 
void add_original_clause (int64_t, bool, const vector< int > &, bool restore) override
 
void restore_clause (int64_t, const vector< int > &)
 
void add_derived_clause (int64_t, bool, const vector< int > &, const vector< int64_t > &) override
 
void delete_clause (int64_t, bool, const vector< int > &) override
 
void weaken_minus (int64_t, const vector< int > &) override
 
void finalize_clause (int64_t, const vector< int > &) override
 
void add_assumption_clause (int64_t, const vector< int > &, const vector< int64_t > &) override
 
void add_assumption (int) override
 
void add_constraint (const vector< int > &) override
 
void reset_assumptions () override
 
void report_status (int, int64_t) override
 
void conclude_unsat (ConclusionType, const vector< int64_t > &) override
 
void print_stats () override
 
void dump ()
 
- Public Member Functions inherited from CaDiCaL::StatTracer
 StatTracer ()
 
virtual ~StatTracer ()
 
- Public Member Functions inherited from CaDiCaL::InternalTracer
 InternalTracer ()
 
virtual ~InternalTracer ()
 
- Public Member Functions inherited from CaDiCaL::Tracer
 Tracer ()
 
virtual ~Tracer ()
 
virtual void add_original_clause (int64_t, bool, const std::vector< int > &, bool=false)
 
virtual void add_derived_clause (int64_t, bool, const std::vector< int > &, const std::vector< int64_t > &)
 
virtual void delete_clause (int64_t, bool, const std::vector< int > &)
 
virtual void demote_clause (uint64_t, const std::vector< int > &)
 
virtual void weaken_minus (int64_t, const std::vector< int > &)
 
virtual void strengthen (int64_t)
 
virtual void finalize_clause (int64_t, const std::vector< int > &)
 
virtual void solve_query ()
 
virtual void add_constraint (const std::vector< int > &)
 
virtual void add_assumption_clause (int64_t, const std::vector< int > &, const std::vector< int64_t > &)
 
virtual void conclude_unsat (ConclusionType, const std::vector< int64_t > &)
 
virtual void conclude_sat (const std::vector< int > &)
 
virtual void conclude_unknown (const std::vector< int > &)
 

Detailed Description

Definition at line 36 of file lratchecker.hpp.

Constructor & Destructor Documentation

◆ LratChecker()

CaDiCaL::LratChecker::LratChecker ( Internal * i)

Definition at line 120 of file cadical_lratchecker.cpp.

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}
#define CADICAL_assert(ignore)
Definition global.h:14
char * memset()
long random()
Here is the call graph for this function:

◆ ~LratChecker()

CaDiCaL::LratChecker::~LratChecker ( )
virtual

Definition at line 144 of file cadical_lratchecker.cpp.

144 {
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}
#define LOG(...)

Member Function Documentation

◆ add_assumption()

void CaDiCaL::LratChecker::add_assumption ( int a)
overridevirtual

Reimplemented from CaDiCaL::Tracer.

Definition at line 549 of file cadical_lratchecker.cpp.

549{ assumptions.push_back (a); }

◆ add_assumption_clause()

void CaDiCaL::LratChecker::add_assumption_clause ( int64_t id,
const vector< int > & c,
const vector< int64_t > & chain )
override

Definition at line 530 of file cadical_lratchecker.cpp.

531 {
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}
void add_derived_clause(int64_t, bool, const vector< int > &, const vector< int64_t > &) override
void fatal_message_start()
void fatal_message_end()
int lit
Definition satVec.h:130
Here is the call graph for this function:

◆ add_constraint()

void CaDiCaL::LratChecker::add_constraint ( const vector< int > & c)
override

Definition at line 551 of file cadical_lratchecker.cpp.

551 {
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}

◆ add_derived_clause()

void CaDiCaL::LratChecker::add_derived_clause ( int64_t id,
bool ,
const vector< int > & c,
const vector< int64_t > & proof_chain )
override

Definition at line 481 of file cadical_lratchecker.cpp.

483 {
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}
Cube * p
Definition exorList.c:222
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_original_clause()

void CaDiCaL::LratChecker::add_original_clause ( int64_t id,
bool ,
const vector< int > & c,
bool restore )
override

Definition at line 452 of file cadical_lratchecker.cpp.

453 {
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}
void restore_clause(int64_t, const vector< int > &)
Here is the call graph for this function:

◆ begin_proof()

void CaDiCaL::LratChecker::begin_proof ( int64_t id)
overridevirtual

Reimplemented from CaDiCaL::Tracer.

Definition at line 831 of file cadical_lratchecker.cpp.

831{ current_id = id; }

◆ conclude_unsat()

void CaDiCaL::LratChecker::conclude_unsat ( ConclusionType conclusion,
const vector< int64_t > & ids )
override

Definition at line 569 of file cadical_lratchecker.cpp.

570 {
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}
@ CONFLICT
Definition tracer.hpp:15
@ ASSUMPTIONS
Definition tracer.hpp:15
@ CONSTRAINT
Definition tracer.hpp:15
unsigned size
Definition vector.h:35
Here is the call graph for this function:

◆ connect_internal()

void CaDiCaL::LratChecker::connect_internal ( Internal * i)
overridevirtual

Reimplemented from CaDiCaL::InternalTracer.

Definition at line 139 of file cadical_lratchecker.cpp.

139 {
140 internal = i;
141 LOG ("connected to internal");
142}

◆ delete_clause()

void CaDiCaL::LratChecker::delete_clause ( int64_t id,
bool ,
const vector< int > & c )
override

Definition at line 626 of file cadical_lratchecker.cpp.

626 {
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}
signed char mark
Definition value.h:8
Here is the call graph for this function:

◆ dump()

void CaDiCaL::LratChecker::dump ( )

Definition at line 815 of file cadical_lratchecker.cpp.

815 {
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}

◆ finalize_clause()

void CaDiCaL::LratChecker::finalize_clause ( int64_t id,
const vector< int > & c )
override

Definition at line 757 of file cadical_lratchecker.cpp.

757 {
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}
Here is the call graph for this function:

◆ print_stats()

void CaDiCaL::LratChecker::print_stats ( )
overridevirtual

Reimplemented from CaDiCaL::StatTracer.

Definition at line 799 of file cadical_stats.cpp.

799 {
800
801 if (!stats.added && !stats.deleted)
802 return;
803
804 SECTION ("lrat checker statistics");
805
806 MSG ("checks: %15" PRId64 "", stats.checks);
807 MSG ("insertions: %15" PRId64 " %10.2f %% of all clauses",
808 stats.insertions, percent (stats.insertions, stats.added));
809 MSG ("original: %15" PRId64 " %10.2f %% of all clauses",
810 stats.original, percent (stats.original, stats.added));
811 MSG ("derived: %15" PRId64 " %10.2f %% of all clauses",
812 stats.derived, percent (stats.derived, stats.added));
813 MSG ("deleted: %15" PRId64 " %10.2f %% of all clauses",
814 stats.deleted, percent (stats.deleted, stats.added));
815 MSG ("finalized: %15" PRId64 " %10.2f %% of all clauses",
816 stats.finalized, percent (stats.finalized, stats.added));
817 MSG ("collections: %15" PRId64 " %10.2f deleted per collection",
818 stats.collections, relative (stats.collections, stats.deleted));
819 MSG ("collisions: %15" PRId64 " %10.2f per search",
820 stats.collisions, relative (stats.collisions, stats.searches));
821 MSG ("searches: %15" PRId64 "", stats.searches);
822}
#define MSG(...)
Definition message.hpp:49
#define SECTION(...)
Definition message.hpp:55
double relative(double a, double b)
Definition util.hpp:20
double percent(double a, double b)
Definition util.hpp:21
Here is the call graph for this function:

◆ report_status()

void CaDiCaL::LratChecker::report_status ( int ,
int64_t  )
overridevirtual

Reimplemented from CaDiCaL::Tracer.

Definition at line 797 of file cadical_lratchecker.cpp.

797 {
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}
Here is the call graph for this function:

◆ reset_assumptions()

void CaDiCaL::LratChecker::reset_assumptions ( )
overridevirtual

Reimplemented from CaDiCaL::Tracer.

Definition at line 562 of file cadical_lratchecker.cpp.

562 {
563 assumption_clauses.clear ();
564 assumptions.clear ();
565 concluded = false;
566 // constraint.clear ();
567}

◆ restore_clause()

void CaDiCaL::LratChecker::restore_clause ( int64_t id,
const vector< int > & c )

Definition at line 718 of file cadical_lratchecker.cpp.

718 {
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}
void sort(T *array, int size, LessThan lt)
Definition Sort.h:58
Here is the call graph for this function:
Here is the caller graph for this function:

◆ weaken_minus()

void CaDiCaL::LratChecker::weaken_minus ( int64_t id,
const vector< int > & c )
override

Definition at line 679 of file cadical_lratchecker.cpp.

679 {
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}
Here is the call graph for this function:

Member Data Documentation

◆ added

int64_t CaDiCaL::LratChecker::added

Definition at line 103 of file lratchecker.hpp.

◆ checks

int64_t CaDiCaL::LratChecker::checks

Definition at line 114 of file lratchecker.hpp.

◆ collections

int64_t CaDiCaL::LratChecker::collections

Definition at line 116 of file lratchecker.hpp.

◆ collisions

int64_t CaDiCaL::LratChecker::collisions

Definition at line 111 of file lratchecker.hpp.

◆ deleted

int64_t CaDiCaL::LratChecker::deleted

Definition at line 107 of file lratchecker.hpp.

◆ derived

int64_t CaDiCaL::LratChecker::derived

Definition at line 105 of file lratchecker.hpp.

◆ finalized

int64_t CaDiCaL::LratChecker::finalized

Definition at line 108 of file lratchecker.hpp.

◆ insertions

int64_t CaDiCaL::LratChecker::insertions

Definition at line 110 of file lratchecker.hpp.

◆ original

int64_t CaDiCaL::LratChecker::original

Definition at line 104 of file lratchecker.hpp.

◆ searches

int64_t CaDiCaL::LratChecker::searches

Definition at line 112 of file lratchecker.hpp.


The documentation for this class was generated from the following files: