@@ -52,9 +52,6 @@ namespace bv {
52
52
m_repair_roots.insert (e->get_id ());
53
53
}
54
54
}
55
- for (app* t : m_terms.terms ())
56
- if (t && !eval_is_correct (t))
57
- m_repair_roots.insert (t->get_id ());
58
55
}
59
56
60
57
void sls::reinit_eval () {
@@ -67,7 +64,7 @@ namespace bv {
67
64
return m_eval.bval0 (e);
68
65
}
69
66
else if (bv.is_bv (e)) {
70
- auto & w = m_eval.wval0 (e);
67
+ auto & w = m_eval.wval (e);
71
68
if (w.fixed .get (i) || should_keep ())
72
69
return w.get_bit (i);
73
70
}
@@ -142,17 +139,21 @@ namespace bv {
142
139
143
140
void sls::try_repair_down (app* e) {
144
141
unsigned n = e->get_num_args ();
145
- if (n > 0 ) {
146
- unsigned s = m_rand (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));
151
- return ;
152
- }
142
+ if (n == 0 ) {
143
+ m_eval.wval (e).commit_eval ();
144
+ m_repair_up.insert (e->get_id ());
145
+ }
146
+
147
+ unsigned s = m_rand (n);
148
+ for (unsigned i = 0 ; i < n; ++i) {
149
+ auto j = (i + s) % n;
150
+ if (m_eval.try_repair (e, j)) {
151
+ set_repair_down (e->get_arg (j));
152
+ return ;
153
153
}
154
154
}
155
- m_repair_up.insert (e->get_id ());
155
+
156
+ // search a new root / random walk to repair
156
157
}
157
158
158
159
void sls::try_repair_up (app* e) {
@@ -174,8 +175,10 @@ namespace bv {
174
175
return false ;
175
176
if (m.is_bool (e))
176
177
return m_eval.bval0 (e) == m_eval.bval1 (e);
177
- if (bv.is_bv (e))
178
- return m_eval.wval0 (e).eq (m_eval.wval1 (e));
178
+ if (bv.is_bv (e)) {
179
+ auto const & v = m_eval.wval (e);
180
+ return v.eval == v.bits ();
181
+ }
179
182
UNREACHABLE ();
180
183
return false ;
181
184
}
@@ -187,9 +190,8 @@ namespace bv {
187
190
if (!eval_is_correct (to_app (e))) {
188
191
verbose_stream () << " missed evaluation #" << e->get_id () << " " << mk_bounded_pp (e, m) << " \n " ;
189
192
if (bv.is_bv (e)) {
190
- auto const & v0 = m_eval.wval0 (e);
191
- auto const & v1 = m_eval.wval1 (to_app (e));
192
- verbose_stream () << v0 << " \n " << v1 << " \n " ;
193
+ auto const & v = m_eval.wval (e);
194
+ verbose_stream () << v << " \n " << v.eval << " \n " ;
193
195
}
194
196
}
195
197
if (!is_uninterp_const (e))
@@ -199,7 +201,7 @@ namespace bv {
199
201
if (m.is_bool (e))
200
202
mdl->register_decl (f, m.mk_bool_val (m_eval.bval0 (e)));
201
203
else if (bv.is_bv (e)) {
202
- auto const & v = m_eval.wval0 (e);
204
+ auto const & v = m_eval.wval (e);
203
205
rational n = v.get_value ();
204
206
mdl->register_decl (f, bv.mk_numeral (n, v.bw ));
205
207
}
@@ -219,7 +221,7 @@ namespace bv {
219
221
if (m_repair_roots.contains (e->get_id ()))
220
222
out << " r " ;
221
223
if (bv.is_bv (e))
222
- out << m_eval.wval0 (e);
224
+ out << m_eval.wval (e);
223
225
else if (m.is_bool (e))
224
226
out << (m_eval.bval0 (e)?" T" :" F" );
225
227
out << " \n " ;
@@ -239,7 +241,7 @@ namespace bv {
239
241
verbose_stream () << (down ? " d #" : " u #" )
240
242
<< e->get_id () << " : "
241
243
<< mk_bounded_pp (e, m, 1 ) << " " ;
242
- if (bv.is_bv (e)) verbose_stream () << m_eval.wval0 (e) << " " << (m_eval.is_fixed0 (e) ? " fixed " : " " );
244
+ if (bv.is_bv (e)) verbose_stream () << m_eval.wval (e) << " " << (m_eval.is_fixed0 (e) ? " fixed " : " " );
243
245
if (m.is_bool (e)) verbose_stream () << m_eval.bval0 (e) << " " ;
244
246
verbose_stream () << " \n " );
245
247
}
0 commit comments