ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
extend.c
Go to the documentation of this file.
1#include "colors.h"
2#include "inline.h"
3
5
6static void undo_eliminated_assignment (kissat *solver) {
7 size_t size_etrail = SIZE_STACK (solver->etrail);
8#ifdef LOGGING
9 size_t size_eliminated = SIZE_STACK (solver->eliminated);
10#endif
11 if (!size_etrail) {
12 LOG ("all %zu eliminated variables are unassigned", size_eliminated);
13 return;
14 }
15
16 LOG ("unassigning %zu eliminated variables %.0f%%", size_etrail,
17 kissat_percent (size_etrail, size_eliminated));
18
19 value *values = BEGIN_STACK (solver->eliminated);
20
21 while (!EMPTY_STACK (solver->etrail)) {
22 const unsigned pos = POP_STACK (solver->etrail);
23 KISSAT_assert (pos < SIZE_STACK (solver->eliminated));
24 KISSAT_assert (values[pos]);
25 LOG2 ("unassigned eliminated[%u] external variable", pos);
26 values[pos] = 0;
27 }
28}
29
30static void extend_assign (kissat *solver, value *values, int lit) {
32 KISSAT_assert (lit != INT_MIN);
33 const unsigned idx = ABS (lit);
34 import *import = &PEEK_STACK (solver->import, idx);
37 const unsigned pos = import->lit;
38 KISSAT_assert (pos < SIZE_STACK (solver->eliminated));
39 const value value = lit < 0 ? -1 : 1;
40 values[pos] = value;
42 LOG ("assigned eliminated[%u] external literal %d", pos, value * idx);
43 PUSH_STACK (solver->etrail, pos);
44}
45
47 KISSAT_assert (!EMPTY_STACK (solver->extend));
48 KISSAT_assert (!solver->extended);
49
50 START (extend);
51 solver->extended = true;
52
53 undo_eliminated_assignment (solver);
54
55 LOG ("extending solution with reconstruction stack of size %zu",
56 SIZE_STACK (solver->extend));
57
58 value *evalues = BEGIN_STACK (solver->eliminated);
59 value *ivalues = solver->values;
60
61 const import *const imports = BEGIN_STACK (solver->import);
62
63 const extension *const begin = BEGIN_STACK (solver->extend);
64 extension const *p = END_STACK (solver->extend);
65
66#ifdef LOGGING
67 size_t assigned = 0;
68 size_t flipped = 0;
69#endif
70
71 while (p != begin) {
72 unsigned pos = UINT_MAX;
73 bool satisfied = false;
74
75 int eliminated = 0;
76 int blocking = 0;
77
78 size_t size = 0;
79#ifndef LOGGING
80 (void) size;
81#endif
82 do {
83 size++;
84 KISSAT_assert (begin < p);
85 const extension ext = *--p;
86 const int elit = ext.lit;
87 if (ext.blocking)
88 blocking = elit;
89
90 if (satisfied)
91 continue;
92
93 KISSAT_assert (elit != INT_MIN);
94 const unsigned eidx = ABS (elit);
95 KISSAT_assert (eidx < SIZE_STACK (solver->import));
96 const import *const import = imports + eidx;
98
99 if (import->eliminated) {
100 const unsigned tmp = import->lit;
101 KISSAT_assert (tmp < SIZE_STACK (solver->eliminated));
102 value value = evalues[tmp];
103
104 if (elit < 0)
105 value = -value;
106
107 if (value > 0) {
108 LOG2 ("previously assigned eliminated literal %d "
109 "satisfies clause",
110 elit);
111 satisfied = true;
112 } else if (!value && (!eliminated || pos < tmp)) {
113#ifdef LOGGING
114 if (eliminated)
115 LOG2 ("earlier unassigned eliminated literal %d", elit);
116 else
117 LOG2 ("found unassigned eliminated literal %d", elit);
118#endif
119 eliminated = elit;
120 pos = tmp;
121 }
122 } else {
123 const unsigned ilit = import->lit;
124 value value = ivalues[ilit];
126
127 if (elit < 0)
128 value = -value;
129
130 if (value > 0) {
131 LOG2 ("internal literal %s satisfies clause", LOGLIT (ilit));
132 satisfied = true;
133 }
134 }
135 } while (!blocking);
136
137 if (satisfied) {
138 LOGEXT2 (size, p, "satisfied");
139 continue;
140 }
141
142 if (eliminated && eliminated != blocking) {
143 LOGEXT2 (size, p,
144 "assigning eliminated unassigned external literal %d "
145 "to satisfy size %zu witness labelled clause at",
146 eliminated, size);
147 extend_assign (solver, evalues, eliminated);
148#ifdef LOGGING
149 assigned++;
150#endif
151 continue;
152 }
153
154#ifdef LOGGING
155 const unsigned blocking_idx = ABS (blocking);
156 KISSAT_assert (blocking_idx < SIZE_STACK (solver->import));
157 KISSAT_assert (imports[blocking_idx].eliminated);
158 const unsigned blocking_pos = imports[blocking_idx].lit;
159 KISSAT_assert (blocking_pos < SIZE_STACK (solver->eliminated));
160 const value blocking_value = evalues[blocking_pos];
161 LOGEXT2 (size, p,
162 "%s blocking external literal %d "
163 "to satisfy size %zu witness labelled clause at",
164 blocking_value ? "flipping" : "assigning", blocking, size);
165 if (blocking_value)
166 flipped++;
167 else
168 assigned++;
169#endif
170 extend_assign (solver, evalues, blocking);
171 }
172
173#ifdef LOGGING
174 size_t total = SIZE_STACK (solver->eliminated);
175 LOG ("assigned %zu external variables %.0f%% out of %zu eliminated",
176 assigned, kissat_percent (assigned, total), total);
177 LOG ("flipped %zu external variables %.0f%% out of %zu assigned", flipped,
178 kissat_percent (flipped, assigned), assigned);
179 LOG ("extended assignment complete");
180#endif
181
182 STOP (extend);
183}
184
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define BEGIN_STACK(S)
Definition stack.h:46
#define POP_STACK(S)
Definition stack.h:37
#define SIZE_STACK(S)
Definition stack.h:19
#define EMPTY_STACK(S)
Definition stack.h:18
#define PUSH_STACK(S, E)
Definition stack.h:39
#define END_STACK(S)
Definition stack.h:48
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
bool pos
Definition globals.c:30
Cube * p
Definition exorList.c:222
void kissat_extend(kissat *solver)
Definition extend.c:46
int kissat_value(kissat *solver, int elit)
Definition internal.c:498
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOG2(...)
Definition logging.h:352
#define LOGEXT2(...)
Definition logging.h:391
#define LOGLIT(...)
Definition logging.hpp:99
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
int lit
Definition satVec.h:130
signed int lit
Definition extend.h:13
bool blocking
Definition extend.h:14
bool eliminated
Definition internal.h:52
bool imported
Definition internal.h:51
#define ABS(a)
Definition util_old.h:250