/* * CAUTION: * This file has been automatically generated. Do not edit, * edit the specification file "variable.vsl" and the following * files instead: * - gecode/int/var-imp/int.vis * - gecode/int/var-imp/bool.vis * - gecode/set/var-imp/set.vis * - gecode/cpltset/var-imp/cpltset.vis * * This file contains generated code fragments which are * copyrighted as follows: * * Main author: * Christian Schulte * * Copyright: * Christian Schulte, 2007 * * The generated code fragments are part of Gecode, the generic * constraint development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifdef GECODE_HAS_INT_VARS namespace Gecode { namespace Int { /** * \defgroup TaskActorIntMEPC Integer modification events and propagation conditions * \ingroup TaskActorInt */ //@{ /// Domain operation has resulted in failure const Gecode::ModEvent ME_INT_FAILED = Gecode::ME_GEN_FAILED; /// Domain operation has not changed domain const Gecode::ModEvent ME_INT_NONE = Gecode::ME_GEN_NONE; /// Domain operation has resulted in a value (assigned variable) const Gecode::ModEvent ME_INT_VAL = Gecode::ME_GEN_ASSIGNED; /** * \brief Domain operation has changed the minimum or maximum of the domain * * Note that this implies that the domain has not resulted in a value. * * If a propagator subscribes to this variable, it will be processed * assuming a ME_INT_BND modification event. */ const Gecode::ModEvent ME_INT_BND = Gecode::ME_GEN_ASSIGNED + 1; /** * \brief Domain operation has changed the domain * * Note that this implies that the domain has not resulted in a value * and that also the minimum and maximum of the domain have not changed. */ const Gecode::ModEvent ME_INT_DOM = Gecode::ME_GEN_ASSIGNED + 2; /// Propagation condition to be ignored (convenience) const Gecode::PropCond PC_INT_NONE = Gecode::PC_GEN_NONE; /** * \brief Propagate when a view becomes assigned (single value) * * If a propagator \a p depends on a view \a x with propagation * condition PC_INT_VAL, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_INT_VAL. */ const Gecode::PropCond PC_INT_VAL = Gecode::PC_GEN_ASSIGNED; /** * \brief Propagate when minimum or maximum of a view changes * * If a propagator \a p depends on a view \a x with propagation * condition PC_INT_BND, then \a p is propagated when a domain * update operation on \a x returns the modification events ME_INT_VAL * or ME_INT_BND. */ const Gecode::PropCond PC_INT_BND = Gecode::PC_GEN_ASSIGNED + 1; /** * \brief Propagate when domain changes * * If a propagator \a p depends on a view \a x with propagation * condition PC_INT_DOM, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_INT_VAL, * ME_INT_BND, or ME_INT_DOM. */ const Gecode::PropCond PC_INT_DOM = Gecode::PC_GEN_ASSIGNED + 2; //@} }} #endif #ifdef GECODE_HAS_INT_VARS namespace Gecode { namespace Int { /** * \defgroup TaskActorIntMEPC Integer modification events and propagation conditions * \ingroup TaskActorInt */ //@{ /// Domain operation has resulted in failure const Gecode::ModEvent ME_BOOL_FAILED = Gecode::ME_GEN_FAILED; /// Domain operation has not changed domain const Gecode::ModEvent ME_BOOL_NONE = Gecode::ME_GEN_NONE; /// Domain operation has resulted in a value (assigned variable) const Gecode::ModEvent ME_BOOL_VAL = Gecode::ME_GEN_ASSIGNED; /// Propagation condition to be ignored (convenience) const Gecode::PropCond PC_BOOL_NONE = Gecode::PC_GEN_NONE; /** * \brief Propagate when a view becomes assigned (single value) * * If a propagator \a p depends on a view \a x with propagation * condition PC_BOOL_VAL, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_BOOL_VAL. */ const Gecode::PropCond PC_BOOL_VAL = Gecode::PC_GEN_ASSIGNED; //@} }} #endif #ifdef GECODE_HAS_SET_VARS namespace Gecode { namespace Set { /** * \defgroup TaskActorSetMEPC Set modification events and propagation conditions * \ingroup TaskActorSet */ //@{ /// Domain operation has resulted in failure const Gecode::ModEvent ME_SET_FAILED = Gecode::ME_GEN_FAILED; /// Domain operation has not changed domain const Gecode::ModEvent ME_SET_NONE = Gecode::ME_GEN_NONE; /// Domain operation has resulted in a value (assigned variable) const Gecode::ModEvent ME_SET_VAL = Gecode::ME_GEN_ASSIGNED; /** * \brief Domain operation has changed the variable cardinality * * Note that this implies that the domain has not resulted in a value. */ const Gecode::ModEvent ME_SET_CARD = Gecode::ME_GEN_ASSIGNED + 1; /** * \brief Domain operation has changed the least upper bound * * Note that this implies that the domain has not resulted in a value * and that also neither cardinality nor the greatest lower bound * have changed. */ const Gecode::ModEvent ME_SET_LUB = Gecode::ME_GEN_ASSIGNED + 2; /** * \brief Domain operation has changed the greatest lower bound * * Note that this implies that the domain has not resulted in a value * and that also neither cardinality nor the least upper bound * have changed. */ const Gecode::ModEvent ME_SET_GLB = Gecode::ME_GEN_ASSIGNED + 3; /** * \brief Domain operation has changed both greatest lower and least * upper bound * * Note that this implies that the domain has not resulted in a value * and that also the cardinality has not changed. */ const Gecode::ModEvent ME_SET_BB = Gecode::ME_GEN_ASSIGNED + 4; /** * \brief Domain operation has changed the least upper bound and the cardinality * * Note that this implies that the domain has not resulted in a value * and that also the greatest lower bound has not changed. */ const Gecode::ModEvent ME_SET_CLUB = Gecode::ME_GEN_ASSIGNED + 5; /** * \brief Domain operation has changed the greatest lower bound and the cardinality * * Note that this implies that the domain has not resulted in a value * and that also the least upper bound has not changed. */ const Gecode::ModEvent ME_SET_CGLB = Gecode::ME_GEN_ASSIGNED + 6; /** * \brief Domain operation has changed both the greatest lower bound and * the least upper bound, as well as the cardinality * * Note that this implies that the domain has not resulted in a value. * * If a propagator subscribes to this variable, it will be processed * assuming a ME_SET_CBB modification event. * */ const Gecode::ModEvent ME_SET_CBB = Gecode::ME_GEN_ASSIGNED + 7; /// Propagation condition to be ignored (convenience) const Gecode::PropCond PC_SET_NONE = Gecode::PC_GEN_NONE; /** * \brief Propagate when a view becomes assigned (single value) * * If a propagator \a p depends on a view \a x with propagation * condition PC_SET_VAL, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_SET_VAL. */ const Gecode::PropCond PC_SET_VAL = Gecode::PC_GEN_ASSIGNED; /** * \brief Propagate when the cardinality of a view changes * * If a propagator \a p depends on a view \a x with propagation * condition PC_SET_CARD, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_SET_VAL, * ME_SET_CARD, ME_SET_CGLB, ME_SET_CLUB, or ME_SET_CBB. */ const Gecode::PropCond PC_SET_CARD = Gecode::PC_GEN_ASSIGNED + 1; /** * \brief Propagate when the cardinality or the least upper bound * of a view changes * * If a propagator \a p depends on a view \a x with propagation * condition PC_SET_CLUB, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_SET_VAL, * ME_SET_LUB, ME_SET_BB, ME_SET_CARD, ME_SET_CGLB, ME_SET_CLUB, * or ME_SET_CBB. */ const Gecode::PropCond PC_SET_CLUB = Gecode::PC_GEN_ASSIGNED + 2; /** * \brief Propagate when the cardinality or the greatest lower bound * of a view changes * * If a propagator \a p depends on a view \a x with propagation * condition PC_SET_CGLB, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_SET_VAL, * ME_SET_GLB, ME_SET_BB, ME_SET_CARD, ME_SET_CGLB, ME_SET_CLUB, * or ME_SET_CBB. */ const Gecode::PropCond PC_SET_CGLB = Gecode::PC_GEN_ASSIGNED + 3; /** * \brief Propagate when any bound or the cardinality * of a view changes * * If a propagator \a p depends on a view \a x with propagation * condition PC_SET_ANY, then \a p is propagated when a domain * update operation on \a x returns any modification event but ME_SET_FAILED * and ME_SET_NONE. */ const Gecode::PropCond PC_SET_ANY = Gecode::PC_GEN_ASSIGNED + 4; //@} }} #endif #ifdef GECODE_HAS_CPLTSET_VARS namespace Gecode { namespace CpltSet { /** * \defgroup TaskActorCpltSetMEPC CpltSet modification events and propagation conditions * \ingroup TaskActorCpltSet */ //@{ /// Domain operation has resulted in failure const Gecode::ModEvent ME_CPLTSET_FAILED = Gecode::ME_GEN_FAILED; /// Domain operation has not changed domain const Gecode::ModEvent ME_CPLTSET_NONE = Gecode::ME_GEN_NONE; /// Domain operation has resulted in a value (assigned variable) const Gecode::ModEvent ME_CPLTSET_VAL = Gecode::ME_GEN_ASSIGNED; /** * \brief Domain operation has modified set */ const Gecode::ModEvent ME_CPLTSET_DOM = Gecode::ME_GEN_ASSIGNED + 1; /// Propagation condition to be ignored (convenience) const Gecode::PropCond PC_CPLTSET_NONE = Gecode::PC_GEN_NONE; /** * \brief Propagate when a view becomes assigned (single value) * * If a propagator \a p depends on a view \a x with propagation * condition PC_CPLTSET_VAL, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_CPLTSET_VAL. */ const Gecode::PropCond PC_CPLTSET_VAL = Gecode::PC_GEN_ASSIGNED; /** * \brief Propagate when the domain of a view changes * * If a propagator \a p depends on a view \a x with propagation * condition PC_CPLTSET_DOM, then \a p is propagated when a domain * update operation on \a x returns the modification event ME_CPLTSET_VAL or * ME_CPLTSET_DOM. */ const Gecode::PropCond PC_CPLTSET_DOM = Gecode::PC_GEN_ASSIGNED + 1; //@} }} #endif #ifdef GECODE_HAS_INT_VARS namespace Gecode { namespace Int { /// Configuration for Int-variable implementations class IntVarImpConf { public: /// Index for cloning static const int idx_c = 0; /// Index for disposal static const int idx_d = -1; /// Maximal propagation condition static const Gecode::PropCond pc_max = PC_INT_DOM; /// Freely available bits static const int free_bits = 0; /// Start of bits for modification event delta static const int med_fst = 0; /// End of bits for modification event delta static const int med_lst = med_fst + 2; /// Bitmask for modification event delta static const int med_mask = ((1 << 2) - 1) << med_fst; /// Combine modification events \a me1 and \a me2 static Gecode::ModEvent me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2); /// Update modification even delta \a med by \a me, return true on change static bool med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me); /// Variable type identifier for reflection static GECODE_KERNEL_EXPORT const Gecode::Support::Symbol vti; }; }} #else namespace Gecode { namespace Int { /// Dummy configuration for Int-variable implementations class IntVarImpConf { public: /// Index for cloning static const int idx_c = -1; /// Index for disposal static const int idx_d = -1; /// End of bits for modification event delta static const int med_lst = 0; }; }} #endif #ifdef GECODE_HAS_INT_VARS namespace Gecode { namespace Int { /// Configuration for Bool-variable implementations class BoolVarImpConf { public: /// Index for cloning static const int idx_c = Gecode::Int::IntVarImpConf::idx_c+1; /// Index for disposal static const int idx_d = Gecode::Int::IntVarImpConf::idx_d; /// Maximal propagation condition static const Gecode::PropCond pc_max = PC_BOOL_VAL; /// Freely available bits static const int free_bits = 2; /// Start of bits for modification event delta static const int med_fst = Gecode::Int::IntVarImpConf::med_lst; /// End of bits for modification event delta static const int med_lst = med_fst + 1; /// Bitmask for modification event delta static const int med_mask = ((1 << 1) - 1) << med_fst; /// Combine modification events \a me1 and \a me2 static Gecode::ModEvent me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2); /// Update modification even delta \a med by \a me, return true on change static bool med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me); /// Variable type identifier for reflection static GECODE_KERNEL_EXPORT const Gecode::Support::Symbol vti; }; }} #else namespace Gecode { namespace Int { /// Dummy configuration for Bool-variable implementations class BoolVarImpConf { public: /// Index for cloning static const int idx_c = Gecode::Int::IntVarImpConf::idx_c; /// Index for disposal static const int idx_d = Gecode::Int::IntVarImpConf::idx_d; /// End of bits for modification event delta static const int med_lst = Gecode::Int::IntVarImpConf::med_lst; }; }} #endif #ifdef GECODE_HAS_SET_VARS namespace Gecode { namespace Set { /// Configuration for Set-variable implementations class SetVarImpConf { public: /// Index for cloning static const int idx_c = Gecode::Int::BoolVarImpConf::idx_c+1; /// Index for disposal static const int idx_d = Gecode::Int::BoolVarImpConf::idx_d; /// Maximal propagation condition static const Gecode::PropCond pc_max = PC_SET_ANY; /// Freely available bits static const int free_bits = 0; /// Start of bits for modification event delta static const int med_fst = Gecode::Int::BoolVarImpConf::med_lst; /// End of bits for modification event delta static const int med_lst = med_fst + 4; /// Bitmask for modification event delta static const int med_mask = ((1 << 4) - 1) << med_fst; /// Combine modification events \a me1 and \a me2 static Gecode::ModEvent me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2); /// Update modification even delta \a med by \a me, return true on change static bool med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me); /// Variable type identifier for reflection static GECODE_KERNEL_EXPORT const Gecode::Support::Symbol vti; }; }} #else namespace Gecode { namespace Set { /// Dummy configuration for Set-variable implementations class SetVarImpConf { public: /// Index for cloning static const int idx_c = Gecode::Int::BoolVarImpConf::idx_c; /// Index for disposal static const int idx_d = Gecode::Int::BoolVarImpConf::idx_d; /// End of bits for modification event delta static const int med_lst = Gecode::Int::BoolVarImpConf::med_lst; }; }} #endif #ifdef GECODE_HAS_CPLTSET_VARS #ifndef GECODE_HAS_VAR_DISPOSE #define GECODE_HAS_VAR_DISPOSE 1 #endif namespace Gecode { namespace CpltSet { /// Configuration for CpltSet-variable implementations class CpltSetVarImpConf { public: /// Index for cloning static const int idx_c = Gecode::Set::SetVarImpConf::idx_c+1; /// Index for disposal static const int idx_d = Gecode::Set::SetVarImpConf::idx_d+1; /// Maximal propagation condition static const Gecode::PropCond pc_max = PC_CPLTSET_DOM; /// Freely available bits static const int free_bits = 0; /// Start of bits for modification event delta static const int med_fst = Gecode::Set::SetVarImpConf::med_lst; /// End of bits for modification event delta static const int med_lst = med_fst + 2; /// Bitmask for modification event delta static const int med_mask = ((1 << 2) - 1) << med_fst; /// Combine modification events \a me1 and \a me2 static Gecode::ModEvent me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2); /// Update modification even delta \a med by \a me, return true on change static bool med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me); /// Variable type identifier for reflection static GECODE_KERNEL_EXPORT const Gecode::Support::Symbol vti; }; }} #else namespace Gecode { namespace CpltSet { /// Dummy configuration for CpltSet-variable implementations class CpltSetVarImpConf { public: /// Index for cloning static const int idx_c = Gecode::Set::SetVarImpConf::idx_c; /// Index for disposal static const int idx_d = Gecode::Set::SetVarImpConf::idx_d; /// End of bits for modification event delta static const int med_lst = Gecode::Set::SetVarImpConf::med_lst; }; }} #endif namespace Gecode { /// Configuration for all variable implementations class AllVarConf { public: /// Index for cloning static const int idx_c = Gecode::CpltSet::CpltSetVarImpConf::idx_c+1; /// Index for dispose static const int idx_d = Gecode::CpltSet::CpltSetVarImpConf::idx_d+1; /// Combine modification event delta \a med1 with \a med2 static ModEventDelta med_combine(ModEventDelta med1, ModEventDelta med2); }; } #ifdef GECODE_HAS_INT_VARS namespace Gecode { namespace Int { forceinline Gecode::ModEvent IntVarImpConf::me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2) { static const Gecode::ModEvent me_c = ( ( (ME_INT_NONE << 0) | // [ME_INT_NONE][ME_INT_NONE] (ME_INT_VAL << 2) | // [ME_INT_NONE][ME_INT_VAL ] (ME_INT_BND << 4) | // [ME_INT_NONE][ME_INT_BND ] (ME_INT_DOM << 6) // [ME_INT_NONE][ME_INT_DOM ] ) | ( (ME_INT_VAL << 8) | // [ME_INT_VAL ][ME_INT_NONE] (ME_INT_VAL << 10) | // [ME_INT_VAL ][ME_INT_VAL ] (ME_INT_VAL << 12) | // [ME_INT_VAL ][ME_INT_BND ] (ME_INT_VAL << 14) // [ME_INT_VAL ][ME_INT_DOM ] ) | ( (ME_INT_BND << 16) | // [ME_INT_BND ][ME_INT_NONE] (ME_INT_VAL << 18) | // [ME_INT_BND ][ME_INT_VAL ] (ME_INT_BND << 20) | // [ME_INT_BND ][ME_INT_BND ] (ME_INT_BND << 22) // [ME_INT_BND ][ME_INT_DOM ] ) | ( (ME_INT_DOM << 24) | // [ME_INT_DOM ][ME_INT_NONE] (ME_INT_VAL << 26) | // [ME_INT_DOM ][ME_INT_VAL ] (ME_INT_BND << 28) | // [ME_INT_DOM ][ME_INT_BND ] (ME_INT_DOM << 30) // [ME_INT_DOM ][ME_INT_DOM ] ) ); return ((me_c >> (me2 << 3)) >> (me1 << 1)) & 3; } forceinline bool IntVarImpConf::med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me) { switch (me) { case ME_INT_NONE: return false; case ME_INT_VAL: { Gecode::ModEventDelta med_int = med & med_mask; if (med_int == (ME_INT_VAL << med_fst)) return false; med ^= med_int; med ^= ME_INT_VAL << med_fst; break; } case ME_INT_BND: { static const Gecode::ModEvent me_c = ( ((ME_INT_NONE ^ ME_INT_BND ) << 0) | ((ME_INT_VAL ^ ME_INT_VAL ) << 4) | ((ME_INT_BND ^ ME_INT_BND ) << 8) | ((ME_INT_DOM ^ ME_INT_BND ) << 12) ); Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEvent me_n = (me_c >> (me_o << 2)) & (med_mask >> med_fst); if (me_n == 0) return false; med ^= me_n << med_fst; break; } case ME_INT_DOM: { Gecode::ModEventDelta med_int = med & med_mask; if (med_int != 0) return false; med |= ME_INT_DOM << med_fst; break; } default: GECODE_NEVER; } return true; } }} #endif #ifdef GECODE_HAS_INT_VARS namespace Gecode { namespace Int { forceinline Gecode::ModEvent BoolVarImpConf::me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2) { return me1 | me2; } forceinline bool BoolVarImpConf::med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me) { switch (me) { case ME_BOOL_NONE: return false; case ME_BOOL_VAL: if ((med & (ME_BOOL_VAL << med_fst)) != 0) return false; med |= ME_BOOL_VAL << med_fst; break; default: GECODE_NEVER; } return true; } }} #endif #ifdef GECODE_HAS_SET_VARS namespace Gecode { namespace Set { forceinline Gecode::ModEvent SetVarImpConf::me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2) { static const Gecode::ModEvent me_c[ME_SET_CBB+1][ME_SET_CBB+1] = { { ME_SET_NONE, // [ME_SET_NONE][ME_SET_NONE] ME_SET_VAL , // [ME_SET_NONE][ME_SET_VAL ] ME_SET_CARD, // [ME_SET_NONE][ME_SET_CARD] ME_SET_LUB , // [ME_SET_NONE][ME_SET_LUB ] ME_SET_GLB , // [ME_SET_NONE][ME_SET_GLB ] ME_SET_BB , // [ME_SET_NONE][ME_SET_BB ] ME_SET_CLUB, // [ME_SET_NONE][ME_SET_CLUB] ME_SET_CGLB, // [ME_SET_NONE][ME_SET_CGLB] ME_SET_CBB // [ME_SET_NONE][ME_SET_CBB ] }, { ME_SET_VAL , // [ME_SET_VAL ][ME_SET_NONE] ME_SET_VAL , // [ME_SET_VAL ][ME_SET_VAL ] ME_SET_VAL , // [ME_SET_VAL ][ME_SET_CARD] ME_SET_VAL , // [ME_SET_VAL ][ME_SET_LUB ] ME_SET_VAL , // [ME_SET_VAL ][ME_SET_GLB ] ME_SET_VAL , // [ME_SET_VAL ][ME_SET_BB ] ME_SET_VAL , // [ME_SET_VAL ][ME_SET_CLUB] ME_SET_VAL , // [ME_SET_VAL ][ME_SET_CGLB] ME_SET_VAL // [ME_SET_VAL ][ME_SET_CBB ] }, { ME_SET_CARD, // [ME_SET_CARD][ME_SET_NONE] ME_SET_VAL , // [ME_SET_CARD][ME_SET_VAL ] ME_SET_CARD, // [ME_SET_CARD][ME_SET_CARD] ME_SET_CLUB, // [ME_SET_CARD][ME_SET_LUB ] ME_SET_CGLB, // [ME_SET_CARD][ME_SET_GLB ] ME_SET_CBB , // [ME_SET_CARD][ME_SET_BB ] ME_SET_CLUB, // [ME_SET_CARD][ME_SET_CLUB] ME_SET_CGLB, // [ME_SET_CARD][ME_SET_CGLB] ME_SET_CBB // [ME_SET_CARD][ME_SET_CBB ] }, { ME_SET_LUB , // [ME_SET_LUB ][ME_SET_NONE] ME_SET_VAL , // [ME_SET_LUB ][ME_SET_VAL ] ME_SET_CLUB, // [ME_SET_LUB ][ME_SET_CARD] ME_SET_LUB , // [ME_SET_LUB ][ME_SET_LUB ] ME_SET_BB , // [ME_SET_LUB ][ME_SET_GLB ] ME_SET_BB , // [ME_SET_LUB ][ME_SET_BB ] ME_SET_CLUB, // [ME_SET_LUB ][ME_SET_CLUB] ME_SET_CBB , // [ME_SET_LUB ][ME_SET_CGLB] ME_SET_CBB // [ME_SET_LUB ][ME_SET_CBB ] }, { ME_SET_GLB , // [ME_SET_GLB ][ME_SET_NONE] ME_SET_VAL , // [ME_SET_GLB ][ME_SET_VAL ] ME_SET_CGLB, // [ME_SET_GLB ][ME_SET_CARD] ME_SET_BB , // [ME_SET_GLB ][ME_SET_LUB ] ME_SET_GLB , // [ME_SET_GLB ][ME_SET_GLB ] ME_SET_BB , // [ME_SET_GLB ][ME_SET_BB ] ME_SET_CBB , // [ME_SET_GLB ][ME_SET_CLUB] ME_SET_CGLB, // [ME_SET_GLB ][ME_SET_CGLB] ME_SET_CBB // [ME_SET_GLB ][ME_SET_CBB ] }, { ME_SET_BB , // [ME_SET_BB ][ME_SET_NONE] ME_SET_VAL , // [ME_SET_BB ][ME_SET_VAL ] ME_SET_CBB , // [ME_SET_BB ][ME_SET_CARD] ME_SET_BB , // [ME_SET_BB ][ME_SET_LUB ] ME_SET_BB , // [ME_SET_BB ][ME_SET_GLB ] ME_SET_BB , // [ME_SET_BB ][ME_SET_BB ] ME_SET_CBB , // [ME_SET_BB ][ME_SET_CLUB] ME_SET_CBB , // [ME_SET_BB ][ME_SET_CGLB] ME_SET_CBB // [ME_SET_BB ][ME_SET_CBB ] }, { ME_SET_CLUB, // [ME_SET_CLUB][ME_SET_NONE] ME_SET_VAL , // [ME_SET_CLUB][ME_SET_VAL ] ME_SET_CLUB, // [ME_SET_CLUB][ME_SET_CARD] ME_SET_CLUB, // [ME_SET_CLUB][ME_SET_LUB ] ME_SET_CBB , // [ME_SET_CLUB][ME_SET_GLB ] ME_SET_CBB , // [ME_SET_CLUB][ME_SET_BB ] ME_SET_CLUB, // [ME_SET_CLUB][ME_SET_CLUB] ME_SET_CBB , // [ME_SET_CLUB][ME_SET_CGLB] ME_SET_CBB // [ME_SET_CLUB][ME_SET_CBB ] }, { ME_SET_CGLB, // [ME_SET_CGLB][ME_SET_NONE] ME_SET_VAL , // [ME_SET_CGLB][ME_SET_VAL ] ME_SET_CGLB, // [ME_SET_CGLB][ME_SET_CARD] ME_SET_CBB , // [ME_SET_CGLB][ME_SET_LUB ] ME_SET_CGLB, // [ME_SET_CGLB][ME_SET_GLB ] ME_SET_CBB , // [ME_SET_CGLB][ME_SET_BB ] ME_SET_CBB , // [ME_SET_CGLB][ME_SET_CLUB] ME_SET_CGLB, // [ME_SET_CGLB][ME_SET_CGLB] ME_SET_CBB // [ME_SET_CGLB][ME_SET_CBB ] }, { ME_SET_CBB , // [ME_SET_CBB ][ME_SET_NONE] ME_SET_VAL , // [ME_SET_CBB ][ME_SET_VAL ] ME_SET_CBB , // [ME_SET_CBB ][ME_SET_CARD] ME_SET_CBB , // [ME_SET_CBB ][ME_SET_LUB ] ME_SET_CBB , // [ME_SET_CBB ][ME_SET_GLB ] ME_SET_CBB , // [ME_SET_CBB ][ME_SET_BB ] ME_SET_CBB , // [ME_SET_CBB ][ME_SET_CLUB] ME_SET_CBB , // [ME_SET_CBB ][ME_SET_CGLB] ME_SET_CBB // [ME_SET_CBB ][ME_SET_CBB ] } }; return me_c[me1][me2]; } forceinline bool SetVarImpConf::med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me) { switch (me) { case ME_SET_NONE: return false; case ME_SET_VAL: { Gecode::ModEventDelta med_set = med & med_mask; if (med_set == (ME_SET_VAL << med_fst)) return false; med ^= med_set; med ^= ME_SET_VAL << med_fst; break; } case ME_SET_CARD: { static const Gecode::ModEventDelta me_c[ME_SET_CBB+1] = { (ME_SET_NONE ^ ME_SET_CARD) << med_fst, (ME_SET_VAL ^ ME_SET_VAL ) << med_fst, (ME_SET_CARD ^ ME_SET_CARD) << med_fst, (ME_SET_LUB ^ ME_SET_CLUB) << med_fst, (ME_SET_GLB ^ ME_SET_CGLB) << med_fst, (ME_SET_BB ^ ME_SET_CBB ) << med_fst, (ME_SET_CLUB ^ ME_SET_CLUB) << med_fst, (ME_SET_CGLB ^ ME_SET_CGLB) << med_fst, (ME_SET_CBB ^ ME_SET_CBB ) << med_fst }; Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEventDelta med_n = me_c[me_o]; if (med_n == 0) return false; med ^= med_n; break; } case ME_SET_LUB: { static const Gecode::ModEventDelta me_c[ME_SET_CBB+1] = { (ME_SET_NONE ^ ME_SET_LUB ) << med_fst, (ME_SET_VAL ^ ME_SET_VAL ) << med_fst, (ME_SET_CARD ^ ME_SET_CLUB) << med_fst, (ME_SET_LUB ^ ME_SET_LUB ) << med_fst, (ME_SET_GLB ^ ME_SET_BB ) << med_fst, (ME_SET_BB ^ ME_SET_BB ) << med_fst, (ME_SET_CLUB ^ ME_SET_CLUB) << med_fst, (ME_SET_CGLB ^ ME_SET_CBB ) << med_fst, (ME_SET_CBB ^ ME_SET_CBB ) << med_fst }; Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEventDelta med_n = me_c[me_o]; if (med_n == 0) return false; med ^= med_n; break; } case ME_SET_GLB: { static const Gecode::ModEventDelta me_c[ME_SET_CBB+1] = { (ME_SET_NONE ^ ME_SET_GLB ) << med_fst, (ME_SET_VAL ^ ME_SET_VAL ) << med_fst, (ME_SET_CARD ^ ME_SET_CGLB) << med_fst, (ME_SET_LUB ^ ME_SET_BB ) << med_fst, (ME_SET_GLB ^ ME_SET_GLB ) << med_fst, (ME_SET_BB ^ ME_SET_BB ) << med_fst, (ME_SET_CLUB ^ ME_SET_CBB ) << med_fst, (ME_SET_CGLB ^ ME_SET_CGLB) << med_fst, (ME_SET_CBB ^ ME_SET_CBB ) << med_fst }; Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEventDelta med_n = me_c[me_o]; if (med_n == 0) return false; med ^= med_n; break; } case ME_SET_BB: { static const Gecode::ModEventDelta me_c[ME_SET_CBB+1] = { (ME_SET_NONE ^ ME_SET_BB ) << med_fst, (ME_SET_VAL ^ ME_SET_VAL ) << med_fst, (ME_SET_CARD ^ ME_SET_CBB ) << med_fst, (ME_SET_LUB ^ ME_SET_BB ) << med_fst, (ME_SET_GLB ^ ME_SET_BB ) << med_fst, (ME_SET_BB ^ ME_SET_BB ) << med_fst, (ME_SET_CLUB ^ ME_SET_CBB ) << med_fst, (ME_SET_CGLB ^ ME_SET_CBB ) << med_fst, (ME_SET_CBB ^ ME_SET_CBB ) << med_fst }; Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEventDelta med_n = me_c[me_o]; if (med_n == 0) return false; med ^= med_n; break; } case ME_SET_CLUB: { static const Gecode::ModEventDelta me_c[ME_SET_CBB+1] = { (ME_SET_NONE ^ ME_SET_CLUB) << med_fst, (ME_SET_VAL ^ ME_SET_VAL ) << med_fst, (ME_SET_CARD ^ ME_SET_CLUB) << med_fst, (ME_SET_LUB ^ ME_SET_CLUB) << med_fst, (ME_SET_GLB ^ ME_SET_CBB ) << med_fst, (ME_SET_BB ^ ME_SET_CBB ) << med_fst, (ME_SET_CLUB ^ ME_SET_CLUB) << med_fst, (ME_SET_CGLB ^ ME_SET_CBB ) << med_fst, (ME_SET_CBB ^ ME_SET_CBB ) << med_fst }; Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEventDelta med_n = me_c[me_o]; if (med_n == 0) return false; med ^= med_n; break; } case ME_SET_CGLB: { static const Gecode::ModEventDelta me_c[ME_SET_CBB+1] = { (ME_SET_NONE ^ ME_SET_CGLB) << med_fst, (ME_SET_VAL ^ ME_SET_VAL ) << med_fst, (ME_SET_CARD ^ ME_SET_CGLB) << med_fst, (ME_SET_LUB ^ ME_SET_CBB ) << med_fst, (ME_SET_GLB ^ ME_SET_CGLB) << med_fst, (ME_SET_BB ^ ME_SET_CBB ) << med_fst, (ME_SET_CLUB ^ ME_SET_CBB ) << med_fst, (ME_SET_CGLB ^ ME_SET_CGLB) << med_fst, (ME_SET_CBB ^ ME_SET_CBB ) << med_fst }; Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEventDelta med_n = me_c[me_o]; if (med_n == 0) return false; med ^= med_n; break; } case ME_SET_CBB: { static const Gecode::ModEventDelta me_c[ME_SET_CBB+1] = { (ME_SET_NONE ^ ME_SET_CBB ) << med_fst, (ME_SET_VAL ^ ME_SET_VAL ) << med_fst, (ME_SET_CARD ^ ME_SET_CBB ) << med_fst, (ME_SET_LUB ^ ME_SET_CBB ) << med_fst, (ME_SET_GLB ^ ME_SET_CBB ) << med_fst, (ME_SET_BB ^ ME_SET_CBB ) << med_fst, (ME_SET_CLUB ^ ME_SET_CBB ) << med_fst, (ME_SET_CGLB ^ ME_SET_CBB ) << med_fst, (ME_SET_CBB ^ ME_SET_CBB ) << med_fst }; Gecode::ModEvent me_o = (med & med_mask) >> med_fst; Gecode::ModEventDelta med_n = me_c[me_o]; if (med_n == 0) return false; med ^= med_n; break; } default: GECODE_NEVER; } return true; } }} #endif #ifdef GECODE_HAS_CPLTSET_VARS namespace Gecode { namespace CpltSet { forceinline Gecode::ModEvent CpltSetVarImpConf::me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2) { static const Gecode::ModEvent me_c = ( ( (ME_CPLTSET_NONE << 0) | // [ME_CPLTSET_NONE][ME_CPLTSET_NONE] (ME_CPLTSET_VAL << 2) | // [ME_CPLTSET_NONE][ME_CPLTSET_VAL ] (ME_CPLTSET_DOM << 4) // [ME_CPLTSET_NONE][ME_CPLTSET_DOM ] ) | ( (ME_CPLTSET_VAL << 8) | // [ME_CPLTSET_VAL ][ME_CPLTSET_NONE] (ME_CPLTSET_VAL << 10) | // [ME_CPLTSET_VAL ][ME_CPLTSET_VAL ] (ME_CPLTSET_VAL << 12) // [ME_CPLTSET_VAL ][ME_CPLTSET_DOM ] ) | ( (ME_CPLTSET_DOM << 16) | // [ME_CPLTSET_DOM ][ME_CPLTSET_NONE] (ME_CPLTSET_VAL << 18) | // [ME_CPLTSET_DOM ][ME_CPLTSET_VAL ] (ME_CPLTSET_DOM << 20) // [ME_CPLTSET_DOM ][ME_CPLTSET_DOM ] ) ); return ((me_c >> (me2 << 3)) >> (me1 << 1)) & 3; } forceinline bool CpltSetVarImpConf::med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me) { switch (me) { case ME_CPLTSET_NONE: return false; case ME_CPLTSET_VAL: { Gecode::ModEventDelta med_cpltset = med & med_mask; if (med_cpltset == (ME_CPLTSET_VAL << med_fst)) return false; med ^= med_cpltset; med ^= ME_CPLTSET_VAL << med_fst; break; } case ME_CPLTSET_DOM: { Gecode::ModEventDelta med_cpltset = med & med_mask; if (med_cpltset != 0) return false; med |= ME_CPLTSET_DOM << med_fst; break; } default: GECODE_NEVER; } return true; } }} #endif namespace Gecode { forceinline ModEventDelta AllVarConf::med_combine(ModEventDelta med1, ModEventDelta med2) { #ifdef GECODE_HAS_INT_VARS (void) Gecode::Int::IntVarImpConf::med_update(med1,(med2 & Gecode::Int::IntVarImpConf::med_mask) >> Gecode::Int::IntVarImpConf::med_fst); #endif #ifdef GECODE_HAS_INT_VARS (void) Gecode::Int::BoolVarImpConf::med_update(med1,(med2 & Gecode::Int::BoolVarImpConf::med_mask) >> Gecode::Int::BoolVarImpConf::med_fst); #endif #ifdef GECODE_HAS_SET_VARS (void) Gecode::Set::SetVarImpConf::med_update(med1,(med2 & Gecode::Set::SetVarImpConf::med_mask) >> Gecode::Set::SetVarImpConf::med_fst); #endif #ifdef GECODE_HAS_CPLTSET_VARS (void) Gecode::CpltSet::CpltSetVarImpConf::med_update(med1,(med2 & Gecode::CpltSet::CpltSetVarImpConf::med_mask) >> Gecode::CpltSet::CpltSetVarImpConf::med_fst); #endif return med1; } } // STATISTICS: kernel-var