ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
restart.c
Go to the documentation of this file.
1#include "restart.h"
2#include "backtrack.h"
3#include "bump.h"
4#include "decide.h"
5#include "internal.h"
6#include "kimits.h"
7#include "logging.h"
8#include "print.h"
9#include "reluctant.h"
10#include "report.h"
11
12#include <inttypes.h>
13
15
17 KISSAT_assert (solver->unassigned);
18 if (!GET_OPTION (restart))
19 return false;
20 if (!solver->level)
21 return false;
23 return false;
24 if (solver->stable)
25 return kissat_reluctant_triggered (&solver->reluctant);
26 const double fast = AVERAGE (fast_glue);
27 const double slow = AVERAGE (slow_glue);
28 const double margin = (100.0 + GET_OPTION (restartmargin)) / 100.0;
29 const double limit = margin * slow;
31 "restart glue limit %g = "
32 "%.02f * %g (slow glue) %c %g (fast glue)",
33 limit, margin, slow,
34 (limit > fast ? '>'
35 : limit == fast ? '='
36 : '<'),
37 fast);
38 return (limit <= fast);
39}
40
42 KISSAT_assert (!solver->stable);
43 limits *limits = &solver->limits;
44 uint64_t restarts = solver->statistics_.restarts;
45 uint64_t delta = GET_OPTION (restartint);
46 if (restarts)
47 delta += kissat_logn (restarts) - 1;
50 "focused restart limit at %" PRIu64
51 " after %" PRIu64 " conflicts ",
52 limits->restart.conflicts, delta);
53}
54
55static unsigned reuse_stable_trail (kissat *solver) {
56 const heap *const scores = SCORES;
57 const unsigned next_idx = kissat_next_decision_variable (solver);
58 const double limit = kissat_get_heap_score (scores, next_idx);
59 unsigned level = solver->level, res = 0;
60 while (res < level) {
61 frame *f = &FRAME (res + 1);
62 const unsigned idx = IDX (f->decision);
63 const double score = kissat_get_heap_score (scores, idx);
64 if (score <= limit)
65 break;
66 res++;
67 }
68 return res;
69}
70
71static unsigned reuse_focused_trail (kissat *solver) {
72 const links *const links = solver->links;
73 const unsigned next_idx = kissat_next_decision_variable (solver);
74 const unsigned limit = links[next_idx].stamp;
75 LOG ("next decision variable stamp %u", limit);
76 unsigned level = solver->level, res = 0;
77 while (res < level) {
78 frame *f = &FRAME (res + 1);
79 const unsigned idx = IDX (f->decision);
80 const unsigned score = links[idx].stamp;
81 if (score <= limit)
82 break;
83 res++;
84 }
85 return res;
86}
87
88static unsigned reuse_trail (kissat *solver) {
89 KISSAT_assert (solver->level);
91
92 if (!GET_OPTION (restartreusetrail))
93 return 0;
94
95 unsigned res;
96
97 if (solver->stable)
98 res = reuse_stable_trail (solver);
99 else
100 res = reuse_focused_trail (solver);
101
102 LOG ("matching trail level %u", res);
103
104 if (res) {
105 INC (restarts_reused_trails);
106 ADD (restarts_reused_levels, res);
107 LOG ("restart reuses trail at decision level %u", res);
108 } else
109 LOG ("restarts does not reuse the trail");
110
111 return res;
112}
113
115 START (restart);
116 INC (restarts);
117 ADD (restarts_levels, solver->level);
118 if (solver->stable)
119 INC (stable_restarts);
120 else
121 INC (focused_restarts);
122 unsigned level = reuse_trail (solver);
124 "restarting after %" PRIu64 " conflicts"
125 " (limit %" PRIu64 ")",
126 CONFLICTS, solver->limits.restart.conflicts);
127 LOG ("restarting to level %u", level);
129 if (!solver->stable)
131 REPORT (1, 'R');
132 STOP (restart);
133}
134
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define AVERAGE(NAME)
Definition averages.h:31
void kissat_backtrack_in_consistent_state(kissat *solver, unsigned new_level)
Definition backtrack.c:152
#define EMPTY_STACK(S)
Definition stack.h:18
#define ADD(NAME, DELTA)
#define INC(NAME)
#define LOG(...)
unsigned kissat_next_decision_variable(kissat *solver)
Definition decide.c:128
#define FRAME(LEVEL)
Definition frames.h:33
#define SCORES
Definition internal.h:262
ABC_NAMESPACE_IMPL_START double kissat_logn(uint64_t count)
Definition kimits.c:15
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define GET_OPTION(N)
Definition options.h:295
#define kissat_extremely_verbose(...)
Definition print.h:53
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define REPORT(...)
Definition report.h:10
ABC_NAMESPACE_IMPL_START bool kissat_restarting(kissat *solver)
Definition restart.c:16
void kissat_update_focused_restart_limit(kissat *solver)
Definition restart.c:41
void kissat_restart(kissat *solver)
Definition restart.c:114
#define IDX(LIT)
Definition literal.h:28
#define CONFLICTS
Definition statistics.h:335
Definition frames.h:15
unsigned decision
Definition frames.h:17
Definition heap.h:19
struct limits::@317277023072347355124305102271146250361353123031 restart
uint64_t conflicts
Definition kimits.h:27