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,550 @@
|
|
|
1
|
+
#include "internal.hpp"
|
|
2
|
+
|
|
3
|
+
namespace CaDiCaL {
|
|
4
|
+
|
|
5
|
+
/*------------------------------------------------------------------------*/
|
|
6
|
+
|
|
7
|
+
// Compacting removes holes generated by inactive variables (fixed,
|
|
8
|
+
// eliminated, substituted or pure) by mapping active variables indices down
|
|
9
|
+
// to a contiguous interval of indices.
|
|
10
|
+
|
|
11
|
+
/*------------------------------------------------------------------------*/
|
|
12
|
+
|
|
13
|
+
bool Internal::compacting () {
|
|
14
|
+
if (level)
|
|
15
|
+
return false;
|
|
16
|
+
if (!opts.compact)
|
|
17
|
+
return false;
|
|
18
|
+
if (stats.conflicts < lim.compact)
|
|
19
|
+
return false;
|
|
20
|
+
int inactive = max_var - active ();
|
|
21
|
+
assert (inactive >= 0);
|
|
22
|
+
if (!inactive)
|
|
23
|
+
return false;
|
|
24
|
+
if (inactive < opts.compactmin)
|
|
25
|
+
return false;
|
|
26
|
+
return inactive >= (1e-3 * opts.compactlim) * max_var;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*------------------------------------------------------------------------*/
|
|
30
|
+
|
|
31
|
+
struct Mapper {
|
|
32
|
+
|
|
33
|
+
Internal *internal;
|
|
34
|
+
int new_max_var; // New 'max_var' after compacting.
|
|
35
|
+
int *table; // Old variable index to new literal map.
|
|
36
|
+
int first_fixed; // First fixed variable index.
|
|
37
|
+
int map_first_fixed; // Mapped literal of first fixed variable.
|
|
38
|
+
signed char first_fixed_val; // Value of first fixed variable.
|
|
39
|
+
size_t new_vsize;
|
|
40
|
+
|
|
41
|
+
/*----------------------------------------------------------------------*/
|
|
42
|
+
// We produce a compacting garbage collector like map of old 'src' to
|
|
43
|
+
// new 'dst' variables. Inactive variables are just skipped except for
|
|
44
|
+
// fixed ones which will be mapped to the first fixed variable (in the
|
|
45
|
+
// appropriate phase). This avoids to handle the case 'fixed value'
|
|
46
|
+
// separately as it is done in Lingeling, where fixed variables are
|
|
47
|
+
// mapped to the internal variable '1'.
|
|
48
|
+
//
|
|
49
|
+
Mapper (Internal *i)
|
|
50
|
+
: internal (i), new_max_var (0), first_fixed (0), map_first_fixed (0),
|
|
51
|
+
first_fixed_val (0) {
|
|
52
|
+
table = new int[internal->max_var + 1u];
|
|
53
|
+
clear_n (table, internal->max_var + 1u);
|
|
54
|
+
|
|
55
|
+
assert (!internal->level);
|
|
56
|
+
|
|
57
|
+
for (auto src : internal->vars) {
|
|
58
|
+
const Flags &f = internal->flags (src);
|
|
59
|
+
if (f.active ())
|
|
60
|
+
table[src] = ++new_max_var;
|
|
61
|
+
else if (f.fixed () && !first_fixed)
|
|
62
|
+
table[first_fixed = src] = map_first_fixed = ++new_max_var;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
first_fixed_val = first_fixed ? internal->val (first_fixed) : 0;
|
|
66
|
+
new_vsize = new_max_var + 1u;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
~Mapper () { delete[] table; }
|
|
70
|
+
|
|
71
|
+
/*----------------------------------------------------------------------*/
|
|
72
|
+
// Map old variable indices. A result of zero means not mapped.
|
|
73
|
+
//
|
|
74
|
+
int map_idx (int src) {
|
|
75
|
+
assert (0 < src);
|
|
76
|
+
assert (src <= internal->max_var);
|
|
77
|
+
const int res = table[src];
|
|
78
|
+
assert (res <= new_max_var);
|
|
79
|
+
return res;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/*----------------------------------------------------------------------*/
|
|
83
|
+
// The 'map_idx' above is just a look-up into the 'table'. Here we have
|
|
84
|
+
// to care about signedness of 'src', and in addition that fixed variables
|
|
85
|
+
// have all to be mapped to the first fixed variable 'first_fixed'.
|
|
86
|
+
//
|
|
87
|
+
int map_lit (int src) {
|
|
88
|
+
int res = map_idx (abs (src));
|
|
89
|
+
if (!res) {
|
|
90
|
+
const signed char tmp = internal->val (src);
|
|
91
|
+
if (tmp) {
|
|
92
|
+
assert (first_fixed);
|
|
93
|
+
res = map_first_fixed;
|
|
94
|
+
if (tmp != first_fixed_val)
|
|
95
|
+
res = -res;
|
|
96
|
+
}
|
|
97
|
+
} else if ((src) < 0)
|
|
98
|
+
res = -res;
|
|
99
|
+
assert (abs (res) <= new_max_var);
|
|
100
|
+
return res;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/*----------------------------------------------------------------------*/
|
|
104
|
+
// Map positive variable indices in vector.
|
|
105
|
+
//
|
|
106
|
+
template <class T> void map_vector (vector<T> &v) {
|
|
107
|
+
for (auto src : internal->vars) {
|
|
108
|
+
const int dst = map_idx (src);
|
|
109
|
+
if (!dst)
|
|
110
|
+
continue;
|
|
111
|
+
assert (0 < dst);
|
|
112
|
+
assert (dst <= src);
|
|
113
|
+
v[dst] = v[src];
|
|
114
|
+
}
|
|
115
|
+
v.resize (new_vsize);
|
|
116
|
+
shrink_vector (v);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/*----------------------------------------------------------------------*/
|
|
120
|
+
// Map positive and negative variable indices in two-sided vector.
|
|
121
|
+
//
|
|
122
|
+
template <class T> void map2_vector (vector<T> &v) {
|
|
123
|
+
for (auto src : internal->vars) {
|
|
124
|
+
const int dst = map_idx (src);
|
|
125
|
+
if (!dst)
|
|
126
|
+
continue;
|
|
127
|
+
assert (0 < dst);
|
|
128
|
+
assert (dst <= src);
|
|
129
|
+
v[2 * dst] = v[2 * src];
|
|
130
|
+
v[2 * dst + 1] = v[2 * src + 1];
|
|
131
|
+
}
|
|
132
|
+
v.resize (2 * new_vsize);
|
|
133
|
+
shrink_vector (v);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/*----------------------------------------------------------------------*/
|
|
137
|
+
// Map a vector of literals, flush inactive literals, then resize and
|
|
138
|
+
// shrink it to fit the new size after flushing.
|
|
139
|
+
//
|
|
140
|
+
void map_flush_and_shrink_lits (vector<int> &v) {
|
|
141
|
+
const auto end = v.end ();
|
|
142
|
+
auto j = v.begin (), i = j;
|
|
143
|
+
for (; i != end; i++) {
|
|
144
|
+
const int src = *i;
|
|
145
|
+
int dst = map_idx (abs (src));
|
|
146
|
+
assert (abs (dst) <= abs (src));
|
|
147
|
+
if (!dst)
|
|
148
|
+
continue;
|
|
149
|
+
if (src < 0)
|
|
150
|
+
dst = -dst;
|
|
151
|
+
*j++ = dst;
|
|
152
|
+
}
|
|
153
|
+
v.resize (j - v.begin ());
|
|
154
|
+
shrink_vector (v);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
/*------------------------------------------------------------------------*/
|
|
159
|
+
|
|
160
|
+
static signed char *ignore_clang_analyze_memory_leak_warning;
|
|
161
|
+
|
|
162
|
+
void Internal::compact () {
|
|
163
|
+
|
|
164
|
+
START (compact);
|
|
165
|
+
|
|
166
|
+
assert (active () < max_var);
|
|
167
|
+
|
|
168
|
+
stats.compacts++;
|
|
169
|
+
|
|
170
|
+
assert (!level);
|
|
171
|
+
assert (!unsat);
|
|
172
|
+
assert (!conflict);
|
|
173
|
+
assert (clause.empty ());
|
|
174
|
+
assert (levels.empty ());
|
|
175
|
+
assert (analyzed.empty ());
|
|
176
|
+
assert (minimized.empty ());
|
|
177
|
+
assert (control.size () == 1);
|
|
178
|
+
assert (propagated == trail.size ());
|
|
179
|
+
|
|
180
|
+
garbage_collection ();
|
|
181
|
+
|
|
182
|
+
Mapper mapper (this);
|
|
183
|
+
|
|
184
|
+
if (mapper.first_fixed)
|
|
185
|
+
LOG ("found first fixed %d",
|
|
186
|
+
sign (mapper.first_fixed_val) * mapper.first_fixed);
|
|
187
|
+
else
|
|
188
|
+
LOG ("no variable fixed");
|
|
189
|
+
|
|
190
|
+
if (!assumptions.empty ()) {
|
|
191
|
+
assert (!external->assumptions.empty ());
|
|
192
|
+
LOG ("temporarily reset internal assumptions");
|
|
193
|
+
reset_assumptions ();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const bool is_constraint = !constraint.empty ();
|
|
197
|
+
if (is_constraint) {
|
|
198
|
+
assert (!external->constraint.empty ());
|
|
199
|
+
LOG ("temporarily reset internal constraint");
|
|
200
|
+
reset_constraint ();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/*======================================================================*/
|
|
204
|
+
// In this first part we only map stuff without reallocation / shrinking.
|
|
205
|
+
/*======================================================================*/
|
|
206
|
+
|
|
207
|
+
// Flush the external indices. This has to occur before we map 'vals'.
|
|
208
|
+
// Also fixes external units.
|
|
209
|
+
//
|
|
210
|
+
for (auto eidx : external->vars) {
|
|
211
|
+
int src = external->e2i[eidx];
|
|
212
|
+
if (!src) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (lrat || frat) {
|
|
216
|
+
assert (eidx > 0);
|
|
217
|
+
assert (external->ext_units.size () >= (size_t) 2 * eidx + 1);
|
|
218
|
+
int64_t id1 = external->ext_units[2 * eidx];
|
|
219
|
+
int64_t id2 = external->ext_units[2 * eidx + 1];
|
|
220
|
+
assert (!id1 || !id2);
|
|
221
|
+
if (!id1 && !id2) {
|
|
222
|
+
int64_t new_id1 = unit_clauses (2 * src);
|
|
223
|
+
int64_t new_id2 = unit_clauses (2 * src + 1);
|
|
224
|
+
external->ext_units[2 * eidx] = new_id1;
|
|
225
|
+
external->ext_units[2 * eidx + 1] = new_id2;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
int dst = mapper.map_lit (src);
|
|
229
|
+
LOG ("compact %" PRId64
|
|
230
|
+
" maps external %d to internal %d from internal %d",
|
|
231
|
+
stats.compacts, eidx, dst, src);
|
|
232
|
+
external->e2i[eidx] = dst;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Delete garbage units. Needs to occur before resizing unit_clauses
|
|
236
|
+
//
|
|
237
|
+
if (lrat || frat) {
|
|
238
|
+
for (auto src : internal->vars) {
|
|
239
|
+
const int dst = mapper.map_idx (src);
|
|
240
|
+
assert (dst <= src);
|
|
241
|
+
const signed char tmp = internal->val (src);
|
|
242
|
+
if (!dst && !tmp) {
|
|
243
|
+
unit_clauses (2 * src) = 0;
|
|
244
|
+
unit_clauses (2 * src + 1) = 0;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (!tmp || src == mapper.first_fixed) {
|
|
248
|
+
assert (0 < dst);
|
|
249
|
+
if (dst == src)
|
|
250
|
+
continue;
|
|
251
|
+
assert (!unit_clauses (2 * dst) && !unit_clauses (2 * dst + 1));
|
|
252
|
+
unit_clauses (2 * dst) = unit_clauses (2 * src);
|
|
253
|
+
unit_clauses (2 * dst + 1) = unit_clauses (2 * src + 1);
|
|
254
|
+
unit_clauses (2 * src) = 0;
|
|
255
|
+
unit_clauses (2 * src + 1) = 0;
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
int64_t id = unit_clauses (2 * src);
|
|
259
|
+
int lit = src;
|
|
260
|
+
if (!id) {
|
|
261
|
+
id = unit_clauses (2 * src + 1);
|
|
262
|
+
lit = -lit;
|
|
263
|
+
}
|
|
264
|
+
unit_clauses (2 * src) = 0;
|
|
265
|
+
unit_clauses (2 * src + 1) = 0;
|
|
266
|
+
assert (id);
|
|
267
|
+
}
|
|
268
|
+
unit_clauses_idx.resize (2 * mapper.new_vsize);
|
|
269
|
+
shrink_vector (unit_clauses_idx);
|
|
270
|
+
}
|
|
271
|
+
// Map the literals in all clauses.
|
|
272
|
+
//
|
|
273
|
+
for (const auto &c : clauses) {
|
|
274
|
+
assert (!c->garbage);
|
|
275
|
+
for (auto &src : *c) {
|
|
276
|
+
assert (!val (src));
|
|
277
|
+
int dst;
|
|
278
|
+
dst = mapper.map_lit (src);
|
|
279
|
+
assert (dst || c->garbage);
|
|
280
|
+
src = dst;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Map the blocking literals in all watches.
|
|
285
|
+
//
|
|
286
|
+
if (!wtab.empty ())
|
|
287
|
+
for (auto lit : lits)
|
|
288
|
+
for (auto &w : watches (lit))
|
|
289
|
+
w.blit = mapper.map_lit (w.blit);
|
|
290
|
+
|
|
291
|
+
// We first flush inactive variables and map the links in the queue. This
|
|
292
|
+
// has to be done before we map the actual links data structure 'links'.
|
|
293
|
+
{
|
|
294
|
+
int prev = 0, mapped_prev = 0, next;
|
|
295
|
+
for (int idx = queue.first; idx; idx = next) {
|
|
296
|
+
next = links[idx].next;
|
|
297
|
+
if (idx == mapper.first_fixed)
|
|
298
|
+
continue;
|
|
299
|
+
const int dst = mapper.map_idx (idx);
|
|
300
|
+
if (!dst)
|
|
301
|
+
continue;
|
|
302
|
+
assert (active (idx));
|
|
303
|
+
if (prev)
|
|
304
|
+
links[prev].next = dst;
|
|
305
|
+
else
|
|
306
|
+
queue.first = dst;
|
|
307
|
+
links[idx].prev = mapped_prev;
|
|
308
|
+
mapped_prev = dst;
|
|
309
|
+
prev = idx;
|
|
310
|
+
}
|
|
311
|
+
if (prev)
|
|
312
|
+
links[prev].next = 0;
|
|
313
|
+
else
|
|
314
|
+
queue.first = 0;
|
|
315
|
+
queue.unassigned = queue.last = mapped_prev;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/*======================================================================*/
|
|
319
|
+
// In the second part we map, flush and shrink arrays.
|
|
320
|
+
/*======================================================================*/
|
|
321
|
+
|
|
322
|
+
assert (trail.size () == num_assigned);
|
|
323
|
+
mapper.map_flush_and_shrink_lits (trail);
|
|
324
|
+
propagated = trail.size ();
|
|
325
|
+
num_assigned = trail.size ();
|
|
326
|
+
if (mapper.first_fixed) {
|
|
327
|
+
assert (trail.size () == 1);
|
|
328
|
+
var (mapper.first_fixed).trail = 0; // before mapping 'vtab'
|
|
329
|
+
} else
|
|
330
|
+
assert (trail.empty ());
|
|
331
|
+
|
|
332
|
+
if (!probes.empty ())
|
|
333
|
+
mapper.map_flush_and_shrink_lits (probes);
|
|
334
|
+
|
|
335
|
+
if (!sweep_schedule.empty ())
|
|
336
|
+
mapper.map_flush_and_shrink_lits (sweep_schedule);
|
|
337
|
+
|
|
338
|
+
/*======================================================================*/
|
|
339
|
+
// In the third part we map stuff and also reallocate memory.
|
|
340
|
+
/*======================================================================*/
|
|
341
|
+
|
|
342
|
+
// Now we continue in reverse order of allocated bytes, e.g., see
|
|
343
|
+
// 'Internal::enlarge' which reallocates in order of allocated bytes.
|
|
344
|
+
|
|
345
|
+
mapper.map_vector (ftab);
|
|
346
|
+
mapper.map_vector (parents);
|
|
347
|
+
mapper.map_vector (marks);
|
|
348
|
+
mapper.map_vector (phases.saved);
|
|
349
|
+
mapper.map_vector (phases.forced);
|
|
350
|
+
mapper.map_vector (phases.target);
|
|
351
|
+
mapper.map_vector (phases.best);
|
|
352
|
+
mapper.map_vector (phases.prev);
|
|
353
|
+
|
|
354
|
+
// Special code for 'frozentab'.
|
|
355
|
+
//
|
|
356
|
+
for (auto src : vars) {
|
|
357
|
+
const int dst = abs (mapper.map_lit (src));
|
|
358
|
+
if (!dst)
|
|
359
|
+
continue;
|
|
360
|
+
if (src == dst)
|
|
361
|
+
continue;
|
|
362
|
+
assert (dst < src);
|
|
363
|
+
if ((size_t) src >= frozentab.size ())
|
|
364
|
+
break;
|
|
365
|
+
if ((size_t) dst >= frozentab.size ())
|
|
366
|
+
break;
|
|
367
|
+
frozentab[dst] += frozentab[src];
|
|
368
|
+
frozentab[src] = 0;
|
|
369
|
+
}
|
|
370
|
+
frozentab.resize (min (frozentab.size (), mapper.new_vsize));
|
|
371
|
+
shrink_vector (frozentab);
|
|
372
|
+
|
|
373
|
+
// Special code for 'relevanttab'.
|
|
374
|
+
//
|
|
375
|
+
if (external) {
|
|
376
|
+
for (auto src : vars) {
|
|
377
|
+
const int dst = abs (mapper.map_lit (src));
|
|
378
|
+
if (!dst)
|
|
379
|
+
continue;
|
|
380
|
+
if (src == dst)
|
|
381
|
+
continue;
|
|
382
|
+
assert (dst < src);
|
|
383
|
+
|
|
384
|
+
relevanttab[dst] += relevanttab[src];
|
|
385
|
+
relevanttab[src] = 0;
|
|
386
|
+
}
|
|
387
|
+
relevanttab.resize (mapper.new_vsize);
|
|
388
|
+
shrink_vector (relevanttab);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/*----------------------------------------------------------------------*/
|
|
392
|
+
|
|
393
|
+
if (!external->assumptions.empty ()) {
|
|
394
|
+
|
|
395
|
+
for (const auto &elit : external->assumptions) {
|
|
396
|
+
assert (elit);
|
|
397
|
+
assert (elit != INT_MIN);
|
|
398
|
+
int eidx = abs (elit);
|
|
399
|
+
assert (eidx <= external->max_var);
|
|
400
|
+
int ilit = external->e2i[eidx];
|
|
401
|
+
assert (ilit); // Because we froze all!!!
|
|
402
|
+
if (elit < 0)
|
|
403
|
+
ilit = -ilit;
|
|
404
|
+
assume (ilit);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
PHASE ("compact", stats.compacts, "reassumed %zd external assumptions",
|
|
408
|
+
external->assumptions.size ());
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Special case for 'val' as for 'val' we trade branch less code for
|
|
412
|
+
// memory and always allocated an [-maxvar,...,maxvar] array.
|
|
413
|
+
{
|
|
414
|
+
signed char *new_vals = new signed char[2 * mapper.new_vsize];
|
|
415
|
+
ignore_clang_analyze_memory_leak_warning = new_vals;
|
|
416
|
+
new_vals += mapper.new_vsize;
|
|
417
|
+
for (auto src : vars)
|
|
418
|
+
new_vals[-mapper.map_idx (src)] = vals[-src];
|
|
419
|
+
for (auto src : vars)
|
|
420
|
+
new_vals[mapper.map_idx (src)] = vals[src];
|
|
421
|
+
new_vals[0] = 0;
|
|
422
|
+
vals -= vsize;
|
|
423
|
+
delete[] vals;
|
|
424
|
+
vals = new_vals;
|
|
425
|
+
vsize = mapper.new_vsize;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// 'constrain' uses 'val', so this code has to be after remapping that
|
|
429
|
+
if (is_constraint) {
|
|
430
|
+
assert (!level);
|
|
431
|
+
assert (!external->constraint.back ());
|
|
432
|
+
for (auto elit : external->constraint) {
|
|
433
|
+
assert (elit != INT_MIN);
|
|
434
|
+
int eidx = abs (elit);
|
|
435
|
+
assert (eidx <= external->max_var);
|
|
436
|
+
int ilit = external->e2i[eidx];
|
|
437
|
+
assert (!ilit == !elit);
|
|
438
|
+
if (elit < 0)
|
|
439
|
+
ilit = -ilit;
|
|
440
|
+
LOG ("re adding lit external %d internal %d to constraint", elit,
|
|
441
|
+
ilit);
|
|
442
|
+
constrain (ilit);
|
|
443
|
+
}
|
|
444
|
+
PHASE ("compact", stats.compacts,
|
|
445
|
+
"added %zd external literals to constraint",
|
|
446
|
+
external->constraint.size () - 1);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
mapper.map_vector (i2e);
|
|
450
|
+
mapper.map2_vector (ptab);
|
|
451
|
+
mapper.map_vector (btab);
|
|
452
|
+
mapper.map_vector (gtab);
|
|
453
|
+
mapper.map_vector (links);
|
|
454
|
+
mapper.map_vector (vtab);
|
|
455
|
+
if (!ntab.empty ())
|
|
456
|
+
mapper.map2_vector (ntab);
|
|
457
|
+
if (!wtab.empty ())
|
|
458
|
+
mapper.map2_vector (wtab);
|
|
459
|
+
if (!otab.empty ())
|
|
460
|
+
mapper.map2_vector (otab);
|
|
461
|
+
if (!rtab.empty ())
|
|
462
|
+
mapper.map2_vector (rtab);
|
|
463
|
+
if (!big.empty ())
|
|
464
|
+
mapper.map2_vector (big);
|
|
465
|
+
|
|
466
|
+
/*======================================================================*/
|
|
467
|
+
// In the fourth part we map the binary heap for scores.
|
|
468
|
+
/*======================================================================*/
|
|
469
|
+
|
|
470
|
+
// The simplest way to map a binary heap is to get all elements from the
|
|
471
|
+
// heap and reinsert them. This could be slightly improved in terms of
|
|
472
|
+
// speed if we add a 'flush (int * map)' function to 'Heap', but that is
|
|
473
|
+
// pretty complicated and would require that the 'Heap' knows that mapped
|
|
474
|
+
// elements with 'zero' destination should be flushed.
|
|
475
|
+
|
|
476
|
+
vector<int> saved;
|
|
477
|
+
assert (saved.empty ());
|
|
478
|
+
if (!scores.empty ()) {
|
|
479
|
+
while (!scores.empty ()) {
|
|
480
|
+
const int src = scores.front ();
|
|
481
|
+
scores.pop_front ();
|
|
482
|
+
const int dst = mapper.map_idx (src);
|
|
483
|
+
if (!dst)
|
|
484
|
+
continue;
|
|
485
|
+
if (src == mapper.first_fixed)
|
|
486
|
+
continue;
|
|
487
|
+
saved.push_back (dst);
|
|
488
|
+
}
|
|
489
|
+
scores.erase ();
|
|
490
|
+
}
|
|
491
|
+
mapper.map_vector (stab);
|
|
492
|
+
if (!saved.empty ()) {
|
|
493
|
+
for (const auto idx : saved)
|
|
494
|
+
scores.push_back (idx);
|
|
495
|
+
scores.shrink ();
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/*----------------------------------------------------------------------*/
|
|
499
|
+
|
|
500
|
+
PHASE ("compact", stats.compacts,
|
|
501
|
+
"reducing internal variables from %d to %d", max_var,
|
|
502
|
+
mapper.new_max_var);
|
|
503
|
+
|
|
504
|
+
/*----------------------------------------------------------------------*/
|
|
505
|
+
|
|
506
|
+
// Need to adjust the target and best assigned counters too.
|
|
507
|
+
|
|
508
|
+
size_t new_target_assigned = 0, new_best_assigned = 0;
|
|
509
|
+
|
|
510
|
+
for (auto idx : Range (mapper.new_max_var)) {
|
|
511
|
+
if (phases.target[idx])
|
|
512
|
+
new_target_assigned++;
|
|
513
|
+
if (phases.best[idx])
|
|
514
|
+
new_best_assigned++;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
LOG ("reset target assigned from %zd to %zd", target_assigned,
|
|
518
|
+
new_target_assigned);
|
|
519
|
+
LOG ("reset best assigned from %zd to %zd", best_assigned,
|
|
520
|
+
new_best_assigned);
|
|
521
|
+
|
|
522
|
+
target_assigned = new_target_assigned;
|
|
523
|
+
best_assigned = new_best_assigned;
|
|
524
|
+
no_conflict_until = 0;
|
|
525
|
+
notified = 0;
|
|
526
|
+
|
|
527
|
+
INIT_EMA (averages.current.trail.fast, opts.ematrailfast);
|
|
528
|
+
INIT_EMA (averages.current.trail.slow, opts.ematrailslow);
|
|
529
|
+
|
|
530
|
+
/*----------------------------------------------------------------------*/
|
|
531
|
+
|
|
532
|
+
max_var = mapper.new_max_var;
|
|
533
|
+
|
|
534
|
+
stats.unused = 0;
|
|
535
|
+
stats.inactive = stats.now.fixed = mapper.first_fixed ? 1 : 0;
|
|
536
|
+
stats.now.substituted = stats.now.eliminated = stats.now.pure = 0;
|
|
537
|
+
|
|
538
|
+
check_var_stats ();
|
|
539
|
+
|
|
540
|
+
int64_t delta = opts.compactint * (stats.compacts + 1);
|
|
541
|
+
lim.compact = stats.conflicts + delta;
|
|
542
|
+
|
|
543
|
+
PHASE ("compact", stats.compacts,
|
|
544
|
+
"new compact limit %" PRId64 " after %" PRId64 " conflicts",
|
|
545
|
+
lim.compact, delta);
|
|
546
|
+
|
|
547
|
+
STOP (compact);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
} // namespace CaDiCaL
|