Exemple #1
0
// Application of operator to reduce the box b
int rp_operator_piecewise::apply(rp_box b)
{
  DREAL_LOG_DEBUG << "rp_operator_piecewise::apply";
  // Check each piece Ij:Cj, if Cj violated then the elements of Ij
  // are removed from the domain of the main variable of _c
  for (int i=0; i<rp_ctr_piecewise_arity(_c); ++i)
  {
    int violated = 0, j = 0;
    while ((!violated) && (j<rp_ctr_piecewise_elem_size(_c,i)))
    {
      if (rp_ctr_num_unfeasible(rp_ctr_piecewise_elem_ctrnum(_c,i,j),b))
      {
        violated = 1;
      }
      else ++j;
    }
    if (violated)
    {
      // domain restriction dom(var) := dom(var) \ Ij
      rp_interval aux;
      rp_interval_copy(aux,rp_box_elem(b,rp_ctr_piecewise_var(_c)));
      rp_interval_setminus(rp_box_elem(b,rp_ctr_piecewise_var(_c)),
                           aux,
                           rp_ctr_piecewise_elem_dom(_c,i));

      if (rp_interval_empty(rp_box_elem(b,rp_ctr_piecewise_var(_c))))
      {
        return( 0 );
      }
    }
  }

  // Check whether the domain of the main variable of _c
  // intersects at least one Ij
  int intersect = 0, i = 0;
  while ((!intersect) && (i<rp_ctr_piecewise_arity(_c)))
  {
    if (!rp_interval_disjoint(rp_box_elem(b,rp_ctr_piecewise_var(_c)),
                              rp_ctr_piecewise_elem_dom(_c,i)))
    {
      intersect = 1;
    }
    else ++i;
  }
  return( intersect );
}
/* Creation of an empty piecewise constraint for variable v */
void rp_ctr_piecewise_create(rp_ctr_piecewise * c, int v)
{
  rp_malloc(*c,rp_ctr_piecewise,sizeof(rp_ctr_piecewise_def));
  rp_ctr_piecewise_var(*c) = v;
  rp_ctr_piecewise_ptr(*c) = NULL;
  rp_ctr_piecewise_arity(*c) = 0;
  rp_union_create(&rp_ctr_piecewise_guard(*c));
}
/* Insertion of a new domain */
int rp_ctr_piecewise_insert_domain(rp_ctr_piecewise c, rp_interval x)
{
  rp_union_interval aux;
  int i = rp_ctr_piecewise_arity(c) ++;
  int result = 1;
  if (i==0)
  {
    rp_malloc(rp_ctr_piecewise_ptr(c),
              rp_ctr_piecewise_elem*,
              sizeof(rp_ctr_piecewise_elem));
  }
/* Destruction */
void rp_ctr_piecewise_destroy(rp_ctr_piecewise * c)
{
  int i, j;
  for (i=0; i<rp_ctr_piecewise_arity(*c); ++i)
  {
    /* destruction of each element */
    for (j=0; j<rp_ctr_piecewise_elem_size(*c,i); ++j)
    {
      rp_ctr_num_destroy(&rp_ctr_piecewise_elem_ctrnum(*c,i,j));
    }
    if (rp_ctr_piecewise_elem_size(*c,i)>0)
    {
      rp_free(rp_ctr_piecewise_elem_ptr(*c,i));
    }
  }
  if (rp_ctr_piecewise_arity(*c)>0)
  {
    rp_free(rp_ctr_piecewise_ptr(*c));
  }
  rp_union_destroy(&rp_ctr_piecewise_guard(*c));
  rp_free(*c);
}
Exemple #5
0
// Construction
rp_operator_piecewise::rp_operator_piecewise(rp_ctr_piecewise c):
  rp_operator(RP_OPERATOR_DOMAIN_PRIORITY,0,1),
  _c(c)
{
  rp_intset_create(&_vars);

  // depends on every variable of c
  for (int i=0; i<rp_ctr_piecewise_arity(c); ++i)
  {
    for (int j=0; j<rp_ctr_piecewise_elem_size(c,i); ++j)
    {
      rp_ctr_num cnum = rp_ctr_piecewise_elem_ctrnum(c,i,j);
      for (int k=0; k<rp_ctr_num_arity(cnum); ++k)
      {
        rp_intset_insert(_vars,rp_ctr_num_var(cnum,k));
      }
    }
  }
  rp_intset_insert(_vars,rp_ctr_piecewise_var(c));
}