00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <ctime>
00039
00040 namespace Gecode {
00041
00054 class VarBranchOptions {
00055 public:
00057 unsigned int seed;
00059 GECODE_KERNEL_EXPORT static const VarBranchOptions def;
00061 VarBranchOptions(void);
00063 static VarBranchOptions time(void);
00064 };
00065
00069 class ValBranchOptions {
00070 public:
00072 unsigned int seed;
00074 GECODE_KERNEL_EXPORT static const ValBranchOptions def;
00076 ValBranchOptions(void);
00078 static ValBranchOptions time(void);
00079 };
00080
00081
00083 template<class VarBranch>
00084 class TieBreakVarBranch {
00085 public:
00087 VarBranch a, b, c, d;
00089 TieBreakVarBranch(VarBranch a0 = static_cast<VarBranch>(0),
00090 VarBranch b0 = static_cast<VarBranch>(0),
00091 VarBranch c0 = static_cast<VarBranch>(0),
00092 VarBranch d0 = static_cast<VarBranch>(0));
00093 };
00094
00096 class TieBreakVarBranchOptions {
00097 public:
00099 VarBranchOptions a, b, c, d;
00101 GECODE_KERNEL_EXPORT static const TieBreakVarBranchOptions def;
00103 TieBreakVarBranchOptions(const VarBranchOptions& a0
00104 = VarBranchOptions::def,
00105 const VarBranchOptions& b0
00106 = VarBranchOptions::def,
00107 const VarBranchOptions& c0
00108 = VarBranchOptions::def,
00109 const VarBranchOptions& d0
00110 = VarBranchOptions::def);
00111 };
00112
00119
00120 template<class VarBranch>
00121 TieBreakVarBranch<VarBranch>
00122 tiebreak(VarBranch a, VarBranch b);
00124 template<class VarBranch>
00125 TieBreakVarBranch<VarBranch>
00126 tiebreak(VarBranch a, VarBranch b, VarBranch c);
00128 template<class VarBranch>
00129 TieBreakVarBranch<VarBranch>
00130 tiebreak(VarBranch a, VarBranch b, VarBranch c, VarBranch d);
00132 TieBreakVarBranchOptions
00133 tiebreak(VarBranchOptions a, VarBranchOptions b);
00135 TieBreakVarBranchOptions
00136 tiebreak(VarBranchOptions a, VarBranchOptions b, VarBranchOptions c);
00138 TieBreakVarBranchOptions
00139 tiebreak(VarBranchOptions a, VarBranchOptions b, VarBranchOptions c,
00140 VarBranchOptions d);
00142
00154
00155 GECODE_KERNEL_EXPORT void
00156 branch(Home home, void (*f)(Space& home));
00158
00159
00160
00161 forceinline
00162 VarBranchOptions::VarBranchOptions(void) : seed(0) {}
00163 forceinline VarBranchOptions
00164 VarBranchOptions::time(void) {
00165 VarBranchOptions o; o.seed=static_cast<unsigned int>(::time(NULL));
00166 return o;
00167 }
00168
00169
00170 forceinline
00171 ValBranchOptions::ValBranchOptions(void) : seed(0) {}
00172 forceinline ValBranchOptions
00173 ValBranchOptions::time(void) {
00174 ValBranchOptions o; o.seed=static_cast<unsigned int>(::time(NULL));
00175 return o;
00176 }
00177
00178
00179
00180
00181
00182 template<class VarBranch>
00183 forceinline
00184 TieBreakVarBranch<VarBranch>::TieBreakVarBranch(VarBranch a0,
00185 VarBranch b0,
00186 VarBranch c0,
00187 VarBranch d0)
00188 : a(a0), b(b0), c(c0), d(d0) {}
00189
00190 template<class VarBranch>
00191 forceinline TieBreakVarBranch<VarBranch>
00192 tiebreak(VarBranch a, VarBranch b) {
00193 TieBreakVarBranch<VarBranch> ab(a,b);
00194 return ab;
00195 }
00196
00197 template<class VarBranch>
00198 forceinline TieBreakVarBranch<VarBranch>
00199 tiebreak(VarBranch a, VarBranch b, VarBranch c) {
00200 TieBreakVarBranch<VarBranch> abc(a,b,c);
00201 return abc;
00202 }
00203
00204 template<class VarBranch>
00205 forceinline TieBreakVarBranch<VarBranch>
00206 tiebreak(VarBranch a, VarBranch b, VarBranch c, VarBranch d) {
00207 TieBreakVarBranch<VarBranch> abcd(a,b,c,d);
00208 return abcd;
00209 }
00210
00211
00212
00213
00214 forceinline
00215 TieBreakVarBranchOptions::
00216 TieBreakVarBranchOptions(const VarBranchOptions& a0,
00217 const VarBranchOptions& b0,
00218 const VarBranchOptions& c0,
00219 const VarBranchOptions& d0)
00220 : a(a0), b(b0), c(c0), d(d0) {}
00221
00222 forceinline TieBreakVarBranchOptions
00223 tiebreak(VarBranchOptions a, VarBranchOptions b) {
00224 TieBreakVarBranchOptions ab(a,b);
00225 return ab;
00226 }
00227
00228 forceinline TieBreakVarBranchOptions
00229 tiebreak(VarBranchOptions a, VarBranchOptions b, VarBranchOptions c) {
00230 TieBreakVarBranchOptions abc(a,b,c);
00231 return abc;
00232 }
00233
00234 forceinline TieBreakVarBranchOptions
00235 tiebreak(VarBranchOptions a, VarBranchOptions b, VarBranchOptions c,
00236 VarBranchOptions d) {
00237 TieBreakVarBranchOptions abcd(a,b,c,d);
00238 return abcd;
00239 }
00240
00241 }
00242
00243