Generated on Tue Apr 18 10:21:35 2017 for Gecode by doxygen 1.6.3

branch.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Mikael Lagerkvist <lagerkvist@gecode.org>
00005  *     Christian Schulte <schulte@gecode.org>
00006  *
00007  *  Contributing authors:
00008  *     Vincent Barichard <Vincent.Barichard@univ-angers.fr>
00009  *
00010  *  Copyright:
00011  *     Mikael Lagerkvist, 2005
00012  *     Christian Schulte, 2009
00013  *     Vincent Barichard, 2012
00014  *
00015  *  Last modified:
00016  *     $Date: 2017-03-10 21:13:53 +0100 (Fri, 10 Mar 2017) $ by $Author: schulte $
00017  *     $Revision: 15572 $
00018  *
00019  *  This file is part of Gecode, the generic constraint
00020  *  development environment:
00021  *     http://www.gecode.org
00022  *
00023  *  Permission is hereby granted, free of charge, to any person obtaining
00024  *  a copy of this software and associated documentation files (the
00025  *  "Software"), to deal in the Software without restriction, including
00026  *  without limitation the rights to use, copy, modify, merge, publish,
00027  *  distribute, sublicense, and/or sell copies of the Software, and to
00028  *  permit persons to whom the Software is furnished to do so, subject to
00029  *  the following conditions:
00030  *
00031  *  The above copyright notice and this permission notice shall be
00032  *  included in all copies or substantial portions of the Software.
00033  *
00034  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00035  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00036  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00037  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00038  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00039  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00040  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00041  *
00042  */
00043 
00044 #include "test/branch.hh"
00045 
00046 #include <algorithm>
00047 #include <map>
00048 #include <vector>
00049 #include <iostream>
00050 
00051 #include <gecode/kernel.hh>
00052 #include <gecode/int.hh>
00053 #ifdef GECODE_HAS_SET_VARS
00054 #include <gecode/set.hh>
00055 #endif
00056 #ifdef GECODE_HAS_FLOAT_VARS
00057 #include <gecode/float.hh>
00058 #endif
00059 
00060 #include <gecode/search.hh>
00061 
00062 namespace Test { namespace Branch {
00063 
00065   double tbl(const Gecode::Space&, double w, double b) {
00066     return (w + (b-w)/2.0);
00067   }
00068 
00070   class IntTestSpace : public Gecode::Space {
00071   public:
00073     Gecode::IntVarArray x;
00075     Gecode::IntVarBranch vara, varb;
00077     Gecode::IntValBranch val;
00079     IntTestSpace(int n, Gecode::IntSet& d)
00080       : x(*this, n, d),
00081         vara(Gecode::INT_VAR_NONE()), varb(Gecode::INT_VAR_NONE()),
00082         val(Gecode::INT_VAL_MIN()) {}
00084     IntTestSpace(bool share, IntTestSpace& s)
00085       : Gecode::Space(share,s), vara(s.vara), varb(s.varb), val(s.val) {
00086       x.update(*this, share, s.x);
00087     }
00089     virtual Gecode::Space* copy(bool share) {
00090       return new IntTestSpace(share,*this);
00091     }
00092   };
00093 
00095   class BoolTestSpace : public Gecode::Space {
00096   public:
00098     Gecode::BoolVarArray x;
00100     BoolTestSpace(int n)
00101       : x(*this, n, 0, 1) {}
00103     BoolTestSpace(bool share, BoolTestSpace& s)
00104       : Gecode::Space(share,s) {
00105       x.update(*this, share, s.x);
00106     }
00108     virtual Gecode::Space* copy(bool share) {
00109       return new BoolTestSpace(share,*this);
00110     }
00111   };
00112 
00113 #ifdef GECODE_HAS_SET_VARS
00114 
00115   class SetTestSpace : public Gecode::Space {
00116   public:
00118     Gecode::SetVarArray x;
00120     SetTestSpace(int n, Gecode::IntSet& d)
00121       : x(*this, n, Gecode::IntSet::empty, d) {}
00123     SetTestSpace(bool share, SetTestSpace& s)
00124       : Gecode::Space(share,s) {
00125       x.update(*this, share, s.x);
00126     }
00128     virtual Gecode::Space* copy(bool share) {
00129       return new SetTestSpace(share,*this);
00130     }
00131   };
00132 #endif
00133 
00134 #ifdef GECODE_HAS_FLOAT_VARS
00135 
00136   class FloatTestSpace : public Gecode::Space {
00137   public:
00139     Gecode::FloatVarArray x;
00141     FloatTestSpace(int n, Gecode::FloatVal& d)
00142       : x(*this, n, d.min(), d.max()) {}
00144     FloatTestSpace(bool share, FloatTestSpace& s)
00145       : Gecode::Space(share,s) {
00146       x.update(*this, share, s.x);
00147     }
00149     virtual Gecode::Space* copy(bool share) {
00150       return new FloatTestSpace(share,*this);
00151     }
00152   };
00153 #endif
00154 
00160 
00161   const char* int_var_branch_name[] = {
00162     "SINGLE VARIABLE",
00163     "INT_VAR_NONE",
00164     "INT_VAR_RND",
00165     "INT_VAR_MERIT_MIN",
00166     "INT_VAR_MERIT_MAX",
00167     "INT_VAR_DEGREE_MIN",
00168     "INT_VAR_DEGREE_MAX",
00169     "INT_VAR_AFC_MIN",
00170     "INT_VAR_AFC_MAX",
00171     "INT_VAR_ACTION_MIN",
00172     "INT_VAR_ACTION_MAX",
00173     "INT_VAR_CHB_MIN",
00174     "INT_VAR_CHB_MAX",
00175     "INT_VAR_MIN_MIN",
00176     "INT_VAR_MIN_MAX",
00177     "INT_VAR_MAX_MIN",
00178     "INT_VAR_MAX_MAX",
00179     "INT_VAR_SIZE_MIN",
00180     "INT_VAR_SIZE_MAX",
00181     "INT_VAR_DEGREE_SIZE_MIN",
00182     "INT_VAR_DEGREE_SIZE_MAX",
00183     "INT_VAR_AFC_SIZE_MIN",
00184     "INT_VAR_AFC_SIZE_MAX",
00185     "INT_VAR_ACTION_SIZE_MIN",
00186     "INT_VAR_ACTION_SIZE_MAX",
00187     "INT_VAR_CHB_SIZE_MIN",
00188     "INT_VAR_CHB_SIZE_MAX",
00189     "INT_VAR_REGRET_MIN_MIN",
00190     "INT_VAR_REGRET_MIN_MAX",
00191     "INT_VAR_REGRET_MAX_MIN",
00192     "INT_VAR_REGRET_MAX_MAX"
00193   };
00195   const int n_int_var_branch =
00196     sizeof(int_var_branch_name)/sizeof(const char*);
00198   const char* bool_var_branch_name[] = {
00199     "SINGLE VARIABLE",
00200     "BOOL_VAR_NONE",
00201     "BOOL_VAR_RND",
00202     "BOOL_VAR_MERIT_MIN",
00203     "BOOL_VAR_MERIT_MAX",
00204     "BOOL_VAR_DEGREE_MIN",
00205     "BOOL_VAR_DEGREE_MAX",
00206     "BOOL_VAR_AFC_MIN",
00207     "BOOL_VAR_AFC_MAX",
00208     "BOOL_VAR_ACTION_MIN",
00209     "BOOL_VAR_ACTION_MAX",
00210     "BOOL_VAR_CHB_MIN",
00211     "BOOL_VAR_CHB_MAX"
00212   };
00214   const int n_bool_var_branch =
00215     sizeof(bool_var_branch_name)/sizeof(const char*);
00217   double int_merit(const Gecode::Space&, Gecode::IntVar x, int) {
00218     return x.min();
00219   }
00221   double bool_merit(const Gecode::Space&, Gecode::BoolVar x, int) {
00222     return x.min();
00223   }
00225   const char* int_val_branch_name[] = {
00226     "INT_VAL_MIN",
00227     "INT_VAL_MED",
00228     "INT_VAL_MAX",
00229     "INT_VAL_RND",
00230     "INT_VAL_SPLIT_MIN",
00231     "INT_VAL_SPLIT_MAX",
00232     "INT_VAL_RANGE_MIN",
00233     "INT_VAL_RANGE_MAX",
00234     "INT_VAL",
00235     "INT_VALUES_MIN",
00236     "INT_VALUES_MAX"
00237   };
00239   const int n_int_val_branch =
00240     sizeof(int_val_branch_name)/sizeof(const char*);
00242   const char* bool_val_branch_name[] = {
00243     "BOOL_VAL_MIN",
00244     "BOOL_VAL_MAX",
00245     "BOOL_VAL_RND",
00246     "BOOL_VAL"
00247   };
00249   const int n_bool_val_branch =
00250     sizeof(bool_val_branch_name)/sizeof(const char*);
00252   int int_val(const Gecode::Space&, Gecode::IntVar x, int) {
00253     return x.min();
00254   }
00256   int bool_val(const Gecode::Space&, Gecode::BoolVar x, int) {
00257     return x.min();
00258   }
00260 
00261 #ifdef GECODE_HAS_SET_VARS
00262 
00267 
00268   const char* set_var_branch_name[] = {
00269     "SINGLE VARIABLE",
00270     "SET_VAR_NONE",
00271     "SET_VAR_RND",
00272     "SET_VAR_MERIT_MIN",
00273     "SET_VAR_MERIT_MAX",
00274     "SET_VAR_DEGREE_MIN",
00275     "SET_VAR_DEGREE_MAX",
00276     "SET_VAR_AFC_MIN",
00277     "SET_VAR_AFC_MAX",
00278     "SET_VAR_ACTION_MIN",
00279     "SET_VAR_ACTION_MAX",
00280     "SET_VAR_CHB_MIN",
00281     "SET_VAR_CHB_MAX",
00282     "SET_VAR_MIN_MIN",
00283     "SET_VAR_MIN_MAX",
00284     "SET_VAR_MAX_MIN",
00285     "SET_VAR_MAX_MAX",
00286     "SET_VAR_SIZE_MIN",
00287     "SET_VAR_SIZE_MAX",
00288     "SET_VAR_DEGREE_SIZE_MIN",
00289     "SET_VAR_DEGREE_SIZE_MAX",
00290     "SET_VAR_AFC_SIZE_MIN",
00291     "SET_VAR_AFC_SIZE_MAX",
00292     "SET_VAR_ACTION_SIZE_MIN",
00293     "SET_VAR_ACTION_SIZE_MAX",
00294     "SET_VAR_CHB_SIZE_MIN",
00295     "SET_VAR_CHB_SIZE_MAX"
00296   };
00298   const int n_set_var_branch =
00299     sizeof(set_var_branch_name)/sizeof(const char*);
00301   double set_merit(const Gecode::Space&, Gecode::SetVar, int) {
00302     return 2.0;
00303   }
00305   const char* set_val_branch_name[] = {
00306     "SET_VAL_MIN_INC",
00307     "SET_VAL_MIN_EXC",
00308     "SET_VAL_MED_INC",
00309     "SET_VAL_MED_EXC",
00310     "SET_VAL_MAX_INC",
00311     "SET_VAL_MAX_EXC",
00312     "SET_VAL_RND_INC",
00313     "SET_VAL_RND_EXC",
00314     "SET_VAL"
00315   };
00317   const int n_set_val_branch =
00318     sizeof(set_val_branch_name)/sizeof(const char*);
00320   int set_val(const Gecode::Space&, Gecode::SetVar x, int) {
00321     Gecode::SetVarUnknownRanges r(x);
00322     return r.min();
00323   }
00325 #endif
00326 
00327 #ifdef GECODE_HAS_FLOAT_VARS
00328 
00333 
00334   const char* float_var_branch_name[] = {
00335     "SINGLE VARIABLE",
00336     "FLOAT_VAR_NONE",
00337     "FLOAT_VAR_RND",
00338     "FLOAT_VAR_MERIT_MIN",
00339     "FLOAT_VAR_MERIT_MAX",
00340     "FLOAT_VAR_DEGREE_MIN",
00341     "FLOAT_VAR_DEGREE_MAX",
00342     "FLOAT_VAR_AFC_MIN",
00343     "FLOAT_VAR_AFC_MAX",
00344     "FLOAT_VAR_ACTION_MIN",
00345     "FLOAT_VAR_ACTION_MAX",
00346     "FLOAT_VAR_CHB_MIN",
00347     "FLOAT_VAR_CHB_MAX",
00348     "FLOAT_VAR_MIN_MIN",
00349     "FLOAT_VAR_MIN_MAX",
00350     "FLOAT_VAR_MAX_MIN",
00351     "FLOAT_VAR_MAX_MAX",
00352     "FLOAT_VAR_SIZE_MIN",
00353     "FLOAT_VAR_SIZE_MAX",
00354     "FLOAT_VAR_DEGREE_SIZE_MIN",
00355     "FLOAT_VAR_DEGREE_SIZE_MAX",
00356     "FLOAT_VAR_AFC_SIZE_MIN",
00357     "FLOAT_VAR_AFC_SIZE_MAX",
00358     "FLOAT_VAR_ACTION_SIZE_MIN",
00359     "FLOAT_VAR_ACTION_SIZE_MAX",
00360     "FLOAT_VAR_CHB_SIZE_MIN",
00361     "FLOAT_VAR_CHB_SIZE_MAX"
00362   };
00364   const int n_float_var_branch =
00365     sizeof(float_var_branch_name)/sizeof(const char*);
00367   double float_merit(const Gecode::Space&, Gecode::FloatVar x, int) {
00368     return static_cast<double>(x.degree());
00369   }
00371   const char* float_val_branch_name[] = {
00372     "FLOAT_VAL_SPLIT_MIN",
00373     "FLOAT_VAL_SPLIT_MAX",
00374     "FLOAT_VAL_SPLIT_RND",
00375     "FLOAT_VAL"
00376   };
00378   const int n_float_val_branch =
00379     sizeof(float_val_branch_name)/sizeof(const char*);
00381   Gecode::FloatNumBranch float_val(const Gecode::Space&,
00382                                    Gecode::FloatVar x, int) {
00383     Gecode::FloatNumBranch nl; nl.n=x.med(); nl.l=true;
00384     return nl;
00385   }
00387 #endif
00388 
00390   class RunInfo {
00391   public:
00392     std::string var, val;
00393     unsigned int a_d, c_d;
00394     RunInfo(const std::string& vara, const std::string& varb,
00395             const std::string& valname,
00396             const Gecode::Search::Options& o)
00397       : var(vara + "::" + varb), val(valname), a_d(o.a_d), c_d(o.c_d) {}
00398     void print(std::ostream& o) const {
00399       o << "(" << var << ", " << val << ", " << a_d << ", " << c_d << ")";
00400     }
00401   };
00402 
00403 }}
00404 
00405 std::ostream&
00406 operator<<(std::ostream& os, const Test::Branch::RunInfo& ri) {
00407   ri.print(os);
00408   return os;
00409 }
00410 
00411 
00412 namespace Test { namespace Branch {
00413 
00415   template<class TestSpace>
00416   int solutions(TestSpace* c, Gecode::Search::Options& o, int maxNbSol = -1) {
00417     o.a_d = Base::rand(10);
00418     o.c_d = Base::rand(10);
00419     Gecode::DFS<TestSpace> e_s(c, o);
00420     delete c;
00421 
00422     // Find number of solutions
00423     int s = 0;
00424     do {
00425       Gecode::Space* ex = e_s.next();
00426       if (ex == NULL) break;
00427       delete ex;
00428       ++s;
00429       if ((maxNbSol >= 0) && (maxNbSol == s)) break;
00430     } while (true);
00431     return s;
00432   }
00433 
00434   IntTest::IntTest(const std::string& s, int a, const Gecode::IntSet& d)
00435     : Base("Int::Branch::"+s), arity(a), dom(d) {
00436   }
00437 
00438   bool
00439   IntTest::run(void) {
00440     using std::map;
00441     using std::vector;
00442     using std::string;
00443     using std::ostream;
00444     using namespace Gecode;
00445 
00446     // Results of tests run
00447     map<int, vector<RunInfo> > results;
00448     // Set up root space
00449     IntTestSpace* root = new IntTestSpace(arity,dom);
00450     post(*root, root->x);
00451     results.clear();
00452 
00453     IntArgs d(arity);
00454     for (int i=arity; i--; )
00455       d[i]=i;
00456 
00457     for (int vara = 0; vara<n_int_var_branch; vara++) {
00458       for (int varb = 1; varb<n_int_var_branch; varb++) {
00459         for (int val = 0; val<n_int_val_branch; val++) {
00460           Rnd r(1);
00461 
00462           IntValBranch ivb;
00463           switch (val) {
00464           case  0: ivb = INT_VAL_MIN(); break;
00465           case  1: ivb = INT_VAL_MED(); break;
00466           case  2: ivb = INT_VAL_MAX(); break;
00467           case  3: ivb = INT_VAL_RND(r); break;
00468           case  4: ivb = INT_VAL_SPLIT_MIN(); break;
00469           case  5: ivb = INT_VAL_SPLIT_MAX(); break;
00470           case  6: ivb = INT_VAL_RANGE_MIN(); break;
00471           case  7: ivb = INT_VAL_RANGE_MAX(); break;
00472           case  8: ivb = INT_VAL(&int_val); break;
00473           case  9: ivb = INT_VALUES_MIN(); break;
00474           case 10: ivb = INT_VALUES_MAX(); break;
00475           }
00476 
00477           IntTestSpace* c = static_cast<IntTestSpace*>(root->clone(false));
00478 
00479           if ((vara == 0) && (val < 11)) {
00480             for (int i=0; i<c->x.size(); i++)
00481               branch(*c, c->x[i], ivb);
00482           } else {
00483             Rnd ra(1);
00484             IntVarBranch ivba;
00485             IntAction iaa(*c, c->x, 0.9);
00486             IntCHB ica(*c, c->x);
00487             switch (vara) {
00488             case  0: ivba = INT_VAR_NONE(); break;
00489             case  1: ivba = INT_VAR_NONE(); break;
00490             case  2: ivba = INT_VAR_RND(ra); break;
00491             case  3: ivba = INT_VAR_MERIT_MIN(&int_merit); break;
00492             case  4: ivba = INT_VAR_MERIT_MAX(&int_merit); break;
00493             case  5: ivba = INT_VAR_DEGREE_MIN(); break;
00494             case  6: ivba = INT_VAR_DEGREE_MAX(); break;
00495             case  7: ivba = INT_VAR_AFC_MIN(0.5); break;
00496             case  8: ivba = INT_VAR_AFC_MAX(0.5); break;
00497             case  9: ivba = INT_VAR_ACTION_MIN(iaa); break;
00498             case 10: ivba = INT_VAR_ACTION_MAX(iaa); break;
00499             case 11: ivba = INT_VAR_CHB_MIN(ica); break;
00500             case 12: ivba = INT_VAR_CHB_MAX(ica); break;
00501             case 13: ivba = INT_VAR_MIN_MIN(); break;
00502             case 14: ivba = INT_VAR_MIN_MAX(); break;
00503             case 15: ivba = INT_VAR_MAX_MIN(); break;
00504             case 16: ivba = INT_VAR_MAX_MAX(); break;
00505             case 17: ivba = INT_VAR_SIZE_MIN(); break;
00506             case 18: ivba = INT_VAR_SIZE_MAX(); break;
00507             case 19: ivba = INT_VAR_DEGREE_SIZE_MIN(); break;
00508             case 20: ivba = INT_VAR_DEGREE_SIZE_MAX(); break;
00509             case 21: ivba = INT_VAR_AFC_SIZE_MIN(); break;
00510             case 22: ivba = INT_VAR_AFC_SIZE_MAX(); break;
00511             case 23: ivba = INT_VAR_ACTION_SIZE_MIN(iaa); break;
00512             case 24: ivba = INT_VAR_ACTION_SIZE_MAX(iaa); break;
00513             case 25: ivba = INT_VAR_CHB_SIZE_MIN(ica); break;
00514             case 26: ivba = INT_VAR_CHB_SIZE_MAX(ica); break;
00515             case 27: ivba = INT_VAR_REGRET_MIN_MIN(); break;
00516             case 28: ivba = INT_VAR_REGRET_MIN_MAX(); break;
00517             case 29: ivba = INT_VAR_REGRET_MAX_MIN(); break;
00518             case 30: ivba = INT_VAR_REGRET_MAX_MAX(); break;
00519             }
00520 
00521             Rnd rb(2);
00522             IntVarBranch ivbb;
00523             IntAction iab(*c, c->x, 0.9, &int_merit);
00524             IntCHB icb(*c, c->x, &int_merit);
00525             switch (varb) {
00526             case  0: ivbb = INT_VAR_NONE(); break;
00527             case  1: ivbb = INT_VAR_NONE(); break;
00528             case  2: ivbb = INT_VAR_RND(rb); break;
00529             case  3: ivbb = INT_VAR_MERIT_MIN(&int_merit,&tbl); break;
00530             case  4: ivbb = INT_VAR_MERIT_MAX(&int_merit,&tbl); break;
00531             case  5: ivbb = INT_VAR_DEGREE_MIN(&tbl); break;
00532             case  6: ivbb = INT_VAR_DEGREE_MAX(&tbl); break;
00533             case  7: ivbb = INT_VAR_AFC_MIN(0.5,&tbl); break;
00534             case  8: ivbb = INT_VAR_AFC_MAX(0.5,&tbl); break;
00535             case  9: ivbb = INT_VAR_ACTION_MIN(iab,&tbl); break;
00536             case 10: ivbb = INT_VAR_ACTION_MAX(iab,&tbl); break;
00537             case 11: ivbb = INT_VAR_CHB_MIN(icb,&tbl); break;
00538             case 12: ivbb = INT_VAR_CHB_MAX(icb,&tbl); break;
00539             case 13: ivbb = INT_VAR_MIN_MIN(&tbl); break;
00540             case 14: ivbb = INT_VAR_MIN_MAX(&tbl); break;
00541             case 15: ivbb = INT_VAR_MAX_MIN(&tbl); break;
00542             case 16: ivbb = INT_VAR_MAX_MAX(&tbl); break;
00543             case 17: ivbb = INT_VAR_SIZE_MIN(&tbl); break;
00544             case 18: ivbb = INT_VAR_SIZE_MAX(&tbl); break;
00545             case 19: ivbb = INT_VAR_DEGREE_SIZE_MIN(&tbl); break;
00546             case 20: ivbb = INT_VAR_DEGREE_SIZE_MAX(&tbl); break;
00547             case 21: ivbb = INT_VAR_AFC_SIZE_MIN(1.0,&tbl); break;
00548             case 22: ivbb = INT_VAR_AFC_SIZE_MAX(1.0,&tbl); break;
00549             case 23: ivbb = INT_VAR_ACTION_SIZE_MIN(iab,&tbl); break;
00550             case 24: ivbb = INT_VAR_ACTION_SIZE_MAX(iab,&tbl); break;
00551             case 25: ivbb = INT_VAR_CHB_SIZE_MIN(icb,&tbl); break;
00552             case 26: ivbb = INT_VAR_CHB_SIZE_MAX(icb,&tbl); break;
00553             case 27: ivbb = INT_VAR_REGRET_MIN_MIN(&tbl); break;
00554             case 28: ivbb = INT_VAR_REGRET_MIN_MAX(&tbl); break;
00555             case 29: ivbb = INT_VAR_REGRET_MAX_MIN(&tbl); break;
00556             case 30: ivbb = INT_VAR_REGRET_MAX_MAX(&tbl); break;
00557             }
00558 
00559             switch (Base::rand(9U)) {
00560             case 0U:
00561               branch(*c, c->x, ivba, ivb); break;
00562             case 1U:
00563               branch(*c, c->x, ivbb, ivb); break;
00564             case 2U:
00565               branch(*c, c->x, tiebreak(ivba,ivbb), ivb); break;
00566             case 3U:
00567               branch(*c, c->x, tiebreak(ivbb,ivba), ivb); break;
00568             case 4U:
00569               branch(*c, c->x, tiebreak(ivba,ivba,ivbb), ivb); break;
00570             case 5U:
00571               branch(*c, c->x, tiebreak(ivba,ivbb,ivbb), ivb); break;
00572             case 6U:
00573               branch(*c, c->x, tiebreak(ivbb,ivba,ivba), ivb); break;
00574             case 7U:
00575               branch(*c, c->x, tiebreak(ivba,ivba,ivbb,ivba), ivb); break;
00576             case 8U:
00577               branch(*c, c->x, tiebreak(ivbb,ivba,ivbb,ivba), ivb); break;
00578             }
00579 
00580           }
00581           Gecode::Search::Options o;
00582           results[solutions(c,o)].push_back
00583             (RunInfo(int_var_branch_name[vara],
00584                      int_var_branch_name[varb],
00585                      int_val_branch_name[val],
00586                      o));
00587         }
00588       }
00589     }
00590     if (results.size() > 1)
00591       goto failed;
00592     delete root;
00593     return true;
00594   failed:
00595     std::cout   << "FAILURE" << std::endl;
00596     for (map<int, vector<RunInfo> >::iterator it = results.begin();
00597          it != results.end(); ++it) {
00598       std::cout << "Number of solutions: " << it->first << std::endl;
00599       for (unsigned int i = 0; i < it->second.size(); ++i)
00600         std::cout << it->second[i] << " ";
00601       std::cout << std::endl;
00602     }
00603 
00604     delete root;
00605     return results.size() == 1;
00606   }
00607 
00608   BoolTest::BoolTest(const std::string& s, int a)
00609     : Base("Bool::Branch::"+s), arity(a) {
00610   }
00611 
00612   bool
00613   BoolTest::run(void) {
00614     using std::map;
00615     using std::vector;
00616     using std::string;
00617     using std::ostream;
00618     using namespace Gecode;
00619 
00620     // Results of tests run
00621     map<int, vector<RunInfo> > results;
00622     // Set up root space
00623     BoolTestSpace* root = new BoolTestSpace(arity);
00624     post(*root, root->x);
00625     results.clear();
00626 
00627     for (int vara = 0; vara<n_bool_var_branch; vara++) {
00628       for (int varb = 1; varb<n_bool_var_branch; varb++) {
00629         for (int val = 0; val<n_bool_val_branch; val++) {
00630 
00631           Rnd r(1);
00632 
00633           BoolValBranch bvb;
00634           switch (val) {
00635           case  0: bvb = BOOL_VAL_MIN(); break;
00636           case  1: bvb = BOOL_VAL_MAX(); break;
00637           case  2: bvb = BOOL_VAL_RND(r); break;
00638           case  3: bvb = BOOL_VAL(&bool_val); break;
00639           }
00640 
00641           BoolTestSpace* c = static_cast<BoolTestSpace*>(root->clone(false));
00642 
00643           if (vara == 0) {
00644             for (int i=0; i<c->x.size(); i++)
00645               branch(*c, c->x[i], bvb);
00646           } else {
00647 
00648 
00649             Rnd ra(1);
00650             BoolVarBranch bvba;
00651             BoolAction baa(*c, c->x, 0.9);
00652             BoolCHB bca(*c, c->x);
00653             switch (vara) {
00654             case  0: bvba = BOOL_VAR_NONE(); break;
00655             case  1: bvba = BOOL_VAR_NONE(); break;
00656             case  2: bvba = BOOL_VAR_RND(ra); break;
00657             case  3: bvba = BOOL_VAR_MERIT_MIN(&bool_merit); break;
00658             case  4: bvba = BOOL_VAR_MERIT_MAX(&bool_merit); break;
00659             case  5: bvba = BOOL_VAR_DEGREE_MIN(); break;
00660             case  6: bvba = BOOL_VAR_DEGREE_MAX(); break;
00661             case  7: bvba = BOOL_VAR_AFC_MIN(0.5); break;
00662             case  8: bvba = BOOL_VAR_AFC_MAX(0.5); break;
00663             case  9: bvba = BOOL_VAR_ACTION_MIN(baa); break;
00664             case 10: bvba = BOOL_VAR_ACTION_MAX(baa); break;
00665             case 11: bvba = BOOL_VAR_CHB_MIN(bca); break;
00666             case 12: bvba = BOOL_VAR_CHB_MAX(bca); break;
00667             }
00668 
00669             Rnd rb(2);
00670             BoolVarBranch bvbb;
00671             BoolAction bab(*c, c->x, 0.9, &bool_merit);
00672             BoolCHB bcb(*c, c->x, &bool_merit);
00673             switch (varb) {
00674             case  0: bvbb = BOOL_VAR_NONE(); break;
00675             case  1: bvbb = BOOL_VAR_NONE(); break;
00676             case  2: bvbb = BOOL_VAR_RND(rb); break;
00677             case  3: bvbb = BOOL_VAR_MERIT_MIN(&bool_merit,&tbl); break;
00678             case  4: bvbb = BOOL_VAR_MERIT_MAX(&bool_merit,&tbl); break;
00679             case  5: bvbb = BOOL_VAR_DEGREE_MIN(&tbl); break;
00680             case  6: bvbb = BOOL_VAR_DEGREE_MAX(&tbl); break;
00681             case  7: bvbb = BOOL_VAR_AFC_MIN(0.5,&tbl); break;
00682             case  8: bvbb = BOOL_VAR_AFC_MAX(0.5,&tbl); break;
00683             case  9: bvbb = BOOL_VAR_ACTION_MIN(bab,&tbl); break;
00684             case 10: bvbb = BOOL_VAR_ACTION_MAX(bab,&tbl); break;
00685             case 11: bvbb = BOOL_VAR_CHB_MIN(bcb,&tbl); break;
00686             case 12: bvbb = BOOL_VAR_CHB_MAX(bcb,&tbl); break;
00687             }
00688 
00689             switch (Base::rand(9U)) {
00690             case 0U:
00691               branch(*c, c->x, bvba, bvb); break;
00692             case 1U:
00693               branch(*c, c->x, bvbb, bvb); break;
00694             case 2U:
00695               branch(*c, c->x, tiebreak(bvba,bvbb), bvb); break;
00696             case 3U:
00697               branch(*c, c->x, tiebreak(bvbb,bvba), bvb); break;
00698             case 4U:
00699               branch(*c, c->x, tiebreak(bvba,bvba,bvbb), bvb); break;
00700             case 5U:
00701               branch(*c, c->x, tiebreak(bvba,bvbb,bvbb), bvb); break;
00702             case 6U:
00703               branch(*c, c->x, tiebreak(bvbb,bvba,bvba), bvb); break;
00704             case 7U:
00705               branch(*c, c->x, tiebreak(bvba,bvba,bvbb,bvba), bvb); break;
00706             case 8U:
00707               branch(*c, c->x, tiebreak(bvbb,bvba,bvbb,bvba), bvb); break;
00708             }
00709 
00710           }
00711           Gecode::Search::Options o;
00712           results[solutions(c,o)].push_back
00713             (RunInfo(int_var_branch_name[vara],
00714                      int_var_branch_name[varb],
00715                      int_val_branch_name[val],
00716                      o));
00717         }
00718       }
00719     }
00720     if (results.size() > 1)
00721       goto failed;
00722     delete root;
00723     return true;
00724   failed:
00725     std::cout   << "FAILURE" << std::endl;
00726     for (map<int, vector<RunInfo> >::iterator it = results.begin();
00727          it != results.end(); ++it) {
00728       std::cout << "Number of solutions: " << it->first << std::endl;
00729       for (unsigned int i = 0; i < it->second.size(); ++i)
00730         std::cout << it->second[i] << " ";
00731       std::cout << std::endl;
00732     }
00733 
00734     delete root;
00735     return results.size() == 1;
00736   }
00737 
00738 #ifdef GECODE_HAS_SET_VARS
00739   SetTest::SetTest(const std::string& s, int a, const Gecode::IntSet& d)
00740     : Base("Set::Branch::"+s), arity(a), dom(d) {
00741   }
00742 
00743   bool
00744   SetTest::run(void) {
00745     using std::map;
00746     using std::vector;
00747     using std::string;
00748     using std::ostream;
00749     using namespace Gecode;
00750 
00751     // Results of tests run
00752     map<int, vector<RunInfo> > results;
00753     // Set up root space
00754     SetTestSpace* root = new SetTestSpace(arity,dom);
00755     post(*root, root->x);
00756     root->status();
00757     results.clear();
00758 
00759     for (int vara = 0; vara<n_set_var_branch; vara++) {
00760       for (int varb = 1; varb<n_set_var_branch; varb++) {
00761         for (int val = 0; val<n_set_val_branch; val++) {
00762           Rnd r(1);
00763 
00764           SetValBranch svb;
00765           switch (val) {
00766           case 0: svb = SET_VAL_MIN_INC(); break;
00767           case 1: svb = SET_VAL_MIN_EXC(); break;
00768           case 2: svb = SET_VAL_MED_INC(); break;
00769           case 3: svb = SET_VAL_MED_EXC(); break;
00770           case 4: svb = SET_VAL_MAX_INC(); break;
00771           case 5: svb = SET_VAL_MAX_EXC(); break;
00772           case 6: svb = SET_VAL_RND_INC(r); break;
00773           case 7: svb = SET_VAL_RND_EXC(r); break;
00774           case 8: svb = SET_VAL(&set_val); break;
00775           }
00776 
00777           SetTestSpace* c = static_cast<SetTestSpace*>(root->clone(false));
00778 
00779           if (vara == 0) {
00780             for (int i=0; i<c->x.size(); i++)
00781               branch(*c, c->x[i], svb);
00782           } else {
00783             Rnd ra(1);
00784             SetVarBranch svba;
00785             SetAction saa(*c, c->x, 0.9);
00786             SetCHB sca(*c, c->x);
00787             switch (vara) {
00788             case  0: break;
00789             case  1: svba = SET_VAR_NONE(); break;
00790             case  2: svba = SET_VAR_RND(ra); break;
00791             case  3: svba = SET_VAR_MERIT_MIN(&set_merit); break;
00792             case  4: svba = SET_VAR_MERIT_MAX(&set_merit); break;
00793             case  5: svba = SET_VAR_DEGREE_MIN(); break;
00794             case  6: svba = SET_VAR_DEGREE_MAX(); break;
00795             case  7: svba = SET_VAR_AFC_MIN(0.5); break;
00796             case  8: svba = SET_VAR_AFC_MAX(0.5); break;
00797             case  9: svba = SET_VAR_ACTION_MIN(saa); break;
00798             case 10: svba = SET_VAR_ACTION_MAX(saa); break;
00799             case 11: svba = SET_VAR_CHB_MIN(sca); break;
00800             case 12: svba = SET_VAR_CHB_MAX(sca); break;
00801             case 13: svba = SET_VAR_MIN_MIN(); break;
00802             case 14: svba = SET_VAR_MIN_MAX(); break;
00803             case 15: svba = SET_VAR_MAX_MIN(); break;
00804             case 16: svba = SET_VAR_MAX_MAX(); break;
00805             case 17: svba = SET_VAR_SIZE_MIN(); break;
00806             case 18: svba = SET_VAR_SIZE_MAX(); break;
00807             case 19: svba = SET_VAR_DEGREE_SIZE_MIN(); break;
00808             case 20: svba = SET_VAR_DEGREE_SIZE_MAX(); break;
00809             case 21: svba = SET_VAR_AFC_SIZE_MIN(); break;
00810             case 22: svba = SET_VAR_AFC_SIZE_MAX(); break;
00811             case 23: svba = SET_VAR_ACTION_SIZE_MIN(saa); break;
00812             case 24: svba = SET_VAR_ACTION_SIZE_MAX(saa); break;
00813             case 25: svba = SET_VAR_CHB_SIZE_MIN(sca); break;
00814             case 26: svba = SET_VAR_CHB_SIZE_MAX(sca); break;
00815             }
00816 
00817             Rnd rb(2);
00818             SetVarBranch svbb;
00819             SetAction sab(*c, c->x, 0.9, &set_merit);
00820             SetCHB scb(*c, c->x, &set_merit);
00821             switch (varb) {
00822             case  0: break;
00823             case  1: svbb = SET_VAR_NONE(); break;
00824             case  2: svbb = SET_VAR_RND(rb); break;
00825             case  3: svbb = SET_VAR_MERIT_MIN(&set_merit,&tbl); break;
00826             case  4: svbb = SET_VAR_MERIT_MAX(&set_merit,&tbl); break;
00827             case  5: svbb = SET_VAR_DEGREE_MIN(&tbl); break;
00828             case  6: svbb = SET_VAR_DEGREE_MAX(&tbl); break;
00829             case  7: svbb = SET_VAR_AFC_MIN(0.5,&tbl); break;
00830             case  8: svbb = SET_VAR_AFC_MAX(0.5,&tbl); break;
00831             case  9: svbb = SET_VAR_ACTION_MIN(sab,&tbl); break;
00832             case 10: svbb = SET_VAR_ACTION_MAX(sab,&tbl); break;
00833             case 11: svbb = SET_VAR_CHB_MIN(scb,&tbl); break;
00834             case 12: svbb = SET_VAR_CHB_MAX(scb,&tbl); break;
00835             case 13: svbb = SET_VAR_MIN_MIN(&tbl); break;
00836             case 14: svbb = SET_VAR_MIN_MAX(&tbl); break;
00837             case 15: svbb = SET_VAR_MAX_MIN(&tbl); break;
00838             case 16: svbb = SET_VAR_MAX_MAX(&tbl); break;
00839             case 17: svbb = SET_VAR_SIZE_MIN(&tbl); break;
00840             case 18: svbb = SET_VAR_SIZE_MAX(&tbl); break;
00841             case 19: svbb = SET_VAR_DEGREE_SIZE_MIN(&tbl); break;
00842             case 20: svbb = SET_VAR_DEGREE_SIZE_MAX(&tbl); break;
00843             case 21: svbb = SET_VAR_AFC_SIZE_MIN(1.0,&tbl); break;
00844             case 22: svbb = SET_VAR_AFC_SIZE_MAX(1.0,&tbl); break;
00845             case 23: svbb = SET_VAR_ACTION_SIZE_MIN(sab,&tbl); break;
00846             case 24: svbb = SET_VAR_ACTION_SIZE_MAX(sab,&tbl); break;
00847             case 25: svbb = SET_VAR_CHB_SIZE_MIN(scb,&tbl); break;
00848             case 26: svbb = SET_VAR_CHB_SIZE_MAX(scb,&tbl); break;
00849             }
00850 
00851             switch (Base::rand(9U)) {
00852             case 0U:
00853               branch(*c, c->x, svba, svb); break;
00854             case 1U:
00855               branch(*c, c->x, svbb, svb); break;
00856             case 2U:
00857               branch(*c, c->x, tiebreak(svba,svbb), svb); break;
00858             case 3U:
00859               branch(*c, c->x, tiebreak(svbb,svba), svb); break;
00860             case 4U:
00861               branch(*c, c->x, tiebreak(svba,svba,svbb), svb); break;
00862             case 5U:
00863               branch(*c, c->x, tiebreak(svba,svbb,svbb), svb); break;
00864             case 6U:
00865               branch(*c, c->x, tiebreak(svbb,svba,svba), svb); break;
00866             case 7U:
00867               branch(*c, c->x, tiebreak(svba,svba,svbb,svba), svb); break;
00868             case 8U:
00869               branch(*c, c->x, tiebreak(svbb,svba,svbb,svba), svb); break;
00870             }
00871 
00872           }
00873           Gecode::Search::Options o;
00874           results[solutions(c,o)].push_back
00875             (RunInfo(set_var_branch_name[vara],
00876                      set_var_branch_name[varb],
00877                      set_val_branch_name[val],
00878                      o));
00879         }
00880       }
00881     }
00882     if (results.size() > 1)
00883       goto failed;
00884     delete root;
00885     return true;
00886   failed:
00887     std::cout   << "FAILURE" << std::endl;
00888     for (map<int, vector<RunInfo> >::iterator it = results.begin();
00889          it != results.end(); ++it) {
00890       std::cout << "Number of solutions: " << it->first << std::endl;
00891       for (unsigned int i = 0; i < it->second.size(); ++i)
00892         std::cout << it->second[i] << " ";
00893       std::cout << std::endl;
00894     }
00895 
00896     delete root;
00897     return results.size() == 1;
00898   }
00899 #endif
00900 
00901 #ifdef GECODE_HAS_FLOAT_VARS
00902   FloatTest::FloatTest(const std::string& s, int a, const Gecode::FloatVal& d, int nbs)
00903     : Base("Float::Branch::"+s), arity(a), dom(d), nbSols(nbs) {
00904   }
00905 
00906   bool
00907   FloatTest::run(void) {
00908     using std::map;
00909     using std::vector;
00910     using std::string;
00911     using std::ostream;
00912     using namespace Gecode;
00913 
00914     // Results of tests run
00915     map<int, vector<RunInfo> > results;
00916     // Set up root space
00917     FloatTestSpace* root = new FloatTestSpace(arity,dom);
00918     post(*root, root->x);
00919     root->status();
00920     results.clear();
00921 
00922     for (int vara = 0; vara<n_float_var_branch; vara++) {
00923       for (int varb = 1; varb<n_float_var_branch; varb++) {
00924         for (int val = 0; val<n_float_val_branch; val++) {
00925           Rnd r(1);
00926 
00927           FloatValBranch fvb;
00928           switch (val) {
00929           case 0: fvb = FLOAT_VAL_SPLIT_MIN(); break;
00930           case 1: fvb = FLOAT_VAL_SPLIT_MAX(); break;
00931           case 2: fvb = FLOAT_VAL_SPLIT_RND(r); break;
00932           case 3: fvb = FLOAT_VAL(&float_val); break;
00933           }
00934 
00935           FloatTestSpace* c = static_cast<FloatTestSpace*>(root->clone(false));
00936           if (vara == 0) {
00937             for (int i=0; i<c->x.size(); i++)
00938               branch(*c, c->x[i], fvb);
00939           } else {
00940             Rnd ra(1);
00941             FloatVarBranch fvba;
00942             FloatAction faa(*c, c->x, 0.9);
00943             FloatCHB fca(*c, c->x);
00944             switch (vara) {
00945             case  0: break;
00946             case  1: fvba = FLOAT_VAR_NONE(); break;
00947             case  2: fvba = FLOAT_VAR_RND(ra); break;
00948             case  3: fvba = FLOAT_VAR_MERIT_MIN(&float_merit); break;
00949             case  4: fvba = FLOAT_VAR_MERIT_MAX(&float_merit); break;
00950             case  5: fvba = FLOAT_VAR_DEGREE_MIN(); break;
00951             case  6: fvba = FLOAT_VAR_DEGREE_MAX(); break;
00952             case  7: fvba = FLOAT_VAR_AFC_MIN(0.5); break;
00953             case  8: fvba = FLOAT_VAR_AFC_MAX(0.5); break;
00954             case  9: fvba = FLOAT_VAR_ACTION_MIN(faa); break;
00955             case 10: fvba = FLOAT_VAR_ACTION_MAX(faa); break;
00956             case 11: fvba = FLOAT_VAR_CHB_MIN(fca); break;
00957             case 12: fvba = FLOAT_VAR_CHB_MAX(fca); break;
00958             case 13: fvba = FLOAT_VAR_MIN_MIN(); break;
00959             case 14: fvba = FLOAT_VAR_MIN_MAX(); break;
00960             case 15: fvba = FLOAT_VAR_MAX_MIN(); break;
00961             case 16: fvba = FLOAT_VAR_MAX_MAX(); break;
00962             case 17: fvba = FLOAT_VAR_SIZE_MIN(); break;
00963             case 18: fvba = FLOAT_VAR_SIZE_MAX(); break;
00964             case 19: fvba = FLOAT_VAR_DEGREE_SIZE_MIN(); break;
00965             case 20: fvba = FLOAT_VAR_DEGREE_SIZE_MAX(); break;
00966             case 21: fvba = FLOAT_VAR_AFC_SIZE_MIN(); break;
00967             case 22: fvba = FLOAT_VAR_AFC_SIZE_MAX(); break;
00968             case 23: fvba = FLOAT_VAR_ACTION_SIZE_MIN(faa); break;
00969             case 24: fvba = FLOAT_VAR_ACTION_SIZE_MAX(faa); break;
00970             case 25: fvba = FLOAT_VAR_CHB_SIZE_MIN(fca); break;
00971             case 26: fvba = FLOAT_VAR_CHB_SIZE_MAX(fca); break;
00972             }
00973 
00974             Rnd rb(2);
00975             FloatVarBranch fvbb;
00976             FloatAction fab(*c, c->x, 0.9, &float_merit);
00977             FloatCHB fcb(*c, c->x, &float_merit);
00978             switch (varb) {
00979             case  0: break;
00980             case  1: fvbb = FLOAT_VAR_NONE(); break;
00981             case  2: fvbb = FLOAT_VAR_RND(rb); break;
00982             case  3: fvbb = FLOAT_VAR_MERIT_MIN(&float_merit,&tbl); break;
00983             case  4: fvbb = FLOAT_VAR_MERIT_MAX(&float_merit,&tbl); break;
00984             case  5: fvbb = FLOAT_VAR_DEGREE_MIN(&tbl); break;
00985             case  6: fvbb = FLOAT_VAR_DEGREE_MAX(&tbl); break;
00986             case  7: fvbb = FLOAT_VAR_AFC_MIN(0.5,&tbl); break;
00987             case  8: fvbb = FLOAT_VAR_AFC_MAX(0.5,&tbl); break;
00988             case  9: fvbb = FLOAT_VAR_ACTION_MIN(fab,&tbl); break;
00989             case 10: fvbb = FLOAT_VAR_ACTION_MAX(fab,&tbl); break;
00990             case 11: fvbb = FLOAT_VAR_CHB_MIN(fcb,&tbl); break;
00991             case 12: fvbb = FLOAT_VAR_CHB_MAX(fcb,&tbl); break;
00992             case 13: fvbb = FLOAT_VAR_MIN_MIN(&tbl); break;
00993             case 14: fvbb = FLOAT_VAR_MIN_MAX(&tbl); break;
00994             case 15: fvbb = FLOAT_VAR_MAX_MIN(&tbl); break;
00995             case 16: fvbb = FLOAT_VAR_MAX_MAX(&tbl); break;
00996             case 17: fvbb = FLOAT_VAR_SIZE_MIN(&tbl); break;
00997             case 18: fvbb = FLOAT_VAR_SIZE_MAX(&tbl); break;
00998             case 19: fvbb = FLOAT_VAR_DEGREE_SIZE_MIN(&tbl); break;
00999             case 20: fvbb = FLOAT_VAR_DEGREE_SIZE_MAX(&tbl); break;
01000             case 21: fvbb = FLOAT_VAR_AFC_SIZE_MIN(1.0,&tbl); break;
01001             case 22: fvbb = FLOAT_VAR_AFC_SIZE_MAX(1.0,&tbl); break;
01002             case 23: fvbb = FLOAT_VAR_ACTION_SIZE_MIN(fab,&tbl); break;
01003             case 24: fvbb = FLOAT_VAR_ACTION_SIZE_MAX(fab,&tbl); break;
01004             case 25: fvbb = FLOAT_VAR_CHB_SIZE_MIN(fcb,&tbl); break;
01005             case 26: fvbb = FLOAT_VAR_CHB_SIZE_MAX(fcb,&tbl); break;
01006             }
01007 
01008             switch (Base::rand(9U)) {
01009             case 0U:
01010               branch(*c, c->x, fvba, fvb); break;
01011             case 1U:
01012               branch(*c, c->x, fvbb, fvb); break;
01013             case 2U:
01014               branch(*c, c->x, tiebreak(fvba,fvbb), fvb); break;
01015             case 3U:
01016               branch(*c, c->x, tiebreak(fvbb,fvba), fvb); break;
01017             case 4U:
01018               branch(*c, c->x, tiebreak(fvba,fvba,fvbb), fvb); break;
01019             case 5U:
01020               branch(*c, c->x, tiebreak(fvba,fvbb,fvbb), fvb); break;
01021             case 6U:
01022               branch(*c, c->x, tiebreak(fvbb,fvba,fvba), fvb); break;
01023             case 7U:
01024               branch(*c, c->x, tiebreak(fvba,fvba,fvbb,fvba), fvb); break;
01025             case 8U:
01026               branch(*c, c->x, tiebreak(fvbb,fvba,fvbb,fvba), fvb); break;
01027             }
01028 
01029           }
01030           Gecode::Search::Options o;
01031           results[solutions(c,o,nbSols)].push_back
01032             (RunInfo(float_var_branch_name[vara],
01033                      float_var_branch_name[varb],
01034                      float_val_branch_name[val],
01035                      o));
01036         }
01037       }
01038     }
01039     if (results.size() > 1)
01040       goto failed;
01041     delete root;
01042     return true;
01043   failed:
01044     std::cout   << "FAILURE" << std::endl;
01045     for (map<int, vector<RunInfo> >::iterator it = results.begin();
01046          it != results.end(); ++it) {
01047       std::cout << "Number of solutions: " << it->first << std::endl;
01048       for (unsigned int i = 0; i < it->second.size(); ++i)
01049         std::cout << it->second[i] << " ";
01050       std::cout << std::endl;
01051     }
01052 
01053     delete root;
01054     return results.size() == 1;
01055   }
01056 #endif
01057 
01058 }}
01059 
01060 // STATISTICS: test-branch