@@ -21,6 +21,7 @@ Module Name:
21
21
#include " ast/sls/bv_sls.h"
22
22
#include " ast/ast_pp.h"
23
23
#include " ast/ast_ll_pp.h"
24
+ #include " params/sls_params.hpp"
24
25
25
26
namespace bv {
26
27
@@ -48,15 +49,17 @@ namespace bv {
48
49
49
50
void sls::reinit_eval () {
50
51
std::function<bool (expr*, unsigned )> eval = [&](expr* e, unsigned i) {
52
+ auto should_keep = [&]() {
53
+ return m_rand () % 100 >= 95 ;
54
+ };
51
55
if (m.is_bool (e)) {
52
- if (m_eval.is_fixed0 (e))
56
+ if (m_eval.is_fixed0 (e) || should_keep () )
53
57
return m_eval.bval0 (e);
54
58
}
55
59
else if (bv.is_bv (e)) {
56
60
auto & w = m_eval.wval0 (e);
57
- if (w.get (w.fixed , i))
58
- return w.get (w.bits , i);
59
-
61
+ if (w.get (w.fixed , i) || should_keep ())
62
+ return w.get (w.bits , i);
60
63
}
61
64
return m_rand () % 2 == 0 ;
62
65
};
@@ -77,51 +80,59 @@ namespace bv {
77
80
unsigned index = m_rand (m_repair_down.size ());
78
81
e = m_terms.term (m_repair_down.elem_at (index ));
79
82
}
80
- else if (m_repair_up.empty ()) {
83
+ else if (! m_repair_up.empty ()) {
81
84
unsigned index = m_rand (m_repair_up.size ());
82
85
e = m_terms.term (m_repair_up.elem_at (index ));
83
86
}
84
87
return { !m_repair_down.empty (), e };
85
88
}
86
89
87
90
lbool sls::search () {
88
- // init and init_eval were invoked.
89
- unsigned & n = m_stats. m_moves ;
90
- n = 0 ;
91
- for (; n < m_config. m_max_repairs && m. inc (); ++n) {
91
+ // init and init_eval were invoked
92
+ unsigned n = 0 ;
93
+ for (; n++ < m_config. m_max_repairs && m. inc (); ) {
94
+ ++m_stats. m_moves ;
92
95
auto [down, e] = next_to_repair ();
93
96
if (!e)
94
97
return l_true;
95
- IF_VERBOSE (20 , verbose_stream () << (down ? " d " : " u " ) << mk_bounded_pp (e, m, 1 ) << " \n " );
98
+ IF_VERBOSE (20 , verbose_stream () << (down ? " d #" : " u #" )
99
+ << e->get_id () << " : "
100
+ << mk_bounded_pp (e, m, 1 ) << " " ;
101
+ if (bv.is_bv (e)) verbose_stream () << m_eval.wval0 (e);
102
+ verbose_stream () << " \n " );
96
103
if (eval_is_correct (e)) {
97
104
if (down)
98
105
m_repair_down.remove (e->get_id ());
99
106
else
100
107
m_repair_up.remove (e->get_id ());
101
108
}
102
- else if (down) {
103
- try_repair_down (e);
104
- }
109
+ else if (down)
110
+ try_repair_down (e);
105
111
else
106
112
try_repair_up (e);
107
113
}
108
114
return l_undef;
109
115
}
110
116
117
+ void sls::trace () {
118
+ IF_VERBOSE (2 , verbose_stream ()
119
+ << " (bvsls :restarts " << m_stats.m_restarts
120
+ << " :repair-down " << m_repair_down.size ()
121
+ << " :repair-up " << m_repair_up.size () << " )\n " );
122
+ }
123
+
111
124
lbool sls::operator ()() {
112
125
lbool res = l_undef;
126
+ m_stats.reset ();
127
+ m_stats.m_restarts = 0 ;
113
128
do {
114
- if (!m.inc ())
115
- return l_undef;
116
-
117
129
res = search ();
118
-
119
130
if (res != l_undef)
120
- return res ;
121
-
131
+ break ;
132
+ trace ();
122
133
reinit_eval ();
123
134
}
124
- while (m_stats.m_restarts ++ < m_config.m_max_restarts );
135
+ while (m. inc () && m_stats.m_restarts ++ < m_config.m_max_restarts );
125
136
126
137
return res;
127
138
}
@@ -162,6 +173,8 @@ namespace bv {
162
173
}
163
174
164
175
bool sls::eval_is_correct (app* e) {
176
+ if (!m_eval.can_eval1 (e))
177
+ return false ;
165
178
if (m.is_bool (e))
166
179
return m_eval.bval0 (e) == m_eval.bval1 (e);
167
180
if (bv.is_bv (e))
@@ -208,4 +221,9 @@ namespace bv {
208
221
terms.reset ();
209
222
return out;
210
223
}
224
+
225
+ void sls::updt_params (params_ref const & _p) {
226
+ sls_params p (_p);
227
+ m_config.m_max_restarts = p.max_restarts ();
228
+ }
211
229
}
0 commit comments