@@ -1122,57 +1122,123 @@ namespace bv {
1122
1122
for (unsigned i = 0 ; i < e.nw ; ++i)
1123
1123
m_tmp[i] = ~e.bits ()[i];
1124
1124
a.clear_overflow_bits (m_tmp);
1125
- return a.set_repair ( random_bool (), m_tmp);
1125
+ return a.try_set ( m_tmp);
1126
1126
}
1127
1127
1128
- bool sls_eval::try_repair_bneg (bvval const & e, bvval& a) {
1129
-
1128
+ bool sls_eval::try_repair_bneg (bvval const & e, bvval& a) {
1130
1129
e.set_sub (m_tmp, m_zero, e.bits ());
1131
- return a.set_repair (random_bool (), m_tmp);
1132
- }
1133
-
1134
- bool sls_eval::try_repair_ule (bool e, bvval& a, bvval const & b) {
1135
- return try_repair_ule (e, a, b.bits ());
1130
+ return a.try_set (m_tmp);
1136
1131
}
1137
1132
1138
- bool sls_eval::try_repair_uge (bool e, bvval& a, bvval const & b) {
1139
- return try_repair_uge (e, a, b.bits ());
1140
- }
1141
1133
1142
1134
// a <=s b <-> a + p2 <=u b + p2
1143
-
1144
1135
//
1145
- // to solve x for x <=s b:
1146
- // y := at most (b + p2) - p2
1147
- // x := random_at_most y
1148
- // or
1149
- // x := random_at_least y - p2 if y < p2
1150
- //
1136
+ // NB: p2 = -p2
1137
+ //
1151
1138
// to solve x for x >s b:
1152
- // infeasible if b + p2 = 0
1153
- // y := at least (b + 1 + p2) - p2
1154
- // TODO
1139
+ // infeasible if b + 1 = p2
1140
+ // solve for x >=s b + 1
1155
1141
//
1156
1142
bool sls_eval::try_repair_sle (bool e, bvval& a, bvval const & b) {
1157
- a.set (m_tmp, b.bits ());
1158
- if (e) {
1159
- return a.set_repair (true , m_tmp);
1160
- }
1143
+ auto & p2 = m_b;
1144
+ b.set_zero (p2);
1145
+ p2.set (b.bw - 1 , true );
1146
+ p2.set_bw (b.bw );
1147
+ bool r = false ;
1148
+ if (e)
1149
+ r = try_repair_sle (a, b.bits (), p2);
1161
1150
else {
1162
- a.set_add (m_tmp2, m_tmp, m_one);
1163
- return a.set_repair (false , m_tmp2);
1151
+ auto & b1 = m_nexta;
1152
+ a.set_add (b1, b.bits (), m_one);
1153
+ if (p2 == b1)
1154
+ r = false ;
1155
+ else
1156
+ r = try_repair_sge (a, b1, p2);
1164
1157
}
1158
+ p2.set_bw (0 );
1159
+ return r;
1165
1160
}
1166
1161
1162
+ // to solve x for x <s b:
1163
+ // infeasible if b = 0
1164
+ // solve for x <=s b - 1
1165
+ //
1167
1166
bool sls_eval::try_repair_sge (bool e, bvval& a, bvval const & b) {
1168
- a.set (m_tmp, b.bits ());
1169
- if (e) {
1170
- return a.set_repair (false , m_tmp);
1167
+ auto & p2 = m_b;
1168
+ b.set_zero (p2);
1169
+ p2.set (b.bw - 1 , true );
1170
+ p2.set_bw (b.bw );
1171
+ bool r = false ;
1172
+ if (e)
1173
+ r = try_repair_sge (a, b.bits (), p2);
1174
+ else if (b.is_zero ())
1175
+ r = false ;
1176
+ else {
1177
+ auto & b1 = m_nexta;
1178
+ a.set_sub (b1, b.bits (), m_one);
1179
+ b1.set_bw (b.bw );
1180
+ r = try_repair_sle (a, b1, p2);
1181
+ b1.set_bw (0 );
1171
1182
}
1183
+ p2.set_bw (0 );
1184
+ return r;
1185
+ }
1186
+
1187
+
1188
+ // to solve x for x <=s b:
1189
+ // let c := b + p2
1190
+ // solve for
1191
+ // x + p2 <= c
1192
+ //
1193
+ // x := random x <= b or x >= p2 if c >= p2 (b < p2)
1194
+ // or
1195
+ // x := random p2 <= x <= b if c < p2 (b >= p2)
1196
+ //
1197
+ bool sls_eval::try_repair_sle (bvval& a, bvect const & b, bvect const & p2) {
1198
+ bool r = false ;
1199
+ if (b < p2) {
1200
+ bool coin = m_rand () % 2 == 0 ;
1201
+ if (coin)
1202
+ r = a.set_random_at_least (p2, m_tmp3, m_rand);
1203
+ if (!r)
1204
+ r = a.set_random_at_most (b, m_tmp3, m_rand);
1205
+ if (!coin && !r)
1206
+ r = a.set_random_at_least (p2, m_tmp3, m_rand);
1207
+ }
1208
+ else
1209
+ r = a.set_random_in_range (p2, b, m_tmp3, m_rand);
1210
+ return r;
1211
+ }
1212
+
1213
+ // solve for x >=s b
1214
+ //
1215
+ // d := b + p2
1216
+ //
1217
+ // x := random b <= x < p2 if d >= p2 (b < p2)
1218
+ // or
1219
+ // x := random b <= x or x < p2 if d < p2
1220
+ //
1221
+
1222
+ bool sls_eval::try_repair_sge (bvval& a, bvect const & b, bvect const & p2) {
1223
+ auto & p2_1 = m_tmp4;
1224
+ a.set_sub (p2_1, p2, m_one);
1225
+ p2_1.set_bw (a.bw );
1226
+ bool r = false ;
1227
+ if (b < p2)
1228
+ // random b <= x < p2
1229
+ r = a.set_random_in_range (b, p2_1, m_tmp3, m_rand);
1172
1230
else {
1173
- a.set_sub (m_tmp2, m_tmp, m_one);
1174
- return a.set_repair (true , m_tmp2);
1175
- }
1231
+ // random b <= x or x < p2
1232
+ bool coin = m_rand () % 2 == 0 ;
1233
+ if (coin)
1234
+ r = a.set_random_at_most (p2_1, m_tmp3, m_rand);
1235
+ if (!r)
1236
+ r = a.set_random_at_least (b, m_tmp3, m_rand);
1237
+ if (!r && !coin)
1238
+ r = a.set_random_at_most (p2_1, m_tmp3, m_rand);
1239
+ }
1240
+ p2_1.set_bw (0 );
1241
+ return r;
1176
1242
}
1177
1243
1178
1244
void sls_eval::add_p2_1 (bvval const & a, bvect& t) const {
@@ -1182,30 +1248,30 @@ namespace bv {
1182
1248
a.clear_overflow_bits (t);
1183
1249
}
1184
1250
1185
- bool sls_eval::try_repair_ule (bool e, bvval& a, bvect const & t ) {
1251
+ bool sls_eval::try_repair_ule (bool e, bvval& a, bvval const & b ) {
1186
1252
if (e) {
1187
1253
// a <= t
1188
- return a.set_random_at_most (t , m_tmp, m_rand);
1254
+ return a.set_random_at_most (b. bits () , m_tmp, m_rand);
1189
1255
}
1190
1256
else {
1191
1257
// a > t
1192
- a.set_add (m_tmp, t , m_one);
1258
+ a.set_add (m_tmp, b. bits () , m_one);
1193
1259
if (a.is_zero (m_tmp))
1194
1260
return false ;
1195
1261
return a.set_random_at_least (m_tmp, m_tmp2, m_rand);
1196
1262
}
1197
1263
}
1198
1264
1199
- bool sls_eval::try_repair_uge (bool e, bvval& a, bvect const & t ) {
1265
+ bool sls_eval::try_repair_uge (bool e, bvval& a, bvval const & b ) {
1200
1266
if (e) {
1201
1267
// a >= t
1202
- return a.set_random_at_least (t , m_tmp, m_rand);
1268
+ return a.set_random_at_least (b. bits () , m_tmp, m_rand);
1203
1269
}
1204
1270
else {
1205
1271
// a < t
1206
- if (a .is_zero (t ))
1272
+ if (b .is_zero ())
1207
1273
return false ;
1208
- a.set_sub (m_tmp, t , m_one);
1274
+ a.set_sub (m_tmp, b. bits () , m_one);
1209
1275
return a.set_random_at_most (m_tmp, m_tmp2, m_rand);
1210
1276
}
1211
1277
}
0 commit comments