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
00039
00040
00041
00042 #include <gecode/int/branch.hh>
00043
00044 namespace Gecode { namespace Int { namespace Branch {
00045
00047 void
00048 virtualize(Gecode::Space& home, IntVarBranch vars,
00049 const Gecode::VarBranchOptions& o_vars,
00050 Gecode::ViewSelVirtualBase<BoolView>*& v) {
00051 switch (vars) {
00052 case INT_VAR_RND:
00053 v = new (home) ViewSelVirtual<ViewSelRnd<BoolView> >(home,o_vars);
00054 break;
00055 case INT_VAR_MIN_MIN:
00056 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00057 break;
00058 case INT_VAR_MIN_MAX:
00059 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00060 break;
00061 case INT_VAR_MAX_MIN:
00062 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00063 break;
00064 case INT_VAR_MAX_MAX:
00065 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00066 break;
00067 case INT_VAR_SIZE_MIN:
00068 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00069 break;
00070 case INT_VAR_SIZE_MAX:
00071 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00072 break;
00073 case INT_VAR_DEGREE_MIN:
00074 v = new (home) ViewSelVirtual<ViewSelDegreeMin<BoolView> >(home,o_vars);
00075 break;
00076 case INT_VAR_DEGREE_MAX:
00077 v = new (home) ViewSelVirtual<ViewSelDegreeMax<BoolView> >(home,o_vars);
00078 break;
00079 case INT_VAR_SIZE_DEGREE_MIN:
00080 v = new (home) ViewSelVirtual<ViewSelDegreeMax<BoolView> >(home,o_vars);
00081 break;
00082 case INT_VAR_SIZE_DEGREE_MAX:
00083 v = new (home) ViewSelVirtual<ViewSelDegreeMin<BoolView> >(home,o_vars);
00084 break;
00085 case INT_VAR_REGRET_MIN_MIN:
00086 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00087 break;
00088 case INT_VAR_REGRET_MIN_MAX:
00089 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00090 break;
00091 case INT_VAR_REGRET_MAX_MIN:
00092 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00093 break;
00094 case INT_VAR_REGRET_MAX_MAX:
00095 v = new (home) ViewSelVirtual<ViewSelNone<BoolView> >(home,o_vars);
00096 break;
00097 default:
00098 throw UnknownBranching("Int::branch");
00099 }
00100 }
00101
00102 }}}
00103
00104 namespace Gecode {
00105
00106 void
00107 branch(Gecode::Space& home, const BoolVarArgs& x,
00108 IntVarBranch vars, IntValBranch vals,
00109 const Gecode::VarBranchOptions& o_vars,
00110 const Gecode::ValBranchOptions& o_vals) {
00111 using namespace Gecode;
00112 using namespace Gecode::Int;
00113 using namespace Gecode::Int::Branch;
00114
00115
00116 if (home.failed()) return;
00117 ViewArray<BoolView> xv(home,x);
00118 switch (vars) {
00119 case INT_VAR_NONE:
00120 {
00121 ViewSelNone<BoolView> v(home,o_vars);
00122 post(home,xv,v,vals,o_vals);
00123 }
00124 break;
00125 case INT_VAR_RND:
00126 {
00127 ViewSelRnd<BoolView> v(home,o_vars);
00128 post(home,xv,v,vals,o_vals);
00129 }
00130 break;
00131 case INT_VAR_MIN_MIN:
00132 {
00133 ViewSelNone<BoolView> v(home,o_vars);
00134 post(home,xv,v,vals,o_vals);
00135 }
00136 break;
00137 case INT_VAR_MIN_MAX:
00138 {
00139 ViewSelNone<BoolView> v(home,o_vars);
00140 post(home,xv,v,vals,o_vals);
00141 }
00142 break;
00143 case INT_VAR_MAX_MIN:
00144 {
00145 ViewSelNone<BoolView> v(home,o_vars);
00146 post(home,xv,v,vals,o_vals);
00147 }
00148 break;
00149 case INT_VAR_MAX_MAX:
00150 {
00151 ViewSelNone<BoolView> v(home,o_vars);
00152 post(home,xv,v,vals,o_vals);
00153 }
00154 break;
00155 case INT_VAR_SIZE_MIN:
00156 {
00157 ViewSelNone<BoolView> v(home,o_vars);
00158 post(home,xv,v,vals,o_vals);
00159 }
00160 break;
00161 case INT_VAR_SIZE_MAX:
00162 {
00163 ViewSelNone<BoolView> v(home,o_vars);
00164 post(home,xv,v,vals,o_vals);
00165 }
00166 break;
00167 case INT_VAR_DEGREE_MIN:
00168 {
00169 ViewSelDegreeMin<BoolView> v(home,o_vars);
00170 post(home,xv,v,vals,o_vals);
00171 }
00172 break;
00173 case INT_VAR_DEGREE_MAX:
00174 {
00175 ViewSelDegreeMax<BoolView> v(home,o_vars);
00176 post(home,xv,v,vals,o_vals);
00177 }
00178 break;
00179 case INT_VAR_SIZE_DEGREE_MIN:
00180 {
00181 ViewSelDegreeMax<BoolView> v(home,o_vars);
00182 post(home,xv,v,vals,o_vals);
00183 }
00184 break;
00185 case INT_VAR_SIZE_DEGREE_MAX:
00186 {
00187 ViewSelDegreeMin<BoolView> v(home,o_vars);
00188 post(home,xv,v,vals,o_vals);
00189 }
00190 break;
00191 case INT_VAR_REGRET_MIN_MIN:
00192 {
00193 ViewSelNone<BoolView> v(home,o_vars);
00194 post(home,xv,v,vals,o_vals);
00195 }
00196 break;
00197 case INT_VAR_REGRET_MIN_MAX:
00198 {
00199 ViewSelNone<BoolView> v(home,o_vars);
00200 post(home,xv,v,vals,o_vals);
00201 }
00202 break;
00203 case INT_VAR_REGRET_MAX_MIN:
00204 {
00205 ViewSelNone<BoolView> v(home,o_vars);
00206 post(home,xv,v,vals,o_vals);
00207 }
00208 break;
00209 case INT_VAR_REGRET_MAX_MAX:
00210 {
00211 ViewSelNone<BoolView> v(home,o_vars);
00212 post(home,xv,v,vals,o_vals);
00213 }
00214 break;
00215 default:
00216 throw UnknownBranching("Int::branch");
00217 }
00218 }
00219
00220 void
00221 branch(Gecode::Space& home, const BoolVarArgs& x,
00222 const Gecode::TieBreakVarBranch<IntVarBranch>& vars,
00223 IntValBranch vals,
00224 const Gecode::TieBreakVarBranchOptions& o_vars,
00225 const Gecode::ValBranchOptions& o_vals) {
00226 using namespace Gecode;
00227 using namespace Gecode::Int;
00228 using namespace Gecode::Int::Branch;
00229
00230
00231 if (home.failed()) return;
00232 if ((vars.a == INT_VAR_NONE) || (vars.a == INT_VAR_RND) ||
00233 ((vars.b == INT_VAR_NONE) && (vars.c == INT_VAR_NONE) && (vars.d == INT_VAR_NONE))) {
00234 branch(home,x,vars.a,vals,o_vars.a,o_vals);
00235 return;
00236 }
00237 ViewArray<BoolView> xv(home,x);
00238 Gecode::ViewSelVirtualBase<BoolView>* tb[3];
00239 int n=0;
00240 if (vars.b != INT_VAR_NONE)
00241 virtualize(home,vars.b,o_vars.b,tb[n++]);
00242 if (vars.c != INT_VAR_NONE)
00243 virtualize(home,vars.c,o_vars.c,tb[n++]);
00244 if (vars.d != INT_VAR_NONE)
00245 virtualize(home,vars.d,o_vars.d,tb[n++]);
00246 assert(n > 0);
00247 ViewSelTieBreakDynamic<BoolView> vbcd(home,tb,n);
00248 switch (vars.a) {
00249 case INT_VAR_MIN_MIN:
00250 {
00251 ViewSelNone<BoolView> va(home,o_vars.a);
00252 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00253 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00254 post(home,xv,v,vals,o_vals);
00255 }
00256 break;
00257 case INT_VAR_MIN_MAX:
00258 {
00259 ViewSelNone<BoolView> va(home,o_vars.a);
00260 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00261 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00262 post(home,xv,v,vals,o_vals);
00263 }
00264 break;
00265 case INT_VAR_MAX_MIN:
00266 {
00267 ViewSelNone<BoolView> va(home,o_vars.a);
00268 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00269 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00270 post(home,xv,v,vals,o_vals);
00271 }
00272 break;
00273 case INT_VAR_MAX_MAX:
00274 {
00275 ViewSelNone<BoolView> va(home,o_vars.a);
00276 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00277 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00278 post(home,xv,v,vals,o_vals);
00279 }
00280 break;
00281 case INT_VAR_SIZE_MIN:
00282 {
00283 ViewSelNone<BoolView> va(home,o_vars.a);
00284 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00285 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00286 post(home,xv,v,vals,o_vals);
00287 }
00288 break;
00289 case INT_VAR_SIZE_MAX:
00290 {
00291 ViewSelNone<BoolView> va(home,o_vars.a);
00292 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00293 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00294 post(home,xv,v,vals,o_vals);
00295 }
00296 break;
00297 case INT_VAR_DEGREE_MIN:
00298 {
00299 ViewSelDegreeMin<BoolView> va(home,o_vars.a);
00300 ViewSelTieBreakStatic<ViewSelDegreeMin<BoolView>,
00301 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00302 post(home,xv,v,vals,o_vals);
00303 }
00304 break;
00305 case INT_VAR_DEGREE_MAX:
00306 {
00307 ViewSelDegreeMax<BoolView> va(home,o_vars.a);
00308 ViewSelTieBreakStatic<ViewSelDegreeMax<BoolView>,
00309 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00310 post(home,xv,v,vals,o_vals);
00311 }
00312 break;
00313 case INT_VAR_SIZE_DEGREE_MIN:
00314 {
00315 ViewSelDegreeMax<BoolView> va(home,o_vars.a);
00316 ViewSelTieBreakStatic<ViewSelDegreeMax<BoolView>,
00317 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00318 post(home,xv,v,vals,o_vals);
00319 }
00320 break;
00321 case INT_VAR_SIZE_DEGREE_MAX:
00322 {
00323 ViewSelDegreeMin<BoolView> va(home,o_vars.a);
00324 ViewSelTieBreakStatic<ViewSelDegreeMin<BoolView>,
00325 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00326 post(home,xv,v,vals,o_vals);
00327 }
00328 break;
00329 case INT_VAR_REGRET_MIN_MIN:
00330 {
00331 ViewSelNone<BoolView> va(home,o_vars.a);
00332 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00333 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00334 post(home,xv,v,vals,o_vals);
00335 }
00336 break;
00337 case INT_VAR_REGRET_MIN_MAX:
00338 {
00339 ViewSelNone<BoolView> va(home,o_vars.a);
00340 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00341 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00342 post(home,xv,v,vals,o_vals);
00343 }
00344 break;
00345 case INT_VAR_REGRET_MAX_MIN:
00346 {
00347 ViewSelNone<BoolView> va(home,o_vars.a);
00348 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00349 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00350 post(home,xv,v,vals,o_vals);
00351 }
00352 break;
00353 case INT_VAR_REGRET_MAX_MAX:
00354 {
00355 ViewSelNone<BoolView> va(home,o_vars.a);
00356 ViewSelTieBreakStatic<ViewSelNone<BoolView>,
00357 ViewSelTieBreakDynamic<BoolView> > v(home,va,vbcd);
00358 post(home,xv,v,vals,o_vals);
00359 }
00360 break;
00361 default:
00362 throw UnknownBranching("Int::branch");
00363 }
00364 }
00365
00366 }
00367
00368
00369
00370