44 for(patht::iterator it=loop.begin();
48 body.push_back(*(it->loc));
52 std::map<exprt, polynomialt> polynomials;
59 std::cout <<
"Polynomial accelerating program:\n";
61 for(goto_programt::instructionst::iterator it=body.begin();
65 it->output(std::cout);
68 std::cout <<
"Modified:\n";
70 for(expr_sett::iterator it=targets.begin();
74 std::cout <<
expr2c(*it,
ns) <<
'\n';
78 for(goto_programt::instructionst::iterator it=body.begin();
82 if(it->is_assign() || it->is_decl())
84 assigns.push_back(*it);
95 for(expr_sett::iterator it=targets.begin();
112 if(influence.find(target)==influence.end())
115 std::cout <<
"Found nonrecursive expression: "
123 if(target.
id()==ID_index ||
124 target.
id()==ID_dereference)
133 std::map<exprt, polynomialt> this_poly;
134 this_poly[target]=poly;
138 polynomials.insert(std::make_pair(target, poly));
144 std::cout <<
"Failed to fit a polynomial for "
152 if(polynomials.empty())
169 bool path_is_monotone;
176 catch(
const std::string &s)
179 std::cout <<
"Assumptions error: " << s <<
'\n';
185 for(std::map<exprt, polynomialt>::iterator it=polynomials.begin();
186 it!=polynomials.end();
189 replace_expr(it->first, it->second.to_expr(), guard_last);
238 for(std::map<exprt, polynomialt>::iterator it=polynomials.begin();
239 it!=polynomials.end();
242 program.assign(it->first, it->second.to_expr());
252 std::cout <<
"Failed to accelerate a nonrecursive expression\n";
277 std::vector<expr_listt> parameters;
278 std::set<std::pair<expr_listt, exprt> > coefficients;
286 std::cout <<
"Fitting a polynomial for " <<
expr2c(var,
ns)
287 <<
", which depends on:\n";
289 for(expr_sett::iterator it=influence.begin();
293 std::cout <<
expr2c(*it,
ns) <<
'\n';
297 for(expr_sett::iterator it=influence.begin();
301 if(it->id()==ID_index ||
302 it->id()==ID_dereference)
310 exprs.push_back(*it);
311 parameters.push_back(exprs);
314 parameters.push_back(exprs);
320 parameters.push_back(exprs);
328 parameters.push_back(exprs);
339 for(std::vector<expr_listt>::iterator it=parameters.begin();
340 it!=parameters.end();
345 coefficients.insert(std::make_pair(*it, coeff.
symbol_expr()));
357 std::map<exprt, int> values;
359 for(expr_sett::iterator it=influence.begin();
367 std::cout <<
"Fitting polynomial over " << values.size()
371 for(
int n=0; n<=2; n++)
373 for(expr_sett::iterator it=influence.begin();
387 for(expr_sett::iterator it=influence.begin();
397 std::cout <<
"Fitting polynomial with program:\n";
414 catch(
const std::string &s)
416 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
420 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
461 std::cout <<
"Fitting constant, eval'd to: "
471 mon.
terms.push_back(term);
472 mon.
coeff=mp.to_long();
479 catch(
const std::string &s)
481 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
485 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
494 std::map<exprt, int> &values,
495 std::set<std::pair<expr_listt, exprt> > &coefficients,
504 for(std::map<exprt, int>::iterator it=values.begin();
508 typet this_type=it->first.type();
509 if(this_type.
id()==ID_pointer)
512 std::cout <<
"Overriding pointer type\n";
517 if(!expr_type.has_value())
523 expr_type =
join_types(*expr_type, this_type);
529 "joined types must be non-empty bitvector types");
532 for(std::map<exprt, int>::iterator it=values.begin();
540 for(
int i=0; i < num_unwindings; i++)
542 program.
append(loop_body);
548 for(std::set<std::pair<expr_listt, exprt> >::iterator it=coefficients.begin();
549 it!=coefficients.end();
552 int concrete_value=1;
554 for(expr_listt::const_iterator e_it=it->first.begin();
555 e_it!=it->first.end();
562 concrete_value *= num_unwindings;
566 std::map<exprt, int>::iterator v_it=values.find(e);
568 if(v_it!=values.end())
570 concrete_value *= v_it->second;
614 for(goto_programt::instructionst::reverse_iterator r_it=orig_body.rbegin();
615 r_it!=orig_body.rend();
618 if(r_it->is_assign())
624 exprt assignment_lhs = r_it->assign_lhs();
625 exprt assignment_rhs = r_it->assign_rhs();
630 for(expr_sett::iterator s_it=lhs_syms.begin();
631 s_it!=lhs_syms.end();
634 if(cone.find(*s_it)!=cone.end())
638 body.push_front(*r_it);
639 cone.erase(assignment_lhs);
649 std::map<exprt, polynomialt> polynomials,
664 std::vector<exprt> polynomials_hold;
669 for(std::map<exprt, polynomialt>::iterator it=polynomials.begin();
670 it!=polynomials.end();
673 const equal_exprt holds(it->first, it->second.to_expr());
676 polynomials_hold.push_back(holds);
679 program.append(body);
686 for(std::vector<exprt>::iterator it=polynomials_hold.begin();
687 it!=polynomials_hold.end();
694 std::cout <<
"Checking following program for inductiveness:\n";
704 std::cout <<
"Not inductive!\n";
713 catch(
const std::string &s)
715 std::cout <<
"Error in inductiveness SAT check: " << s <<
'\n';
720 std::cout <<
"Error in inductiveness SAT check: " << s <<
'\n';
727 std::map<exprt, polynomialt> &polynomials,
735 for(std::map<exprt, polynomialt>::iterator it=polynomials.begin();
736 it!=polynomials.end();
739 it->second.substitute(substitution);
755 for(patht::reverse_iterator r_it=path.rbegin();
764 const exprt &lhs = t->assign_lhs();
765 const exprt &rhs = t->assign_rhs();
767 if(lhs.
id()==ID_symbol)
771 else if(lhs.
id()==ID_index ||
772 lhs.
id()==ID_dereference)
781 else if(t->is_assume() || t->is_assert())
790 if(!r_it->guard.is_true() && !r_it->guard.is_nil())