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.
- checksums.yaml +7 -0
- data/LICENSE.txt +26 -0
- data/README.md +101 -0
- data/ext/cadical/cadical/LICENSE +28 -0
- data/ext/cadical/cadical/README.md +65 -0
- data/ext/cadical/cadical/VERSION +1 -0
- data/ext/cadical/cadical/src/analyze.cpp +1360 -0
- data/ext/cadical/cadical/src/arena.cpp +30 -0
- data/ext/cadical/cadical/src/arena.hpp +105 -0
- data/ext/cadical/cadical/src/assume.cpp +616 -0
- data/ext/cadical/cadical/src/averages.cpp +34 -0
- data/ext/cadical/cadical/src/averages.hpp +37 -0
- data/ext/cadical/cadical/src/backbone.cpp +631 -0
- data/ext/cadical/cadical/src/backtrack.cpp +177 -0
- data/ext/cadical/cadical/src/backward.cpp +231 -0
- data/ext/cadical/cadical/src/bins.cpp +22 -0
- data/ext/cadical/cadical/src/bins.hpp +22 -0
- data/ext/cadical/cadical/src/block.cpp +824 -0
- data/ext/cadical/cadical/src/block.hpp +37 -0
- data/ext/cadical/cadical/src/cadical.cpp +1026 -0
- data/ext/cadical/cadical/src/cadical.hpp +1419 -0
- data/ext/cadical/cadical/src/ccadical.cpp +208 -0
- data/ext/cadical/cadical/src/ccadical.h +74 -0
- data/ext/cadical/cadical/src/checker.cpp +649 -0
- data/ext/cadical/cadical/src/checker.hpp +173 -0
- data/ext/cadical/cadical/src/clause.cpp +689 -0
- data/ext/cadical/cadical/src/clause.hpp +190 -0
- data/ext/cadical/cadical/src/collect.cpp +545 -0
- data/ext/cadical/cadical/src/compact.cpp +550 -0
- data/ext/cadical/cadical/src/condition.cpp +940 -0
- data/ext/cadical/cadical/src/config.cpp +101 -0
- data/ext/cadical/cadical/src/config.hpp +20 -0
- data/ext/cadical/cadical/src/congruence.cpp +7880 -0
- data/ext/cadical/cadical/src/congruence.hpp +757 -0
- data/ext/cadical/cadical/src/constrain.cpp +64 -0
- data/ext/cadical/cadical/src/contract.cpp +27 -0
- data/ext/cadical/cadical/src/contract.hpp +139 -0
- data/ext/cadical/cadical/src/cover.cpp +704 -0
- data/ext/cadical/cadical/src/cover.hpp +34 -0
- data/ext/cadical/cadical/src/decide.cpp +347 -0
- data/ext/cadical/cadical/src/decompose.cpp +738 -0
- data/ext/cadical/cadical/src/decompose.hpp +23 -0
- data/ext/cadical/cadical/src/deduplicate.cpp +275 -0
- data/ext/cadical/cadical/src/definition.cpp +283 -0
- data/ext/cadical/cadical/src/delay.hpp +38 -0
- data/ext/cadical/cadical/src/drattracer.cpp +153 -0
- data/ext/cadical/cadical/src/drattracer.hpp +55 -0
- data/ext/cadical/cadical/src/elim.cpp +1171 -0
- data/ext/cadical/cadical/src/elim.hpp +53 -0
- data/ext/cadical/cadical/src/elimfast.cpp +570 -0
- data/ext/cadical/cadical/src/ema.cpp +95 -0
- data/ext/cadical/cadical/src/ema.hpp +68 -0
- data/ext/cadical/cadical/src/extend.cpp +289 -0
- data/ext/cadical/cadical/src/external.cpp +1034 -0
- data/ext/cadical/cadical/src/external.hpp +487 -0
- data/ext/cadical/cadical/src/external_propagate.cpp +1316 -0
- data/ext/cadical/cadical/src/factor.cpp +1011 -0
- data/ext/cadical/cadical/src/factor.hpp +54 -0
- data/ext/cadical/cadical/src/file.cpp +506 -0
- data/ext/cadical/cadical/src/file.hpp +210 -0
- data/ext/cadical/cadical/src/flags.cpp +135 -0
- data/ext/cadical/cadical/src/flags.hpp +93 -0
- data/ext/cadical/cadical/src/flip.cpp +269 -0
- data/ext/cadical/cadical/src/format.cpp +89 -0
- data/ext/cadical/cadical/src/format.hpp +36 -0
- data/ext/cadical/cadical/src/frattracer.cpp +277 -0
- data/ext/cadical/cadical/src/frattracer.hpp +67 -0
- data/ext/cadical/cadical/src/gates.cpp +766 -0
- data/ext/cadical/cadical/src/heap.hpp +212 -0
- data/ext/cadical/cadical/src/idruptracer.cpp +566 -0
- data/ext/cadical/cadical/src/idruptracer.hpp +112 -0
- data/ext/cadical/cadical/src/instantiate.cpp +365 -0
- data/ext/cadical/cadical/src/instantiate.hpp +45 -0
- data/ext/cadical/cadical/src/internal.cpp +1265 -0
- data/ext/cadical/cadical/src/internal.hpp +1941 -0
- data/ext/cadical/cadical/src/inttypes.hpp +34 -0
- data/ext/cadical/cadical/src/ipasir.cpp +47 -0
- data/ext/cadical/cadical/src/ipasir.h +37 -0
- data/ext/cadical/cadical/src/kitten.c +2599 -0
- data/ext/cadical/cadical/src/kitten.h +97 -0
- data/ext/cadical/cadical/src/level.hpp +33 -0
- data/ext/cadical/cadical/src/lidruptracer.cpp +657 -0
- data/ext/cadical/cadical/src/lidruptracer.hpp +122 -0
- data/ext/cadical/cadical/src/limit.cpp +146 -0
- data/ext/cadical/cadical/src/limit.hpp +168 -0
- data/ext/cadical/cadical/src/logging.cpp +214 -0
- data/ext/cadical/cadical/src/logging.hpp +98 -0
- data/ext/cadical/cadical/src/lookahead.cpp +520 -0
- data/ext/cadical/cadical/src/lratchecker.cpp +833 -0
- data/ext/cadical/cadical/src/lratchecker.hpp +168 -0
- data/ext/cadical/cadical/src/lrattracer.cpp +200 -0
- data/ext/cadical/cadical/src/lrattracer.hpp +61 -0
- data/ext/cadical/cadical/src/lucky.cpp +506 -0
- data/ext/cadical/cadical/src/message.cpp +218 -0
- data/ext/cadical/cadical/src/message.hpp +65 -0
- data/ext/cadical/cadical/src/minimize.cpp +224 -0
- data/ext/cadical/cadical/src/mobical.cpp +5588 -0
- data/ext/cadical/cadical/src/occs.cpp +52 -0
- data/ext/cadical/cadical/src/occs.hpp +36 -0
- data/ext/cadical/cadical/src/options.cpp +359 -0
- data/ext/cadical/cadical/src/options.hpp +442 -0
- data/ext/cadical/cadical/src/parse.cpp +471 -0
- data/ext/cadical/cadical/src/parse.hpp +75 -0
- data/ext/cadical/cadical/src/phases.cpp +56 -0
- data/ext/cadical/cadical/src/phases.hpp +19 -0
- data/ext/cadical/cadical/src/probe.cpp +990 -0
- data/ext/cadical/cadical/src/profile.cpp +107 -0
- data/ext/cadical/cadical/src/profile.hpp +283 -0
- data/ext/cadical/cadical/src/proof.cpp +691 -0
- data/ext/cadical/cadical/src/proof.hpp +125 -0
- data/ext/cadical/cadical/src/propagate.cpp +584 -0
- data/ext/cadical/cadical/src/queue.cpp +90 -0
- data/ext/cadical/cadical/src/queue.hpp +74 -0
- data/ext/cadical/cadical/src/radix.hpp +180 -0
- data/ext/cadical/cadical/src/random.cpp +207 -0
- data/ext/cadical/cadical/src/random.h +44 -0
- data/ext/cadical/cadical/src/random.hpp +98 -0
- data/ext/cadical/cadical/src/range.hpp +125 -0
- data/ext/cadical/cadical/src/reap.cpp +127 -0
- data/ext/cadical/cadical/src/reap.hpp +28 -0
- data/ext/cadical/cadical/src/reduce.cpp +278 -0
- data/ext/cadical/cadical/src/reluctant.hpp +82 -0
- data/ext/cadical/cadical/src/rephase.cpp +402 -0
- data/ext/cadical/cadical/src/report.cpp +313 -0
- data/ext/cadical/cadical/src/resources.cpp +160 -0
- data/ext/cadical/cadical/src/resources.hpp +16 -0
- data/ext/cadical/cadical/src/restart.cpp +178 -0
- data/ext/cadical/cadical/src/restore.cpp +267 -0
- data/ext/cadical/cadical/src/score.cpp +51 -0
- data/ext/cadical/cadical/src/score.hpp +16 -0
- data/ext/cadical/cadical/src/shrink.cpp +507 -0
- data/ext/cadical/cadical/src/signal.cpp +136 -0
- data/ext/cadical/cadical/src/signal.hpp +33 -0
- data/ext/cadical/cadical/src/solution.cpp +50 -0
- data/ext/cadical/cadical/src/solver.cpp +1871 -0
- data/ext/cadical/cadical/src/stable.cpp +31 -0
- data/ext/cadical/cadical/src/stack.h +110 -0
- data/ext/cadical/cadical/src/stats.cpp +920 -0
- data/ext/cadical/cadical/src/stats.hpp +418 -0
- data/ext/cadical/cadical/src/subsume.cpp +645 -0
- data/ext/cadical/cadical/src/sweep.cpp +1960 -0
- data/ext/cadical/cadical/src/sweep.hpp +61 -0
- data/ext/cadical/cadical/src/terminal.cpp +38 -0
- data/ext/cadical/cadical/src/terminal.hpp +96 -0
- data/ext/cadical/cadical/src/ternary.cpp +450 -0
- data/ext/cadical/cadical/src/testing.hpp +24 -0
- data/ext/cadical/cadical/src/tier.cpp +189 -0
- data/ext/cadical/cadical/src/tracer.hpp +186 -0
- data/ext/cadical/cadical/src/transred.cpp +253 -0
- data/ext/cadical/cadical/src/unstable.cpp +29 -0
- data/ext/cadical/cadical/src/util.cpp +129 -0
- data/ext/cadical/cadical/src/util.hpp +181 -0
- data/ext/cadical/cadical/src/var.cpp +39 -0
- data/ext/cadical/cadical/src/var.hpp +22 -0
- data/ext/cadical/cadical/src/veripbtracer.cpp +427 -0
- data/ext/cadical/cadical/src/veripbtracer.hpp +106 -0
- data/ext/cadical/cadical/src/version.cpp +107 -0
- data/ext/cadical/cadical/src/version.hpp +13 -0
- data/ext/cadical/cadical/src/vivify.cpp +1893 -0
- data/ext/cadical/cadical/src/vivify.hpp +50 -0
- data/ext/cadical/cadical/src/walk.cpp +1088 -0
- data/ext/cadical/cadical/src/walk.hpp +91 -0
- data/ext/cadical/cadical/src/walk_full_occs.cpp +966 -0
- data/ext/cadical/cadical/src/warmup.cpp +403 -0
- data/ext/cadical/cadical/src/watch.cpp +126 -0
- data/ext/cadical/cadical/src/watch.hpp +77 -0
- data/ext/cadical/cadical_ext.c +778 -0
- data/ext/cadical/extconf.rb +26 -0
- data/lib/cadical/version.rb +3 -0
- data/lib/cadical.rb +12 -0
- 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
|