@@ -52,6 +52,19 @@ namespace bv {
52
52
m_repair_roots.insert (e->get_id ());
53
53
}
54
54
}
55
+ for (auto * t : m_terms.terms ()) {
56
+ if (t && !re_eval_is_correct (t))
57
+ m_repair_roots.insert (t->get_id ());
58
+ }
59
+ }
60
+
61
+ void sls::init_repair_goal (app* t) {
62
+ if (m.is_bool (t))
63
+ m_eval.set (t, m_eval.bval1 (t));
64
+ else if (bv.is_bv (t)) {
65
+ auto & v = m_eval.wval (t);
66
+ v.bits ().copy_to (v.nw , v.eval );
67
+ }
55
68
}
56
69
57
70
void sls::reinit_eval () {
@@ -89,11 +102,18 @@ namespace bv {
89
102
return { false , e };
90
103
}
91
104
92
- if (!m_repair_roots.empty ()) {
105
+ while (!m_repair_roots.empty ()) {
93
106
unsigned index = m_repair_roots.elem_at (m_rand (m_repair_roots.size ()));
94
107
e = m_terms.term (index );
95
- m_repair_root = index ;
96
- return { true , e };
108
+ if (m_terms.is_assertion (e) && !m_eval.bval1 (e)) {
109
+ SASSERT (m_eval.bval0 (e));
110
+ return { true , e };
111
+ }
112
+ if (!re_eval_is_correct (e)) {
113
+ init_repair_goal (e);
114
+ return { true , e };
115
+ }
116
+ m_repair_roots.remove (index );
97
117
}
98
118
99
119
return { false , nullptr };
@@ -103,11 +123,12 @@ namespace bv {
103
123
// init and init_eval were invoked
104
124
unsigned n = 0 ;
105
125
for (; n++ < m_config.m_max_repairs && m.inc (); ) {
106
- ++m_stats.m_moves ;
107
126
auto [down, e] = next_to_repair ();
108
127
if (!e)
109
128
return l_true;
110
129
130
+ ++m_stats.m_moves ;
131
+
111
132
trace_repair (down, e);
112
133
113
134
if (down)
@@ -137,22 +158,12 @@ namespace bv {
137
158
138
159
void sls::try_repair_down (app* e) {
139
160
140
- if (eval_is_correct (e)) {
141
- // if (bv.is_bv(e))
142
- // verbose_stream() << mk_pp(e, m) << " := " << m_eval.wval(e) << "\n";
143
- m_repair_roots.remove (m_repair_root);
144
- m_repair_root = UINT_MAX;
145
- return ;
146
- }
147
-
148
161
unsigned n = e->get_num_args ();
149
162
if (n == 0 ) {
150
163
auto & v = m_eval.wval (e);
151
- v.commit_eval ();
164
+ VERIFY ( v.commit_eval () );
152
165
for (auto p : m_terms.parents (e))
153
166
m_repair_up.insert (p->get_id ());
154
- m_repair_roots.remove (m_repair_root);
155
- m_repair_root = UINT_MAX;
156
167
return ;
157
168
}
158
169
0 commit comments