ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
bump.c
Go to the documentation of this file.
1#include "bump.h"
2#include "analyze.h"
3#include "inlineheap.h"
4#include "inlinequeue.h"
5#include "inlinevector.h"
6#include "internal.h"
7#include "logging.h"
8#include "print.h"
9#include "rank.h"
10#include "sort.h"
11
13
14#define RANK(A) ((A).rank)
15#define SMALLER(A, B) (RANK (A) < RANK (B))
16
17#define RADIX_SORT_BUMP_LIMIT 32
18
19static void sort_bump (kissat *solver) {
20 const size_t size = SIZE_STACK (solver->analyzed);
21 if (size < RADIX_SORT_BUMP_LIMIT) {
22 LOG ("quick sorting %zu analyzed variables", size);
24 } else {
25 LOG ("radix sorting %zu analyzed variables", size);
26 RADIX_STACK (datarank, unsigned, solver->ranks, RANK);
27 }
28}
29
31 INC (rescaled);
32 heap *scores = &solver->scores;
33 const double max_score = kissat_max_score_on_heap (scores);
34 kissat_phase (solver, "rescale", GET (rescaled),
35 "maximum score %g increment %g", max_score, solver->scinc);
36 const double rescale = MAX (max_score, solver->scinc);
37 KISSAT_assert (rescale > 0);
38 const double factor = 1.0 / rescale;
40 solver->scinc *= factor;
41 kissat_phase (solver, "rescale", GET (rescaled), "rescaled by factor %g",
42 factor);
43}
44
46 const double old_scinc = solver->scinc;
47 const double decay = GET_OPTION (decay) * 1e-3;
48 KISSAT_assert (0 <= decay), KISSAT_assert (decay <= 0.5);
49 const double factor = 1.0 / (1.0 - decay);
50 const double new_scinc = old_scinc * factor;
51 LOG ("new score increment %g = %g * %g", new_scinc, factor, old_scinc);
52 solver->scinc = new_scinc;
53 if (new_scinc > MAX_SCORE)
55}
56
57static inline void bump_analyzed_variable_score (kissat *solver,
58 unsigned idx) {
59 heap *scores = &solver->scores;
60 const double old_score = kissat_get_heap_score (scores, idx);
61 const double inc = solver->scinc;
62 const double new_score = old_score + inc;
63 LOG ("new score[%u] = %g = %g + %g", idx, new_score, old_score, inc);
64 kissat_update_heap (solver, scores, idx, new_score);
65 if (new_score > MAX_SCORE)
67}
68
69void kissat_bump_variable (kissat *solver, unsigned idx) {
70 bump_analyzed_variable_score (solver, idx);
71}
72
73static void bump_analyzed_variable_scores (kissat *solver) {
74 flags *flags = solver->flags;
75
76 for (all_stack (unsigned, idx, solver->analyzed))
77 if (flags[idx].active)
78 bump_analyzed_variable_score (solver, idx);
79
81}
82
83static void move_analyzed_variables_to_front_of_queue (kissat *solver) {
85 const links *const links = solver->links;
86 for (all_stack (unsigned, idx, solver->analyzed)) {
87 // clang-format off
88 const datarank rank = { .data = idx, .rank = links[idx].stamp };
89 // clang-format on
90 PUSH_STACK (solver->ranks, rank);
91 }
92
93 sort_bump (solver);
94
95 flags *flags = solver->flags;
96 unsigned idx;
97
98 for (all_stack (datarank, rank, solver->ranks))
99 if (flags[idx = rank.data].active)
100 kissat_move_to_front (solver, idx);
101
102 CLEAR_STACK (solver->ranks);
103}
104
106 START (bump);
107 const size_t bumped = SIZE_STACK (solver->analyzed);
108 if (!solver->stable)
109 move_analyzed_variables_to_front_of_queue (solver);
110 else
111 bump_analyzed_variable_scores (solver);
112 ADD (literals_bumped, bumped);
113 STOP (bump);
114}
115
117 KISSAT_assert (solver->stable);
118 heap *scores = SCORES;
119 for (all_variables (idx))
120 if (ACTIVE (idx) && !kissat_heap_contains (scores, idx))
121 kissat_push_heap (solver, scores, idx);
122}
123
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define MAX(a, b)
Definition avl.h:23
#define SMALLER(A, B)
Definition bump.c:15
void kissat_bump_score_increment(kissat *solver)
Definition bump.c:45
void kissat_bump_variable(kissat *solver, unsigned idx)
Definition bump.c:69
void kissat_rescale_scores(kissat *solver)
Definition bump.c:30
#define RANK(A)
Definition bump.c:14
void kissat_update_scores(kissat *solver)
Definition bump.c:116
void kissat_bump_analyzed(kissat *solver)
Definition bump.c:105
#define RADIX_SORT_BUMP_LIMIT
Definition bump.c:17
#define MAX_SCORE
Definition bump.h:17
#define all_stack(T, E, S)
Definition stack.h:94
#define SIZE_STACK(S)
Definition stack.h:19
#define EMPTY_STACK(S)
Definition stack.h:18
#define CLEAR_STACK(S)
Definition stack.h:50
#define PUSH_STACK(S, E)
Definition stack.h:39
#define ADD(NAME, DELTA)
#define INC(NAME)
#define LOG(...)
#define ACTIVE
Definition espresso.h:129
void kissat_rescale_heap(kissat *solver, heap *heap, double factor)
Definition heap.c:69
#define all_variables(IDX)
Definition internal.h:269
#define SCORES
Definition internal.h:262
#define KISSAT_assert(ignore)
Definition global.h:13
#define SORT_STACK(TYPE, S, LESS)
Definition sort.h:148
#define solver
Definition kitten.c:211
#define GET_OPTION(N)
Definition options.h:295
#define kissat_phase(...)
Definition print.h:48
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define RADIX_STACK(VTYPE, RTYPE, S, RANK)
Definition rank.h:136
#define GET(NAME)
Definition statistics.h:416
Definition flags.h:11
bool active
Definition flags.h:12
Definition heap.h:19
unsigned rank
Definition vector.c:142