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
00043
00044 #ifdef GECODE_HAS_INT_VARS
00045 namespace Gecode { namespace Int {
00047 class IntVarImpBase : public Gecode::VarImp<Gecode::Int::IntVarImpConf> {
00048 protected:
00050 IntVarImpBase(Gecode::Space& home, IntVarImpBase& x);
00051 public:
00053 IntVarImpBase(void);
00055 IntVarImpBase(Gecode::Space& home);
00057
00058
00070 void subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule);
00072 void subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed);
00074 Gecode::ModEvent notify(Gecode::Space& home, Gecode::ModEvent me, Gecode::Delta& d);
00076 static void schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me);
00085 void reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned);
00087 };
00088 }}
00089 #endif
00090 #ifdef GECODE_HAS_INT_VARS
00091 namespace Gecode { namespace Int {
00093 class BoolVarImpBase : public Gecode::VarImp<Gecode::Int::BoolVarImpConf> {
00094 protected:
00096 BoolVarImpBase(Gecode::Space& home, BoolVarImpBase& x);
00097 public:
00099 BoolVarImpBase(void);
00101 BoolVarImpBase(Gecode::Space& home);
00103
00104
00116 void subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule);
00118 void subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed);
00120 Gecode::ModEvent notify(Gecode::Space& home, Gecode::ModEvent me, Gecode::Delta& d);
00122 static void schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me);
00131 void reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned);
00133 };
00134 }}
00135 #endif
00136 #ifdef GECODE_HAS_SET_VARS
00137 namespace Gecode { namespace Set {
00139 class SetVarImpBase : public Gecode::VarImp<Gecode::Set::SetVarImpConf> {
00140 protected:
00142 SetVarImpBase(Gecode::Space& home, SetVarImpBase& x);
00143 public:
00145 SetVarImpBase(void);
00147 SetVarImpBase(Gecode::Space& home);
00149
00150
00162 void subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule);
00164 void subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed);
00166 Gecode::ModEvent notify(Gecode::Space& home, Gecode::ModEvent me, Gecode::Delta& d);
00168 static void schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me);
00177 void reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned);
00179 };
00180 }}
00181 #endif
00182 #ifdef GECODE_HAS_FLOAT_VARS
00183 namespace Gecode { namespace Float {
00185 class FloatVarImpBase : public Gecode::VarImp<Gecode::Float::FloatVarImpConf> {
00186 protected:
00188 FloatVarImpBase(Gecode::Space& home, FloatVarImpBase& x);
00189 public:
00191 FloatVarImpBase(void);
00193 FloatVarImpBase(Gecode::Space& home);
00195
00196
00208 void subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule);
00210 void subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed);
00212 Gecode::ModEvent notify(Gecode::Space& home, Gecode::ModEvent me, Gecode::Delta& d);
00214 static void schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me);
00223 void reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned);
00225 };
00226 }}
00227 #endif
00228 #ifdef GECODE_HAS_INT_VARS
00229 namespace Gecode { namespace Int {
00230
00231 forceinline
00232 IntVarImpBase::IntVarImpBase(void) {}
00233
00234 forceinline
00235 IntVarImpBase::IntVarImpBase(Gecode::Space& home)
00236 : Gecode::VarImp<Gecode::Int::IntVarImpConf>(home) {}
00237
00238 forceinline
00239 IntVarImpBase::IntVarImpBase(Gecode::Space& home, IntVarImpBase& x)
00240 : Gecode::VarImp<Gecode::Int::IntVarImpConf>(home,x) {}
00241
00242 forceinline void
00243 IntVarImpBase::subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule) {
00244 Gecode::VarImp<Gecode::Int::IntVarImpConf>::subscribe(home,p,pc,assigned,ME_INT_BND,schedule);
00245 }
00246 forceinline void
00247 IntVarImpBase::subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed) {
00248 Gecode::VarImp<Gecode::Int::IntVarImpConf>::subscribe(home,a,assigned,failed);
00249 }
00250
00251 forceinline void
00252 IntVarImpBase::schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me) {
00253 Gecode::VarImp<Gecode::Int::IntVarImpConf>::schedule(home,p,me);
00254 }
00255 forceinline void
00256 IntVarImpBase::reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned) {
00257 Gecode::VarImp<Gecode::Int::IntVarImpConf>::reschedule(home,p,pc,assigned,ME_INT_BND);
00258 }
00259
00260 forceinline Gecode::ModEvent
00261 IntVarImpBase::notify(Gecode::Space& home, Gecode::ModEvent me, Gecode::Delta& d) {
00262 switch (me) {
00263 case ME_INT_VAL:
00264
00265 Gecode::VarImp<Gecode::Int::IntVarImpConf>::schedule(home,PC_INT_VAL,PC_INT_DOM,ME_INT_VAL);
00266 if (!Gecode::VarImp<Gecode::Int::IntVarImpConf>::advise(home,ME_INT_VAL,d))
00267 return ME_INT_FAILED;
00268 cancel(home);
00269 break;
00270 case ME_INT_BND:
00271
00272 Gecode::VarImp<Gecode::Int::IntVarImpConf>::schedule(home,PC_INT_BND,PC_INT_DOM,ME_INT_BND);
00273 if (!Gecode::VarImp<Gecode::Int::IntVarImpConf>::advise(home,ME_INT_BND,d))
00274 return ME_INT_FAILED;
00275 break;
00276 case ME_INT_DOM:
00277
00278 Gecode::VarImp<Gecode::Int::IntVarImpConf>::schedule(home,PC_INT_DOM,PC_INT_DOM,ME_INT_DOM);
00279 if (!Gecode::VarImp<Gecode::Int::IntVarImpConf>::advise(home,ME_INT_DOM,d))
00280 return ME_INT_FAILED;
00281 break;
00282 default: GECODE_NEVER;
00283 }
00284 return me;
00285 }
00286
00287 }}
00288 #endif
00289 #ifdef GECODE_HAS_INT_VARS
00290 namespace Gecode { namespace Int {
00291
00292 forceinline
00293 BoolVarImpBase::BoolVarImpBase(void) {}
00294
00295 forceinline
00296 BoolVarImpBase::BoolVarImpBase(Gecode::Space& home)
00297 : Gecode::VarImp<Gecode::Int::BoolVarImpConf>(home) {}
00298
00299 forceinline
00300 BoolVarImpBase::BoolVarImpBase(Gecode::Space& home, BoolVarImpBase& x)
00301 : Gecode::VarImp<Gecode::Int::BoolVarImpConf>(home,x) {}
00302
00303 forceinline void
00304 BoolVarImpBase::subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule) {
00305 Gecode::VarImp<Gecode::Int::BoolVarImpConf>::subscribe(home,p,pc,assigned,ME_BOOL_VAL,schedule);
00306 }
00307 forceinline void
00308 BoolVarImpBase::subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed) {
00309 Gecode::VarImp<Gecode::Int::BoolVarImpConf>::subscribe(home,a,assigned,failed);
00310 }
00311
00312 forceinline void
00313 BoolVarImpBase::schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me) {
00314 Gecode::VarImp<Gecode::Int::BoolVarImpConf>::schedule(home,p,me);
00315 }
00316 forceinline void
00317 BoolVarImpBase::reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned) {
00318 Gecode::VarImp<Gecode::Int::BoolVarImpConf>::reschedule(home,p,pc,assigned,ME_BOOL_VAL);
00319 }
00320
00321 forceinline Gecode::ModEvent
00322 BoolVarImpBase::notify(Gecode::Space& home, Gecode::ModEvent, Gecode::Delta& d) {
00323 Gecode::VarImp<Gecode::Int::BoolVarImpConf>::schedule(home,PC_BOOL_VAL,PC_BOOL_VAL,ME_BOOL_VAL);
00324 if (!Gecode::VarImp<Gecode::Int::BoolVarImpConf>::advise(home,ME_BOOL_VAL,d))
00325 return ME_BOOL_FAILED;
00326 cancel(home);
00327 return ME_BOOL_VAL;
00328 }
00329
00330 }}
00331 #endif
00332 #ifdef GECODE_HAS_SET_VARS
00333 namespace Gecode { namespace Set {
00334
00335 forceinline
00336 SetVarImpBase::SetVarImpBase(void) {}
00337
00338 forceinline
00339 SetVarImpBase::SetVarImpBase(Gecode::Space& home)
00340 : Gecode::VarImp<Gecode::Set::SetVarImpConf>(home) {}
00341
00342 forceinline
00343 SetVarImpBase::SetVarImpBase(Gecode::Space& home, SetVarImpBase& x)
00344 : Gecode::VarImp<Gecode::Set::SetVarImpConf>(home,x) {}
00345
00346 forceinline void
00347 SetVarImpBase::subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule) {
00348 Gecode::VarImp<Gecode::Set::SetVarImpConf>::subscribe(home,p,pc,assigned,ME_SET_CBB,schedule);
00349 }
00350 forceinline void
00351 SetVarImpBase::subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed) {
00352 Gecode::VarImp<Gecode::Set::SetVarImpConf>::subscribe(home,a,assigned,failed);
00353 }
00354
00355 forceinline void
00356 SetVarImpBase::schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me) {
00357 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,p,me);
00358 }
00359 forceinline void
00360 SetVarImpBase::reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned) {
00361 Gecode::VarImp<Gecode::Set::SetVarImpConf>::reschedule(home,p,pc,assigned,ME_SET_CBB);
00362 }
00363
00364 forceinline Gecode::ModEvent
00365 SetVarImpBase::notify(Gecode::Space& home, Gecode::ModEvent me, Gecode::Delta& d) {
00366 switch (me) {
00367 case ME_SET_VAL:
00368
00369 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_VAL,PC_SET_ANY,ME_SET_VAL);
00370 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_VAL,d))
00371 return ME_SET_FAILED;
00372 cancel(home);
00373 break;
00374 case ME_SET_CARD:
00375
00376 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_CARD,PC_SET_ANY,ME_SET_CARD);
00377 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_CARD,d))
00378 return ME_SET_FAILED;
00379 break;
00380 case ME_SET_LUB:
00381
00382 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_CLUB,PC_SET_CLUB,ME_SET_LUB);
00383 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_ANY,PC_SET_ANY,ME_SET_LUB);
00384 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_LUB,d))
00385 return ME_SET_FAILED;
00386 break;
00387 case ME_SET_GLB:
00388
00389 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_CGLB,PC_SET_ANY,ME_SET_GLB);
00390 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_GLB,d))
00391 return ME_SET_FAILED;
00392 break;
00393 case ME_SET_BB:
00394
00395 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_CLUB,PC_SET_ANY,ME_SET_BB);
00396 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_BB,d))
00397 return ME_SET_FAILED;
00398 break;
00399 case ME_SET_CLUB:
00400
00401 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_CARD,PC_SET_ANY,ME_SET_CLUB);
00402 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_CLUB,d))
00403 return ME_SET_FAILED;
00404 break;
00405 case ME_SET_CGLB:
00406
00407 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_CARD,PC_SET_ANY,ME_SET_CGLB);
00408 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_CGLB,d))
00409 return ME_SET_FAILED;
00410 break;
00411 case ME_SET_CBB:
00412
00413 Gecode::VarImp<Gecode::Set::SetVarImpConf>::schedule(home,PC_SET_CARD,PC_SET_ANY,ME_SET_CBB);
00414 if (!Gecode::VarImp<Gecode::Set::SetVarImpConf>::advise(home,ME_SET_CBB,d))
00415 return ME_SET_FAILED;
00416 break;
00417 default: GECODE_NEVER;
00418 }
00419 return me;
00420 }
00421
00422 }}
00423 #endif
00424 #ifdef GECODE_HAS_FLOAT_VARS
00425 namespace Gecode { namespace Float {
00426
00427 forceinline
00428 FloatVarImpBase::FloatVarImpBase(void) {}
00429
00430 forceinline
00431 FloatVarImpBase::FloatVarImpBase(Gecode::Space& home)
00432 : Gecode::VarImp<Gecode::Float::FloatVarImpConf>(home) {}
00433
00434 forceinline
00435 FloatVarImpBase::FloatVarImpBase(Gecode::Space& home, FloatVarImpBase& x)
00436 : Gecode::VarImp<Gecode::Float::FloatVarImpConf>(home,x) {}
00437
00438 forceinline void
00439 FloatVarImpBase::subscribe(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned, bool schedule) {
00440 Gecode::VarImp<Gecode::Float::FloatVarImpConf>::subscribe(home,p,pc,assigned,ME_FLOAT_BND,schedule);
00441 }
00442 forceinline void
00443 FloatVarImpBase::subscribe(Gecode::Space& home, Gecode::Advisor& a, bool assigned, bool failed) {
00444 Gecode::VarImp<Gecode::Float::FloatVarImpConf>::subscribe(home,a,assigned,failed);
00445 }
00446
00447 forceinline void
00448 FloatVarImpBase::schedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::ModEvent me) {
00449 Gecode::VarImp<Gecode::Float::FloatVarImpConf>::schedule(home,p,me);
00450 }
00451 forceinline void
00452 FloatVarImpBase::reschedule(Gecode::Space& home, Gecode::Propagator& p, Gecode::PropCond pc, bool assigned) {
00453 Gecode::VarImp<Gecode::Float::FloatVarImpConf>::reschedule(home,p,pc,assigned,ME_FLOAT_BND);
00454 }
00455
00456 forceinline Gecode::ModEvent
00457 FloatVarImpBase::notify(Gecode::Space& home, Gecode::ModEvent me, Gecode::Delta& d) {
00458 switch (me) {
00459 case ME_FLOAT_VAL:
00460
00461 Gecode::VarImp<Gecode::Float::FloatVarImpConf>::schedule(home,PC_FLOAT_VAL,PC_FLOAT_BND,ME_FLOAT_VAL);
00462 if (!Gecode::VarImp<Gecode::Float::FloatVarImpConf>::advise(home,ME_FLOAT_VAL,d))
00463 return ME_FLOAT_FAILED;
00464 cancel(home);
00465 break;
00466 case ME_FLOAT_BND:
00467
00468 Gecode::VarImp<Gecode::Float::FloatVarImpConf>::schedule(home,PC_FLOAT_BND,PC_FLOAT_BND,ME_FLOAT_BND);
00469 if (!Gecode::VarImp<Gecode::Float::FloatVarImpConf>::advise(home,ME_FLOAT_BND,d))
00470 return ME_FLOAT_FAILED;
00471 break;
00472 default: GECODE_NEVER;
00473 }
00474 return me;
00475 }
00476
00477 }}
00478 #endif
00479 namespace Gecode {
00480
00481 forceinline void
00482 Space::update(ActorLink** sub) {
00483 #ifdef GECODE_HAS_INT_VARS
00484 Gecode::VarImp<Gecode::Int::IntVarImpConf>::update(*this,sub);
00485 #endif
00486 #ifdef GECODE_HAS_INT_VARS
00487 Gecode::VarImp<Gecode::Int::BoolVarImpConf>::update(*this,sub);
00488 #endif
00489 #ifdef GECODE_HAS_SET_VARS
00490 Gecode::VarImp<Gecode::Set::SetVarImpConf>::update(*this,sub);
00491 #endif
00492 #ifdef GECODE_HAS_FLOAT_VARS
00493 Gecode::VarImp<Gecode::Float::FloatVarImpConf>::update(*this,sub);
00494 #endif
00495 }
00496 }
00497