54 namespace Gecode {
namespace FlatZinc {
89 int_varsel(int_varsel0), int_valsel(int_valsel0),
90 bool_varsel(bool_varsel0), bool_valsel(bool_valsel0)
91 #ifdef GECODE_HAS_SET_VARS
92 , set_varsel(set_varsel0), set_valsel(set_valsel0)
94 #ifdef GECODE_HAS_FLOAT_VARS
95 , float_varsel(float_varsel0), float_valsel(float_valsel0)
100 :
Brancher(home, share, b), done(b.done) {}
109 : Gecode::
Choice(b,1), fail(fail0) {}
111 virtual size_t size(
void)
const {
125 #ifdef GECODE_HAS_SET_VARS
129 #ifdef GECODE_HAS_FLOAT_VARS
137 if (done)
return false;
143 #ifdef GECODE_HAS_SET_VARS
147 #ifdef GECODE_HAS_FLOAT_VARS
161 #ifdef GECODE_HAS_SET_VARS
164 #ifdef GECODE_HAS_FLOAT_VARS
171 return new Choice(*
this,
false);
173 return new Choice(*
this,
true);
178 bool fail; e >> fail;
179 return new Choice(*
this, fail);
188 std::ostream& o)
const {
190 << (
static_cast<const Choice&
>(
c).fail ?
"fail" :
"ok")
215 bool_varsel, bool_valsel
216 #ifdef GECODE_HAS_SET_VARS
217 , set_varsel, set_valsel
219 #ifdef GECODE_HAS_FLOAT_VARS
220 , float_varsel, float_valsel
226 return sizeof(*this);
236 BI(
void) : r0(
""), r1(
""),
n(0) {}
237 BI(
const string& r00,
const string& r10,
const vector<string>& n0)
238 : r0(r00), r1(r10),
n(n0) {}
252 const vector<string>&
n) {
253 v.resize(
std::max(static_cast<unsigned int>(
v.size()),bh.
id()+1));
254 v[bh.
id()] = BI(rel0,rel1,n);
258 int a,
int i,
int n, ostream& o)
const {
259 const BI&
bi =
v[bh.
id()];
260 o << bi.n[
i] <<
" " << (a==0 ? bi.r0 : bi.r1) <<
" " << n;
262 #ifdef GECODE_HAS_FLOAT_VARS
265 const BI&
bi =
v[bh.
id()];
267 << (((a == 0) == nl.
l) ?
"<=" :
">=") << nl.
n;
272 BranchInformation::BranchInformation(
void)
280 assert(
object() ==
false);
286 const std::string& rel0,
287 const std::string& rel1,
288 const std::vector<std::string>&
n) {
293 int n, std::ostream& o)
const {
296 #ifdef GECODE_HAS_FLOAT_VARS
306 Var,
int i,
const int&
n,
311 #ifdef GECODE_HAS_FLOAT_VARS
329 int* newdom =
heap.
alloc<
int>(
static_cast<unsigned long int>(sl->
s.size()));
330 for (
int i=sl->
s.size();
i--;)
331 newdom[
i] = sl->
s[
i];
332 IntSet ret(newdom, sl->
s.size());
333 heap.
free(newdom, static_cast<unsigned long int>(sl->
s.size()));
365 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
366 if (s->id ==
"input_order")
368 if (s->id ==
"first_fail")
370 if (s->id ==
"anti_first_fail")
372 if (s->id ==
"smallest")
374 if (s->id ==
"largest")
376 if (s->id ==
"occurrence")
378 if (s->id ==
"max_regret")
380 if (s->id ==
"most_constrained")
383 if (s->id ==
"random") {
386 if (s->id ==
"afc_min")
388 if (s->id ==
"afc_max")
390 if (s->id ==
"afc_size_min")
392 if (s->id ==
"afc_size_max") {
395 if (s->id ==
"activity_min")
397 if (s->id ==
"activity_max")
399 if (s->id ==
"activity_size_min")
401 if (s->id ==
"activity_size_max")
404 std::cerr <<
"Warning, ignored search annotation: ";
405 ann->
print(std::cerr);
406 std::cerr << std::endl;
412 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
413 if (s->id ==
"indomain_min") {
417 if (s->id ==
"indomain_max") {
421 if (s->id ==
"indomain_median") {
425 if (s->id ==
"indomain_split") {
429 if (s->id ==
"indomain_reverse_split") {
433 if (s->id ==
"indomain_random") {
437 if (s->id ==
"indomain") {
441 if (s->id ==
"indomain_middle") {
442 std::cerr <<
"Warning, replacing unsupported annotation "
443 <<
"indomain_middle with indomain_median" << std::endl;
447 if (s->id ==
"indomain_interval") {
448 std::cerr <<
"Warning, replacing unsupported annotation "
449 <<
"indomain_interval with indomain_split" << std::endl;
454 std::cerr <<
"Warning, ignored search annotation: ";
455 ann->
print(std::cerr);
456 std::cerr << std::endl;
462 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
463 if (s->id ==
"indomain_min")
465 if (s->id ==
"indomain_max")
467 if (s->id ==
"indomain_median")
469 if (s->id ==
"indomain_random") {
473 std::cerr <<
"Warning, ignored search annotation: ";
474 ann->
print(std::cerr);
475 std::cerr << std::endl;
479 #ifdef GECODE_HAS_SET_VARS
481 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
482 if (s->id ==
"input_order")
484 if (s->id ==
"first_fail")
486 if (s->id ==
"anti_first_fail")
488 if (s->id ==
"smallest")
490 if (s->id ==
"largest")
492 if (s->id ==
"afc_min")
494 if (s->id ==
"afc_max")
496 if (s->id ==
"afc_size_min")
498 if (s->id ==
"afc_size_max")
500 if (s->id ==
"activity_min")
502 if (s->id ==
"activity_max")
504 if (s->id ==
"activity_size_min")
506 if (s->id ==
"activity_size_max")
508 if (s->id ==
"random") {
512 std::cerr <<
"Warning, ignored search annotation: ";
513 ann->
print(std::cerr);
514 std::cerr << std::endl;
521 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
522 if (s->id ==
"indomain_min") {
523 r0 =
"in"; r1 =
"not in";
526 if (s->id ==
"indomain_max") {
527 r0 =
"in"; r1 =
"not in";
530 if (s->id ==
"outdomain_min") {
531 r1 =
"in"; r0 =
"not in";
534 if (s->id ==
"outdomain_max") {
535 r1 =
"in"; r0 =
"not in";
539 std::cerr <<
"Warning, ignored search annotation: ";
540 ann->
print(std::cerr);
541 std::cerr << std::endl;
542 r0 =
"in"; r1 =
"not in";
547 #ifdef GECODE_HAS_FLOAT_VARS
550 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
551 if (s->id ==
"input_order")
553 if (s->id ==
"first_fail")
555 if (s->id ==
"anti_first_fail")
557 if (s->id ==
"smallest")
559 if (s->id ==
"largest")
561 if (s->id ==
"occurrence")
563 if (s->id ==
"most_constrained")
566 if (s->id ==
"random") {
569 if (s->id ==
"afc_min")
571 if (s->id ==
"afc_max")
573 if (s->id ==
"afc_size_min")
575 if (s->id ==
"afc_size_max")
577 if (s->id ==
"activity_min")
579 if (s->id ==
"activity_max")
581 if (s->id ==
"activity_size_min")
583 if (s->id ==
"activity_size_max")
586 std::cerr <<
"Warning, ignored search annotation: ";
587 ann->
print(std::cerr);
588 std::cerr << std::endl;
593 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
594 if (s->id ==
"indomain_split") {
598 if (s->id ==
"indomain_reverse_split") {
603 std::cerr <<
"Warning, ignored search annotation: ";
604 ann->
print(std::cerr);
605 std::cerr << std::endl;
613 :
Space(share, f), _solveAnnotations(NULL), iv_boolalias(NULL),
614 needAuxVars(f.needAuxVars) {
627 iva[iva.
size()-1].update(*
this, share, f.
iv_aux[
i]);
640 bva[bva.
size()-1].update(*
this, share, f.
bv_aux[
i]);
646 #ifdef GECODE_HAS_SET_VARS
654 sva[sva.
size()-1].update(*
this, share, f.
sv_aux[
i]);
660 #ifdef GECODE_HAS_FLOAT_VARS
668 fva[fva.
size()-1].update(*
this, share, f.
fv_aux[
i]);
677 : intVarCount(-1), boolVarCount(-1), floatVarCount(-1), setVarCount(-1),
678 _optVar(-1), _optVarIsInt(true),
679 _solveAnnotations(NULL), needAuxVars(true) {
685 int setVars,
int floatVars) {
696 #ifdef GECODE_HAS_SET_VARS
701 #ifdef GECODE_HAS_FLOAT_VARS
746 #ifdef GECODE_HAS_SET_VARS
758 int* is =
heap.
alloc<
int>(
static_cast<unsigned long int>(vsv->s.size()));
759 for (
int i=vsv->s.
size();
i--; )
762 heap.
free(is,static_cast<unsigned long int>(vsv->s.size()));
771 int* is =
heap.
alloc<
int>(
static_cast<unsigned long int>(vsv->
s.size()));
772 for (
int i=vsv->
s.size();
i--; )
775 heap.
free(is,static_cast<unsigned long int>(vsv->
s.size()));
793 #ifdef GECODE_HAS_FLOAT_VARS
835 for (
unsigned int i=0;
i<ann->
a.size();
i++) {
836 if (ann->
a[
i]->isCall(
"seq_search")) {
841 out.push_back(c->
args);
843 out.push_back(ann->
a[
i]);
852 Rnd rnd(static_cast<unsigned int>(seed));
857 #ifdef GECODE_HAS_SET_VARS
861 #ifdef GECODE_HAS_FLOAT_VARS
866 std::vector<bool> iv_searched(
iv.
size());
867 for (
unsigned int i=
iv.
size();
i--;)
868 iv_searched[
i] =
false;
869 std::vector<bool> bv_searched(
bv.
size());
870 for (
unsigned int i=
bv.
size();
i--;)
871 bv_searched[
i] =
false;
872 #ifdef GECODE_HAS_SET_VARS
873 std::vector<bool> sv_searched(
sv.
size());
874 for (
unsigned int i=
sv.
size();
i--;)
875 sv_searched[
i] =
false;
877 #ifdef GECODE_HAS_FLOAT_VARS
878 std::vector<bool> fv_searched(
fv.
size());
879 for (
unsigned int i=
fv.
size();
i--;)
880 fv_searched[
i] =
false;
884 std::vector<AST::Node*> flatAnn;
888 flatAnn.push_back(ann);
891 for (
unsigned int i=0;
i<flatAnn.
size();
i++) {
892 if (flatAnn[
i]->isCall(
"gecode_search")) {
894 branchWithPlugin(c->
args);
895 }
else if (flatAnn[
i]->isCall(
"int_search")) {
899 int k=vars->
a.size();
900 for (
int i=vars->
a.size();
i--;)
901 if (vars->
a[
i]->isInt())
904 vector<string> names;
906 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
907 if (vars->
a[
i]->isInt())
909 va[k++] =
iv[vars->
a[
i]->getIntVar()];
910 iv_searched[vars->
a[
i]->getIntVar()] =
true;
911 names.push_back(vars->
a[
i]->getVarName());
918 &varValPrint<IntVar>);
920 }
else if (flatAnn[
i]->isCall(
"int_assign")) {
924 int k=vars->
a.size();
925 for (
int i=vars->
a.size();
i--;)
926 if (vars->
a[
i]->isInt())
930 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
931 if (vars->
a[
i]->isInt())
933 va[k++] =
iv[vars->
a[
i]->getIntVar()];
934 iv_searched[vars->
a[
i]->getIntVar()] =
true;
937 &varValPrint<IntVar>);
938 }
else if (flatAnn[
i]->isCall(
"bool_search")) {
942 int k=vars->
a.size();
943 for (
int i=vars->
a.size();
i--;)
944 if (vars->
a[
i]->isBool())
948 vector<string> names;
949 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
950 if (vars->
a[
i]->isBool())
952 va[k++] =
bv[vars->
a[
i]->getBoolVar()];
953 bv_searched[vars->
a[
i]->getBoolVar()] =
true;
954 names.push_back(vars->
a[
i]->getVarName());
961 &varValPrint<BoolVar>);
963 }
else if (flatAnn[
i]->isCall(
"int_default_search")) {
969 }
else if (flatAnn[
i]->isCall(
"bool_default_search")) {
975 }
else if (flatAnn[
i]->isCall(
"set_search")) {
976 #ifdef GECODE_HAS_SET_VARS
980 int k=vars->
a.size();
981 for (
int i=vars->
a.size();
i--;)
982 if (vars->
a[
i]->isSet())
986 vector<string> names;
987 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
988 if (vars->
a[
i]->isSet())
990 va[k++] =
sv[vars->
a[
i]->getSetVar()];
991 sv_searched[vars->
a[
i]->getSetVar()] =
true;
992 names.push_back(vars->
a[
i]->getVarName());
999 &varValPrint<SetVar>);
1002 if (!ignoreUnknown) {
1003 err <<
"Warning, ignored search annotation: ";
1004 flatAnn[
i]->print(err);
1008 }
else if (flatAnn[
i]->isCall(
"set_default_search")) {
1009 #ifdef GECODE_HAS_SET_VARS
1016 if (!ignoreUnknown) {
1017 err <<
"Warning, ignored search annotation: ";
1018 flatAnn[
i]->print(err);
1022 }
else if (flatAnn[
i]->isCall(
"float_default_search")) {
1023 #ifdef GECODE_HAS_FLOAT_VARS
1030 if (!ignoreUnknown) {
1031 err <<
"Warning, ignored search annotation: ";
1032 flatAnn[
i]->print(err);
1036 }
else if (flatAnn[
i]->isCall(
"float_search")) {
1037 #ifdef GECODE_HAS_FLOAT_VARS
1041 int k=vars->
a.size();
1042 for (
int i=vars->
a.size();
i--;)
1043 if (vars->
a[
i]->isFloat())
1047 vector<string> names;
1048 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
1049 if (vars->
a[
i]->isFloat())
1051 va[k++] =
fv[vars->
a[
i]->getFloatVar()];
1052 fv_searched[vars->
a[
i]->getFloatVar()] =
true;
1053 names.push_back(vars->
a[
i]->getVarName());
1063 if (!ignoreUnknown) {
1064 err <<
"Warning, ignored search annotation: ";
1065 flatAnn[
i]->print(err);
1070 if (!ignoreUnknown) {
1071 err <<
"Warning, ignored search annotation: ";
1072 flatAnn[
i]->print(err);
1082 if (iv_searched[
i]) {
1094 for (
int i=
iv.
size(), j=0, k=0;
i--;) {
1099 iv_tmp[j++] =
iv[
i];
1102 iv_sol[k++] =
iv[
i];
1110 if (bv_searched[
i]) {
1122 for (
int i=
bv.
size(), j=0, k=0;
i--;) {
1127 bv_tmp[j++] =
bv[
i];
1130 bv_sol[k++] =
bv[
i];
1134 if (iv_sol.
size() > 0)
1135 branch(*
this, iv_sol, def_int_varsel, def_int_valsel);
1136 if (bv_sol.
size() > 0)
1137 branch(*
this, bv_sol, def_bool_varsel, def_bool_valsel);
1138 #ifdef GECODE_HAS_FLOAT_VARS
1143 if (fv_searched[
i]) {
1155 for (
int i=
fv.
size(), j=0, k=0;
i--;) {
1160 fv_tmp[j++] =
fv[
i];
1163 fv_sol[k++] =
fv[
i];
1167 if (fv_sol.
size() > 0)
1168 branch(*
this, fv_sol, def_float_varsel, def_float_valsel);
1170 #ifdef GECODE_HAS_SET_VARS
1175 if (sv_searched[
i]) {
1187 for (
int i=
sv.
size(), j=0, k=0;
i--;) {
1192 sv_tmp[j++] =
sv[
i];
1195 sv_sol[k++] =
sv[
i];
1199 if (sv_sol.
size() > 0)
1200 branch(*
this, sv_sol, def_set_varsel, def_set_valsel);
1205 #ifdef GECODE_HAS_SET_VARS
1209 #ifdef GECODE_HAS_FLOAT_VARS
1215 def_bool_varsel, def_bool_valsel
1217 , def_set_varsel, def_set_valsel
1220 , def_float_varsel, def_float_valsel
1256 args->
a[3] =
new AST::Atom(
"indomain_split");
1258 c =
new AST::Call(
"float_search", args);
1263 ann->
a.push_back(c);
1286 args->
a[3] =
new AST::Atom(
"indomain_split_reverse");
1288 c =
new AST::Call(
"float_search", args);
1293 ann->
a.push_back(c);
1301 #ifdef GECODE_HAS_GIST
1306 template<
class Engine>
1311 template<
typename S>
1312 class GistEngine<
DFS<S> > {
1314 static void explore(S* root,
const FlatZincOptions&
opt,
1317 o.
c_d = opt.c_d(); o.
a_d = opt.a_d();
1325 template<
typename S>
1326 class GistEngine<BAB<S> > {
1328 static void explore(S* root,
const FlatZincOptions& opt,
1329 Gist::Inspector* i, Gist::Comparator* c) {
1331 o.
c_d = opt.c_d(); o.
a_d = opt.a_d();
1340 class FZPrintingInspector
1346 FZPrintingInspector(
const Printer& p0);
1348 virtual void inspect(
const Space& node);
1350 virtual void finalize(
void);
1354 FZPrintingInspector<S>::FZPrintingInspector(
const Printer& p0)
1355 : TextOutput(
"Gecode/FlatZinc"),
p(p0) {}
1359 FZPrintingInspector<S>::inspect(
const Space& node) {
1361 dynamic_cast<const S&
>(node).
print(getStream(),
p);
1362 getStream() << std::endl;
1367 FZPrintingInspector<S>::finalize(
void) {
1372 class FZPrintingComparator
1378 FZPrintingComparator(
const Printer& p0);
1381 virtual void compare(
const Space& s0,
const Space& s1);
1385 FZPrintingComparator<S>::FZPrintingComparator(
const Printer& p0)
1386 : Gecode::Gist::VarComparator<S>(
"Gecode/FlatZinc"),
p(p0) {}
1393 dynamic_cast<const S&
>(s0).
compare(dynamic_cast<const S&>(s1),
1394 this->getStream(),
p);
1395 }
catch (Exception& e) {
1396 this->getStream() <<
"Exception: " << e.what();
1398 this->getStream() << std::endl;
1404 template<
template<
class>
class Engine>
1406 FlatZincSpace::runEngine(std::ostream& out,
const Printer&
p,
1407 const FlatZincOptions& opt, Support::Timer& t_total) {
1409 runMeta<Engine,Driver::EngineToMeta>(out,
p,
opt,t_total);
1411 runMeta<Engine,RBS>(out,
p,
opt,t_total);
1415 template<
template<
class>
class Engine,
1416 template<
template<
class>
class,
class>
class Meta>
1418 FlatZincSpace::runMeta(std::ostream& out, const Printer& p,
1419 const FlatZincOptions& opt, Support::Timer& t_total) {
1420 #ifdef GECODE_HAS_GIST
1422 FZPrintingInspector<FlatZincSpace> pi(p);
1423 FZPrintingComparator<FlatZincSpace> pc(p);
1424 (void) GistEngine<Engine<FlatZincSpace> >::
explore(
this,opt,&pi,&pc);
1428 StatusStatistics sstat;
1429 unsigned int n_p = 0;
1430 Support::Timer t_solve;
1433 n_p = propagators();
1443 if (opt.interrupt())
1445 Meta<Engine,FlatZincSpace> se(
this,o);
1446 int noOfSolutions = _method == SAT ? opt.solutions() : 0;
1447 bool printAll = _method == SAT || opt.allSolutions();
1448 int findSol = noOfSolutions;
1449 FlatZincSpace* sol = NULL;
1450 while (FlatZincSpace* next_sol = se.next()) {
1455 out <<
"----------" << std::endl;
1460 if (sol && !printAll) {
1462 out <<
"----------" << std::endl;
1464 if (!se.stopped()) {
1466 out <<
"==========" << endl;
1468 out <<
"=====UNSATISFIABLE=====" << endl;
1471 out <<
"=====UNKNOWN=====" << endl;
1475 if (opt.interrupt())
1483 <<
"%% solvetime: ";
1487 <<
std::abs(noOfSolutions - findSol) << endl
1489 << (intVarCount + boolVarCount + setVarCount) << endl
1490 <<
"%% propagators: " << n_p << endl
1491 <<
"%% propagations: " << sstat.propagate+stat.
propagate << endl
1492 <<
"%% nodes: " << stat.
node << endl
1493 <<
"%% failures: " << stat.
fail << endl
1494 <<
"%% restarts: " << stat.
restart << endl
1495 <<
"%% peak depth: " << stat.
depth << endl
1501 #ifdef GECODE_HAS_QT
1503 FlatZincSpace::branchWithPlugin(AST::Node* ann) {
1504 if (AST::Call* c = dynamic_cast<AST::Call*>(ann)) {
1505 QString pluginName(c->id.c_str());
1506 if (QLibrary::isLibrary(pluginName+
".dll")) {
1507 pluginName +=
".dll";
1508 }
else if (QLibrary::isLibrary(pluginName+
".dylib")) {
1509 pluginName =
"lib" + pluginName +
".dylib";
1510 }
else if (QLibrary::isLibrary(pluginName+
".so")) {
1512 pluginName =
"lib" + pluginName +
".so";
1514 QPluginLoader pl(pluginName);
1515 QObject* plugin_o = pl.instance();
1517 throw FlatZinc::Error(
"FlatZinc",
1518 "Error loading plugin "+pluginName.toStdString()+
1519 ": "+pl.errorString().toStdString());
1521 BranchPlugin* pb = qobject_cast<BranchPlugin*>(plugin_o);
1523 throw FlatZinc::Error(
"FlatZinc",
1524 "Error loading plugin "+pluginName.toStdString()+
1525 ": does not contain valid PluginBrancher");
1527 pb->branch(*
this, c);
1532 FlatZincSpace::branchWithPlugin(AST::Node*) {
1533 throw FlatZinc::Error(
"FlatZinc",
1534 "Branching with plugins not supported (requires Qt support)");
1544 runEngine<BAB>(out,
p,
opt,t_total);
1547 runEngine<DFS>(out,
p,
opt,t_total);
1557 static_cast<const FlatZincSpace*>(&s)->
iv[_optVar].val());
1560 static_cast<const FlatZincSpace*>(&s)->
iv[_optVar].val());
1562 #ifdef GECODE_HAS_FLOAT_VARS
1565 static_cast<const FlatZincSpace*>(&s)->
fv[_optVar].val());
1568 static_cast<const FlatZincSpace*>(&s)->
fv[_optVar].val());
1607 (void) s; (void) out;
1608 #ifdef GECODE_HAS_GIST
1610 for (
int i = 0; i <
iv.
size(); ++
i) {
1611 std::stringstream ss;
1612 ss <<
"iv[" << i <<
"]";
1615 if (result.length() > 0) out << result << std::endl;
1617 for (
int i = 0; i <
bv.
size(); ++
i) {
1618 std::stringstream ss;
1619 ss <<
"bv[" << i <<
"]";
1622 if (result.length() > 0) out << result << std::endl;
1624 #ifdef GECODE_HAS_SET_VARS
1625 for (
int i = 0; i <
sv.
size(); ++
i) {
1626 std::stringstream ss;
1627 ss <<
"sv[" << i <<
"]";
1630 if (result.length() > 0) out << result << std::endl;
1633 #ifdef GECODE_HAS_FLOAT_VARS
1634 for (
int i = 0; i <
fv.
size(); ++
i) {
1635 std::stringstream ss;
1636 ss <<
"fv[" << i <<
"]";
1639 if (result.length() > 0) out << result << std::endl;
1674 for (
int i=offset; i--;)
1676 for (
int i=a->
a.size(); i--;)
1677 ia[i+offset] = a->
a[i]->getInt();
1684 for (
int i=offset; i--;)
1686 for (
int i=a->
a.size(); i--;)
1687 ia[i+offset] = a->
a[i]->getBool();
1698 int* is = re.
alloc<
int>(
static_cast<unsigned long int>(sl->
s.size()));
1699 for (
int i=sl->
s.size(); i--; )
1708 if (a->
a.size() == 0) {
1713 for (
int i=offset; i--;)
1715 for (
int i=a->
a.size(); i--;) {
1723 if (a->
a.size() == 0) {
1728 for (
int i=offset; i--;)
1729 ia[i] =
IntVar(*
this, 0, 0);
1730 for (
int i=a->
a.size(); i--;) {
1731 if (a->
a[i]->isIntVar()) {
1732 ia[i+offset] =
iv[a->
a[
i]->getIntVar()];
1734 int value = a->
a[
i]->getInt();
1744 if (a->
a.size() == 0) {
1749 for (
int i=offset; i--;)
1751 for (
int i=0; i<static_cast<int>(a->
a.size()); i++) {
1754 if (a->
a[i]->isBool()) {
1755 bool value = a->
a[
i]->getBool();
1758 }
else if (a->
a[i]->isIntVar() &&
1762 ia[offset++] =
bv[a->
a[
i]->getBoolVar()];
1792 if (a->
a.size() == 0)
1794 for (
int i=a->
a.size(); i--;) {
1795 if (a->
a[i]->isBoolVar() || a->
a[
i]->isBool()) {
1796 }
else if (a->
a[i]->isIntVar()) {
1798 if (singleInt != -1) {
1807 return singleInt==-1 || a->
a.size() > 1;
1809 #ifdef GECODE_HAS_SET_VARS
1815 x0 =
SetVar(*
this, d, d);
1826 for (
int i=offset; i--;) {
1830 for (
int i=a->
a.size(); i--;) {
1836 #ifdef GECODE_HAS_FLOAT_VARS
1841 for (
int i=offset; i--;)
1843 for (
int i=a->
a.size(); i--;)
1844 fa[i+offset] = a->
a[i]->getFloat();
1850 if (a->
a.size() == 0) {
1855 for (
int i=offset; i--;)
1857 for (
int i=a->
a.size(); i--;) {
1858 if (a->
a[i]->isFloatVar()) {
1859 fa[i+offset] =
fv[a->
a[
i]->getFloatVar()];
1861 double value = a->
a[
i]->getFloat();
1902 Printer::printElem(std::ostream& out,
1922 }
else if (bv[ai->
getBoolVar()].max() == 0) {
1925 out <<
"false..true";
1927 #ifdef GECODE_HAS_SET_VARS
1933 SetVarGlbRanges svr(sv[ai->
getSetVar()]);
1938 int min = svr.min();
1939 int max = svr.max();
1942 SetVarGlbValues svv(sv[ai->
getSetVar()]);
1946 for (; svv(); ++svv)
1947 out <<
", " << svv.val();
1950 out << min <<
".." <<
max;
1953 #ifdef GECODE_HAS_FLOAT_VARS
1964 std::ostringstream oss;
1966 oss << std::setprecision(std::numeric_limits<double>::digits10);
1968 if (oss.str().find(
".") == std::string::npos)
1975 }
else if (ai->
isBool()) {
1976 out << (ai->
getBool() ?
"true" :
"false");
1977 }
else if (ai->
isSet()) {
1978 AST::SetLit* s = ai->
getSet();
1980 out << s->
min <<
".." << s->max;
1983 for (
unsigned int i=0; i<s->s.size(); i++) {
1984 out << s->s[
i] << (i < s->s.size()-1 ?
", " :
"}");
1989 for (
unsigned int i=0; i<s.size(); i++) {
1990 if (s[i] ==
'\\' && i<s.size()-1) {
1992 case 'n': out <<
"\n";
break;
1993 case '\\': out <<
"\\";
break;
1994 case 't': out <<
"\t";
break;
1995 default: out <<
"\\" << s[i+1];
2006 Printer::printElemDiff(std::ostream& out,
2012 #ifdef GECODE_HAS_SET_VARS
2016 #ifdef GECODE_HAS_FLOAT_VARS
2021 #ifdef GECODE_HAS_GIST
2022 using namespace Gecode::Gist;
2026 }
else if (ai->isIntVar()) {
2028 iv2[ai->getIntVar()]));
2029 if (res.length() > 0) {
2033 out << iv1[ai->getIntVar()];
2035 }
else if (ai->isBoolVar()) {
2037 bv2[ai->getBoolVar()]));
2038 if (res.length() > 0) {
2042 out << bv1[ai->getBoolVar()];
2044 #ifdef GECODE_HAS_SET_VARS
2045 }
else if (ai->isSetVar()) {
2047 sv2[ai->getSetVar()]));
2048 if (res.length() > 0) {
2052 out << sv1[ai->getSetVar()];
2055 #ifdef GECODE_HAS_FLOAT_VARS
2056 }
else if (ai->isFloatVar()) {
2058 fv2[ai->getFloatVar()]));
2059 if (res.length() > 0) {
2063 out << fv1[ai->getFloatVar()];
2066 }
else if (ai->isBool()) {
2067 out << (ai->getBool() ?
"true" :
"false");
2068 }
else if (ai->isSet()) {
2069 AST::SetLit* s = ai->getSet();
2071 out << s->min <<
".." << s->max;
2074 for (
unsigned int i=0; i<s->s.size(); i++) {
2075 out << s->s[
i] << (i < s->s.size()-1 ?
", " :
"}");
2078 }
else if (ai->isString()) {
2079 std::string s = ai->getString();
2080 for (
unsigned int i=0; i<s.size(); i++) {
2081 if (s[i] ==
'\\' && i<s.size()-1) {
2083 case 'n': out <<
"\n";
break;
2084 case '\\': out <<
"\\";
break;
2085 case 't': out <<
"\t";
break;
2086 default: out <<
"\\" << s[i+1];
2101 #ifdef GECODE_HAS_SET_VARS
2105 #ifdef GECODE_HAS_FLOAT_VARS
2110 if (_output == NULL)
2112 for (
unsigned int i=0; i< _output->
a.size(); i++) {
2116 int size = aia->
a.size();
2118 for (
int j=0; j<
size; j++) {
2119 printElem(out,aia->
a[j],iv,bv
2120 #ifdef GECODE_HAS_SET_VARS
2123 #ifdef GECODE_HAS_FLOAT_VARS
2132 printElem(out,ai,iv,bv
2133 #ifdef GECODE_HAS_SET_VARS
2136 #ifdef GECODE_HAS_FLOAT_VARS
2150 #ifdef GECODE_HAS_SET_VARS
2155 #ifdef GECODE_HAS_FLOAT_VARS
2161 if (_output == NULL)
2163 for (
unsigned int i=0; i< _output->
a.size(); i++) {
2167 int size = aia->
a.size();
2169 for (
int j=0; j<
size; j++) {
2170 printElemDiff(out,aia->
a[j],iv1,iv2,bv1,bv2
2171 #ifdef GECODE_HAS_SET_VARS
2174 #ifdef GECODE_HAS_FLOAT_VARS
2183 printElemDiff(out,ai,iv1,iv2,bv1,bv2
2184 #ifdef GECODE_HAS_SET_VARS
2187 #ifdef GECODE_HAS_FLOAT_VARS
2197 std::map<int,int>& iv, std::map<int,int>& bv,
2198 std::map<int,int>& sv, std::map<int,int>& fv) {
2201 if (iv.find(x->
i) == iv.end()) {
2202 int newi = iv.size();
2208 if (bv.find(x->
i) == bv.end()) {
2209 int newi = bv.size();
2215 if (sv.find(x->
i) == sv.end()) {
2216 int newi = sv.size();
2222 if (fv.find(x->
i) == fv.end()) {
2223 int newi = fv.size();
2232 int& optVar,
bool optVarIsInt,
2235 #ifdef GECODE_HAS_SET_VARS
2239 #ifdef GECODE_HAS_FLOAT_VARS
2244 if (_output == NULL) {
2245 if (optVarIsInt && optVar != -1) {
2254 #ifdef GECODE_HAS_SET_VARS
2257 #ifdef GECODE_HAS_FLOAT_VARS
2258 if (!optVarIsInt && optVar != -1) {
2269 std::map<int,int> iv_new;
2270 std::map<int,int> bv_new;
2271 std::map<int,int> sv_new;
2272 std::map<int,int> fv_new;
2282 for (
unsigned int i=0; i< _output->
a.size(); i++) {
2286 for (
unsigned int j=0; j<aia->
a.size(); j++) {
2295 for (map<int,int>::iterator i=iv_new.begin(); i != iv_new.end(); ++
i) {
2296 iva[(*i).second] = iv[(*i).first];
2301 for (map<int,int>::iterator i=bv_new.begin(); i != bv_new.end(); ++
i) {
2302 bva[(*i).second] = bv[(*i).first];
2306 #ifdef GECODE_HAS_SET_VARS
2308 for (map<int,int>::iterator i=sv_new.begin(); i != sv_new.end(); ++
i) {
2309 sva[(*i).second] = sv[(*i).first];
2314 #ifdef GECODE_HAS_FLOAT_VARS
2316 for (map<int,int>::iterator i=fv_new.begin(); i != fv_new.end(); ++
i) {
2317 fva[(*i).second] = fv[(*i).first];