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> {
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")
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 {
294 const BI& bi = v[b.group().id()];
295 o << bi.n[i] <<
" " << (a==0 ? bi.r0 : bi.r1) <<
" " << n;
297#ifdef GECODE_HAS_FLOAT_VARS
300 std::ostream& o)
const {
301 const BI& bi = v[b.group().id()];
303 << (((a == 0) == nl.
l) ?
"<=" :
">=") << nl.
n;
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()));
383 return std::min(1, std::max(0, sl->
min));
395 return std::max(0, std::min(1, sl->
max));
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;
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;
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;
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;
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;
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
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;
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
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;
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;
788 iv.update(*
this, f.iv);
789 iv_lns.update(*
this, f.iv_lns);
794 for (
int i=0; i<f.iv_aux.size(); i++) {
795 if (!f.iv_aux[i].assigned()) {
797 iva[iva.
size()-1].update(*
this, f.iv_aux[i]);
803 bv.update(*
this, f.bv);
807 for (
int i=0; i<f.bv_aux.size(); i++) {
808 if (!f.bv_aux[i].assigned()) {
810 bva[bva.
size()-1].update(*
this, f.bv_aux[i]);
816#ifdef GECODE_HAS_SET_VARS
817 sv.update(*
this, f.sv);
821 for (
int i=0; i<f.sv_aux.size(); i++) {
822 if (!f.sv_aux[i].assigned()) {
824 sva[sva.
size()-1].update(*
this, f.sv_aux[i]);
830#ifdef GECODE_HAS_FLOAT_VARS
831 fv.update(*
this, f.fv);
835 for (
int i=0; i<f.fv_aux.size(); i++) {
836 if (!f.fv_aux[i].assigned()) {
838 fva[fva.
size()-1].update(*
this, f.fv_aux[i]);
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 {
997 bool operator() (ConExpr* ce0, ConExpr* ce1) {
998 return ce0->args->a.size() < ce1->args->a.size();
1006 std::sort(ces.begin(), ces.end(), ceo);
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")) {
1026 if (c->args->isArray())
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")) {
1096 opt.restart_base(args->
a[0]->getFloat());
1097 opt.restart_scale(args->
a[1]->getInt());
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())
1134 iv_lns[k++] =
iv[vars->
a[i]->getIntVar()];
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());
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;
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());
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());
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);
1345 for (
int i=
iv.size(); i--;) {
1356 std::vector<std::string> iv_sol_names(
iv.size()-(introduced+funcdep+searched));
1357 IntVarArgs iv_sol(
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--;) {
1365 iv_tmp_names[j] =
p.intVarName(i);
1366 iv_tmp[j++] =
iv[i];
1369 iv_sol_names[k] =
p.intVarName(i);
1370 iv_sol[k++] =
iv[i];
1377 for (
int i=
bv.size(); i--;) {
1378 if (bv_searched[i]) {
1388 std::vector<std::string> bv_sol_names(
bv.size()-(introduced+funcdep+searched));
1389 BoolVarArgs bv_sol(
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--;) {
1397 bv_tmp_names[j] =
p.boolVarName(i);
1398 bv_tmp[j++] =
bv[i];
1401 bv_sol_names[k] =
p.boolVarName(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,
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,
1417 branchInfo.add(bg,def_bool_rel_left,def_bool_rel_right,bv_sol_names);
1419#ifdef GECODE_HAS_FLOAT_VARS
1423 for (
int i=
fv.size(); i--;) {
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--;) {
1443 fv_tmp_names[j] =
p.floatVarName(i);
1444 fv_tmp[j++] =
fv[i];
1447 fv_sol_names[k] =
p.floatVarName(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
1463 for (
int i=
sv.size(); i--;) {
1464 if (sv_searched[i]) {
1474 std::vector<std::string> sv_sol_names(
sv.size()-(introduced+funcdep+searched));
1475 SetVarArgs sv_sol(
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--;) {
1483 sv_tmp_names[j] =
p.setVarName(i);
1484 sv_tmp[j++] =
sv[i];
1487 sv_sol_names[k] =
p.setVarName(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,
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,
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,
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,
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);
1565#ifdef GECODE_HAS_FLOAT_VARS
1566 std::vector<std::string> names(1);
1567 names[0] =
p.floatVarName(
_optVar);
1576 std::vector<std::string> names(1);
1583#ifdef GECODE_HAS_FLOAT_VARS
1584 std::vector<std::string> names(1);
1585 names[0] =
p.floatVarName(
_optVar);
1628#ifdef GECODE_HAS_GIST
1633 template<
class Engine>
1638 template<
typename S>
1644 o.
c_d = opt.c_d(); o.
a_d = opt.a_d();
1652 template<
typename S>
1658 o.
c_d = opt.c_d(); o.
a_d = opt.a_d();
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;
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>
1822 const FlatZincOptions& opt, Support::Timer& t_total) {
1823#ifdef GECODE_HAS_GIST
1827 (void)
GistEngine<Engine<FlatZincSpace> >::explore(
this,opt,&
pi,&pc);
1832 unsigned int n_p = 0;
1839 o.stop = Driver::CombinedStop::create(opt.node(), opt.fail(), opt.time(),
1844#ifdef GECODE_HAS_CPPROFILER
1846 if (opt.mode() == SM_CPPROFILER) {
1847 FlatZincGetInfo* getInfo =
nullptr;
1848 if (opt.profiler_info())
1849 getInfo =
new FlatZincGetInfo(p);
1850 o.tracer =
new CPProfilerSearchTracer(opt.profiler_id(),
1851 opt.name(), opt.profiler_port(),
1857#ifdef GECODE_HAS_FLOAT_VARS
1860 o.threads =
opt.threads();
1861 o.nogoods_limit =
opt.nogoods() ?
opt.nogoods_limit() : 0;
1862 o.cutoff =
new Search::CutoffAppend(
new Search::CutoffConstant(0), 1, Driver::createCutoff(opt));
1863 if (
opt.interrupt())
1864 Driver::CombinedStop::installCtrlHandler(
true);
1866 Meta<FlatZincSpace,Engine> se(
this,o);
1867 int noOfSolutions =
opt.solutions();
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;
1899 if (
opt.interrupt())
1900 Driver::CombinedStop::installCtrlHandler(
false);
1901 if (
opt.mode() == SM_STAT) {
1902 Gecode::Search::Statistics stat = se.statistics();
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
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();
1945 throw FlatZinc::Error(
"FlatZinc",
1946 "Error loading plugin "+pluginName.toStdString()+
1947 ": "+pl.errorString().toStdString());
1949 BranchPlugin* pb = qobject_cast<BranchPlugin*>(plugin_o);
1951 throw FlatZinc::Error(
"FlatZinc",
1952 "Error loading plugin "+pluginName.toStdString()+
1953 ": does not contain valid PluginBrancher");
1955 pb->branch(*
this,
c);
1960 FlatZincSpace::branchWithPlugin(
AST::Node*) {
1961 throw FlatZinc::Error(
"FlatZinc",
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);
1990#ifdef GECODE_HAS_FLOAT_VARS
2005 for (
unsigned int i=
iv_lns.size(); i--;) {
2015 for (
unsigned int i=
iv_lns.size(); i--;) {
2059 (void) s; (void) out;
2060#ifdef GECODE_HAS_GIST
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;
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()) {
2163 FlatZincSpaceInitData::IntSharedArraySet::iterator it =
_initData->intSharedArraySet.find(sia);
2164 if (it !=
_initData->intSharedArraySet.end()) {
2167 _initData->intSharedArraySet.insert(sia);
2178 for (
int i=a->a.
size(); i--;)
2179 ia[i+
offset] = a->a[i]->getBool();
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) {
2221 for (
int i=a->a.
size(); i--;) {
2229 if (a->a.
size() == 0) {
2235 ia[i] =
IntVar(*
this, 0, 0);
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();
2250 if (a->a.
size() == 0) {
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();
2264 }
else if (a->a[i]->isIntVar() &&
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()) {
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--;) {
2334 ia[i] =
SetVar(*
this, d, d);
2336 for (
int i=a->a.
size(); i--;) {
2342#ifdef GECODE_HAS_FLOAT_VARS
2349 for (
int i=a->a.
size(); i--;)
2350 fa[i+
offset] = a->a[i]->getFloat();
2356 if (a->a.
size() == 0) {
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);
2419 Printer::printElem(std::ostream& out,
2439 }
else if (bv[ai->
getBoolVar()].max() == 0) {
2442 out <<
"false..true";
2444#ifdef GECODE_HAS_SET_VARS
2450 SetVarGlbRanges svr(sv[ai->
getSetVar()]);
2455 int min = svr.min();
2456 int max = svr.max();
2459 SetVarGlbValues svv(sv[ai->
getSetVar()]);
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()) {
2495 AST::SetLit* s = ai->
getSet();
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,
2525 const Gecode::IntVarArray& iv1,
2526 const Gecode::IntVarArray& iv2,
2527 const Gecode::BoolVarArray& bv1,
2528 const Gecode::BoolVarArray& bv2
2530 ,
const Gecode::SetVarArray& sv1,
2531 const Gecode::SetVarArray& sv2
2534 ,
const Gecode::FloatVarArray& fv1,
2535 const Gecode::FloatVarArray& fv2
2538#ifdef GECODE_HAS_GIST
2539 using namespace Gecode::Gist;
2543 }
else if (ai->isIntVar()) {
2544 std::string res(Comparator::compare(
"",iv1[ai->getIntVar()],
2545 iv2[ai->getIntVar()]));
2546 if (res.length() > 0) {
2550 out << iv1[ai->getIntVar()];
2552 }
else if (ai->isBoolVar()) {
2553 std::string res(Comparator::compare(
"",bv1[ai->getBoolVar()],
2554 bv2[ai->getBoolVar()]));
2555 if (res.length() > 0) {
2559 out << bv1[ai->getBoolVar()];
2561#ifdef GECODE_HAS_SET_VARS
2562 }
else if (ai->isSetVar()) {
2563 std::string res(Comparator::compare(
"",sv1[ai->getSetVar()],
2564 sv2[ai->getSetVar()]));
2565 if (res.length() > 0) {
2569 out << sv1[ai->getSetVar()];
2572#ifdef GECODE_HAS_FLOAT_VARS
2573 }
else if (ai->isFloatVar()) {
2574 std::string res(Comparator::compare(
"",fv1[ai->getFloatVar()],
2575 fv2[ai->getFloatVar()]));
2576 if (res.length() > 0) {
2580 out << fv1[ai->getFloatVar()];
2583 }
else if (ai->isBool()) {
2584 out << (ai->getBool() ?
"true" :
"false");
2585 }
else if (ai->isSet()) {
2586 AST::SetLit* s = ai->getSet();
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 ?
", " :
"}");
2595 }
else if (ai->isString()) {
2596 std::string s = ai->getString();
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
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
2665 printElem(out,ai,iv,bv
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
2716 printElemDiff(out,ai,iv1,iv2,bv1,bv2
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,
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++) {
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 put(unsigned int i)
Add i to the contents.
int size(void) const
Return size of array (number of elements)
Depth-first branch-and-bound search engine.
Which values to select for assignment.
Which values to select for branching first.
Passing Boolean variables.
Boolean integer variables.
Base-class for branchers.
Brancher(Home home)
Constructor for creation.
Class to send solution information to CPProfiler.
Choice for performing commit
virtual void archive(Archive &e) const
Archive into e.
Deterministic finite automaton (DFA)
Depth-first search engine.
Exception: Base-class for exceptions
virtual const char * what(void) const
Return information.
Node representing an atom
Node representing a function call
Array * getArgs(unsigned int n)
A node in a FlatZinc abstract syntax tree.
bool isSetVar(void)
Test if node is a set variable node.
Array * getArray(void)
Cast this node to an array node.
bool isBool(void)
Test if node is a Boolean node.
bool isFloatVar(void)
Test if node is a float variable node.
bool isSet(void)
Test if node is a set literal node.
double getFloat(void)
Cast this node to a Float node.
int getFloatVar(void)
Cast this node to a Float variable node.
bool isArray(void)
Test if node is an array node.
SetLit * getSet(void)
Cast this node to a set literal node.
bool isString(void)
Test if node is a string node.
bool hasAtom(const std::string &id)
Test if node has atom with id.
bool isInt(int &i)
Test if node is int, if yes set i to the value.
int getInt(void)
Cast this node to an integer node.
bool isIntVar(void)
Test if node is an integer variable node.
int getIntVar(void)
Cast this node to an integer variable node.
bool isBoolVar(void)
Test if node is a Boolean variable node.
Call * getCall(void)
Return function call.
int getBoolVar(void)
Cast this node to a Boolean variable node.
virtual void print(std::ostream &)=0
Output string representation.
int getSetVar(void)
Cast this node to a set variable node.
bool getBool(void)
Cast this node to a Boolean node.
std::string getString(void)
Cast this node to a string node.
Exception signaling type error
Choice that only signals failure or success
bool fail
Whether brancher should fail.
virtual size_t size(void) const
Report size occupied.
Choice(const Brancher &b, bool fail0)
Initialize choice for brancher b.
virtual void archive(Archive &e) const
Archive into e.
virtual Choice * choice(const Space &, Archive &e)
Return choice.
FloatValBranch float_valsel
TieBreak< BoolVarBranch > bool_varsel
virtual void print(const Space &, const Gecode::Choice &c, unsigned int, std::ostream &o) const
Print explanation.
TieBreak< IntVarBranch > int_varsel
virtual bool status(const Space &_home) const
Check status of brancher, return true if alternatives left.
bool done
Flag whether brancher is done.
virtual Actor * copy(Space &home)
Copy brancher.
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.
TieBreak< FloatVarBranch > float_varsel
virtual Choice * choice(Space &home)
Return choice.
virtual ExecStatus commit(Space &, const Gecode::Choice &c, unsigned int)
Perform commit for choice c.
virtual size_t dispose(Space &)
Delete brancher and return its size.
BoolValBranch bool_valsel
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.
AuxVarBrancher(Space &home, AuxVarBrancher &b)
Copy constructor.
Specification for Boolean variables.
Option< AST::SetLit * > domain
Abstract representation of a constraint.
Exception class for FlatZinc errors
virtual void compare(const Space &s0, const Space &s1)
Use the compare method of the template class S to compare two spaces.
FZPrintingComparator(const Printer &p0)
Constructor.
An inspector for printing simple text output.
virtual void finalize(void)
Finalize when Gist exits.
FZPrintingInspector(const Printer &p0)
Constructor.
virtual void inspect(const Space &node)
Use the print method of the template class S to print a space.
FlatZincGetInfo(const Printer &printer)
virtual std::string getInfo(const Space &space) const
Return info for a space.
Options for running FlatZinc models
std::unordered_set< TupleSet > TupleSetSet
Hash table of tuple sets.
DFASet dfaSet
Hash table of DFAs.
std::unordered_set< DFA > DFASet
Hash table of DFAs.
FlatZincSpaceInitData(void)
Initialize.
IntSharedArraySet intSharedArraySet
Hash table of shared integer arrays.
TupleSetSet tupleSetSet
Hash table of tuple sets.
std::unordered_set< SharedArray< int > > IntSharedArraySet
Hash table of shared integer arrays.
A space that can be initialized with a FlatZinc model.
void createBranchers(Printer &p, AST::Node *ann, FlatZincOptions &opt, bool ignoreUnknown, std::ostream &err=std::cerr)
Create branchers corresponding to the solve item annotations.
Gecode::IntVarArray iv_lns
The integer variables used in LNS.
void shrinkArrays(Printer &p)
Remove all variables not needed for output.
unsigned int _lns
Percentage of variables to keep in LNS (or 0 for no LNS)
void maximize(int var, bool isInt, AST::Array *annotation)
Post that integer variable var should be maximized.
IntVarArgs arg2intvarargs(AST::Node *arg, int offset=0)
Convert arg to IntVarArgs.
Gecode::FloatVarArray fv
The float variables.
Rnd _random
Random number generator.
void newBoolVar(BoolVarSpec *vs)
Create new Boolean variable from specification.
FloatVar arg2FloatVar(AST::Node *n)
Convert n to FloatVar.
void print(std::ostream &out, const Printer &p) const
Produce output on out using p.
std::vector< bool > fv_introduced
Indicates whether a float variable is introduced by mzn2fzn.
AST::Array * _solveAnnotations
Annotations on the solve item.
int _optVar
Index of the variable to optimize.
BranchInformation branchInfo
Information for printing branches.
void run(std::ostream &out, const Printer &p, const FlatZincOptions &opt, Gecode::Support::Timer &t_total)
Run the search.
DFA getSharedDFA(DFA &a)
Share DFA a if possible.
void newFloatVar(FloatVarSpec *vs)
Create new float variable from specification.
SetVar arg2SetVar(AST::Node *n)
Convert n to SetVar.
int * iv_boolalias
Indicates whether an integer variable aliases a Boolean variable.
virtual bool slave(const MetaInfo &mi)
Slave function for restarts.
void postConstraints(std::vector< ConExpr * > &ces)
Post a constraint specified by ce.
SetVarArgs arg2setvarargs(AST::Node *arg, int offset=0, int doffset=0, const IntSet &od=IntSet::empty)
Convert n to SetVarArgs.
bool _optVarIsInt
Whether variable to optimize is integer (or float)
FlatZincSpace(FlatZincSpace &)
Copy constructor.
Gecode::BoolVarArray bv
The Boolean variables.
void newSetVar(SetVarSpec *vs)
Create new set variable from specification.
bool optVarIsInt(void) const
Return whether variable used for optimization is integer (or float)
std::vector< bool > iv_introduced
Indicates whether an integer variable is introduced by mzn2fzn.
IntVar arg2IntVar(AST::Node *n)
Convert n to IntVar.
std::string getDomains(const Printer &p) const
Get string representing the domains of variables (for cpprofiler)
FlatZincSpaceInitData * _initData
Initialisation data (only used for posting constraints)
Meth method(void) const
Return whether to solve a satisfaction or optimization problem.
std::vector< bool > sv_introduced
Indicates whether a set variable is introduced by mzn2fzn.
IntSet arg2intset(AST::Node *n)
Convert n to IntSet.
std::vector< bool > bv_introduced
Indicates whether a Boolean variable is introduced by mzn2fzn.
Gecode::FloatVarArray fv_aux
The introduced float variables.
void minimize(int var, bool isInt, AST::Array *annotation)
Post that integer variable var should be minimized.
virtual void constrain(const Space &s)
Implement optimization.
IntArgs arg2boolargs(AST::Node *arg, int offset=0)
Convert arg (array of Booleans) to IntArgs.
Gecode::SetVarArray sv_aux
The introduced set variables.
int floatVarCount
Number of float variables.
int boolVarCount
Number of Boolean variables.
Gecode::SetVarArray sv
The set variables.
int setVarCount
Number of set variables.
~FlatZincSpace(void)
Destructor.
int optVar(void) const
Return index of variable used for optimization.
FloatVarArgs arg2floatvarargs(AST::Node *arg, int offset=0)
Convert n to FloatVarArgs.
IntSharedArray arg2boolsharedarray(AST::Node *arg, int offset=0)
Convert arg (array of integers) to IntSharedArray.
void solve(AST::Array *annotation)
Post the solve item.
Gecode::FloatNum step
Step by which a next solution has to have lower cost.
IntSharedArray _lnsInitialSolution
Initial solution to start the LNS (or NULL for no LNS)
Gecode::BoolVarArray bv_aux
The introduced Boolean variables.
IntSharedArray arg2intsharedarray(AST::Node *arg, int offset=0)
Convert arg (array of integers) to IntSharedArray.
BoolVarArgs arg2boolvarargs(AST::Node *arg, int offset=0, int siv=-1)
Convert arg to BoolVarArgs.
void aliasBool2Int(int iv, int bv)
Link integer variable iv to Boolean variable bv.
AST::Array * solveAnnotations(void) const
Return the solve item annotations.
Gecode::IntVarArray iv_aux
The introduced integer variables.
Gecode::IntVarArray iv
The integer variables.
virtual Gecode::Space * copy(void)
Copy function.
void init(int intVars, int boolVars, int setVars, int floatVars)
Initialize space with given number of variables.
bool isBoolArray(AST::Node *b, int &singleInt)
Check if b is array of Booleans (or has a single integer)
IntPropLevel ann2ipl(AST::Node *ann)
Convert ann to integer propagation level.
void newIntVar(IntVarSpec *vs)
Create new integer variable from specification.
Meth _method
Whether to solve as satisfaction or optimization problem.
void compare(const Space &s, std::ostream &out) const
Compare this space with space s and print the differences on out.
int intVarCount
Number of integer variables.
BoolVar arg2BoolVar(AST::Node *n)
Convert n to BoolVar.
TupleSet arg2tupleset(const IntArgs &a, int noOfVars)
Convert a to TupleSet.
IntSetArgs arg2intsetargs(AST::Node *arg, int offset=0)
Convert arg to IntSetArgs.
FloatValArgs arg2floatargs(AST::Node *arg, int offset=0)
Convert n to FloatValArgs.
bool needAuxVars
Whether the introduced variables still need to be copied.
IntArgs arg2intargs(AST::Node *arg, int offset=0)
Convert arg (array of integers) to IntArgs.
Specification for floating point variables.
Option< std::pair< double, double > > domain
static void explore(S *root, const FlatZincOptions &opt, Gist::Inspector *i, Gist::Comparator *c)
static void explore(S *root, const FlatZincOptions &opt, Gist::Inspector *i, Gist::Comparator *c)
Traits class for search engines.
Which integer or Boolean variable to select for branching.
Specification for integer variables.
Option< AST::SetLit * > domain
Output support class for FlatZinc interpreter.
void addFloatVarName(const std::string &n)
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
void addSetVarName(const std::string &n)
void init(AST::Array *output)
void print(std::ostream &out, const Gecode::IntVarArray &iv, const Gecode::BoolVarArray &bv, const Gecode::SetVarArray &sv, const Gecode::FloatVarArray &fv) const
void shrinkArrays(Space &home, int &optVar, bool optVarIsInt, Gecode::IntVarArray &iv, Gecode::BoolVarArray &bv, Gecode::SetVarArray &sv, Gecode::FloatVarArray &fv)
void addIntVarName(const std::string &n)
void addBoolVarName(const std::string &n)
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)
void post(FlatZincSpace &s, const ConExpr &ce)
Post constraint specified by ce.
Specification for set variables.
Option< AST::SetLit * > upperBound
bool introduced
Whether the variable was introduced in the mzn2fzn translation.
bool assigned
Whether the variable is assigned.
bool alias
Whether the variable aliases another variable.
bool funcDep
Whether the variable functionally depends on another variable.
Value description class for branching.
bool l
Whether to try the lower or upper half first.
FloatNum n
The middle value for branching.
Which values to select for branching first.
FloatNum size(void) const
Return size of float value (distance between maximum and minimum)
Float view for float variables.
Abstract base class for comparators.
virtual void compare(const Space &s0, const Space &s1)=0
Call-back function.
Abstract base class for inspectors.
void click(Inspector *i)
Add inspector that reacts on node double clicks.
void compare(Comparator *c)
Add comparator.
class Gecode::Gist::Options::_I inspect
An window for simple text output.
void finalize(void)
Clean up when Gist exits.
TextOutput(const std::string &name)
Constructor.
std::ostream & getStream(void)
Get the stream that is used to output text.
void init(void)
Initialize the implementation object.
VarComparator(std::string name)
Constructor.
unsigned int id(void) const
Return a unique id for the group.
Home class for posting propagators
Passing integer arguments.
Which values to select for assignment.
static const IntSet empty
Empty set.
Which values to select for branching first.
Passing integer variables.
Integer view for integer variables.
Range iterator for integer views.
static PropagatorGroup all
Group of all propagators.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
unsigned int c_d
Create a clone after every c_d commits (commit distance)
unsigned int a_d
Create a clone during recomputation if distance is greater than a_d (adaptive distance)
unsigned long int restart
Number of restarts.
unsigned long int depth
Maximum depth of search stack.
unsigned long int fail
Number of failed nodes in search tree.
unsigned long int node
Number of nodes expanded.
Which values to select for branching first.
Which variable to select for branching.
Shared array with arbitrary number of elements.
SharedHandle(void)
Create shared handle with no object pointing to.
SharedHandle::Object * object(void) const
Access to the shared object.
struct Gecode::Space::@055132133326276162005044145100211202071356247106::@275070317317120154232063063134255170030071110047 p
Data only available during propagation or branching.
struct Gecode::Space::@055132133326276162005044145100211202071356247106::@155123175027073262103111264343315000271204104107 c
Data available only during copying.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
friend class BrancherGroup
Statistics for execution of status
unsigned long int propagate
Number of propagator executions.
double stop(void)
Get time since start of timer.
void start(void)
Start timer.
Combine variable selection criteria for tie-breaking.
Class represeting a set of tuples.
TupleSet & add(const IntArgs &t)
Add tuple t to tuple set.
void finalize(void)
Finalize tuple set.
bool assigned(void) const
Test if all variables are assigned.
int size(void) const
Return size of array (number of elements)
Base class for variables.
unsigned int seed
The random seed to be used.
Heap heap
The single global heap.
int offset(void) const
Integer-precision integer scale view.
View & operator()(View &x)
Integer-precision integer scale view.
void fail(void)
Fail space.
@ SM_GIST
Run script in Gist.
@ RM_CONSTANT
Restart with constant sequence.
@ RM_LINEAR
Restart with linear sequence.
@ RM_LUBY
Restart with Luby sequence.
@ RM_GEOMETRIC
Restart with geometric sequence.
int bab(Space *root, const Gist::Options &opt=Gist::Options::def)
Create a new stand-alone Gist for branch-and-bound search of root.
int dfs(Space *root, const Gist::Options &opt=Gist::Options::def)
Create a new stand-alone Gist for root.
void assign(Home home, const FloatVarArgs &x, FloatVarBranch vars, FloatAssign vals, FloatBranchFilter bf=nullptr, FloatVarValPrint vvp=nullptr)
Assign all x with variable selection vars and value selection vals.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
double FloatNum
Floating point number base type.
IntPropLevel
Propagation levels for integer propagators.
@ IPL_DOM
Domain propagation Options: basic versus advanced propagation.
@ IPL_VAL
Value propagation.
@ IPL_DEF
Simple propagation levels.
@ IPL_BND
Bounds propagation.
Space(void)
Default constructor.
Space * clone(CloneStatistics &stat=unused_clone) const
Clone space.
@ SS_FAILED
Space is failed
Interpreter for the FlatZinc language.
void printIntVar(std::ostream &os, const std::string name, const Int::IntView &x)
Registry & registry(void)
Return global registry object.
void varValPrintF(const Space &home, const Brancher &b, unsigned int a, FloatVar, int i, const FloatNumBranch &nl, std::ostream &o)
TieBreak< IntVarBranch > ann2ivarsel(AST::Node *ann, Rnd rnd, double decay)
void varValPrint(const Space &home, const Brancher &b, unsigned int a, Var, int i, const int &n, std::ostream &o)
BoolAssign ann2asnbvalsel(AST::Node *ann, Rnd rnd)
TieBreak< BoolVarBranch > ann2bvarsel(AST::Node *ann, Rnd rnd, double decay)
void printFloatVar(std::ostream &os, const std::string name, const Float::FloatView &f)
void printBoolVar(std::ostream &os, const std::string name, const BoolVar &b)
TieBreak< FloatVarBranch > ann2fvarsel(AST::Node *ann, Rnd rnd, double decay)
BoolValBranch ann2bvalsel(AST::Node *ann, std::string &r0, std::string &r1, Rnd rnd)
IntSet vs2is(IntVarSpec *vs)
FloatValBranch ann2fvalsel(AST::Node *ann, std::string r0, std::string r1)
int vs2bsl(BoolVarSpec *bs)
IntValBranch ann2ivalsel(AST::Node *ann, std::string &r0, std::string &r1, Rnd rnd)
IntBoolVarBranch INTBOOL_VAR_AFC_SIZE_MAX(double d=1.0)
Select variable with largest accumulated failure count divided by domain size.
GECODE_FLATZINC_EXPORT Rnd defrnd
Uninitialized default random number generator.
void branch(Home home, const IntVarArgs &x, const BoolVarArgs &y, IntBoolVarBranch vars, IntValBranch vals)
Branch function for integer and Boolean variables.
SetVarBranch ann2svarsel(AST::Node *ann, Rnd rnd, double decay)
SetValBranch ann2svalsel(AST::Node *ann, std::string r0, std::string r1, Rnd rnd)
int vs2bsh(BoolVarSpec *bs)
IntAssign ann2asnivalsel(AST::Node *ann, Rnd rnd)
void flattenAnnotations(AST::Array *ann, std::vector< AST::Node * > &out)
const FloatNum max
Largest allowed float value.
const FloatNum min
Smallest allowed float value.
The Gecode Interactive Search Tool.
const int min
Smallest allowed integer value.
const int max
Largest allowed integer value.
const int min
Smallest allowed integer in integer set.
const int max
Largest allowed integer in integer set.
void print(std::basic_ostream< Char, Traits > &s, bool assigned, IL &lb, IU &ub, unsigned int cardMin, unsigned int cardMax)
Print set view.
Gecode toplevel namespace
FloatVarBranch FLOAT_VAR_RND(Rnd r)
Select random variable (uniform distribution, for tie breaking)
FloatValBranch FLOAT_VAL_SPLIT_MAX(void)
Select values greater than mean of smallest and largest value.
ArgArray< IntSet > IntSetArgs
Passing set arguments.
Select variable with smallest action divided by domain size with decay factor a d SetVarBranch SET_VAR_ACTION_SIZE_MIN(double d=1.0, BranchTbl tbl=nullptr)
IntAssign INT_ASSIGN_RND(Rnd r)
Select random value.
Select variable with largest action divided by domain size with decay factor a d SetVarBranch SET_VAR_ACTION_SIZE_MAX(double d=1.0, BranchTbl tbl=nullptr)
IntValBranch INT_VAL_SPLIT_MIN(void)
Select values not greater than mean of smallest and largest value.
FloatVarBranch FLOAT_VAR_AFC_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with smallest accumulated failure count with decay factor d.
BoolAssign BOOL_ASSIGN_MAX(void)
Select largest value.
Post propagator for SetVar SetOpType SetVar SetRelType r
FloatVarBranch FLOAT_VAR_SIZE_MAX(BranchTbl tbl=nullptr)
Select variable with largest domain size.
IntVarBranch INT_VAR_AFC_SIZE_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest accumulated failure count divided by domain size with decay factor d.
FloatVarBranch FLOAT_VAR_MAX_MAX(BranchTbl tbl=nullptr)
Select variable with largest max.
Select first unassigned variable SetVarBranch SET_VAR_NONE(void)
IntVarBranch INT_VAR_DEGREE_MAX(BranchTbl tbl=nullptr)
Select variable with largest degree.
IntVarBranch INT_VAR_ACTION_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with highest action with decay factor d.
FloatVarBranch FLOAT_VAR_AFC_SIZE_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with smalllest accumulated failure count divided by domain size with decay factor d.
SharedArray< int > IntSharedArray
Arrays of integers that can be shared among several element constraints.
IntValBranch INT_VAL_MED(void)
Select greatest value not greater than the median.
IntVarBranch INT_VAR_REGRET_MIN_MAX(BranchTbl tbl=nullptr)
Select variable with largest min-regret.
IntVarBranch INT_VAR_ACTION_SIZE_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest action divided by domain size with decay factor d.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
BoolValBranch BOOL_VAL_MIN(void)
Select smallest value.
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
BoolVarBranch BOOL_VAR_NONE(void)
Select first unassigned variable.
IntVarBranch INT_VAR_AFC_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest accumulated failure count with decay factor d.
IntVarBranch INT_VAR_AFC_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with smallest accumulated failure count with decay factor d.
IntValBranch INT_VALUES_MIN(void)
Try all values starting from smallest.
Select variable with smallest unknown set SetVarBranch SET_VAR_SIZE_MIN(BranchTbl tbl=nullptr)
SetVarBranch SET_VAR_RND(Rnd r)
void cmb_hash(std::size_t &seed, const T h)
Combine hash value h into seed.
Select variable with largest maximum unknown element SetVarBranch SET_VAR_MAX_MAX(BranchTbl tbl=nullptr)
IntValBranch INT_VAL_MAX(void)
Select largest value.
FloatVarBranch FLOAT_VAR_ACTION_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with highest action with decay factor d.
BoolValBranch BOOL_VAL_MAX(void)
Select largest value.
BoolVarBranch BOOL_VAR_RND(Rnd r)
Select random variable (uniform distribution, for tie breaking)
BoolVarBranch BOOL_VAR_ACTION_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with lowest action with decay factor d.
Select variable with largest accumulated failure count with decay factor a d SetVarBranch SET_VAR_AFC_MAX(double d=1.0, BranchTbl tbl=nullptr)
FloatVarBranch FLOAT_VAR_MIN_MIN(BranchTbl tbl=nullptr)
Select variable with smallest min.
Select variable with smallest minimum unknown element SetVarBranch SET_VAR_MIN_MIN(BranchTbl tbl=nullptr)
FloatVarBranch FLOAT_VAR_ACTION_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with lowest action with decay factor d.
Include largest element SetValBranch SET_VAL_MAX_INC(void)
BoolAssign BOOL_ASSIGN_RND(Rnd r)
Select random value.
IntValBranch INT_VAL_SPLIT_MAX(void)
Select values greater than mean of smallest and largest value.
IntValBranch INT_VAL_MIN(void)
Select smallest value.
IntAssign INT_ASSIGN_MED(void)
Select greatest value not greater than the median.
Select variable with smallest accumulated failure count with decay factor a d SetVarBranch SET_VAR_AFC_MIN(double d=1.0, BranchTbl tbl=nullptr)
BoolVarBranch BOOL_VAR_AFC_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with smallest accumulated failure count with decay factor d.
T * dfs(T *s, const Search::Options &o=Search::Options::def)
Invoke depth-first search engine for subclass T of space s with options o.
BoolVarBranch BOOL_VAR_AFC_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest accumulated failure count with decay factor d.
FloatVarBranch FLOAT_VAR_NONE(void)
Select first unassigned variable.
IntVarBranch INT_VAR_MAX_MAX(BranchTbl tbl=nullptr)
Select variable with largest max.
IntAssign INT_ASSIGN_MIN(void)
Select smallest value.
IntVarBranch INT_VAR_ACTION_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with lowest action with decay factor d.
IntVarBranch INT_VAR_RND(Rnd r)
Select random variable (uniform distribution, for tie breaking)
IntVarBranch INT_VAR_AFC_SIZE_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with smallest accumulated failure count divided by domain size with decay factor d.
Include smallest element SetValBranch SET_VAL_MIN_INC(void)
@ ES_OK
Execution is okay.
@ ES_FAILED
Execution has resulted in failure.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
FloatVarBranch FLOAT_VAR_DEGREE_MAX(BranchTbl tbl=nullptr)
Select variable with largest degree.
Select variable with smallest accumulated failure count divided by domain size with decay factor a d SetVarBranch SET_VAR_AFC_SIZE_MIN(double d=1.0, BranchTbl tbl=nullptr)
Exclude largest element SetValBranch SET_VAL_MAX_EXC(void)
FloatVarBranch FLOAT_VAR_ACTION_SIZE_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest action divided by domain size with decay factor d.
BoolValBranch BOOL_VAL_RND(Rnd r)
Select random value.
Select variable with largest accumulated failure count divided by domain size with decay factor a d SetVarBranch SET_VAR_AFC_SIZE_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with lowest action with decay factor a d SetVarBranch SET_VAR_ACTION_MIN(double d=1.0, BranchTbl tbl=nullptr)
IntVarBranch INT_VAR_SIZE_MIN(BranchTbl tbl=nullptr)
Select variable with smallest domain size.
BoolVarBranch BOOL_VAR_DEGREE_MAX(BranchTbl tbl=nullptr)
Select variable with largest degree.
FloatVarBranch FLOAT_VAR_AFC_SIZE_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest accumulated failure count divided by domain size with decay factor d.
IntVarBranch INT_VAR_ACTION_SIZE_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with smallest action divided by domain size with decay factor d.
Post propagator for SetVar x
BoolVarBranch BOOL_VAR_ACTION_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with highest action with decay factor d.
BoolAssign BOOL_ASSIGN_MIN(void)
Select smallest value.
FloatValBranch FLOAT_VAL_SPLIT_MIN(void)
Select values not greater than mean of smallest and largest value.
IntAssign INT_ASSIGN_MAX(void)
Select largest value.
FloatVarBranch FLOAT_VAR_SIZE_MIN(BranchTbl tbl=nullptr)
Select variable with smallest domain size.
IntVarBranch INT_VAR_MIN_MIN(BranchTbl tbl=nullptr)
Select variable with smallest min.
FloatVarBranch FLOAT_VAR_AFC_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest accumulated failure count with decay factor d.
Exclude smallest element SetValBranch SET_VAL_MIN_EXC(void)
IntVarBranch INT_VAR_SIZE_MAX(BranchTbl tbl=nullptr)
Select variable with largest domain size.
Select variable with largest unknown set SetVarBranch SET_VAR_SIZE_MAX(BranchTbl tbl=nullptr)
IntValBranch INT_VAL_RND(Rnd r)
Select random value.
Select variable with highest action with decay factor a d SetVarBranch SET_VAR_ACTION_MAX(double d=1.0, BranchTbl tbl=nullptr)
FloatVarBranch FLOAT_VAR_ACTION_SIZE_MIN(double d=1.0, BranchTbl tbl=nullptr)
Select variable with smallest action divided by domain size with decay factor d.
const Gecode::FloatNum step
Gecode::IntArgs i({1, 2, 3, 4})
const Val & some(void) const
size_t operator()(const Gecode::DFA &d) const
Return hash key for d.
size_t operator()(const Gecode::SharedArray< int > &x) const
Return hash key for x.
size_t operator()(const Gecode::TupleSet &x) const
Return hash key for x.
#define GECODE_HAS_FLOAT_VARS
#define GECODE_HAS_SET_VARS