00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "gecode/int/arithmetic.hh"
00039
00040 namespace Gecode {
00041
00042 using namespace Int;
00043
00044 void
00045 abs(Space* home, IntVar x0, IntVar x1, IntConLevel icl, PropKind) {
00046 if (home->failed()) return;
00047 if (icl == ICL_DOM) {
00048 GECODE_ES_FAIL(home,Arithmetic::AbsDom<IntView>::post(home,x0,x1));
00049 } else {
00050 GECODE_ES_FAIL(home,Arithmetic::AbsBnd<IntView>::post(home,x0,x1));
00051 }
00052 }
00053
00054
00055 void
00056 max(Space* home, IntVar x0, IntVar x1, IntVar x2,
00057 IntConLevel icl, PropKind) {
00058 if (home->failed()) return;
00059 if (icl == ICL_DOM) {
00060 GECODE_ES_FAIL(home,Arithmetic::MaxDom<IntView>::post(home,x0,x1,x2));
00061 } else {
00062 GECODE_ES_FAIL(home,Arithmetic::MaxBnd<IntView>::post(home,x0,x1,x2));
00063 }
00064 }
00065
00066 void
00067 max(Space* home, const IntVarArgs& x, IntVar y,
00068 IntConLevel icl, PropKind) {
00069 if (x.size() == 0)
00070 throw TooFewArguments("Int::max");
00071 if (home->failed()) return;
00072 ViewArray<IntView> xv(home,x);
00073 if (icl == ICL_DOM) {
00074 GECODE_ES_FAIL(home,Arithmetic::NaryMaxDom<IntView>::post(home,xv,y));
00075 } else {
00076 GECODE_ES_FAIL(home,Arithmetic::NaryMaxBnd<IntView>::post(home,xv,y));
00077 }
00078 }
00079
00080
00081 void
00082 min(Space* home, IntVar x0, IntVar x1, IntVar x2,
00083 IntConLevel icl, PropKind) {
00084 if (home->failed()) return;
00085 MinusView m0(x0); MinusView m1(x1); MinusView m2(x2);
00086 if (icl == ICL_DOM) {
00087 GECODE_ES_FAIL(home,Arithmetic::MaxDom<MinusView>::post(home,m0,m1,m2));
00088 } else {
00089 GECODE_ES_FAIL(home,Arithmetic::MaxBnd<MinusView>::post(home,m0,m1,m2));
00090 }
00091 }
00092
00093 void
00094 min(Space* home, const IntVarArgs& x, IntVar y,
00095 IntConLevel icl, PropKind) {
00096 if (x.size() == 0)
00097 throw TooFewArguments("Int::min");
00098 if (home->failed()) return;
00099 ViewArray<MinusView> m(home,x.size());
00100 for (int i=x.size(); i--; )
00101 m[i].init(x[i]);
00102 MinusView my(y);
00103 if (icl == ICL_DOM) {
00104 GECODE_ES_FAIL(home,Arithmetic::NaryMaxDom<MinusView>::post(home,m,my));
00105 } else {
00106 GECODE_ES_FAIL(home,Arithmetic::NaryMaxBnd<MinusView>::post(home,m,my));
00107 }
00108 }
00109
00110
00111 void
00112 mult(Space* home, IntVar x0, IntVar x1, IntVar x2,
00113 IntConLevel icl, PropKind) {
00114 if (home->failed()) return;
00115 if (icl == ICL_DOM) {
00116 GECODE_ES_FAIL(home,Arithmetic::MultDom<IntView>::post(home,x0,x1,x2));
00117 } else {
00118 GECODE_ES_FAIL(home,Arithmetic::MultBnd<IntView>::post(home,x0,x1,x2));
00119 }
00120 }
00121
00122
00123 void
00124 sqr(Space* home, IntVar x0, IntVar x1, IntConLevel icl, PropKind) {
00125 if (home->failed()) return;
00126 if (icl == ICL_DOM) {
00127 GECODE_ES_FAIL(home,Arithmetic::SqrDom<IntView>::post(home,x0,x1));
00128 } else {
00129 GECODE_ES_FAIL(home,Arithmetic::SqrBnd<IntView>::post(home,x0,x1));
00130 }
00131 }
00132
00133 void
00134 sqrt(Space* home, IntVar x0, IntVar x1, IntConLevel icl, PropKind) {
00135 if (home->failed()) return;
00136 if (icl == ICL_DOM) {
00137 GECODE_ES_FAIL(home,Arithmetic::SqrtDom<IntView>::post(home,x0,x1));
00138 } else {
00139 GECODE_ES_FAIL(home,Arithmetic::SqrtBnd<IntView>::post(home,x0,x1));
00140 }
00141 }
00142
00143 void
00144 divmod(Space* home, IntVar x0, IntVar x1, IntVar x2, IntVar x3,
00145 IntConLevel, PropKind) {
00146 if (home->failed()) return;
00147
00148 IntVar prod(home, Int::Limits::min, Int::Limits::max);
00149 GECODE_ES_FAIL(home,
00150 Arithmetic::MultBnd<IntView>::post(home,x1,x2,prod));
00151 Linear::Term<IntView> t[3];
00152 t[0].a = 1; t[0].x = prod;
00153 t[1].a = 1; t[1].x = x3;
00154 int min, max;
00155 Linear::estimate(t,2,0,min,max);
00156 IntView x0v(x0);
00157 GECODE_ME_FAIL(home, x0v.gq(home,min));
00158 GECODE_ME_FAIL(home, x0v.lq(home,max));
00159 t[2].a=-1; t[2].x=x0;
00160 Linear::post(home,t,3,IRT_EQ,0);
00161 if (home->failed()) return;
00162 IntView x1v(x1);
00163 GECODE_ES_FAIL(home,
00164 Arithmetic::DivMod<IntView>::post(home,x1,x3));
00165 }
00166
00167 void
00168 div(Space* home, IntVar x0, IntVar x1, IntVar x2,
00169 IntConLevel, PropKind) {
00170 if (home->failed()) return;
00171 GECODE_ES_FAIL(home,
00172 (Arithmetic::DivBnd<IntView>::post(home,x0,x1,x2)));
00173 }
00174
00175 void
00176 mod(Space* home, IntVar x0, IntVar x1, IntVar x2,
00177 IntConLevel icl, PropKind pk) {
00178 if (home->failed()) return;
00179 IntVar _div(home, Int::Limits::min, Int::Limits::max);
00180 divmod(home, x0, x1, _div, x2, icl, pk);
00181 }
00182
00183 namespace {
00184 GECODE_REGISTER1(Arithmetic::AbsBnd<IntView>);
00185 GECODE_REGISTER1(Arithmetic::AbsDom<IntView>);
00186
00187 GECODE_REGISTER1(Arithmetic::MaxBnd<IntView>);
00188 GECODE_REGISTER1(Arithmetic::MaxDom<IntView>);
00189 GECODE_REGISTER1(Arithmetic::MaxBnd<MinusView>);
00190 GECODE_REGISTER1(Arithmetic::MaxDom<MinusView>);
00191 GECODE_REGISTER1(Arithmetic::NaryMaxBnd<IntView>);
00192 GECODE_REGISTER1(Arithmetic::NaryMaxDom<IntView>);
00193 GECODE_REGISTER1(Arithmetic::NaryMaxBnd<MinusView>);
00194 GECODE_REGISTER1(Arithmetic::NaryMaxDom<MinusView>);
00195
00196 GECODE_REGISTER2(Arithmetic::MultZeroOne<IntView,PC_INT_BND>);
00197 GECODE_REGISTER2(Arithmetic::MultZeroOne<IntView,PC_INT_DOM>);
00198 GECODE_REGISTER4(Arithmetic::MultPlusBnd<double,IntView,IntView,IntView>);
00199 GECODE_REGISTER4(Arithmetic::MultPlusBnd<double,MinusView,IntView,MinusView>);
00200 GECODE_REGISTER4(Arithmetic::MultPlusBnd<double,MinusView,MinusView,IntView>);
00201 GECODE_REGISTER4(Arithmetic::MultPlusBnd<int,IntView,IntView,IntView>);
00202 GECODE_REGISTER4(Arithmetic::MultPlusBnd<int,MinusView,IntView,MinusView>);
00203 GECODE_REGISTER4(Arithmetic::MultPlusBnd<int,MinusView,MinusView,IntView>);
00204 GECODE_REGISTER1(Arithmetic::MultBnd<IntView>);
00205 GECODE_REGISTER4(Arithmetic::MultPlusDom<double,IntView,IntView,IntView>);
00206 GECODE_REGISTER4(Arithmetic::MultPlusDom<double,MinusView,IntView,MinusView>);
00207 GECODE_REGISTER4(Arithmetic::MultPlusDom<double,MinusView,MinusView,IntView>);
00208 GECODE_REGISTER4(Arithmetic::MultPlusDom<int,IntView,IntView,IntView>);
00209 GECODE_REGISTER4(Arithmetic::MultPlusDom<int,MinusView,IntView,MinusView>);
00210 GECODE_REGISTER4(Arithmetic::MultPlusDom<int,MinusView,MinusView,IntView>);
00211 GECODE_REGISTER1(Arithmetic::MultDom<IntView>);
00212
00213 GECODE_REGISTER1(Arithmetic::SqrBnd<IntView>);
00214 GECODE_REGISTER2(Arithmetic::SqrPlusBnd<IntView,IntView>);
00215 GECODE_REGISTER2(Arithmetic::SqrPlusBnd<MinusView,IntView>);
00216 GECODE_REGISTER1(Arithmetic::SqrDom<IntView>);
00217 GECODE_REGISTER2(Arithmetic::SqrPlusDom<IntView,IntView>);
00218 GECODE_REGISTER2(Arithmetic::SqrPlusDom<MinusView,IntView>);
00219
00220 GECODE_REGISTER1(Arithmetic::SqrtBnd<IntView>);
00221 GECODE_REGISTER1(Arithmetic::SqrtDom<IntView>);
00222 GECODE_REGISTER1(Arithmetic::DivMod<IntView>);
00223
00224 GECODE_REGISTER4(Arithmetic::DivPlusBnd<int,IntView,IntView,IntView>);
00225 GECODE_REGISTER4(Arithmetic::DivPlusBnd<double,IntView,IntView,IntView>);
00226 GECODE_REGISTER4(Arithmetic::DivPlusBnd<double,MinusView,
00227 MinusView,IntView>);
00228 GECODE_REGISTER5(Arithmetic::DivPlusBnd<double,IntView,MinusView,
00229 MinusView,false>);
00230 GECODE_REGISTER5(Arithmetic::DivPlusBnd<double,MinusView,IntView,
00231 MinusView,false>);
00232 GECODE_REGISTER1(Arithmetic::DivBnd<IntView>);
00233 }
00234 }
00235
00236
00237