Generated on Mon Aug 25 11:35:40 2008 for Gecode by doxygen 1.5.6

lin-rel.icc

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Christian Schulte, 2005
00008  *
00009  *  Last modified:
00010  *     $Date: 2008-02-26 10:40:46 +0100 (Tue, 26 Feb 2008) $ by $Author: schulte $
00011  *     $Revision: 6311 $
00012  *
00013  *  This file is part of Gecode, the generic constraint
00014  *  development environment:
00015  *     http://www.gecode.org
00016  *
00017  *  Permission is hereby granted, free of charge, to any person obtaining
00018  *  a copy of this software and associated documentation files (the
00019  *  "Software"), to deal in the Software without restriction, including
00020  *  without limitation the rights to use, copy, modify, merge, publish,
00021  *  distribute, sublicense, and/or sell copies of the Software, and to
00022  *  permit persons to whom the Software is furnished to do so, subject to
00023  *  the following conditions:
00024  *
00025  *  The above copyright notice and this permission notice shall be
00026  *  included in all copies or substantial portions of the Software.
00027  *
00028  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00029  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00030  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00031  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00032  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00033  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00034  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00035  *
00036  */
00037 
00038 namespace Gecode {
00039 
00040   namespace MiniModel {
00041 
00042     /*
00043      * Operations for linear expressions
00044      *
00045      */
00046     template<class Var>
00047     forceinline
00048     LinRel<Var>::LinRel(void) {}
00049 
00050     template<class Var>
00051     forceinline
00052     LinRel<Var>::LinRel(const LinExpr<Var>& l, IntRelType irt0, 
00053                         const LinExpr<Var>& r)
00054       : e(l-r), irt(irt0) {}
00055 
00056     template<class Var>
00057     forceinline
00058     LinRel<Var>::LinRel(const LinExpr<Var>& l, IntRelType irt0, int r)
00059       : e(l-r), irt(irt0) {}
00060 
00061     template<class Var>
00062     forceinline
00063     LinRel<Var>::LinRel(int l, IntRelType irt0, const LinExpr<Var>& r)
00064       : e(l-r), irt(irt0) {}
00065 
00066     template<class Var>
00067     forceinline IntRelType
00068     LinRel<Var>::neg(IntRelType irt) {
00069       switch (irt) {
00070       case IRT_EQ: return IRT_NQ;
00071       case IRT_NQ: return IRT_EQ;
00072       case IRT_LQ: return IRT_GR;
00073       case IRT_LE: return IRT_GQ;
00074       case IRT_GQ: return IRT_LE;
00075       case IRT_GR: return IRT_LQ;
00076       default: GECODE_NEVER;
00077       }
00078       return IRT_LQ;
00079     }
00080 
00081     template<class Var>
00082     inline void
00083     LinRel<Var>::post(Space* home, bool t,
00084                       IntConLevel icl, PropKind pk) const {
00085       if (t) {
00086         e.post(home,irt,icl,pk);
00087       } else {
00088         e.post(home,neg(irt),icl,pk);
00089       }
00090     }
00091 
00092     template<class Var>
00093     forceinline void
00094     LinRel<Var>::post(Space* home, const BoolVar& b,
00095                       IntConLevel icl, PropKind pk) const {
00096       e.post(home,irt,b,icl,pk);
00097     }
00098 
00099   }
00100 
00101 }
00102 
00103 /*
00104  * Construction of linear relations
00105  *
00106  */
00107 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00108 operator==(int l,
00109            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00110   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_EQ,r);
00111 }
00112 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00113 operator==(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00114            int r) {
00115   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_EQ,r);
00116 }
00117 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00118 operator==(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00119            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00120   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_EQ,r);
00121 }
00122 
00123 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00124 operator!=(int l,
00125            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00126   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_NQ,r);
00127 }
00128 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00129 operator!=(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00130            int r) {
00131   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_NQ,r);
00132 }
00133 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00134 operator!=(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00135            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00136   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_NQ,r);
00137 }
00138 
00139 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00140 operator<(int l,
00141           const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00142   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_LE,r);
00143 }
00144 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00145 operator<(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00146           int r) {
00147   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_LE,r);
00148 }
00149 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00150 operator<(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00151           const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00152   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_LE,r);
00153 }
00154 
00155 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00156 operator<=(int l,
00157            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00158   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_LQ,r);
00159 }
00160 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00161 operator<=(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00162            int r) {
00163   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_LQ,r);
00164 }
00165 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00166 operator<=(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00167            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00168   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_LQ,r);
00169 }
00170 
00171 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00172 operator>(int l,
00173           const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00174   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_GR,r);
00175 }
00176 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00177 operator>(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00178           int r) {
00179   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_GR,r);
00180 }
00181 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00182 operator>(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00183           const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00184   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_GR,r);
00185 }
00186 
00187 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00188 operator>=(int l,
00189            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00190   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_GQ,r);
00191 }
00192 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00193 operator>=(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00194            int r) {
00195   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_GQ,r);
00196 }
00197 inline Gecode::MiniModel::LinRel<Gecode::IntVar>
00198 operator>=(const Gecode::MiniModel::LinExpr<Gecode::IntVar>& l,
00199            const Gecode::MiniModel::LinExpr<Gecode::IntVar>& r) {
00200   return Gecode::MiniModel::LinRel<Gecode::IntVar>(l,Gecode::IRT_GQ,r);
00201 }
00202 
00203 
00204 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00205 operator==(int l,
00206            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00207   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_EQ,r);
00208 }
00209 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00210 operator==(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00211            int r) {
00212   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_EQ,r);
00213 }
00214 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00215 operator==(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00216            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00217   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_EQ,r);
00218 }
00219 
00220 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00221 operator!=(int l,
00222            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00223   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_NQ,r);
00224 }
00225 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00226 operator!=(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00227            int r) {
00228   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_NQ,r);
00229 }
00230 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00231 operator!=(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00232            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00233   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_NQ,r);
00234 }
00235 
00236 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00237 operator<(int l,
00238           const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00239   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_LE,r);
00240 }
00241 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00242 operator<(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00243           int r) {
00244   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_LE,r);
00245 }
00246 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00247 operator<(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00248           const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00249   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_LE,r);
00250 }
00251 
00252 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00253 operator<=(int l,
00254            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00255   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_LQ,r);
00256 }
00257 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00258 operator<=(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00259            int r) {
00260   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_LQ,r);
00261 }
00262 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00263 operator<=(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00264            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00265   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_LQ,r);
00266 }
00267 
00268 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00269 operator>(int l,
00270           const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00271   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_GR,r);
00272 }
00273 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00274 operator>(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00275           int r) {
00276   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_GR,r);
00277 }
00278 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00279 operator>(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00280           const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00281   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_GR,r);
00282 }
00283 
00284 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00285 operator>=(int l,
00286            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00287   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_GQ,r);
00288 }
00289 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00290 operator>=(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00291            int r) {
00292   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_GQ,r);
00293 }
00294 inline Gecode::MiniModel::LinRel<Gecode::BoolVar>
00295 operator>=(const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& l,
00296            const Gecode::MiniModel::LinExpr<Gecode::BoolVar>& r) {
00297   return Gecode::MiniModel::LinRel<Gecode::BoolVar>(l,Gecode::IRT_GQ,r);
00298 }
00299 
00300 
00301 namespace Gecode {
00302 
00303   /*
00304    * Posting
00305    *
00306    */
00307 
00308   template<class Var>
00309   forceinline void
00310   post(Space* home, const MiniModel::LinRel<Var>& r, 
00311        IntConLevel icl, PropKind pk) {
00312     if (home->failed()) return;
00313     r.post(home,true,icl,pk);
00314   }
00315   forceinline void
00316   post(Space* home, bool r, IntConLevel, PropKind) {
00317     if (home->failed()) return;
00318     if (!r)
00319       home->fail();
00320   }
00321 
00322 }
00323 
00324 // STATISTICS: minimodel-any