46#ifndef GECODE_MINIMODEL_HH
47#define GECODE_MINIMODEL_HH
51#ifdef GECODE_HAS_SET_VARS
54#ifdef GECODE_HAS_FLOAT_VARS
58#ifdef GECODE_HAS_FAULT_INJECTION
69#if !defined(GECODE_STATIC_LIBS) && \
70 (defined(__CYGWIN__) || defined(__MINGW32__) || defined(_MSC_VER))
72#ifdef GECODE_BUILD_MINIMODEL
73#define GECODE_MINIMODEL_EXPORT __declspec( dllexport )
75#define GECODE_MINIMODEL_EXPORT __declspec( dllimport )
80#ifdef GECODE_GCC_HAS_CLASS_VISIBILITY
82#define GECODE_MINIMODEL_EXPORT __attribute__ ((visibility("default")))
86#define GECODE_MINIMODEL_EXPORT
92#ifndef GECODE_BUILD_MINIMODEL
93#define GECODE_LIBRARY_NAME "MiniModel"
215#ifdef GECODE_HAS_SET_VARS
218#ifdef GECODE_HAS_FLOAT_VARS
241 void*
operator new(
size_t s);
243 void operator delete(
void* p,
size_t s);
252 namespace MiniModel {
253 class ArithNonLinIntExpr;
260#ifdef GECODE_HAS_SET_VARS
263#ifdef GECODE_HAS_FLOAT_VARS
292#ifdef GECODE_HAS_FAULT_INJECTION
312 LinIntExpr(
const IntArgs& a,
const IntVarArgs& x);
318 LinIntExpr(
const IntArgs& a,
const BoolVarArgs& x);
339 void post(Home home,
IntRelType irt,
const IntPropLevels& ipls)
const;
343 const IntPropLevels& ipls)
const;
346 IntVar
post(Home home,
const IntPropLevels& ipls)
const;
349 NonLinIntExpr*
nle(
void)
const;
814#ifdef GECODE_HAS_FLOAT_VARS
833 void*
operator new(
size_t s);
835 void operator delete(
void* p,
size_t s);
1185#ifdef GECODE_HAS_SET_VARS
1273 void post(
Home home,
bool t)
const;
1389 BoolExpr
operator &&(
const BoolExpr&,
const BoolExpr&);
1391 BoolExpr
operator ||(
const BoolExpr&,
const BoolExpr&);
1416#ifdef GECODE_HAS_FLOAT_VARS
1421#ifdef GECODE_HAS_SET_VARS
1440 const BoolExpr&
operator =(
const BoolExpr& e);
1513#ifdef GECODE_HAS_SET_VARS
1525#ifdef GECODE_HAS_FLOAT_VARS
1542#ifdef GECODE_HAS_SET_VARS
1633#ifdef GECODE_HAS_FLOAT_VARS
1638#ifdef GECODE_HAS_SET_VARS
1663 namespace MiniModel {
1682 std::string toString(
void)
const;
1699 const REG& operator =(
const REG& r);
1702 REG operator +(
const REG& r);
1704 REG& operator +=(
const REG& r);
1706 REG operator |(
const REG& r);
1708 REG& operator |=(
const REG& r);
1710 REG operator *(
void);
1712 REG operator +(
void);
1714 REG operator ()(
unsigned int n,
unsigned int m);
1716 REG operator ()(
unsigned int n);
1718 template<
class Char,
class Traits>
1719 std::basic_ostream<Char,Traits>&
1720 print(std::basic_ostream<Char,Traits>& os)
const;
1730 template<
class Char,
class Traits>
1731 std::basic_ostream<Char,Traits>&
1748 operator *(
const LinIntExpr& x,
const LinIntExpr& y);
1751 operator /(
const LinIntExpr& x,
const LinIntExpr& y);
1754 operator %(
const LinIntExpr& x,
const LinIntExpr& y);
1757 abs(
const LinIntExpr& e);
1760 min(
const LinIntExpr& x,
const LinIntExpr& y);
1763 min(
const IntVarArgs& x);
1766 max(
const LinIntExpr& x,
const LinIntExpr& y);
1769 max(
const IntVarArgs& x);
1772 sqr(
const LinIntExpr& x);
1775 sqrt(
const LinIntExpr& x);
1778 pow(
const LinIntExpr& x,
int n);
1781 nroot(
const LinIntExpr& x,
int n);
1784 element(
const IntVarArgs& x,
const LinIntExpr& y);
1787 element(
const BoolVarArgs& x,
const LinIntExpr& y);
1790 element(
const IntArgs& x,
const LinIntExpr& y);
1793 ite(
const BoolExpr& b,
const LinIntExpr& x,
const LinIntExpr& y);
1796#ifdef GECODE_HAS_FLOAT_VARS
1799 operator *(
const FloatVar&,
const FloatVar&);
1802 operator *(
const FloatVar&,
const LinFloatExpr&);
1805 operator *(
const LinFloatExpr&,
const FloatVar&);
1808 abs(
const LinFloatExpr& e);
1811 min(
const LinFloatExpr& x,
const LinFloatExpr& y);
1814 min(
const FloatVarArgs& x);
1817 max(
const LinFloatExpr& x,
const LinFloatExpr& y);
1820 max(
const FloatVarArgs& x);
1823 operator *(
const LinFloatExpr& x,
const LinFloatExpr& y);
1826 operator /(
const LinFloatExpr& x,
const LinFloatExpr& y);
1829 sqr(
const LinFloatExpr& x);
1832 sqrt(
const LinFloatExpr& x);
1835 pow(
const LinFloatExpr& x,
int n);
1838 nroot(
const LinFloatExpr& x,
int n);
1841#ifdef GECODE_HAS_MPFR
1850 exp(
const LinFloatExpr& x);
1853 log(
const LinFloatExpr& x);
1864 asin(
const LinFloatExpr& x);
1867 sin(
const LinFloatExpr& x);
1870 acos(
const LinFloatExpr& x);
1873 cos(
const LinFloatExpr& x);
1876 atan(
const LinFloatExpr& x);
1879 tan(
const LinFloatExpr& x);
1900#ifdef GECODE_HAS_FLOAT_VARS
1905#ifdef GECODE_HAS_SET_VARS
2093#ifdef GECODE_HAS_SET_VARS
2134 template<
class>
class Matrix;
2235 Matrix(A a,
int w,
int h);
2252 int width(
void)
const;
2293 template<
class Char,
class Traits,
class A>
2294 std::basic_ostream<Char,Traits>&
2300 template<
class Char,
class Traits,
class A>
2301 std::basic_ostream<Char,Traits>&
2336#ifdef GECODE_HAS_SET_VARS
2395 sum(
const Slice<IntArgs>& slice);
2398 sum(
const Matrix<IntArgs>& matrix);
2482#ifdef GECODE_HAS_FLOAT_VARS
Traits of arrays in Gecode.
Miscealloneous Boolean expressions.
Misc(void)
Default constructor.
virtual void post(Home home, BoolVar b, bool neg, const IntPropLevels &ipls)=0
Node for Boolean expression
friend BoolExpr operator||(const BoolExpr &, const BoolExpr &)
friend BoolExpr operator&&(const BoolExpr &, const BoolExpr &)
NodeType
Type of Boolean expression.
@ NT_RLINFLOAT
Reified linear relation.
@ NT_RLIN
Reified linear relation.
@ NT_MISC
Other Boolean expression.
@ NT_RSET
Reified set relation.
const BoolExpr & operator=(const BoolExpr &e)
Assignment operator.
BoolVar expr(Home home, const IntPropLevels &ipls) const
Post propagators for expression.
~BoolExpr(void)
Destructor.
void rel(Home home, const IntPropLevels &ipls) const
Post propagators for relation.
Passing Boolean variables.
Boolean integer variables.
Deterministic finite automaton (DFA).
virtual void constrain(const Space &best)
Member function constraining according to cost.
FloatNum step
Step by which a next solution has to have lower cost.
virtual FloatVar cost(void) const =0
Return variable with current cost.
FloatMaximizeSpace(FloatNum s=0.0)
Constructor with step s.
virtual FloatVar cost(void) const =0
Return variable with current cost.
virtual void constrain(const Space &best)
Member function constraining according to cost.
FloatMinimizeSpace(FloatNum s=0.0)
Constructor with step s.
FloatNum step
Step by which a next solution has to have lower cost.
Base class for heap allocated objects.
Home class for posting propagators
Passing integer arguments.
virtual IntVarArgs cost(void) const =0
Return variables with current costs.
IntLexMaximizeSpace(void)
Default constructor.
virtual void constrain(const Space &best)
Member function constraining according to increasing costs.
virtual IntVarArgs cost(void) const =0
Return variables with current costs.
virtual void constrain(const Space &best)
Member function constraining according to decreasing costs.
IntLexMinimizeSpace(void)
Default constructor.
virtual IntVar cost(void) const =0
Return variable with current cost.
IntMaximizeSpace(void)
Default constructor.
virtual void constrain(const Space &best)
Member function constraining according to increasing cost.
virtual IntVar cost(void) const =0
Return variable with current cost.
IntMinimizeSpace(void)
Default constructor.
virtual void constrain(const Space &best)
Member function constraining according to decreasing cost.
Class for specifying integer propagation levels used by minimodel.
IntPropLevel _linear
For n-ary linear.
IntPropLevel div(void) const
Return integer propagation level for division constraints.
IntPropLevel element(void) const
Return integer propagation level for element constraints.
IntPropLevel _sqr
For square.
IntPropLevel mod(void) const
Return integer propagation level for modulo constraints.
IntPropLevel linear(void) const
Return integer propagation level for non-binary linear constraints.
IntPropLevel max2(void) const
Return integer propagation level for binary maximum constraints.
IntPropLevel _mult
For multiplication.
IntPropLevel _mod
For modulo.
IntPropLevel ite(void) const
Return integer propagation level for if-then-else constraints.
IntPropLevel mult(void) const
Return integer propagation level for multiplication constraints.
IntPropLevel min(void) const
Return integer propagation level for non-binary minimum constraints.
IntPropLevel _sqrt
For square root.
IntPropLevel _ite
For if-then-else.
IntPropLevel nroot(void) const
Return integer propagation level for root constraints.
IntPropLevel abs(void) const
Return integer propagation level for absolute value constraints.
IntPropLevel _max
For n-ary maximum.
IntPropLevel _nroot
For root.
IntPropLevel _pow
For power.
IntPropLevel _element
For element.
IntPropLevel _div
For division.
IntPropLevel _abs
For absolute value.
IntPropLevel sqrt(void) const
Return integer propagation level for square root constraints.
IntPropLevels(IntPropLevel ipl=IPL_DEF)
Initialize with default propagation level.
static const IntPropLevels def
Default propagation levels for all constraints.
IntPropLevel linear2(void) const
Return integer propagation level for binary linear constraints.
IntPropLevel min2(void) const
Return integer propagation level for binary minimum constraints.
IntPropLevel _min2
For binary minimum.
IntPropLevel pow(void) const
Return integer propagation level for power constraints.
IntPropLevel _min
For minimum.
IntPropLevel _linear2
For binary linear.
IntPropLevel _max2
For binary maximum.
IntPropLevel max(void) const
Return integer propagation level for non-binary maximum constraints.
IntPropLevel sqr(void) const
Return integer propagation level for square constraints.
Passing integer variables.
NonLinFloatExpr * nlfe(void) const
Return non-linear expression inside, or null if not non-linear.
LinFloatExpr(void)
Default constructor.
const LinFloatExpr & operator=(const LinFloatExpr &e)
Assignment operator.
~LinFloatExpr(void)
Destructor.
void post(Home home, FloatRelType frt) const
Post propagator.
NodeType
Type of linear expression.
@ NT_VAR
Linear term with variable.
@ NT_CONST
Float value constant.
@ NT_SUM
Sum of float variables.
@ NT_NONLIN
Non-linear expression.
@ NT_ADD
Addition of linear terms.
@ NT_MUL
Multiplication by coefficient.
@ NT_SUB
Subtraction of linear terms.
void post(Home home, bool t) const
Post propagator for relation (if t is false for negated relation).
Linear expressions over integer variables.
NodeType
Type of linear expression.
@ NT_CONST
Integer constant.
@ NT_SUB
Subtraction of linear terms.
@ NT_SUM_BOOL
Sum of Boolean variables.
@ NT_ADD
Addition of linear terms.
@ NT_SUM_INT
Sum of integer variables.
@ NT_VAR_BOOL
Linear term with Boolean variable.
@ NT_MUL
Multiplication by coefficient.
@ NT_NONLIN
Non-linear expression.
@ NT_VAR_INT
Linear term with integer variable.
LinIntExpr(void)
Default constructor.
friend class LinFloatExpr
~LinIntExpr(void)
Destructor.
void post(Home home, IntRelType irt, const IntPropLevels &ipls) const
Post propagator.
const LinIntExpr & operator=(const LinIntExpr &e)
Assignment operator.
NonLinIntExpr * nle(void) const
Return non-linear expression inside, or null if not non-linear.
Linear relations over integer variables.
void post(Home home, bool t, const IntPropLevels &ipls) const
Post propagator for relation (if t is false for negated relation).
Matrix-interface for arrays.
int width(void) const
Return the width of the matrix.
ValueType & operator()(int c, int r)
Access element (c, r) of the matrix.
Slice< A > slice(int fc, int tc, int fr, int tr) const
Access slice of the matrix.
Slice< A > col(int c) const
Access column c.
ArrayTraits< A >::ValueType ValueType
The type of elements of this array.
Slice< A > row(int r) const
Access row r.
ArgsType const get_array(void) const
Return an Args-array of the contents of the matrix.
Matrix(A a, int w, int h)
Basic constructor.
ArrayTraits< A >::ArgsType ArgsType
The type of the Args-array type for ValueType values.
int height(void) const
Return the height of the matrix.
Non-linear arithmetic expressions over integer variables.
Base class for non-linear float expressions.
virtual void post(Home home, FloatRelType frt, FloatVal c) const =0
Post expression to be in relation frt with c.
static FloatVar result(Home home, FloatVar *x)
Return fresh variable if x is null, x otherwise.
virtual ~NonLinFloatExpr(void)
Destructor.
virtual void post(Home home, FloatRelType frt, FloatVal c, BoolVar b) const =0
Post reified expression to be in relation frt with c.
virtual FloatVar post(Home home, FloatVar *ret) const =0
Return variable constrained to be equal to the expression.
Base class for non-linear expressions over integer variables.
virtual void post(Home home, IntRelType irt, int c, BoolVar b, const IntPropLevels &ipls) const =0
Post reified expression to be in relation irt with c.
static IntVar result(Home home, IntVar *x)
Return fresh variable if x is null, x otherwise.
virtual void post(Home home, IntRelType irt, int c, const IntPropLevels &ipls) const =0
Post expression to be in relation irt with c.
virtual IntVar post(Home home, IntVar *ret, const IntPropLevels &ipls) const =0
Return variable constrained to be equal to the expression.
virtual ~NonLinIntExpr(void)
Destructor.
Implementation of the actual expression tree.
Regular expressions over integer values.
Comparison relation (for two-sided comparisons).
SetRelType srt
Which relation.
SetExpr l
Left side of relation.
SetExpr r
Right side of relation.
SetCmpRel(const SetExpr &l, SetRelType srt, const SetExpr &r)
Constructor.
SetExpr(void)
Default constructor.
SetVar post(Home home) const
Post propagators for expression.
~SetExpr(void)
Destructor.
NodeType
Type of set expression.
@ NT_DUNION
Disjoint union.
@ NT_LEXP
Linear expression.
const SetExpr & operator=(const SetExpr &e)
Assignment operator.
void post(Home home, bool t) const
Post propagators for relation (or negated relation if t is false).
SetRel(void)
Default constructor.
Slice(const Matrix< A > &a, int fc, int tc, int fr, int tr)
Construct slice.
Slice & reverse(void)
Reverses the contents of the slice, and returns a reference to it.
ArrayTraits< A >::ArgsType ArgsType
The type of the Args-array type for ValueType values.
A reference-counted pointer to a SymmetryObject.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
void ite(Home home, BoolVar b, FloatVar x, FloatVar y, FloatVar z)
Post propagator for if-then-else constraint.
double FloatNum
Floating point number base type.
FloatRelType
Relation types for floats.
IntRelType
Relation types for integers.
IntPropLevel
Propagation levels for integer propagators.
@ IPL_BITS_
Number of bits required (internal).
@ IPL_DEF
Simple propagation levels.
Space(void)
Default constructor.
SetRelType
Common relation types for sets.
void print(const Search::Statistics &stat, bool restart)
Print statistics.
#define GECODE_MINIMODEL_EXPORT
Minimalistic modeling support.
Gecode toplevel namespace
FloatVal operator/(const FloatVal &x, const FloatVal &y)
void lex(Home home, const IntVarArgs &x, IntRelType r, const IntVarArgs &y, IntPropLevel ipl=IPL_DEF)
Post lexical order between x and y.
FloatVal operator-(const FloatVal &x)
bool operator<=(const FloatVal &x, const FloatVal &y)
void sin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
FloatVal operator+(const FloatVal &x)
SymmetryHandle rows_reflect(const Matrix< A > &m)
Reflect rows symmetry specification.
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
void atmost(Home home, const IntVarArgs &x, int n, int m, IntPropLevel ipl=IPL_DEF)
Post constraint .
SetRel operator||(const SetExpr &, const SetExpr &)
Disjointness of set expressions.
void sqr(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
IntVar expr(Home home, const LinIntExpr &e, const IntPropLevels &ipls=IntPropLevels::def)
Post linear expression and return its value.
SetExpr operator&(const SetExpr &, const SetExpr &)
Intersection of set expressions.
Archive & operator<<(Archive &e, FloatNumBranch nl)
void atleast(Home home, const IntVarArgs &x, int n, int m, IntPropLevel ipl=IPL_DEF)
Post constraint .
void cos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IntRelType neg(IntRelType irt)
Return negated relation type of irt.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
bool operator<(const FloatVal &x, const FloatVal &y)
void element(Home home, IntSharedArray n, IntVar x0, IntVar x1, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for .
SetExpr inter(const SetVarArgs &)
Intersection of set variables.
BoolExpr operator!(const BoolExpr &)
Negated Boolean expression.
BoolExpr operator^(const BoolExpr &, const BoolExpr &)
Exclusive-or of Boolean expressions.
void range(Home home, const IntVarArgs &x, SetVar y, SetVar z)
Post constraint .
void roots(Home home, const IntVarArgs &x, SetVar y, SetVar z)
Post constraint .
void sqrt(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void values(Home home, const IntVarArgs &x, IntSet y, IntPropLevel ipl=IPL_DEF)
Post constraint .
void acos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
SymmetryHandle columns_reflect(const Matrix< A > &m)
Reflect columns symmetry specification.
bool operator>(const FloatVal &x, const FloatVal &y)
void log(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
bool operator>=(const FloatVal &x, const FloatVal &y)
SetExpr setdunion(const SetVarArgs &)
Disjoint union of set variables.
SymmetryHandle rows_interchange(const Matrix< A > &m)
Interchangeable rows symmetry specification.
LinIntExpr sum(const IntVarArgs &x)
Construct linear expression as sum of integer variables.
void exactly(Home home, const IntVarArgs &x, int n, int m, IntPropLevel ipl=IPL_DEF)
Post constraint .
SetExpr setunion(const SetVarArgs &)
Union of set variables.
SetExpr singleton(const LinIntExpr &)
Singleton expression.
void exp(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void atan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Archive & operator>>(Archive &e, FloatNumBranch &nl)
BoolExpr operator&&(const BoolExpr &, const BoolExpr &)
void asin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
SetExpr operator|(const SetExpr &, const SetExpr &)
Union of set expressions.
void pow(Home home, FloatVar x0, int n, FloatVar x1)
Post propagator for for .
LinIntExpr cardinality(const SetExpr &)
Cardinality of set expression.
FloatVal operator*(const FloatVal &x, const FloatVal &y)
SymmetryHandle diagonal_reflect(const Matrix< A > &m)
Reflect around main diagonal symmetry specification.
void nroot(Home home, FloatVar x0, int n, FloatVar x1)
Post propagator for for .
bool operator==(const FloatVal &x, const FloatVal &y)
LinIntExpr operator%(const LinIntExpr &x, const LinIntExpr &y)
Return expression for .
bool operator!=(const FloatVal &x, const FloatVal &y)
SymmetryHandle columns_interchange(const Matrix< A > &m)
Interchangeable columns symmetry specification.
void tan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
#define GECODE_VTABLE_EXPORT