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,691 @@
|
|
|
1
|
+
#include "internal.hpp"
|
|
2
|
+
|
|
3
|
+
namespace CaDiCaL {
|
|
4
|
+
|
|
5
|
+
using namespace std;
|
|
6
|
+
|
|
7
|
+
/*------------------------------------------------------------------------*/
|
|
8
|
+
|
|
9
|
+
// Enable proof logging and checking by allocating a 'Proof' object.
|
|
10
|
+
|
|
11
|
+
void Internal::new_proof_on_demand () {
|
|
12
|
+
if (!proof) {
|
|
13
|
+
LOG ("connecting proof to internal solver");
|
|
14
|
+
proof = new Proof (this);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
void Internal::resize_unit_clauses_idx () {
|
|
19
|
+
size_t new_vsize = vsize ? 2 * vsize : 1 + (size_t) max_var;
|
|
20
|
+
unit_clauses_idx.resize (2 * new_vsize, 0);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
void Internal::force_lrat () {
|
|
24
|
+
if (lrat)
|
|
25
|
+
return;
|
|
26
|
+
assert (proof);
|
|
27
|
+
lrat = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
void Internal::connect_proof_tracer (Tracer *tracer, bool antecedents,
|
|
31
|
+
bool finalize_clauses) {
|
|
32
|
+
new_proof_on_demand ();
|
|
33
|
+
if (antecedents)
|
|
34
|
+
force_lrat ();
|
|
35
|
+
if (finalize_clauses)
|
|
36
|
+
frat = true;
|
|
37
|
+
resize_unit_clauses_idx ();
|
|
38
|
+
proof->connect (tracer);
|
|
39
|
+
tracers.push_back (tracer);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void Internal::connect_proof_tracer (InternalTracer *tracer,
|
|
43
|
+
bool antecedents,
|
|
44
|
+
bool finalize_clauses) {
|
|
45
|
+
new_proof_on_demand ();
|
|
46
|
+
if (antecedents)
|
|
47
|
+
force_lrat ();
|
|
48
|
+
if (finalize_clauses)
|
|
49
|
+
frat = true;
|
|
50
|
+
resize_unit_clauses_idx ();
|
|
51
|
+
tracer->connect_internal (this);
|
|
52
|
+
proof->connect (tracer);
|
|
53
|
+
tracers.push_back (tracer);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void Internal::connect_proof_tracer (StatTracer *tracer, bool antecedents,
|
|
57
|
+
bool finalize_clauses) {
|
|
58
|
+
new_proof_on_demand ();
|
|
59
|
+
if (antecedents)
|
|
60
|
+
force_lrat ();
|
|
61
|
+
if (finalize_clauses)
|
|
62
|
+
frat = true;
|
|
63
|
+
resize_unit_clauses_idx ();
|
|
64
|
+
tracer->connect_internal (this);
|
|
65
|
+
proof->connect (tracer);
|
|
66
|
+
stat_tracers.push_back (tracer);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void Internal::connect_proof_tracer (FileTracer *tracer, bool antecedents,
|
|
70
|
+
bool finalize_clauses) {
|
|
71
|
+
new_proof_on_demand ();
|
|
72
|
+
if (antecedents)
|
|
73
|
+
force_lrat ();
|
|
74
|
+
if (finalize_clauses)
|
|
75
|
+
frat = true;
|
|
76
|
+
resize_unit_clauses_idx ();
|
|
77
|
+
tracer->connect_internal (this);
|
|
78
|
+
proof->connect (tracer);
|
|
79
|
+
file_tracers.push_back (tracer);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
bool Internal::disconnect_proof_tracer (Tracer *tracer) {
|
|
83
|
+
auto it = std::find (tracers.begin (), tracers.end (), tracer);
|
|
84
|
+
if (it != tracers.end ()) {
|
|
85
|
+
tracers.erase (it);
|
|
86
|
+
assert (proof);
|
|
87
|
+
proof->disconnect (tracer);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
bool Internal::disconnect_proof_tracer (StatTracer *tracer) {
|
|
94
|
+
auto it = std::find (stat_tracers.begin (), stat_tracers.end (), tracer);
|
|
95
|
+
if (it != stat_tracers.end ()) {
|
|
96
|
+
stat_tracers.erase (it);
|
|
97
|
+
assert (proof);
|
|
98
|
+
proof->disconnect (tracer);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
bool Internal::disconnect_proof_tracer (FileTracer *tracer) {
|
|
105
|
+
auto it = std::find (file_tracers.begin (), file_tracers.end (), tracer);
|
|
106
|
+
if (it != file_tracers.end ()) {
|
|
107
|
+
file_tracers.erase (it);
|
|
108
|
+
assert (proof);
|
|
109
|
+
proof->disconnect (tracer);
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
void Proof::disconnect (Tracer *t) {
|
|
116
|
+
tracers.erase (std::remove (tracers.begin (), tracers.end (), t),
|
|
117
|
+
tracers.end ());
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Enable proof tracing.
|
|
121
|
+
|
|
122
|
+
void Internal::trace (File *file) {
|
|
123
|
+
if (opts.veripb) {
|
|
124
|
+
LOG ("PROOF connecting VeriPB tracer");
|
|
125
|
+
bool antecedents = opts.veripb == 1 || opts.veripb == 2;
|
|
126
|
+
bool deletions = opts.veripb == 2 || opts.veripb == 4;
|
|
127
|
+
FileTracer *ft =
|
|
128
|
+
new VeripbTracer (this, file, opts.binary, antecedents, deletions);
|
|
129
|
+
connect_proof_tracer (ft, antecedents);
|
|
130
|
+
} else if (opts.frat) {
|
|
131
|
+
LOG ("PROOF connecting FRAT tracer");
|
|
132
|
+
bool antecedents = opts.frat == 1;
|
|
133
|
+
resize_unit_clauses_idx ();
|
|
134
|
+
FileTracer *ft =
|
|
135
|
+
new FratTracer (this, file, opts.binary, opts.frat == 1);
|
|
136
|
+
connect_proof_tracer (ft, antecedents, true);
|
|
137
|
+
} else if (opts.lrat) {
|
|
138
|
+
LOG ("PROOF connecting LRAT tracer");
|
|
139
|
+
FileTracer *ft = new LratTracer (this, file, opts.binary);
|
|
140
|
+
connect_proof_tracer (ft, true);
|
|
141
|
+
} else if (opts.idrup) {
|
|
142
|
+
LOG ("PROOF connecting IDRUP tracer");
|
|
143
|
+
FileTracer *ft = new IdrupTracer (this, file, opts.binary);
|
|
144
|
+
connect_proof_tracer (ft, true);
|
|
145
|
+
} else if (opts.lidrup) {
|
|
146
|
+
LOG ("PROOF connecting LIDRUP tracer");
|
|
147
|
+
FileTracer *ft = new LidrupTracer (this, file, opts.binary);
|
|
148
|
+
connect_proof_tracer (ft, true);
|
|
149
|
+
} else {
|
|
150
|
+
LOG ("PROOF connecting DRAT tracer");
|
|
151
|
+
FileTracer *ft = new DratTracer (this, file, opts.binary);
|
|
152
|
+
connect_proof_tracer (ft, false);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Enable proof checking.
|
|
157
|
+
|
|
158
|
+
void Internal::check () {
|
|
159
|
+
new_proof_on_demand ();
|
|
160
|
+
if (opts.checkproof > 1) {
|
|
161
|
+
StatTracer *lratchecker = new LratChecker (this);
|
|
162
|
+
DeferDeletePtr<LratChecker> delete_lratchecker (
|
|
163
|
+
(LratChecker *) lratchecker);
|
|
164
|
+
LOG ("PROOF connecting LRAT proof checker");
|
|
165
|
+
force_lrat ();
|
|
166
|
+
frat = true;
|
|
167
|
+
resize_unit_clauses_idx ();
|
|
168
|
+
proof->connect (lratchecker);
|
|
169
|
+
stat_tracers.push_back (lratchecker);
|
|
170
|
+
delete_lratchecker.release ();
|
|
171
|
+
}
|
|
172
|
+
if (opts.checkproof == 1 || opts.checkproof == 3) {
|
|
173
|
+
StatTracer *checker = new Checker (this);
|
|
174
|
+
DeferDeletePtr<Checker> delete_checker ((Checker *) checker);
|
|
175
|
+
LOG ("PROOF connecting proof checker");
|
|
176
|
+
proof->connect (checker);
|
|
177
|
+
stat_tracers.push_back (checker);
|
|
178
|
+
delete_checker.release ();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// We want to close a proof trace and stop checking as soon we are done.
|
|
183
|
+
|
|
184
|
+
void Internal::close_trace (bool print) {
|
|
185
|
+
for (auto &tracer : file_tracers)
|
|
186
|
+
tracer->close (print);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// We can flush a proof trace file before actually closing it.
|
|
190
|
+
|
|
191
|
+
void Internal::flush_trace (bool print) {
|
|
192
|
+
for (auto &tracer : file_tracers)
|
|
193
|
+
tracer->flush (print);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/*------------------------------------------------------------------------*/
|
|
197
|
+
|
|
198
|
+
Proof::Proof (Internal *s) : internal (s), witness (0) {
|
|
199
|
+
LOG ("PROOF new");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
Proof::~Proof () { LOG ("PROOF delete"); }
|
|
203
|
+
|
|
204
|
+
/*------------------------------------------------------------------------*/
|
|
205
|
+
|
|
206
|
+
inline void Proof::add_literal (int internal_lit) {
|
|
207
|
+
const int external_lit = internal->externalize (internal_lit);
|
|
208
|
+
clause.push_back (external_lit);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
inline void Proof::add_literals (Clause *c) {
|
|
212
|
+
for (auto const &lit : *c)
|
|
213
|
+
add_literal (lit);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
inline void Proof::add_literals (const vector<int> &c) {
|
|
217
|
+
for (auto const &lit : c)
|
|
218
|
+
add_literal (lit);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/*------------------------------------------------------------------------*/
|
|
222
|
+
|
|
223
|
+
void Proof::add_original_clause (int64_t id, bool r, const vector<int> &c) {
|
|
224
|
+
LOG (c, "PROOF adding original internal clause");
|
|
225
|
+
add_literals (c);
|
|
226
|
+
clause_id = id;
|
|
227
|
+
redundant = r;
|
|
228
|
+
add_original_clause ();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
void Proof::add_external_original_clause (int64_t id, bool r,
|
|
232
|
+
const vector<int> &c,
|
|
233
|
+
bool restore) {
|
|
234
|
+
// literals of c are already external
|
|
235
|
+
assert (clause.empty ());
|
|
236
|
+
for (auto const &lit : c)
|
|
237
|
+
clause.push_back (lit);
|
|
238
|
+
clause_id = id;
|
|
239
|
+
redundant = r;
|
|
240
|
+
add_original_clause (restore);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
void Proof::delete_external_original_clause (int64_t id, bool r,
|
|
244
|
+
const vector<int> &c) {
|
|
245
|
+
// literals of c are already external
|
|
246
|
+
assert (clause.empty ());
|
|
247
|
+
for (auto const &lit : c)
|
|
248
|
+
clause.push_back (lit);
|
|
249
|
+
clause_id = id;
|
|
250
|
+
redundant = r;
|
|
251
|
+
delete_clause ();
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
void Proof::add_derived_empty_clause (int64_t id,
|
|
255
|
+
const vector<int64_t> &chain) {
|
|
256
|
+
LOG ("PROOF adding empty clause");
|
|
257
|
+
assert (clause.empty ());
|
|
258
|
+
assert (proof_chain.empty ());
|
|
259
|
+
for (const auto &cid : chain)
|
|
260
|
+
proof_chain.push_back (cid);
|
|
261
|
+
clause_id = id;
|
|
262
|
+
redundant = false;
|
|
263
|
+
add_derived_clause ();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
void Proof::add_derived_unit_clause (int64_t id, int internal_unit,
|
|
267
|
+
const vector<int64_t> &chain) {
|
|
268
|
+
LOG ("PROOF adding unit clause %d", internal_unit);
|
|
269
|
+
assert (proof_chain.empty ());
|
|
270
|
+
assert (clause.empty ());
|
|
271
|
+
add_literal (internal_unit);
|
|
272
|
+
for (const auto &cid : chain)
|
|
273
|
+
proof_chain.push_back (cid);
|
|
274
|
+
clause_id = id;
|
|
275
|
+
redundant = false;
|
|
276
|
+
add_derived_clause ();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/*------------------------------------------------------------------------*/
|
|
280
|
+
|
|
281
|
+
void Proof::add_derived_clause (Clause *c, const vector<int64_t> &chain) {
|
|
282
|
+
LOG (c, "PROOF adding to proof derived");
|
|
283
|
+
assert (clause.empty ());
|
|
284
|
+
assert (proof_chain.empty ());
|
|
285
|
+
add_literals (c);
|
|
286
|
+
for (const auto &cid : chain)
|
|
287
|
+
proof_chain.push_back (cid);
|
|
288
|
+
clause_id = c->id;
|
|
289
|
+
redundant = c->redundant;
|
|
290
|
+
add_derived_clause ();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
void Proof::add_derived_rat_clause (Clause *c, int w,
|
|
294
|
+
const vector<int64_t> &chain) {
|
|
295
|
+
LOG (c, "PROOF adding to proof derived witness %d", w);
|
|
296
|
+
assert (clause.empty ());
|
|
297
|
+
assert (proof_chain.empty ());
|
|
298
|
+
add_literals (c);
|
|
299
|
+
for (const auto &cid : chain)
|
|
300
|
+
proof_chain.push_back (cid);
|
|
301
|
+
clause_id = c->id;
|
|
302
|
+
redundant = c->redundant;
|
|
303
|
+
witness = w;
|
|
304
|
+
add_derived_clause ();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
void Proof::add_derived_clause (int64_t id, bool r, const vector<int> &c,
|
|
308
|
+
const vector<int64_t> &chain) {
|
|
309
|
+
LOG (c, "PROOF adding derived clause");
|
|
310
|
+
assert (clause.empty ());
|
|
311
|
+
assert (proof_chain.empty ());
|
|
312
|
+
for (const auto &lit : c)
|
|
313
|
+
add_literal (lit);
|
|
314
|
+
for (const auto &cid : chain)
|
|
315
|
+
proof_chain.push_back (cid);
|
|
316
|
+
clause_id = id;
|
|
317
|
+
redundant = r;
|
|
318
|
+
add_derived_clause ();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
void Proof::add_derived_rat_clause (int64_t id, bool r, int l,
|
|
322
|
+
const vector<int> &c,
|
|
323
|
+
const vector<int64_t> &chain) {
|
|
324
|
+
LOG (c, "PROOF adding derived witness %d clause", l);
|
|
325
|
+
assert (clause.empty ());
|
|
326
|
+
assert (proof_chain.empty ());
|
|
327
|
+
for (const auto &lit : c)
|
|
328
|
+
add_literal (lit);
|
|
329
|
+
for (const auto &cid : chain)
|
|
330
|
+
proof_chain.push_back (cid);
|
|
331
|
+
clause_id = id;
|
|
332
|
+
redundant = r;
|
|
333
|
+
witness = l;
|
|
334
|
+
add_derived_clause ();
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
void Proof::add_assumption_clause (int64_t id, const vector<int> &c,
|
|
338
|
+
const vector<int64_t> &chain) {
|
|
339
|
+
// literals of c are already external
|
|
340
|
+
assert (clause.empty ());
|
|
341
|
+
assert (proof_chain.empty ());
|
|
342
|
+
for (const auto &lit : c)
|
|
343
|
+
clause.push_back (lit);
|
|
344
|
+
for (const auto &cid : chain)
|
|
345
|
+
proof_chain.push_back (cid);
|
|
346
|
+
clause_id = id;
|
|
347
|
+
add_assumption_clause ();
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
void Proof::add_assumption (int a) {
|
|
351
|
+
// a is already external
|
|
352
|
+
assert (clause.empty ());
|
|
353
|
+
assert (proof_chain.empty ());
|
|
354
|
+
clause.push_back (a);
|
|
355
|
+
add_assumption ();
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
void Proof::add_constraint (const vector<int> &c) {
|
|
359
|
+
// literals of c are already external
|
|
360
|
+
assert (clause.empty ());
|
|
361
|
+
assert (proof_chain.empty ());
|
|
362
|
+
for (const auto &lit : c)
|
|
363
|
+
clause.push_back (lit);
|
|
364
|
+
add_constraint ();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
void Proof::add_assumption_clause (int64_t id, int lit,
|
|
368
|
+
const vector<int64_t> &chain) {
|
|
369
|
+
assert (clause.empty ());
|
|
370
|
+
assert (proof_chain.empty ());
|
|
371
|
+
clause.push_back (lit);
|
|
372
|
+
for (const auto &cid : chain)
|
|
373
|
+
proof_chain.push_back (cid);
|
|
374
|
+
clause_id = id;
|
|
375
|
+
add_assumption_clause ();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
void Proof::delete_clause (Clause *c) {
|
|
379
|
+
LOG (c, "PROOF deleting from proof");
|
|
380
|
+
clause.clear (); // Can be non-empty if an allocation fails during adding.
|
|
381
|
+
add_literals (c);
|
|
382
|
+
clause_id = c->id;
|
|
383
|
+
redundant = c->redundant;
|
|
384
|
+
delete_clause (); // Increments 'statistics.deleted'.
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
void Proof::delete_clause (int64_t id, bool r, const vector<int> &c) {
|
|
388
|
+
LOG (c, "PROOF deleting from proof");
|
|
389
|
+
assert (clause.empty ());
|
|
390
|
+
add_literals (c);
|
|
391
|
+
clause_id = id;
|
|
392
|
+
redundant = r;
|
|
393
|
+
delete_clause (); // Increments 'statistics.deleted'.
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
void Proof::weaken_minus (Clause *c) {
|
|
397
|
+
LOG (c, "PROOF weaken minus of");
|
|
398
|
+
assert (clause.empty ());
|
|
399
|
+
add_literals (c);
|
|
400
|
+
clause_id = c->id;
|
|
401
|
+
weaken_minus ();
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
void Proof::weaken_minus (int64_t id, const vector<int> &c) {
|
|
405
|
+
LOG (c, "PROOF deleting from proof");
|
|
406
|
+
assert (clause.empty ());
|
|
407
|
+
add_literals (c);
|
|
408
|
+
clause_id = id;
|
|
409
|
+
weaken_minus ();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
void Proof::weaken_plus (Clause *c) {
|
|
413
|
+
weaken_minus (c);
|
|
414
|
+
delete_clause (c); // Increments 'statistics.deleted'.
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
void Proof::weaken_plus (int64_t id, const vector<int> &c) {
|
|
418
|
+
weaken_minus (id, c);
|
|
419
|
+
delete_clause (id, false, c); // Increments 'statistics.deleted'.
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
void Proof::delete_unit_clause (int64_t id, const int lit) {
|
|
423
|
+
LOG ("PROOF deleting unit from proof %d", lit);
|
|
424
|
+
assert (clause.empty ());
|
|
425
|
+
add_literal (lit);
|
|
426
|
+
clause_id = id;
|
|
427
|
+
redundant = false;
|
|
428
|
+
delete_clause ();
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
void Proof::finalize_clause (Clause *c) {
|
|
432
|
+
LOG (c, "PROOF finalizing clause");
|
|
433
|
+
assert (clause.empty ());
|
|
434
|
+
add_literals (c);
|
|
435
|
+
clause_id = c->id;
|
|
436
|
+
finalize_clause ();
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
void Proof::finalize_clause (int64_t id, const vector<int> &c) {
|
|
440
|
+
LOG (c, "PROOF finalizing clause");
|
|
441
|
+
assert (clause.empty ());
|
|
442
|
+
for (const auto &lit : c)
|
|
443
|
+
add_literal (lit);
|
|
444
|
+
clause_id = id;
|
|
445
|
+
finalize_clause ();
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
void Proof::finalize_unit (int64_t id, int lit) {
|
|
449
|
+
LOG ("PROOF finalizing clause %d", lit);
|
|
450
|
+
assert (clause.empty ());
|
|
451
|
+
add_literal (lit);
|
|
452
|
+
clause_id = id;
|
|
453
|
+
finalize_clause ();
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
void Proof::finalize_external_unit (int64_t id, int lit) {
|
|
457
|
+
LOG ("PROOF finalizing clause %d", lit);
|
|
458
|
+
assert (clause.empty ());
|
|
459
|
+
clause.push_back (lit);
|
|
460
|
+
clause_id = id;
|
|
461
|
+
finalize_clause ();
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/*------------------------------------------------------------------------*/
|
|
465
|
+
|
|
466
|
+
// During garbage collection clauses are shrunken by removing falsified
|
|
467
|
+
// literals. To avoid copying the clause, we provide a specialized tracing
|
|
468
|
+
// function here, which traces the required 'add' and 'remove' operations.
|
|
469
|
+
|
|
470
|
+
void Proof::flush_clause (Clause *c) {
|
|
471
|
+
LOG (c, "PROOF flushing falsified literals in");
|
|
472
|
+
assert (clause.empty ());
|
|
473
|
+
const bool antecedents = (internal->lrat || internal->frat);
|
|
474
|
+
for (int i = 0; i < c->size; i++) {
|
|
475
|
+
int internal_lit = c->literals[i];
|
|
476
|
+
if (internal->fixed (internal_lit) < 0) {
|
|
477
|
+
if (antecedents) {
|
|
478
|
+
int64_t id = internal->unit_id (-internal_lit);
|
|
479
|
+
proof_chain.push_back (id);
|
|
480
|
+
}
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
add_literal (internal_lit);
|
|
484
|
+
}
|
|
485
|
+
proof_chain.push_back (c->id);
|
|
486
|
+
redundant = c->redundant;
|
|
487
|
+
int64_t id = ++internal->clause_id;
|
|
488
|
+
clause_id = id;
|
|
489
|
+
add_derived_clause ();
|
|
490
|
+
delete_clause (c);
|
|
491
|
+
c->id = id;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// While strengthening clauses, e.g., through self-subsuming resolutions,
|
|
495
|
+
// during subsumption checking, we have a similar situation, except that we
|
|
496
|
+
// have to remove exactly one literal. Again the following function allows
|
|
497
|
+
// to avoid copying the clause and instead provides tracing of the required
|
|
498
|
+
// 'add' and 'remove' operations.
|
|
499
|
+
|
|
500
|
+
void Proof::strengthen_clause (Clause *c, int remove,
|
|
501
|
+
const vector<int64_t> &chain) {
|
|
502
|
+
LOG (c, "PROOF strengthen by removing %d in", remove);
|
|
503
|
+
assert (clause.empty ());
|
|
504
|
+
for (int i = 0; i < c->size; i++) {
|
|
505
|
+
int internal_lit = c->literals[i];
|
|
506
|
+
if (internal_lit == remove)
|
|
507
|
+
continue;
|
|
508
|
+
add_literal (internal_lit);
|
|
509
|
+
}
|
|
510
|
+
int64_t id = ++internal->clause_id;
|
|
511
|
+
clause_id = id;
|
|
512
|
+
redundant = c->redundant;
|
|
513
|
+
for (const auto &cid : chain)
|
|
514
|
+
proof_chain.push_back (cid);
|
|
515
|
+
add_derived_clause ();
|
|
516
|
+
delete_clause (c);
|
|
517
|
+
c->id = id;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
void Proof::otfs_strengthen_clause (Clause *c, const std::vector<int> &old,
|
|
521
|
+
const vector<int64_t> &chain) {
|
|
522
|
+
LOG (c, "PROOF otfs strengthen");
|
|
523
|
+
assert (clause.empty ());
|
|
524
|
+
for (int i = 0; i < c->size; i++) {
|
|
525
|
+
int internal_lit = c->literals[i];
|
|
526
|
+
add_literal (internal_lit);
|
|
527
|
+
}
|
|
528
|
+
int64_t id = ++internal->clause_id;
|
|
529
|
+
clause_id = id;
|
|
530
|
+
redundant = c->redundant;
|
|
531
|
+
for (const auto &cid : chain)
|
|
532
|
+
proof_chain.push_back (cid);
|
|
533
|
+
add_derived_clause ();
|
|
534
|
+
delete_clause (c->id, c->redundant, old);
|
|
535
|
+
c->id = id;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
void Proof::strengthen (int64_t id) {
|
|
539
|
+
clause_id = id;
|
|
540
|
+
strengthen ();
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/*------------------------------------------------------------------------*/
|
|
544
|
+
|
|
545
|
+
void Proof::add_original_clause (bool restore) {
|
|
546
|
+
LOG (clause, "PROOF adding original external clause");
|
|
547
|
+
assert (clause_id);
|
|
548
|
+
|
|
549
|
+
for (auto &tracer : tracers) {
|
|
550
|
+
tracer->add_original_clause (clause_id, false, clause, restore);
|
|
551
|
+
}
|
|
552
|
+
clause.clear ();
|
|
553
|
+
clause_id = 0;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
void Proof::add_derived_clause () {
|
|
557
|
+
LOG (clause, "PROOF adding derived external clause (redundant: %d)",
|
|
558
|
+
redundant);
|
|
559
|
+
assert (clause_id);
|
|
560
|
+
for (auto &tracer : tracers) {
|
|
561
|
+
tracer->add_derived_clause (clause_id, redundant, witness, clause,
|
|
562
|
+
proof_chain);
|
|
563
|
+
}
|
|
564
|
+
proof_chain.clear ();
|
|
565
|
+
clause.clear ();
|
|
566
|
+
clause_id = 0;
|
|
567
|
+
witness = 0;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
void Proof::delete_clause () {
|
|
571
|
+
LOG (clause, "PROOF deleting external clause");
|
|
572
|
+
for (auto &tracer : tracers) {
|
|
573
|
+
tracer->delete_clause (clause_id, redundant, clause);
|
|
574
|
+
}
|
|
575
|
+
clause.clear ();
|
|
576
|
+
clause_id = 0;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
void Proof::demote_clause () {
|
|
580
|
+
LOG (clause, "PROOF demoting external clause");
|
|
581
|
+
assert (!redundant);
|
|
582
|
+
for (auto &tracer : tracers) {
|
|
583
|
+
tracer->demote_clause (clause_id, clause);
|
|
584
|
+
}
|
|
585
|
+
clause.clear ();
|
|
586
|
+
clause_id = 0;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
void Proof::weaken_minus () {
|
|
590
|
+
LOG (clause, "PROOF marking as clause to restore");
|
|
591
|
+
for (auto &tracer : tracers) {
|
|
592
|
+
tracer->weaken_minus (clause_id, clause);
|
|
593
|
+
}
|
|
594
|
+
clause.clear ();
|
|
595
|
+
clause_id = 0;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
void Proof::strengthen () {
|
|
599
|
+
LOG ("PROOF strengthen clause with id %" PRId64, clause_id);
|
|
600
|
+
for (auto &tracer : tracers) {
|
|
601
|
+
tracer->strengthen (clause_id);
|
|
602
|
+
}
|
|
603
|
+
clause_id = 0;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
void Proof::finalize_clause () {
|
|
607
|
+
for (auto &tracer : tracers) {
|
|
608
|
+
tracer->finalize_clause (clause_id, clause);
|
|
609
|
+
}
|
|
610
|
+
clause.clear ();
|
|
611
|
+
clause_id = 0;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
void Proof::add_assumption_clause () {
|
|
615
|
+
LOG (clause, "PROOF adding assumption clause");
|
|
616
|
+
for (auto &tracer : tracers) {
|
|
617
|
+
tracer->add_assumption_clause (clause_id, clause, proof_chain);
|
|
618
|
+
}
|
|
619
|
+
proof_chain.clear ();
|
|
620
|
+
clause.clear ();
|
|
621
|
+
clause_id = 0;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
void Proof::add_assumption () {
|
|
625
|
+
LOG (clause, "PROOF adding assumption");
|
|
626
|
+
assert (clause.size () == 1);
|
|
627
|
+
for (auto &tracer : tracers) {
|
|
628
|
+
tracer->add_assumption (clause.back ());
|
|
629
|
+
}
|
|
630
|
+
clause.clear ();
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
void Proof::add_constraint () {
|
|
634
|
+
LOG (clause, "PROOF adding constraint");
|
|
635
|
+
for (auto &tracer : tracers) {
|
|
636
|
+
tracer->add_constraint (clause);
|
|
637
|
+
}
|
|
638
|
+
clause.clear ();
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
void Proof::reset_assumptions () {
|
|
642
|
+
LOG ("PROOF reset assumptions");
|
|
643
|
+
for (auto &tracer : tracers) {
|
|
644
|
+
tracer->reset_assumptions ();
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
void Proof::report_status (int status, int64_t id) {
|
|
649
|
+
LOG ("PROOF reporting status %d", status);
|
|
650
|
+
for (auto &tracer : tracers) {
|
|
651
|
+
tracer->report_status (status, id);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
void Proof::begin_proof (int64_t id) {
|
|
656
|
+
LOG (clause, "PROOF begin proof");
|
|
657
|
+
for (auto &tracer : tracers) {
|
|
658
|
+
tracer->begin_proof (id);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
void Proof::solve_query () {
|
|
663
|
+
LOG (clause, "PROOF solve query");
|
|
664
|
+
for (auto &tracer : tracers) {
|
|
665
|
+
tracer->solve_query ();
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
void Proof::conclude_unsat (ConclusionType con,
|
|
670
|
+
const vector<int64_t> &conclusion) {
|
|
671
|
+
LOG (clause, "PROOF conclude unsat");
|
|
672
|
+
for (auto &tracer : tracers) {
|
|
673
|
+
tracer->conclude_unsat (con, conclusion);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
void Proof::conclude_sat (const vector<int> &model) {
|
|
678
|
+
LOG (clause, "PROOF conclude sat");
|
|
679
|
+
for (auto &tracer : tracers) {
|
|
680
|
+
tracer->conclude_sat (model);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
void Proof::conclude_unknown (const vector<int> &trail) {
|
|
685
|
+
LOG (clause, "PROOF conclude unknown");
|
|
686
|
+
for (auto &tracer : tracers) {
|
|
687
|
+
tracer->conclude_unknown (trail);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
} // namespace CaDiCaL
|