void rp_splitter_time::apply(rp_box_set& bs, int var) { rp_interval i1, i2; rp_box b1 = bs.remove_insert(); this->observe(b1, var); rp_box b2 = bs.insert(b1); if (quick_split_vars[&b1] == NULL){ quick_split_vars[&b1] = new std::set<int>(); } quick_split_vars[&b2] = new std::set<int>(*quick_split_vars[&b1]); if (is_time_variable(var) && !did_quick_split(&b1, var)){ if (this->real_hole(rp_box_elem(b1, var), rp_variable_domain(rp_problem_var(*_problem, var)), i1, i2)){ rp_interval_copy(rp_box_elem(b1, var), i1); rp_interval_copy(rp_box_elem(b2, var), i2); } else { // std::cout << "TIME SPLIT" << std::endl; rp_interval &vi = rp_box_elem(b1, var); double split = std::min(rp_binf(vi) + precision, rp_split_point(rp_binf(vi), rp_bsup(vi), 1000, 1)); // Real variable: [a,b] --> [center,b] and [a,center] rp_binf(rp_box_elem(b1, var)) = rp_bsup(rp_box_elem(b2, var)) = split; quick_split_vars[&b1]->insert(var); quick_split_vars[&b2]->insert(var); // rp_interval_midpoint(rp_box_elem(b1,var)); } } else if (rp_variable_integer(rp_problem_var(*_problem, var))){ if (this->integer_hole(rp_box_elem(b1, var), rp_variable_domain(rp_problem_var(*_problem, var)), i1, i2)) { rp_interval_copy(rp_box_elem(b1, var), i1); rp_interval_copy(rp_box_elem(b2, var), i2); } else { // no hole found // Integer variable: [a,b] --> [a+1,b] and [a,a] ++rp_binf(rp_box_elem(b1, var)); rp_bsup(rp_box_elem(b2, var)) = rp_binf(rp_box_elem(b2, var)); } } else { if (this->real_hole(rp_box_elem(b1, var), rp_variable_domain(rp_problem_var(*_problem, var)), i1, i2)) { rp_interval_copy(rp_box_elem(b1, var), i1); rp_interval_copy(rp_box_elem(b2, var), i2); } else { // Real variable: [a,b] --> [center,b] and [a,center] rp_binf(rp_box_elem(b1, var)) = rp_bsup(rp_box_elem(b2, var)) = rp_interval_midpoint(rp_box_elem(b1, var)); } } }
// Application of operator to reduce the box b int rp_operator_3b::apply(rp_box b) { DREAL_LOG_DEBUG << "rp_operator_3b::apply"; // domain to be reduced double u = rp_binf(rp_box_elem(b,_v)); double v = rp_bsup(rp_box_elem(b,_v)); double x; // Reduction of left bound [a,x] RP_ROUND_UPWARD(); x = u + _improve * (v-u); if (x>=v) { // reduction of whole domain return _o->apply(b); } else { rp_box_copy(_baux,b); rp_bsup(rp_box_elem(_baux,_v)) = x; if (!_o->apply(_baux)) { rp_binf(rp_box_elem(b,_v)) = x; } } // Reduction of right bound [x,b] RP_ROUND_DOWNWARD(); x = v - _improve * (v-u); rp_box_copy(_baux,b); rp_binf(rp_box_elem(_baux,_v)) = x; if (!_o->apply(_baux)) { rp_bsup(rp_box_elem(b,_v)) = x; } return( !(rp_interval_empty(rp_box_elem(b,_v))) ); }
/* Returns true if all the points of b are solutions of c */ int rp_ctr_numinf_inner(rp_ctr_num c, rp_box b) { int res; if (!(rp_expression_eval(rp_ctr_num_left(c),b))|| !(rp_expression_eval(rp_ctr_num_right(c),b))) { /* at least one expression has an empty range over b */ res = 0; } else { /* inner if left is smaller than right */ res = (rp_bsup(rp_expression_val(rp_ctr_num_left(c))) <= rp_binf(rp_expression_val(rp_ctr_num_right(c)))); } return( res ); }
/* Returns true if no point of b is solution of c */ int rp_ctr_numinf_unfeasible(rp_ctr_num c, rp_box b) { int res; if ((!rp_expression_eval(rp_ctr_num_left(c),b)) || (!rp_expression_eval(rp_ctr_num_right(c),b))) { /* at least one expression has an empty range over b */ res = 1; } else { /* unfeasible if left is entirely greater than right */ res = (rp_binf(rp_expression_val(rp_ctr_num_left(c))) > rp_bsup(rp_expression_val(rp_ctr_num_right(c)))); } return( res ); }
int rp_rule_interval(rp_parser p, rp_interval i) { /* interval [expr, expr] such that '[' has been read */ rp_interval left, right; int res = 0; if (rp_rule_constant_expr(p,left)) { if (rp_parser_expect(p,RP_TOKEN_COMMA,"comma")) { if (rp_rule_constant_expr(p,right)) { if (rp_parser_expect(p,RP_TOKEN_SQRBR,"]")) { rp_interval_set(i,rp_binf(left),rp_bsup(right)); res = 1; } } } } return( res ); }
/* Parse an unsigned number */ int rp_rule_unsigned_number(rp_parser p, rp_interval i) { int result; if (rp_parser_accept(p,RP_TOKEN_INTEGER) || rp_parser_accept(p,RP_TOKEN_FLOAT)) { rp_interval_from_str(rp_lexer_prev_text(rp_parser_lexer(p)),i); result = 1; } else if (rp_parser_accept(p,RP_TOKEN_INFINITY)) { /* rp_interval_set_real_line(i);*/ rp_binf(i) = RP_MAX_DOUBLE; rp_bsup(i) = RP_INFINITY; result = 1; } else { result = 0; } return( result ); }
void rp_splitter_mixed_hybrid::apply(rp_box_set& bs, int var) { rp_interval i1, i2; rp_box b1 = bs.remove_insert(); this->observe(b1, var); rp_box b2 = bs.insert(b1); rp_box b1_copy; rp_box_clone(&b1_copy, b1); rp_box suggestion = m_ode_sim_heuristic->sim(b1_copy, var); DREAL_LOG_DEBUG << "rp_splitter_mixed_hybrid::apply() " << "suggestion = " << var << " [" << rp_binf(rp_box_elem(suggestion, var)) << ", " << rp_bsup(rp_box_elem(suggestion, var)) << "]"; if (rp_variable_integer(rp_problem_var(*_problem, var))) { if (this->integer_hole(rp_box_elem(b1, var), rp_variable_domain(rp_problem_var(*_problem, var)), i1, i2)){ if (rp_interval_included(i1, rp_box_elem(suggestion, var))){ rp_interval_copy(rp_box_elem(b1, var), i1); rp_interval_copy(rp_box_elem(b2, var), i2); } else{ rp_interval_copy(rp_box_elem(b1, var), i2); rp_interval_copy(rp_box_elem(b2, var), i1); } } else { // no hole found ++rp_binf(rp_box_elem(b1, var)); if (rp_interval_included(rp_box_elem(b1, var), rp_box_elem(suggestion, var))){ // Integer variable: [a,b] --> [a+1,b] and [a,a] rp_bsup(rp_box_elem(b2, var)) = rp_binf(rp_box_elem(b2, var)); } else { --rp_binf(rp_box_elem(b1, var)); ++rp_binf(rp_box_elem(b2, var)); rp_bsup(rp_box_elem(b1, var)) = rp_binf(rp_box_elem(b1, var)); } } } else { if (this->real_hole(rp_box_elem(b1, var), rp_variable_domain(rp_problem_var(*_problem, var)), i1, i2)) { if (rp_interval_included(i1, rp_box_elem(suggestion, var))){ rp_interval_copy(rp_box_elem(b1, var), i1); rp_interval_copy(rp_box_elem(b2, var), i2); } else { rp_interval_copy(rp_box_elem(b1, var), i2); rp_interval_copy(rp_box_elem(b2, var), i1); } } else { // Real variable: [a,b] --> [center,b] and [a,center] double mid = rp_interval_midpoint(rp_box_elem(b1, var)); rp_binf(rp_box_elem(b1, var)) = rp_bsup(rp_box_elem(b2, var)) = mid; double b1Intersection = std::min(rp_bsup(rp_box_elem(b1, var)), rp_bsup(rp_box_elem(suggestion, var))) - std::max(rp_binf(rp_box_elem(b1, var)), rp_binf(rp_box_elem(suggestion, var))); double b2Intersection = std::min(rp_bsup(rp_box_elem(b2, var)), rp_bsup(rp_box_elem(suggestion, var))) - std::max(rp_binf(rp_box_elem(b2, var)), rp_binf(rp_box_elem(suggestion, var))); if (b2Intersection > b1Intersection // rp_interval_included(rp_box_elem(suggestion, var), rp_box_elem(b2, var)) ){ // okay DREAL_LOG_DEBUG << "rp_splitter_mixed_hybrid::apply() " << "*[" << rp_binf(rp_box_elem(b2, var)) << ", " << rp_bsup(rp_box_elem(b2, var)) << "]* [" << rp_binf(rp_box_elem(b1, var)) << ", " << rp_bsup(rp_box_elem(b1, var)) << "]"; // cout << "*[" << rp_binf(rp_box_elem(b2, var)) << ", " << rp_bsup(rp_box_elem(b2, var)) // << "]* [" << rp_binf(rp_box_elem(b1, var)) << ", " << rp_bsup(rp_box_elem(b1, var)) // << "] \t"; } else if (b2Intersection < b1Intersection){ // rp_interval_included(rp_box_elem(suggestion, var), rp_box_elem(b1, var))){ // reverse double b2_sup = rp_bsup(rp_box_elem(b1, var)); rp_binf(rp_box_elem(b1, var)) = rp_binf(rp_box_elem(b2, var)); rp_bsup(rp_box_elem(b1, var)) = mid; rp_binf(rp_box_elem(b2, var)) = mid; rp_bsup(rp_box_elem(b2, var)) = b2_sup; DREAL_LOG_DEBUG << "rp_splitter_mixed_hybrid::apply() " << "[" << rp_binf(rp_box_elem(b1, var)) << ", " << rp_bsup(rp_box_elem(b1, var)) << "] *[" << rp_binf(rp_box_elem(b2, var)) << ", " << rp_bsup(rp_box_elem(b2, var)) << "]*"; // cout << "[" << rp_binf(rp_box_elem(b1, var)) << ", " << rp_bsup(rp_box_elem(b1, var)) // << "] *[" << rp_binf(rp_box_elem(b2, var)) << ", " << rp_bsup(rp_box_elem(b2, var)) // << "]* \t"; } else { DREAL_LOG_DEBUG << "rp_splitter_mixed_hybrid::apply() suggestion not found"; DREAL_LOG_DEBUG << "rp_splitter_mixed_hybrid::apply() " << "-[" << rp_binf(rp_box_elem(b2, var)) << ", " << rp_bsup(rp_box_elem(b2, var)) << "]- [" << rp_binf(rp_box_elem(b1, var)) << ", " << rp_bsup(rp_box_elem(b1, var)) << "]"; // cout << "-[" << rp_binf(rp_box_elem(b2, var)) << ", " << rp_bsup(rp_box_elem(b2, var)) // << "]- [" << rp_binf(rp_box_elem(b1, var)) << ", " << rp_bsup(rp_box_elem(b1, var)) // << "] \t"; } } } rp_box_destroy(&b1_copy); }