@@ -139,7 +139,7 @@ decision_proceduret::resultt smt2_dect::read_result(std::istream &in)
139
139
boolean_assignment.resize (no_boolean_variables, false );
140
140
141
141
typedef std::unordered_map<irep_idt, irept> valuest;
142
- valuest values ;
142
+ valuest parsed_values ;
143
143
144
144
while (in)
145
145
{
@@ -167,7 +167,7 @@ decision_proceduret::resultt smt2_dect::read_result(std::istream &in)
167
167
// ( (|some_integer| 0) )
168
168
// ( (|some_integer| (- 10)) )
169
169
170
- values [s0.id ()]= s1;
170
+ parsed_values [s0.id ()] = s1;
171
171
}
172
172
else if (
173
173
parsed.id ().empty () && parsed.get_sub ().size () == 2 &&
@@ -207,16 +207,29 @@ decision_proceduret::resultt smt2_dect::read_result(std::istream &in)
207
207
208
208
for (auto &assignment : identifier_map)
209
209
{
210
- std::string conv_id= convert_identifier (assignment.first );
211
- const irept &value=values [conv_id];
212
- assignment.second .value = parse_rec (value, assignment.second .type );
210
+ std::string conv_id = convert_identifier (assignment.first );
211
+ const irept &value = parsed_values [conv_id];
212
+ assignment.second .value = parse_rec (value, assignment.second .type );
213
213
}
214
214
215
215
// Booleans
216
216
for (unsigned v=0 ; v<no_boolean_variables; v++)
217
217
{
218
- const irept &value=values[" B" +std::to_string (v)];
219
- boolean_assignment[v]=(value.id ()==ID_true);
218
+ const std::string boolean_identifier = " B" + std::to_string (v);
219
+ boolean_assignment[v] = [&]() {
220
+ const auto found_parsed_value = parsed_values.find (boolean_identifier);
221
+ if (found_parsed_value != parsed_values.end ())
222
+ return found_parsed_value->second .id () == ID_true;
223
+ // Work out the value based on what set_to was called with.
224
+ const auto found_set_value =
225
+ set_values.find (' |' + boolean_identifier + ' |' );
226
+ if (found_set_value != set_values.end ())
227
+ return found_set_value->second ;
228
+ // Old code used the computation
229
+ // const irept &value=values["B"+std::to_string(v)];
230
+ // boolean_assignment[v]=(value.id()==ID_true);
231
+ return parsed_values[boolean_identifier].id () == ID_true;
232
+ }();
220
233
}
221
234
222
235
return res;
0 commit comments