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
00039 #include <gecode/float/rel.hh>
00040
00041 namespace Gecode {
00042
00043 void
00044 dom(Home home, FloatVar x, FloatVal n) {
00045 using namespace Float;
00046 Limits::check(n,"Float::dom");
00047 GECODE_POST;
00048 FloatView xv(x);
00049 GECODE_ME_FAIL(xv.eq(home,n));
00050 }
00051
00052 void
00053 dom(Home home, const FloatVarArgs& x, FloatVal n) {
00054 using namespace Float;
00055 Limits::check(n,"Float::dom");
00056 GECODE_POST;
00057 for (int i=x.size(); i--; ) {
00058 FloatView xv(x[i]);
00059 GECODE_ME_FAIL(xv.eq(home,n));
00060 }
00061 }
00062
00063 void
00064 dom(Home home, FloatVar x, FloatNum min, FloatNum max) {
00065 using namespace Float;
00066 Limits::check(min,"Float::dom");
00067 Limits::check(max,"Float::dom");
00068 GECODE_POST;
00069 FloatView xv(x);
00070 GECODE_ME_FAIL(xv.gq(home,min));
00071 GECODE_ME_FAIL(xv.lq(home,max));
00072 }
00073
00074 void
00075 dom(Home home, const FloatVarArgs& x, FloatNum min, FloatNum max) {
00076 using namespace Float;
00077 Limits::check(min,"Float::dom");
00078 Limits::check(max,"Float::dom");
00079 GECODE_POST;
00080 for (int i=x.size(); i--; ) {
00081 FloatView xv(x[i]);
00082 GECODE_ME_FAIL(xv.gq(home,min));
00083 GECODE_ME_FAIL(xv.lq(home,max));
00084 }
00085 }
00086
00087 void
00088 dom(Home home, FloatVar x, FloatVal n, Reify r) {
00089 using namespace Float;
00090 Limits::check(n,"Float::dom");
00091 GECODE_POST;
00092 switch (r.mode()) {
00093 case RM_EQV:
00094 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_EQV>
00095 ::post(home,x,n,r.var())));
00096 break;
00097 case RM_IMP:
00098 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_IMP>
00099 ::post(home,x,n,r.var())));
00100 break;
00101 case RM_PMI:
00102 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_PMI>
00103 ::post(home,x,n,r.var())));
00104 break;
00105 default: throw Int::UnknownReifyMode("Float::dom");
00106 }
00107 }
00108
00109 void
00110 dom(Home home, FloatVar x, FloatNum min, FloatNum max, Reify r) {
00111 using namespace Float;
00112 if (min > max) {
00113 Int::BoolView b(r.var());
00114 switch (r.mode()) {
00115 case RM_EQV:
00116 case RM_IMP:
00117 GECODE_ME_FAIL(b.zero(home));
00118 break;
00119 case RM_PMI:
00120 break;
00121 default: throw Int::UnknownReifyMode("Float::dom");
00122 }
00123 } else {
00124 FloatVal n(min,max);
00125 dom(home,x,n,r);
00126 }
00127 }
00128
00129 void
00130 dom(Home home, FloatVar x, FloatVar d) {
00131 using namespace Float;
00132 GECODE_POST;
00133 FloatView xv(x), dv(d);
00134 if (!same(xv,dv)) {
00135 GECODE_ME_FAIL(xv.lq(home,dv.max()));
00136 GECODE_ME_FAIL(xv.gq(home,dv.min()));
00137 }
00138 }
00139
00140 void
00141 dom(Home home, const FloatVarArgs& x, const FloatVarArgs& d) {
00142 using namespace Float;
00143 if (x.size() != d.size())
00144 throw ArgumentSizeMismatch("Float::dom");
00145 for (int i=x.size(); i--; ) {
00146 GECODE_POST;
00147 FloatView xv(x[i]), dv(d[i]);
00148 if (!same(xv,dv)) {
00149 GECODE_ME_FAIL(xv.lq(home,dv.max()));
00150 GECODE_ME_FAIL(xv.gq(home,dv.min()));
00151 }
00152 }
00153 }
00154
00155 }
00156
00157
00158