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,566 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ /*------------------------------------------------------------------------*/
6
+
7
+ IdrupTracer::IdrupTracer (Internal *i, File *f, bool b)
8
+ : internal (i), file (f), binary (b), num_clauses (0), size_clauses (0),
9
+ clauses (0), last_hash (0), last_id (0), last_clause (0)
10
+ #ifndef QUIET
11
+ ,
12
+ added (0), deleted (0)
13
+ #endif
14
+ {
15
+ (void) internal;
16
+
17
+ // Initialize random number table for hash function.
18
+ //
19
+ Random random (42);
20
+ for (unsigned n = 0; n < num_nonces; n++) {
21
+ uint64_t nonce = random.next ();
22
+ if (!(nonce & 1))
23
+ nonce++;
24
+ assert (nonce), assert (nonce & 1);
25
+ nonces[n] = nonce;
26
+ }
27
+ #ifndef NDEBUG
28
+ binary = b;
29
+ #else
30
+ (void) b;
31
+ #endif
32
+ piping = file->piping ();
33
+ }
34
+
35
+ void IdrupTracer::connect_internal (Internal *i) {
36
+ internal = i;
37
+ file->connect_internal (internal);
38
+ LOG ("IDRUP TRACER connected to internal");
39
+ }
40
+
41
+ IdrupTracer::~IdrupTracer () {
42
+ LOG ("IDRUP TRACER delete");
43
+ delete file;
44
+ for (size_t i = 0; i < size_clauses; i++)
45
+ for (IdrupClause *c = clauses[i], *next; c; c = next)
46
+ next = c->next, delete_clause (c);
47
+ delete[] clauses;
48
+ }
49
+
50
+ /*------------------------------------------------------------------------*/
51
+
52
+ void IdrupTracer::enlarge_clauses () {
53
+ assert (num_clauses == size_clauses);
54
+ const uint64_t new_size_clauses = size_clauses ? 2 * size_clauses : 1;
55
+ LOG ("IDRUP Tracer enlarging clauses of tracer from %" PRIu64
56
+ " to %" PRIu64,
57
+ (uint64_t) size_clauses, (uint64_t) new_size_clauses);
58
+ IdrupClause **new_clauses;
59
+ new_clauses = new IdrupClause *[new_size_clauses];
60
+ clear_n (new_clauses, new_size_clauses);
61
+ for (uint64_t i = 0; i < size_clauses; i++) {
62
+ for (IdrupClause *c = clauses[i], *next; c; c = next) {
63
+ next = c->next;
64
+ const uint64_t h = reduce_hash (c->hash, new_size_clauses);
65
+ c->next = new_clauses[h];
66
+ new_clauses[h] = c;
67
+ }
68
+ }
69
+ delete[] clauses;
70
+ clauses = new_clauses;
71
+ size_clauses = new_size_clauses;
72
+ }
73
+
74
+ IdrupClause *IdrupTracer::new_clause () {
75
+ const size_t size = imported_clause.size ();
76
+ assert (size <= UINT_MAX);
77
+ const int off = size ? -1 : 0;
78
+ const size_t bytes = sizeof (IdrupClause) + (size - off) * sizeof (int);
79
+ IdrupClause *res = (IdrupClause *) new char[bytes];
80
+ res->next = 0;
81
+ res->hash = last_hash;
82
+ res->id = last_id;
83
+ res->size = size;
84
+ int *literals = res->literals, *p = literals;
85
+ for (const auto &lit : imported_clause) {
86
+ *p++ = lit;
87
+ }
88
+ last_clause = res;
89
+ num_clauses++;
90
+ return res;
91
+ }
92
+
93
+ void IdrupTracer::delete_clause (IdrupClause *c) {
94
+ assert (c);
95
+ num_clauses--;
96
+ delete[] (char *) c;
97
+ }
98
+
99
+ uint64_t IdrupTracer::reduce_hash (uint64_t hash, uint64_t size) {
100
+ assert (size > 0);
101
+ unsigned shift = 32;
102
+ uint64_t res = hash;
103
+ while ((((uint64_t) 1) << shift) > size) {
104
+ res ^= res >> shift;
105
+ shift >>= 1;
106
+ }
107
+ res &= size - 1;
108
+ assert (res < size);
109
+ return res;
110
+ }
111
+
112
+ uint64_t IdrupTracer::compute_hash (const int64_t id) {
113
+ assert (id > 0);
114
+ unsigned j = id % num_nonces;
115
+ uint64_t tmp = nonces[j] * (uint64_t) id;
116
+ return last_hash = tmp;
117
+ }
118
+
119
+ bool IdrupTracer::find_and_delete (const int64_t id) {
120
+ if (!num_clauses)
121
+ return false;
122
+ IdrupClause **res = 0, *c;
123
+ const uint64_t hash = compute_hash (id);
124
+ const uint64_t h = reduce_hash (hash, size_clauses);
125
+ for (res = clauses + h; (c = *res); res = &c->next) {
126
+ if (c->hash == hash && c->id == id) {
127
+ break;
128
+ }
129
+ if (!c->next)
130
+ return false;
131
+ }
132
+ if (!c)
133
+ return false;
134
+ assert (c && res);
135
+ *res = c->next;
136
+ int *begin = c->literals;
137
+ for (size_t i = 0; i < c->size; i++) {
138
+ imported_clause.push_back (begin[i]);
139
+ }
140
+ delete_clause (c);
141
+ return true;
142
+ }
143
+
144
+ void IdrupTracer::insert () {
145
+ if (num_clauses == size_clauses)
146
+ enlarge_clauses ();
147
+ const uint64_t h = reduce_hash (compute_hash (last_id), size_clauses);
148
+ IdrupClause *c = new_clause ();
149
+ c->next = clauses[h];
150
+ clauses[h] = c;
151
+ }
152
+
153
+ /*------------------------------------------------------------------------*/
154
+
155
+ inline void IdrupTracer::flush_if_piping () {
156
+ if (piping)
157
+ file->flush ();
158
+ }
159
+
160
+ inline void IdrupTracer::put_binary_zero () {
161
+ assert (binary);
162
+ assert (file);
163
+ file->put ((unsigned char) 0);
164
+ }
165
+
166
+ inline void IdrupTracer::put_binary_lit (int lit) {
167
+ assert (binary);
168
+ assert (file);
169
+ assert (lit != INT_MIN);
170
+ unsigned x = 2 * abs (lit) + (lit < 0);
171
+ unsigned char ch;
172
+ while (x & ~0x7f) {
173
+ ch = (x & 0x7f) | 0x80;
174
+ file->put (ch);
175
+ x >>= 7;
176
+ }
177
+ ch = x;
178
+ file->put (ch);
179
+ }
180
+
181
+ inline void IdrupTracer::put_binary_id (int64_t id, bool can_be_negative) {
182
+ assert (binary);
183
+ assert (file);
184
+ uint64_t x = abs (id);
185
+ if (can_be_negative) {
186
+ x = 2 * x + (id < 0);
187
+ }
188
+ unsigned char ch;
189
+ while (x & ~0x7f) {
190
+ ch = (x & 0x7f) | 0x80;
191
+ file->put (ch);
192
+ x >>= 7;
193
+ }
194
+ ch = x;
195
+ file->put (ch);
196
+ }
197
+
198
+ /*------------------------------------------------------------------------*/
199
+
200
+ void IdrupTracer::idrup_add_restored_clause (const vector<int> &clause) {
201
+ if (binary)
202
+ file->put ('r');
203
+ else
204
+ file->put ("r ");
205
+ for (const auto &external_lit : clause)
206
+ if (binary)
207
+ put_binary_lit (external_lit);
208
+ else
209
+ file->put (external_lit), file->put (' ');
210
+ if (binary)
211
+ put_binary_zero ();
212
+ else
213
+ file->put ("0\n");
214
+ // flush_if_piping ();
215
+ }
216
+
217
+ void IdrupTracer::idrup_add_derived_clause (const vector<int> &clause) {
218
+ if (binary)
219
+ file->put ('l');
220
+ else
221
+ file->put ("l ");
222
+ for (const auto &external_lit : clause)
223
+ if (binary)
224
+ put_binary_lit (external_lit);
225
+ else
226
+ file->put (external_lit), file->put (' ');
227
+ if (binary)
228
+ put_binary_zero ();
229
+ else
230
+ file->put ("0\n");
231
+ // flush_if_piping ();
232
+ }
233
+
234
+ void IdrupTracer::idrup_add_original_clause (const vector<int> &clause) {
235
+ if (binary)
236
+ file->put ('i');
237
+ else
238
+ file->put ("i ");
239
+ for (const auto &external_lit : clause)
240
+ if (binary)
241
+ put_binary_lit (external_lit);
242
+ else
243
+ file->put (external_lit), file->put (' ');
244
+ if (binary)
245
+ put_binary_zero ();
246
+ else
247
+ file->put ("0\n");
248
+ // flush_if_piping ();
249
+ }
250
+
251
+ void IdrupTracer::idrup_delete_clause (int64_t id,
252
+ const vector<int> &clause) {
253
+ if (find_and_delete (id)) {
254
+ assert (imported_clause.empty ());
255
+ if (binary)
256
+ file->put ('w');
257
+ else
258
+ file->put ("w ");
259
+ #ifndef QUIET
260
+ weakened++;
261
+ #endif
262
+ } else {
263
+ if (binary)
264
+ file->put ('d');
265
+ else
266
+ file->put ("d ");
267
+ #ifndef QUIET
268
+ deleted++;
269
+ #endif
270
+ }
271
+ for (const auto &external_lit : clause)
272
+ if (binary)
273
+ put_binary_lit (external_lit);
274
+ else
275
+ file->put (external_lit), file->put (' ');
276
+ if (binary)
277
+ put_binary_zero ();
278
+ else
279
+ file->put ("0\n");
280
+ // flush_if_piping ();
281
+ }
282
+
283
+ void IdrupTracer::idrup_conclude_and_delete (
284
+ const vector<int64_t> &conclusion) {
285
+ uint64_t size = conclusion.size ();
286
+ if (size > 1) {
287
+ if (binary) {
288
+ file->put ('U');
289
+ put_binary_id (size);
290
+ } else {
291
+ file->put ("U ");
292
+ file->put (size), file->put ("\n");
293
+ }
294
+ }
295
+ for (auto &id : conclusion) {
296
+ if (binary)
297
+ file->put ('u');
298
+ else
299
+ file->put ("u ");
300
+ (void) find_and_delete (id);
301
+ for (const auto &external_lit : imported_clause) {
302
+ // flip sign...
303
+ const auto not_elit = -external_lit;
304
+ if (binary)
305
+ put_binary_lit (not_elit);
306
+ else
307
+ file->put (not_elit), file->put (' ');
308
+ }
309
+ if (binary)
310
+ put_binary_zero ();
311
+ else
312
+ file->put ("0\n");
313
+ imported_clause.clear ();
314
+ }
315
+ flush_if_piping ();
316
+ }
317
+
318
+ void IdrupTracer::idrup_report_status (int status) {
319
+ if (binary)
320
+ file->put ('s');
321
+ else
322
+ file->put ("s ");
323
+ if (status == SATISFIABLE)
324
+ file->put ("SATISFIABLE");
325
+ else if (status == UNSATISFIABLE)
326
+ file->put ("UNSATISFIABLE");
327
+ else
328
+ file->put ("UNKNOWN");
329
+ if (!binary)
330
+ file->put ("\n");
331
+ flush_if_piping ();
332
+ }
333
+
334
+ void IdrupTracer::idrup_conclude_sat (const vector<int> &model) {
335
+ if (binary)
336
+ file->put ('m');
337
+ else
338
+ file->put ("m ");
339
+ for (auto &lit : model) {
340
+ if (binary)
341
+ put_binary_lit (lit);
342
+ else
343
+ file->put (lit), file->put (' ');
344
+ }
345
+ if (binary)
346
+ put_binary_zero ();
347
+ else
348
+ file->put ("0\n");
349
+ flush_if_piping ();
350
+ }
351
+
352
+ void IdrupTracer::idrup_conclude_unknown (const vector<int> &trail) {
353
+ if (binary)
354
+ file->put ('e');
355
+ else
356
+ file->put ("e ");
357
+ for (auto &lit : trail) {
358
+ if (binary)
359
+ put_binary_lit (lit);
360
+ else
361
+ file->put (lit), file->put (' ');
362
+ }
363
+ if (binary)
364
+ put_binary_zero ();
365
+ else
366
+ file->put ("0\n");
367
+ flush_if_piping ();
368
+ }
369
+
370
+ void IdrupTracer::idrup_solve_query () {
371
+ if (binary)
372
+ file->put ('q');
373
+ else
374
+ file->put ("q ");
375
+ for (auto &lit : assumptions) {
376
+ if (binary)
377
+ put_binary_lit (lit);
378
+ else
379
+ file->put (lit), file->put (' ');
380
+ }
381
+ if (binary)
382
+ put_binary_zero ();
383
+ else
384
+ file->put ("0\n");
385
+ flush_if_piping ();
386
+ }
387
+
388
+ /*------------------------------------------------------------------------*/
389
+
390
+ void IdrupTracer::add_derived_clause (int64_t, bool, int,
391
+ const vector<int> &clause,
392
+ const vector<int64_t> &) {
393
+ if (file->closed ())
394
+ return;
395
+ assert (imported_clause.empty ());
396
+ LOG (clause, "IDRUP TRACER tracing addition of derived clause");
397
+ idrup_add_derived_clause (clause);
398
+ #ifndef QUIET
399
+ added++;
400
+ #endif
401
+ }
402
+
403
+ void IdrupTracer::add_assumption_clause (int64_t id,
404
+ const vector<int> &clause,
405
+ const vector<int64_t> &) {
406
+ if (file->closed ())
407
+ return;
408
+ assert (imported_clause.empty ());
409
+ LOG (clause, "IDRUP TRACER tracing addition of assumption clause");
410
+ for (auto &lit : clause)
411
+ imported_clause.push_back (lit);
412
+ last_id = id;
413
+ insert ();
414
+ imported_clause.clear ();
415
+ }
416
+
417
+ void IdrupTracer::delete_clause (int64_t id, bool,
418
+ const vector<int> &clause) {
419
+ if (file->closed ())
420
+ return;
421
+ assert (imported_clause.empty ());
422
+ LOG ("IDRUP TRACER tracing deletion of clause[%" PRId64 "]", id);
423
+ idrup_delete_clause (id, clause);
424
+ }
425
+
426
+ void IdrupTracer::weaken_minus (int64_t id, const vector<int> &) {
427
+ if (file->closed ())
428
+ return;
429
+ assert (imported_clause.empty ());
430
+ LOG ("IDRUP TRACER tracing weaken minus of clause[%" PRId64 "]", id);
431
+ last_id = id;
432
+ insert ();
433
+ #ifndef QUIET
434
+ weakened++;
435
+ #endif
436
+ }
437
+
438
+ void IdrupTracer::conclude_unsat (ConclusionType,
439
+ const vector<int64_t> &conclusion) {
440
+ if (file->closed ())
441
+ return;
442
+ assert (imported_clause.empty ());
443
+ LOG (conclusion, "IDRUP TRACER tracing conclusion of clause(s)");
444
+ idrup_conclude_and_delete (conclusion);
445
+ }
446
+
447
+ void IdrupTracer::add_original_clause (int64_t id, bool,
448
+ const vector<int> &clause,
449
+ bool restored) {
450
+ if (file->closed ())
451
+ return;
452
+ if (!restored) {
453
+ LOG (clause, "IDRUP TRACER tracing addition of original clause");
454
+ #ifndef QUIET
455
+ original++;
456
+ #endif
457
+ return idrup_add_original_clause (clause);
458
+ }
459
+ assert (restored);
460
+ if (find_and_delete (id)) {
461
+ LOG (clause,
462
+ "IDRUP TRACER the clause was not yet weakened, so no restore");
463
+ return;
464
+ }
465
+ LOG (clause, "IDRUP TRACER tracing addition of restored clause");
466
+ idrup_add_restored_clause (clause);
467
+ #ifndef QUIET
468
+ restore++;
469
+ #endif
470
+ }
471
+
472
+ void IdrupTracer::report_status (int status, int64_t) {
473
+ if (file->closed ())
474
+ return;
475
+ LOG ("IDRUP TRACER tracing report of status %d", status);
476
+ idrup_report_status (status);
477
+ }
478
+
479
+ void IdrupTracer::conclude_sat (const vector<int> &model) {
480
+ if (file->closed ())
481
+ return;
482
+ LOG (model, "IDRUP TRACER tracing conclusion of model");
483
+ idrup_conclude_sat (model);
484
+ }
485
+
486
+ void IdrupTracer::conclude_unknown (const vector<int> &trail) {
487
+ if (file->closed ())
488
+ return;
489
+ LOG (trail, "IDRUP TRACER tracing conclusion of unknown state");
490
+ idrup_conclude_unknown (trail);
491
+ }
492
+
493
+ void IdrupTracer::solve_query () {
494
+ if (file->closed ())
495
+ return;
496
+ LOG (assumptions, "IDRUP TRACER tracing solve query with assumptions");
497
+ idrup_solve_query ();
498
+ #ifndef QUIET
499
+ solved++;
500
+ #endif
501
+ }
502
+
503
+ void IdrupTracer::add_assumption (int lit) {
504
+ LOG ("IDRUP TRACER tracing addition of assumption %d", lit);
505
+ assumptions.push_back (lit);
506
+ }
507
+
508
+ void IdrupTracer::reset_assumptions () {
509
+ LOG (assumptions, "IDRUP TRACER tracing reset of assumptions");
510
+ assumptions.clear ();
511
+ }
512
+
513
+ /*------------------------------------------------------------------------*/
514
+
515
+ bool IdrupTracer::closed () { return file->closed (); }
516
+
517
+ #ifndef QUIET
518
+
519
+ void IdrupTracer::print_statistics () {
520
+ // TODO complete this.
521
+ uint64_t bytes = file->bytes ();
522
+ uint64_t total = added + deleted + weakened + restore + original;
523
+ MSG ("LIDRUP %" PRId64 " original clauses %.2f%%", original,
524
+ percent (original, total));
525
+ MSG ("LIDRUP %" PRId64 " learned clauses %.2f%%", added,
526
+ percent (added, total));
527
+ MSG ("LIDRUP %" PRId64 " deleted clauses %.2f%%", deleted,
528
+ percent (deleted, total));
529
+ MSG ("LIDRUP %" PRId64 " weakened clauses %.2f%%", weakened,
530
+ percent (weakened, total));
531
+ MSG ("LIDRUP %" PRId64 " restored clauses %.2f%%", restore,
532
+ percent (restore, total));
533
+ MSG ("LIDRUP %" PRId64 " queries %.2f", solved, relative (solved, total));
534
+ MSG ("IDRUP %" PRId64 " bytes (%.2f MB)", bytes,
535
+ bytes / (double) (1 << 20));
536
+ }
537
+
538
+ #endif
539
+
540
+ void IdrupTracer::close (bool print) {
541
+ assert (!closed ());
542
+ file->close ();
543
+ #ifndef QUIET
544
+ if (print) {
545
+ MSG ("IDRUP proof file '%s' closed", file->name ());
546
+ print_statistics ();
547
+ }
548
+ #else
549
+ (void) print;
550
+ #endif
551
+ }
552
+
553
+ void IdrupTracer::flush (bool print) {
554
+ assert (!closed ());
555
+ file->flush ();
556
+ #ifndef QUIET
557
+ if (print) {
558
+ MSG ("IDRUP proof file '%s' flushed", file->name ());
559
+ print_statistics ();
560
+ }
561
+ #else
562
+ (void) print;
563
+ #endif
564
+ }
565
+
566
+ } // namespace CaDiCaL
@@ -0,0 +1,112 @@
1
+ #ifndef _idruptracer_h_INCLUDED
2
+ #define _idruptracer_h_INCLUDED
3
+
4
+ #include "file.hpp"
5
+ #include "tracer.hpp"
6
+
7
+ namespace CaDiCaL {
8
+
9
+ struct IdrupClause {
10
+ IdrupClause *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
+ unsigned size;
14
+ int literals[1];
15
+ };
16
+
17
+ class IdrupTracer : 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
+ IdrupClause **clauses; // hash table of clauses
29
+ std::vector<int> imported_clause;
30
+ std::vector<int> assumptions;
31
+
32
+ static const unsigned num_nonces = 4;
33
+
34
+ uint64_t nonces[num_nonces]; // random numbers for hashing
35
+ uint64_t last_hash; // last computed hash value of clause
36
+ int64_t last_id; // id of the last added clause
37
+ IdrupClause *last_clause;
38
+ uint64_t compute_hash (int64_t); // compute and save hash value of clause
39
+
40
+ IdrupClause *new_clause ();
41
+ void delete_clause (IdrupClause *);
42
+
43
+ static uint64_t reduce_hash (uint64_t hash, uint64_t size);
44
+
45
+ void enlarge_clauses (); // enlarge hash table for clauses
46
+ void insert (); // insert clause in hash table
47
+ bool
48
+ find_and_delete (const int64_t); // find clause position in hash table
49
+
50
+ #ifndef QUIET
51
+ int64_t added, deleted, weakened, restore, original, solved;
52
+ #endif
53
+
54
+ void flush_if_piping ();
55
+
56
+ void put_binary_zero ();
57
+ void put_binary_lit (int external_lit);
58
+ void put_binary_id (int64_t id, bool = false);
59
+
60
+ void idrup_add_derived_clause (const std::vector<int> &clause);
61
+ void idrup_delete_clause (int64_t id, const std::vector<int> &clause);
62
+ void idrup_add_restored_clause (const std::vector<int> &clause);
63
+ void idrup_add_original_clause (const std::vector<int> &clause);
64
+ void idrup_conclude_and_delete (const std::vector<int64_t> &conclusion);
65
+ void idrup_report_status (int status);
66
+ void idrup_conclude_sat (const std::vector<int> &model);
67
+ void idrup_conclude_unknown (const std::vector<int> &trail);
68
+ void idrup_solve_query ();
69
+
70
+ public:
71
+ IdrupTracer (Internal *, File *file, bool);
72
+ ~IdrupTracer ();
73
+
74
+ // proof section:
75
+ void add_derived_clause (int64_t, bool, int, const std::vector<int> &,
76
+ const std::vector<int64_t> &) override;
77
+ void add_assumption_clause (int64_t, const std::vector<int> &,
78
+ const std::vector<int64_t> &) override;
79
+ void weaken_minus (int64_t, const std::vector<int> &) override;
80
+ void delete_clause (int64_t, bool, const std::vector<int> &) override;
81
+ void add_original_clause (int64_t, bool, const std::vector<int> &,
82
+ bool = false) override;
83
+ void report_status (int, int64_t) override;
84
+ void conclude_sat (const std::vector<int> &) override;
85
+ void conclude_unsat (ConclusionType,
86
+ const std::vector<int64_t> &) override;
87
+ void conclude_unknown (const std::vector<int> &) override;
88
+
89
+ void solve_query () override;
90
+ void add_assumption (int) override;
91
+ void reset_assumptions () override;
92
+
93
+ // skip
94
+ void begin_proof (int64_t) override {}
95
+ void finalize_clause (int64_t, const std::vector<int> &) override {}
96
+ void strengthen (int64_t) override {}
97
+ void add_constraint (const std::vector<int> &) override {}
98
+
99
+ // logging and file io
100
+ void connect_internal (Internal *i) override;
101
+
102
+ #ifndef QUIET
103
+ void print_statistics ();
104
+ #endif
105
+ bool closed () override;
106
+ void close (bool) override;
107
+ void flush (bool) override;
108
+ };
109
+
110
+ } // namespace CaDiCaL
111
+
112
+ #endif