46 {
49
52
53 undo_eliminated_assignment (
solver);
54
55 LOG (
"extending solution with reconstruction stack of size %zu",
57
60
61 const import *const imports = BEGIN_STACK (solver->import);
62
65
66#ifdef LOGGING
68 size_t flipped = 0;
69#endif
70
72 unsigned pos = UINT_MAX;
73 bool satisfied = false;
74
75 int eliminated = 0;
76 int blocking = 0;
77
79#ifndef LOGGING
80 (void) size;
81#endif
82 do {
86 const int elit = ext.
lit;
88 blocking = elit;
89
90 if (satisfied)
91 continue;
92
94 const unsigned eidx =
ABS (elit);
96 const import *const import = imports + eidx;
98
100 const unsigned tmp = import->lit;
103
104 if (elit < 0)
106
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;
121 }
122 } else {
123 const unsigned ilit = import->lit;
126
127 if (elit < 0)
129
131 LOG2 (
"internal literal %s satisfies clause",
LOGLIT (ilit));
132 satisfied = true;
133 }
134 }
135 } while (!blocking);
136
137 if (satisfied) {
139 continue;
140 }
141
142 if (eliminated && eliminated != blocking) {
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
150#endif
151 continue;
152 }
153
154#ifdef LOGGING
155 const unsigned blocking_idx =
ABS (blocking);
158 const unsigned blocking_pos = imports[blocking_idx].lit;
160 const value blocking_value = evalues[blocking_pos];
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
169#endif
170 extend_assign (
solver, evalues, blocking);
171 }
172
173#ifdef LOGGING
175 LOG (
"assigned %zu external variables %.0f%% out of %zu eliminated",
177 LOG (
"flipped %zu external variables %.0f%% out of %zu assigned", flipped,
179 LOG (
"extended assignment complete");
180#endif
181
183}
ABC_NAMESPACE_IMPL_START typedef signed char value
#define KISSAT_assert(ignore)