ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
kimits.c
Go to the documentation of this file.
1#include "internal.h"
2#include "logging.h"
3#include "mode.h"
4#include "print.h"
5#include "reduce.h"
6#include "rephase.h"
7#include "resources.h"
8#include "restart.h"
9
10#include <inttypes.h>
11#include <math.h>
12
14
15double kissat_logn (uint64_t count) {
16 KISSAT_assert (count > 0);
17 const double res = log10 (count + 9);
18 KISSAT_assert (res >= 1);
19 return res;
20}
21
22double kissat_sqrt (uint64_t count) {
23 KISSAT_assert (count > 0);
24 const double res = sqrt (count);
25 KISSAT_assert (res >= 1);
26 return res;
27}
28
29double kissat_nlogpown (uint64_t count, unsigned exponent) {
30 KISSAT_assert (count > 0);
31 const double tmp = log10 (count + 9);
32 double factor = 1;
33 while (exponent--)
34 factor *= tmp;
35 KISSAT_assert (factor >= 1);
36 const double res = count * factor;
37 KISSAT_assert (res >= 1);
38 return res;
39}
40
41uint64_t kissat_scale_delta (kissat *solver, const char *pretty,
42 uint64_t delta) {
43 const uint64_t C = BINIRR_CLAUSES;
44 double f = kissat_logn (C + 1) - 5;
45 const double ff = f * f;
46 KISSAT_assert (ff >= 0);
47 const double fff = 4.5 * ff + 25;
48 uint64_t scaled = fff * delta;
49 KISSAT_assert (delta <= scaled);
50 // clang-format off
52 "scaled %s delta %" PRIu64
53 " = %g * %" PRIu64
54 " = (4.5 (log10(%" PRIu64 ") - 5)^2 + 25) * %" PRIu64,
55 pretty, scaled, fff, delta, C, delta);
56 // clang-format on
57 (void) pretty;
58 return scaled;
59}
60
61static void init_enabled (kissat *solver) {
62 bool probe;
63 if (!GET_OPTION (simplify))
64 probe = false;
65 else if (!GET_OPTION (probe))
66 probe = false;
67 else if (GET_OPTION (substitute))
68 probe = true;
69 else if (GET_OPTION (sweep))
70 probe = true;
71 else if (GET_OPTION (vivify))
72 probe = true;
73 else
74 probe = false;
75 kissat_very_verbose (solver, "probing %sabled", probe ? "en" : "dis");
76 solver->enabled.probe = probe;
77
78 bool eliminate;
79 if (!GET_OPTION (simplify))
80 eliminate = false;
81 else if (!GET_OPTION (eliminate))
82 eliminate = false;
83 else
84 eliminate = true;
85 kissat_very_verbose (solver, "eliminate %sabled",
86 eliminate ? "en" : "dis");
87 solver->enabled.eliminate = eliminate;
88}
89
90#define INIT_CONFLICT_LIMIT(NAME, SCALE) \
91 do { \
92 const uint64_t DELTA = GET_OPTION (NAME##init); \
93 const uint64_t SCALED = \
94 !(SCALE) ? DELTA : kissat_scale_delta (solver, #NAME, DELTA); \
95 limits->NAME.conflicts = CONFLICTS + SCALED; \
96 kissat_very_verbose (solver, \
97 "initial " #NAME " limit of %s conflicts", \
98 FORMAT_COUNT (limits->NAME.conflicts)); \
99 } while (0)
100
102 KISSAT_assert (solver->statistics_.searches == 1);
103
104 init_enabled (solver);
105
106 limits *limits = &solver->limits;
107
108 if (GET_OPTION (randec))
109 INIT_CONFLICT_LIMIT (randec, false);
110
111 if (GET_OPTION (reduce))
113
114 if (GET_OPTION (reorder))
115 INIT_CONFLICT_LIMIT (reorder, false);
116
117 if (GET_OPTION (rephase))
118 INIT_CONFLICT_LIMIT (rephase, false);
119
120 if (!solver->stable)
122
124
125 if (solver->enabled.eliminate) {
126 INIT_CONFLICT_LIMIT (eliminate, true);
127 solver->bounds.eliminate.max_bound_completed = 0;
128 solver->bounds.eliminate.additional_clauses = 0;
129 kissat_very_verbose (solver, "reset elimination bound to zero");
130 }
131
132 if (solver->enabled.probe)
133 INIT_CONFLICT_LIMIT (probe, true);
134}
135
136#ifndef KISSAT_QUIET
137
138static const char *delay_description (kissat *solver, delay *delay) {
139 delays *delays = &solver->delays;
140 if (delay == &delays->bumpreasons)
141 return "bumping reason side literals";
142 else if (delay == &delays->congruence)
143 return "congruence closure";
144 else if (delay == &delays->sweep)
145 return "sweeping";
146 else {
148 return "vivifying irredundant clauses";
149 }
150}
151
152#endif
153
154#define VERY_VERBOSE_IF_NOT_BUMPREASONS(...) \
155 VERY_VERBOSE_OR_LOG (delay == &solver->delays.bumpreasons, __VA_ARGS__)
156
158 if (!delay->current)
159 return;
160 delay->current /= 2;
162 solver, "%s delay interval decreased to %u",
163 delay_description (solver, delay), delay->current);
165#ifdef KISSAT_QUIET
166 (void) solver;
167#endif
168}
169
171 delay->current += delay->current < UINT_MAX;
173 solver, "%s delay interval increased to %u",
174 delay_description (solver, delay), delay->current);
176#ifdef KISSAT_QUIET
177 (void) solver;
178#endif
179}
180
182 if (delay->count) {
183 delay->count--;
185 solver, "%s still delayed (%u more times)",
186 delay_description (solver, delay), delay->current);
187 return true;
188 } else {
189 VERY_VERBOSE_IF_NOT_BUMPREASONS (solver, "%s not delayed",
190 delay_description (solver, delay));
191 return false;
192 }
193#ifdef KISSAT_QUIET
194 (void) solver;
195#endif
196}
197
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
pcover simplify(pcube *T)
Definition compl.c:566
pcover reduce()
bool kissat_delaying(kissat *solver, delay *delay)
Definition kimits.c:181
#define INIT_CONFLICT_LIMIT(NAME, SCALE)
Definition kimits.c:90
void kissat_reduce_delay(kissat *solver, delay *delay)
Definition kimits.c:157
#define VERY_VERBOSE_IF_NOT_BUMPREASONS(...)
Definition kimits.c:154
double kissat_sqrt(uint64_t count)
Definition kimits.c:22
void kissat_init_limits(kissat *solver)
Definition kimits.c:101
ABC_NAMESPACE_IMPL_START double kissat_logn(uint64_t count)
Definition kimits.c:15
void kissat_bump_delay(kissat *solver, delay *delay)
Definition kimits.c:170
double kissat_nlogpown(uint64_t count, unsigned exponent)
Definition kimits.c:29
uint64_t kissat_scale_delta(kissat *solver, const char *pretty, uint64_t delta)
Definition kimits.c:41
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
ABC_NAMESPACE_IMPL_START void kissat_init_mode_limit(kissat *solver)
Definition mode.c:21
#define GET_OPTION(N)
Definition options.h:295
#define kissat_very_verbose(...)
Definition print.h:52
void kissat_update_focused_restart_limit(kissat *solver)
Definition restart.c:41
#define BINIRR_CLAUSES
Definition statistics.h:341
Definition kimits.h:71
unsigned current
Definition kimits.h:73
unsigned count
Definition kimits.h:72
delay bumpreasons
Definition kimits.h:77
delay vivifyirr
Definition kimits.h:80
delay congruence
Definition kimits.h:78
delay sweep
Definition kimits.h:79