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