ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
mode.c
Go to the documentation of this file.
1#include "bump.h"
2#include "decide.h"
3#include "inline.h"
4#include "print.h"
5#include "report.h"
6#include "resources.h"
7#include "restart.h"
8
9#include <inttypes.h>
10
12
13#ifndef KISSAT_QUIET
14
15static const char *mode_string (kissat *solver) {
16 return solver->stable ? "stable" : "focused";
17}
18
19#endif
20
22 limits *limits = &solver->limits;
23
24 if (GET_OPTION (stable) == 1) {
25 KISSAT_assert (!solver->stable);
26
27 const uint64_t conflicts_delta = GET_OPTION (modeinit);
28 const uint64_t conflicts_limit = CONFLICTS + conflicts_delta;
29
30 KISSAT_assert (conflicts_limit);
31
32 limits->mode.conflicts = conflicts_limit;
33 limits->mode.ticks = 0;
34 limits->mode.count = 0;
35
37 "initial %s mode switching limit "
38 "at %s after %s conflicts",
39 mode_string (solver),
40 FORMAT_COUNT (conflicts_limit),
41 FORMAT_COUNT (conflicts_delta));
42
43 solver->mode.ticks = solver->statistics_.search_ticks;
44#ifndef KISSAT_QUIET
45 solver->mode.conflicts = CONFLICTS;
46#ifdef METRICS
47 solver->mode.propagations = solver->statistics_.search_propagations;
48#endif
49 // clang-format off
50 solver->mode.entered = kissat_process_time ();
52 "starting %s mode at %.2f seconds "
53 "(%" PRIu64 " conflicts, %" PRIu64 " ticks"
54#ifdef METRICS
55 ", %" PRIu64 " propagations, %" PRIu64 " visits"
56#endif
57 ")", mode_string (solver),
58 solver->mode.entered, solver->mode.conflicts, solver->mode.ticks
59#ifdef METRICS
60 , solver->mode.propagations, solver->mode.visits
61#endif
62 );
63// clang-format on
64#endif
65 } else
67 "no need to set mode limit (only %s mode enabled)",
68 mode_string (solver));
69}
70
71static void update_mode_limit (kissat *solver, uint64_t delta_ticks) {
73
74 limits *limits = &solver->limits;
75 statistics *statistics = &solver->statistics_;
76
77 KISSAT_assert (GET_OPTION (stable) == 1);
78
79 if (limits->mode.count & 1) {
80 limits->mode.ticks = statistics->search_ticks + delta_ticks;
81#ifndef KISSAT_QUIET
82 KISSAT_assert (solver->stable);
83 kissat_phase (solver, "stable", GET (stable_modes),
84 "new stable mode switching limit of %s "
85 "after %s ticks",
87 FORMAT_COUNT (delta_ticks));
88#endif
89 } else {
91 const uint64_t interval = GET_OPTION (modeint);
92 const uint64_t count = (statistics->switched + 1) / 2;
93 const uint64_t scaled = interval * kissat_nlogpown (count, 4);
94 limits->mode.conflicts = statistics->conflicts + scaled;
95#ifndef KISSAT_QUIET
96 KISSAT_assert (!solver->stable);
97 kissat_phase (solver, "focused", GET (focused_modes),
98 "new focused mode switching limit of %s "
99 "after %s conflicts",
101 FORMAT_COUNT (scaled));
102#endif
103 }
104
105 solver->mode.ticks = statistics->search_ticks;
106#ifndef KISSAT_QUIET
107 solver->mode.conflicts = statistics->conflicts;
108#ifdef METRICS
109 solver->mode.propagations = statistics->search_propagations;
110#endif
111#endif
112}
113
114static void report_switching_from_mode (kissat *solver,
115 uint64_t *delta_ticks) {
116 statistics *statistics = &solver->statistics_;
117 *delta_ticks = statistics->search_ticks - solver->mode.ticks;
118
119#ifndef KISSAT_QUIET
120 if (kissat_verbosity (solver) < 2)
121 return;
122
123 const double current_time = kissat_process_time ();
124 const double delta_time = current_time - solver->mode.entered;
125
126 const uint64_t delta_conflicts =
127 statistics->conflicts - solver->mode.conflicts;
128#ifdef METRICS
129 const uint64_t delta_propagations =
130 statistics->search_propagations - solver->mode.propagations;
131#endif
132 solver->mode.entered = current_time;
133
134 // clang-format off
135 kissat_very_verbose (solver, "%s mode took %.2f seconds "
136 "(%s conflicts, %s ticks"
137#ifdef METRICS
138 ", %s propagations"
139#endif
140 ")", solver->stable ? "stable" : "focused",
141 delta_time, FORMAT_COUNT (delta_conflicts), FORMAT_COUNT (*delta_ticks)
142#ifdef METRICS
143 , FORMAT_COUNT (delta_propagations)
144#endif
145 );
146 // clang-format on
147#else
148 (void) solver;
149#endif
150}
151
152static void switch_to_focused_mode (kissat *solver) {
153 KISSAT_assert (solver->stable);
154 uint64_t delta;
155 report_switching_from_mode (solver, &delta);
156 REPORT (0, ']');
157 STOP (stable);
158 INC (focused_modes);
159 kissat_phase (solver, "focus", GET (focused_modes),
160 "switching to focused mode after %s conflicts",
162 solver->stable = false;
163 update_mode_limit (solver, delta);
164 START (focused);
165 REPORT (0, '{');
168}
169
170static void switch_to_stable_mode (kissat *solver) {
171 KISSAT_assert (!solver->stable);
172 uint64_t delta;
173 report_switching_from_mode (solver, &delta);
174 REPORT (0, '}');
175 STOP (focused);
176 INC (stable_modes);
177 solver->stable = true;
178 kissat_phase (solver, "stable", GET (stable_modes),
179 "switched to stable mode after %" PRIu64 " conflicts",
180 CONFLICTS);
181 update_mode_limit (solver, delta);
182 START (stable);
183 REPORT (0, '[');
186}
187
189 KISSAT_assert (!solver->inconsistent);
190
191 if (GET_OPTION (stable) != 1)
192 return false;
193
194 limits *limits = &solver->limits;
195 statistics *statistics = &solver->statistics_;
196
197 if (limits->mode.count & 1)
198 return statistics->search_ticks >= limits->mode.ticks;
199 else
200 return statistics->conflicts >= limits->mode.conflicts;
201}
202
205
206 INC (switched);
207 solver->limits.mode.count++;
208
209 if (solver->stable)
210 switch_to_focused_mode (solver);
211 else
212 switch_to_stable_mode (solver);
213
214 solver->averages[solver->stable].saved_decisions = DECISIONS;
215
217}
218
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START void kissat_init_averages(kissat *solver, averages *averages)
Definition averages.c:5
#define AVERAGES
Definition averages.h:27
void kissat_update_scores(kissat *solver)
Definition bump.c:116
#define INC(NAME)
void kissat_start_random_sequence(kissat *solver)
Definition decide.c:59
#define FORMAT_COUNT(WORD)
Definition format.h:33
double kissat_nlogpown(uint64_t count, unsigned exponent)
Definition kimits.c:29
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
void kissat_switch_search_mode(kissat *solver)
Definition mode.c:203
bool kissat_switching_search_mode(kissat *solver)
Definition mode.c:188
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
#define kissat_phase(...)
Definition print.h:48
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
void kissat_reset_search_of_queue(kissat *solver)
Definition queue.c:15
void kissat_init_reluctant(kissat *solver)
Definition reluctant.c:59
#define REPORT(...)
Definition report.h:10
void kissat_update_focused_restart_limit(kissat *solver)
Definition restart.c:41
#define CONFLICTS
Definition statistics.h:335
#define DECISIONS
Definition statistics.h:336
#define GET(NAME)
Definition statistics.h:416
uint64_t count
Definition kimits.h:32
uint64_t ticks
Definition kimits.h:33
uint64_t conflicts
Definition kimits.h:27
struct limits::@174206357337173032026364064366275325046050235136 mode