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,177 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ // The global assignment stack can only be (partially) reset through
6
+ // 'backtrack' which is the only function using 'unassign' (inlined and thus
7
+ // local to this file). It turns out that 'unassign' does not need a
8
+ // specialization for 'probe' nor 'vivify' and thus it is shared.
9
+
10
+ inline void Internal::unassign (int lit) {
11
+ assert (val (lit) > 0);
12
+ set_val (lit, 0);
13
+
14
+ int idx = vidx (lit);
15
+ LOG ("unassign %d @ %d", lit, var (idx).level);
16
+ num_assigned--;
17
+
18
+ // In the standard EVSIDS variable decision heuristic of MiniSAT, we need
19
+ // to push variables which become unassigned back to the heap.
20
+ //
21
+ if (!scores.contains (idx))
22
+ scores.push_back (idx);
23
+
24
+ // For VMTF we need to update the 'queue.unassigned' pointer in case this
25
+ // variable sits after the variable to which 'queue.unassigned' currently
26
+ // points. See our SAT'15 paper for more details on this aspect.
27
+ //
28
+ if (queue.bumped < btab[idx])
29
+ update_queue_unassigned (idx);
30
+ }
31
+
32
+ /*------------------------------------------------------------------------*/
33
+
34
+ // Update the current target maximum assignment and also the very best
35
+ // assignment. Whether a trail produces a conflict is determined during
36
+ // propagation. Thus that all functions in the 'search' loop after
37
+ // propagation can assume that 'no_conflict_until' is valid. If a conflict
38
+ // is found then the trail before the last decision is used (see the end of
39
+ // 'propagate'). During backtracking we can then save this largest
40
+ // propagation conflict free assignment. It is saved as both 'target'
41
+ // assignment for picking decisions in 'stable' mode and if it is the
42
+ // largest ever such assignment also as 'best' assignment. This 'best'
43
+ // assignment can then be used in future stable decisions after the next
44
+ // 'rephase_best' overwrites saved phases with it.
45
+
46
+ void Internal::update_target_and_best () {
47
+
48
+ if (opts.rephase == 2 && !stable)
49
+ return;
50
+
51
+ bool reset = (rephased && stats.conflicts > last.rephase.conflicts);
52
+
53
+ if (reset) {
54
+ target_assigned = 0;
55
+ if (rephased == 'B')
56
+ best_assigned = 0; // update it again
57
+ }
58
+
59
+ if (no_conflict_until > target_assigned) {
60
+ copy_phases (phases.target);
61
+ target_assigned = no_conflict_until;
62
+ LOG ("new target trail level %zu", target_assigned);
63
+ }
64
+
65
+ if (no_conflict_until > best_assigned) {
66
+ copy_phases (phases.best);
67
+ best_assigned = no_conflict_until;
68
+ LOG ("new best trail level %zu", best_assigned);
69
+ }
70
+
71
+ if (reset) {
72
+ report (rephased);
73
+ rephased = 0;
74
+ }
75
+ }
76
+
77
+ /*------------------------------------------------------------------------*/
78
+
79
+ void Internal::backtrack (int new_level) {
80
+ assert (new_level <= level);
81
+ if (new_level == level)
82
+ return;
83
+
84
+ update_target_and_best ();
85
+ backtrack_without_updating_phases (new_level);
86
+ }
87
+
88
+ void Internal::backtrack_without_updating_phases (int new_level) {
89
+
90
+ assert (new_level <= level);
91
+ if (new_level == level)
92
+ return;
93
+
94
+ stats.backtracks++;
95
+
96
+ assert (num_assigned == trail.size ());
97
+
98
+ const size_t assigned = control[new_level + 1].trail;
99
+
100
+ LOG ("backtracking to decision level %d with decision %d and trail %zd",
101
+ new_level, control[new_level].decision, assigned);
102
+
103
+ const size_t end_of_trail = trail.size ();
104
+ size_t i = assigned, j = i;
105
+
106
+ #ifdef LOGGING
107
+ int unassigned = 0;
108
+ #endif
109
+ int reassigned = 0;
110
+
111
+ notify_backtrack (new_level);
112
+ if (external_prop && !external_prop_is_lazy && !private_steps &&
113
+ notified > assigned) {
114
+ LOG ("external propagator is notified about some unassignments (trail: "
115
+ "%zd, notified: %zd).",
116
+ trail.size (), notified);
117
+ notified = assigned;
118
+ }
119
+
120
+ while (i < end_of_trail) {
121
+ int lit = trail[i++];
122
+ Var &v = var (lit);
123
+ if (v.level > new_level) {
124
+ unassign (lit);
125
+ #ifdef LOGGING
126
+ unassigned++;
127
+ #endif
128
+ } else {
129
+ // This is the essence of the SAT'18 paper on chronological
130
+ // backtracking. It is possible to just keep out-of-order assigned
131
+ // literals on the trail without breaking the solver (after some
132
+ // modifications to 'analyze' - see 'opts.chrono' guarded code there).
133
+ assert ((in_mode (BACKBONE)) || opts.chrono || external_prop ||
134
+ did_external_prop);
135
+ #ifdef LOGGING
136
+ if (!v.level)
137
+ LOG ("reassign %d @ 0 unit clause %d", lit, lit);
138
+ else
139
+ LOG (v.reason, "reassign %d @ %d", lit, v.level);
140
+ #endif
141
+ trail[j] = lit;
142
+ v.trail = j++;
143
+ reassigned++;
144
+ }
145
+ }
146
+ trail.resize (j);
147
+ LOG ("unassigned %d literals %.0f%%", unassigned,
148
+ percent (unassigned, unassigned + reassigned));
149
+ LOG ("reassigned %d literals %.0f%%", reassigned,
150
+ percent (reassigned, unassigned + reassigned));
151
+
152
+ if (propagated > assigned)
153
+ propagated = assigned;
154
+ if (propagated2 > assigned)
155
+ propagated2 = assigned;
156
+ if (no_conflict_until > assigned)
157
+ no_conflict_until = assigned;
158
+
159
+ propergated = 0; // Always go back to root-level.
160
+
161
+ assert (notified <= assigned + reassigned);
162
+ if (reassigned) {
163
+ notify_assignments ();
164
+ }
165
+
166
+ control.resize (new_level + 1);
167
+ level = new_level;
168
+ if (changed_val) {
169
+ assert (opts.ilb);
170
+ if (!val (changed_val)) {
171
+ changed_val = 0;
172
+ }
173
+ }
174
+ assert (num_assigned == trail.size ());
175
+ }
176
+
177
+ } // namespace CaDiCaL
@@ -0,0 +1,231 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ /*------------------------------------------------------------------------*/
6
+
7
+ // Provide eager backward subsumption for resolved clauses.
8
+
9
+ // The eliminator maintains a queue of clauses that are new and have to be
10
+ // checked to subsume or strengthen other (longer or same size) clauses.
11
+
12
+ void Eliminator::enqueue (Clause *c) {
13
+ if (!internal->opts.elimbackward)
14
+ return;
15
+ if (c->enqueued)
16
+ return;
17
+ LOG (c, "backward enqueue");
18
+ backward.push (c);
19
+ c->enqueued = true;
20
+ }
21
+
22
+ Clause *Eliminator::dequeue () {
23
+ if (backward.empty ())
24
+ return 0;
25
+ Clause *res = backward.front ();
26
+ backward.pop ();
27
+ assert (res->enqueued);
28
+ res->enqueued = false;
29
+ LOG (res, "backward dequeue");
30
+ return res;
31
+ }
32
+
33
+ Eliminator::~Eliminator () {
34
+ while (dequeue ())
35
+ ;
36
+ }
37
+
38
+ /*------------------------------------------------------------------------*/
39
+
40
+ void Internal::elim_backward_clause (Eliminator &eliminator, Clause *c) {
41
+ assert (opts.elimbackward);
42
+ assert (!c->redundant);
43
+ if (c->garbage)
44
+ return;
45
+ LOG (c, "attempting backward subsumption and strengthening with");
46
+ size_t len = UINT_MAX;
47
+ unsigned size = 0;
48
+ int best = 0;
49
+ bool satisfied = false;
50
+ assert (mini_chain.empty ());
51
+ for (const auto &lit : *c) {
52
+ const signed char tmp = val (lit);
53
+ if (tmp > 0) {
54
+ satisfied = true;
55
+ break;
56
+ }
57
+ if (tmp < 0)
58
+ continue;
59
+ size_t l = occs (lit).size ();
60
+ LOG ("literal %d occurs %zd times", lit, l);
61
+ if (l < len)
62
+ best = lit, len = l;
63
+ mark (lit);
64
+ size++;
65
+ }
66
+ if (satisfied) {
67
+ LOG ("clause actually already satisfied");
68
+ elim_update_removed_clause (eliminator, c);
69
+ mark_garbage (c);
70
+ } else if (len > (size_t) opts.elimocclim) {
71
+ LOG ("skipping backward subsumption due to too many occurrences");
72
+ } else {
73
+ assert (len);
74
+ LOG ("literal %d has smallest number of occurrences %zd", best, len);
75
+ LOG ("marked %d literals in clause of size %d", size, c->size);
76
+ for (auto &d : occs (best)) {
77
+ if (d == c)
78
+ continue;
79
+ if (d->garbage)
80
+ continue;
81
+ if ((unsigned) d->size < size)
82
+ continue;
83
+ int negated = 0;
84
+ unsigned found = 0;
85
+ satisfied = false;
86
+ for (const auto &lit : *d) {
87
+ signed char tmp = val (lit);
88
+ if (tmp > 0) {
89
+ satisfied = true;
90
+ break;
91
+ }
92
+ if (tmp < 0)
93
+ continue;
94
+ tmp = marked (lit);
95
+ if (!tmp)
96
+ continue;
97
+ if (tmp < 0) {
98
+ if (negated) {
99
+ size = UINT_MAX;
100
+ break;
101
+ } else
102
+ negated = lit;
103
+ }
104
+ if (++found == size)
105
+ break;
106
+ }
107
+ if (satisfied) {
108
+ LOG (d, "found satisfied clause");
109
+ elim_update_removed_clause (eliminator, d);
110
+ mark_garbage (d);
111
+ } else if (found == size) {
112
+ if (!negated) {
113
+ LOG (d, "found subsumed clause");
114
+ elim_update_removed_clause (eliminator, d);
115
+ mark_garbage (d);
116
+ stats.subsumed++;
117
+ stats.elimbwsub++;
118
+ } else {
119
+ int unit = 0;
120
+ assert (minimize_chain.empty ());
121
+ assert (analyzed.empty ());
122
+ assert (lrat_chain.empty ());
123
+ // figure out wether we strengthen c or get a new unit
124
+ for (const auto &lit : *d) {
125
+ const signed char tmp = val (lit);
126
+ if (tmp < 0) {
127
+ if (!lrat)
128
+ continue;
129
+ Flags &f = flags (lit);
130
+ assert (!f.seen);
131
+ if (f.seen)
132
+ continue;
133
+ f.seen = true;
134
+ analyzed.push_back (lit);
135
+ continue;
136
+ }
137
+ if (tmp > 0) {
138
+ satisfied = true;
139
+ break;
140
+ }
141
+ if (lit == negated)
142
+ continue;
143
+ if (unit) {
144
+ unit = INT_MIN;
145
+ continue; // needed to guarantee d is not satsified
146
+ } else
147
+ unit = lit;
148
+ }
149
+ if (lrat && !satisfied) {
150
+ // if we found a unit we need to add all unit ids from
151
+ // {c\d}U{d\c} otherwise just the unit ids from {c\d}
152
+ for (const auto &lit : *c) {
153
+ const signed char tmp = val (lit);
154
+ assert (tmp <= 0);
155
+ if (tmp >= 0)
156
+ continue;
157
+ Flags &f = flags (lit);
158
+ if (f.seen && unit && unit == INT_MIN) {
159
+ f.seen = false;
160
+ continue;
161
+ } else if (!f.seen) {
162
+ f.seen = true;
163
+ analyzed.push_back (lit);
164
+ }
165
+ }
166
+ if (unit == INT_MIN) { // we do not need units from {d\c}
167
+ for (const auto &lit : *d) {
168
+ flags (lit).seen = false;
169
+ }
170
+ }
171
+ for (const auto &lit : analyzed) {
172
+ Flags &f = flags (lit);
173
+ if (!f.seen) {
174
+ f.seen = true;
175
+ continue;
176
+ }
177
+ int64_t id = unit_id (-lit);
178
+ lrat_chain.push_back (id);
179
+ }
180
+ clear_analyzed_literals ();
181
+ lrat_chain.push_back (d->id);
182
+ lrat_chain.push_back (c->id);
183
+ } else if (lrat)
184
+ clear_analyzed_literals ();
185
+ if (satisfied) {
186
+ assert (lrat_chain.empty ());
187
+ mark_garbage (d);
188
+ elim_update_removed_clause (eliminator, d);
189
+ } else if (unit && unit != INT_MIN) {
190
+ assert (unit);
191
+ LOG (d, "unit %d through hyper unary resolution with", unit);
192
+ assign_unit (unit);
193
+ elim_propagate (eliminator, unit);
194
+ lrat_chain.clear ();
195
+ break;
196
+ } else if (occs (negated).size () <= (size_t) opts.elimocclim) {
197
+ strengthen_clause (d, negated);
198
+ remove_occs (occs (negated), d);
199
+ elim_update_removed_lit (eliminator, negated);
200
+ stats.elimbwstr++;
201
+ assert (negated != best);
202
+ eliminator.enqueue (d);
203
+ }
204
+ lrat_chain.clear ();
205
+ }
206
+ }
207
+ }
208
+ }
209
+ mini_chain.clear ();
210
+ unmark (c);
211
+ }
212
+
213
+ /*------------------------------------------------------------------------*/
214
+
215
+ void Internal::elim_backward_clauses (Eliminator &eliminator) {
216
+ if (!opts.elimbackward) {
217
+ assert (eliminator.backward.empty ());
218
+ return;
219
+ }
220
+ START (backward);
221
+ LOG ("attempting backward subsumption and strengthening with %zd clauses",
222
+ eliminator.backward.size ());
223
+ Clause *c;
224
+ while (!unsat && (c = eliminator.dequeue ()))
225
+ elim_backward_clause (eliminator, c);
226
+ STOP (backward);
227
+ }
228
+
229
+ /*------------------------------------------------------------------------*/
230
+
231
+ } // namespace CaDiCaL
@@ -0,0 +1,22 @@
1
+ #include "internal.hpp"
2
+
3
+ namespace CaDiCaL {
4
+
5
+ /*------------------------------------------------------------------------*/
6
+
7
+ // Binary implication graph lists.
8
+
9
+ void Internal::init_bins () {
10
+ assert (big.empty ());
11
+ if (big.size () < 2 * vsize)
12
+ big.resize (2 * vsize, Bins ());
13
+ LOG ("initialized binary implication graph");
14
+ }
15
+
16
+ void Internal::reset_bins () {
17
+ assert (!big.empty ());
18
+ erase_vector (big);
19
+ LOG ("reset binary implication graph");
20
+ }
21
+
22
+ } // namespace CaDiCaL
@@ -0,0 +1,22 @@
1
+ #ifndef _bins_hpp_INCLUDED
2
+ #define _bins_hpp_INCLUDED
3
+
4
+ #include "util.hpp" // Alphabetically after 'bins'.
5
+
6
+ namespace CaDiCaL {
7
+
8
+ using namespace std;
9
+
10
+ struct Bin {
11
+ int lit;
12
+ int64_t id;
13
+ };
14
+
15
+ typedef vector<Bin> Bins;
16
+
17
+ inline void shrink_bins (Bins &bs) { shrink_vector (bs); }
18
+ inline void erase_bins (Bins &bs) { erase_vector (bs); }
19
+
20
+ } // namespace CaDiCaL
21
+
22
+ #endif