cadical 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +26 -0
  3. data/README.md +101 -0
  4. data/ext/cadical/cadical/LICENSE +28 -0
  5. data/ext/cadical/cadical/README.md +65 -0
  6. data/ext/cadical/cadical/VERSION +1 -0
  7. data/ext/cadical/cadical/src/analyze.cpp +1360 -0
  8. data/ext/cadical/cadical/src/arena.cpp +30 -0
  9. data/ext/cadical/cadical/src/arena.hpp +105 -0
  10. data/ext/cadical/cadical/src/assume.cpp +616 -0
  11. data/ext/cadical/cadical/src/averages.cpp +34 -0
  12. data/ext/cadical/cadical/src/averages.hpp +37 -0
  13. data/ext/cadical/cadical/src/backbone.cpp +631 -0
  14. data/ext/cadical/cadical/src/backtrack.cpp +177 -0
  15. data/ext/cadical/cadical/src/backward.cpp +231 -0
  16. data/ext/cadical/cadical/src/bins.cpp +22 -0
  17. data/ext/cadical/cadical/src/bins.hpp +22 -0
  18. data/ext/cadical/cadical/src/block.cpp +824 -0
  19. data/ext/cadical/cadical/src/block.hpp +37 -0
  20. data/ext/cadical/cadical/src/cadical.cpp +1026 -0
  21. data/ext/cadical/cadical/src/cadical.hpp +1419 -0
  22. data/ext/cadical/cadical/src/ccadical.cpp +208 -0
  23. data/ext/cadical/cadical/src/ccadical.h +74 -0
  24. data/ext/cadical/cadical/src/checker.cpp +649 -0
  25. data/ext/cadical/cadical/src/checker.hpp +173 -0
  26. data/ext/cadical/cadical/src/clause.cpp +689 -0
  27. data/ext/cadical/cadical/src/clause.hpp +190 -0
  28. data/ext/cadical/cadical/src/collect.cpp +545 -0
  29. data/ext/cadical/cadical/src/compact.cpp +550 -0
  30. data/ext/cadical/cadical/src/condition.cpp +940 -0
  31. data/ext/cadical/cadical/src/config.cpp +101 -0
  32. data/ext/cadical/cadical/src/config.hpp +20 -0
  33. data/ext/cadical/cadical/src/congruence.cpp +7880 -0
  34. data/ext/cadical/cadical/src/congruence.hpp +757 -0
  35. data/ext/cadical/cadical/src/constrain.cpp +64 -0
  36. data/ext/cadical/cadical/src/contract.cpp +27 -0
  37. data/ext/cadical/cadical/src/contract.hpp +139 -0
  38. data/ext/cadical/cadical/src/cover.cpp +704 -0
  39. data/ext/cadical/cadical/src/cover.hpp +34 -0
  40. data/ext/cadical/cadical/src/decide.cpp +347 -0
  41. data/ext/cadical/cadical/src/decompose.cpp +738 -0
  42. data/ext/cadical/cadical/src/decompose.hpp +23 -0
  43. data/ext/cadical/cadical/src/deduplicate.cpp +275 -0
  44. data/ext/cadical/cadical/src/definition.cpp +283 -0
  45. data/ext/cadical/cadical/src/delay.hpp +38 -0
  46. data/ext/cadical/cadical/src/drattracer.cpp +153 -0
  47. data/ext/cadical/cadical/src/drattracer.hpp +55 -0
  48. data/ext/cadical/cadical/src/elim.cpp +1171 -0
  49. data/ext/cadical/cadical/src/elim.hpp +53 -0
  50. data/ext/cadical/cadical/src/elimfast.cpp +570 -0
  51. data/ext/cadical/cadical/src/ema.cpp +95 -0
  52. data/ext/cadical/cadical/src/ema.hpp +68 -0
  53. data/ext/cadical/cadical/src/extend.cpp +289 -0
  54. data/ext/cadical/cadical/src/external.cpp +1034 -0
  55. data/ext/cadical/cadical/src/external.hpp +487 -0
  56. data/ext/cadical/cadical/src/external_propagate.cpp +1316 -0
  57. data/ext/cadical/cadical/src/factor.cpp +1011 -0
  58. data/ext/cadical/cadical/src/factor.hpp +54 -0
  59. data/ext/cadical/cadical/src/file.cpp +506 -0
  60. data/ext/cadical/cadical/src/file.hpp +210 -0
  61. data/ext/cadical/cadical/src/flags.cpp +135 -0
  62. data/ext/cadical/cadical/src/flags.hpp +93 -0
  63. data/ext/cadical/cadical/src/flip.cpp +269 -0
  64. data/ext/cadical/cadical/src/format.cpp +89 -0
  65. data/ext/cadical/cadical/src/format.hpp +36 -0
  66. data/ext/cadical/cadical/src/frattracer.cpp +277 -0
  67. data/ext/cadical/cadical/src/frattracer.hpp +67 -0
  68. data/ext/cadical/cadical/src/gates.cpp +766 -0
  69. data/ext/cadical/cadical/src/heap.hpp +212 -0
  70. data/ext/cadical/cadical/src/idruptracer.cpp +566 -0
  71. data/ext/cadical/cadical/src/idruptracer.hpp +112 -0
  72. data/ext/cadical/cadical/src/instantiate.cpp +365 -0
  73. data/ext/cadical/cadical/src/instantiate.hpp +45 -0
  74. data/ext/cadical/cadical/src/internal.cpp +1265 -0
  75. data/ext/cadical/cadical/src/internal.hpp +1941 -0
  76. data/ext/cadical/cadical/src/inttypes.hpp +34 -0
  77. data/ext/cadical/cadical/src/ipasir.cpp +47 -0
  78. data/ext/cadical/cadical/src/ipasir.h +37 -0
  79. data/ext/cadical/cadical/src/kitten.c +2599 -0
  80. data/ext/cadical/cadical/src/kitten.h +97 -0
  81. data/ext/cadical/cadical/src/level.hpp +33 -0
  82. data/ext/cadical/cadical/src/lidruptracer.cpp +657 -0
  83. data/ext/cadical/cadical/src/lidruptracer.hpp +122 -0
  84. data/ext/cadical/cadical/src/limit.cpp +146 -0
  85. data/ext/cadical/cadical/src/limit.hpp +168 -0
  86. data/ext/cadical/cadical/src/logging.cpp +214 -0
  87. data/ext/cadical/cadical/src/logging.hpp +98 -0
  88. data/ext/cadical/cadical/src/lookahead.cpp +520 -0
  89. data/ext/cadical/cadical/src/lratchecker.cpp +833 -0
  90. data/ext/cadical/cadical/src/lratchecker.hpp +168 -0
  91. data/ext/cadical/cadical/src/lrattracer.cpp +200 -0
  92. data/ext/cadical/cadical/src/lrattracer.hpp +61 -0
  93. data/ext/cadical/cadical/src/lucky.cpp +506 -0
  94. data/ext/cadical/cadical/src/message.cpp +218 -0
  95. data/ext/cadical/cadical/src/message.hpp +65 -0
  96. data/ext/cadical/cadical/src/minimize.cpp +224 -0
  97. data/ext/cadical/cadical/src/mobical.cpp +5588 -0
  98. data/ext/cadical/cadical/src/occs.cpp +52 -0
  99. data/ext/cadical/cadical/src/occs.hpp +36 -0
  100. data/ext/cadical/cadical/src/options.cpp +359 -0
  101. data/ext/cadical/cadical/src/options.hpp +442 -0
  102. data/ext/cadical/cadical/src/parse.cpp +471 -0
  103. data/ext/cadical/cadical/src/parse.hpp +75 -0
  104. data/ext/cadical/cadical/src/phases.cpp +56 -0
  105. data/ext/cadical/cadical/src/phases.hpp +19 -0
  106. data/ext/cadical/cadical/src/probe.cpp +990 -0
  107. data/ext/cadical/cadical/src/profile.cpp +107 -0
  108. data/ext/cadical/cadical/src/profile.hpp +283 -0
  109. data/ext/cadical/cadical/src/proof.cpp +691 -0
  110. data/ext/cadical/cadical/src/proof.hpp +125 -0
  111. data/ext/cadical/cadical/src/propagate.cpp +584 -0
  112. data/ext/cadical/cadical/src/queue.cpp +90 -0
  113. data/ext/cadical/cadical/src/queue.hpp +74 -0
  114. data/ext/cadical/cadical/src/radix.hpp +180 -0
  115. data/ext/cadical/cadical/src/random.cpp +207 -0
  116. data/ext/cadical/cadical/src/random.h +44 -0
  117. data/ext/cadical/cadical/src/random.hpp +98 -0
  118. data/ext/cadical/cadical/src/range.hpp +125 -0
  119. data/ext/cadical/cadical/src/reap.cpp +127 -0
  120. data/ext/cadical/cadical/src/reap.hpp +28 -0
  121. data/ext/cadical/cadical/src/reduce.cpp +278 -0
  122. data/ext/cadical/cadical/src/reluctant.hpp +82 -0
  123. data/ext/cadical/cadical/src/rephase.cpp +402 -0
  124. data/ext/cadical/cadical/src/report.cpp +313 -0
  125. data/ext/cadical/cadical/src/resources.cpp +160 -0
  126. data/ext/cadical/cadical/src/resources.hpp +16 -0
  127. data/ext/cadical/cadical/src/restart.cpp +178 -0
  128. data/ext/cadical/cadical/src/restore.cpp +267 -0
  129. data/ext/cadical/cadical/src/score.cpp +51 -0
  130. data/ext/cadical/cadical/src/score.hpp +16 -0
  131. data/ext/cadical/cadical/src/shrink.cpp +507 -0
  132. data/ext/cadical/cadical/src/signal.cpp +136 -0
  133. data/ext/cadical/cadical/src/signal.hpp +33 -0
  134. data/ext/cadical/cadical/src/solution.cpp +50 -0
  135. data/ext/cadical/cadical/src/solver.cpp +1871 -0
  136. data/ext/cadical/cadical/src/stable.cpp +31 -0
  137. data/ext/cadical/cadical/src/stack.h +110 -0
  138. data/ext/cadical/cadical/src/stats.cpp +920 -0
  139. data/ext/cadical/cadical/src/stats.hpp +418 -0
  140. data/ext/cadical/cadical/src/subsume.cpp +645 -0
  141. data/ext/cadical/cadical/src/sweep.cpp +1960 -0
  142. data/ext/cadical/cadical/src/sweep.hpp +61 -0
  143. data/ext/cadical/cadical/src/terminal.cpp +38 -0
  144. data/ext/cadical/cadical/src/terminal.hpp +96 -0
  145. data/ext/cadical/cadical/src/ternary.cpp +450 -0
  146. data/ext/cadical/cadical/src/testing.hpp +24 -0
  147. data/ext/cadical/cadical/src/tier.cpp +189 -0
  148. data/ext/cadical/cadical/src/tracer.hpp +186 -0
  149. data/ext/cadical/cadical/src/transred.cpp +253 -0
  150. data/ext/cadical/cadical/src/unstable.cpp +29 -0
  151. data/ext/cadical/cadical/src/util.cpp +129 -0
  152. data/ext/cadical/cadical/src/util.hpp +181 -0
  153. data/ext/cadical/cadical/src/var.cpp +39 -0
  154. data/ext/cadical/cadical/src/var.hpp +22 -0
  155. data/ext/cadical/cadical/src/veripbtracer.cpp +427 -0
  156. data/ext/cadical/cadical/src/veripbtracer.hpp +106 -0
  157. data/ext/cadical/cadical/src/version.cpp +107 -0
  158. data/ext/cadical/cadical/src/version.hpp +13 -0
  159. data/ext/cadical/cadical/src/vivify.cpp +1893 -0
  160. data/ext/cadical/cadical/src/vivify.hpp +50 -0
  161. data/ext/cadical/cadical/src/walk.cpp +1088 -0
  162. data/ext/cadical/cadical/src/walk.hpp +91 -0
  163. data/ext/cadical/cadical/src/walk_full_occs.cpp +966 -0
  164. data/ext/cadical/cadical/src/warmup.cpp +403 -0
  165. data/ext/cadical/cadical/src/watch.cpp +126 -0
  166. data/ext/cadical/cadical/src/watch.hpp +77 -0
  167. data/ext/cadical/cadical_ext.c +778 -0
  168. data/ext/cadical/extconf.rb +26 -0
  169. data/lib/cadical/version.rb +3 -0
  170. data/lib/cadical.rb +12 -0
  171. metadata +218 -0
