47 static_cast<unsigned int>(pow(
static_cast<double>(2.0),
60 static_cast<unsigned int>(pow(
static_cast<double>(2.0),
69 : n(n0), dsv(new
CountableSet[n]), ir(_withInt, d0), done(false),
lub(d0),
108 for (
int i=0; i<n; i++) {
111 os << icsv << ((i!=n-1) ?
"," :
"}");
118namespace Test {
namespace Set {
122 :
d(d0),
y(*this, i,
d),
130 dom(*
this,
x[0],_x[0]);
134 olog <<
ind(2) <<
"Initial: x[]=" <<
x;
135 olog <<
" y[]=" <<
y;
146 olog << ind(2) <<
"Initial: x[]=" << x;
147 olog <<
" y[]=" << y;
148 olog <<
" b=" << r.var();
156 x.update(*
this, s.
x);
157 y.update(*
this, s.
y);
174 olog <<
ind(3) <<
"Posting reified propagator" << std::endl;
178 olog <<
ind(3) <<
"Posting propagator" << std::endl;
185 olog <<
ind(3) <<
"Fixpoint: x[]=" <<
x
186 <<
" y[]=" <<
y << std::endl;
189 <<
" y[]=" <<
y << std::endl;
204 olog <<
ind(4) <<
"x[" << i <<
"] ";
217 olog << is << std::endl;
225 olog <<
ind(4) << cmin <<
" <= #(x[" << i <<
"]) <= " << cmax
234 olog <<
ind(4) <<
"y[" << i <<
"] ";
243 olog <<
" " << n << std::endl;
253 olog <<
ind(4) <<
"b = " << n << std::endl;
259 for (
int i=a.
size(); i--; ) {
275 for (
int i=
x.size(); i--; )
278 for (
int i=
y.size(); i--; )
293 for (
int j=0; j<v; j++, ++diffV) {}
307 for (
int j=0; j<v; j++, ++diffV) {}
321 for (
int j=0; j<v; j++, ++interV) {}
335 for (
int j=0; j<v; j++, ++interV) {}
346 olog <<
ind(3) <<
"Testing fixpoint on copy" << std::endl;
349 delete c;
return false;
352 for (
int i=
x.size(); i--; )
353 if (
x[i].glbSize() !=
c->x[i].glbSize() ||
354 x[i].lubSize() !=
c->x[i].lubSize() ||
355 x[i].cardMin() !=
c->x[i].cardMin() ||
356 x[i].cardMax() !=
c->x[i].cardMax()) {
360 for (
int i=
y.size(); i--; )
361 if (
y[i].size() !=
c->y[i].size()) {
362 delete c;
return false;
364 if (
reified && (
r.var().size() !=
c->r.var().size())) {
365 delete c;
return false;
368 olog <<
ind(3) <<
"Finished testing fixpoint on copy" << std::endl;
376 olog <<
ind(3) <<
"Testing whether enabled space is the same"
379 bool cf =
c.failed();
385 for (
int i=
x.size(); i--; )
386 if (
x[i].glbSize() !=
c.x[i].glbSize() ||
387 x[i].lubSize() !=
c.x[i].lubSize() ||
388 x[i].cardMin() !=
c.x[i].cardMin() ||
389 x[i].cardMax() !=
c.x[i].cardMax())
392 for (
int i=
y.size(); i--; )
393 if (
y[i].size() !=
c.y[i].size())
396 if (
reified && (
r.var().size() !=
c.r.var().size()))
399 olog <<
ind(3) <<
"Finished testing whether enabled space is the same"
407 bool setsAssigned =
true;
408 for (
int j=
x.size(); j--; )
410 setsAssigned =
false;
413 bool intsAssigned =
true;
414 for (
int j=
y.size(); j--; )
416 intsAssigned =
false;
424 }
else if (setsAssigned) {
427 i = rand(
x.size()+
y.size());
430 if (setsAssigned || i>=
x.size()) {
434 i = (i+1) %
y.size();
441 if (a.ints()[i] <
y[i].max()) {
443 rand(
static_cast<unsigned int>(
y[i].
max()-a.ints()[i]));
444 assert((v > a.ints()[i]) && (v <=
y[i].max()));
449 if (a.ints()[i] >
y[i].min()) {
451 rand(
static_cast<unsigned int>(a.ints()[i]-
y[i].min()));
452 assert((v < a.ints()[i]) && (v >=
y[i].min()));
459 unsigned int skip = rand(
y[i].size()-1);
461 if (it.
width() > skip) {
463 if (v == a.ints()[i]) {
464 if (it.
width() == 1) {
466 }
else if (v < it.
max()) {
482 i = (i+1) %
x.size();
511 if (
x[i].cardMin() < aisize) {
512 unsigned int newc =
x[i].cardMin() + 1 +
513 rand(aisize -
x[i].cardMin());
514 assert( newc >
x[i].cardMin() );
515 assert( newc <= aisize );
520 if (
x[i].cardMax() > aisize) {
521 unsigned int newc =
x[i].cardMax() - 1 -
522 rand(
x[i].cardMax() - aisize);
523 assert( newc <
x[i].cardMax() );
524 assert( newc >= aisize );
544 bool setsAssigned =
true;
545 for (
int j=
x.size(); j--; )
547 setsAssigned =
false;
550 bool intsAssigned =
true;
551 for (
int j=
y.size(); j--; )
553 intsAssigned =
false;
561 }
else if (setsAssigned) {
564 i = rand(
x.size()+
y.size());
567 if (setsAssigned || i>=
x.size()) {
571 i = (i+1) %
y.size();
578 if (a.ints()[i] <
y[i].max()) {
580 rand(
static_cast<unsigned int>(
y[i].
max()-a.ints()[i]));
581 assert((v > a.ints()[i]) && (v <=
y[i].max()));
587 if (a.ints()[i] >
y[i].min()) {
589 rand(
static_cast<unsigned int>(a.ints()[i]-
y[i].min()));
590 assert((v < a.ints()[i]) && (v >=
y[i].min()));
598 unsigned int skip = rand(
y[i].size()-1);
600 if (it.
width() > skip) {
602 if (v == a.ints()[i]) {
603 if (it.
width() == 1) {
605 }
else if (v < it.
max()) {
623 i = (i+1) %
x.size();
652 if (
x[i].cardMin() < aisize) {
653 unsigned int newc =
x[i].cardMin() + 1 +
654 rand(aisize -
x[i].cardMin());
655 assert( newc >
x[i].cardMin() );
656 assert( newc <= aisize );
662 if (
x[i].cardMax() > aisize) {
663 unsigned int newc =
x[i].cardMax() - 1 -
664 rand(
x[i].cardMax() - aisize);
665 assert( newc <
x[i].cardMax() );
666 assert( newc >= aisize );
668 c.cardinality(i, 0, newc);
702#define CHECK_TEST(T,M) \
705 olog << ind(3) << "Check: " << (M) << std::endl; \
707 problem = (M); delete s; goto failed; \
712#define START_TEST(T) \
716 olog << ind(2) << "Testing: " << (T) << std::endl; \
724 const char* test =
"NONE";
725 const char* problem =
"NONE";
732 olog <<
ind(1) <<
"Assignment: " << a
733 << (is_sol ?
" (solution)" :
" (no solution)")
743 olog <<
ind(3) <<
"No copy" << std::endl;
749 olog <<
ind(3) <<
"Copy" << std::endl;
756 default: assert(
false);
767 START_TEST(
"Assignment (after posting, disable)");
801 problem =
"No fixpoint";
819 s->
post(); c->post();
822 problem =
"Different result after re-enable";
828 if (s->
failed() != c->failed()) {
829 problem =
"Different failure after re-enable";
837 START_TEST(
"Assignment reified (rewrite after post, <=>)");
847 START_TEST(
"Assignment reified (rewrite after post, =>)");
857 START_TEST(
"Assignment reified (rewrite after post, <=)");
868 START_TEST(
"Assignment reified (rewrite failure, <=>)");
877 START_TEST(
"Assignment reified (rewrite failure, =>)");
891 START_TEST(
"Assignment reified (rewrite failure, <=)");
904 START_TEST(
"Assignment reified (immediate rewrite, <=>)");
914 START_TEST(
"Assignment reified (immediate rewrite, =>)");
924 START_TEST(
"Assignment reified (immediate rewrite, <=)");
934 START_TEST(
"Assignment reified (immediate failure, <=>)");
943 START_TEST(
"Assignment reified (immediate failure, =>)");
957 START_TEST(
"Assignment reified (immediate failure, <=)");
971 START_TEST(
"Assignment reified (before posting, <=>)");
986 START_TEST(
"Assignment reified (before posting, =>)");
1001 START_TEST(
"Assignment reified (before posting, <=)");
1016 START_TEST(
"Assignment reified (after posting, <=>)");
1031 START_TEST(
"Assignment reified (after posting, =>)");
1046 START_TEST(
"Assignment reified (after posting, <=)");
1061 START_TEST(
"Assignment reified (after posting, <=>, disable)");
1078 START_TEST(
"Assignment reified (after posting, =>, disable)");
1095 START_TEST(
"Assignment reified (after posting, <=, disable)");
1119 problem =
"No fixpoint";
1140 problem =
"No fixpoint";
1162 problem =
"No fixpoint";
1183 olog <<
"FAILURE" << std::endl
1184 <<
ind(1) <<
"Test: " << test << std::endl
1185 <<
ind(1) <<
"Problem: " << problem << std::endl;
1187 olog <<
ind(1) <<
"Assignment: " << a << std::endl;
Boolean integer variables.
int val(void) const
Return assigned value.
FloatNum size(void) const
Return size of float value (distance between maximum and minimum).
Range iterator for integer sets.
static const IntSet empty
Empty set.
Range iterator for integer views.
int max(void) const
Return largest value of range.
int min(void) const
Return smallest value of range.
unsigned int width(void) const
Return width of range (distance between minimum and maximum).
Range iterator for computing set difference.
Range iterator for computing intersection (binary).
Value iterator from range iterator.
static PropagatorGroup all
Group of all propagators.
BoolVar var(void) const
Return Boolean control variable.
ReifyMode mode(void) const
Return reification mode.
Iterator for the unknown ranges of a set variable.
struct Gecode::Space::@055132133326276162005044145100211202071356247106::@155123175027073262103111264343315000271204104107 c
Data available only during copying.
SpaceStatus status(void)
Query space status without collecting statistics.
bool assigned(void) const
Test whether view is assigned.
Gecode::Support::RandomGenerator _rand
Random number generator.
bool fixpoint(void)
Throw a coin whether to compute a fixpoint.
Range iterator producing subsets of an IntSet.
Iterate all subsets of a given set.
int val(void) const
Return current subset.
CountableSet(void)
Default constructor.
void init(const Gecode::IntSet &s)
Initialize with set s.
void operator++(void)
Move to next subset.
Generate all set assignments.
SetAssignment(int n, const Gecode::IntSet &d, int i=0)
Initialize with n set variables, initial bound d and i int variables.
void next(Gecode::Support::RandomGenerator &rand)
Move to next assignment.
int withInt
How many integer variables to iterate.
Gecode::IntSet lub
The common superset for all domains.
Space for executing set tests.
bool subsumed(bool b)
Check for subsumption if b is true.
void post(void)
Post propagator.
SetTest * test
The test currently run.
Gecode::SetVarArray x
Set variables to be tested.
bool assigned(void) const
Test whether all variables are assigned.
Gecode::IntSet d
Initial domain.
void removeFromLub(int v, int i, const SetAssignment &a)
Remove value v from the upper bound of x[i].
bool fixprob(void)
Perform fixpoint computation.
virtual Gecode::Space * copy(void)
Copy space during cloning.
bool prune(const SetAssignment &a, Gecode::Support::RandomGenerator &rand)
Perform random pruning.
Gecode::Reify r
Reification information.
SetTestSpace(int n, Gecode::IntSet &d0, int i, SetTest *t, bool log=true)
Create test space without reification.
Gecode::IntVarArray y
Int variables to be tested.
bool disabled(const SetAssignment &a, SetTestSpace &c, Gecode::Support::RandomGenerator &rand)
Prune values also in a space c with disabled propagators, but not those in assignment a.
bool failed(void)
Compute a fixpoint and check for failure.
void disable(void)
Disable propagators in space and compute fixpoint (make all idle).
void rel(int i, Gecode::SetRelType srt, const Gecode::IntSet &is)
Perform set tell operation on x[i].
bool reified
Whether the test is for a reified propagator.
void addToGlb(int v, int i, const SetAssignment &a)
Remove value v from the lower bound of x[i].
bool same(SetTestSpace &c)
Check whether propagation is the same as in c.
void cardinality(int i, int cmin, int cmax)
Perform cardinality tell operation on x[i].
void assign(const SetAssignment &a, Gecode::Support::RandomGenerator &rand)
Assign all variables to values in a.
void enable(void)
Enable propagators in space.
unsigned int propagators(void)
Return the number of propagators.
int withInt
How many integer variables are used by the test.
Base class for tests with set constraints
bool testsubsumed
Whether to check for subsumption.
virtual bool run(void)
Perform test.
bool disabled
Whether to perform full tests for disabled propagators.
virtual bool solution(const SetAssignment &) const =0
Check for solution.
Simple class for describing indentation.
LinearCongruentialGenerator< 2147483647, 48271, 44488, 3399 > RandomGenerator
Default values for linear congruential generator.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
IntRelType
Relation types for integers.
ReifyMode
Mode for reification.
@ IRT_GQ
Greater or equal ( ).
@ IRT_LQ
Less or equal ( ).
@ RM_IMP
Implication for reification.
@ RM_PMI
Inverse implication for reification.
@ RM_EQV
Equivalence for reification (default).
Space(void)
Default constructor.
SetOpType
Common operations for sets.
SetRelType
Common relation types for sets.
@ SOT_DUNION
Disjoint union.
@ SRT_GQ
Greater or equal ( ).
@ SRT_LQ
Less or equal ( ).
Space * clone(void) const
Clone space.
SpaceStatus status(StatusStatistics &stat)
Query space status.
@ SS_FAILED
Space is failed
unsigned int size(I &i)
Size of all ranges of range iterator i.
const int min
Smallest allowed integer in integer set.
const unsigned int card
Maximum cardinality of an integer set.
const int max
Largest allowed integer in integer set.
Gecode toplevel namespace
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
SetExpr inter(const SetVarArgs &)
Intersection of set variables.
void log(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
LinIntExpr cardinality(const SetExpr &)
Cardinality of set expression.
std::ostringstream olog
Stream used for logging.
#define START_TEST(T)
Start new test.
#define CHECK_TEST(T, M)
Check the test result and handle failed test.
std::ostream & operator<<(std::ostream &os, const Test::Set::SetAssignment &a)