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 <<
"{\n\t\"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 1866 Meta<FlatZincSpace,Engine> se(
this,o);
1868 if (noOfSolutions == -1) {
1869 noOfSolutions = (_method == SAT) ? 1 : 0;
1871 bool printAll = _method == SAT || opt.
allSolutions() || noOfSolutions != 0;
1872 int findSol = noOfSolutions;
1873 FlatZincSpace* sol = NULL;
1874 while (FlatZincSpace* next_sol = se.next()) {
1879 out <<
"----------" << std::endl;
1884 if (sol && !printAll) {
1886 out <<
"----------" << std::endl;
1888 if (!se.stopped()) {
1890 out <<
"==========" << std::endl;
1892 out <<
"=====UNSATISFIABLE=====" << std::endl;
1895 out <<
"=====UNKNOWN=====" << std::endl;
1903 double totalTime = (t_total.
stop() / 1000.0);
1904 double solveTime = (t_solve.
stop() / 1000.0);
1905 double initTime = totalTime - solveTime;
1907 <<
"%%%mzn-stat initTime=" << initTime
1909 out <<
"%%%mzn-stat solveTime=" << solveTime
1911 out <<
"%%%mzn-stat solutions=" 1912 <<
std::abs(noOfSolutions - findSol) << std::endl
1913 <<
"%%%mzn-stat variables=" 1914 << (intVarCount + boolVarCount + setVarCount) << std::endl
1915 <<
"%%%mzn-stat propagators=" << n_p << std::endl
1917 <<
"%%%mzn-stat nodes=" << stat.
node << std::endl
1918 <<
"%%%mzn-stat failures=" << stat.
fail << std::endl
1919 <<
"%%%mzn-stat restarts=" << stat.
restart << std::endl
1920 <<
"%%%mzn-stat peakDepth=" << stat.
depth << std::endl
1921 <<
"%%%mzn-stat-end" << std::endl
1929 #ifdef GECODE_HAS_QT 1931 FlatZincSpace::branchWithPlugin(
AST::Node* ann) {
1932 if (
AST::Call*
c = dynamic_cast<AST::Call*>(ann)) {
1933 QString pluginName(
c->id.c_str());
1934 if (QLibrary::isLibrary(pluginName+
".dll")) {
1935 pluginName +=
".dll";
1936 }
else if (QLibrary::isLibrary(pluginName+
".dylib")) {
1937 pluginName =
"lib" + pluginName +
".dylib";
1938 }
else if (QLibrary::isLibrary(pluginName+
".so")) {
1940 pluginName =
"lib" + pluginName +
".so";
1942 QPluginLoader pl(pluginName);
1943 QObject* plugin_o = pl.instance();
1946 "Error loading plugin "+pluginName.toStdString()+
1947 ": "+pl.errorString().toStdString());
1949 BranchPlugin* pb = qobject_cast<BranchPlugin*>(plugin_o);
1952 "Error loading plugin "+pluginName.toStdString()+
1953 ": does not contain valid PluginBrancher");
1955 pb->branch(*
this,
c);
1960 FlatZincSpace::branchWithPlugin(
AST::Node*) {
1962 "Branching with plugins not supported (requires Qt support)");
1972 runEngine<BAB>(out,p,
opt,t_total);
1975 runEngine<DFS>(out,p,
opt,t_total);
1985 static_cast<const FlatZincSpace*>(&s)->iv[_optVar].val());
1986 else if (_method == MAX)
1988 static_cast<const FlatZincSpace*>(&s)->iv[_optVar].val());
1990 #ifdef GECODE_HAS_FLOAT_VARS 1993 static_cast<const FlatZincSpace*>(&s)->fv[_optVar].val()-
step);
1994 else if (_method == MAX)
1996 static_cast<const FlatZincSpace*>(&s)->fv[_optVar].val()+
step);
2004 (_lns > 0) && (mi.
last()==NULL) && (_lnsInitialSolution.size()>0)) {
2005 for (
unsigned int i=iv_lns.
size();
i--;) {
2006 if (_random(99) <= _lns) {
2007 rel(*
this, iv_lns[
i],
IRT_EQ, _lnsInitialSolution[i]);
2012 (_lns > 0) && mi.
last()) {
2013 const FlatZincSpace& last =
2014 static_cast<const FlatZincSpace&
>(*mi.
last());
2015 for (
unsigned int i=iv_lns.
size();
i--;) {
2016 if (_random(99) <= _lns) {
2027 return new FlatZincSpace(*
this);
2042 return _optVarIsInt;
2059 (void) s; (void) out;
2060 #ifdef GECODE_HAS_GIST 2061 const FlatZincSpace& fs =
dynamic_cast<const FlatZincSpace&
>(s);
2062 for (
int i = 0;
i < iv.
size(); ++
i) {
2063 std::stringstream ss;
2064 ss <<
"iv[" <<
i <<
"]";
2067 if (result.length() > 0) out << result << std::endl;
2069 for (
int i = 0;
i < bv.
size(); ++
i) {
2070 std::stringstream ss;
2071 ss <<
"bv[" <<
i <<
"]";
2074 if (result.length() > 0) out << result << std::endl;
2076 #ifdef GECODE_HAS_SET_VARS 2077 for (
int i = 0;
i < sv.
size(); ++
i) {
2078 std::stringstream ss;
2079 ss <<
"sv[" <<
i <<
"]";
2082 if (result.length() > 0) out << result << std::endl;
2085 #ifdef GECODE_HAS_FLOAT_VARS 2086 for (
int i = 0;
i < fv.
size(); ++
i) {
2087 std::stringstream ss;
2088 ss <<
"fv[" <<
i <<
"]";
2091 if (result.length() > 0) out << result << std::endl;
2126 for (
int i=offset;
i--;)
2128 for (
int i=a->
a.size();
i--;)
2129 ia[
i+offset] = a->
a[
i]->getInt();
2134 int noOfTuples = a.
size() == 0 ? 0 : (a.
size()/noOfVars);
2138 for (
int i=0;
i<noOfTuples;
i++) {
2140 for (
int j=0; j<noOfVars; j++) {
2141 t[j] = a[
i*noOfVars+j];
2148 FlatZincSpaceInitData::TupleSetSet::iterator it = _initData->tupleSetSet.find(ts);
2149 if (it != _initData->tupleSetSet.end()) {
2152 _initData->tupleSetSet.insert(ts);
2160 IntArgs ia(arg2intargs(arg,offset));
2163 FlatZincSpaceInitData::IntSharedArraySet::iterator it = _initData->intSharedArraySet.find(sia);
2164 if (it != _initData->intSharedArraySet.end()) {
2167 _initData->intSharedArraySet.insert(sia);
2176 for (
int i=offset;
i--;)
2178 for (
int i=a->
a.size();
i--;)
2179 ia[
i+offset] = a->
a[
i]->getBool();
2184 IntArgs ia(arg2boolargs(arg,offset));
2187 FlatZincSpaceInitData::IntSharedArraySet::iterator it = _initData->intSharedArraySet.find(sia);
2188 if (it != _initData->intSharedArraySet.end()) {
2191 _initData->intSharedArraySet.insert(sia);
2204 int* is = re.
alloc<
int>(
static_cast<unsigned long int>(sl->
s.size()));
2205 for (
int i=sl->
s.size();
i--; )
2214 if (a->
a.size() == 0) {
2219 for (
int i=offset;
i--;)
2221 for (
int i=a->
a.size();
i--;) {
2222 ia[
i+offset] = arg2intset(a->
a[
i]);
2229 if (a->
a.size() == 0) {
2234 for (
int i=offset;
i--;)
2236 for (
int i=a->
a.size();
i--;) {
2237 if (a->
a[
i]->isIntVar()) {
2238 ia[
i+offset] = iv[a->
a[
i]->getIntVar()];
2240 int value = a->
a[
i]->getInt();
2241 IntVar iv(*
this, value, value);
2250 if (a->
a.size() == 0) {
2255 for (
int i=offset;
i--;)
2257 for (
int i=0; i<static_cast<int>(a->
a.size());
i++) {
2260 if (a->
a[
i]->isBool()) {
2261 bool value = a->
a[
i]->getBool();
2262 BoolVar iv(*
this, value, value);
2264 }
else if (a->
a[
i]->isIntVar() &&
2265 aliasBool2Int(a->
a[
i]->getIntVar()) != -1) {
2266 ia[offset++] = bv[aliasBool2Int(a->
a[
i]->getIntVar())];
2268 ia[offset++] = bv[a->
a[
i]->getBoolVar()];
2298 if (a->
a.size() == 0)
2300 for (
int i=a->
a.size();
i--;) {
2301 if (a->
a[
i]->isBoolVar() || a->
a[
i]->isBool()) {
2302 }
else if (a->
a[
i]->isIntVar()) {
2303 if (aliasBool2Int(a->
a[
i]->getIntVar()) == -1) {
2304 if (singleInt != -1) {
2313 return singleInt==-1 || a->
a.size() > 1;
2315 #ifdef GECODE_HAS_SET_VARS 2321 x0 =
SetVar(*
this, d, d);
2332 for (
int i=offset;
i--;) {
2336 for (
int i=a->
a.size();
i--;) {
2337 ia[
i+offset] = arg2SetVar(a->
a[
i]);
2342 #ifdef GECODE_HAS_FLOAT_VARS 2347 for (
int i=offset;
i--;)
2349 for (
int i=a->
a.size();
i--;)
2350 fa[
i+offset] = a->
a[
i]->getFloat();
2356 if (a->
a.size() == 0) {
2361 for (
int i=offset;
i--;)
2363 for (
int i=a->
a.size();
i--;) {
2364 if (a->
a[
i]->isFloatVar()) {
2365 fa[
i+offset] = fv[a->
a[
i]->getFloatVar()];
2367 double value = a->
a[
i]->getFloat();
2404 FlatZincSpaceInitData::DFASet::iterator it = _initData->dfaSet.find(a);
2405 if (it != _initData->dfaSet.end()) {
2408 _initData->dfaSet.insert(a);
2419 Printer::printElem(std::ostream& out,
2439 }
else if (bv[ai->
getBoolVar()].max() == 0) {
2442 out <<
"false..true";
2444 #ifdef GECODE_HAS_SET_VARS 2455 int min = svr.min();
2456 int max = svr.max();
2463 for (; svv(); ++svv)
2464 out <<
", " << svv.val();
2467 out << min <<
".." <<
max;
2470 #ifdef GECODE_HAS_FLOAT_VARS 2481 std::ostringstream oss;
2483 oss << std::setprecision(std::numeric_limits<double>::digits10);
2485 if (oss.str().find(
".") == std::string::npos)
2492 }
else if (ai->
isBool()) {
2493 out << (ai->
getBool() ?
"true" :
"false");
2494 }
else if (ai->
isSet()) {
2497 out << s->
min <<
".." << s->
max;
2500 for (
unsigned int i=0;
i<s->
s.size();
i++) {
2501 out << s->
s[
i] << (
i < s->
s.size()-1 ?
", " :
"}");
2506 for (
unsigned int i=0;
i<s.
size();
i++) {
2507 if (s[
i] ==
'\\' &&
i<s.
size()-1) {
2509 case 'n': out <<
"\n";
break;
2510 case '\\': out <<
"\\";
break;
2511 case 't': out <<
"\t";
break;
2512 default: out <<
"\\" << s[
i+1];
2523 Printer::printElemDiff(std::ostream& out,
2529 #ifdef GECODE_HAS_SET_VARS
2533 #ifdef GECODE_HAS_FLOAT_VARS
2538 #ifdef GECODE_HAS_GIST 2546 if (res.length() > 0) {
2555 if (res.length() > 0) {
2561 #ifdef GECODE_HAS_SET_VARS 2565 if (res.length() > 0) {
2572 #ifdef GECODE_HAS_FLOAT_VARS 2576 if (res.length() > 0) {
2583 }
else if (ai->
isBool()) {
2584 out << (ai->
getBool() ?
"true" :
"false");
2585 }
else if (ai->
isSet()) {
2588 out << s->
min <<
".." << s->
max;
2591 for (
unsigned int i=0;
i<s->
s.size();
i++) {
2592 out << s->
s[
i] << (
i < s->
s.size()-1 ?
", " :
"}");
2597 for (
unsigned int i=0;
i<s.
size();
i++) {
2598 if (s[
i] ==
'\\' &&
i<s.
size()-1) {
2600 case 'n': out <<
"\n";
break;
2601 case '\\': out <<
"\\";
break;
2602 case 't': out <<
"\t";
break;
2603 default: out <<
"\\" << s[
i+1];
2618 #ifdef GECODE_HAS_SET_VARS 2622 #ifdef GECODE_HAS_FLOAT_VARS 2634 #ifdef GECODE_HAS_SET_VARS
2638 #ifdef GECODE_HAS_FLOAT_VARS
2643 if (_output == NULL)
2645 for (
unsigned int i=0;
i< _output->
a.size();
i++) {
2649 int size = aia->
a.size();
2651 for (
int j=0; j<
size; j++) {
2652 printElem(out,aia->
a[j],iv,bv
2653 #ifdef GECODE_HAS_SET_VARS
2656 #ifdef GECODE_HAS_FLOAT_VARS
2665 printElem(out,ai,iv,bv
2666 #ifdef GECODE_HAS_SET_VARS
2669 #ifdef GECODE_HAS_FLOAT_VARS
2683 #ifdef GECODE_HAS_SET_VARS
2688 #ifdef GECODE_HAS_FLOAT_VARS
2694 if (_output == NULL)
2696 for (
unsigned int i=0;
i< _output->
a.size();
i++) {
2700 int size = aia->
a.size();
2702 for (
int j=0; j<
size; j++) {
2703 printElemDiff(out,aia->
a[j],iv1,iv2,bv1,bv2
2704 #ifdef GECODE_HAS_SET_VARS
2707 #ifdef GECODE_HAS_FLOAT_VARS
2716 printElemDiff(out,ai,iv1,iv2,bv1,bv2
2717 #ifdef GECODE_HAS_SET_VARS
2720 #ifdef GECODE_HAS_FLOAT_VARS
2730 iv_names.push_back(n);
2734 bv_names.push_back(n);
2736 #ifdef GECODE_HAS_FLOAT_VARS 2739 fv_names.push_back(n);
2742 #ifdef GECODE_HAS_SET_VARS 2745 sv_names.push_back(n);
2751 std::map<int,int>& iv, std::map<int,int>& bv,
2752 std::map<int,int>& sv, std::map<int,int>& fv) {
2755 if (iv.find(x->
i) == iv.end()) {
2756 int newi = iv.size();
2762 if (bv.find(x->
i) == bv.end()) {
2763 int newi = bv.size();
2769 if (sv.find(x->
i) == sv.end()) {
2770 int newi = sv.size();
2776 if (fv.find(x->
i) == fv.end()) {
2777 int newi = fv.size();
2786 int& optVar,
bool optVarIsInt,
2789 #ifdef GECODE_HAS_SET_VARS
2793 #ifdef GECODE_HAS_FLOAT_VARS
2798 if (_output == NULL) {
2799 if (optVarIsInt && optVar != -1) {
2808 #ifdef GECODE_HAS_SET_VARS 2811 #ifdef GECODE_HAS_FLOAT_VARS 2812 if (!optVarIsInt && optVar != -1) {
2823 std::map<int,int> iv_new;
2824 std::map<int,int> bv_new;
2825 std::map<int,int> sv_new;
2826 std::map<int,int> fv_new;
2836 for (
unsigned int i=0;
i< _output->
a.size();
i++) {
2840 for (
unsigned int j=0; j<aia->
a.size(); j++) {
2841 shrinkElement(aia->
a[j],iv_new,bv_new,sv_new,fv_new);
2844 shrinkElement(ai,iv_new,bv_new,sv_new,fv_new);
2849 for (std::map<int,int>::iterator
i=iv_new.
begin();
i != iv_new.
end(); ++
i) {
2850 iva[(*i).second] = iv[(*i).first];
2855 for (std::map<int,int>::iterator
i=bv_new.
begin();
i != bv_new.
end(); ++
i) {
2856 bva[(*i).second] = bv[(*i).first];
2860 #ifdef GECODE_HAS_SET_VARS 2862 for (std::map<int,int>::iterator
i=sv_new.
begin();
i != sv_new.
end(); ++
i) {
2863 sva[(*i).second] = sv[(*i).first];
2868 #ifdef GECODE_HAS_FLOAT_VARS 2870 for (std::map<int,int>::iterator
i=fv_new.
begin();
i != fv_new.
end(); ++
i) {
2871 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.
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.
TupleSet arg2tupleset(const IntArgs &a, int noOfVars)
Convert a to TupleSet.
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...
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
Gecode::IntArgs i({1, 2, 3, 4})
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
struct Gecode::@593::NNF::@62::@63 b
For binary nodes (and, or, eqv)
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
double stop(void)
Get time since start of timer.
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.
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.
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.
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.
struct Gecode::@593::NNF::@62::@64 a
For atomic nodes.
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.