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