52 namespace Gecode {
namespace FlatZinc {
74 :
Brancher(home, share, b), done(b.done) {}
83 : Gecode::
Choice(b,1), fail(fail0) {}
85 virtual size_t size(
void)
const {
99 if (done)
return false;
105 #ifdef GECODE_HAS_SET_VARS
109 #ifdef GECODE_HAS_FLOAT_VARS
123 #ifdef GECODE_HAS_SET_VARS
126 #ifdef GECODE_HAS_FLOAT_VARS
133 return new Choice(*
this,
false);
135 return new Choice(*
this,
true);
140 bool fail; e >> fail;
141 return new Choice(*
this, fail);
157 return sizeof(*this);
171 int* newdom =
heap.
alloc<
int>(
static_cast<unsigned long int>(sl->
s.size()));
172 for (
int i=sl->
s.size();
i--;)
173 newdom[
i] = sl->
s[
i];
174 IntSet ret(newdom, sl->
s.size());
175 heap.
free(newdom, static_cast<unsigned long int>(sl->
s.size()));
207 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
208 if (s->id ==
"input_order")
210 if (s->id ==
"first_fail")
212 if (s->id ==
"anti_first_fail")
214 if (s->id ==
"smallest")
216 if (s->id ==
"largest")
218 if (s->id ==
"occurrence")
220 if (s->id ==
"max_regret")
222 if (s->id ==
"most_constrained")
225 if (s->id ==
"random") {
226 Rnd r(static_cast<unsigned int>(seed));
229 if (s->id ==
"afc_min")
231 if (s->id ==
"afc_max")
233 if (s->id ==
"afc_size_min")
235 if (s->id ==
"afc_size_max") {
238 if (s->id ==
"activity_min")
240 if (s->id ==
"activity_max")
242 if (s->id ==
"activity_size_min")
244 if (s->id ==
"activity_size_max")
247 std::cerr <<
"Warning, ignored search annotation: ";
248 ann->
print(std::cerr);
249 std::cerr << std::endl;
254 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
255 if (s->id ==
"indomain_min")
257 if (s->id ==
"indomain_max")
259 if (s->id ==
"indomain_median")
261 if (s->id ==
"indomain_split")
263 if (s->id ==
"indomain_reverse_split")
265 if (s->id ==
"indomain_random") {
266 Rnd r(static_cast<unsigned int>(seed));
269 if (s->id ==
"indomain")
271 if (s->id ==
"indomain_middle") {
272 std::cerr <<
"Warning, replacing unsupported annotation "
273 <<
"indomain_middle with indomain_median" << std::endl;
276 if (s->id ==
"indomain_interval") {
277 std::cerr <<
"Warning, replacing unsupported annotation "
278 <<
"indomain_interval with indomain_split" << std::endl;
282 std::cerr <<
"Warning, ignored search annotation: ";
283 ann->
print(std::cerr);
284 std::cerr << std::endl;
289 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
290 if (s->id ==
"indomain_min")
292 if (s->id ==
"indomain_max")
294 if (s->id ==
"indomain_median")
296 if (s->id ==
"indomain_random") {
297 Rnd r(static_cast<unsigned int>(seed));
301 std::cerr <<
"Warning, ignored search annotation: ";
302 ann->
print(std::cerr);
303 std::cerr << std::endl;
307 #ifdef GECODE_HAS_SET_VARS
310 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
311 if (s->id ==
"input_order")
313 if (s->id ==
"first_fail")
315 if (s->id ==
"anti_first_fail")
317 if (s->id ==
"smallest")
319 if (s->id ==
"largest")
321 if (s->id ==
"afc_min")
323 if (s->id ==
"afc_max")
325 if (s->id ==
"afc_size_min")
327 if (s->id ==
"afc_size_max")
329 if (s->id ==
"activity_min")
331 if (s->id ==
"activity_max")
333 if (s->id ==
"activity_size_min")
335 if (s->id ==
"activity_size_max")
338 std::cerr <<
"Warning, ignored search annotation: ";
339 ann->
print(std::cerr);
340 std::cerr << std::endl;
346 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
347 if (s->id ==
"indomain_min")
349 if (s->id ==
"indomain_max")
351 if (s->id ==
"outdomain_min")
353 if (s->id ==
"outdomain_max")
356 std::cerr <<
"Warning, ignored search annotation: ";
357 ann->
print(std::cerr);
358 std::cerr << std::endl;
363 #ifdef GECODE_HAS_FLOAT_VARS
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 ==
"most_constrained")
381 if (s->id ==
"random") {
382 Rnd r(static_cast<unsigned int>(seed));
385 if (s->id ==
"afc_min")
387 if (s->id ==
"afc_max")
389 if (s->id ==
"afc_size_min")
391 if (s->id ==
"afc_size_max")
393 if (s->id ==
"activity_min")
395 if (s->id ==
"activity_max")
397 if (s->id ==
"activity_size_min")
399 if (s->id ==
"activity_size_max")
402 std::cerr <<
"Warning, ignored search annotation: ";
403 ann->
print(std::cerr);
404 std::cerr << std::endl;
409 if (
AST::Atom* s = dynamic_cast<AST::Atom*>(ann)) {
410 if (s->id ==
"indomain_split")
412 if (s->id ==
"indomain_reverse_split")
415 std::cerr <<
"Warning, ignored search annotation: ";
416 ann->
print(std::cerr);
417 std::cerr << std::endl;
424 :
Space(share, f), _solveAnnotations(NULL), iv_boolalias(NULL),
425 needAuxVars(f.needAuxVars) {
436 iva[iva.
size()-1].update(*
this, share, f.
iv_aux[
i]);
449 bva[bva.
size()-1].update(*
this, share, f.
bv_aux[
i]);
455 #ifdef GECODE_HAS_SET_VARS
463 sva[sva.
size()-1].update(*
this, share, f.
sv_aux[
i]);
469 #ifdef GECODE_HAS_FLOAT_VARS
477 fva[fva.
size()-1].update(*
this, share, f.
fv_aux[
i]);
486 : intVarCount(-1), boolVarCount(-1), floatVarCount(-1), setVarCount(-1),
487 _optVar(-1), _solveAnnotations(NULL), needAuxVars(true) {}
491 int setVars,
int floatVars) {
502 #ifdef GECODE_HAS_SET_VARS
507 #ifdef GECODE_HAS_FLOAT_VARS
552 #ifdef GECODE_HAS_SET_VARS
564 int* is =
heap.
alloc<
int>(
static_cast<unsigned long int>(vsv->s.size()));
565 for (
int i=vsv->s.
size();
i--; )
568 heap.
free(is,static_cast<unsigned long int>(vsv->s.size()));
577 int* is =
heap.
alloc<
int>(
static_cast<unsigned long int>(vsv->
s.size()));
578 for (
int i=vsv->
s.size();
i--; )
581 heap.
free(is,static_cast<unsigned long int>(vsv->
s.size()));
599 #ifdef GECODE_HAS_FLOAT_VARS
641 for (
unsigned int i=0;
i<ann->
a.size();
i++) {
642 if (ann->
a[
i]->isCall(
"seq_search")) {
647 out.push_back(c->
args);
649 out.push_back(ann->
a[
i]);
659 std::vector<AST::Node*> flatAnn;
663 flatAnn.push_back(ann);
666 for (
unsigned int i=0;
i<flatAnn.
size();
i++) {
667 if (flatAnn[
i]->isCall(
"gecode_search")) {
669 branchWithPlugin(c->
args);
670 }
else if (flatAnn[
i]->isCall(
"int_search")) {
674 int k=vars->
a.size();
675 for (
int i=vars->
a.size();
i--;)
676 if (vars->
a[
i]->isInt())
680 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
681 if (vars->
a[
i]->isInt())
683 va[k++] =
iv[vars->
a[
i]->getIntVar()];
688 }
else if (flatAnn[
i]->isCall(
"int_assign")) {
692 int k=vars->
a.size();
693 for (
int i=vars->
a.size();
i--;)
694 if (vars->
a[
i]->isInt())
698 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
699 if (vars->
a[
i]->isInt())
701 va[k++] =
iv[vars->
a[
i]->getIntVar()];
704 }
else if (flatAnn[
i]->isCall(
"bool_search")) {
708 int k=vars->
a.size();
709 for (
int i=vars->
a.size();
i--;)
710 if (vars->
a[
i]->isBool())
714 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
715 if (vars->
a[
i]->isBool())
717 va[k++] =
bv[vars->
a[
i]->getBoolVar()];
722 }
else if (flatAnn[
i]->isCall(
"set_search")) {
723 #ifdef GECODE_HAS_SET_VARS
727 int k=vars->
a.size();
728 for (
int i=vars->
a.size();
i--;)
729 if (vars->
a[
i]->isSet())
733 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
734 if (vars->
a[
i]->isSet())
736 va[k++] =
sv[vars->
a[
i]->getSetVar()];
742 if (!ignoreUnknown) {
743 err <<
"Warning, ignored search annotation: ";
744 flatAnn[
i]->print(err);
749 #ifdef GECODE_HAS_FLOAT_VARS
750 else if (flatAnn[
i]->isCall(
"float_search")) {
754 int k=vars->
a.size();
755 for (
int i=vars->
a.size();
i--;)
756 if (vars->
a[
i]->isFloat())
760 for (
unsigned int i=0;
i<vars->
a.size();
i++) {
761 if (vars->
a[
i]->isFloat())
763 va[k++] =
fv[vars->
a[
i]->getFloatVar()];
771 if (!ignoreUnknown) {
772 err <<
"Warning, ignored search annotation: ";
773 flatAnn[
i]->print(err);
791 for (
int i=
iv.
size(), j=0, k=0; i--;)
802 for (
int i=
bv.
size(); i--;)
812 for (
int i=
bv.
size(), j=0, k=0; i--;)
823 #ifdef GECODE_HAS_FLOAT_VARS
826 for (
int i=
fv.
size(); i--;)
836 for (
int i=
fv.
size(), j=0, k=0; i--;)
847 #ifdef GECODE_HAS_SET_VARS
850 for (
int i=
sv.
size(); i--;)
860 for (
int i=
sv.
size(), j=0, k=0; i--;)
873 #ifdef GECODE_HAS_SET_VARS
876 #ifdef GECODE_HAS_FLOAT_VARS
933 #ifdef GECODE_HAS_GIST
938 template<
class Engine>
944 class GistEngine<
DFS<S> > {
946 static void explore(S* root,
const FlatZincOptions&
opt,
949 o.
c_d = opt.c_d(); o.
a_d = opt.a_d();
958 class GistEngine<BAB<S> > {
960 static void explore(S* root,
const FlatZincOptions& opt,
961 Gist::Inspector* i, Gist::Comparator* c) {
963 o.
c_d = opt.c_d(); o.
a_d = opt.a_d();
972 class FZPrintingInspector
978 FZPrintingInspector(
const Printer& p0);
980 virtual void inspect(
const Space& node);
982 virtual void finalize(
void);
986 FZPrintingInspector<S>::FZPrintingInspector(
const Printer& p0)
987 : TextOutput(
"Gecode/FlatZinc"),
p(p0) {}
991 FZPrintingInspector<S>::inspect(
const Space& node) {
993 dynamic_cast<const S&
>(node).
print(getStream(),
p);
994 getStream() << std::endl;
999 FZPrintingInspector<S>::finalize(
void) {
1004 class FZPrintingComparator
1010 FZPrintingComparator(
const Printer& p0);
1013 virtual void compare(
const Space& s0,
const Space& s1);
1017 FZPrintingComparator<S>::FZPrintingComparator(
const Printer& p0)
1018 : Gecode::Gist::VarComparator<S>(
"Gecode/FlatZinc"),
p(p0) {}
1025 dynamic_cast<const S&
>(s0).
compare(dynamic_cast<const S&>(s1),
1026 this->getStream(),
p);
1027 }
catch (Exception& e) {
1028 this->getStream() <<
"Exception: " << e.what();
1030 this->getStream() << std::endl;
1036 template<
template<
class>
class Engine>
1038 FlatZincSpace::runEngine(std::ostream& out,
const Printer&
p,
1039 const FlatZincOptions& opt, Support::Timer& t_total) {
1041 runMeta<Engine,Driver::EngineToMeta>(out,
p,
opt,t_total);
1043 runMeta<Engine,RBS>(out,
p,
opt,t_total);
1047 template<
template<
class>
class Engine,
1048 template<
template<
class>
class,
class>
class Meta>
1050 FlatZincSpace::runMeta(std::ostream& out, const Printer& p,
1051 const FlatZincOptions& opt, Support::Timer& t_total) {
1052 #ifdef GECODE_HAS_GIST
1054 FZPrintingInspector<FlatZincSpace> pi(p);
1055 FZPrintingComparator<FlatZincSpace> pc(p);
1056 (void) GistEngine<Engine<FlatZincSpace> >::
explore(
this,opt,&pi,&pc);
1060 StatusStatistics sstat;
1061 unsigned int n_p = 0;
1062 Support::Timer t_solve;
1065 n_p = propagators();
1074 if (opt.interrupt())
1076 Meta<Engine,FlatZincSpace> se(
this,o);
1077 int noOfSolutions = _method == SAT ? opt.solutions() : 0;
1078 bool printAll = _method == SAT || opt.allSolutions();
1079 int findSol = noOfSolutions;
1080 FlatZincSpace* sol = NULL;
1081 while (FlatZincSpace* next_sol = se.next()) {
1086 out <<
"----------" << std::endl;
1091 if (sol && !printAll) {
1093 out <<
"----------" << std::endl;
1095 if (!se.stopped()) {
1097 out <<
"==========" << endl;
1099 out <<
"=====UNSATISFIABLE=====" << endl;
1102 out <<
"=====UNKNOWN=====" << endl;
1106 if (opt.interrupt())
1114 <<
"%% solvetime: ";
1118 <<
std::abs(noOfSolutions - findSol) << endl
1120 << (intVarCount + boolVarCount + setVarCount) << endl
1121 <<
"%% propagators: " << n_p << endl
1122 <<
"%% propagations: " << sstat.propagate+stat.
propagate << endl
1123 <<
"%% nodes: " << stat.
node << endl
1124 <<
"%% failures: " << stat.
fail << endl
1125 <<
"%% restarts: " << stat.
restart << endl
1126 <<
"%% peak depth: " << stat.
depth << endl
1127 <<
"%% peak memory: "
1128 << static_cast<int>((stat.
memory+1023) / 1024) <<
" KB"
1133 #ifdef GECODE_HAS_QT
1135 FlatZincSpace::branchWithPlugin(AST::Node* ann) {
1136 if (AST::Call* c = dynamic_cast<AST::Call*>(ann)) {
1137 QString pluginName(c->id.c_str());
1138 if (QLibrary::isLibrary(pluginName+
".dll")) {
1139 pluginName +=
".dll";
1140 }
else if (QLibrary::isLibrary(pluginName+
".dylib")) {
1141 pluginName =
"lib" + pluginName +
".dylib";
1142 }
else if (QLibrary::isLibrary(pluginName+
".so")) {
1144 pluginName =
"lib" + pluginName +
".so";
1146 QPluginLoader pl(pluginName);
1147 QObject* plugin_o = pl.instance();
1149 throw FlatZinc::Error(
"FlatZinc",
1150 "Error loading plugin "+pluginName.toStdString()+
1151 ": "+pl.errorString().toStdString());
1153 BranchPlugin* pb = qobject_cast<BranchPlugin*>(plugin_o);
1155 throw FlatZinc::Error(
"FlatZinc",
1156 "Error loading plugin "+pluginName.toStdString()+
1157 ": does not contain valid PluginBrancher");
1159 pb->branch(*
this, c);
1164 FlatZincSpace::branchWithPlugin(AST::Node*) {
1165 throw FlatZinc::Error(
"FlatZinc",
1166 "Branching with plugins not supported (requires Qt support)");
1176 runEngine<BAB>(out,
p,
opt,t_total);
1179 runEngine<DFS>(out,
p,
opt,t_total);
1188 static_cast<const FlatZincSpace*>(&s)->
iv[_optVar].val());
1191 static_cast<const FlatZincSpace*>(&s)->
iv[_optVar].val());
1223 (void) s; (void) out;
1224 #ifdef GECODE_HAS_GIST
1226 for (
int i = 0; i <
iv.
size(); ++
i) {
1227 std::stringstream ss;
1228 ss <<
"iv[" << i <<
"]";
1231 if (result.length() > 0) out << result << std::endl;
1233 for (
int i = 0; i <
bv.
size(); ++
i) {
1234 std::stringstream ss;
1235 ss <<
"bv[" << i <<
"]";
1238 if (result.length() > 0) out << result << std::endl;
1240 #ifdef GECODE_HAS_SET_VARS
1241 for (
int i = 0; i <
sv.
size(); ++
i) {
1242 std::stringstream ss;
1243 ss <<
"sv[" << i <<
"]";
1246 if (result.length() > 0) out << result << std::endl;
1249 #ifdef GECODE_HAS_FLOAT_VARS
1250 for (
int i = 0; i <
fv.
size(); ++
i) {
1251 std::stringstream ss;
1252 ss <<
"fv[" << i <<
"]";
1255 if (result.length() > 0) out << result << std::endl;
1290 for (
int i=offset; i--;)
1292 for (
int i=a->
a.size(); i--;)
1293 ia[i+offset] = a->
a[i]->getInt();
1300 for (
int i=offset; i--;)
1302 for (
int i=a->
a.size(); i--;)
1303 ia[i+offset] = a->
a[i]->getBool();
1314 int* is = re.
alloc<
int>(
static_cast<unsigned long int>(sl->
s.size()));
1315 for (
int i=sl->
s.size(); i--; )
1324 if (a->
a.size() == 0) {
1329 for (
int i=offset; i--;)
1331 for (
int i=a->
a.size(); i--;) {
1339 if (a->
a.size() == 0) {
1344 for (
int i=offset; i--;)
1345 ia[i] =
IntVar(*
this, 0, 0);
1346 for (
int i=a->
a.size(); i--;) {
1347 if (a->
a[i]->isIntVar()) {
1348 ia[i+offset] =
iv[a->
a[
i]->getIntVar()];
1350 int value = a->
a[
i]->getInt();
1360 if (a->
a.size() == 0) {
1365 for (
int i=offset; i--;)
1367 for (
int i=0; i<static_cast<int>(a->
a.size()); i++) {
1370 if (a->
a[i]->isBool()) {
1371 bool value = a->
a[
i]->getBool();
1374 }
else if (a->
a[i]->isIntVar() &&
1378 ia[offset++] =
bv[a->
a[
i]->getBoolVar()];
1408 if (a->
a.size() == 0)
1410 for (
int i=a->
a.size(); i--;) {
1411 if (a->
a[i]->isBoolVar() || a->
a[
i]->isBool()) {
1412 }
else if (a->
a[i]->isIntVar()) {
1414 if (singleInt != -1) {
1423 return singleInt==-1 || a->
a.size() > 1;
1425 #ifdef GECODE_HAS_SET_VARS
1431 x0 =
SetVar(*
this, d, d);
1442 for (
int i=offset; i--;) {
1446 for (
int i=a->
a.size(); i--;) {
1452 #ifdef GECODE_HAS_FLOAT_VARS
1457 for (
int i=offset; i--;)
1459 for (
int i=a->
a.size(); i--;)
1460 fa[i+offset] = a->
a[i]->getFloat();
1466 if (a->
a.size() == 0) {
1471 for (
int i=offset; i--;)
1473 for (
int i=a->
a.size(); i--;) {
1474 if (a->
a[i]->isFloatVar()) {
1475 fa[i+offset] =
fv[a->
a[
i]->getFloatVar()];
1477 double value = a->
a[
i]->getFloat();
1518 Printer::printElem(std::ostream& out,
1538 }
else if (bv[ai->
getBoolVar()].max() == 0) {
1541 out <<
"false..true";
1543 #ifdef GECODE_HAS_SET_VARS
1549 SetVarGlbRanges svr(sv[ai->
getSetVar()]);
1554 int min = svr.min();
1555 int max = svr.max();
1558 SetVarGlbValues svv(sv[ai->
getSetVar()]);
1562 for (; svv(); ++svv)
1563 out <<
", " << svv.val();
1566 out << min <<
".." <<
max;
1569 #ifdef GECODE_HAS_FLOAT_VARS
1573 }
else if (ai->
isBool()) {
1574 out << (ai->
getBool() ?
"true" :
"false");
1575 }
else if (ai->
isSet()) {
1576 AST::SetLit* s = ai->
getSet();
1578 out << s->
min <<
".." << s->max;
1581 for (
unsigned int i=0; i<s->s.size(); i++) {
1582 out << s->s[
i] << (i < s->s.size()-1 ?
", " :
"}");
1587 for (
unsigned int i=0; i<s.size(); i++) {
1588 if (s[i] ==
'\\' && i<s.size()-1) {
1590 case 'n': out <<
"\n";
break;
1591 case '\\': out <<
"\\";
break;
1592 case 't': out <<
"\t";
break;
1593 default: out <<
"\\" << s[i+1];
1604 Printer::printElemDiff(std::ostream& out,
1610 #ifdef GECODE_HAS_SET_VARS
1614 #ifdef GECODE_HAS_FLOAT_VARS
1619 #ifdef GECODE_HAS_GIST
1620 using namespace Gecode::Gist;
1624 }
else if (ai->isIntVar()) {
1626 iv2[ai->getIntVar()]));
1627 if (res.length() > 0) {
1631 out << iv1[ai->getIntVar()];
1633 }
else if (ai->isBoolVar()) {
1635 bv2[ai->getBoolVar()]));
1636 if (res.length() > 0) {
1640 out << bv1[ai->getBoolVar()];
1642 #ifdef GECODE_HAS_SET_VARS
1643 }
else if (ai->isSetVar()) {
1645 sv2[ai->getSetVar()]));
1646 if (res.length() > 0) {
1650 out << sv1[ai->getSetVar()];
1653 #ifdef GECODE_HAS_FLOAT_VARS
1654 }
else if (ai->isFloatVar()) {
1656 fv2[ai->getFloatVar()]));
1657 if (res.length() > 0) {
1661 out << fv1[ai->getFloatVar()];
1664 }
else if (ai->isBool()) {
1665 out << (ai->getBool() ?
"true" :
"false");
1666 }
else if (ai->isSet()) {
1667 AST::SetLit* s = ai->getSet();
1669 out << s->min <<
".." << s->max;
1672 for (
unsigned int i=0; i<s->s.size(); i++) {
1673 out << s->s[
i] << (i < s->s.size()-1 ?
", " :
"}");
1676 }
else if (ai->isString()) {
1677 std::string s = ai->getString();
1678 for (
unsigned int i=0; i<s.size(); i++) {
1679 if (s[i] ==
'\\' && i<s.size()-1) {
1681 case 'n': out <<
"\n";
break;
1682 case '\\': out <<
"\\";
break;
1683 case 't': out <<
"\t";
break;
1684 default: out <<
"\\" << s[i+1];
1699 #ifdef GECODE_HAS_SET_VARS
1703 #ifdef GECODE_HAS_FLOAT_VARS
1708 if (_output == NULL)
1710 for (
unsigned int i=0; i< _output->
a.size(); i++) {
1714 int size = aia->
a.size();
1716 for (
int j=0; j<
size; j++) {
1717 printElem(out,aia->
a[j],iv,bv
1718 #ifdef GECODE_HAS_SET_VARS
1721 #ifdef GECODE_HAS_FLOAT_VARS
1730 printElem(out,ai,iv,bv
1731 #ifdef GECODE_HAS_SET_VARS
1734 #ifdef GECODE_HAS_FLOAT_VARS
1748 #ifdef GECODE_HAS_SET_VARS
1753 #ifdef GECODE_HAS_FLOAT_VARS
1759 if (_output == NULL)
1761 for (
unsigned int i=0; i< _output->
a.size(); i++) {
1765 int size = aia->
a.size();
1767 for (
int j=0; j<
size; j++) {
1768 printElemDiff(out,aia->
a[j],iv1,iv2,bv1,bv2
1769 #ifdef GECODE_HAS_SET_VARS
1772 #ifdef GECODE_HAS_FLOAT_VARS
1781 printElemDiff(out,ai,iv1,iv2,bv1,bv2
1782 #ifdef GECODE_HAS_SET_VARS
1785 #ifdef GECODE_HAS_FLOAT_VARS
1795 std::map<int,int>& iv, std::map<int,int>& bv,
1796 std::map<int,int>& sv, std::map<int,int>& fv) {
1799 if (iv.find(x->
i) == iv.end()) {
1800 int newi = iv.size();
1806 if (bv.find(x->
i) == bv.end()) {
1807 int newi = bv.size();
1813 if (sv.find(x->
i) == sv.end()) {
1814 int newi = sv.size();
1820 if (fv.find(x->
i) == fv.end()) {
1821 int newi = fv.size();
1833 #ifdef GECODE_HAS_SET_VARS
1837 #ifdef GECODE_HAS_FLOAT_VARS
1842 if (_output == NULL) {
1852 #ifdef GECODE_HAS_SET_VARS
1855 #ifdef GECODE_HAS_FLOAT_VARS
1860 std::map<int,int> iv_new;
1861 std::map<int,int> bv_new;
1862 std::map<int,int> sv_new;
1863 std::map<int,int> fv_new;
1870 for (
unsigned int i=0; i< _output->
a.size(); i++) {
1874 for (
unsigned int j=0; j<aia->
a.size(); j++) {
1883 for (map<int,int>::iterator i=iv_new.begin(); i != iv_new.end(); ++
i) {
1884 iva[(*i).second] = iv[(*i).first];
1889 for (map<int,int>::iterator i=bv_new.begin(); i != bv_new.end(); ++
i) {
1890 bva[(*i).second] = bv[(*i).first];
1894 #ifdef GECODE_HAS_SET_VARS
1896 for (map<int,int>::iterator i=sv_new.begin(); i != sv_new.end(); ++
i) {
1897 sva[(*i).second] = sv[(*i).first];
1902 #ifdef GECODE_HAS_FLOAT_VARS
1904 for (map<int,int>::iterator i=fv_new.begin(); i != fv_new.end(); ++
i) {
1905 fva[(*i).second] = fv[(*i).first];