Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
5.0 kB · 180 lines
C++
at develop
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- *//* * Main authors: * Christian Schulte <schulte@gecode.org> * Matthias Balzer <matthias.balzer@itwm.fraunhofer.de> * * Copyright: * Christian Schulte, 2005 * Fraunhofer ITWM, 2017 * * 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. * */
#include <gecode/minimodel.hh>
#ifdef GECODE_HAS_SET_VARS
namespace Gecode {
/* * Operators * */ SetRel operator ==(const SetExpr& e0, const SetExpr& e1) { return SetRel(e0, SRT_EQ, e1); } SetRel operator !=(const SetExpr& e0, const SetExpr& e1) { return SetRel(e0, SRT_NQ, e1); } SetCmpRel operator <=(const SetExpr& e0, const SetExpr& e1) { return SetCmpRel(e0, SRT_SUB, e1); } BoolExpr operator <=(const SetCmpRel& r, const SetExpr& l) { return BoolExpr(r) && BoolExpr(r.r <= l); } SetCmpRel operator >=(const SetExpr& e0, const SetExpr& e1) { return SetCmpRel(e0, SRT_SUP, e1); } BoolExpr operator >=(const SetCmpRel& r, const SetExpr& l) { return BoolExpr(r) && BoolExpr(r.r >= l); } SetRel operator ||(const SetExpr& e0, const SetExpr& e1) { return SetRel(e0, SRT_DISJ, e1); }
namespace {
/// Boolean expression for IRT relations with SetExpr class SetIRTRel : public BoolExpr::Misc { /// The set expression SetExpr _s; /// The integer expression LinIntExpr _x; /// The integer relation type IntRelType _irt; public: /// Constructor SetIRTRel(const SetExpr&, IntRelType, const LinIntExpr&); /// Constrain \a b to be equivalent to the expression (negated if \a neg) virtual void post(Home, BoolVar b, bool neg, const IntPropLevels&) override; };
SetIRTRel::SetIRTRel(const SetExpr& s, IntRelType irt, const LinIntExpr& x) : _s(s), _x(x), _irt(irt) {}
void SetIRTRel::post(Home home, BoolVar b, bool neg, const IntPropLevels& ipls) { if (b.zero()) { rel(home, _s.post(home), neg ? _irt : Gecode::neg(_irt), _x.post(home, ipls)); } else if (b.one()) { rel(home, _s.post(home), neg ? Gecode::neg(_irt) : _irt, _x.post(home, ipls)); } else { rel(home, _s.post(home), neg ? Gecode::neg(_irt) : _irt, _x.post(home, ipls), b); } } }
/* * IRT relations with SetExpr * */ BoolExpr operator ==(const SetExpr& x, const LinIntExpr& y) { return BoolExpr(new SetIRTRel(x, IRT_EQ, y)); } BoolExpr operator ==(const LinIntExpr& x, const SetExpr& y) { return operator ==(y, x); }
BoolExpr operator !=(const SetExpr& x, const LinIntExpr& y) { return BoolExpr(new SetIRTRel(x, IRT_NQ, y)); }
BoolExpr operator !=(const LinIntExpr& x, const SetExpr& y) { return operator !=(y, x); }
BoolExpr operator <=(const SetExpr& x, const LinIntExpr& y) { return BoolExpr(new SetIRTRel(x, IRT_LQ, y)); }
BoolExpr operator <=(const LinIntExpr& x, const SetExpr& y) { return operator >=(y, x); }
BoolExpr operator <(const SetExpr& x, const LinIntExpr& y) { return BoolExpr(new SetIRTRel(x, IRT_LE, y)); }
BoolExpr operator <(const LinIntExpr& x, const SetExpr& y) { return operator >(y, x); }
BoolExpr operator >=(const SetExpr& x, const LinIntExpr& y) { return BoolExpr(new SetIRTRel(x, IRT_GQ, y)); }
BoolExpr operator >=(const LinIntExpr& x, const SetExpr& y) { return operator <=(y, x); }
BoolExpr operator >(const SetExpr& x, const LinIntExpr& y) { return BoolExpr(new SetIRTRel(x, IRT_GR, y)); }
BoolExpr operator >(const LinIntExpr& x, const SetExpr& y) { return operator <(y, x); }
}
#endif
// STATISTICS: minimodel-any