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,365 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ /*------------------------------------------------------------------------*/
6
+
7
+ // This provides an implementation of variable instantiation, a technique
8
+ // for removing literals with few occurrence (see also 'instantiate.hpp').
9
+
10
+ /*------------------------------------------------------------------------*/
11
+
12
+ // Triggered at the end of a variable elimination round ('elim_round').
13
+
14
+ void Internal::collect_instantiation_candidates (
15
+ Instantiator &instantiator) {
16
+ assert (occurring ());
17
+ for (auto idx : vars) {
18
+ if (frozen (idx))
19
+ continue;
20
+ if (!active (idx))
21
+ continue;
22
+ if (flags (idx).elim)
23
+ continue; // BVE attempt pending
24
+ for (int sign = -1; sign <= 1; sign += 2) {
25
+ const int lit = sign * idx;
26
+ if (noccs (lit) > opts.instantiateocclim)
27
+ continue;
28
+ Occs &os = occs (lit);
29
+ for (const auto &c : os) {
30
+ if (c->garbage)
31
+ continue;
32
+ if (opts.instantiateonce && c->instantiated)
33
+ continue;
34
+ if (c->size < opts.instantiateclslim)
35
+ continue;
36
+ bool satisfied = false;
37
+ int unassigned = 0;
38
+ for (const auto &other : *c) {
39
+ const signed char tmp = val (other);
40
+ if (tmp > 0)
41
+ satisfied = true;
42
+ if (!tmp)
43
+ unassigned++;
44
+ }
45
+ if (satisfied)
46
+ continue;
47
+ if (unassigned < 3)
48
+ continue; // avoid learning units
49
+ size_t negoccs = occs (-lit).size ();
50
+ LOG (c,
51
+ "instantiation candidate literal %d "
52
+ "with %zu negative occurrences in",
53
+ lit, negoccs);
54
+ instantiator.candidate (lit, c, c->size, negoccs);
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ /*------------------------------------------------------------------------*/
61
+
62
+ // Specialized propagation and assignment routines for instantiation.
63
+
64
+ inline void Internal::inst_assign (int lit) {
65
+ LOG ("instantiate assign %d", lit);
66
+ assert (!val (lit));
67
+ assert ((int) num_assigned < max_var);
68
+ num_assigned++;
69
+ set_val (lit, 1);
70
+ trail.push_back (lit);
71
+ }
72
+
73
+ // Conflict analysis is only needed to do valid resolution proofs.
74
+ // We remember propagated clauses in order of assignment (in inst_chain)
75
+ // which allows us to do a variant of conflict analysis if the instantiation
76
+ // attempt succeeds.
77
+ //
78
+ bool Internal::inst_propagate () { // Adapted from 'propagate'.
79
+ START (propagate);
80
+ int64_t before = propagated;
81
+ bool ok = true;
82
+ while (ok && propagated != trail.size ()) {
83
+ const int lit = -trail[propagated++];
84
+ LOG ("instantiate propagating %d", -lit);
85
+ Watches &ws = watches (lit);
86
+ const const_watch_iterator eow = ws.end ();
87
+ const_watch_iterator i = ws.begin ();
88
+ watch_iterator j = ws.begin ();
89
+ while (i != eow) {
90
+ const Watch w = *j++ = *i++;
91
+ const signed char b = val (w.blit);
92
+ if (b > 0)
93
+ continue;
94
+ if (w.binary ()) {
95
+ if (b < 0) {
96
+ ok = false;
97
+ LOG (w.clause, "conflict");
98
+ if (lrat) {
99
+ inst_chain.push_back (w.clause);
100
+ }
101
+ break;
102
+ } else {
103
+ if (lrat) {
104
+ inst_chain.push_back (w.clause);
105
+ }
106
+ inst_assign (w.blit);
107
+ }
108
+ } else {
109
+ literal_iterator lits = w.clause->begin ();
110
+ const int other = lits[0] ^ lits[1] ^ lit;
111
+ lits[0] = other, lits[1] = lit;
112
+ const signed char u = val (other);
113
+ if (u > 0)
114
+ j[-1].blit = other;
115
+ else {
116
+ const int size = w.clause->size;
117
+ const const_literal_iterator end = lits + size;
118
+ const literal_iterator middle = lits + w.clause->pos;
119
+ literal_iterator k = middle;
120
+ signed char v = -1;
121
+ int r = 0;
122
+ while (k != end && (v = val (r = *k)) < 0)
123
+ k++;
124
+ if (v < 0) {
125
+ k = lits + 2;
126
+ assert (w.clause->pos <= size);
127
+ while (k != middle && (v = val (r = *k)) < 0)
128
+ k++;
129
+ }
130
+ w.clause->pos = k - lits;
131
+ assert (lits + 2 <= k), assert (k <= w.clause->end ());
132
+ if (v > 0) {
133
+ j[-1].blit = r;
134
+ } else if (!v) {
135
+ LOG (w.clause, "unwatch %d in", r);
136
+ lits[1] = r;
137
+ *k = lit;
138
+ watch_literal (r, lit, w.clause);
139
+ j--;
140
+ } else if (!u) {
141
+ assert (v < 0);
142
+ if (lrat) {
143
+ inst_chain.push_back (w.clause);
144
+ }
145
+ inst_assign (other);
146
+ } else {
147
+ assert (u < 0);
148
+ assert (v < 0);
149
+ if (lrat) {
150
+ inst_chain.push_back (w.clause);
151
+ }
152
+ LOG (w.clause, "conflict");
153
+ ok = false;
154
+ break;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ if (j != i) {
160
+ while (i != eow)
161
+ *j++ = *i++;
162
+ ws.resize (j - ws.begin ());
163
+ }
164
+ }
165
+ int64_t delta = propagated - before;
166
+ stats.propagations.instantiate += delta;
167
+ STOP (propagate);
168
+ return ok;
169
+ }
170
+
171
+ /*------------------------------------------------------------------------*/
172
+
173
+ // This is the instantiation attempt.
174
+
175
+ bool Internal::instantiate_candidate (int lit, Clause *c) {
176
+ stats.instried++;
177
+ if (c->garbage)
178
+ return false;
179
+ assert (!level);
180
+ bool found = false, satisfied = false, inactive = false;
181
+ int unassigned = 0;
182
+ for (const auto &other : *c) {
183
+ if (other == lit)
184
+ found = true;
185
+ const signed char tmp = val (other);
186
+ if (tmp > 0) {
187
+ satisfied = true;
188
+ break;
189
+ }
190
+ if (!tmp && !active (other)) {
191
+ inactive = true;
192
+ break;
193
+ }
194
+ if (!tmp)
195
+ unassigned++;
196
+ }
197
+ if (!found)
198
+ return false;
199
+ if (inactive)
200
+ return false;
201
+ if (satisfied)
202
+ return false;
203
+ if (unassigned < 3)
204
+ return false;
205
+ size_t before = trail.size ();
206
+ assert (propagated == before);
207
+ assert (active (lit));
208
+ assert (inst_chain.empty ());
209
+ LOG (c, "trying to instantiate %d in", lit);
210
+ assert (!c->garbage);
211
+ c->instantiated = true;
212
+ assert (lrat_chain.empty ());
213
+ level++;
214
+ inst_assign (lit); // Assume 'lit' to true.
215
+ for (const auto &other : *c) {
216
+ if (other == lit)
217
+ continue;
218
+ const signed char tmp = val (other);
219
+ if (tmp) {
220
+ assert (tmp < 0);
221
+ continue;
222
+ }
223
+ inst_assign (-other); // Assume other to false.
224
+ }
225
+ bool ok = inst_propagate (); // Propagate.
226
+ assert (lrat_chain.empty ()); // chain will be built here
227
+ if (ok) {
228
+ inst_chain.clear ();
229
+ } else if (lrat) { // analyze conflict for lrat
230
+ assert (inst_chain.size ());
231
+ Clause *reason = inst_chain.back ();
232
+ inst_chain.pop_back ();
233
+ lrat_chain.push_back (reason->id);
234
+ for (const auto &other : *reason) {
235
+ Flags &f = flags (other);
236
+ assert (!f.seen);
237
+ f.seen = true;
238
+ analyzed.push_back (other);
239
+ }
240
+ }
241
+ while (trail.size () > before) { // Backtrack.
242
+ const int other = trail.back ();
243
+ LOG ("instantiate unassign %d", other);
244
+ trail.pop_back ();
245
+ assert (val (other) > 0);
246
+ num_assigned--;
247
+ set_val (other, 0);
248
+ // this is a variant of conflict analysis which is only needed for lrat
249
+ if (!ok && inst_chain.size () && lrat) {
250
+ Flags &f = flags (other);
251
+ if (f.seen) {
252
+ Clause *reason = inst_chain.back ();
253
+ lrat_chain.push_back (reason->id);
254
+ for (const auto &other : *reason) {
255
+ Flags &f = flags (other);
256
+ if (f.seen)
257
+ continue;
258
+ f.seen = true;
259
+ analyzed.push_back (other);
260
+ }
261
+ f.seen = false;
262
+ }
263
+ inst_chain.pop_back ();
264
+ }
265
+ }
266
+ assert (inst_chain.empty ());
267
+ // post processing step for lrat
268
+ if (!ok && lrat) {
269
+ if (flags (lit).seen)
270
+ lrat_chain.push_back (c->id);
271
+ for (const auto &other : *c) {
272
+ Flags &f = flags (other);
273
+ f.seen = false;
274
+ }
275
+ for (int other : analyzed) {
276
+ Flags &f = flags (other);
277
+ if (!f.seen) {
278
+ f.seen = true;
279
+ continue;
280
+ }
281
+ int64_t id = unit_id (-other);
282
+ lrat_chain.push_back (id);
283
+ }
284
+ clear_analyzed_literals ();
285
+ reverse (lrat_chain.begin (), lrat_chain.end ());
286
+ }
287
+ assert (analyzed.empty ());
288
+ propagated = before;
289
+ assert (level == 1);
290
+ level = 0;
291
+ if (ok) {
292
+ assert (lrat_chain.empty ());
293
+ LOG ("instantiation failed");
294
+ return false;
295
+ }
296
+ unwatch_clause (c);
297
+ LOG (lrat_chain, "instantiate proof chain");
298
+ strengthen_clause (c, lit);
299
+ watch_clause (c);
300
+ lrat_chain.clear ();
301
+ assert (c->size > 1);
302
+ LOG ("instantiation succeeded");
303
+ stats.instantiated++;
304
+ return true;
305
+ }
306
+
307
+ /*------------------------------------------------------------------------*/
308
+
309
+ // Try to instantiate all candidates collected before through the
310
+ // 'collect_instantiation_candidates' routine.
311
+
312
+ void Internal::instantiate (Instantiator &instantiator) {
313
+ assert (opts.instantiate);
314
+ START (instantiate);
315
+ stats.instrounds++;
316
+ #ifndef QUIET
317
+ const int64_t candidates = instantiator.candidates.size ();
318
+ int64_t tried = 0;
319
+ #endif
320
+ int64_t instantiated = 0;
321
+ init_watches ();
322
+ connect_watches ();
323
+ if (propagated < trail.size ()) {
324
+ if (!propagate ()) {
325
+ LOG ("propagation after connecting watches failed");
326
+ learn_empty_clause ();
327
+ assert (unsat);
328
+ }
329
+ }
330
+ PHASE ("instantiate", stats.instrounds,
331
+ "attempting to instantiate %" PRId64
332
+ " candidate literal clause pairs",
333
+ candidates);
334
+ while (!unsat && !terminated_asynchronously () &&
335
+ !instantiator.candidates.empty ()) {
336
+ Instantiator::Candidate cand = instantiator.candidates.back ();
337
+ instantiator.candidates.pop_back ();
338
+ #ifndef QUIET
339
+ tried++;
340
+ #endif
341
+ if (!active (cand.lit))
342
+ continue;
343
+ LOG (cand.clause,
344
+ "trying to instantiate %d with "
345
+ "%zd negative occurrences in",
346
+ cand.lit, cand.negoccs);
347
+ if (!instantiate_candidate (cand.lit, cand.clause))
348
+ continue;
349
+ instantiated++;
350
+ VERBOSE (2,
351
+ "instantiation %" PRId64 " (%.1f%%) succeeded "
352
+ "(%.1f%%) with %zd negative occurrences in size %d clause",
353
+ tried, percent (tried, candidates),
354
+ percent (instantiated, tried), cand.negoccs, cand.size);
355
+ }
356
+ PHASE ("instantiate", stats.instrounds,
357
+ "instantiated %" PRId64 " candidate successfully "
358
+ "out of %" PRId64 " tried %.1f%%",
359
+ instantiated, tried, percent (instantiated, tried));
360
+ report ('I', !instantiated);
361
+ reset_watches ();
362
+ STOP (instantiate);
363
+ }
364
+
365
+ } // namespace CaDiCaL
@@ -0,0 +1,45 @@
1
+ #ifndef _instantiate_hpp_INCLUDED
2
+ #define _instantiate_hpp_INCLUDED
3
+
4
+ namespace CaDiCaL {
5
+
6
+ // We are trying to remove literals in clauses, which occur in few clauses
7
+ // and further restrict this removal to variables for which variable
8
+ // elimination failed. Thus if for instance we succeed in removing the
9
+ // single occurrence of a literal, pure literal elimination can
10
+ // eliminate the corresponding variable in the next variable elimination
11
+ // round. The set of such literal clause candidate pairs is collected at
12
+ // the end of a variable elimination round and tried before returning. The
13
+ // name of this technique is inspired by 'variable instantiation' as
14
+ // described in [AnderssonBjesseCookHanna-DAC'02] and apparently
15
+ // successfully used in the 'Oepir' SAT solver.
16
+
17
+ struct Clause;
18
+ struct Internal;
19
+
20
+ class Instantiator {
21
+
22
+ friend struct Internal;
23
+
24
+ struct Candidate {
25
+ int lit;
26
+ int size;
27
+ size_t negoccs;
28
+ Clause *clause;
29
+ Candidate (int l, Clause *c, int s, size_t n)
30
+ : lit (l), size (s), negoccs (n), clause (c) {}
31
+ };
32
+
33
+ vector<Candidate> candidates;
34
+
35
+ public:
36
+ void candidate (int l, Clause *c, int s, size_t n) {
37
+ candidates.push_back (Candidate (l, c, s, n));
38
+ }
39
+
40
+ operator bool () const { return !candidates.empty (); }
41
+ };
42
+
43
+ } // namespace CaDiCaL
44
+
45
+ #endif