// 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); }
// 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)); }