@@ -43,17 +43,18 @@ namespace bv {
43
43
}
44
44
45
45
void sls::init_repair () {
46
- m_repair_down. reset () ;
46
+ m_repair_down = UINT_MAX ;
47
47
m_repair_up.reset ();
48
+ m_repair_roots.reset ();
48
49
for (auto * e : m_terms.assertions ()) {
49
50
if (!m_eval.bval0 (e)) {
50
51
m_eval.set (e, true );
51
- m_repair_down .insert (e->get_id ());
52
+ m_repair_roots .insert (e->get_id ());
52
53
}
53
54
}
54
55
for (app* t : m_terms.terms ())
55
56
if (t && !eval_is_correct (t))
56
- m_repair_down .insert (t->get_id ());
57
+ m_repair_roots .insert (t->get_id ());
57
58
}
58
59
59
60
void sls::reinit_eval () {
@@ -78,15 +79,27 @@ namespace bv {
78
79
79
80
std::pair<bool , app*> sls::next_to_repair () {
80
81
app* e = nullptr ;
81
- if (!m_repair_down.empty ()) {
82
- unsigned index = m_rand (m_repair_down.size ());
83
- e = m_terms.term (m_repair_down.elem_at (index ));
82
+ if (m_repair_down != UINT_MAX) {
83
+ e = m_terms.term (m_repair_down);
84
+ m_repair_down = UINT_MAX;
85
+ return { true , e };
84
86
}
85
- else if (!m_repair_up.empty ()) {
87
+
88
+ if (!m_repair_up.empty ()) {
86
89
unsigned index = m_rand (m_repair_up.size ());
90
+ m_repair_up.remove (index );
87
91
e = m_terms.term (m_repair_up.elem_at (index ));
92
+ return { false , e };
88
93
}
89
- return { !m_repair_down.empty (), e };
94
+
95
+ if (!m_repair_roots.empty ()) {
96
+ unsigned index = m_rand (m_repair_up.size ());
97
+ e = m_terms.term (m_repair_up.elem_at (index ));
98
+ m_repair_roots.remove (index );
99
+ return { true , e };
100
+ }
101
+
102
+ return { false , nullptr };
90
103
}
91
104
92
105
lbool sls::search () {
@@ -97,35 +110,19 @@ namespace bv {
97
110
auto [down, e] = next_to_repair ();
98
111
if (!e)
99
112
return l_true;
100
- bool is_correct = eval_is_correct (e);
101
- if (is_correct) {
102
- if (down)
103
- m_repair_down.remove (e->get_id ());
104
- else
105
- m_repair_up.remove (e->get_id ());
106
- }
107
- else {
108
- IF_VERBOSE (20 , verbose_stream () << (down ? " d #" : " u #" )
109
- << e->get_id () << " : "
110
- << mk_bounded_pp (e, m, 1 ) << " " ;
111
- if (bv.is_bv (e)) verbose_stream () << m_eval.wval0 (e) << " " << (m_eval.is_fixed0 (e)?" fixed " :" " );
112
- if (m.is_bool (e)) verbose_stream () << m_eval.bval0 (e) << " " ;
113
- verbose_stream () << " \n " );
114
- if (down)
115
- try_repair_down (e);
116
- else
117
- try_repair_up (e);
118
- }
113
+ if (eval_is_correct (e))
114
+ continue ;
115
+
116
+ trace_repair (down, e);
117
+
118
+ if (down)
119
+ try_repair_down (e);
120
+ else
121
+ try_repair_up (e);
119
122
}
120
123
return l_undef;
121
124
}
122
125
123
- void sls::trace () {
124
- IF_VERBOSE (2 , verbose_stream ()
125
- << " (bvsls :restarts " << m_stats.m_restarts
126
- << " :repair-down " << m_repair_down.size ()
127
- << " :repair-up " << m_repair_up.size () << " )\n " );
128
- }
129
126
130
127
lbool sls::operator ()() {
131
128
lbool res = l_undef;
@@ -147,29 +144,21 @@ namespace bv {
147
144
unsigned n = e->get_num_args ();
148
145
if (n > 0 ) {
149
146
unsigned s = m_rand (n);
150
- for (unsigned i = 0 ; i < n; ++i)
151
- if (try_repair_down (e, (i + s) % n))
147
+ for (unsigned i = 0 ; i < n; ++i) {
148
+ auto j = (i + s) % n;
149
+ if (m_eval.try_repair (e, j)) {
150
+ set_repair_down (e->get_arg (j));
152
151
return ;
152
+ }
153
+ }
153
154
}
154
- m_repair_down.remove (e->get_id ());
155
155
m_repair_up.insert (e->get_id ());
156
156
}
157
157
158
- bool sls::try_repair_down (app* e, unsigned i) {
159
- expr* child = e->get_arg (i);
160
- bool was_repaired = m_eval.try_repair (e, i);
161
- if (was_repaired) {
162
- m_repair_down.insert (child->get_id ());
163
- for (auto p : m_terms.parents (child))
164
- m_repair_up.insert (p->get_id ());
165
- }
166
- return was_repaired;
167
- }
168
-
169
158
void sls::try_repair_up (app* e) {
170
- m_repair_up. remove (e-> get_id ());
159
+
171
160
if (m_terms.is_assertion (e) || !m_eval.repair_up (e))
172
- m_repair_down .insert (e->get_id ());
161
+ m_repair_roots .insert (e->get_id ());
173
162
else {
174
163
if (!eval_is_correct (e)) {
175
164
verbose_stream () << " incorrect eval #" << e->get_id () << " " << mk_bounded_pp (e, m) << " \n " ;
@@ -225,10 +214,10 @@ namespace bv {
225
214
out << e->get_id () << " : " << mk_bounded_pp (e, m, 1 ) << " " ;
226
215
if (m_eval.is_fixed0 (e))
227
216
out << " f " ;
228
- if (m_repair_down.contains (e->get_id ()))
229
- out << " d " ;
230
217
if (m_repair_up.contains (e->get_id ()))
231
218
out << " u " ;
219
+ if (m_repair_roots.contains (e->get_id ()))
220
+ out << " r " ;
232
221
if (bv.is_bv (e))
233
222
out << m_eval.wval0 (e);
234
223
else if (m.is_bool (e))
@@ -244,4 +233,21 @@ namespace bv {
244
233
m_config.m_max_restarts = p.max_restarts ();
245
234
m_rand.set_seed (p.random_seed ());
246
235
}
236
+
237
+ void sls::trace_repair (bool down, expr* e) {
238
+ IF_VERBOSE (20 ,
239
+ verbose_stream () << (down ? " d #" : " u #" )
240
+ << e->get_id () << " : "
241
+ << mk_bounded_pp (e, m, 1 ) << " " ;
242
+ if (bv.is_bv (e)) verbose_stream () << m_eval.wval0 (e) << " " << (m_eval.is_fixed0 (e) ? " fixed " : " " );
243
+ if (m.is_bool (e)) verbose_stream () << m_eval.bval0 (e) << " " ;
244
+ verbose_stream () << " \n " );
245
+ }
246
+
247
+ void sls::trace () {
248
+ IF_VERBOSE (2 , verbose_stream ()
249
+ << " (bvsls :restarts " << m_stats.m_restarts
250
+ << " :repair-up " << m_repair_up.size ()
251
+ << " :repair-roots " << m_repair_roots.size () << " )\n " );
252
+ }
247
253
}
0 commit comments