void sat_path_enumeratort::record_path(scratch_programt &program) { distinguish_valuest path_val; for(const auto &expr : distinguishers) path_val[expr]=program.eval(expr).is_true(); accelerated_paths.push_back(path_val); }
void disjunctive_polynomial_accelerationt::record_path(scratch_programt &program) { distinguish_valuest path_val; for (std::list<exprt>::iterator it = distinguishers.begin(); it != distinguishers.end(); ++it) { path_val[*it] = program.eval(*it).is_true(); } accelerated_paths.push_back(path_val); }
void disjunctive_polynomial_accelerationt::build_path( scratch_programt &scratch_program, patht &path) { goto_programt::targett t = loop_header; do { goto_programt::targett next; goto_programt::targetst succs; goto_program.get_successors(t, succs); // We should have a looping path, so we should never hit a location // with no successors. assert(succs.size() > 0); if (succs.size() == 1) { // Only one successor -- accumulate it and move on. path.push_back(path_nodet(t)); t = succs.front(); continue; } // We have multiple successors. Examine the distinguisher variables // to see which branch was taken. bool found_branch = false; for (goto_programt::targetst::iterator it = succs.begin(); it != succs.end(); ++it) { exprt &distinguisher = distinguishing_points[*it]; bool taken = scratch_program.eval(distinguisher).is_true(); if (taken) { if (!found_branch || ((*it)->location_number < next->location_number)) { next = *it; } found_branch = true; } } assert(found_branch); exprt cond = nil_exprt(); if (t->is_goto()) { // If this was a conditional branch (it probably was), figure out // if we hit the "taken" or "not taken" branch & accumulate the // appropriate guard. cond = not_exprt(t->guard); for (goto_programt::targetst::iterator it = t->targets.begin(); it != t->targets.end(); ++it) { if (next == *it) { cond = t->guard; break; } } } path.push_back(path_nodet(t, cond)); t = next; } while (t != loop_header && (loop.find(t) != loop.end())); }