00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gecode/minimodel.hh"
00023
00024 #include <algorithm>
00025
00026 namespace Gecode {
00027
00028 #define GECODE_MM_RETURN_FAILED \
00029 if (home->failed()) { \
00030 IntVar _x(home,0,0); return _x; \
00031 }
00032
00033 IntVar
00034 abs(Space* home, IntVar x, IntConLevel icl) {
00035 GECODE_MM_RETURN_FAILED;
00036 if (x.min() >= 0)
00037 return x;
00038 IntVar y(home,
00039 std::min(-x.max(),x.min()),
00040 std::max(-x.min(),x.max()));
00041 abs(home, x, y, icl);
00042 return y;
00043 }
00044
00045 IntVar
00046 min(Space* home, IntVar x, IntVar y, IntConLevel icl) {
00047 GECODE_MM_RETURN_FAILED;
00048 IntVar z(home,
00049 std::min(x.min(),y.min()),
00050 std::min(x.max(),y.max()));
00051 min(home, x, y, z, icl);
00052 return z;
00053 }
00054
00055 IntVar
00056 min(Space* home, const IntVarArgs& x, IntConLevel icl) {
00057 GECODE_MM_RETURN_FAILED;
00058 int min = Limits::Int::int_max;
00059 int max = Limits::Int::int_max;
00060 for (int i=x.size(); i--; ) {
00061 min = std::min(min,x[i].min());
00062 max = std::min(max,x[i].max());
00063 }
00064 IntVar y(home, min, max);
00065 Gecode::min(home, x, y, icl);
00066 return y;
00067 }
00068
00069 IntVar
00070 max(Space* home, IntVar x, IntVar y, IntConLevel icl) {
00071 GECODE_MM_RETURN_FAILED;
00072 IntVar z(home,
00073 std::max(x.min(),y.min()),
00074 std::max(x.max(),y.max()));
00075 max(home, x, y, z, icl);
00076 return z;
00077 }
00078
00079 IntVar
00080 max(Space* home, const IntVarArgs& x, IntConLevel icl) {
00081 GECODE_MM_RETURN_FAILED;
00082 int min = Limits::Int::int_min;
00083 int max = Limits::Int::int_min;
00084 for (int i=x.size(); i--; ) {
00085 min = std::max(min,x[i].min());
00086 max = std::max(max,x[i].max());
00087 }
00088 IntVar y(home, min, max);
00089 Gecode::max(home, x, y, icl);
00090 return y;
00091 }
00092
00093 IntVar
00094 mult(Space* home, IntVar x, IntVar y, IntConLevel icl) {
00095 GECODE_MM_RETURN_FAILED;
00096 IntVar z(home, Limits::Int::int_min, Limits::Int::int_max);
00097 mult(home, x, y, z, icl);
00098 return z;
00099 }
00100
00101 IntVar
00102 sqr(Space* home, IntVar x, IntConLevel icl) {
00103 GECODE_MM_RETURN_FAILED;
00104 IntVar y(home, 0, Limits::Int::int_max);
00105 mult(home, x, x, y, icl);
00106 return y;
00107 }
00108
00109 IntVar
00110 plus(Space* home, IntVar x, IntVar y, IntConLevel icl) {
00111 GECODE_MM_RETURN_FAILED;
00112 IntVar z(home,x.min()+y.min(),x.max()+y.max());
00113 Int::Linear::Term ts[3];
00114 ts[0].a = 1; ts[0].x = x;
00115 ts[1].a = 1; ts[1].x = y;
00116 ts[2].a = -1; ts[2].x = z;
00117 Int::Linear::post(home, ts, 3, IRT_EQ, 0, icl);
00118 return z;
00119 }
00120
00121 IntVar
00122 minus(Space* home, IntVar x, IntVar y, IntConLevel icl) {
00123 GECODE_MM_RETURN_FAILED;
00124 IntVar z(home,x.min()-y.max(),x.max()-y.min());
00125 Int::Linear::Term ts[3];
00126 ts[0].a = 1; ts[0].x = x;
00127 ts[1].a = -1; ts[1].x = y;
00128 ts[2].a = -1; ts[2].x = z;
00129 Int::Linear::post(home, ts, 3, IRT_EQ, 0, icl);
00130 return z;
00131 }
00132
00133 #undef GECODE_MM_RETURN_FAILED
00134
00135 }
00136
00137