00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 namespace Gecode { namespace MiniModel {
00023
00024
00025
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
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