set-rel.cpp
Go to the documentation of this file.
/* -*- 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 {
class SetIRTRel : public BoolExpr::Misc {
SetExpr _s;
LinIntExpr _x;
IntRelType _irt;
public:
SetIRTRel(const SetExpr&, IntRelType, const LinIntExpr&);
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
Gecode::BoolExpr
Boolean expressions.
Definition minimodel.hh:1329
Gecode::LinIntExpr
Linear expressions over integer variables.
Definition minimodel.hh:245
Gecode::SetCmpRel
Comparison relation (for two-sided comparisons).
Definition minimodel.hh:1221
Gecode::SetExpr
Set expressions
Definition minimodel.hh:1164
Gecode::SetRel
Set relations
Definition minimodel.hh:1234
Gecode::rel
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
Definition rel.cpp:68
Gecode::IntRelType
IntRelType
Relation types for integers.
Definition int.hh:925
Gecode::IRT_EQ
@ IRT_EQ
Equality ( ).
Definition int.hh:926
Gecode::IRT_NQ
@ IRT_NQ
Disequality ( ).
Definition int.hh:927
Gecode::IRT_GQ
@ IRT_GQ
Greater or equal ( ).
Definition int.hh:930
Gecode::IRT_LE
@ IRT_LE
Less ( ).
Definition int.hh:929
Gecode::IRT_GR
@ IRT_GR
Greater ( ).
Definition int.hh:931
Gecode::IRT_LQ
@ IRT_LQ
Less or equal ( ).
Definition int.hh:928
Gecode::SRT_NQ
@ SRT_NQ
Disequality ( ).
Definition set.hh:645
Gecode::SRT_EQ
@ SRT_EQ
Equality ( ).
Definition set.hh:644
Gecode::SRT_SUP
@ SRT_SUP
Superset ( ).
Definition set.hh:647
Gecode::SRT_DISJ
@ SRT_DISJ
Disjoint ( ).
Definition set.hh:648
Gecode::SRT_SUB
@ SRT_SUB
Subset ( ).
Definition set.hh:646
minimodel.hh
Gecode
Gecode toplevel namespace
Gecode::operator<=
bool operator<=(const FloatVal &x, const FloatVal &y)
Definition val.hpp:243
Gecode::operator||
SetRel operator||(const SetExpr &, const SetExpr &)
Disjointness of set expressions.
Definition set-rel.cpp:71
Gecode::neg
IntRelType neg(IntRelType irt)
Return negated relation type of irt.
Definition irt.hpp:52
Gecode::operator>=
bool operator>=(const FloatVal &x, const FloatVal &y)
Definition val.hpp:277
Gecode::post
TFE post(PropagatorGroup g)
Only post functions (but not propagators) from g are considered.
Definition filter.cpp:138
Gecode::operator==
bool operator==(const FloatVal &x, const FloatVal &y)
Definition val.hpp:294
Gecode::operator!=
bool operator!=(const FloatVal &x, const FloatVal &y)
Definition val.hpp:317
Test::Float::Arithmetic::b
Gecode::FloatVal b(9, 12)