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::Space& 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<ViewSelDegreeMin<SetView> >(home,o_vars);
00060 break;
00061 case SET_VAR_MIN_MIN:
00062 v = new (home) ViewSelVirtual<ByMinMin>(home,o_vars);
00063 break;
00064 case SET_VAR_MIN_MAX:
00065 v = new (home) ViewSelVirtual<ByMinMin>(home,o_vars);
00066 break;
00067 case SET_VAR_MAX_MIN:
00068 v = new (home) ViewSelVirtual<ByMaxMin>(home,o_vars);
00069 break;
00070 case SET_VAR_MAX_MAX:
00071 v = new (home) ViewSelVirtual<ByMaxMax>(home,o_vars);
00072 break;
00073 case SET_VAR_SIZE_MIN:
00074 v = new (home) ViewSelVirtual<BySizeMin>(home,o_vars);
00075 break;
00076 case SET_VAR_SIZE_MAX:
00077 v = new (home) ViewSelVirtual<BySizeMax>(home,o_vars);
00078 break;
00079 case SET_VAR_SIZE_DEGREE_MIN:
00080 v = new (home) ViewSelVirtual<BySizeDegreeMin>(home,o_vars);
00081 break;
00082 case SET_VAR_SIZE_DEGREE_MAX:
00083 v = new (home) ViewSelVirtual<BySizeDegreeMax>(home,o_vars);
00084 break;
00085 default:
00086 throw UnknownBranching("Set::branch");
00087 }
00088 }
00089
00090 }}}
00091
00092 namespace Gecode {
00093
00094 void
00095 branch(Gecode::Space& home, const SetVarArgs& x,
00096 SetVarBranch vars, SetValBranch vals,
00097 const Gecode::VarBranchOptions& o_vars,
00098 const Gecode::ValBranchOptions& o_vals) {
00099 using namespace Gecode;
00100 using namespace Gecode::Set;
00101 using namespace Gecode::Set::Branch;
00102
00103
00104 if (home.failed()) return;
00105 ViewArray<SetView> xv(home,x);
00106 switch (vars) {
00107 case SET_VAR_NONE:
00108 {
00109 ViewSelNone<SetView> v(home,o_vars);
00110 post(home,xv,v,vals,o_vals);
00111 }
00112 break;
00113 case SET_VAR_RND:
00114 {
00115 ViewSelRnd<SetView> v(home,o_vars);
00116 post(home,xv,v,vals,o_vals);
00117 }
00118 break;
00119 case SET_VAR_DEGREE_MIN:
00120 {
00121 ViewSelDegreeMin<SetView> v(home,o_vars);
00122 post(home,xv,v,vals,o_vals);
00123 }
00124 break;
00125 case SET_VAR_DEGREE_MAX:
00126 {
00127 ViewSelDegreeMin<SetView> v(home,o_vars);
00128 post(home,xv,v,vals,o_vals);
00129 }
00130 break;
00131 case SET_VAR_MIN_MIN:
00132 {
00133 ByMinMin v(home,o_vars);
00134 post(home,xv,v,vals,o_vals);
00135 }
00136 break;
00137 case SET_VAR_MIN_MAX:
00138 {
00139 ByMinMin v(home,o_vars);
00140 post(home,xv,v,vals,o_vals);
00141 }
00142 break;
00143 case SET_VAR_MAX_MIN:
00144 {
00145 ByMaxMin v(home,o_vars);
00146 post(home,xv,v,vals,o_vals);
00147 }
00148 break;
00149 case SET_VAR_MAX_MAX:
00150 {
00151 ByMaxMax v(home,o_vars);
00152 post(home,xv,v,vals,o_vals);
00153 }
00154 break;
00155 case SET_VAR_SIZE_MIN:
00156 {
00157 BySizeMin v(home,o_vars);
00158 post(home,xv,v,vals,o_vals);
00159 }
00160 break;
00161 case SET_VAR_SIZE_MAX:
00162 {
00163 BySizeMax v(home,o_vars);
00164 post(home,xv,v,vals,o_vals);
00165 }
00166 break;
00167 case SET_VAR_SIZE_DEGREE_MIN:
00168 {
00169 BySizeDegreeMin v(home,o_vars);
00170 post(home,xv,v,vals,o_vals);
00171 }
00172 break;
00173 case SET_VAR_SIZE_DEGREE_MAX:
00174 {
00175 BySizeDegreeMax v(home,o_vars);
00176 post(home,xv,v,vals,o_vals);
00177 }
00178 break;
00179 default:
00180 throw UnknownBranching("Set::branch");
00181 }
00182 }
00183
00184 void
00185 branch(Gecode::Space& home, const SetVarArgs& x,
00186 const Gecode::TieBreakVarBranch<SetVarBranch>& vars,
00187 SetValBranch vals,
00188 const Gecode::TieBreakVarBranchOptions& o_vars,
00189 const Gecode::ValBranchOptions& o_vals) {
00190 using namespace Gecode;
00191 using namespace Gecode::Set;
00192 using namespace Gecode::Set::Branch;
00193
00194
00195 if (home.failed()) return;
00196 if ((vars.a == SET_VAR_NONE) || (vars.a == SET_VAR_RND) ||
00197 ((vars.b == SET_VAR_NONE) && (vars.c == SET_VAR_NONE) && (vars.d == SET_VAR_NONE))) {
00198 branch(home,x,vars.a,vals,o_vars.a,o_vals);
00199 return;
00200 }
00201 ViewArray<SetView> xv(home,x);
00202 Gecode::ViewSelVirtualBase<SetView>* tb[3];
00203 int n=0;
00204 if (vars.b != SET_VAR_NONE)
00205 virtualize(home,vars.b,o_vars.b,tb[n++]);
00206 if (vars.c != SET_VAR_NONE)
00207 virtualize(home,vars.c,o_vars.c,tb[n++]);
00208 if (vars.d != SET_VAR_NONE)
00209 virtualize(home,vars.d,o_vars.d,tb[n++]);
00210 assert(n > 0);
00211 ViewSelTieBreakDynamic<SetView> vbcd(home,tb,n);
00212 switch (vars.a) {
00213 case SET_VAR_DEGREE_MIN:
00214 {
00215 ViewSelDegreeMin<SetView> va(home,o_vars.a);
00216 ViewSelTieBreakStatic<ViewSelDegreeMin<SetView>,
00217 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00218 post(home,xv,v,vals,o_vals);
00219 }
00220 break;
00221 case SET_VAR_DEGREE_MAX:
00222 {
00223 ViewSelDegreeMin<SetView> va(home,o_vars.a);
00224 ViewSelTieBreakStatic<ViewSelDegreeMin<SetView>,
00225 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00226 post(home,xv,v,vals,o_vals);
00227 }
00228 break;
00229 case SET_VAR_MIN_MIN:
00230 {
00231 ByMinMin va(home,o_vars.a);
00232 ViewSelTieBreakStatic<ByMinMin,
00233 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00234 post(home,xv,v,vals,o_vals);
00235 }
00236 break;
00237 case SET_VAR_MIN_MAX:
00238 {
00239 ByMinMin va(home,o_vars.a);
00240 ViewSelTieBreakStatic<ByMinMin,
00241 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00242 post(home,xv,v,vals,o_vals);
00243 }
00244 break;
00245 case SET_VAR_MAX_MIN:
00246 {
00247 ByMaxMin va(home,o_vars.a);
00248 ViewSelTieBreakStatic<ByMaxMin,
00249 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00250 post(home,xv,v,vals,o_vals);
00251 }
00252 break;
00253 case SET_VAR_MAX_MAX:
00254 {
00255 ByMaxMax va(home,o_vars.a);
00256 ViewSelTieBreakStatic<ByMaxMax,
00257 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00258 post(home,xv,v,vals,o_vals);
00259 }
00260 break;
00261 case SET_VAR_SIZE_MIN:
00262 {
00263 BySizeMin va(home,o_vars.a);
00264 ViewSelTieBreakStatic<BySizeMin,
00265 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00266 post(home,xv,v,vals,o_vals);
00267 }
00268 break;
00269 case SET_VAR_SIZE_MAX:
00270 {
00271 BySizeMax va(home,o_vars.a);
00272 ViewSelTieBreakStatic<BySizeMax,
00273 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00274 post(home,xv,v,vals,o_vals);
00275 }
00276 break;
00277 case SET_VAR_SIZE_DEGREE_MIN:
00278 {
00279 BySizeDegreeMin va(home,o_vars.a);
00280 ViewSelTieBreakStatic<BySizeDegreeMin,
00281 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00282 post(home,xv,v,vals,o_vals);
00283 }
00284 break;
00285 case SET_VAR_SIZE_DEGREE_MAX:
00286 {
00287 BySizeDegreeMax va(home,o_vars.a);
00288 ViewSelTieBreakStatic<BySizeDegreeMax,
00289 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00290 post(home,xv,v,vals,o_vals);
00291 }
00292 break;
00293 default:
00294 throw UnknownBranching("Set::branch");
00295 }
00296 }
00297
00298 }
00299
00300
00301
00302