/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Guido Tack * * Contributing authors: * Gabor Szokoli * * Copyright: * Christian Schulte, 2002 * Guido Tack, 2004 * Gabor Szokoli, 2003 * * This file is 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. * */ #ifndef GECODE_INT_REL_HH #define GECODE_INT_REL_HH #include /** * \namespace Gecode::Int::Rel * \brief Simple relation propagators */ namespace Gecode { namespace Int { namespace Rel { /* * Equality propagators * */ /** * \brief Binary domain consistent equality propagator * * Uses staging by first performing bounds propagation and only * then domain propagation. * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class EqDom : public MixBinaryPropagator { protected: using MixBinaryPropagator::x0; using MixBinaryPropagator::x1; /// Constructor for cloning \a p EqDom(Space& home, EqDom& p); public: /// Constructor for posting EqDom(Home home, View0 x0, View1 x1); /// Constructor for rewriting \a p during cloning EqDom(Space& home, Propagator& p, View0 x0, View1 x1); /// Copy propagator during cloning virtual Actor* copy(Space& home); /** * \brief Cost function * * If a view has been assigned, the cost is low unary. * If in stage for bounds propagation, the cost is * low binary. Otherwise it is high binary. */ virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post domain consistent propagator \f$ x_0 = x_1\f$ static ExecStatus post(Home home, View0 x0, View1 x1); }; /** * \brief Binary value propagation equality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class EqVal : public MixBinaryPropagator { protected: using MixBinaryPropagator::x0; using MixBinaryPropagator::x1; /// Constructor for cloning \a p EqVal(Space& home, EqVal& p); public: /// Constructor for posting EqVal(Home home, View0 x0, View1 x1); /// Constructor for rewriting \a p during cloning EqVal(Space& home, Propagator& p, View0 x0, View1 x1); /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Cost function: low unary. virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post value propagation propagator \f$ x_0 = x_1\f$ static ExecStatus post(Home home, View0 x0, View1 x1); }; /** * \brief Binary bounds consistent equality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class EqBnd : public MixBinaryPropagator { protected: using MixBinaryPropagator::x0; using MixBinaryPropagator::x1; /// Constructor for cloning \a p EqBnd(Space& home, EqBnd& p); public: /// Constructor for posting EqBnd(Home home, View0 x0, View1 x1); /// Constructor for rewriting \a p during cloning EqBnd(Space& home, Propagator& p, View0 x0, View1 x1); /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post bounds consistent propagator \f$ x_0 = x_1\f$ static ExecStatus post(Home home, View0 x0, View1 x1); }; /** * \brief n-ary domain consistent equality propagator * * Uses staging by first performing bounds propagation and only * then domain propagation. * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class NaryEqDom : public NaryPropagator { protected: using NaryPropagator::x; /// Constructor for cloning \a p NaryEqDom(Space& home, NaryEqDom& p); /// Constructor for posting NaryEqDom(Home home, ViewArray&); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /** * \brief Cost function * * If a view has been assigned, the cost is low unary. * If in stage for bounds propagation, the cost is * low linear. Otherwise it is high linear. */ virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post domain consistent propagator \f$ x_0 = x_1=\ldots =x_{|x|-1}\f$ static ExecStatus post(Home home, ViewArray& x); }; /** * \brief n-ary bounds consistent equality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class NaryEqBnd : public NaryPropagator { protected: using NaryPropagator::x; /// Constructor for cloning \a p NaryEqBnd(Space& home, NaryEqBnd& p); /// Constructor for posting NaryEqBnd(Home home, ViewArray&); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /** * \brief Cost function * * If a view has been assigned, the cost is low unary. * Otherwise it is low linear. */ virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post bounds consistent propagator \f$ x_0 = x_1=\ldots =x_{|x|-1}\f$ static ExecStatus post(Home home, ViewArray& x); }; /** * \brief n-ary less and less or equal propagator * * If \a o is 0, less or equal is propagated, if \a o is 1 less is * propagated. * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class NaryLqLe : public NaryPropagator { protected: using NaryPropagator::x; /// %Advisors for views (by position in array) class Index : public Advisor { public: /// The position of the view in the view array int i; /// Create index advisor Index(Space& home, Propagator& p, Council& c, int i); /// Clone index advisor \a a Index(Space& home, Index& a); }; /// The advisor council Council c; /// Positions in view array that have to be propagated class Pos : public FreeList { public: /// Position of view in view array int p; /// \name Constructor //@{ /// Initialize with position \a p and next position \a n Pos(int p, Pos* n); //@} /// \name Linkage access //@{ /// Return next position Pos* next(void) const; //@} /// \name Memory management //@{ /// Free memory for this position void dispose(Space& home); /// Allocate memory from space static void* operator new(size_t s, Space& home); /// No-op (for exceptions) static void operator delete(void* p); /// No-op (use dispose instead) static void operator delete(void* p, Space& home); //@} }; /// Stack of positions Pos* pos; /// Whether no more positions must be propagated bool empty(void) const; /// Pop a position to be propagated and return it int pop(Space& home); /// Push a new position \a p to be propagated void push(Space& home, int p); /// Whether the propagator is currently running bool run; /// Number of already subsumed advisors (or views) int n_subsumed; /// Compact during cloning when more advisors than that are subsumed static const int n_threshold = 7; /// Constructor for cloning \a p NaryLqLe(Space& home, NaryLqLe& p); /// Constructor for posting NaryLqLe(Home home, ViewArray&); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Cost function virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Give advice to propagator virtual ExecStatus advise(Space& home, Advisor& a, const Delta& d); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Delete propagator and return its size virtual size_t dispose(Space& home); /// Post propagator for \f$ x_0 +c\leq x_1+c\leq\cdots \leq x_{|x|-1}\f$ static ExecStatus post(Home home, ViewArray& x); }; /** * \brief Nary disequality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class NaryNq : public NaryPropagator { protected: using NaryPropagator::x; /// Constructor for posting NaryNq(Home home, ViewArray& x); /// Constructor for cloning \a p NaryNq(Space& home, NaryNq& p); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Cost function virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator \f$ \neg\left(x_0=x_1=\cdots=x_{|x|-1}\right)\f$ static ExecStatus post(Home home, ViewArray& x); /// Delete propagator and return its size virtual size_t dispose(Space& home); }; /** * \brief Reified binary domain consistent equality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class ReEqDom : public ReBinaryPropagator { protected: using ReBinaryPropagator::x0; using ReBinaryPropagator::x1; using ReBinaryPropagator::b; /// Constructor for cloning \a p ReEqDom(Space& home, ReEqDom& p); /// Constructor for posting ReEqDom(Home home, View x0, View x1, CtrlView b); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post domain consistent propagator \f$ (x_0 = x_1)\Leftrightarrow b\f$ static ExecStatus post(Home home, View x0, View x1, CtrlView b); }; /** * \brief Reified binary bounds consistent equality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class ReEqBnd : public ReBinaryPropagator { protected: using ReBinaryPropagator::x0; using ReBinaryPropagator::x1; using ReBinaryPropagator::b; /// Constructor for cloning \a p ReEqBnd(Space& home, ReEqBnd& p); /// Constructor for posting ReEqBnd(Home home, View x0, View x1, CtrlView b); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post bounds consistent propagator \f$ (x_0 = x_1)\Leftrightarrow b\f$ static ExecStatus post(Home home, View x0, View x1, CtrlView b); }; /** * \brief Reified domain consistent equality with integer propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class ReEqDomInt : public ReUnaryPropagator { protected: using ReUnaryPropagator::x0; using ReUnaryPropagator::b; /// Integer constant to check int c; /// Constructor for cloning \a p ReEqDomInt(Space& home, ReEqDomInt& p); /// Constructor for posting ReEqDomInt(Home home, View x, int c, CtrlView b); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post domain consistent propagator \f$ (x = c)\Leftrightarrow b\f$ static ExecStatus post(Home home, View x, int c, CtrlView b); }; /** * \brief Reified bounds consistent equality with integer propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class ReEqBndInt : public ReUnaryPropagator { protected: using ReUnaryPropagator::x0; using ReUnaryPropagator::b; /// Integer constant to check int c; /// Constructor for cloning \a p ReEqBndInt(Space& home, ReEqBndInt& p); /// Constructor for posting ReEqBndInt(Home home, View x, int c, CtrlView b); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post bounds consistent propagator \f$ (x = c)\Leftrightarrow b\f$ static ExecStatus post(Home home, View x, int c, CtrlView b); }; /* * Disequality propagators * */ /** * \brief Binary disequality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class Nq : public MixBinaryPropagator { protected: using MixBinaryPropagator::x0; using MixBinaryPropagator::x1; /// Constructor for cloning \a p Nq(Space& home, Nq& p); /// Constructor for posting Nq(Home home, V0 x0, V1 x1); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Cost function (defined as low unary) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator \f$x_0\neq x_1\f$ static ExecStatus post(Home home, V0 x0, V1 x1); }; /* * Order propagators * */ /** * \brief Less or equal propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class Lq : public MixBinaryPropagator { protected: using MixBinaryPropagator::x0; using MixBinaryPropagator::x1; /// Constructor for cloning \a p Lq(Space& home, Lq& p); /// Constructor for posting Lq(Home home, V0 x0, V1 x1); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator \f$x_0 \leq x_1\f$ static ExecStatus post(Home home, V0 x0, V1 x1); }; /** * \brief Less propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class Le : public MixBinaryPropagator { protected: using MixBinaryPropagator::x0; using MixBinaryPropagator::x1; /// Constructor for cloning \a p Le(Space& home, Le& p); /// Constructor for posting Le(Home home, V0 x0, V1 x1); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator \f$x_0 \le x_1\f$ static ExecStatus post(Home home, V0 x0, V1 x1); }; /* * Reified order propagators * */ /** * \brief Reified less or equal propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class ReLq : public ReBinaryPropagator { protected: using ReBinaryPropagator::x0; using ReBinaryPropagator::x1; using ReBinaryPropagator::b; /// Constructor for cloning \a p ReLq(Space& home, ReLq& p); /// Constructor for posting ReLq(Home home, View x0, View x1, CtrlView b); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator for \f$ (x_0 \leq x_1)\Leftrightarrow b\f$ static ExecStatus post(Home home, View x0, View x1, CtrlView b); }; /** * \brief Reified less or equal with integer propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class ReLqInt : public ReUnaryPropagator { protected: using ReUnaryPropagator::x0; using ReUnaryPropagator::b; /// Integer constant to check int c; /// Constructor for cloning \a p ReLqInt(Space& home, ReLqInt& p); /// Constructor for posting ReLqInt(Home home, View x, int c, CtrlView b); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator for \f$ (x \leq c)\Leftrightarrow b\f$ static ExecStatus post(Home home, View x, int c, CtrlView b); }; /** * \brief Lexical ordering propagator * * The propagator uses the algorithm (and also the automaton) * from: * Mats Carlsson, Nicolas Beldiceanu, Revisiting the * Lexicographic Ordering Constraint. SICS Technical * Report T2002:17, SICS, Sweden, 2002. * * It deviates in the following two main aspects: * - Assigned variables are eagerly eliminated * This yields the same incremental behaviour with * respect to states 1 and 2 of the automaton. * With respect to the values of \a q and \a r in the report: * - \a q is always 0 after elimination * - \a r is always 1 after elimination * * - It is not incremental with respect to states 3 and 4 * as no propagation event information is available * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class LexLqLe : public Propagator { protected: /// View arrays ViewArray x; ViewArray y; /// Determines whether propagator is strict or not bool strict; /// Constructor for cloning \a p LexLqLe(Space& home, LexLqLe& p); /// Constructor for posting LexLqLe(Home home, ViewArray& x, ViewArray& y, bool strict); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Cost function (defined as low linear) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator for lexical order between \a x and \a y static ExecStatus post(Home home, ViewArray& x, ViewArray& y, bool strict); /// Delete propagator and return its size virtual size_t dispose(Space& home); }; /** * \brief Lexical disequality propagator * * Requires \code #include \endcode * \ingroup FuncIntProp */ template class LexNq : public Propagator { protected: /// View currently subscribed to VX x0; /// View currently subscribed to VY y0; /// View currently subscribed to VX x1; /// View currently subscribed to VY y1; /// Views not yet subscribed to ViewArray x; /// Views not yet subscribed to ViewArray y; /// Update subscription ExecStatus resubscribe(Space& home, RelTest rt, VX& x0, VY& y0, VX x1, VY y1); /// Constructor for posting LexNq(Home home, ViewArray& x, ViewArray& y); /// Constructor for cloning \a p LexNq(Space& home, LexNq& p); public: /// Copy propagator during cloning virtual Actor* copy(Space& home); /// Cost function virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator \f$ x\neq y\f$ static ExecStatus post(Home home, ViewArray& x, ViewArray& y); /// Delete propagator and return its size virtual size_t dispose(Space& home); }; }}} #include #include #include #include #endif // STATISTICS: int-prop