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

lin-expr.icc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Guido Tack <tack@gecode.org>
00004  *
00005  *  Copyright:
00006  *     Guido Tack, 2004
00007  *
00008  *  Last modified:
00009  *     $Date: 2006-08-23 13:12:00 +0200 (Wed, 23 Aug 2006) $ by $Author: tack $
00010  *     $Revision: 3553 $
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 { namespace MiniModel {
00023 
00024   /*
00025    * Operations for nodes
00026    *
00027    */
00028   forceinline void*
00029   LinExpr::Node::operator new(size_t size) {
00030     return Memory::malloc(size);
00031   }
00032 
00033   forceinline void
00034   LinExpr::Node::operator delete(void* p, size_t) {
00035     Memory::free(p);
00036   }
00037 
00038 
00039   forceinline void
00040   LinExpr::Node::increment(void) {
00041     ++use;
00042   }
00043 
00044   forceinline
00045   LinExpr::Node::Node(int a, const IntVar& x) :
00046     use(1),
00047     left(NULL), right(NULL), signLeft(0), signRight(0),
00048     a(a), x(x) {}
00049 
00050   forceinline
00051   LinExpr::Node::Node(Node* l, int sL, Node* r, int sR) :
00052     use(1),
00053     left(l), right(r), signLeft(sL), signRight(sR) {
00054     left->increment();
00055     right->increment();
00056   }
00057 
00058   /*
00059    * Operations for expressions
00060    *
00061    */
00062 
00063   forceinline
00064   LinExpr::LinExpr(void)
00065     : ax(NULL), n(0) {}
00066 
00067   inline
00068   LinExpr::LinExpr(const IntVar& x, int a, int c0) :
00069     ax(new Node(a, x)), n(1), c(c0), sign(1) {
00070   }
00071 
00072   inline
00073   LinExpr::LinExpr(const LinExpr& t1, const LinExpr& t2, int m) :
00074     ax(new Node(t1.ax, t1.sign, t2.ax, t2.sign*m)),
00075     n(t1.n+t2.n),
00076     c(t1.c+m*t2.c), sign(1) {}
00077 
00078   forceinline
00079   LinExpr::LinExpr(const LinExpr& t, int c0, int sign) :
00080     ax(t.ax), n(t.n), c(sign*t.c+c0), sign(t.sign*sign) {
00081     ax->increment();
00082   }
00083 
00084   forceinline
00085   LinExpr::LinExpr(int a, const LinExpr& t) :
00086     ax(t.ax), n(t.n), c(a*t.c), sign(a*t.sign) {
00087     ax->increment();
00088   }
00089 
00090   inline const LinExpr&
00091   LinExpr::operator=(const LinExpr& t) {
00092     if (this != &t) {
00093       if ((ax != NULL) && ax->decrement())
00094         delete ax;
00095       n    = t.n;
00096       ax   = t.ax;
00097       c    = t.c;
00098       sign = t.sign;
00099       ax->increment();
00100     }
00101     return *this;
00102   }
00103 
00104   forceinline
00105   LinExpr::~LinExpr(void) {
00106     if ((ax != NULL) && ax->decrement())
00107       delete ax;
00108   }
00109 
00110 }}
00111 
00112 inline Gecode::MiniModel::LinExpr
00113 operator+(int c,
00114           const Gecode::MiniModel::LinExpr& t) {
00115   return Gecode::MiniModel::LinExpr(t,c,1);
00116 }
00117 inline Gecode::MiniModel::LinExpr
00118 operator+(const Gecode::MiniModel::LinExpr& t,
00119           int c) {
00120   return Gecode::MiniModel::LinExpr(t,c,1);
00121 }
00122 inline Gecode::MiniModel::LinExpr
00123 operator+(const Gecode::MiniModel::LinExpr& t1,
00124           const Gecode::MiniModel::LinExpr& t2) {
00125   return Gecode::MiniModel::LinExpr(t1,t2,1);
00126 }
00127 
00128 
00129 inline Gecode::MiniModel::LinExpr
00130 operator-(int c,
00131           const Gecode::MiniModel::LinExpr& t) {
00132   return Gecode::MiniModel::LinExpr(t, c, -1);
00133 }
00134 inline Gecode::MiniModel::LinExpr
00135 operator-(const Gecode::MiniModel::LinExpr& t,
00136           int c) {
00137   return Gecode::MiniModel::LinExpr(t, -c, 1);
00138 }
00139 inline Gecode::MiniModel::LinExpr
00140 operator-(const Gecode::MiniModel::LinExpr& t1,
00141           const Gecode::MiniModel::LinExpr& t2) {
00142   return Gecode::MiniModel::LinExpr(t1, t2, -1);
00143 }
00144 
00145 
00146 inline Gecode::MiniModel::LinExpr
00147 operator-(const Gecode::MiniModel::LinExpr& t) {
00148   return Gecode::MiniModel::LinExpr(t,0,-1);
00149 }
00150 
00151 
00152 inline Gecode::MiniModel::LinExpr
00153 operator*(int a, const Gecode::IntVar& x) {
00154   return Gecode::MiniModel::LinExpr(x,a);
00155 }
00156 inline Gecode::MiniModel::LinExpr
00157 operator*(const Gecode::IntVar& x, int a) {
00158   return Gecode::MiniModel::LinExpr(x,a);
00159 }
00160 inline Gecode::MiniModel::LinExpr
00161 operator*(const Gecode::MiniModel::LinExpr& t, int a) {
00162   return Gecode::MiniModel::LinExpr(a,t);
00163 }
00164 inline Gecode::MiniModel::LinExpr
00165 operator*(int a, const Gecode::MiniModel::LinExpr& t) {
00166   return Gecode::MiniModel::LinExpr(a,t);
00167 }
00168 
00169 namespace Gecode {
00170 
00171   forceinline IntVar
00172   post(Space* home, const IntVar& x, IntConLevel) {
00173     return x;
00174   }
00175 
00176   inline IntVar
00177   post(Space* home, int n, IntConLevel) {
00178     IntVar x(home, n, n);
00179     return x;
00180   }
00181 
00182   inline IntVar
00183   post(Space* home, const MiniModel::LinExpr& e, IntConLevel icl) {
00184     if (!home->failed())
00185       return e.post(home,icl);
00186     IntVar x(home,Limits::Int::int_min,Limits::Int::int_max);
00187     return x;
00188   }
00189 
00190 }
00191 
00192 // STATISTICS: minimodel-any