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,65 @@
1
+ #ifndef _message_h_INCLUDED
2
+ #define _message_h_INCLUDED
3
+
4
+ /*------------------------------------------------------------------------*/
5
+
6
+ // Macros for compact message code.
7
+
8
+ #ifndef QUIET
9
+
10
+ #define LINE() \
11
+ do { \
12
+ if (internal) \
13
+ internal->message (); \
14
+ } while (0)
15
+
16
+ #define MSG(...) \
17
+ do { \
18
+ if (internal) \
19
+ internal->message (__VA_ARGS__); \
20
+ } while (0)
21
+
22
+ #define PHASE(...) \
23
+ do { \
24
+ if (internal) \
25
+ internal->phase (__VA_ARGS__); \
26
+ } while (0)
27
+
28
+ #define SECTION(...) \
29
+ do { \
30
+ if (internal) \
31
+ internal->section (__VA_ARGS__); \
32
+ } while (0)
33
+
34
+ #define VERBOSE(...) \
35
+ do { \
36
+ if (internal) \
37
+ internal->verbose (__VA_ARGS__); \
38
+ } while (0)
39
+
40
+ #else
41
+
42
+ #define LINE() \
43
+ do { \
44
+ } while (0)
45
+ #define MSG(...) \
46
+ do { \
47
+ } while (0)
48
+ #define PHASE(...) \
49
+ do { \
50
+ } while (0)
51
+ #define SECTION(...) \
52
+ do { \
53
+ } while (0)
54
+ #define VERBOSE(...) \
55
+ do { \
56
+ } while (0)
57
+
58
+ #endif
59
+
60
+ #define FATAL fatal
61
+ #define WARNING(...) internal->warning (__VA_ARGS__)
62
+
63
+ /*------------------------------------------------------------------------*/
64
+
65
+ #endif // ifndef _message_h_INCLUDED
@@ -0,0 +1,224 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ // Functions for learned clause minimization. We only have the recursive
6
+ // version, which actually really is implemented recursively. We also
7
+ // played with a derecursified version, which however was more complex and
8
+ // slower. The trick to keep potential stack exhausting recursion under
9
+ // guards is to explicitly limit the recursion depth.
10
+
11
+ // Instead of signatures as in the original implementation in MiniSAT and
12
+ // our corresponding paper, we use the 'poison' idea of Allen Van Gelder to
13
+ // mark unsuccessful removal attempts, then Donald Knuth's idea to abort
14
+ // minimization if only one literal was seen on the level and a new idea of
15
+ // also aborting if the earliest seen literal was assigned afterwards.
16
+
17
+ bool Internal::minimize_literal (int lit, int depth) {
18
+ LOG ("attempt to minimize lit %d at depth %d", lit, depth);
19
+ assert (val (lit) > 0);
20
+ Flags &f = flags (lit);
21
+ Var &v = var (lit);
22
+ if (!v.level || f.removable || f.keep)
23
+ return true;
24
+ if (!v.reason || f.poison || v.level == level)
25
+ return false;
26
+ const Level &l = control[v.level];
27
+ if (!depth && l.seen.count < 2)
28
+ return false; // Don Knuth's idea
29
+ if (v.trail <= l.seen.trail)
30
+ return false; // new early abort
31
+ if (depth > opts.minimizedepth)
32
+ return false;
33
+ bool res = true;
34
+ assert (v.reason);
35
+ if (opts.minimizeticks)
36
+ stats.ticks.search[stable]++;
37
+ if (v.reason == external_reason) {
38
+ assert (!opts.exteagerreasons);
39
+ v.reason = learn_external_reason_clause (lit, 0, true);
40
+ if (!v.reason) {
41
+ assert (!v.level);
42
+ return true;
43
+ }
44
+ }
45
+ assert (v.reason != external_reason);
46
+ const const_literal_iterator end = v.reason->end ();
47
+ const_literal_iterator i;
48
+ for (i = v.reason->begin (); res && i != end; i++) {
49
+ const int other = *i;
50
+ if (other == lit)
51
+ continue;
52
+ res = minimize_literal (-other, depth + 1);
53
+ }
54
+ if (res)
55
+ f.removable = true;
56
+ else
57
+ f.poison = true;
58
+ minimized.push_back (lit);
59
+ if (!depth) {
60
+ LOG ("minimizing %d %s", lit, res ? "succeeded" : "failed");
61
+ }
62
+ return res;
63
+ }
64
+
65
+ // Sorting the clause before minimization with respect to the trail order
66
+ // (literals with smaller trail height first) is necessary but natural and
67
+ // might help to minimize the required recursion depth too.
68
+
69
+ struct minimize_trail_positive_rank {
70
+ Internal *internal;
71
+ minimize_trail_positive_rank (Internal *s) : internal (s) {}
72
+ typedef unsigned Type;
73
+ Type operator() (const int &a) const {
74
+ assert (internal->val (a));
75
+ return (unsigned) internal->var (a).trail;
76
+ }
77
+ };
78
+
79
+ struct minimize_trail_smaller {
80
+ Internal *internal;
81
+ minimize_trail_smaller (Internal *s) : internal (s) {}
82
+ bool operator() (const int &a, const int &b) const {
83
+ return internal->var (a).trail < internal->var (b).trail;
84
+ }
85
+ };
86
+
87
+ struct minimize_trail_level_positive_rank {
88
+ Internal *internal;
89
+ minimize_trail_level_positive_rank (Internal *s) : internal (s) {}
90
+ typedef uint64_t Type;
91
+ Type operator() (const int &a) const {
92
+ assert (internal->val (a));
93
+ Var &v = internal->var (a);
94
+ uint64_t res = v.level;
95
+ res <<= 32;
96
+ res |= v.trail;
97
+ return res;
98
+ }
99
+ };
100
+
101
+ struct minimize_trail_level_smaller {
102
+ Internal *internal;
103
+ minimize_trail_level_smaller (Internal *s) : internal (s) {}
104
+ bool operator() (const int &a, const int &b) const {
105
+ return minimize_trail_level_positive_rank (internal) (a) <
106
+ minimize_trail_level_positive_rank (internal) (b);
107
+ }
108
+ };
109
+
110
+ void Internal::minimize_clause () {
111
+ START (minimize);
112
+ LOG (clause, "minimizing first UIP clause");
113
+
114
+ external->check_learned_clause (); // check 1st UIP learned clause first
115
+ minimize_sort_clause ();
116
+
117
+ assert (minimized.empty ());
118
+ assert (minimize_chain.empty ());
119
+ const auto end = clause.end ();
120
+ auto j = clause.begin (), i = j;
121
+ std::vector<int> stack;
122
+ for (; i != end; i++) {
123
+ if (minimize_literal (-*i)) {
124
+ if (lrat) {
125
+ assert (mini_chain.empty ());
126
+ calculate_minimize_chain (-*i, stack);
127
+ for (auto p : mini_chain) {
128
+ minimize_chain.push_back (p);
129
+ }
130
+ mini_chain.clear ();
131
+ }
132
+ stats.minimized++;
133
+ } else
134
+ flags (*j++ = *i).keep = true;
135
+ }
136
+ LOG ("minimized %zd literals", (size_t) (clause.end () - j));
137
+ if (j != end)
138
+ clause.resize (j - clause.begin ());
139
+ clear_minimized_literals ();
140
+ for (auto p = minimize_chain.rbegin (); p != minimize_chain.rend ();
141
+ p++) {
142
+ lrat_chain.push_back (*p);
143
+ }
144
+ minimize_chain.clear ();
145
+ STOP (minimize);
146
+ }
147
+
148
+ // go backwards in reason graph and add ids
149
+ // mini_chain is in correct order so we have to add it to minimize_chain
150
+ // and then reverse when we put it on lrat_chain
151
+ //
152
+ // We have to use the non-recursive as we cannot limit the depth like the
153
+ // minimize version. Unlike the minimize version, we have to keep literals
154
+ // on the stack in order to push its reason later.
155
+ void Internal::calculate_minimize_chain (int lit, std::vector<int> &stack) {
156
+ assert (stack.empty ());
157
+ stack.push_back (vidx (lit));
158
+
159
+ while (!stack.empty ()) {
160
+ const int idx = stack.back ();
161
+ assert (idx);
162
+ stack.pop_back ();
163
+ if (idx < 0) {
164
+ Var &v = var (idx);
165
+ mini_chain.push_back (v.reason->id);
166
+ continue;
167
+ }
168
+ assert (idx);
169
+ Flags &f = flags (idx);
170
+ Var &v = var (idx);
171
+ if (f.keep || f.added || f.poison) {
172
+ continue;
173
+ }
174
+ if (!v.level) {
175
+ if (f.seen)
176
+ continue;
177
+ f.seen = true;
178
+ unit_analyzed.push_back (idx);
179
+ const int lit = val (idx) > 0 ? idx : -idx;
180
+ int64_t id = unit_id (lit);
181
+ unit_chain.push_back (id);
182
+ continue;
183
+ }
184
+ f.added = true;
185
+ assert (v.reason && f.removable);
186
+ const const_literal_iterator end = v.reason->end ();
187
+ const_literal_iterator i;
188
+ LOG (v.reason, "LRAT chain for lit %d at depth %zd by going over", lit,
189
+ stack.size ());
190
+ stack.push_back (-idx);
191
+ for (i = v.reason->begin (); i != end; i++) {
192
+ const int other = *i;
193
+ if (other == idx)
194
+ continue;
195
+ stack.push_back (vidx (other));
196
+ }
197
+ }
198
+ assert (stack.empty ());
199
+ }
200
+
201
+ // Sort the literals in reverse assignment order (thus trail order) to
202
+ // establish the base case of the recursive minimization algorithm in the
203
+ // positive case (where a literal with 'keep' true is hit).
204
+ //
205
+ void Internal::minimize_sort_clause () {
206
+ MSORT (opts.radixsortlim, clause.begin (), clause.end (),
207
+ minimize_trail_positive_rank (this),
208
+ minimize_trail_smaller (this));
209
+ }
210
+
211
+ void Internal::clear_minimized_literals () {
212
+ LOG ("clearing %zd minimized literals", minimized.size ());
213
+ for (const auto &lit : minimized) {
214
+ Flags &f = flags (lit);
215
+ f.poison = f.removable = f.shrinkable = f.added = false;
216
+ }
217
+ for (const auto &lit : clause)
218
+ assert (!flags (lit).shrinkable), flags (lit).keep =
219
+ flags (lit).shrinkable =
220
+ flags (lit).added = false;
221
+ minimized.clear ();
222
+ }
223
+
224
+ } // namespace CaDiCaL