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 #include "test/cpltset.hh"
00038
00039 using namespace Gecode;
00040 using namespace Test::Set;
00041
00042 namespace Test { namespace CpltSet {
00043
00045 namespace AtMost {
00046
00052
00053 static const int d1r[4][2] = {
00054 {-4,-3},{-1,-1},{1,1},{3,5}
00055 };
00056 static IntSet d1(d1r,4);
00057
00058 static IntSet ds_33(-3,3);
00059 static IntSet ds_4(4,4);
00060 static IntSet ds_13(1,3);
00061
00063 class CpltSetAtmost : public CpltSetTest {
00064 public:
00066 CpltSetAtmost(const char* t) : CpltSetTest(t,2,ds_13,false) {}
00068 virtual bool solution(const SetAssignment& x) const {
00069 CountableSetRanges xr1(x.lub, x[0]);
00070 CountableSetRanges xr2(x.lub, x[1]);
00071
00072 Iter::Ranges::Inter<CountableSetRanges, CountableSetRanges>
00073 d(xr1, xr2);
00074 int c = 0;
00075 while (d()) {
00076 c += d.width();
00077 ++d;
00078 }
00079 return (c <= 1);
00080 }
00081
00083 virtual void post(Space* home, CpltSetVarArray& x, IntVarArray&) {
00084
00085 Gecode::atmost(home, x[0], x[1], 1);
00086 }
00087 };
00088 CpltSetAtmost _cpltsetatmost("Atmost::1");
00089
00091 class CpltSetAtmostLexLe : public CpltSetTest {
00092 public:
00094 CpltSetAtmostLexLe(const char* t) : CpltSetTest(t,2,ds_13,false) {}
00096 virtual bool solution(const SetAssignment& x) const {
00097 CountableSetRanges xr1(x.lub, x[0]);
00098 CountableSetRanges xr2(x.lub, x[1]);
00099
00100 Iter::Ranges::Inter<CountableSetRanges, CountableSetRanges>
00101 d(xr1, xr2);
00102 int c = 0;
00103 while (d()) {
00104 c += d.width();
00105 ++d;
00106 }
00107
00108 CountableSetValues xv1(x.lub, x[0]);
00109 CountableSetValues xv2(x.lub, x[1]);
00110 int a = iter2int(xv1, 3);
00111 int b = iter2int(xv2, 3);
00112
00113 return (c <= 1) && a < b;
00114 }
00115
00117 virtual void post(Space* home, CpltSetVarArray& x, IntVarArray&) {
00118
00119 Gecode::atmostLex(home, x[0], x[1], 1, SRT_LE);
00120 }
00121 };
00122 CpltSetAtmostLexLe _cpltsetatmostlexle("Atmost::Lex::Le");
00123
00125 class CpltSetAtmostIntSet : public CpltSetTest {
00126 public:
00128 CpltSetAtmostIntSet(const char* t) : CpltSetTest(t,1,ds_33,false) {}
00130 virtual bool solution(const SetAssignment& x) const {
00131 CountableSetRanges xr1(x.lub, x[0]);
00132 IntSetRanges ir(ds_33);
00133 Iter::Ranges::Inter<CountableSetRanges, IntSetRanges> d(xr1, ir);
00134 int c = 0;
00135 while (d()) {
00136 c += d.width();
00137 ++d;
00138 }
00139
00140 return (c <= 1);
00141 }
00142
00144 virtual void post(Space* home, CpltSetVarArray& x, IntVarArray&) {
00145
00146 Gecode::atmost(home, x[0], ds_33, 1);
00147 }
00148 };
00149 CpltSetAtmostIntSet _cpltsetatmostintset("Atmost::IntSet");
00150
00152
00153 }}}
00154
00155