Exemple #1
0
// 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))) );
}
Exemple #2
0
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));
    }
  }
}
/* 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 );
}
Exemple #5
0
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 );
}
Exemple #6
0
/* 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 );
}
Exemple #7
0
/* type and precision of variables */
int rp_rule_vartype(rp_parser p, int * is_int, double * prec, int * absolute)
{
  int res = 0;
  /* : */
  if (rp_parser_accept(p,RP_TOKEN_COLON))
  {
    /* integer variable */
    if (rp_parser_accept(p,RP_TOKEN_TYPE_INT))
    {
      (*is_int) = 1;
      res = 1;
    }

    /* real variable */
    else if (rp_parser_accept(p,RP_TOKEN_TYPE_REAL))
    {
      (*is_int) = 0;
      if (rp_parser_accept(p,RP_TOKEN_DIV))
      {
        rp_interval i;

        /* precision defined by a constant */
        if (rp_parser_accept(p,RP_TOKEN_IDENT))
        {
          rp_constant * c;
          int index;
          if ((c=rp_vector_constant_contains(
                      rp_parser_nums(p),
                      rp_lexer_prev_text(rp_parser_lexer(p)),
                      &index))!=NULL)
          {
            (*prec) = rp_binf(rp_constant_val(*c));
            res = 1;
          }
          else
          {
            rp_parser_stop(p,"constant identifier not found");
          }
        }
        else if (rp_rule_unsigned_number(p,i))
        {
          (*prec) = rp_binf(i);
          res = 1;
        }
        else
        {
          rp_parser_stop(p,"variable precision not found");
        }

        if (rp_parser_accept(p,RP_TOKEN_PERCENT))
        {
          (*absolute) = 0;  /* relative precision */
        }
        else
        {
          (*absolute) = 1;  /* absolute precision */
        }
      }
      else
      {
        /* default precision */
        (*prec) = 1.0e-8;
        res = 1;
      }
    }
    else
    {
      rp_parser_stop(p,"variable type not found");
    }
  }
  else
  {
    /* default: real variable at precision 10-8 */
    (*is_int) = 0;
    (*prec) = 1.0e-8;
    res = 1;
  }
  return( res );
}
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);
}