00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 namespace Gecode {
00023
00024 namespace MiniModel {
00025
00026
00027
00028
00029
00030 forceinline
00031 LinRel::LinRel(void) {}
00032
00033 forceinline
00034 LinRel::LinRel(const LinExpr& l, IntRelType irt0, const LinExpr& r)
00035 : e(l,r,-1), irt(irt0) {}
00036
00037 forceinline
00038 LinRel::LinRel(const LinExpr& l, IntRelType irt0, int r)
00039 : e(l,-r,1), irt(irt0) {}
00040
00041 forceinline
00042 LinRel::LinRel(int l, IntRelType irt0, const LinExpr& r)
00043 : e(r,-l,-1), irt(irt0) {}
00044
00045 forceinline IntRelType
00046 LinRel::neg(IntRelType irt) {
00047 switch (irt) {
00048 case IRT_EQ: return IRT_NQ;
00049 case IRT_NQ: return IRT_EQ;
00050 case IRT_LQ: return IRT_GR;
00051 case IRT_LE: return IRT_GQ;
00052 case IRT_GQ: return IRT_LE;
00053 case IRT_GR:
00054 default:
00055 assert(irt == IRT_GR);
00056 }
00057 return IRT_LQ;
00058 }
00059
00060 inline void
00061 LinRel::post(Space* home, bool t, IntConLevel icl) const {
00062 if (t) {
00063 e.post(home,irt,icl);
00064 } else {
00065 e.post(home,neg(irt),icl);
00066 }
00067 }
00068
00069 forceinline void
00070 LinRel::post(Space* home, const BoolVar& b) const {
00071 e.post(home,irt,b);
00072 }
00073
00074 }
00075
00076 }
00077
00078
00079
00080
00081
00082 inline Gecode::MiniModel::LinRel
00083 operator==(int l,
00084 const Gecode::MiniModel::LinExpr& r) {
00085 return Gecode::MiniModel::LinRel(l,Gecode::IRT_EQ,r);
00086 }
00087 inline Gecode::MiniModel::LinRel
00088 operator==(const Gecode::MiniModel::LinExpr& l,
00089 int r) {
00090 return Gecode::MiniModel::LinRel(l,Gecode::IRT_EQ,r);
00091 }
00092 inline Gecode::MiniModel::LinRel
00093 operator==(const Gecode::MiniModel::LinExpr& l,
00094 const Gecode::MiniModel::LinExpr& r) {
00095 return Gecode::MiniModel::LinRel(l,Gecode::IRT_EQ,r);
00096 }
00097
00098 inline Gecode::MiniModel::LinRel
00099 operator!=(int l,
00100 const Gecode::MiniModel::LinExpr& r) {
00101 return Gecode::MiniModel::LinRel(l,Gecode::IRT_NQ,r);
00102 }
00103 inline Gecode::MiniModel::LinRel
00104 operator!=(const Gecode::MiniModel::LinExpr& l,
00105 int r) {
00106 return Gecode::MiniModel::LinRel(l,Gecode::IRT_NQ,r);
00107 }
00108 inline Gecode::MiniModel::LinRel
00109 operator!=(const Gecode::MiniModel::LinExpr& l,
00110 const Gecode::MiniModel::LinExpr& r) {
00111 return Gecode::MiniModel::LinRel(l,Gecode::IRT_NQ,r);
00112 }
00113
00114 inline Gecode::MiniModel::LinRel
00115 operator<(int l,
00116 const Gecode::MiniModel::LinExpr& r) {
00117 return Gecode::MiniModel::LinRel(l,Gecode::IRT_LE,r);
00118 }
00119 inline Gecode::MiniModel::LinRel
00120 operator<(const Gecode::MiniModel::LinExpr& l,
00121 int r) {
00122 return Gecode::MiniModel::LinRel(l,Gecode::IRT_LE,r);
00123 }
00124 inline Gecode::MiniModel::LinRel
00125 operator<(const Gecode::MiniModel::LinExpr& l,
00126 const Gecode::MiniModel::LinExpr& r) {
00127 return Gecode::MiniModel::LinRel(l,Gecode::IRT_LE,r);
00128 }
00129
00130 inline Gecode::MiniModel::LinRel
00131 operator<=(int l,
00132 const Gecode::MiniModel::LinExpr& r) {
00133 return Gecode::MiniModel::LinRel(l,Gecode::IRT_LQ,r);
00134 }
00135 inline Gecode::MiniModel::LinRel
00136 operator<=(const Gecode::MiniModel::LinExpr& l,
00137 int r) {
00138 return Gecode::MiniModel::LinRel(l,Gecode::IRT_LQ,r);
00139 }
00140 inline Gecode::MiniModel::LinRel
00141 operator<=(const Gecode::MiniModel::LinExpr& l,
00142 const Gecode::MiniModel::LinExpr& r) {
00143 return Gecode::MiniModel::LinRel(l,Gecode::IRT_LQ,r);
00144 }
00145
00146 inline Gecode::MiniModel::LinRel
00147 operator>(int l,
00148 const Gecode::MiniModel::LinExpr& r) {
00149 return Gecode::MiniModel::LinRel(l,Gecode::IRT_GR,r);
00150 }
00151 inline Gecode::MiniModel::LinRel
00152 operator>(const Gecode::MiniModel::LinExpr& l,
00153 int r) {
00154 return Gecode::MiniModel::LinRel(l,Gecode::IRT_GR,r);
00155 }
00156 inline Gecode::MiniModel::LinRel
00157 operator>(const Gecode::MiniModel::LinExpr& l,
00158 const Gecode::MiniModel::LinExpr& r) {
00159 return Gecode::MiniModel::LinRel(l,Gecode::IRT_GR,r);
00160 }
00161
00162 inline Gecode::MiniModel::LinRel
00163 operator>=(int l,
00164 const Gecode::MiniModel::LinExpr& r) {
00165 return Gecode::MiniModel::LinRel(l,Gecode::IRT_GQ,r);
00166 }
00167 inline Gecode::MiniModel::LinRel
00168 operator>=(const Gecode::MiniModel::LinExpr& l,
00169 int r) {
00170 return Gecode::MiniModel::LinRel(l,Gecode::IRT_GQ,r);
00171 }
00172 inline Gecode::MiniModel::LinRel
00173 operator>=(const Gecode::MiniModel::LinExpr& l,
00174 const Gecode::MiniModel::LinExpr& r) {
00175 return Gecode::MiniModel::LinRel(l,Gecode::IRT_GQ,r);
00176 }
00177
00178
00179 namespace Gecode {
00180
00181
00182
00183
00184
00185
00186 forceinline void
00187 post(Space* home, const MiniModel::LinRel& r, IntConLevel icl) {
00188 if (home->failed()) return;
00189 r.post(home,true,icl);
00190 }
00191 forceinline void
00192 post(Space* home, bool r, IntConLevel) {
00193 if (home->failed()) return;
00194 if (!r)
00195 home->fail();
00196 }
00197
00198 }
00199
00200