ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
search.c
Go to the documentation of this file.
1#include "search.h"
2#include "analyze.h"
3#include "bump.h"
4#include "classify.h"
5#include "decide.h"
6#include "eliminate.h"
7#include "inline.h"
8#include "internal.h"
9#include "logging.h"
10#include "lucky.h"
11#include "preprocess.h"
12#include "print.h"
13#include "probe.h"
14#include "propsearch.h"
15#include "reduce.h"
16#include "reluctant.h"
17#include "reorder.h"
18#include "rephase.h"
19#include "report.h"
20#include "restart.h"
21#include "terminate.h"
22#include "trail.h"
23#include "walk.h"
24
25#include <inttypes.h>
26
28
29static void init_tiers (kissat *solver) {
30 for (unsigned stable = 0; stable != 2; stable++) {
31 if (!solver->tier1[stable]) {
32 KISSAT_assert (!solver->tier2[stable]);
33 solver->tier1[stable] = GET_OPTION (tier1);
34 solver->tier2[stable] = GET_OPTION (tier2);
35 if (solver->tier2[stable] <= solver->tier1[stable])
36 solver->tier2[stable] = solver->tier1[stable];
37 LOG ("initialized tier1[%u] glue to %u", stable,
38 solver->tier1[stable]);
39 LOG ("initialized tier2[%u] glue to %u", stable,
40 solver->tier2[stable]);
41 if (!solver->limits.glue.interval)
42 solver->limits.glue.interval = 2;
43 }
44 }
45}
46
47static void start_search (kissat *solver) {
48 START (search);
49 INC (searches);
50
51 bool stable = (GET_OPTION (stable) == 2);
52
53 solver->stable = stable;
54 kissat_phase (solver, "search", GET (searches),
55 "initializing %s search after %" PRIu64 " conflicts",
56 (stable ? "stable" : "focus"), CONFLICTS);
57
59
61
62 if (solver->stable) {
65 }
66
67 init_tiers (solver);
68
70
71 unsigned seed = GET_OPTION (seed);
72 solver->random = seed;
73 LOG ("initialized random number generator with seed %u", seed);
74
75#ifndef KISSAT_QUIET
76 limits *limits = &solver->limits;
77 limited *limited = &solver->limited;
79 kissat_very_verbose (solver, "starting unlimited search");
80 else if (limited->conflicts && !limited->decisions)
82 solver, "starting search with conflicts limited to %" PRIu64,
84 else if (!limited->conflicts && limited->decisions)
86 solver, "starting search with decisions limited to %" PRIu64,
88 else
90 solver,
91 "starting search with decisions limited to %" PRIu64
92 " and conflicts limited to %" PRIu64,
94 if (stable) {
95 START (stable);
96 REPORT (0, '[');
97 } else {
98 START (focused);
99 REPORT (0, '{');
100 }
101#endif
102}
103
104static void stop_search (kissat *solver) {
105 if (solver->limited.conflicts) {
106 LOG ("reset conflict limit");
107 solver->limited.conflicts = false;
108 }
109
110 if (solver->limited.decisions) {
111 LOG ("reset decision limit");
112 solver->limited.decisions = false;
113 }
114
115 if (solver->termination.flagged) {
116 kissat_very_verbose (solver, "termination forced externally");
117 solver->termination.flagged = 0;
118 }
119
120 if (solver->stable) {
121 REPORT (0, ']');
122 STOP (stable);
123 solver->stable = false;
124 } else {
125 REPORT (0, '}');
126 STOP (focused);
127 }
128 STOP (search);
129}
130
131static void report_search_result (kissat *solver, int res) {
132#ifndef KISSAT_QUIET
133 LOG ("search result %d", res);
134 char type = (res == 10 ? '1' : res == 20 ? '0' : '?');
135 REPORT (0, type);
136#else
137 (void) solver, (void) res;
138#endif
139}
140
141static void iterate (kissat *solver) {
142 KISSAT_assert (solver->iterating);
143 solver->iterating = false;
144 REPORT (0, 'i');
145}
146
147static bool conflict_limit_hit (kissat *solver) {
148 if (!solver->limited.conflicts)
149 return false;
150 if (solver->limits.conflicts > solver->statistics_.conflicts)
151 return false;
153 solver, "conflict limit %" PRIu64 " hit after %" PRIu64 " conflicts",
154 solver->limits.conflicts, solver->statistics_.conflicts);
155 return true;
156}
157
158static bool decision_limit_hit (kissat *solver) {
159 if (!solver->limited.decisions)
160 return false;
161 if (solver->limits.decisions > solver->statistics_.decisions)
162 return false;
164 solver, "decision limit %" PRIu64 " hit after %" PRIu64 " decisions",
165 solver->limits.decisions, solver->statistics_.decisions);
166 return true;
167}
168
169static bool searching (kissat *solver) {
170 if (!kissat_propagated (solver))
171 return true;
172 if (!GET_OPTION (probeinit))
173 return true;
174 if (!GET_OPTION (eliminateinit))
175 return true;
176 if (conflict_limit_hit (solver))
177 return false;
178 return true;
179}
180
182 REPORT (0, '*');
183 int res = 0;
184 if (solver->inconsistent)
185 res = 20;
186 if (!res && GET_OPTION (luckyearly))
187 res = kissat_lucky (solver);
188 if (!res && kissat_preprocessing (solver))
190 if (!res && GET_OPTION (luckylate))
191 res = kissat_lucky (solver);
192 if (!res)
194 if (!res && searching (solver)) {
195 start_search (solver);
196 while (!res) {
198 if (conflict)
199 res = kissat_analyze (solver, conflict);
200 else if (solver->iterating)
201 iterate (solver);
202 else if (!solver->unassigned)
203 res = 10;
205 break;
206 else if (kissat_reducing (solver))
207 res = kissat_reduce (solver);
210 else if (kissat_restarting (solver))
212 else if (kissat_reordering (solver))
214 else if (kissat_rephasing (solver))
216 else if (kissat_probing (solver))
217 res = kissat_probe (solver);
218 else if (kissat_eliminating (solver))
219 res = kissat_eliminate (solver);
220 else if (conflict_limit_hit (solver))
221 break;
222 else if (decision_limit_hit (solver))
223 break;
224 else
226 }
227 stop_search (solver);
228 }
229 report_search_result (solver, res);
230 return res;
231}
232
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int kissat_analyze(kissat *solver, clause *conflict)
Definition analyze.c:529
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)
#define LOG(...)
ABC_NAMESPACE_IMPL_START void kissat_classify(struct kissat *solver)
Definition classify.c:7
void kissat_decide(kissat *solver)
Definition decide.c:211
ABC_NAMESPACE_IMPL_START bool kissat_eliminating(kissat *solver)
Definition eliminate.c:23
int kissat_eliminate(kissat *solver)
Definition eliminate.c:597
type
CUBE COVER and CUBE typedefs ///.
Definition exor.h:90
void kissat_init_limits(kissat *solver)
Definition kimits.c:101
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
int kissat_lucky(struct kissat *solver)
Definition kucky.c:309
void kissat_switch_search_mode(kissat *solver)
Definition mode.c:203
bool kissat_switching_search_mode(kissat *solver)
Definition mode.c:188
#define GET_OPTION(N)
Definition options.h:295
ABC_NAMESPACE_IMPL_START bool kissat_preprocessing(struct kissat *solver)
Definition preprocess.c:16
int kissat_preprocess(struct kissat *solver)
Definition preprocess.c:31
#define kissat_very_verbose(...)
Definition print.h:52
#define kissat_phase(...)
Definition print.h:48
int kissat_probe(kissat *solver)
Definition probe.c:72
ABC_NAMESPACE_IMPL_START bool kissat_probing(kissat *solver)
Definition probe.c:18
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
clause * kissat_search_propagate(kissat *solver)
Definition propsearch.c:46
void kissat_init_reluctant(kissat *solver)
Definition reluctant.c:59
void kissat_reorder(kissat *solver)
Definition reorder.c:205
ABC_NAMESPACE_IMPL_START bool kissat_reordering(kissat *solver)
Definition reorder.c:16
void kissat_rephase(kissat *solver)
Definition rephase.c:128
bool kissat_rephasing(kissat *solver)
Definition rephase.c:34
#define REPORT(...)
Definition report.h:10
ABC_NAMESPACE_IMPL_START bool kissat_restarting(kissat *solver)
Definition restart.c:16
void kissat_restart(kissat *solver)
Definition restart.c:114
int kissat_reduce(kissat *solver)
Definition reduce.c:155
ABC_NAMESPACE_IMPL_START bool kissat_reducing(kissat *solver)
Definition reduce.c:16
int kissat_search(kissat *solver)
Definition search.c:181
#define CONFLICTS
Definition statistics.h:335
#define GET(NAME)
Definition statistics.h:416
bool decisions
Definition kimits.h:61
bool conflicts
Definition kimits.h:60
uint64_t decisions
Definition kimits.h:28
uint64_t conflicts
Definition kimits.h:27
#define TERMINATED(BIT)
Definition terminate.h:42
#define search_terminated_1
Definition terminate.h:68