49 #include <unordered_set> 55 template<>
struct hash<
Gecode::TupleSet> {
64 template<>
struct hash<
Gecode::SharedArray<int> > {
68 size_t seed =
static_cast<size_t>(x.
size());
69 for (
int i=x.
size();
i--; )
76 template<>
struct hash<
Gecode::DFA> {
85 namespace Gecode {
namespace FlatZinc {
123 int_varsel(int_varsel0), int_valsel(int_valsel0),
124 bool_varsel(bool_varsel0), bool_valsel(bool_valsel0)
125 #ifdef GECODE_HAS_SET_VARS
126 , set_varsel(set_varsel0), set_valsel(set_valsel0)
128 #ifdef GECODE_HAS_FLOAT_VARS
129 , float_varsel(float_varsel0), float_valsel(float_valsel0)
134 :
Brancher(home, b), done(b.done) {}
145 virtual size_t size(
void)
const {
159 #ifdef GECODE_HAS_SET_VARS 163 #ifdef GECODE_HAS_FLOAT_VARS 171 if (done)
return false;
177 #ifdef GECODE_HAS_SET_VARS 181 #ifdef GECODE_HAS_FLOAT_VARS 195 #ifdef GECODE_HAS_SET_VARS 198 #ifdef GECODE_HAS_FLOAT_VARS 205 return new Choice(*
this,
false);
207 return new Choice(*
this,
true);
212 bool fail; e >> fail;
213 return new Choice(*
this, fail);
222 std::ostream& o)
const {
224 << (
static_cast<const Choice&
>(
c).fail ?
"fail" :
"ok")
249 bool_varsel, bool_valsel
250 #ifdef GECODE_HAS_SET_VARS
251 , set_varsel, set_valsel
253 #ifdef GECODE_HAS_FLOAT_VARS
254 , float_varsel, float_valsel
260 return sizeof(*this);
269 std::vector<std::string>
n;
270 BI(
void) : r0(
""), r1(
""),
n(0) {}
271 BI(
const std::string& r00,
const std::string& r10,
272 const std::vector<std::string>& n0)
273 : r0(r00), r1(r10),
n(n0) {}
285 const std::string& rel0,
286 const std::string& rel1,
287 const std::vector<std::string>&
n) {
288 v.resize(
std::max(static_cast<unsigned int>(v.size()),bg.
id()+1));
289 v[bg.
id()] = BI(rel0,rel1,n);
293 unsigned int a,
int i,
int n, std::ostream& o)
const {
295 o << bi.n[
i] <<
" " << (a==0 ? bi.r0 : bi.r1) <<
" " << n;
297 #ifdef GECODE_HAS_FLOAT_VARS 300 std::ostream& o)
const {
303 << (((a == 0) == nl.
l) ?
"<=" :
">=") << nl.
n;
308 BranchInformation::BranchInformation(
void)
316 assert(
object() == NULL);
322 const std::string& rel0,
323 const std::string& rel1,
324 const std::vector<std::string>&
n) {
329 int n, std::ostream& o)
const {
332 #ifdef GECODE_HAS_FLOAT_VARS 342 Var,
int i,
const int&
n,
347 #ifdef GECODE_HAS_FLOAT_VARS 365 int* newdom =
heap.
alloc<
int>(
static_cast<unsigned long int>(sl->
s.size()));
366 for (
int i=sl->
s.size();
i--;)
367 newdom[
i] = sl->
s[
i];
368 IntSet ret(newdom, sl->
s.size());
369 heap.
free(newdom, static_cast<unsigned long int>(sl->
s.size()));
401 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
402 if (s->id ==
"input_order")
404 if (s->id ==
"first_fail")
406 if (s->id ==
"anti_first_fail")
408 if (s->id ==
"smallest")
410 if (s->id ==
"largest")
412 if (s->id ==
"occurrence")
414 if (s->id ==
"max_regret")
416 if (s->id ==
"most_constrained")
419 if (s->id ==
"random") {
422 if (s->id ==
"dom_w_deg") {
425 if (s->id ==
"afc_min")
427 if (s->id ==
"afc_max")
429 if (s->id ==
"afc_size_min")
431 if (s->id ==
"afc_size_max") {
434 if (s->id ==
"action_min")
436 if (s->id ==
"action_max")
438 if (s->id ==
"action_size_min")
440 if (s->id ==
"action_size_max")
443 std::cerr <<
"Warning, ignored search annotation: ";
444 ann->
print(std::cerr);
445 std::cerr << std::endl;
451 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
452 if (s->id ==
"indomain_min") {
456 if (s->id ==
"indomain_max") {
460 if (s->id ==
"indomain_median") {
464 if (s->id ==
"indomain_split") {
468 if (s->id ==
"indomain_reverse_split") {
472 if (s->id ==
"indomain_random") {
476 if (s->id ==
"indomain") {
480 if (s->id ==
"indomain_middle") {
481 std::cerr <<
"Warning, replacing unsupported annotation " 482 <<
"indomain_middle with indomain_median" << std::endl;
486 if (s->id ==
"indomain_interval") {
487 std::cerr <<
"Warning, replacing unsupported annotation " 488 <<
"indomain_interval with indomain_split" << std::endl;
493 std::cerr <<
"Warning, ignored search annotation: ";
494 ann->
print(std::cerr);
495 std::cerr << std::endl;
501 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
502 if (s->id ==
"indomain_min")
504 if (s->id ==
"indomain_max")
506 if (s->id ==
"indomain_median")
508 if (s->id ==
"indomain_random") {
512 std::cerr <<
"Warning, ignored search annotation: ";
513 ann->
print(std::cerr);
514 std::cerr << std::endl;
519 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
520 if ((s->id ==
"input_order") ||
521 (s->id ==
"first_fail") ||
522 (s->id ==
"anti_first_fail") ||
523 (s->id ==
"smallest") ||
524 (s->id ==
"largest") ||
525 (s->id ==
"max_regret"))
527 if ((s->id ==
"occurrence") ||
528 (s->id ==
"most_constrained"))
530 if (s->id ==
"random")
532 if ((s->id ==
"afc_min") ||
533 (s->id ==
"afc_size_min"))
535 if ((s->id ==
"afc_max") ||
536 (s->id ==
"afc_size_max") ||
537 (s->id ==
"dom_w_deg"))
539 if ((s->id ==
"action_min") &&
540 (s->id ==
"action_size_min"))
542 if ((s->id ==
"action_max") ||
543 (s->id ==
"action_size_max"))
546 std::cerr <<
"Warning, ignored search annotation: ";
547 ann->
print(std::cerr);
548 std::cerr << std::endl;
554 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
555 if (s->id ==
"indomain_min") {
559 if (s->id ==
"indomain_max") {
563 if (s->id ==
"indomain_median") {
567 if (s->id ==
"indomain_split") {
571 if (s->id ==
"indomain_reverse_split") {
575 if (s->id ==
"indomain_random") {
579 if (s->id ==
"indomain") {
583 if (s->id ==
"indomain_middle") {
584 std::cerr <<
"Warning, replacing unsupported annotation " 585 <<
"indomain_middle with indomain_median" << std::endl;
589 if (s->id ==
"indomain_interval") {
590 std::cerr <<
"Warning, replacing unsupported annotation " 591 <<
"indomain_interval with indomain_split" << std::endl;
596 std::cerr <<
"Warning, ignored search annotation: ";
597 ann->
print(std::cerr);
598 std::cerr << std::endl;
604 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
605 if ((s->id ==
"indomain_min") ||
606 (s->id ==
"indomain_median"))
608 if (s->id ==
"indomain_max")
610 if (s->id ==
"indomain_random") {
614 std::cerr <<
"Warning, ignored search annotation: ";
615 ann->
print(std::cerr);
616 std::cerr << std::endl;
620 #ifdef GECODE_HAS_SET_VARS 622 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
623 if (s->id ==
"input_order")
625 if (s->id ==
"first_fail")
627 if (s->id ==
"anti_first_fail")
629 if (s->id ==
"smallest")
631 if (s->id ==
"largest")
633 if (s->id ==
"afc_min")
635 if (s->id ==
"afc_max")
637 if (s->id ==
"afc_size_min")
639 if (s->id ==
"afc_size_max")
641 if (s->id ==
"action_min")
643 if (s->id ==
"action_max")
645 if (s->id ==
"action_size_min")
647 if (s->id ==
"action_size_max")
649 if (s->id ==
"random") {
653 std::cerr <<
"Warning, ignored search annotation: ";
654 ann->
print(std::cerr);
655 std::cerr << std::endl;
662 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
663 if (s->id ==
"indomain_min") {
664 r0 =
"in"; r1 =
"not in";
667 if (s->id ==
"indomain_max") {
668 r0 =
"in"; r1 =
"not in";
671 if (s->id ==
"outdomain_min") {
672 r1 =
"in"; r0 =
"not in";
675 if (s->id ==
"outdomain_max") {
676 r1 =
"in"; r0 =
"not in";
680 std::cerr <<
"Warning, ignored search annotation: ";
681 ann->
print(std::cerr);
682 std::cerr << std::endl;
683 r0 =
"in"; r1 =
"not in";
688 #ifdef GECODE_HAS_FLOAT_VARS 691 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
692 if (s->id ==
"input_order")
694 if (s->id ==
"first_fail")
696 if (s->id ==
"anti_first_fail")
698 if (s->id ==
"smallest")
700 if (s->id ==
"largest")
702 if (s->id ==
"occurrence")
704 if (s->id ==
"most_constrained")
707 if (s->id ==
"random") {
710 if (s->id ==
"afc_min")
712 if (s->id ==
"afc_max")
714 if (s->id ==
"afc_size_min")
716 if (s->id ==
"afc_size_max")
718 if (s->id ==
"action_min")
720 if (s->id ==
"action_max")
722 if (s->id ==
"action_size_min")
724 if (s->id ==
"action_size_max")
727 std::cerr <<
"Warning, ignored search annotation: ";
728 ann->
print(std::cerr);
729 std::cerr << std::endl;
734 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
735 if (s->id ==
"indomain_split") {
739 if (s->id ==
"indomain_reverse_split") {
744 std::cerr <<
"Warning, ignored search annotation: ";
745 ann->
print(std::cerr);
746 std::cerr << std::endl;
776 _initData(NULL), _random(f._random),
777 _solveAnnotations(NULL), iv_boolalias(NULL),
781 needAuxVars(f.needAuxVars) {
816 #ifdef GECODE_HAS_SET_VARS 830 #ifdef GECODE_HAS_FLOAT_VARS 857 int setVars,
int floatVars) {
868 #ifdef GECODE_HAS_SET_VARS 873 #ifdef GECODE_HAS_FLOAT_VARS 918 #ifdef GECODE_HAS_SET_VARS 930 int* is =
heap.
alloc<
int>(
static_cast<unsigned long int>(vsv->s.size()));
931 for (
int i=vsv->s.
size();
i--; )
934 heap.
free(is,static_cast<unsigned long int>(vsv->s.size()));
943 int* is =
heap.
alloc<
int>(
static_cast<unsigned long int>(vsv->
s.size()));
944 for (
int i=vsv->
s.size();
i--; )
947 heap.
free(is,static_cast<unsigned long int>(vsv->
s.size()));
965 #ifdef GECODE_HAS_FLOAT_VARS 996 struct ConExprOrder {
998 return ce0->
args->
a.size() < ce1->
args->
a.size();
1008 for (
unsigned int i=0;
i<ces.
size();
i++) {
1023 for (
unsigned int i=0;
i<ann->
a.size();
i++) {
1024 if (ann->
a[
i]->isCall(
"seq_search")) {
1029 out.push_back(c->
args);
1031 out.push_back(ann->
a[
i]);
1039 std::ostream& err) {
1040 int seed = opt.
seed();
1041 double decay = opt.
decay();
1042 Rnd rnd(static_cast<unsigned int>(seed));
1046 std::string def_int_rel_left =
"=";
1047 std::string def_int_rel_right =
"!=";
1050 std::string def_bool_rel_left =
"=";
1051 std::string def_bool_rel_right =
"!=";
1052 #ifdef GECODE_HAS_SET_VARS 1055 std::string def_set_rel_left =
"in";
1056 std::string def_set_rel_right =
"not in";
1058 #ifdef GECODE_HAS_FLOAT_VARS 1061 std::string def_float_rel_left =
"<=";
1062 std::string def_float_rel_right =
">";
1065 std::vector<bool> iv_searched(
iv.
size());
1066 for (
unsigned int i=
iv.
size();
i--;)
1067 iv_searched[
i] =
false;
1068 std::vector<bool> bv_searched(
bv.
size());
1069 for (
unsigned int i=
bv.
size();
i--;)
1070 bv_searched[
i] =
false;
1071 #ifdef GECODE_HAS_SET_VARS 1072 std::vector<bool> sv_searched(
sv.
size());
1073 for (
unsigned int i=
sv.
size();
i--;)
1074 sv_searched[
i] =
false;
1076 #ifdef GECODE_HAS_FLOAT_VARS 1077 std::vector<bool> fv_searched(
fv.
size());
1078 for (
unsigned int i=
fv.
size();
i--;)
1079 fv_searched[
i] =
false;
1084 std::vector<AST::Node*> flatAnn;
1088 flatAnn.push_back(ann);
1091 for (
unsigned int i=0;
i<flatAnn.
size();
i++) {
1092 if (flatAnn[
i]->isCall(
"restart_geometric")) {
1098 }
else if (flatAnn[
i]->isCall(
"restart_luby")) {
1102 }
else if (flatAnn[
i]->isCall(
"restart_linear")) {
1106 }
else if (flatAnn[
i]->isCall(
"restart_constant")) {
1110 }
else if (flatAnn[
i]->isCall(
"restart_none")) {
1112 }
else if (flatAnn[
i]->isCall(
"relax_and_reconstruct")) {
1115 "Only one relax_and_reconstruct annotation allowed");
1123 _lns = args->
a[1]->getInt();
1125 int k=vars->
a.size();
1126 for (
int i=vars->
a.size();
i--;)
1127 if (vars->
a[
i]->isInt())
1131 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
1132 if (vars->
a[
i]->isInt())
1136 if (args->
a.size()==3) {
1139 for (
unsigned int i=initial->
a.size();
i--;)
1142 }
else if (flatAnn[
i]->isCall(
"gecode_search")) {
1144 branchWithPlugin(c->
args);
1145 }
else if (flatAnn[
i]->isCall(
"int_search")) {
1149 int k=vars->
a.size();
1150 for (
int i=vars->
a.size();
i--;)
1151 if (vars->
a[
i]->isInt())
1154 std::vector<std::string> names;
1156 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
1157 if (vars->
a[
i]->isInt())
1159 va[k++] =
iv[vars->
a[
i]->getIntVar()];
1160 iv_searched[vars->
a[
i]->getIntVar()] =
true;
1161 names.push_back(vars->
a[
i]->getVarName());
1170 &varValPrint<IntVar>);
1173 }
else if (flatAnn[
i]->isCall(
"int_assign")) {
1177 int k=vars->
a.size();
1178 for (
int i=vars->
a.size();
i--;)
1179 if (vars->
a[
i]->isInt())
1183 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
1184 if (vars->
a[
i]->isInt())
1186 va[k++] =
iv[vars->
a[
i]->getIntVar()];
1187 iv_searched[vars->
a[
i]->getIntVar()] =
true;
1190 &varValPrint<IntVar>);
1191 }
else if (flatAnn[
i]->isCall(
"bool_search")) {
1195 int k=vars->
a.size();
1196 for (
int i=vars->
a.size();
i--;)
1197 if (vars->
a[
i]->isBool())
1201 std::vector<std::string> names;
1202 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
1203 if (vars->
a[
i]->isBool())
1205 va[k++] =
bv[vars->
a[
i]->getBoolVar()];
1206 bv_searched[vars->
a[
i]->getBoolVar()] =
true;
1207 names.push_back(vars->
a[
i]->getVarName());
1217 &varValPrint<BoolVar>);
1220 }
else if (flatAnn[
i]->isCall(
"int_default_search")) {
1225 def_int_rel_left,def_int_rel_right,rnd);
1226 }
else if (flatAnn[
i]->isCall(
"bool_default_search")) {
1231 def_bool_rel_left,def_bool_rel_right,
1233 }
else if (flatAnn[
i]->isCall(
"set_search")) {
1234 #ifdef GECODE_HAS_SET_VARS 1238 int k=vars->
a.size();
1239 for (
int i=vars->
a.size();
i--;)
1240 if (vars->
a[
i]->isSet())
1244 std::vector<std::string> names;
1245 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
1246 if (vars->
a[
i]->isSet())
1248 va[k++] =
sv[vars->
a[
i]->getSetVar()];
1249 sv_searched[vars->
a[
i]->getSetVar()] =
true;
1250 names.push_back(vars->
a[
i]->getVarName());
1259 &varValPrint<SetVar>);
1263 if (!ignoreUnknown) {
1264 err <<
"Warning, ignored search annotation: ";
1265 flatAnn[
i]->print(err);
1269 }
else if (flatAnn[
i]->isCall(
"set_default_search")) {
1270 #ifdef GECODE_HAS_SET_VARS 1275 def_set_rel_left,def_set_rel_right,rnd);
1277 if (!ignoreUnknown) {
1278 err <<
"Warning, ignored search annotation: ";
1279 flatAnn[
i]->print(err);
1283 }
else if (flatAnn[
i]->isCall(
"float_default_search")) {
1284 #ifdef GECODE_HAS_FLOAT_VARS 1289 def_float_rel_left,def_float_rel_right);
1291 if (!ignoreUnknown) {
1292 err <<
"Warning, ignored search annotation: ";
1293 flatAnn[
i]->print(err);
1297 }
else if (flatAnn[
i]->isCall(
"float_search")) {
1298 #ifdef GECODE_HAS_FLOAT_VARS 1302 int k=vars->
a.size();
1303 for (
int i=vars->
a.size();
i--;)
1304 if (vars->
a[
i]->isFloat())
1308 std::vector<std::string> names;
1309 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
1310 if (vars->
a[
i]->isFloat())
1312 va[k++] =
fv[vars->
a[
i]->getFloatVar()];
1313 fv_searched[vars->
a[
i]->getFloatVar()] =
true;
1314 names.push_back(vars->
a[
i]->getVarName());
1327 if (!ignoreUnknown) {
1328 err <<
"Warning, ignored search annotation: ";
1329 flatAnn[
i]->print(err);
1334 if (!ignoreUnknown) {
1335 err <<
"Warning, ignored search annotation: ";
1336 flatAnn[
i]->print(err);
1356 std::vector<std::string> iv_sol_names(
iv.
size()-(introduced+funcdep+searched));
1358 std::vector<std::string> iv_tmp_names(introduced);
1360 for (
int i=
iv.
size(), j=0, k=0;
i--;) {
1366 iv_tmp[j++] =
iv[
i];
1370 iv_sol[k++] =
iv[
i];
1378 if (bv_searched[
i]) {
1388 std::vector<std::string> bv_sol_names(
bv.
size()-(introduced+funcdep+searched));
1391 std::vector<std::string> bv_tmp_names(introduced);
1392 for (
int i=
bv.
size(), j=0, k=0;
i--;) {
1398 bv_tmp[j++] =
bv[
i];
1402 bv_sol[k++] =
bv[
i];
1406 if (iv_sol.
size() > 0 && bv_sol.
size() > 0) {
1407 branch(*
this, iv_sol, bv_sol, def_intbool_varsel, def_int_valsel);
1408 }
else if (iv_sol.
size() > 0) {
1410 branch(bg(*
this), iv_sol, def_int_varsel, def_int_valsel,
nullptr,
1411 &varValPrint<IntVar>);
1412 branchInfo.
add(bg,def_int_rel_left,def_int_rel_right,iv_sol_names);
1413 }
else if (bv_sol.
size() > 0) {
1415 branch(bg(*
this), bv_sol, def_bool_varsel, def_bool_valsel,
nullptr,
1416 &varValPrint<BoolVar>);
1417 branchInfo.
add(bg,def_bool_rel_left,def_bool_rel_right,bv_sol_names);
1419 #ifdef GECODE_HAS_FLOAT_VARS 1434 std::vector<std::string> fv_sol_names(
fv.
size()-(introduced+funcdep+searched));
1437 std::vector<std::string> fv_tmp_names(introduced);
1438 for (
int i=
fv.
size(), j=0, k=0;
i--;) {
1444 fv_tmp[j++] =
fv[
i];
1448 fv_sol[k++] =
fv[
i];
1452 if (fv_sol.
size() > 0) {
1454 branch(bg(*
this), fv_sol, def_float_varsel, def_float_valsel,
nullptr,
1456 branchInfo.
add(bg,def_float_rel_left,def_float_rel_right,fv_sol_names);
1459 #ifdef GECODE_HAS_SET_VARS 1464 if (sv_searched[
i]) {
1474 std::vector<std::string> sv_sol_names(
sv.
size()-(introduced+funcdep+searched));
1477 std::vector<std::string> sv_tmp_names(introduced);
1478 for (
int i=
sv.
size(), j=0, k=0;
i--;) {
1484 sv_tmp[j++] =
sv[
i];
1488 sv_sol[k++] =
sv[
i];
1492 if (sv_sol.
size() > 0) {
1494 branch(bg(*
this), sv_sol, def_set_varsel, def_set_valsel,
nullptr,
1495 &varValPrint<SetVar>);
1496 branchInfo.
add(bg,def_set_rel_left,def_set_rel_right,sv_sol_names);
1503 #ifdef GECODE_HAS_SET_VARS 1507 #ifdef GECODE_HAS_FLOAT_VARS 1515 def_bool_varsel, def_bool_valsel
1517 , def_set_varsel, def_set_valsel
1520 , def_float_varsel, def_float_valsel
1526 branch(bg(*
this),
iv_aux,def_int_varsel,def_int_valsel,
nullptr,
1527 &varValPrint<IntVar>);
1528 branchInfo.
add(bg,def_int_rel_left,def_int_rel_right,iv_tmp_names);
1532 branch(bg(*
this),
bv_aux,def_bool_varsel,def_bool_valsel,
nullptr,
1533 &varValPrint<BoolVar>);
1534 branchInfo.
add(bg,def_bool_rel_left,def_bool_rel_right,bv_tmp_names);
1536 #ifdef GECODE_HAS_SET_VARS 1539 branch(bg(*
this),
sv_aux,def_set_varsel,def_set_valsel,
nullptr,
1540 &varValPrint<SetVar>);
1541 branchInfo.
add(bg,def_set_rel_left,def_set_rel_right,sv_tmp_names);
1544 #ifdef GECODE_HAS_FLOAT_VARS 1547 branch(bg(*
this),
fv_aux,def_float_varsel,def_float_valsel,
nullptr,
1549 branchInfo.
add(bg,def_float_rel_left,def_float_rel_right,fv_tmp_names);
1558 std::vector<std::string> names(1);
1562 &varValPrint<IntVar>);
1565 #ifdef GECODE_HAS_FLOAT_VARS 1566 std::vector<std::string> names(1);
1576 std::vector<std::string> names(1);
1580 &varValPrint<IntVar>);
1583 #ifdef GECODE_HAS_FLOAT_VARS 1584 std::vector<std::string> names(1);
1628 #ifdef GECODE_HAS_GIST 1633 template<
class Engine>
1638 template<
typename S>
1652 template<
typename S>
1675 virtual void inspect(
const Space& node);
1677 virtual void finalize(
void);
1682 : TextOutput(
"Gecode/FlatZinc"),
p(p0) {}
1713 :
Gecode::Gist::VarComparator<S>(
"Gecode/FlatZinc"),
p(p0) {}
1720 dynamic_cast<const S&
>(s0).
compare(dynamic_cast<const S&>(s1),
1730 template<
template<
class>
class Engine>
1732 FlatZincSpace::runEngine(std::ostream& out,
const Printer& p,
1735 runMeta<Engine,Driver::EngineToMeta>(out,p,
opt,t_total);
1737 runMeta<Engine,RBS>(out,p,
opt,t_total);
1741 #ifdef GECODE_HAS_CPPROFILER 1749 std::stringstream ss;
1750 if (
const FlatZincSpace* fz_space = dynamic_cast<const FlatZincSpace*>(&space)) {
1751 ss <<
"{domains = \"";
1752 ss << fz_space->getDomains(p);
1763 os <<
"int: " << name <<
" = " << x.
val() <<
";";
1764 }
else if (x.
range()) {
1765 os << x.
min() <<
".." << x.
max() <<
": " << name <<
";";
1767 os <<
"array_union([";
1770 os << r.
min() <<
".." << r.
max();
1775 os <<
"]): " << name <<
";";
1780 os <<
"var bool: " <<
name;
1782 os <<
" = " << (b.
val() ?
"true" :
"false");
1785 #ifdef GECODE_HAS_FLOAT_VARS 1789 os <<
"float: " << name <<
" = " << f.
med() <<
";";
1791 os << f.
min() <<
".." << f.
max() <<
": " << name <<
";";
1796 std::ostringstream oss;
1798 for (
int i = 0;
i < iv.
size();
i++)
1801 for (
int i = 0;
i < bv.
size();
i++)
1804 #ifdef GECODE_HAS_FLOAT_VARS 1805 for (
int i = 0;
i < fv.
size();
i++)
1808 #ifdef GECODE_HAS_SET_VARS 1809 for (
int i = 0;
i < sv.
size();
i++)
1810 oss <<
"var " << sv[
i] <<
": " << p.
setVarName(
i) <<
";" << std::endl;
1818 template<
template<
class>
class Engine,
1819 template<
class,
template<
class>
class>
class Meta>
1821 FlatZincSpace::runMeta(std::ostream& out, const Printer& p,
1822 const FlatZincOptions& opt, Support::Timer& t_total) {
1823 #ifdef GECODE_HAS_GIST 1832 unsigned int n_p = 0;
1844 #ifdef GECODE_HAS_CPPROFILER 1857 #ifdef GECODE_HAS_FLOAT_VARS 1865 Meta<FlatZincSpace,Engine> se(
this,o);
1867 if (noOfSolutions == -1) {
1868 noOfSolutions = (_method == SAT) ? 1 : 0;
1870 bool printAll = _method == SAT || opt.
allSolutions() || noOfSolutions != 0;
1871 int findSol = noOfSolutions;
1872 FlatZincSpace* sol = NULL;
1873 while (FlatZincSpace* next_sol = se.next()) {
1878 out <<
"----------" << std::endl;
1883 if (sol && !printAll) {
1885 out <<
"----------" << std::endl;
1887 if (!se.stopped()) {
1889 out <<
"==========" << std::endl;
1891 out <<
"=====UNSATISFIABLE=====" << std::endl;
1894 out <<
"=====UNKNOWN=====" << std::endl;
1906 <<
"%% solvetime: ";
1910 <<
std::abs(noOfSolutions - findSol) << std::endl
1912 << (intVarCount + boolVarCount + setVarCount) << std::endl
1913 <<
"%% propagators: " << n_p << std::endl
1915 <<
"%% nodes: " << stat.
node << std::endl
1916 <<
"%% failures: " << stat.
fail << std::endl
1917 <<
"%% restarts: " << stat.
restart << std::endl
1918 <<
"%% peak depth: " << stat.
depth << std::endl
1925 #ifdef GECODE_HAS_QT 1927 FlatZincSpace::branchWithPlugin(
AST::Node* ann) {
1928 if (
AST::Call*
c = dynamic_cast<AST::Call*>(ann)) {
1929 QString pluginName(
c->id.c_str());
1930 if (QLibrary::isLibrary(pluginName+
".dll")) {
1931 pluginName +=
".dll";
1932 }
else if (QLibrary::isLibrary(pluginName+
".dylib")) {
1933 pluginName =
"lib" + pluginName +
".dylib";
1934 }
else if (QLibrary::isLibrary(pluginName+
".so")) {
1936 pluginName =
"lib" + pluginName +
".so";
1938 QPluginLoader pl(pluginName);
1939 QObject* plugin_o = pl.instance();
1942 "Error loading plugin "+pluginName.toStdString()+
1943 ": "+pl.errorString().toStdString());
1945 BranchPlugin* pb = qobject_cast<BranchPlugin*>(plugin_o);
1948 "Error loading plugin "+pluginName.toStdString()+
1949 ": does not contain valid PluginBrancher");
1951 pb->branch(*
this,
c);
1956 FlatZincSpace::branchWithPlugin(
AST::Node*) {
1958 "Branching with plugins not supported (requires Qt support)");
1968 runEngine<BAB>(out,p,
opt,t_total);
1971 runEngine<DFS>(out,p,
opt,t_total);
1981 static_cast<const FlatZincSpace*>(&s)->iv[_optVar].val());
1982 else if (_method == MAX)
1984 static_cast<const FlatZincSpace*>(&s)->iv[_optVar].val());
1986 #ifdef GECODE_HAS_FLOAT_VARS 1989 static_cast<const FlatZincSpace*>(&s)->fv[_optVar].val()-
step);
1990 else if (_method == MAX)
1992 static_cast<const FlatZincSpace*>(&s)->fv[_optVar].val()+
step);
2000 (_lns > 0) && (mi.
last()==NULL) && (_lnsInitialSolution.size()>0)) {
2001 for (
unsigned int i=iv_lns.
size();
i--;) {
2002 if (_random(99) <= _lns) {
2003 rel(*
this, iv_lns[
i],
IRT_EQ, _lnsInitialSolution[i]);
2008 (_lns > 0) && mi.
last()) {
2009 const FlatZincSpace& last =
2010 static_cast<const FlatZincSpace&
>(*mi.
last());
2011 for (
unsigned int i=iv_lns.
size();
i--;) {
2012 if (_random(99) <= _lns) {
2023 return new FlatZincSpace(*
this);
2038 return _optVarIsInt;
2055 (void) s; (void) out;
2056 #ifdef GECODE_HAS_GIST 2057 const FlatZincSpace& fs =
dynamic_cast<const FlatZincSpace&
>(s);
2058 for (
int i = 0;
i < iv.
size(); ++
i) {
2059 std::stringstream ss;
2060 ss <<
"iv[" <<
i <<
"]";
2063 if (result.length() > 0) out << result << std::endl;
2065 for (
int i = 0;
i < bv.
size(); ++
i) {
2066 std::stringstream ss;
2067 ss <<
"bv[" <<
i <<
"]";
2070 if (result.length() > 0) out << result << std::endl;
2072 #ifdef GECODE_HAS_SET_VARS 2073 for (
int i = 0;
i < sv.
size(); ++
i) {
2074 std::stringstream ss;
2075 ss <<
"sv[" <<
i <<
"]";
2078 if (result.length() > 0) out << result << std::endl;
2081 #ifdef GECODE_HAS_FLOAT_VARS 2082 for (
int i = 0;
i < fv.
size(); ++
i) {
2083 std::stringstream ss;
2084 ss <<
"fv[" <<
i <<
"]";
2087 if (result.length() > 0) out << result << std::endl;
2122 for (
int i=offset;
i--;)
2124 for (
int i=a->
a.size();
i--;)
2125 ia[
i+offset] = a->
a[
i]->getInt();
2131 int noOfTuples = a->
a.size() == 0 ? 0 : (a->
a.size()/noOfVars);
2135 for (
int i=0;
i<noOfTuples;
i++) {
2137 for (
int j=0; j<noOfVars; j++) {
2138 t[j] = a->
a[
i*noOfVars+j]->getInt();
2145 FlatZincSpaceInitData::TupleSetSet::iterator it = _initData->tupleSetSet.find(ts);
2146 if (it != _initData->tupleSetSet.end()) {
2149 _initData->tupleSetSet.insert(ts);
2157 IntArgs ia(arg2intargs(arg,offset));
2160 FlatZincSpaceInitData::IntSharedArraySet::iterator it = _initData->intSharedArraySet.find(sia);
2161 if (it != _initData->intSharedArraySet.end()) {
2164 _initData->intSharedArraySet.insert(sia);
2173 for (
int i=offset;
i--;)
2175 for (
int i=a->
a.size();
i--;)
2176 ia[
i+offset] = a->
a[
i]->getBool();
2181 IntArgs ia(arg2boolargs(arg,offset));
2184 FlatZincSpaceInitData::IntSharedArraySet::iterator it = _initData->intSharedArraySet.find(sia);
2185 if (it != _initData->intSharedArraySet.end()) {
2188 _initData->intSharedArraySet.insert(sia);
2201 int* is = re.
alloc<
int>(
static_cast<unsigned long int>(sl->
s.size()));
2202 for (
int i=sl->
s.size();
i--; )
2211 if (a->
a.size() == 0) {
2216 for (
int i=offset;
i--;)
2218 for (
int i=a->
a.size();
i--;) {
2219 ia[
i+offset] = arg2intset(a->
a[
i]);
2226 if (a->
a.size() == 0) {
2231 for (
int i=offset;
i--;)
2233 for (
int i=a->
a.size();
i--;) {
2234 if (a->
a[
i]->isIntVar()) {
2235 ia[
i+offset] = iv[a->
a[
i]->getIntVar()];
2237 int value = a->
a[
i]->getInt();
2238 IntVar iv(*
this, value, value);
2247 if (a->
a.size() == 0) {
2252 for (
int i=offset;
i--;)
2254 for (
int i=0; i<static_cast<int>(a->
a.size());
i++) {
2257 if (a->
a[
i]->isBool()) {
2258 bool value = a->
a[
i]->getBool();
2259 BoolVar iv(*
this, value, value);
2261 }
else if (a->
a[
i]->isIntVar() &&
2262 aliasBool2Int(a->
a[
i]->getIntVar()) != -1) {
2263 ia[offset++] = bv[aliasBool2Int(a->
a[
i]->getIntVar())];
2265 ia[offset++] = bv[a->
a[
i]->getBoolVar()];
2295 if (a->
a.size() == 0)
2297 for (
int i=a->
a.size();
i--;) {
2298 if (a->
a[
i]->isBoolVar() || a->
a[
i]->isBool()) {
2299 }
else if (a->
a[
i]->isIntVar()) {
2300 if (aliasBool2Int(a->
a[
i]->getIntVar()) == -1) {
2301 if (singleInt != -1) {
2310 return singleInt==-1 || a->
a.size() > 1;
2312 #ifdef GECODE_HAS_SET_VARS 2318 x0 =
SetVar(*
this, d, d);
2329 for (
int i=offset;
i--;) {
2333 for (
int i=a->
a.size();
i--;) {
2334 ia[
i+offset] = arg2SetVar(a->
a[
i]);
2339 #ifdef GECODE_HAS_FLOAT_VARS 2344 for (
int i=offset;
i--;)
2346 for (
int i=a->
a.size();
i--;)
2347 fa[
i+offset] = a->
a[
i]->getFloat();
2353 if (a->
a.size() == 0) {
2358 for (
int i=offset;
i--;)
2360 for (
int i=a->
a.size();
i--;) {
2361 if (a->
a[
i]->isFloatVar()) {
2362 fa[
i+offset] = fv[a->
a[
i]->getFloatVar()];
2364 double value = a->
a[
i]->getFloat();
2401 FlatZincSpaceInitData::DFASet::iterator it = _initData->dfaSet.find(a);
2402 if (it != _initData->dfaSet.end()) {
2405 _initData->dfaSet.insert(a);
2416 Printer::printElem(std::ostream& out,
2436 }
else if (bv[ai->
getBoolVar()].max() == 0) {
2439 out <<
"false..true";
2441 #ifdef GECODE_HAS_SET_VARS 2452 int min = svr.min();
2453 int max = svr.max();
2460 for (; svv(); ++svv)
2461 out <<
", " << svv.val();
2464 out << min <<
".." <<
max;
2467 #ifdef GECODE_HAS_FLOAT_VARS 2478 std::ostringstream oss;
2480 oss << std::setprecision(std::numeric_limits<double>::digits10);
2482 if (oss.str().find(
".") == std::string::npos)
2489 }
else if (ai->
isBool()) {
2490 out << (ai->
getBool() ?
"true" :
"false");
2491 }
else if (ai->
isSet()) {
2494 out << s->
min <<
".." << s->
max;
2497 for (
unsigned int i=0;
i<s->
s.size();
i++) {
2498 out << s->
s[
i] << (
i < s->
s.size()-1 ?
", " :
"}");
2503 for (
unsigned int i=0;
i<s.
size();
i++) {
2504 if (s[
i] ==
'\\' &&
i<s.
size()-1) {
2506 case 'n': out <<
"\n";
break;
2507 case '\\': out <<
"\\";
break;
2508 case 't': out <<
"\t";
break;
2509 default: out <<
"\\" << s[
i+1];
2520 Printer::printElemDiff(std::ostream& out,
2526 #ifdef GECODE_HAS_SET_VARS
2530 #ifdef GECODE_HAS_FLOAT_VARS
2535 #ifdef GECODE_HAS_GIST 2543 if (res.length() > 0) {
2552 if (res.length() > 0) {
2558 #ifdef GECODE_HAS_SET_VARS 2562 if (res.length() > 0) {
2569 #ifdef GECODE_HAS_FLOAT_VARS 2573 if (res.length() > 0) {
2580 }
else if (ai->
isBool()) {
2581 out << (ai->
getBool() ?
"true" :
"false");
2582 }
else if (ai->
isSet()) {
2585 out << s->
min <<
".." << s->
max;
2588 for (
unsigned int i=0;
i<s->
s.size();
i++) {
2589 out << s->
s[
i] << (
i < s->
s.size()-1 ?
", " :
"}");
2594 for (
unsigned int i=0;
i<s.
size();
i++) {
2595 if (s[
i] ==
'\\' &&
i<s.
size()-1) {
2597 case 'n': out <<
"\n";
break;
2598 case '\\': out <<
"\\";
break;
2599 case 't': out <<
"\t";
break;
2600 default: out <<
"\\" << s[
i+1];
2615 #ifdef GECODE_HAS_SET_VARS 2619 #ifdef GECODE_HAS_FLOAT_VARS 2631 #ifdef GECODE_HAS_SET_VARS
2635 #ifdef GECODE_HAS_FLOAT_VARS
2640 if (_output == NULL)
2642 for (
unsigned int i=0;
i< _output->
a.size();
i++) {
2646 int size = aia->
a.size();
2648 for (
int j=0; j<
size; j++) {
2649 printElem(out,aia->
a[j],iv,bv
2650 #ifdef GECODE_HAS_SET_VARS
2653 #ifdef GECODE_HAS_FLOAT_VARS
2662 printElem(out,ai,iv,bv
2663 #ifdef GECODE_HAS_SET_VARS
2666 #ifdef GECODE_HAS_FLOAT_VARS
2680 #ifdef GECODE_HAS_SET_VARS
2685 #ifdef GECODE_HAS_FLOAT_VARS
2691 if (_output == NULL)
2693 for (
unsigned int i=0;
i< _output->
a.size();
i++) {
2697 int size = aia->
a.size();
2699 for (
int j=0; j<
size; j++) {
2700 printElemDiff(out,aia->
a[j],iv1,iv2,bv1,bv2
2701 #ifdef GECODE_HAS_SET_VARS
2704 #ifdef GECODE_HAS_FLOAT_VARS
2713 printElemDiff(out,ai,iv1,iv2,bv1,bv2
2714 #ifdef GECODE_HAS_SET_VARS
2717 #ifdef GECODE_HAS_FLOAT_VARS
2727 iv_names.push_back(n);
2731 bv_names.push_back(n);
2733 #ifdef GECODE_HAS_FLOAT_VARS 2736 fv_names.push_back(n);
2739 #ifdef GECODE_HAS_SET_VARS 2742 sv_names.push_back(n);
2748 std::map<int,int>& iv, std::map<int,int>& bv,
2749 std::map<int,int>& sv, std::map<int,int>& fv) {
2752 if (iv.find(x->
i) == iv.end()) {
2753 int newi = iv.size();
2759 if (bv.find(x->
i) == bv.end()) {
2760 int newi = bv.size();
2766 if (sv.find(x->
i) == sv.end()) {
2767 int newi = sv.size();
2773 if (fv.find(x->
i) == fv.end()) {
2774 int newi = fv.size();
2783 int& optVar,
bool optVarIsInt,
2786 #ifdef GECODE_HAS_SET_VARS
2790 #ifdef GECODE_HAS_FLOAT_VARS
2795 if (_output == NULL) {
2796 if (optVarIsInt && optVar != -1) {
2805 #ifdef GECODE_HAS_SET_VARS 2808 #ifdef GECODE_HAS_FLOAT_VARS 2809 if (!optVarIsInt && optVar != -1) {
2820 std::map<int,int> iv_new;
2821 std::map<int,int> bv_new;
2822 std::map<int,int> sv_new;
2823 std::map<int,int> fv_new;
2833 for (
unsigned int i=0;
i< _output->
a.size();
i++) {
2837 for (
unsigned int j=0; j<aia->
a.size(); j++) {
2838 shrinkElement(aia->
a[j],iv_new,bv_new,sv_new,fv_new);
2841 shrinkElement(ai,iv_new,bv_new,sv_new,fv_new);
2846 for (std::map<int,int>::iterator
i=iv_new.
begin();
i != iv_new.
end(); ++
i) {
2847 iva[(*i).second] = iv[(*i).first];
2852 for (std::map<int,int>::iterator
i=bv_new.
begin();
i != bv_new.
end(); ++
i) {
2853 bva[(*i).second] = bv[(*i).first];
2857 #ifdef GECODE_HAS_SET_VARS 2859 for (std::map<int,int>::iterator
i=sv_new.
begin();
i != sv_new.
end(); ++
i) {
2860 sva[(*i).second] = sv[(*i).first];
2865 #ifdef GECODE_HAS_FLOAT_VARS 2867 for (std::map<int,int>::iterator
i=fv_new.
begin();
i != fv_new.
end(); ++
i) {
2868 fva[(*i).second] = fv[(*i).first];
void click(Inspector *i)
Add inspector that reacts on node double clicks.
void shrinkArrays(Printer &p)
Remove all variables not needed for output.
unsigned int a_d
Create a clone during recomputation if distance is greater than a_d (adaptive distance) ...
BoolValBranch BOOL_VAL_RND(Rnd r)
Select random value.
int solutions(void) const
Which values to select for branching first.
Gecode::SetVarArray sv_aux
The introduced set variables.
Restart with linear sequence.
int floatVarCount
Number of float variables.
int val(void) const
Return assigned value (only if assigned)
const Gecode::FloatNum step
Option< AST::SetLit *> domain
Options for running FlatZinc models
SetVarBranch SET_VAR_SIZE_MIN(BranchTbl tbl)
unsigned int nogoods_limit
Depth limit for extraction of no-goods.
virtual Choice * choice(Space &home)
Return choice.
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
RestartMode restart(void) const
Combine variable selection criteria for tie-breaking.
IntSet vs2is(IntVarSpec *vs)
virtual void print(const Space &, const Gecode::Choice &c, unsigned int, std::ostream &o) const
Print explanation.
FlatZincGetInfo(const Printer &printer)
Which values to select for branching first.
std::ostream & getStream(void)
Get the stream that is used to output text.
BoolVarBranch BOOL_VAR_NONE(void)
Select first unassigned variable.
FloatNum med(void) const
Return median of domain (closest representation)
void finalize(void)
Finalize tuple set.
IntArgs arg2intargs(AST::Node *arg, int offset=0)
Convert arg (array of integers) to IntArgs.
void post(FlatZincSpace &s, const ConExpr &ce)
Post constraint specified by ce.
FloatValBranch FLOAT_VAL_SPLIT_MAX(void)
Select values greater than mean of smallest and largest value.
BoolVarBranch BOOL_VAR_AFC_MIN(double d, BranchTbl tbl)
Select variable with smallest accumulated failure count with decay factor d.
int size(void) const
Return size of array (number of elements)
Traits class for search engines.
const int min
Smallest allowed integer in integer set.
FloatVarArgs arg2floatvarargs(AST::Node *arg, int offset=0)
Convert n to FloatVarArgs.
bool isBool(void)
Test if node is a Boolean node.
BoolAssign BOOL_ASSIGN_MIN(void)
Select smallest value.
std::vector< bool > sv_introduced
Indicates whether a set variable is introduced by mzn2fzn.
Class to send solution information to CPProfiler.
Which values to select for branching first.
bool getBool(void)
Cast this node to a Boolean node.
int size(void) const
Return size of array (number of elements)
const FloatNum max
Largest allowed float value.
Gecode::BoolVarArray bv
The Boolean variables.
size_t operator()(const Gecode::DFA &d) const
Return hash key for d.
void put(unsigned int i)
Add i to the contents.
void update(Space &home, VarArray< Var > &a)
Update array to be a clone of array a.
Meth _method
Whether to solve as satisfaction or optimization problem.
unsigned int c_d
Create a clone after every c_d commits (commit distance)
FloatVarBranch FLOAT_VAR_DEGREE_MAX(BranchTbl tbl)
Select variable with largest degree.
Cutoff generator appending two cutoff generators.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
SetValBranch ann2svalsel(AST::Node *ann, std::string r0, std::string r1, Rnd rnd)
Which values to select for branching first.
SetLit * getSet(void)
Cast this node to a set literal node.
void newIntVar(IntVarSpec *vs)
Create new integer variable from specification.
IntVarBranch INT_VAR_SIZE_MAX(BranchTbl tbl)
Select variable with largest domain size.
Abstract base class for comparators.
Call * getCall(void)
Return function call.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
FlatZincSpaceInitData(void)
Initialize.
int getFloatVar(void)
Cast this node to a Float variable node.
Gecode::ScriptMode mode(void) const
Gecode::IntVarArray iv
The integer variables.
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
static PropagatorGroup all
Group of all propagators.
void stop(Support::Timer &timer, std::ostream &os)
Get time since start of timer and print user friendly time information.
bool assigned(void) const
Test whether view is assigned.
IntAssign INT_ASSIGN_MED(void)
Select greatest value not greater than the median.
Specification for set variables.
FloatVarBranch FLOAT_VAR_AFC_SIZE_MIN(double d, BranchTbl tbl)
Select variable with smalllest accumulated failure count divided by domain size with decay factor d...
virtual void compare(const Space &s0, const Space &s1)
Use the compare method of the template class S to compare two spaces.
size_t operator()(const Gecode::SharedArray< int > &x) const
Return hash key for x.
BranchInformation branchInfo
Information for printing branches.
void compare(const Space &s, std::ostream &out) const
Compare this space with space s and print the differences on out.
int boolVarCount
Number of Boolean variables.
IntVarBranch INT_VAR_DEGREE_MAX(BranchTbl tbl)
Select variable with largest degree.
BoolVarBranch BOOL_VAR_ACTION_MIN(double d, BranchTbl tbl)
Select variable with lowest action with decay factor d.
bool assigned(void) const
Test if all variables are assigned.
std::size_t hash(void) const
Return hash key.
IntVarBranch INT_VAR_AFC_MIN(double d, BranchTbl tbl)
Select variable with smallest accumulated failure count with decay factor d.
bool singleton(void) const
Test whether float is a singleton.
AuxVarBrancher(Home home, TieBreak< IntVarBranch > int_varsel0, IntValBranch int_valsel0, TieBreak< BoolVarBranch > bool_varsel0, BoolValBranch bool_valsel0, SetVarBranch set_varsel0, SetValBranch set_valsel0, TieBreak< FloatVarBranch > float_varsel0, FloatValBranch float_valsel0)
Construct brancher.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
bool optVarIsInt(void) const
Return whether variable used for optimization is integer (or float)
Which values to select for assignment.
void minimize(int var, bool isInt, AST::Array *annotation)
Post that integer variable var should be minimized.
unsigned long int fail
Number of failed nodes in search tree.
bool isSetVar(void)
Test if node is a set variable node.
bool isBoolVar(void)
Test if node is a Boolean variable node.
unsigned long int depth
Maximum depth of search stack.
TieBreak< IntVarBranch > ann2ivarsel(AST::Node *ann, Rnd rnd, double decay)
Restart with Luby sequence.
DFASet dfaSet
Hash table of DFAs.
bool profiler_info(void) const
FloatValBranch ann2fvalsel(AST::Node *ann, std::string r0, std::string r1)
bool allSolutions(void) const
Rnd defrnd(0)
Uninitialized default random number generator.
BoolAssign ann2asnbvalsel(AST::Node *ann, Rnd rnd)
BoolAssign BOOL_ASSIGN_MAX(void)
Select largest value.
int vs2bsh(BoolVarSpec *bs)
IntVarBranch INT_VAR_REGRET_MIN_MAX(BranchTbl tbl)
Select variable with largest min-regret.
SetVarBranch SET_VAR_MAX_MAX(BranchTbl tbl)
void init(int intVars, int boolVars, int setVars, int floatVars)
Initialize space with given number of variables.
static void explore(S *root, const FlatZincOptions &opt, Gist::Inspector *i, Gist::Comparator *c)
BoolValBranch ann2bvalsel(AST::Node *ann, std::string &r0, std::string &r1, Rnd rnd)
Class to record search trace info for CPProfiler.
void varValPrint(const Space &home, const Brancher &b, unsigned int a, Var, int i, const int &n, std::ostream &o)
void printIntVar(std::ostream &os, const std::string name, const Int::IntView &x)
Meth method(void) const
Return whether to solve a satisfaction or optimization problem.
unsigned long int propagate
Number of propagator executions.
Search::Cutoff * createCutoff(const Options &o)
Create cutoff object from options.
const int max
Largest allowed integer in integer set.
SetVarBranch SET_VAR_NONE(void)
Array * getArray(void)
Cast this node to an array node.
unsigned int id(void) const
Return a unique id for the group.
const int max
Largest allowed integer value.
FloatVarBranch FLOAT_VAR_ACTION_SIZE_MIN(double d, BranchTbl tbl)
Select variable with smallest action divided by domain size with decay factor d.
int vs2bsl(BoolVarSpec *bs)
An inspector for printing simple text output.
Abstract base class for inspectors.
FloatVarBranch FLOAT_VAR_NONE(void)
Select first unassigned variable.
IntSharedArray arg2intsharedarray(AST::Node *arg, int offset=0)
Convert arg (array of integers) to IntSharedArray.
unsigned int profiler_port(void) const
unsigned int size(Space &home) const
Return number of propagators in a group.
const int min
Smallest allowed integer value.
Base-class for both propagators and branchers.
virtual size_t size(void) const
Report size occupied.
Statistics for execution of status
virtual Gecode::Space * copy(void)
Copy function.
void newSetVar(SetVarSpec *vs)
Create new set variable from specification.
IntAssign INT_ASSIGN_MIN(void)
Select smallest value.
IntValBranch INT_VAL_RND(Rnd r)
Select random value.
virtual Choice * choice(const Space &, Archive &e)
Return choice.
std::vector< bool > iv_introduced
Indicates whether an integer variable is introduced by mzn2fzn.
IntVarBranch INT_VAR_MAX_MAX(BranchTbl tbl)
Select variable with largest max.
void newBoolVar(BoolVarSpec *vs)
Create new Boolean variable from specification.
IntSharedArray arg2boolsharedarray(AST::Node *arg, int offset=0)
Convert arg (array of integers) to IntSharedArray.
bool alias
Whether the variable aliases another variable.
SetVarBranch ann2svarsel(AST::Node *ann, Rnd rnd, double decay)
void start(void)
Start timer.
DFA getSharedDFA(DFA &a)
Share DFA a if possible.
SetVar arg2SetVar(AST::Node *n)
Convert n to SetVar.
unsigned int nogoods_limit(void) const
int getSetVar(void)
Cast this node to a set variable node.
double getFloat(void)
Cast this node to a Float node.
Gecode::FloatVal c(-8, 8)
int profiler_id(void) const
std::size_t hash(void) const
Return hash key.
FloatVarBranch FLOAT_VAR_SIZE_MAX(BranchTbl tbl)
Select variable with largest domain size.
Cutoff * cutoff
Cutoff for restart-based search.
int optVar(void) const
Return index of variable used for optimization.
double threads
Number of threads to use.
void sort(TaskViewArray< TaskView > &t)
Sort task view array t according to sto and inc (increasing or decreasing)
size_t operator()(const Gecode::TupleSet &x) const
Return hash key for x.
SetVarBranch SET_VAR_AFC_MAX(double d, BranchTbl tbl)
Deterministic finite automaton (DFA)
int p
Number of positive literals for node type.
IntVarBranch INT_VAR_ACTION_MAX(double d, BranchTbl tbl)
Select variable with highest action with decay factor d.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from heap.
Gecode::FloatVarArray fv
The float variables.
const FloatNum min
Smallest allowed float value.
BoolValBranch BOOL_VAL_MIN(void)
Select smallest value.
IntVarBranch INT_VAR_AFC_SIZE_MAX(double d, BranchTbl tbl)
Select variable with largest accumulated failure count divided by domain size with decay factor d...
Gecode::IntArgs i(4, 1, 2, 3, 4)
IntAssign ann2asnivalsel(AST::Node *ann, Rnd rnd)
Base-class for branchers.
FloatNum n
The middle value for branching.
virtual bool status(const Space &_home) const
Check status of brancher, return true if alternatives left.
BoolValBranch BOOL_VAL_MAX(void)
Select largest value.
int n
Number of negative literals for node type.
BrancherGroup group(void) const
Return group brancher belongs to.
#define GECODE_HAS_SET_VARS
std::vector< bool > fv_introduced
Indicates whether a float variable is introduced by mzn2fzn.
IntPropLevel ann2ipl(AST::Node *ann)
Convert ann to integer propagation level.
Option< std::pair< double, double > > domain
int dfs(Space *root, const Gist::Options &opt)
Create a new stand-alone Gist for root.
IntAssign INT_ASSIGN_RND(Rnd r)
Select random value.
Depth-first branch-and-bound search engine.
static void post(Home home, TieBreak< IntVarBranch > int_varsel, IntValBranch int_valsel, TieBreak< BoolVarBranch > bool_varsel, BoolValBranch bool_valsel, SetVarBranch set_varsel, SetValBranch set_valsel, TieBreak< FloatVarBranch > float_varsel, FloatValBranch float_valsel)
Post brancher.
Execution has resulted in failure.
Specification for Boolean variables.
Value description class for branching.
double threads(void) const
Node representing an atom
SharedHandle::Object * object(void) const
Access to the shared object.
int _optVar
Index of the variable to optimize.
int getIntVar(void)
Cast this node to an integer variable node.
void finalize(void)
Clean up when Gist exits.
int size(void) const
Return number of elements.
Output support class for FlatZinc interpreter.
IntVarBranch INT_VAR_MIN_MIN(BranchTbl tbl)
Select variable with smallest min.
IntVar arg2IntVar(AST::Node *n)
Convert n to IntVar.
Choice(const Brancher &b, bool fail0)
Initialize choice for brancher b.
FZPrintingInspector(const Printer &p0)
Constructor.
Space * clone(CloneStatistics &stat=unused_clone) const
Clone space.
static void installCtrlHandler(bool install, bool force=false)
Install handler for catching Ctrl-C.
static Search::Stop * create(unsigned int node, unsigned int fail, unsigned int time, bool intr)
Create appropriate stop-object.
IntAssign INT_ASSIGN_MAX(void)
Select largest value.
FloatNum min(void) const
Return minimum of domain.
Which integer or Boolean variable to select for branching.
Simple propagation levels.
int getBoolVar(void)
Cast this node to a Boolean variable node.
The Gecode Interactive Search Tool.
virtual const char * what(void) const
Return information.
virtual void archive(Archive &e) const
Archive into e.
bool isSet(void)
Test if node is a set literal node.
void fail(void)
Fail space.
unsigned int size(void) const
Return size (cardinality) of set.
BoolVarArgs arg2boolvarargs(AST::Node *arg, int offset=0, int siv=-1)
Convert arg to BoolVarArgs.
IntValBranch INT_VAL_MIN(void)
Select smallest value.
struct Gecode::Space::@58::@59 p
Data only available during propagation or branching.
const std::string & floatVarName(int i) const
std::string what(void) const
unsigned int size(I &i)
Size of all ranges of range iterator i.
void newFloatVar(FloatVarSpec *vs)
Create new float variable from specification.
static void explore(S *root, const FlatZincOptions &opt, Gist::Inspector *i, Gist::Comparator *c)
virtual ExecStatus commit(Space &, const Gecode::Choice &c, unsigned int)
Perform commit for choice c.
int min(void) const
Return smallest value of range.
IntValBranch INT_VAL_SPLIT_MAX(void)
Select values greater than mean of smallest and largest value.
void shrinkElement(AST::Node *node, std::map< int, int > &iv, std::map< int, int > &bv, std::map< int, int > &sv, std::map< int, int > &fv)
bool l
Whether to try the lower or upper half first.
const char * name(void) const
Return name of script.
IntVarBranch INT_VAR_RND(Rnd r)
Select random variable (uniform distribution, for tie breaking)
iterator begin(void)
Return an iterator at the beginning of the array.
Iterator for the greatest lower bound ranges of a set variable.
Gecode::BoolVarArray bv_aux
The introduced Boolean variables.
struct Gecode::Space::@58::@60 c
Data available only during copying.
void branch(Home home, const IntVarArgs &x, const BoolVarArgs &y, IntBoolVarBranch vars, IntValBranch vals)
Branch function for integer and Boolean variables.
bool clone
Whether engines create a clone when being initialized.
int min(void) const
Return minimum of domain.
void print(std::ostream &out, const Gecode::IntVarArray &iv, const Gecode::BoolVarArray &bv, const Gecode::SetVarArray &sv, const Gecode::FloatVarArray &fv) const
Array * getArgs(unsigned int n)
BoolAssign BOOL_ASSIGN_RND(Rnd r)
Select random value.
FlatZincSpaceInitData * _initData
Initialisation data (only used for posting constraints)
FloatValBranch FLOAT_VAL_SPLIT_MIN(void)
Select values not greater than mean of smallest and largest value.
void addSetVarName(const std::string &n)
bool funcDep
Whether the variable functionally depends on another variable.
void createBranchers(Printer &p, AST::Node *ann, FlatZincOptions &opt, bool ignoreUnknown, std::ostream &err=std::cerr)
Create branchers corresponding to the solve item annotations.
SetVarBranch SET_VAR_AFC_MIN(double d, BranchTbl tbl)
IntVarBranch INT_VAR_AFC_MAX(double d, BranchTbl tbl)
Select variable with largest accumulated failure count with decay factor d.
FloatVarBranch FLOAT_VAR_AFC_MIN(double d, BranchTbl tbl)
Select variable with smallest accumulated failure count with decay factor d.
virtual std::string getInfo(const Space &space) const
Return info for a space.
virtual void compare(const Space &s0, const Space &s1)=0
Call-back function.
Choice that only signals failure or success
bool range(void) const
Test whether domain is a range.
SetVarBranch SET_VAR_RND(Rnd r)
IntSharedArraySet intSharedArraySet
Hash table of shared integer arrays.
unsigned int node(void) const
Option< AST::SetLit *> domain
TieBreak< BoolVarBranch > ann2bvarsel(AST::Node *ann, Rnd rnd, double decay)
IntVarArgs arg2intvarargs(AST::Node *arg, int offset=0)
Convert arg to IntVarArgs.
virtual void constrain(const Space &s)
Implement optimization.
SearchTracer * tracer
Tracer object for tracing search.
bool isIntVar(void)
Test if node is an integer variable node.
std::unordered_set< SharedArray< int > > IntSharedArraySet
Hash table of shared integer arrays.
const std::string & intVarName(int i) const
FloatVarBranch FLOAT_VAR_RND(Rnd r)
Select random variable (uniform distribution, for tie breaking)
Passing integer variables.
bool isBoolArray(AST::Node *b, int &singleInt)
Check if b is array of Booleans (or has a single integer)
std::vector< bool > bv_introduced
Indicates whether a Boolean variable is introduced by mzn2fzn.
SetValBranch SET_VAL_MIN_EXC(void)
SharedArray< int > IntSharedArray
Arrays of integers that can be shared among several element constraints.
bool done
Flag whether brancher is done.
Passing integer arguments.
Passing Boolean variables.
SetValBranch SET_VAL_MIN_INC(void)
static const IntSet empty
Empty set.
FloatValBranch float_valsel
bool isInt(int &i)
Test if node is int, if yes set i to the value.
Float view for float variables.
bool _optVarIsInt
Whether variable to optimize is integer (or float)
FloatVarBranch FLOAT_VAR_SIZE_MIN(BranchTbl tbl)
Select variable with smallest domain size.
IntSet arg2intset(AST::Node *n)
Convert n to IntSet.
Gecode::FloatVarArray fv_aux
The introduced float variables.
Boolean integer variables.
bool isString(void)
Test if node is a string node.
SetValBranch SET_VAL_MAX_EXC(void)
Post propagator for SetVar SetOpType SetVar SetRelType r
virtual bool slave(const MetaInfo &mi)
Slave function for restarts.
void init(void)
Initialize the implementation object.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Class represeting a set of tuples.
bool assigned
Whether the variable is assigned.
IntValBranch INT_VAL_MAX(void)
Select largest value.
SetValBranch SET_VAL_MAX_INC(void)
IntPropLevel
Propagation levels for integer propagators.
Cutoff generator for constant sequence.
AST::Array * args
Constraint arguments.
int getInt(void)
Cast this node to an integer node.
void print(std::basic_ostream< Char, Traits > &s, bool assigned, IL &lb, IU &ub, unsigned int cardMin, unsigned int cardMax)
Print set view.
struct Gecode::@585::NNF::@62::@63 b
For binary nodes (and, or, eqv)
void printDiff(std::ostream &out, const Gecode::IntVarArray &iv1, const Gecode::IntVarArray &iv2, const Gecode::BoolVarArray &bv1, const Gecode::BoolVarArray &bv2, const Gecode::SetVarArray &sv1, const Gecode::SetVarArray &sv2, const Gecode::FloatVarArray &fv1, const Gecode::FloatVarArray &fv2) const
IntVarBranch INT_VAR_SIZE_MIN(BranchTbl tbl)
Select variable with smallest domain size.
Post propagator for f(x \diamond_{\mathit{op}} y) \sim_r z \f$ void rel(Home home
Integer view for integer variables.
SetVarBranch SET_VAR_SIZE_MAX(BranchTbl tbl)
void postConstraints(std::vector< ConExpr *> &ces)
Post a constraint specified by ce.
BoolVarBranch BOOL_VAR_AFC_MAX(double d, BranchTbl tbl)
Select variable with largest accumulated failure count with decay factor d.
bool assigned(void) const
Test whether view is assigned.
Exception: Base-class for exceptions
Print statistics for script.
Base class for variables.
IntValBranch INT_VALUES_MIN(void)
Try all values starting from smallest.
Run script with CP-profiler.
void free(T *b, long unsigned int n)
Delete n objects starting at b.
virtual void print(std::ostream &)=0
Output string representation.
Exception signaling type error
Node * x
Pointer to corresponding Boolean expression node.
BoolVarBranch BOOL_VAR_DEGREE_MAX(BranchTbl tbl)
Select variable with largest degree.
FloatNum max(void) const
Return maximum of domain.
Home operator()(Propagator &p)
Return a home for this space with the information that p is being rewritten.
void print(std::ostream &out, const Printer &p) const
Produce output on out using p.
virtual void archive(Archive &e) const
Archive into e.
struct Gecode::@585::NNF::@62::@64 a
For atomic nodes.
Choice for performing commit
unsigned int fail(void) const
bool hasAtom(const std::string &id)
Test if node has atom with id.
virtual Actor * copy(Space &home)
Copy brancher.
Restart with geometric sequence.
bool isFloatVar(void)
Test if node is a float variable node.
IntBoolVarBranch INTBOOL_VAR_AFC_SIZE_MAX(double d=1.0)
Select variable with largest accumulated failure count divided by domain size.
void flattenAnnotations(AST::Array *ann, std::vector< AST::Node *> &out)
SetVarBranch SET_VAR_AFC_SIZE_MIN(double d, BranchTbl tbl)
FloatVarBranch FLOAT_VAR_AFC_MAX(double d, BranchTbl tbl)
Select variable with largest accumulated failure count with decay factor d.
Heap heap
The single global heap.
Iterator for the values in the greatest lower bound of a set variable.
FlatZincSpace(FlatZincSpace &)
Copy constructor.
IntVarBranch INT_VAR_ACTION_MIN(double d, BranchTbl tbl)
Select variable with lowest action with decay factor d.
BoolVarBranch BOOL_VAR_ACTION_MAX(double d, BranchTbl tbl)
Select variable with highest action with decay factor d.
IntVarBranch INT_VAR_AFC_SIZE_MIN(double d, BranchTbl tbl)
Select variable with smallest accumulated failure count divided by domain size with decay factor d...
Which values to select for assignment.
std::unordered_set< TupleSet > TupleSetSet
Hash table of tuple sets.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
Exception class for FlatZinc errors
Specification for floating point variables.
FloatVarBranch FLOAT_VAR_ACTION_MIN(double d, BranchTbl tbl)
Select variable with lowest action with decay factor d.
Domain propagation Options: basic versus advanced propagation.
TieBreak< FloatVarBranch > ann2fvarsel(AST::Node *ann, Rnd rnd, double decay)
int bab(Space *root, const Gist::Options &opt)
Create a new stand-alone Gist for branch-and-bound search of root.
AST::Array * _solveAnnotations
Annotations on the solve item.
virtual void inspect(const Space &node)
Use the print method of the template class S to print a space.
unsigned int c_d(void) const
IntValBranch INT_VAL_MED(void)
Select greatest value not greater than the median.
std::unordered_set< DFA > DFASet
Hash table of DFAs.
IntVarBranch INT_VAR_ACTION_SIZE_MIN(double d, BranchTbl tbl)
Select variable with smallest action divided by domain size with decay factor d.
void printFloatVar(std::ostream &os, const std::string name, const Float::FloatView &f)
~FlatZincSpace(void)
Destructor.
An window for simple text output.
bool needAuxVars
Whether the introduced variables still need to be copied.
double restart_base(void) const
virtual std::string name(void)
Return name.
void printBoolVar(std::ostream &os, const std::string name, const BoolVar &b)
int max(void) const
Return largest value of range.
void solve(AST::Array *annotation)
Post the solve item.
unsigned int time(void) const
Post propagator for SetVar x
unsigned long int restart
Number of restarts.
AST::Array * solveAnnotations(void) const
Return the solve item annotations.
BoolVarBranch BOOL_VAR_RND(Rnd r)
Select random variable (uniform distribution, for tie breaking)
TieBreak< FloatVarBranch > float_varsel
bool isArray(void)
Test if node is an array node.
bool interrupt(void) const
TupleSet & add(const IntArgs &t)
Add tuple t to tuple set.
void aliasBool2Int(int iv, int bv)
Link integer variable iv to Boolean variable bv.
Rnd _random
Random number generator.
FloatVarBranch FLOAT_VAR_MIN_MIN(BranchTbl tbl)
Select variable with smallest min.
#define GECODE_HAS_FLOAT_VARS
A space that can be initialized with a FlatZinc model.
Gecode::IntVarArray iv_aux
The introduced integer variables.
unsigned int restart_scale(void) const
void addBoolVarName(const std::string &n)
void shrinkArrays(Space &home, int &optVar, bool optVarIsInt, Gecode::IntVarArray &iv, Gecode::BoolVarArray &bv, Gecode::SetVarArray &sv, Gecode::FloatVarArray &fv)
TieBreak< BoolVarBranch > bool_varsel
CompareStatus compare(I &i, J &j)
Check whether range iterator i is a subset of j, or whether they are disjoint.
Stop * stop
Stop object for stopping search.
class Gecode::Gist::Options::_I inspect
const std::string & setVarName(int i) const
IntValBranch INT_VAL_SPLIT_MIN(void)
Select values not greater than mean of smallest and largest value.
int explore(Space *root, bool bab, const Options &opt)
Create a new stand-alone Gist for root using bab.
void run(std::ostream &out, const Printer &p, const FlatZincOptions &opt, Gecode::Support::Timer &t_total)
Run the search.
Gecode toplevel namespace
int max(void) const
Return maximum of domain.
void addIntVarName(const std::string &n)
int * iv_boolalias
Indicates whether an integer variable aliases a Boolean variable.
unsigned long int node
Number of nodes expanded.
void maximize(int var, bool isInt, AST::Array *annotation)
Post that integer variable var should be maximized.
int setVarCount
Number of set variables.
Node representing a function call
int intVarCount
Number of integer variables.
unsigned int a_d(void) const
FZPrintingComparator(const Printer &p0)
Constructor.
IntValBranch ann2ivalsel(AST::Node *ann, std::string &r0, std::string &r1, Rnd rnd)
SetVarArgs arg2setvarargs(AST::Node *arg, int offset=0, int doffset=0, const IntSet &od=IntSet::empty)
Convert n to SetVarArgs.
A node in a FlatZinc abstract syntax tree.
SetVarBranch SET_VAR_ACTION_MAX(double d, BranchTbl tbl)
SetVarBranch SET_VAR_MIN_MIN(BranchTbl tbl)
IntArgs arg2boolargs(AST::Node *arg, int offset=0)
Convert arg (array of Booleans) to IntArgs.
FloatVarBranch FLOAT_VAR_ACTION_SIZE_MAX(double d, BranchTbl tbl)
Select variable with largest action divided by domain size with decay factor d.
Which variable to select for branching.
FloatVarBranch FLOAT_VAR_AFC_SIZE_MAX(double d, BranchTbl tbl)
Select variable with largest accumulated failure count divided by domain size with decay factor d...
SetVarBranch SET_VAR_AFC_SIZE_MAX(double d, BranchTbl tbl)
void addFloatVarName(const std::string &n)
unsigned int _lns
Percentage of variables to keep in LNS (or 0 for no LNS)
friend FloatVal max(const FloatVal &x, const FloatVal &y)
iterator end(void)
Return an iterator past the end of the array.
TupleSet arg2tupleset(AST::Node *n, int noOfVars)
Convert n to TupleSet.
void assign(Home home, const FloatVarArgs &x, FloatAssign fa, FloatBranchFilter bf, FloatVarValPrint vvp)
Assign all x with value selection vals.
FloatVarBranch FLOAT_VAR_MAX_MAX(BranchTbl tbl)
Select variable with largest max.
void varValPrintF(const Space &home, const Brancher &b, unsigned int a, FloatVar, int i, const FloatNumBranch &nl, std::ostream &o)
friend FloatVal min(const FloatVal &x, const FloatVal &y)
Gecode::SetVarArray sv
The set variables.
Home class for posting propagators
FloatVarBranch FLOAT_VAR_ACTION_MAX(double d, BranchTbl tbl)
Select variable with highest action with decay factor d.
std::string getDomains(const Printer &p) const
Get string representing the domains of variables (for cpprofiler)
void cmb_hash(std::size_t &seed, const T h)
Combine hash value h into seed.
double FloatNum
Floating point number base type.
Specification for integer variables.
void compare(Comparator *c)
Add comparator.
SetVarBranch SET_VAR_ACTION_SIZE_MAX(double d, BranchTbl tbl)
const std::string & boolVarName(int i) const
BoolValBranch bool_valsel
bool introduced
Whether the variable was introduced in the mzn2fzn translation.
virtual void finalize(void)
Finalize when Gist exits.
Restart with constant sequence.
std::string getString(void)
Cast this node to a string node.
Gecode::IntVarArray iv_lns
The integer variables used in LNS.
FloatVar arg2FloatVar(AST::Node *n)
Convert n to FloatVar.
Depth-first search engine.
Branching on the introduced variables.
const Val & some(void) const
SetVarBranch SET_VAR_ACTION_SIZE_MIN(double d, BranchTbl tbl)
IntSharedArray _lnsInitialSolution
Initial solution to start the LNS (or NULL for no LNS)
Registry & registry(void)
Return global registry object.
TupleSetSet tupleSetSet
Hash table of tuple sets.
FloatValArgs arg2floatargs(AST::Node *arg, int offset=0)
Convert n to FloatValArgs.
IntVarBranch INT_VAR_ACTION_SIZE_MAX(double d, BranchTbl tbl)
Select variable with largest action divided by domain size with decay factor d.
Option< AST::SetLit * > upperBound
virtual size_t dispose(Space &)
Delete brancher and return its size.
bool fail
Whether brancher should fail.
AuxVarBrancher(Space &home, AuxVarBrancher &b)
Copy constructor.
TieBreak< IntVarBranch > int_varsel
int val(void) const
Return assigned value.
void init(AST::Array *output)
BoolVar arg2BoolVar(AST::Node *n)
Convert n to BoolVar.
IntSetArgs arg2intsetargs(AST::Node *arg, int offset=0)
Convert arg to IntSetArgs.
SetVarBranch SET_VAR_ACTION_MIN(double d, BranchTbl tbl)
Abstract representation of a constraint.