@@ -0,0 +1,122 @@
1
+ #ifndef _lidruptracer_h_INCLUDED
2
+ #define _lidruptracer_h_INCLUDED
3
+
4
+ #include "file.hpp"
5
+ #include "tracer.hpp"
6
+
7
+ namespace CaDiCaL {
8
+
9
+ struct LidrupClause {
10
+ LidrupClause *next; // collision chain link for hash table
11
+ uint64_t hash; // previously computed full 64-bit hash
12
+ int64_t id; // id of clause
13
+ std::vector<int64_t> chain;
14
+ std::vector<int> literals;
15
+ };
16
+
17
+ class LidrupTracer : public FileTracer {
18
+
19
+ Internal *internal;
20
+ File *file;
21
+ bool binary;
22
+ bool piping; // The 'file' is a pipe and needs eagerly flushing.
23
+
24
+ // hash table for conclusion
25
+ //
26
+ uint64_t num_clauses; // number of clauses in hash table
27
+ uint64_t size_clauses; // size of clause hash table
28
+ LidrupClause **clauses; // hash table of clauses
29
+ std::vector<int> imported_clause;
30
+ std::vector<int> assumptions;
31
+ std::vector<int64_t> imported_chain;
32
+ std::vector<int64_t> batch_weaken;
33
+ std::vector<int64_t> batch_delete;
34
+ std::vector<int64_t> batch_restore;
35
+
36
+ static const unsigned num_nonces = 4;
37
+
38
+ uint64_t nonces[num_nonces]; // random numbers for hashing
39
+ uint64_t last_hash; // last computed hash value of clause
40
+ int64_t last_id; // id of the last added clause
41
+ LidrupClause *last_clause;
42
+ uint64_t compute_hash (int64_t); // compute and save hash value of clause
43
+
44
+ LidrupClause *new_clause ();
45
+ void delete_clause (LidrupClause *);
46
+
47
+ static uint64_t reduce_hash (uint64_t hash, uint64_t size);
48
+
49
+ void enlarge_clauses (); // enlarge hash table for clauses
50
+ void insert (); // insert clause in hash table
51
+ bool
52
+ find_and_delete (const int64_t); // find clause position in hash table
53
+
54
+ #ifndef QUIET
55
+ int64_t added, deleted, weakened, restore, original, solved, batched;
56
+ #endif
57
+
58
+ void flush_if_piping ();
59
+
60
+ void put_binary_zero ();
61
+ void put_binary_lit (int external_lit);
62
+ void put_binary_id (int64_t id, bool = true);
63
+
64
+ void lidrup_add_derived_clause (int64_t id,
65
+ const std::vector<int> &clause,
66
+ const std::vector<int64_t> &chain);
67
+ void
68
+ lidrup_delete_clause (int64_t id); //, const std::vector<int> &clause);
69
+ void lidrup_add_restored_clause (
70
+ int64_t id); //, const std::vector<int> &clause);
71
+ void lidrup_add_original_clause (int64_t id,
72
+ const std::vector<int> &clause);
73
+ void lidrup_conclude_and_delete (const std::vector<int64_t> &conclusion);
74
+ void lidrup_report_status (int status);
75
+ void lidrup_conclude_sat (const std::vector<int> &model);
76
+ void lidrup_conclude_unknown (const std::vector<int> &trail);
77
+ void lidrup_solve_query ();
78
+ void lidrup_batch_weaken_restore_and_delete ();
79
+
80
+ public:
81
+ LidrupTracer (Internal *, File *file, bool);
82
+ ~LidrupTracer ();
83
+
84
+ // proof section:
85
+ void add_derived_clause (int64_t, bool, int, const std::vector<int> &,
86
+ const std::vector<int64_t> &) override;
87
+ void add_assumption_clause (int64_t, const std::vector<int> &,
88
+ const std::vector<int64_t> &) override;
89
+ void weaken_minus (int64_t, const std::vector<int> &) override;
90
+ void delete_clause (int64_t, bool, const std::vector<int> &) override;
91
+ void add_original_clause (int64_t, bool, const std::vector<int> &,
92
+ bool = false) override;
93
+ void report_status (int, int64_t) override;
94
+ void conclude_sat (const std::vector<int> &) override;
95
+ void conclude_unsat (ConclusionType,
96
+ const std::vector<int64_t> &) override;
97
+ void conclude_unknown (const std::vector<int> &) override;
98
+
99
+ void solve_query () override;
100
+ void add_assumption (int) override;
101
+ void reset_assumptions () override;
102
+
103
+ // skip
104
+ void begin_proof (int64_t) override {}
105
+ void finalize_clause (int64_t, const std::vector<int> &) override {}
106
+ void strengthen (int64_t) override {}
107
+ void add_constraint (const std::vector<int> &) override {}
108
+
109
+ // logging and file io
110
+ void connect_internal (Internal *i) override;
111
+
112
+ #ifndef QUIET
113
+ void print_statistics ();
114
+ #endif
115
+ bool closed () override;
116
+ void close (bool) override;
117
+ void flush (bool) override;
118
+ };
119
+
120
+ } // namespace CaDiCaL
121
+
122
+ #endif
@@ -0,0 +1,146 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ Limit::Limit () { memset (this, 0, sizeof *this); }
6
+
7
+ /*------------------------------------------------------------------------*/
8
+
9
+ double Internal::scale (double v) const {
10
+ const double ratio = clause_variable_ratio ();
11
+ const double factor = (ratio <= 2) ? 1.0 : log (ratio) / log (2);
12
+ double res = factor * v;
13
+ if (res < 1)
14
+ res = 1;
15
+ return res;
16
+ }
17
+
18
+ /*------------------------------------------------------------------------*/
19
+
20
+ Last::Last () { memset (this, 0, sizeof *this); }
21
+
22
+ /*------------------------------------------------------------------------*/
23
+
24
+ Inc::Inc () {
25
+ memset (this, 0, sizeof *this);
26
+ ticks = decisions = conflicts = -1; // unlimited
27
+ }
28
+
29
+ void Internal::limit_terminate (int l) {
30
+ if (l <= 0 && !lim.terminate.forced) {
31
+ LOG ("keeping unbounded terminate limit");
32
+ } else if (l <= 0) {
33
+ LOG ("reset terminate limit to be unbounded");
34
+ lim.terminate.forced = 0;
35
+ } else {
36
+ lim.terminate.forced = l;
37
+ LOG ("new terminate limit of %d calls", l);
38
+ }
39
+ }
40
+
41
+ void Internal::limit_conflicts (int l) {
42
+ if (l < 0 && inc.conflicts < 0) {
43
+ LOG ("keeping unbounded conflict limit");
44
+ } else if (l < 0) {
45
+ LOG ("reset conflict limit to be unbounded");
46
+ inc.conflicts = -1;
47
+ } else {
48
+ inc.conflicts = l;
49
+ LOG ("new conflict limit of %d conflicts", l);
50
+ }
51
+ }
52
+
53
+ void Internal::limit_decisions (int l) {
54
+ if (l < 0 && inc.decisions < 0) {
55
+ LOG ("keeping unbounded decision limit");
56
+ } else if (l < 0) {
57
+ LOG ("reset decision limit to be unbounded");
58
+ inc.decisions = -1;
59
+ } else {
60
+ inc.decisions = l;
61
+ LOG ("new decision limit of %d decisions", l);
62
+ }
63
+ }
64
+
65
+ void Internal::limit_ticks (int64_t l) {
66
+ if (l < 0 && inc.ticks < 0) {
67
+ LOG ("keeping unbounded ticks limit");
68
+ } else if (l < 0) {
69
+ LOG ("reset ticks limit to be unbounded");
70
+ inc.ticks = -1;
71
+ } else {
72
+ inc.ticks = l;
73
+ LOG ("new ticks limit of %" PRId64 " ticks", l);
74
+ }
75
+ }
76
+
77
+ void Internal::limit_preprocessing (int l) {
78
+ if (l < 0) {
79
+ LOG ("ignoring invalid preprocessing limit %d", l);
80
+ } else if (!l) {
81
+ LOG ("reset preprocessing limit to no preprocessing");
82
+ inc.preprocessing = 0;
83
+ } else {
84
+ inc.preprocessing = l;
85
+ LOG ("new preprocessing limit of %d preprocessing rounds", l);
86
+ }
87
+ }
88
+
89
+ void Internal::limit_local_search (int l) {
90
+ if (l < 0) {
91
+ LOG ("ignoring invalid local search limit %d", l);
92
+ } else if (!l) {
93
+ LOG ("reset local search limit to no local search");
94
+ inc.localsearch = 0;
95
+ } else {
96
+ inc.localsearch = l;
97
+ LOG ("new local search limit of %d local search rounds", l);
98
+ }
99
+ }
100
+
101
+ bool Internal::is_valid_limit (const char *name) {
102
+ if (!strcmp (name, "terminate"))
103
+ return true;
104
+ if (!strcmp (name, "conflicts"))
105
+ return true;
106
+ if (!strcmp (name, "decisions"))
107
+ return true;
108
+ if (!strcmp (name, "preprocessing"))
109
+ return true;
110
+ if (!strcmp (name, "localsearch"))
111
+ return true;
112
+ if (!strcmp (name, "ticks"))
113
+ return true;
114
+ return false;
115
+ }
116
+
117
+ bool Internal::limit (const char *name, int l) {
118
+ bool res = true;
119
+ if (!strcmp (name, "terminate"))
120
+ limit_terminate (l);
121
+ else if (!strcmp (name, "conflicts"))
122
+ limit_conflicts (l);
123
+ else if (!strcmp (name, "decisions"))
124
+ limit_decisions (l);
125
+ else if (!strcmp (name, "preprocessing"))
126
+ limit_preprocessing (l);
127
+ else if (!strcmp (name, "localsearch"))
128
+ limit_local_search (l);
129
+ else if (!strcmp (name, "ticks"))
130
+ limit_ticks (l);
131
+ else
132
+ res = false;
133
+ return res;
134
+ }
135
+
136
+ void Internal::reset_limits () {
137
+ LOG ("reset limits");
138
+ limit_terminate (0);
139
+ limit_conflicts (-1);
140
+ limit_decisions (-1);
141
+ limit_preprocessing (0);
142
+ limit_local_search (0);
143
+ limit_ticks (-1);
144
+ }
145
+
146
+ } // namespace CaDiCaL
@@ -0,0 +1,168 @@
1
+ #ifndef _limit_hpp_INCLUDED
2
+ #define _limit_hpp_INCLUDED
3
+
4
+ #include <cstdint>
5
+ #include <limits>
6
+
7
+ namespace CaDiCaL {
8
+
9
+ struct Internal;
10
+
11
+ struct Limit {
12
+
13
+ bool initialized;
14
+
15
+ int64_t conflicts; // conflict limit if non-negative
16
+ int64_t decisions; // decision limit if non-negative
17
+ int64_t preprocessing; // limit on preprocessing rounds
18
+ int64_t localsearch; // limit on local search rounds
19
+ int64_t ticks; // ticks limit if non-negative
20
+
21
+ int64_t compact; // conflict limit for next 'compact'
22
+ int64_t condition; // conflict limit for next 'condition'
23
+ int64_t elim; // conflict limit for next 'elim'
24
+ int64_t flush; // conflict limit for next 'flush'
25
+ int64_t inprobe; // conflict limit for next 'inprobe'
26
+ int64_t reduce; // conflict limit for next 'reduce'
27
+ int64_t rephase; // conflict limit for next 'rephase'
28
+ int64_t report; // report limit for header
29
+ int64_t restart; // conflict limit for next 'restart'
30
+ int64_t stabilize; // conflict/ticks limit for next 'stabilize'
31
+ int64_t incremental_decay; // conflict/ticks limit for next clause 'decay'
32
+ // for incremental clauses
33
+ int64_t random_decision; // randomized decision limit for conflicts
34
+
35
+ int keptsize; // maximum kept size in 'reduce'
36
+ int keptglue; // maximum kept glue in 'reduce'
37
+ int64_t recompute_tier; // conflict limit for next tier recomputation
38
+
39
+ // How often rephased during (1) or out (0) of stabilization.
40
+ //
41
+ int64_t rephased[2];
42
+
43
+ // Current elimination bound per eliminated variable.
44
+ //
45
+ int64_t elimbound;
46
+
47
+ struct {
48
+ int check; // countdown to next terminator call
49
+ int forced; // forced termination for testing
50
+ } terminate;
51
+
52
+ Limit ();
53
+ };
54
+
55
+ struct Delay {
56
+ struct {
57
+ int64_t interval = 0, limit = 0;
58
+ bool bypass = 0;
59
+
60
+ bool delay () {
61
+ if (bypass)
62
+ return false;
63
+ if (limit) {
64
+ --limit;
65
+ return true;
66
+ } else {
67
+ return false;
68
+ }
69
+ }
70
+
71
+ void bump_delay () {
72
+ interval += interval < INT64_MAX;
73
+ limit = interval;
74
+ }
75
+
76
+ void reduce_delay () {
77
+ if (!interval)
78
+ return;
79
+ interval /= 2;
80
+ limit = interval;
81
+ }
82
+
83
+ void bypass_delay () { bypass = 1; }
84
+ void unbypass_delay () { bypass = 0; }
85
+ } bumpreasons;
86
+ };
87
+
88
+ struct Last {
89
+ struct {
90
+ int64_t propagations;
91
+ } transred;
92
+ struct {
93
+ int64_t ticks;
94
+ } backbone, probe, sweep, vivify, walk;
95
+ struct {
96
+ int64_t fixed, subsumephases, marked;
97
+ } elim;
98
+ struct {
99
+ int64_t reductions;
100
+ } inprobe;
101
+ struct {
102
+ int64_t conflicts;
103
+ } reduce, rephase;
104
+ struct {
105
+ int64_t ticks;
106
+ int64_t marked;
107
+ } ternary;
108
+ struct {
109
+ int64_t fixed;
110
+ } collect;
111
+ struct {
112
+ int64_t marked, ticks;
113
+ } factor;
114
+ struct {
115
+ int64_t conflicts;
116
+ int64_t ticks;
117
+ int64_t rephased;
118
+ } stabilize;
119
+ struct {
120
+ int64_t last_id;
121
+ } incremental_decay;
122
+ Last ();
123
+ };
124
+
125
+ struct Inc {
126
+ int64_t flush; // flushing interval in terms of conflicts
127
+ int64_t stabilize; // base ticks limit after first mode switch
128
+ int64_t conflicts; // next conflict limit if non-negative
129
+ int64_t decisions; // next decision limit if non-negative
130
+ int64_t ticks; // next ticks limit if non-negative
131
+ int64_t preprocessing; // next preprocessing limit if non-negative
132
+ int64_t localsearch; // next local search limit if non-negative
133
+ Inc ();
134
+ };
135
+
136
+ #define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD) \
137
+ int64_t LIMIT; \
138
+ do { \
139
+ const int64_t OLD_LIMIT = stats.ticks.NAME; \
140
+ const int64_t TICKS = stats.ticks.search[0] + stats.ticks.search[1]; \
141
+ const int64_t LAST = last.NAME.ticks; \
142
+ int64_t REFERENCE = TICKS - LAST; \
143
+ if (!REFERENCE || !stats.conflicts) { \
144
+ VERBOSE (2, "last %" PRId64 " current %" PRId64 " delta %" PRId64, \
145
+ LAST, TICKS, REFERENCE); \
146
+ REFERENCE = opts.preprocessinit; \
147
+ } \
148
+ const double EFFORT = (double) opts.NAME##effort * 1e-3; \
149
+ const int64_t DELTA = EFFORT * REFERENCE; \
150
+ const int64_t THRESH = opts.NAME##thresh * clauses.size (); \
151
+ if (THRESHHOLD && DELTA < THRESH) { \
152
+ VERBOSE (2, \
153
+ "delaying %s with ticklimit %" PRId64 \
154
+ " and threshhold %" PRId64, \
155
+ #NAME, DELTA, THRESH); \
156
+ return false; \
157
+ } \
158
+ last.NAME.ticks = TICKS; \
159
+ const int64_t NEW_LIMIT = OLD_LIMIT + DELTA; \
160
+ LIMIT = NEW_LIMIT; \
161
+ VERBOSE (2, \
162
+ "new ticks limit %" PRId64 "= %" PRId64 " + %f * %" PRId64, \
163
+ NEW_LIMIT, OLD_LIMIT, EFFORT, REFERENCE); \
164
+ } while (0)
165
+
166
+ } // namespace CaDiCaL
167
+
168
+ #endif
@@ -0,0 +1,214 @@
1
+ #ifdef LOGGING
2
+
3
+ #include "internal.hpp"
4
+
5
+ namespace CaDiCaL {
6
+
7
+ void Logger::print_log_prefix (Internal *internal) {
8
+ internal->print_prefix ();
9
+ tout.magenta ();
10
+ fputs ("LOG ", stdout);
11
+ tout.magenta (true);
12
+ printf ("%d ", internal->level);
13
+ tout.normal ();
14
+ }
15
+
16
+ void Logger::log_empty_line (Internal *internal) {
17
+ internal->print_prefix ();
18
+ tout.magenta ();
19
+ const int len = internal->prefix.size (), max = 78 - len;
20
+ for (int i = 0; i < max; i++)
21
+ fputc ('-', stdout);
22
+ fputc ('\n', stdout);
23
+ tout.normal ();
24
+ fflush (stdout);
25
+ }
26
+
27
+ void Logger::log (Internal *internal, const char *fmt, ...) {
28
+ print_log_prefix (internal);
29
+ tout.magenta ();
30
+ va_list ap;
31
+ va_start (ap, fmt);
32
+ vprintf (fmt, ap);
33
+ va_end (ap);
34
+ fputc ('\n', stdout);
35
+ tout.normal ();
36
+ fflush (stdout);
37
+ }
38
+
39
+ // It is hard to factor out the common part between the two clause loggers,
40
+ // since they are also used in slightly different contexts. Our attempt to
41
+ // do so were not more readable than the current version. See the header
42
+ // for an explanation of the difference between the following two functions.
43
+
44
+ void Logger::log (Internal *internal, const Clause *c, const char *fmt,
45
+ ...) {
46
+ print_log_prefix (internal);
47
+ tout.magenta ();
48
+ va_list ap;
49
+ va_start (ap, fmt);
50
+ vprintf (fmt, ap);
51
+ va_end (ap);
52
+ if (c) {
53
+ if (c->redundant)
54
+ printf (" glue %d redundant", c->glue);
55
+ else
56
+ printf (" irredundant");
57
+ printf (" size %d clause[%" PRId64 "]", c->size, c->id);
58
+ if (c->moved)
59
+ printf (" ... (moved)");
60
+ else {
61
+ if (internal->opts.logsort) {
62
+ vector<int> s;
63
+ for (const auto &lit : *c)
64
+ s.push_back (lit);
65
+ sort (s.begin (), s.end (), clause_lit_less_than ());
66
+ for (const auto &lit : s)
67
+ printf (" %d", lit);
68
+ } else {
69
+ for (const auto &lit : *c) {
70
+ printf (" %s", loglit (internal, lit).c_str ());
71
+ }
72
+ }
73
+ }
74
+ } else if (internal->level)
75
+ printf (" decision");
76
+ else
77
+ printf (" unit");
78
+ fputc ('\n', stdout);
79
+ tout.normal ();
80
+ fflush (stdout);
81
+ }
82
+
83
+ void Logger::log (Internal *internal, const Gate *g, const char *fmt, ...) {
84
+ print_log_prefix (internal);
85
+ tout.magenta ();
86
+ va_list ap;
87
+ va_start (ap, fmt);
88
+ vprintf (fmt, ap);
89
+ va_end (ap);
90
+ if (g) {
91
+ printf ("%s%s gate[%" PRIu64 "] (arity: %zu) %s := %s",
92
+ special_gate_str (g->degenerated_gate).c_str (),
93
+ g->garbage ? " garbage" : "", g->id, g->arity (),
94
+ loglit (internal, g->lhs).c_str (),
95
+ string_of_gate (g->tag).c_str ());
96
+ for (const auto &lit : g->rhs) {
97
+ printf (" %s", loglit (internal, lit).c_str ());
98
+ }
99
+ } else
100
+ printf (" null gate");
101
+ fputc ('\n', stdout);
102
+ tout.normal ();
103
+ fflush (stdout);
104
+ }
105
+
106
+ // Same as above, but for the global clause 'c' (which is not a reason).
107
+
108
+ void Logger::log (Internal *internal, const vector<int> &c, const char *fmt,
109
+ ...) {
110
+ print_log_prefix (internal);
111
+ tout.magenta ();
112
+ va_list ap;
113
+ va_start (ap, fmt);
114
+ vprintf (fmt, ap);
115
+ va_end (ap);
116
+ if (internal->opts.logsort) {
117
+ vector<int> s;
118
+ for (const auto &lit : c)
119
+ s.push_back (lit);
120
+ sort (s.begin (), s.end (), clause_lit_less_than ());
121
+ for (const auto &lit : s)
122
+ printf (" %d", lit);
123
+ } else {
124
+ for (const auto &lit : c)
125
+ printf (" %d", lit);
126
+ }
127
+ fputc ('\n', stdout);
128
+ tout.normal ();
129
+ fflush (stdout);
130
+ }
131
+
132
+ // Now for 'restore_clause' to avoid copying (without logging).
133
+
134
+ void Logger::log (Internal *internal,
135
+ const vector<int>::const_iterator &begin,
136
+ const vector<int>::const_iterator &end, const char *fmt,
137
+ ...) {
138
+ print_log_prefix (internal);
139
+ tout.magenta ();
140
+ va_list ap;
141
+ va_start (ap, fmt);
142
+ vprintf (fmt, ap);
143
+ va_end (ap);
144
+ if (internal->opts.logsort) {
145
+ vector<int> s;
146
+ for (auto p = begin; p != end; p++)
147
+ s.push_back (*p);
148
+ sort (s.begin (), s.end (), clause_lit_less_than ());
149
+ for (const auto &lit : s)
150
+ printf (" %d", lit);
151
+ } else {
152
+ for (auto p = begin; p != end; p++)
153
+ printf (" %d", *p);
154
+ }
155
+ fputc ('\n', stdout);
156
+ tout.normal ();
157
+ fflush (stdout);
158
+ }
159
+
160
+ // for LRAT proof chains
161
+
162
+ void Logger::log (Internal *internal, const vector<int64_t> &c,
163
+ const char *fmt, ...) {
164
+ print_log_prefix (internal);
165
+ tout.magenta ();
166
+ va_list ap;
167
+ va_start (ap, fmt);
168
+ vprintf (fmt, ap);
169
+ va_end (ap);
170
+ for (const auto &id : c)
171
+ printf (" %" PRId64, id);
172
+ fputc ('\n', stdout);
173
+ tout.normal ();
174
+ fflush (stdout);
175
+ }
176
+
177
+ // for LRAT proof clauses
178
+
179
+ void Logger::log (Internal *internal, const int *literals,
180
+ const unsigned size, const char *fmt, ...) {
181
+ print_log_prefix (internal);
182
+ tout.magenta ();
183
+ va_list ap;
184
+ va_start (ap, fmt);
185
+ vprintf (fmt, ap);
186
+ va_end (ap);
187
+ for (unsigned i = 0; i < size; i++) {
188
+ const int lit = literals[i];
189
+ printf (" %d", lit);
190
+ }
191
+ fputc ('\n', stdout);
192
+ tout.normal ();
193
+ fflush (stdout);
194
+ }
195
+
196
+ string Logger::loglit (Internal *internal, int lit) {
197
+ std::string v = std::to_string (lit);
198
+ if (lit && -internal->max_var <= lit && internal->max_var >= lit) {
199
+ const int va = internal->val (lit);
200
+ if (va) {
201
+ v = v + "@" + std::to_string (internal->var (lit).level);
202
+ if (!internal->var (lit).reason)
203
+ v = v + "+";
204
+ }
205
+ if (va > 0)
206
+ v += "=1";
207
+ else if (va < 0)
208
+ v += "=-1";
209
+ }
210
+ return v;
211
+ }
212
+ } // namespace CaDiCaL
213
+
214
+ #endif