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,129 @@
|
|
|
1
|
+
#include "internal.hpp"
|
|
2
|
+
|
|
3
|
+
namespace CaDiCaL {
|
|
4
|
+
|
|
5
|
+
/*------------------------------------------------------------------------*/
|
|
6
|
+
|
|
7
|
+
bool parse_int_str (const char *val_str, int &val) {
|
|
8
|
+
if (!strcmp (val_str, "true"))
|
|
9
|
+
val = 1;
|
|
10
|
+
else if (!strcmp (val_str, "false"))
|
|
11
|
+
val = 0;
|
|
12
|
+
else {
|
|
13
|
+
const char *p = val_str;
|
|
14
|
+
int sign;
|
|
15
|
+
|
|
16
|
+
if (*p == '-')
|
|
17
|
+
sign = -1, p++;
|
|
18
|
+
else
|
|
19
|
+
sign = 1;
|
|
20
|
+
|
|
21
|
+
int ch;
|
|
22
|
+
if (!isdigit ((ch = *p++)))
|
|
23
|
+
return false;
|
|
24
|
+
|
|
25
|
+
const int64_t bound = -(int64_t) INT_MIN;
|
|
26
|
+
int64_t mantissa = ch - '0';
|
|
27
|
+
|
|
28
|
+
while (isdigit (ch = *p++)) {
|
|
29
|
+
if (bound / 10 < mantissa)
|
|
30
|
+
mantissa = bound;
|
|
31
|
+
else
|
|
32
|
+
mantissa *= 10;
|
|
33
|
+
const int digit = ch - '0';
|
|
34
|
+
if (bound - digit < mantissa)
|
|
35
|
+
mantissa = bound;
|
|
36
|
+
else
|
|
37
|
+
mantissa += digit;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
int exponent = 0;
|
|
41
|
+
if (ch == 'e') {
|
|
42
|
+
while (isdigit ((ch = *p++)))
|
|
43
|
+
exponent = exponent ? 10 : ch - '0';
|
|
44
|
+
if (ch)
|
|
45
|
+
return false;
|
|
46
|
+
} else if (ch)
|
|
47
|
+
return false;
|
|
48
|
+
|
|
49
|
+
assert (exponent <= 10);
|
|
50
|
+
int64_t val64 = mantissa;
|
|
51
|
+
for (int i = 0; i < exponent; i++)
|
|
52
|
+
val64 *= 10;
|
|
53
|
+
|
|
54
|
+
if (sign < 0) {
|
|
55
|
+
val64 = -val64;
|
|
56
|
+
if (val64 < INT_MIN)
|
|
57
|
+
val64 = INT_MIN;
|
|
58
|
+
} else {
|
|
59
|
+
if (val64 > INT_MAX)
|
|
60
|
+
val64 = INT_MAX;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
assert (INT_MIN <= val64);
|
|
64
|
+
assert (val64 <= INT_MAX);
|
|
65
|
+
|
|
66
|
+
val = val64;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/*------------------------------------------------------------------------*/
|
|
72
|
+
|
|
73
|
+
bool has_suffix (const char *str, const char *suffix) {
|
|
74
|
+
size_t k = strlen (str), l = strlen (suffix);
|
|
75
|
+
return k > l && !strcmp (str + k - l, suffix);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
bool has_prefix (const char *str, const char *prefix) {
|
|
79
|
+
for (const char *p = str, *q = prefix; *q; q++, p++)
|
|
80
|
+
if (*q != *p)
|
|
81
|
+
return false;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/*------------------------------------------------------------------------*/
|
|
86
|
+
|
|
87
|
+
bool is_color_option (const char *arg) {
|
|
88
|
+
return !strcmp (arg, "--color") || !strcmp (arg, "--colors") ||
|
|
89
|
+
!strcmp (arg, "--colour") || !strcmp (arg, "--colours") ||
|
|
90
|
+
!strcmp (arg, "--color=1") || !strcmp (arg, "--colors=1") ||
|
|
91
|
+
!strcmp (arg, "--colour=1") || !strcmp (arg, "--colours=1") ||
|
|
92
|
+
!strcmp (arg, "--color=true") || !strcmp (arg, "--colors=true") ||
|
|
93
|
+
!strcmp (arg, "--colour=true") || !strcmp (arg, "--colours=true");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
bool is_no_color_option (const char *arg) {
|
|
97
|
+
return !strcmp (arg, "--no-color") || !strcmp (arg, "--no-colors") ||
|
|
98
|
+
!strcmp (arg, "--no-colour") || !strcmp (arg, "--no-colours") ||
|
|
99
|
+
!strcmp (arg, "--color=0") || !strcmp (arg, "--colors=0") ||
|
|
100
|
+
!strcmp (arg, "--colour=0") || !strcmp (arg, "--colours=0") ||
|
|
101
|
+
!strcmp (arg, "--color=false") ||
|
|
102
|
+
!strcmp (arg, "--colors=false") ||
|
|
103
|
+
!strcmp (arg, "--colour=false") ||
|
|
104
|
+
!strcmp (arg, "--colours=false");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/*------------------------------------------------------------------------*/
|
|
108
|
+
|
|
109
|
+
static uint64_t primes[] = {
|
|
110
|
+
1111111111111111111lu, 2222222222222222249lu, 3333333333333333347lu,
|
|
111
|
+
4444444444444444537lu, 5555555555555555621lu, 6666666666666666677lu,
|
|
112
|
+
7777777777777777793lu, 8888888888888888923lu, 9999999999999999961lu,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
uint64_t hash_string (const char *str) {
|
|
116
|
+
const unsigned size = sizeof primes / sizeof *primes;
|
|
117
|
+
uint64_t res = 0;
|
|
118
|
+
unsigned char ch;
|
|
119
|
+
unsigned i = 0;
|
|
120
|
+
for (const char *p = str; (ch = *p); p++) {
|
|
121
|
+
res += ch;
|
|
122
|
+
res *= primes[i++];
|
|
123
|
+
if (i == size)
|
|
124
|
+
i = 0;
|
|
125
|
+
}
|
|
126
|
+
return res;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
} // namespace CaDiCaL
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
#ifndef _util_hpp_INCLUDED
|
|
2
|
+
#define _util_hpp_INCLUDED
|
|
3
|
+
|
|
4
|
+
#include <cassert>
|
|
5
|
+
#include <cstdint>
|
|
6
|
+
#include <vector>
|
|
7
|
+
|
|
8
|
+
namespace CaDiCaL {
|
|
9
|
+
|
|
10
|
+
using namespace std;
|
|
11
|
+
|
|
12
|
+
// Common simple utility functions independent from 'Internal'.
|
|
13
|
+
|
|
14
|
+
/*------------------------------------------------------------------------*/
|
|
15
|
+
|
|
16
|
+
inline double relative (double a, double b) { return b ? a / b : 0; }
|
|
17
|
+
inline double percent (double a, double b) { return relative (100 * a, b); }
|
|
18
|
+
inline int sign (int lit) { return (lit > 0) - (lit < 0); }
|
|
19
|
+
inline unsigned bign (int lit) { return 1 + (lit < 0); }
|
|
20
|
+
|
|
21
|
+
/*------------------------------------------------------------------------*/
|
|
22
|
+
|
|
23
|
+
bool has_suffix (const char *str, const char *suffix);
|
|
24
|
+
bool has_prefix (const char *str, const char *prefix);
|
|
25
|
+
|
|
26
|
+
/*------------------------------------------------------------------------*/
|
|
27
|
+
|
|
28
|
+
// Parse integer string in the form of
|
|
29
|
+
//
|
|
30
|
+
// true
|
|
31
|
+
// false
|
|
32
|
+
// [-]<mantissa>[e<exponent>]
|
|
33
|
+
//
|
|
34
|
+
// and in the latter case '<val>' has to be within [-INT_MAX,INT_MAX].
|
|
35
|
+
//
|
|
36
|
+
// The function returns true if parsing is successful and then also sets
|
|
37
|
+
// the second argument to the parsed value.
|
|
38
|
+
|
|
39
|
+
bool parse_int_str (const char *str, int &);
|
|
40
|
+
|
|
41
|
+
/*------------------------------------------------------------------------*/
|
|
42
|
+
|
|
43
|
+
inline bool is_power_of_two (unsigned n) { return n && !(n & (n - 1)); }
|
|
44
|
+
|
|
45
|
+
inline bool contained (int64_t c, int64_t l, int64_t u) {
|
|
46
|
+
return l <= c && c <= u;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
inline bool aligned (size_t n, size_t alignment) {
|
|
50
|
+
assert (is_power_of_two (alignment));
|
|
51
|
+
const size_t mask = alignment - 1;
|
|
52
|
+
return !(n & mask);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
inline size_t align (size_t n, size_t alignment) {
|
|
56
|
+
size_t res = n;
|
|
57
|
+
assert (is_power_of_two (alignment));
|
|
58
|
+
const size_t mask = alignment - 1;
|
|
59
|
+
if (res & mask)
|
|
60
|
+
res = (res | mask) + 1;
|
|
61
|
+
assert (aligned (res, alignment));
|
|
62
|
+
return res;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/*------------------------------------------------------------------------*/
|
|
66
|
+
|
|
67
|
+
inline bool parity (unsigned a) {
|
|
68
|
+
assert (sizeof a == 4);
|
|
69
|
+
unsigned tmp = a;
|
|
70
|
+
tmp ^= (tmp >> 16);
|
|
71
|
+
tmp ^= (tmp >> 8);
|
|
72
|
+
tmp ^= (tmp >> 4);
|
|
73
|
+
tmp ^= (tmp >> 2);
|
|
74
|
+
tmp ^= (tmp >> 1);
|
|
75
|
+
return tmp & 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/*------------------------------------------------------------------------*/
|
|
79
|
+
|
|
80
|
+
// The standard 'Effective STL' way (though not guaranteed) to clear a
|
|
81
|
+
// vector and reduce its capacity to zero, thus deallocating all its
|
|
82
|
+
// internal memory. This is quite important for keeping the actual
|
|
83
|
+
// allocated size of watched and occurrence lists small particularly during
|
|
84
|
+
// bounded variable elimination where many clauses are added and removed.
|
|
85
|
+
|
|
86
|
+
template <class T> void erase_vector (std::vector<T> &v) {
|
|
87
|
+
if (v.capacity ()) {
|
|
88
|
+
std::vector<T> ().swap (v);
|
|
89
|
+
}
|
|
90
|
+
assert (!v.capacity ()); // not guaranteed though
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The standard 'Effective STL' way (though not guaranteed) to shrink the
|
|
94
|
+
// capacity of a vector to its size thus kind of releasing all the internal
|
|
95
|
+
// excess memory not needed at the moment any more.
|
|
96
|
+
|
|
97
|
+
template <class T> void shrink_vector (std::vector<T> &v) {
|
|
98
|
+
if (v.capacity () > v.size ()) {
|
|
99
|
+
std::vector<T> (v).swap (v);
|
|
100
|
+
}
|
|
101
|
+
assert (v.capacity () == v.size ()); // not guaranteed though
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
template <class T>
|
|
105
|
+
static void enlarge_init (vector<T> &v, size_t N, const T &i) {
|
|
106
|
+
if (v.size () < N)
|
|
107
|
+
v.resize (N, i);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
template <class T> static void enlarge_only (vector<T> &v, size_t N) {
|
|
111
|
+
if (v.size () < N)
|
|
112
|
+
v.resize (N, T ());
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
template <class T> static void enlarge_zero (vector<T> &v, size_t N) {
|
|
116
|
+
enlarge_init (v, N, (const T &) 0);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// double the capacity until it fits. This is different from reserve
|
|
120
|
+
// that will allocate exactly the size requested, meaning that the
|
|
121
|
+
// amortized complexity is lost.
|
|
122
|
+
template <class T> static void reserve_at_least (vector<T> &v, size_t N) {
|
|
123
|
+
if (N < v.capacity ())
|
|
124
|
+
return;
|
|
125
|
+
size_t new_size = v.size ();
|
|
126
|
+
if (!new_size)
|
|
127
|
+
new_size = N;
|
|
128
|
+
while (new_size < N)
|
|
129
|
+
new_size *= 2;
|
|
130
|
+
v.reserve (new_size);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Clean-up class for bad_alloc error safety.
|
|
134
|
+
|
|
135
|
+
template <typename T> struct DeferDeleteArray {
|
|
136
|
+
T *data;
|
|
137
|
+
DeferDeleteArray (T *t) : data (t) {}
|
|
138
|
+
~DeferDeleteArray () { delete[] data; }
|
|
139
|
+
void release () { data = nullptr; }
|
|
140
|
+
void free () {
|
|
141
|
+
delete[] data;
|
|
142
|
+
data = nullptr;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
template <typename T> struct DeferDeletePtr {
|
|
147
|
+
T *data;
|
|
148
|
+
DeferDeletePtr (T *t) : data (t) {}
|
|
149
|
+
~DeferDeletePtr () { delete data; }
|
|
150
|
+
void release () { data = nullptr; }
|
|
151
|
+
void free () {
|
|
152
|
+
delete data;
|
|
153
|
+
data = nullptr;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/*------------------------------------------------------------------------*/
|
|
158
|
+
|
|
159
|
+
template <class T> inline void clear_n (T *base, size_t n) {
|
|
160
|
+
memset (base, 0, sizeof (T) * n);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/*------------------------------------------------------------------------*/
|
|
164
|
+
|
|
165
|
+
// These are options both to 'cadical' and 'mobical'. After wasting some
|
|
166
|
+
// on not remembering the spelling (British vs American), nor singular vs
|
|
167
|
+
// plural and then wanted to use '--color=false', and '--colours=0' too, I
|
|
168
|
+
// just factored this out into these two utility functions.
|
|
169
|
+
|
|
170
|
+
bool is_color_option (const char *arg); // --color, --colour, ...
|
|
171
|
+
bool is_no_color_option (const char *arg); // --no-color, --no-colour, ...
|
|
172
|
+
|
|
173
|
+
/*------------------------------------------------------------------------*/
|
|
174
|
+
|
|
175
|
+
uint64_t hash_string (const char *str);
|
|
176
|
+
|
|
177
|
+
/*------------------------------------------------------------------------*/
|
|
178
|
+
|
|
179
|
+
} // namespace CaDiCaL
|
|
180
|
+
|
|
181
|
+
#endif
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#include "internal.hpp"
|
|
2
|
+
|
|
3
|
+
namespace CaDiCaL {
|
|
4
|
+
|
|
5
|
+
void Internal::reset_subsume_bits () {
|
|
6
|
+
LOG ("marking all variables as not subsume");
|
|
7
|
+
for (auto idx : vars)
|
|
8
|
+
flags (idx).subsume = false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
void Internal::check_var_stats () {
|
|
12
|
+
#ifndef NDEBUG
|
|
13
|
+
int64_t fixed = 0, eliminated = 0, substituted = 0, pure = 0, unused = 0;
|
|
14
|
+
for (auto idx : vars) {
|
|
15
|
+
Flags &f = flags (idx);
|
|
16
|
+
if (f.active ())
|
|
17
|
+
continue;
|
|
18
|
+
if (f.fixed ())
|
|
19
|
+
fixed++;
|
|
20
|
+
if (f.eliminated ())
|
|
21
|
+
eliminated++;
|
|
22
|
+
if (f.substituted ())
|
|
23
|
+
substituted++;
|
|
24
|
+
if (f.unused ())
|
|
25
|
+
unused++;
|
|
26
|
+
if (f.pure ())
|
|
27
|
+
pure++;
|
|
28
|
+
}
|
|
29
|
+
assert (stats.now.fixed == fixed);
|
|
30
|
+
assert (stats.now.eliminated == eliminated);
|
|
31
|
+
assert (stats.now.substituted == substituted);
|
|
32
|
+
assert (stats.now.pure == pure);
|
|
33
|
+
int64_t inactive = unused + fixed + eliminated + substituted + pure;
|
|
34
|
+
assert (stats.inactive == inactive);
|
|
35
|
+
assert (max_var == stats.active + stats.inactive);
|
|
36
|
+
#endif
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
} // namespace CaDiCaL
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#ifndef _var_hpp_INCLUDED
|
|
2
|
+
#define _var_hpp_INCLUDED
|
|
3
|
+
|
|
4
|
+
namespace CaDiCaL {
|
|
5
|
+
|
|
6
|
+
struct Clause;
|
|
7
|
+
|
|
8
|
+
// This structure captures data associated with an assigned variable.
|
|
9
|
+
|
|
10
|
+
struct Var {
|
|
11
|
+
|
|
12
|
+
// Note that none of these members is valid unless the variable is
|
|
13
|
+
// assigned. During unassigning a variable we do not reset it.
|
|
14
|
+
|
|
15
|
+
int level; // decision level
|
|
16
|
+
int trail; // trail height at assignment
|
|
17
|
+
Clause *reason; // implication graph edge during search
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
} // namespace CaDiCaL
|
|
21
|
+
|
|
22
|
+
#endif
|