Generated on Wed Nov 1 15:04:43 2006 for Gecode by doxygen 1.4.5

lin-rel.icc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Christian Schulte <schulte@gecode.org>
00004  *
00005  *  Copyright:
00006  *     Christian Schulte, 2005
00007  *
00008  *  Last modified:
00009  *     $Date: 2006-08-04 16:05:26 +0200 (Fri, 04 Aug 2006) $ by $Author: schulte $
00010  *     $Revision: 3513 $
00011  *
00012  *  This file is part of Gecode, the generic constraint
00013  *  development environment:
00014  *     http://www.gecode.org
00015  *
00016  *  See the file "LICENSE" for information on usage and
00017  *  redistribution of this file, and for a
00018  *     DISCLAIMER OF ALL WARRANTIES.
00019  *
00020  */
00021 
00022 namespace Gecode {
00023 
00024   namespace MiniModel {
00025 
00026     /*
00027      * Operations for linear expressions
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  * Construction of linear relations
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    * Posting
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 // STATISTICS: minimodel-any