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 cl, PropKind) {
00046 if (home->failed()) return;
00047 switch (cl) {
00048 case ICL_DOM:
00049 GECODE_ES_FAIL(home,Arithmetic::AbsDom<IntView>::post(home,x0,x1));
00050 break;
00051 default:
00052 GECODE_ES_FAIL(home,Arithmetic::AbsBnd<IntView>::post(home,x0,x1));
00053 break;
00054 }
00055 }
00056
00057
00058 void
00059 max(Space* home, IntVar x0, IntVar x1, IntVar x2, IntConLevel, PropKind) {
00060 if (home->failed()) return;
00061 GECODE_ES_FAIL(home,Arithmetic::Max<IntView>::post(home,x0,x1,x2));
00062 }
00063
00064 void
00065 max(Space* home, const IntVarArgs& x, IntVar y, IntConLevel, PropKind) {
00066 if (x.size() == 0)
00067 throw TooFewArguments("Int::max");
00068 if (home->failed()) return;
00069 ViewArray<IntView> xv(home,x);
00070 GECODE_ES_FAIL(home,Arithmetic::NaryMax<IntView>::post(home,xv,y));
00071 }
00072
00073
00074 void
00075 min(Space* home, IntVar x0, IntVar x1, IntVar x2, IntConLevel, PropKind) {
00076 if (home->failed()) return;
00077 MinusView m0(x0); MinusView m1(x1); MinusView m2(x2);
00078 GECODE_ES_FAIL(home,Arithmetic::Max<MinusView>::post(home,m0,m1,m2));
00079 }
00080
00081 void
00082 min(Space* home, const IntVarArgs& x, IntVar y, IntConLevel, PropKind) {
00083 if (x.size() == 0)
00084 throw TooFewArguments("Int::min");
00085 if (home->failed()) return;
00086 ViewArray<MinusView> m(home,x.size());
00087 for (int i=x.size(); i--; )
00088 m[i].init(x[i]);
00089 MinusView my(y);
00090 GECODE_ES_FAIL(home,Arithmetic::NaryMax<MinusView>::post(home,m,my));
00091 }
00092
00093
00094 void
00095 mult(Space* home, IntVar x0, IntVar x1, IntVar x2, IntConLevel, PropKind) {
00096 if (home->failed()) return;
00097 GECODE_ES_FAIL(home,Arithmetic::Mult<IntView>::post(home,x0,x1,x2));
00098 }
00099
00100
00101 void
00102 sqr(Space* home, IntVar x0, IntVar x1, IntConLevel, PropKind) {
00103 if (home->failed()) return;
00104 GECODE_ES_FAIL(home,Arithmetic::Sqr<IntView>::post(home,x0,x1));
00105 }
00106
00107 void
00108 sqrt(Space* home, IntVar x0, IntVar x1, IntConLevel, PropKind) {
00109 if (home->failed()) return;
00110 GECODE_ES_FAIL(home,Arithmetic::Sqrt<IntView>::post(home,x0,x1));
00111 }
00112
00113 namespace {
00114 GECODE_REGISTER1(Arithmetic::AbsBnd<IntView>);
00115 GECODE_REGISTER1(Arithmetic::AbsDom<IntView>);
00116 GECODE_REGISTER1(Arithmetic::Max<IntView>);
00117 GECODE_REGISTER1(Arithmetic::Max<MinusView>);
00118 GECODE_REGISTER1(Arithmetic::Mult<IntView>);
00119 GECODE_REGISTER1(Arithmetic::MultZeroOne<IntView>);
00120 GECODE_REGISTER4(Arithmetic::MultPlus<double,IntView,IntView,IntView>);
00121 GECODE_REGISTER4(Arithmetic::MultPlus<double,MinusView,IntView,MinusView>);
00122 GECODE_REGISTER4(Arithmetic::MultPlus<double,MinusView,MinusView,IntView>);
00123 GECODE_REGISTER4(Arithmetic::MultPlus<int,IntView,IntView,IntView>);
00124 GECODE_REGISTER4(Arithmetic::MultPlus<int,MinusView,IntView,MinusView>);
00125 GECODE_REGISTER4(Arithmetic::MultPlus<int,MinusView,MinusView,IntView>);
00126 GECODE_REGISTER1(Arithmetic::NaryMax<IntView>);
00127 GECODE_REGISTER1(Arithmetic::NaryMax<MinusView>);
00128 GECODE_REGISTER1(Arithmetic::Sqr<IntView>);
00129 GECODE_REGISTER2(Arithmetic::SqrPlus<IntView,IntView>);
00130 GECODE_REGISTER2(Arithmetic::SqrPlus<MinusView,IntView>);
00131 GECODE_REGISTER1(Arithmetic::Sqrt<IntView>);
00132 }
00133 }
00134
00135
00136