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,122 @@
|
|
|
1
|
+
#ifndef _lidruptracer_h_INCLUDED
|
|
2
|
+
#define _lidruptracer_h_INCLUDED
|
|
3
|
+
|
|
4
|
+
#include "file.hpp"
|
|
5
|
+
#include "tracer.hpp"
|
|
6
|
+
|
|
7
|
+
namespace CaDiCaL {
|
|
8
|
+
|
|
9
|
+
struct LidrupClause {
|
|
10
|
+
LidrupClause *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
|
+
std::vector<int64_t> chain;
|
|
14
|
+
std::vector<int> literals;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
class LidrupTracer : 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
|
+
LidrupClause **clauses; // hash table of clauses
|
|
29
|
+
std::vector<int> imported_clause;
|
|
30
|
+
std::vector<int> assumptions;
|
|
31
|
+
std::vector<int64_t> imported_chain;
|
|
32
|
+
std::vector<int64_t> batch_weaken;
|
|
33
|
+
std::vector<int64_t> batch_delete;
|
|
34
|
+
std::vector<int64_t> batch_restore;
|
|
35
|
+
|
|
36
|
+
static const unsigned num_nonces = 4;
|
|
37
|
+
|
|
38
|
+
uint64_t nonces[num_nonces]; // random numbers for hashing
|
|
39
|
+
uint64_t last_hash; // last computed hash value of clause
|
|
40
|
+
int64_t last_id; // id of the last added clause
|
|
41
|
+
LidrupClause *last_clause;
|
|
42
|
+
uint64_t compute_hash (int64_t); // compute and save hash value of clause
|
|
43
|
+
|
|
44
|
+
LidrupClause *new_clause ();
|
|
45
|
+
void delete_clause (LidrupClause *);
|
|
46
|
+
|
|
47
|
+
static uint64_t reduce_hash (uint64_t hash, uint64_t size);
|
|
48
|
+
|
|
49
|
+
void enlarge_clauses (); // enlarge hash table for clauses
|
|
50
|
+
void insert (); // insert clause in hash table
|
|
51
|
+
bool
|
|
52
|
+
find_and_delete (const int64_t); // find clause position in hash table
|
|
53
|
+
|
|
54
|
+
#ifndef QUIET
|
|
55
|
+
int64_t added, deleted, weakened, restore, original, solved, batched;
|
|
56
|
+
#endif
|
|
57
|
+
|
|
58
|
+
void flush_if_piping ();
|
|
59
|
+
|
|
60
|
+
void put_binary_zero ();
|
|
61
|
+
void put_binary_lit (int external_lit);
|
|
62
|
+
void put_binary_id (int64_t id, bool = true);
|
|
63
|
+
|
|
64
|
+
void lidrup_add_derived_clause (int64_t id,
|
|
65
|
+
const std::vector<int> &clause,
|
|
66
|
+
const std::vector<int64_t> &chain);
|
|
67
|
+
void
|
|
68
|
+
lidrup_delete_clause (int64_t id); //, const std::vector<int> &clause);
|
|
69
|
+
void lidrup_add_restored_clause (
|
|
70
|
+
int64_t id); //, const std::vector<int> &clause);
|
|
71
|
+
void lidrup_add_original_clause (int64_t id,
|
|
72
|
+
const std::vector<int> &clause);
|
|
73
|
+
void lidrup_conclude_and_delete (const std::vector<int64_t> &conclusion);
|
|
74
|
+
void lidrup_report_status (int status);
|
|
75
|
+
void lidrup_conclude_sat (const std::vector<int> &model);
|
|
76
|
+
void lidrup_conclude_unknown (const std::vector<int> &trail);
|
|
77
|
+
void lidrup_solve_query ();
|
|
78
|
+
void lidrup_batch_weaken_restore_and_delete ();
|
|
79
|
+
|
|
80
|
+
public:
|
|
81
|
+
LidrupTracer (Internal *, File *file, bool);
|
|
82
|
+
~LidrupTracer ();
|
|
83
|
+
|
|
84
|
+
// proof section:
|
|
85
|
+
void add_derived_clause (int64_t, bool, int, const std::vector<int> &,
|
|
86
|
+
const std::vector<int64_t> &) override;
|
|
87
|
+
void add_assumption_clause (int64_t, const std::vector<int> &,
|
|
88
|
+
const std::vector<int64_t> &) override;
|
|
89
|
+
void weaken_minus (int64_t, const std::vector<int> &) override;
|
|
90
|
+
void delete_clause (int64_t, bool, const std::vector<int> &) override;
|
|
91
|
+
void add_original_clause (int64_t, bool, const std::vector<int> &,
|
|
92
|
+
bool = false) override;
|
|
93
|
+
void report_status (int, int64_t) override;
|
|
94
|
+
void conclude_sat (const std::vector<int> &) override;
|
|
95
|
+
void conclude_unsat (ConclusionType,
|
|
96
|
+
const std::vector<int64_t> &) override;
|
|
97
|
+
void conclude_unknown (const std::vector<int> &) override;
|
|
98
|
+
|
|
99
|
+
void solve_query () override;
|
|
100
|
+
void add_assumption (int) override;
|
|
101
|
+
void reset_assumptions () override;
|
|
102
|
+
|
|
103
|
+
// skip
|
|
104
|
+
void begin_proof (int64_t) override {}
|
|
105
|
+
void finalize_clause (int64_t, const std::vector<int> &) override {}
|
|
106
|
+
void strengthen (int64_t) override {}
|
|
107
|
+
void add_constraint (const std::vector<int> &) override {}
|
|
108
|
+
|
|
109
|
+
// logging and file io
|
|
110
|
+
void connect_internal (Internal *i) override;
|
|
111
|
+
|
|
112
|
+
#ifndef QUIET
|
|
113
|
+
void print_statistics ();
|
|
114
|
+
#endif
|
|
115
|
+
bool closed () override;
|
|
116
|
+
void close (bool) override;
|
|
117
|
+
void flush (bool) override;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
} // namespace CaDiCaL
|
|
121
|
+
|
|
122
|
+
#endif
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#include "internal.hpp"
|
|
2
|
+
|
|
3
|
+
namespace CaDiCaL {
|
|
4
|
+
|
|
5
|
+
Limit::Limit () { memset (this, 0, sizeof *this); }
|
|
6
|
+
|
|
7
|
+
/*------------------------------------------------------------------------*/
|
|
8
|
+
|
|
9
|
+
double Internal::scale (double v) const {
|
|
10
|
+
const double ratio = clause_variable_ratio ();
|
|
11
|
+
const double factor = (ratio <= 2) ? 1.0 : log (ratio) / log (2);
|
|
12
|
+
double res = factor * v;
|
|
13
|
+
if (res < 1)
|
|
14
|
+
res = 1;
|
|
15
|
+
return res;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/*------------------------------------------------------------------------*/
|
|
19
|
+
|
|
20
|
+
Last::Last () { memset (this, 0, sizeof *this); }
|
|
21
|
+
|
|
22
|
+
/*------------------------------------------------------------------------*/
|
|
23
|
+
|
|
24
|
+
Inc::Inc () {
|
|
25
|
+
memset (this, 0, sizeof *this);
|
|
26
|
+
ticks = decisions = conflicts = -1; // unlimited
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void Internal::limit_terminate (int l) {
|
|
30
|
+
if (l <= 0 && !lim.terminate.forced) {
|
|
31
|
+
LOG ("keeping unbounded terminate limit");
|
|
32
|
+
} else if (l <= 0) {
|
|
33
|
+
LOG ("reset terminate limit to be unbounded");
|
|
34
|
+
lim.terminate.forced = 0;
|
|
35
|
+
} else {
|
|
36
|
+
lim.terminate.forced = l;
|
|
37
|
+
LOG ("new terminate limit of %d calls", l);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
void Internal::limit_conflicts (int l) {
|
|
42
|
+
if (l < 0 && inc.conflicts < 0) {
|
|
43
|
+
LOG ("keeping unbounded conflict limit");
|
|
44
|
+
} else if (l < 0) {
|
|
45
|
+
LOG ("reset conflict limit to be unbounded");
|
|
46
|
+
inc.conflicts = -1;
|
|
47
|
+
} else {
|
|
48
|
+
inc.conflicts = l;
|
|
49
|
+
LOG ("new conflict limit of %d conflicts", l);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
void Internal::limit_decisions (int l) {
|
|
54
|
+
if (l < 0 && inc.decisions < 0) {
|
|
55
|
+
LOG ("keeping unbounded decision limit");
|
|
56
|
+
} else if (l < 0) {
|
|
57
|
+
LOG ("reset decision limit to be unbounded");
|
|
58
|
+
inc.decisions = -1;
|
|
59
|
+
} else {
|
|
60
|
+
inc.decisions = l;
|
|
61
|
+
LOG ("new decision limit of %d decisions", l);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
void Internal::limit_ticks (int64_t l) {
|
|
66
|
+
if (l < 0 && inc.ticks < 0) {
|
|
67
|
+
LOG ("keeping unbounded ticks limit");
|
|
68
|
+
} else if (l < 0) {
|
|
69
|
+
LOG ("reset ticks limit to be unbounded");
|
|
70
|
+
inc.ticks = -1;
|
|
71
|
+
} else {
|
|
72
|
+
inc.ticks = l;
|
|
73
|
+
LOG ("new ticks limit of %" PRId64 " ticks", l);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
void Internal::limit_preprocessing (int l) {
|
|
78
|
+
if (l < 0) {
|
|
79
|
+
LOG ("ignoring invalid preprocessing limit %d", l);
|
|
80
|
+
} else if (!l) {
|
|
81
|
+
LOG ("reset preprocessing limit to no preprocessing");
|
|
82
|
+
inc.preprocessing = 0;
|
|
83
|
+
} else {
|
|
84
|
+
inc.preprocessing = l;
|
|
85
|
+
LOG ("new preprocessing limit of %d preprocessing rounds", l);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
void Internal::limit_local_search (int l) {
|
|
90
|
+
if (l < 0) {
|
|
91
|
+
LOG ("ignoring invalid local search limit %d", l);
|
|
92
|
+
} else if (!l) {
|
|
93
|
+
LOG ("reset local search limit to no local search");
|
|
94
|
+
inc.localsearch = 0;
|
|
95
|
+
} else {
|
|
96
|
+
inc.localsearch = l;
|
|
97
|
+
LOG ("new local search limit of %d local search rounds", l);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
bool Internal::is_valid_limit (const char *name) {
|
|
102
|
+
if (!strcmp (name, "terminate"))
|
|
103
|
+
return true;
|
|
104
|
+
if (!strcmp (name, "conflicts"))
|
|
105
|
+
return true;
|
|
106
|
+
if (!strcmp (name, "decisions"))
|
|
107
|
+
return true;
|
|
108
|
+
if (!strcmp (name, "preprocessing"))
|
|
109
|
+
return true;
|
|
110
|
+
if (!strcmp (name, "localsearch"))
|
|
111
|
+
return true;
|
|
112
|
+
if (!strcmp (name, "ticks"))
|
|
113
|
+
return true;
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
bool Internal::limit (const char *name, int l) {
|
|
118
|
+
bool res = true;
|
|
119
|
+
if (!strcmp (name, "terminate"))
|
|
120
|
+
limit_terminate (l);
|
|
121
|
+
else if (!strcmp (name, "conflicts"))
|
|
122
|
+
limit_conflicts (l);
|
|
123
|
+
else if (!strcmp (name, "decisions"))
|
|
124
|
+
limit_decisions (l);
|
|
125
|
+
else if (!strcmp (name, "preprocessing"))
|
|
126
|
+
limit_preprocessing (l);
|
|
127
|
+
else if (!strcmp (name, "localsearch"))
|
|
128
|
+
limit_local_search (l);
|
|
129
|
+
else if (!strcmp (name, "ticks"))
|
|
130
|
+
limit_ticks (l);
|
|
131
|
+
else
|
|
132
|
+
res = false;
|
|
133
|
+
return res;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
void Internal::reset_limits () {
|
|
137
|
+
LOG ("reset limits");
|
|
138
|
+
limit_terminate (0);
|
|
139
|
+
limit_conflicts (-1);
|
|
140
|
+
limit_decisions (-1);
|
|
141
|
+
limit_preprocessing (0);
|
|
142
|
+
limit_local_search (0);
|
|
143
|
+
limit_ticks (-1);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
} // namespace CaDiCaL
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#ifndef _limit_hpp_INCLUDED
|
|
2
|
+
#define _limit_hpp_INCLUDED
|
|
3
|
+
|
|
4
|
+
#include <cstdint>
|
|
5
|
+
#include <limits>
|
|
6
|
+
|
|
7
|
+
namespace CaDiCaL {
|
|
8
|
+
|
|
9
|
+
struct Internal;
|
|
10
|
+
|
|
11
|
+
struct Limit {
|
|
12
|
+
|
|
13
|
+
bool initialized;
|
|
14
|
+
|
|
15
|
+
int64_t conflicts; // conflict limit if non-negative
|
|
16
|
+
int64_t decisions; // decision limit if non-negative
|
|
17
|
+
int64_t preprocessing; // limit on preprocessing rounds
|
|
18
|
+
int64_t localsearch; // limit on local search rounds
|
|
19
|
+
int64_t ticks; // ticks limit if non-negative
|
|
20
|
+
|
|
21
|
+
int64_t compact; // conflict limit for next 'compact'
|
|
22
|
+
int64_t condition; // conflict limit for next 'condition'
|
|
23
|
+
int64_t elim; // conflict limit for next 'elim'
|
|
24
|
+
int64_t flush; // conflict limit for next 'flush'
|
|
25
|
+
int64_t inprobe; // conflict limit for next 'inprobe'
|
|
26
|
+
int64_t reduce; // conflict limit for next 'reduce'
|
|
27
|
+
int64_t rephase; // conflict limit for next 'rephase'
|
|
28
|
+
int64_t report; // report limit for header
|
|
29
|
+
int64_t restart; // conflict limit for next 'restart'
|
|
30
|
+
int64_t stabilize; // conflict/ticks limit for next 'stabilize'
|
|
31
|
+
int64_t incremental_decay; // conflict/ticks limit for next clause 'decay'
|
|
32
|
+
// for incremental clauses
|
|
33
|
+
int64_t random_decision; // randomized decision limit for conflicts
|
|
34
|
+
|
|
35
|
+
int keptsize; // maximum kept size in 'reduce'
|
|
36
|
+
int keptglue; // maximum kept glue in 'reduce'
|
|
37
|
+
int64_t recompute_tier; // conflict limit for next tier recomputation
|
|
38
|
+
|
|
39
|
+
// How often rephased during (1) or out (0) of stabilization.
|
|
40
|
+
//
|
|
41
|
+
int64_t rephased[2];
|
|
42
|
+
|
|
43
|
+
// Current elimination bound per eliminated variable.
|
|
44
|
+
//
|
|
45
|
+
int64_t elimbound;
|
|
46
|
+
|
|
47
|
+
struct {
|
|
48
|
+
int check; // countdown to next terminator call
|
|
49
|
+
int forced; // forced termination for testing
|
|
50
|
+
} terminate;
|
|
51
|
+
|
|
52
|
+
Limit ();
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
struct Delay {
|
|
56
|
+
struct {
|
|
57
|
+
int64_t interval = 0, limit = 0;
|
|
58
|
+
bool bypass = 0;
|
|
59
|
+
|
|
60
|
+
bool delay () {
|
|
61
|
+
if (bypass)
|
|
62
|
+
return false;
|
|
63
|
+
if (limit) {
|
|
64
|
+
--limit;
|
|
65
|
+
return true;
|
|
66
|
+
} else {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void bump_delay () {
|
|
72
|
+
interval += interval < INT64_MAX;
|
|
73
|
+
limit = interval;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void reduce_delay () {
|
|
77
|
+
if (!interval)
|
|
78
|
+
return;
|
|
79
|
+
interval /= 2;
|
|
80
|
+
limit = interval;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void bypass_delay () { bypass = 1; }
|
|
84
|
+
void unbypass_delay () { bypass = 0; }
|
|
85
|
+
} bumpreasons;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
struct Last {
|
|
89
|
+
struct {
|
|
90
|
+
int64_t propagations;
|
|
91
|
+
} transred;
|
|
92
|
+
struct {
|
|
93
|
+
int64_t ticks;
|
|
94
|
+
} backbone, probe, sweep, vivify, walk;
|
|
95
|
+
struct {
|
|
96
|
+
int64_t fixed, subsumephases, marked;
|
|
97
|
+
} elim;
|
|
98
|
+
struct {
|
|
99
|
+
int64_t reductions;
|
|
100
|
+
} inprobe;
|
|
101
|
+
struct {
|
|
102
|
+
int64_t conflicts;
|
|
103
|
+
} reduce, rephase;
|
|
104
|
+
struct {
|
|
105
|
+
int64_t ticks;
|
|
106
|
+
int64_t marked;
|
|
107
|
+
} ternary;
|
|
108
|
+
struct {
|
|
109
|
+
int64_t fixed;
|
|
110
|
+
} collect;
|
|
111
|
+
struct {
|
|
112
|
+
int64_t marked, ticks;
|
|
113
|
+
} factor;
|
|
114
|
+
struct {
|
|
115
|
+
int64_t conflicts;
|
|
116
|
+
int64_t ticks;
|
|
117
|
+
int64_t rephased;
|
|
118
|
+
} stabilize;
|
|
119
|
+
struct {
|
|
120
|
+
int64_t last_id;
|
|
121
|
+
} incremental_decay;
|
|
122
|
+
Last ();
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
struct Inc {
|
|
126
|
+
int64_t flush; // flushing interval in terms of conflicts
|
|
127
|
+
int64_t stabilize; // base ticks limit after first mode switch
|
|
128
|
+
int64_t conflicts; // next conflict limit if non-negative
|
|
129
|
+
int64_t decisions; // next decision limit if non-negative
|
|
130
|
+
int64_t ticks; // next ticks limit if non-negative
|
|
131
|
+
int64_t preprocessing; // next preprocessing limit if non-negative
|
|
132
|
+
int64_t localsearch; // next local search limit if non-negative
|
|
133
|
+
Inc ();
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
#define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD) \
|
|
137
|
+
int64_t LIMIT; \
|
|
138
|
+
do { \
|
|
139
|
+
const int64_t OLD_LIMIT = stats.ticks.NAME; \
|
|
140
|
+
const int64_t TICKS = stats.ticks.search[0] + stats.ticks.search[1]; \
|
|
141
|
+
const int64_t LAST = last.NAME.ticks; \
|
|
142
|
+
int64_t REFERENCE = TICKS - LAST; \
|
|
143
|
+
if (!REFERENCE || !stats.conflicts) { \
|
|
144
|
+
VERBOSE (2, "last %" PRId64 " current %" PRId64 " delta %" PRId64, \
|
|
145
|
+
LAST, TICKS, REFERENCE); \
|
|
146
|
+
REFERENCE = opts.preprocessinit; \
|
|
147
|
+
} \
|
|
148
|
+
const double EFFORT = (double) opts.NAME##effort * 1e-3; \
|
|
149
|
+
const int64_t DELTA = EFFORT * REFERENCE; \
|
|
150
|
+
const int64_t THRESH = opts.NAME##thresh * clauses.size (); \
|
|
151
|
+
if (THRESHHOLD && DELTA < THRESH) { \
|
|
152
|
+
VERBOSE (2, \
|
|
153
|
+
"delaying %s with ticklimit %" PRId64 \
|
|
154
|
+
" and threshhold %" PRId64, \
|
|
155
|
+
#NAME, DELTA, THRESH); \
|
|
156
|
+
return false; \
|
|
157
|
+
} \
|
|
158
|
+
last.NAME.ticks = TICKS; \
|
|
159
|
+
const int64_t NEW_LIMIT = OLD_LIMIT + DELTA; \
|
|
160
|
+
LIMIT = NEW_LIMIT; \
|
|
161
|
+
VERBOSE (2, \
|
|
162
|
+
"new ticks limit %" PRId64 "= %" PRId64 " + %f * %" PRId64, \
|
|
163
|
+
NEW_LIMIT, OLD_LIMIT, EFFORT, REFERENCE); \
|
|
164
|
+
} while (0)
|
|
165
|
+
|
|
166
|
+
} // namespace CaDiCaL
|
|
167
|
+
|
|
168
|
+
#endif
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#ifdef LOGGING
|
|
2
|
+
|
|
3
|
+
#include "internal.hpp"
|
|
4
|
+
|
|
5
|
+
namespace CaDiCaL {
|
|
6
|
+
|
|
7
|
+
void Logger::print_log_prefix (Internal *internal) {
|
|
8
|
+
internal->print_prefix ();
|
|
9
|
+
tout.magenta ();
|
|
10
|
+
fputs ("LOG ", stdout);
|
|
11
|
+
tout.magenta (true);
|
|
12
|
+
printf ("%d ", internal->level);
|
|
13
|
+
tout.normal ();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
void Logger::log_empty_line (Internal *internal) {
|
|
17
|
+
internal->print_prefix ();
|
|
18
|
+
tout.magenta ();
|
|
19
|
+
const int len = internal->prefix.size (), max = 78 - len;
|
|
20
|
+
for (int i = 0; i < max; i++)
|
|
21
|
+
fputc ('-', stdout);
|
|
22
|
+
fputc ('\n', stdout);
|
|
23
|
+
tout.normal ();
|
|
24
|
+
fflush (stdout);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
void Logger::log (Internal *internal, const char *fmt, ...) {
|
|
28
|
+
print_log_prefix (internal);
|
|
29
|
+
tout.magenta ();
|
|
30
|
+
va_list ap;
|
|
31
|
+
va_start (ap, fmt);
|
|
32
|
+
vprintf (fmt, ap);
|
|
33
|
+
va_end (ap);
|
|
34
|
+
fputc ('\n', stdout);
|
|
35
|
+
tout.normal ();
|
|
36
|
+
fflush (stdout);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// It is hard to factor out the common part between the two clause loggers,
|
|
40
|
+
// since they are also used in slightly different contexts. Our attempt to
|
|
41
|
+
// do so were not more readable than the current version. See the header
|
|
42
|
+
// for an explanation of the difference between the following two functions.
|
|
43
|
+
|
|
44
|
+
void Logger::log (Internal *internal, const Clause *c, const char *fmt,
|
|
45
|
+
...) {
|
|
46
|
+
print_log_prefix (internal);
|
|
47
|
+
tout.magenta ();
|
|
48
|
+
va_list ap;
|
|
49
|
+
va_start (ap, fmt);
|
|
50
|
+
vprintf (fmt, ap);
|
|
51
|
+
va_end (ap);
|
|
52
|
+
if (c) {
|
|
53
|
+
if (c->redundant)
|
|
54
|
+
printf (" glue %d redundant", c->glue);
|
|
55
|
+
else
|
|
56
|
+
printf (" irredundant");
|
|
57
|
+
printf (" size %d clause[%" PRId64 "]", c->size, c->id);
|
|
58
|
+
if (c->moved)
|
|
59
|
+
printf (" ... (moved)");
|
|
60
|
+
else {
|
|
61
|
+
if (internal->opts.logsort) {
|
|
62
|
+
vector<int> s;
|
|
63
|
+
for (const auto &lit : *c)
|
|
64
|
+
s.push_back (lit);
|
|
65
|
+
sort (s.begin (), s.end (), clause_lit_less_than ());
|
|
66
|
+
for (const auto &lit : s)
|
|
67
|
+
printf (" %d", lit);
|
|
68
|
+
} else {
|
|
69
|
+
for (const auto &lit : *c) {
|
|
70
|
+
printf (" %s", loglit (internal, lit).c_str ());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} else if (internal->level)
|
|
75
|
+
printf (" decision");
|
|
76
|
+
else
|
|
77
|
+
printf (" unit");
|
|
78
|
+
fputc ('\n', stdout);
|
|
79
|
+
tout.normal ();
|
|
80
|
+
fflush (stdout);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void Logger::log (Internal *internal, const Gate *g, const char *fmt, ...) {
|
|
84
|
+
print_log_prefix (internal);
|
|
85
|
+
tout.magenta ();
|
|
86
|
+
va_list ap;
|
|
87
|
+
va_start (ap, fmt);
|
|
88
|
+
vprintf (fmt, ap);
|
|
89
|
+
va_end (ap);
|
|
90
|
+
if (g) {
|
|
91
|
+
printf ("%s%s gate[%" PRIu64 "] (arity: %zu) %s := %s",
|
|
92
|
+
special_gate_str (g->degenerated_gate).c_str (),
|
|
93
|
+
g->garbage ? " garbage" : "", g->id, g->arity (),
|
|
94
|
+
loglit (internal, g->lhs).c_str (),
|
|
95
|
+
string_of_gate (g->tag).c_str ());
|
|
96
|
+
for (const auto &lit : g->rhs) {
|
|
97
|
+
printf (" %s", loglit (internal, lit).c_str ());
|
|
98
|
+
}
|
|
99
|
+
} else
|
|
100
|
+
printf (" null gate");
|
|
101
|
+
fputc ('\n', stdout);
|
|
102
|
+
tout.normal ();
|
|
103
|
+
fflush (stdout);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Same as above, but for the global clause 'c' (which is not a reason).
|
|
107
|
+
|
|
108
|
+
void Logger::log (Internal *internal, const vector<int> &c, const char *fmt,
|
|
109
|
+
...) {
|
|
110
|
+
print_log_prefix (internal);
|
|
111
|
+
tout.magenta ();
|
|
112
|
+
va_list ap;
|
|
113
|
+
va_start (ap, fmt);
|
|
114
|
+
vprintf (fmt, ap);
|
|
115
|
+
va_end (ap);
|
|
116
|
+
if (internal->opts.logsort) {
|
|
117
|
+
vector<int> s;
|
|
118
|
+
for (const auto &lit : c)
|
|
119
|
+
s.push_back (lit);
|
|
120
|
+
sort (s.begin (), s.end (), clause_lit_less_than ());
|
|
121
|
+
for (const auto &lit : s)
|
|
122
|
+
printf (" %d", lit);
|
|
123
|
+
} else {
|
|
124
|
+
for (const auto &lit : c)
|
|
125
|
+
printf (" %d", lit);
|
|
126
|
+
}
|
|
127
|
+
fputc ('\n', stdout);
|
|
128
|
+
tout.normal ();
|
|
129
|
+
fflush (stdout);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Now for 'restore_clause' to avoid copying (without logging).
|
|
133
|
+
|
|
134
|
+
void Logger::log (Internal *internal,
|
|
135
|
+
const vector<int>::const_iterator &begin,
|
|
136
|
+
const vector<int>::const_iterator &end, const char *fmt,
|
|
137
|
+
...) {
|
|
138
|
+
print_log_prefix (internal);
|
|
139
|
+
tout.magenta ();
|
|
140
|
+
va_list ap;
|
|
141
|
+
va_start (ap, fmt);
|
|
142
|
+
vprintf (fmt, ap);
|
|
143
|
+
va_end (ap);
|
|
144
|
+
if (internal->opts.logsort) {
|
|
145
|
+
vector<int> s;
|
|
146
|
+
for (auto p = begin; p != end; p++)
|
|
147
|
+
s.push_back (*p);
|
|
148
|
+
sort (s.begin (), s.end (), clause_lit_less_than ());
|
|
149
|
+
for (const auto &lit : s)
|
|
150
|
+
printf (" %d", lit);
|
|
151
|
+
} else {
|
|
152
|
+
for (auto p = begin; p != end; p++)
|
|
153
|
+
printf (" %d", *p);
|
|
154
|
+
}
|
|
155
|
+
fputc ('\n', stdout);
|
|
156
|
+
tout.normal ();
|
|
157
|
+
fflush (stdout);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// for LRAT proof chains
|
|
161
|
+
|
|
162
|
+
void Logger::log (Internal *internal, const vector<int64_t> &c,
|
|
163
|
+
const char *fmt, ...) {
|
|
164
|
+
print_log_prefix (internal);
|
|
165
|
+
tout.magenta ();
|
|
166
|
+
va_list ap;
|
|
167
|
+
va_start (ap, fmt);
|
|
168
|
+
vprintf (fmt, ap);
|
|
169
|
+
va_end (ap);
|
|
170
|
+
for (const auto &id : c)
|
|
171
|
+
printf (" %" PRId64, id);
|
|
172
|
+
fputc ('\n', stdout);
|
|
173
|
+
tout.normal ();
|
|
174
|
+
fflush (stdout);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// for LRAT proof clauses
|
|
178
|
+
|
|
179
|
+
void Logger::log (Internal *internal, const int *literals,
|
|
180
|
+
const unsigned size, const char *fmt, ...) {
|
|
181
|
+
print_log_prefix (internal);
|
|
182
|
+
tout.magenta ();
|
|
183
|
+
va_list ap;
|
|
184
|
+
va_start (ap, fmt);
|
|
185
|
+
vprintf (fmt, ap);
|
|
186
|
+
va_end (ap);
|
|
187
|
+
for (unsigned i = 0; i < size; i++) {
|
|
188
|
+
const int lit = literals[i];
|
|
189
|
+
printf (" %d", lit);
|
|
190
|
+
}
|
|
191
|
+
fputc ('\n', stdout);
|
|
192
|
+
tout.normal ();
|
|
193
|
+
fflush (stdout);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
string Logger::loglit (Internal *internal, int lit) {
|
|
197
|
+
std::string v = std::to_string (lit);
|
|
198
|
+
if (lit && -internal->max_var <= lit && internal->max_var >= lit) {
|
|
199
|
+
const int va = internal->val (lit);
|
|
200
|
+
if (va) {
|
|
201
|
+
v = v + "@" + std::to_string (internal->var (lit).level);
|
|
202
|
+
if (!internal->var (lit).reason)
|
|
203
|
+
v = v + "+";
|
|
204
|
+
}
|
|
205
|
+
if (va > 0)
|
|
206
|
+
v += "=1";
|
|
207
|
+
else if (va < 0)
|
|
208
|
+
v += "=-1";
|
|
209
|
+
}
|
|
210
|
+
return v;
|
|
211
|
+
}
|
|
212
|
+
} // namespace CaDiCaL
|
|
213
|
+
|
|
214
|
+
#endif
|