46 namespace Test {
namespace Set {
51 static_cast<unsigned int>(
pow(static_cast<double>(2.0),
64 static_cast<unsigned int>(
pow(static_cast<double>(2.0),
73 :
n(n0), dsv(new
CountableSet[
n]), ir(_withInt, d0), done(false), lub(d0),
112 for (
int i=0;
i<n;
i++) {
115 os << icsv << ((i!=n-1) ?
"," :
"}");
122 namespace Test {
namespace Set {
126 :
d(d0), y(*this, i,
d),
128 reified(false), test(t) {
134 dom(*
this,
x[0],_x[0]);
138 olog <<
ind(2) <<
"Initial: x[]=" <<
x;
139 olog <<
" y[]=" <<
y;
150 olog <<
ind(2) <<
"Initial: x[]=" <<
x;
151 olog <<
" y[]=" <<
y;
164 b.
update(*
this, share, sr);
178 olog <<
ind(3) <<
"Posting reified propagator" << std::endl;
182 olog <<
ind(3) <<
"Posting propagator" << std::endl;
189 olog <<
ind(3) <<
"Fixpoint: x[]=" <<
x 190 <<
" y[]=" <<
y << std::endl;
193 <<
" y[]=" <<
y << std::endl;
203 olog <<
ind(4) <<
"x[" << i <<
"] ";
216 olog << is << std::endl;
224 olog <<
ind(4) << cmin <<
" <= #(x[" << i <<
"]) <= " << cmax
233 olog <<
ind(4) <<
"y[" << i <<
"] ";
242 olog <<
" " << n << std::endl;
252 olog <<
ind(4) <<
"b = " << n << std::endl;
258 for (
int i=a.
size();
i--; ) {
292 for (
int j=0; j<
v; j++, ++diffV) {}
306 for (
int j=0; j<
v; j++, ++diffV) {}
320 for (
int j=0; j<
v; j++, ++interV) {}
334 for (
int j=0; j<
v; j++, ++interV) {}
345 olog <<
ind(3) <<
"Testing fixpoint on copy" << std::endl;
348 delete c;
return false;
352 if (
x[
i].glbSize() != c->
x[
i].glbSize() ||
353 x[
i].lubSize() != c->
x[
i].lubSize() ||
354 x[
i].cardMin() != c->
x[
i].cardMin() ||
355 x[
i].cardMax() != c->
x[
i].cardMax()) {
361 delete c;
return false;
364 delete c;
return false;
367 olog <<
ind(3) <<
"Finished testing fixpoint on copy" << std::endl;
375 olog <<
ind(3) <<
"Testing whether enabled space is the same" 385 if (
x[
i].glbSize() != c.
x[
i].glbSize() ||
386 x[
i].lubSize() != c.
x[
i].lubSize() ||
387 x[
i].cardMin() != c.
x[
i].cardMin() ||
388 x[
i].cardMax() != c.
x[
i].cardMax())
398 olog <<
ind(3) <<
"Finished testing whether enabled space is the same" 406 bool setsAssigned =
true;
407 for (
int j=
x.
size(); j--; )
409 setsAssigned =
false;
412 bool intsAssigned =
true;
413 for (
int j=
y.
size(); j--; )
415 intsAssigned =
false;
423 }
else if (setsAssigned) {
429 if (setsAssigned || i>=
x.
size()) {
433 i = (i+1) %
y.
size();
440 if (a.
ints()[
i] <
y[
i].max()) {
443 assert((v > a.
ints()[
i]) && (v <=
y[i].
max()));
448 if (a.
ints()[
i] >
y[
i].min()) {
451 assert((v < a.
ints()[
i]) && (v >=
y[i].
min()));
460 if (it.
width() > skip) {
462 if (v == a.
ints()[
i]) {
463 if (it.
width() == 1) {
465 }
else if (v < it.
max()) {
481 i = (i+1) %
x.
size();
487 Gecode::SetVarUnknownRanges ur2(
x[i]);
510 if (
x[i].cardMin() < aisize) {
511 unsigned int newc =
x[
i].cardMin() + 1 +
513 assert( newc >
x[i].cardMin() );
514 assert( newc <= aisize );
519 if (
x[i].cardMax() > aisize) {
520 unsigned int newc =
x[
i].cardMax() - 1 -
522 assert( newc <
x[i].cardMax() );
523 assert( newc >= aisize );
543 bool setsAssigned =
true;
544 for (
int j=
x.
size(); j--; )
546 setsAssigned =
false;
549 bool intsAssigned =
true;
550 for (
int j=
y.
size(); j--; )
552 intsAssigned =
false;
560 }
else if (setsAssigned) {
566 if (setsAssigned || i>=
x.
size()) {
570 i = (i+1) %
y.
size();
577 if (a.
ints()[
i] <
y[
i].max()) {
580 assert((v > a.
ints()[
i]) && (v <=
y[i].
max()));
586 if (a.
ints()[
i] >
y[
i].min()) {
589 assert((v < a.
ints()[
i]) && (v >=
y[i].
min()));
599 if (it.
width() > skip) {
601 if (v == a.
ints()[
i]) {
602 if (it.
width() == 1) {
604 }
else if (v < it.
max()) {
622 i = (i+1) %
x.
size();
628 Gecode::SetVarUnknownRanges ur2(
x[i]);
651 if (
x[i].cardMin() < aisize) {
652 unsigned int newc =
x[
i].cardMin() + 1 +
654 assert( newc >
x[i].cardMin() );
655 assert( newc <= aisize );
661 if (
x[i].cardMax() > aisize) {
662 unsigned int newc =
x[
i].cardMax() - 1 -
664 assert( newc <
x[i].cardMax() );
665 assert( newc >= aisize );
701 #define CHECK_TEST(T,M) \ 703 olog << ind(3) << "Check: " << (M) << std::endl; \ 705 problem = (M); delete s; goto failed; \ 709 #define START_TEST(T) \ 712 olog << ind(2) << "Testing: " << (T) << std::endl; \ 719 const char*
test =
"NONE";
720 const char* problem =
"NONE";
725 bool is_sol = solution(a);
727 olog <<
ind(1) <<
"Assignment: " << a
728 << (is_sol ?
" (solution)" :
" (no solution)")
738 olog <<
ind(3) <<
"No copy" << std::endl;
744 olog <<
ind(3) <<
"Unshared copy" << std::endl;
753 olog <<
ind(3) <<
"Unshared copy" << std::endl;
760 default: assert(
false);
771 START_TEST(
"Assignment (after posting, disable)");
805 problem =
"No fixpoint";
826 problem =
"Different result after re-enable";
832 problem =
"Different failure after re-enable";
840 START_TEST(
"Assignment reified (rewrite after post, <=>)");
850 START_TEST(
"Assignment reified (rewrite after post, =>)");
860 START_TEST(
"Assignment reified (rewrite after post, <=)");
871 START_TEST(
"Assignment reified (rewrite failure, <=>)");
880 START_TEST(
"Assignment reified (rewrite failure, =>)");
894 START_TEST(
"Assignment reified (rewrite failure, <=)");
907 START_TEST(
"Assignment reified (immediate rewrite, <=>)");
917 START_TEST(
"Assignment reified (immediate rewrite, =>)");
927 START_TEST(
"Assignment reified (immediate rewrite, <=)");
937 START_TEST(
"Assignment reified (immediate failure, <=>)");
946 START_TEST(
"Assignment reified (immediate failure, =>)");
960 START_TEST(
"Assignment reified (immediate failure, <=)");
974 START_TEST(
"Assignment reified (before posting, <=>)");
989 START_TEST(
"Assignment reified (before posting, =>)");
1004 START_TEST(
"Assignment reified (before posting, <=)");
1019 START_TEST(
"Assignment reified (after posting, <=>)");
1034 START_TEST(
"Assignment reified (after posting, =>)");
1049 START_TEST(
"Assignment reified (after posting, <=)");
1064 START_TEST(
"Assignment reified (after posting, <=>, disable)");
1081 START_TEST(
"Assignment reified (after posting, =>, disable)");
1098 START_TEST(
"Assignment reified (after posting, <=, disable)");
1122 problem =
"No fixpoint";
1143 problem =
"No fixpoint";
1164 problem =
"No fixpoint";
1185 olog <<
"FAILURE" << std::endl
1186 <<
ind(1) <<
"Test: " << test << std::endl
1187 <<
ind(1) <<
"Problem: " << problem << std::endl;
1189 olog <<
ind(1) <<
"Assignment: " << a << std::endl;
void removeFromLub(int v, int i, const SetAssignment &a)
Remove value v from the upper bound of x[i].
unsigned int width(void) const
Return width of range (distance between minimum and maximum)
void operator++(void)
Move to next subset.
void cardinality(int i, int cmin, int cmax)
Perform cardinality tell operation on x[i].
void disable(void)
Disable propagators in space and compute fixpoint (make all idle)
SetRelType
Common relation types for sets.
Inverse implication for reification.
Simple class for describing identation.
Gecode::Reify r
Reification information.
const int min
Smallest allowed integer in integer set.
Range iterator for integer sets.
void log(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
int size(void) const
Return size of array (number of elements)
const FloatNum max
Largest allowed float value.
ReifyMode mode(void) const
Return reification mode.
void update(Space &home, bool share, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
static Gecode::Support::RandomGenerator rand
Random number generator.
Gecode::SetVarArray x
Set variables to be tested.
unsigned int size(void) const
Return size (cardinality) of domain.
void enable(void)
Enable propagators in space.
void disable(Space &home)
Disable all propagators in a group.
static PropagatorGroup all
Group of all propagators.
bool assigned(void) const
Test whether view is assigned.
void assign(const SetAssignment &a)
Assign all variables to values in a.
void pow(Home home, FloatVar x0, int n, FloatVar x1)
Post propagator for for $n 0$.
CountableSet(void)
Default constructor.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
bool same(SetTestSpace &c)
Check whether propagation is the same as in c.
int val(void) const
Return current subset.
Space * clone(bool share_data=true, bool share_info=true, CloneStatistics &stat=unused_clone) const
Clone space.
SetOpType
Common operations for sets.
const unsigned int card
Maximum cardinality of an integer set.
SetAssignment(int n, const Gecode::IntSet &d, int i=0)
Initialize with n set variables, initial bound d and i int variables.
const int max
Largest allowed integer in integer set.
unsigned int size(Space &home) const
Return number of propagators in a group.
Iterator for the unknown ranges of a set variable.
bool reified
Whether the test is for a reified propagator.
void update(Space &, bool share, VarArray< Var > &a)
Update array to be a clone of array a.
void rel(int i, Gecode::SetRelType srt, const Gecode::IntSet &is)
Perform set tell operation on x[i].
struct Gecode::@554::NNF::@60::@62 a
For atomic nodes.
const FloatNum min
Smallest allowed float value.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
union Gecode::@554::NNF::@60 u
Union depending on nodetype t.
IntRelType
Relation types for integers.
Range iterator for computing intersection (binary)
ChannelShared csv(Gecode::IPL_VAL)
static bool fixpoint(void)
Throw a coin whether to compute a fixpoint.
void post(void)
Post propagator.
bool failed(void)
Compute a fixpoint and check for failure.
Value iterator from range iterator.
unsigned int size(I &i)
Size of all ranges of range iterator i.
int min(void) const
Return smallest value of range.
virtual bool run(void)
Perform test.
bool log
Whether to log the tests.
Gecode::IntSet lub
The common superset for all domains.
const Test::Int::Assignment & ints(void) const
Return assignment for integer variables.
#define START_TEST(T)
Start new test.
bool assigned(void) const
Test whether all variables are assigned.
static const IntSet empty
Empty set.
Gecode::IntSet d
Initial domain.
SetTestSpace(int n, Gecode::IntSet &d0, int i, SetTest *t, bool log=true)
Create test space without reification.
Boolean integer variables.
LinIntExpr cardinality(const SetExpr &e)
Cardinality of set expression.
SetExpr inter(const SetVarArgs &x)
Intersection of set variables.
bool prune(const SetAssignment &a)
Perform random pruning.
unsigned int propagators(void)
Return the number of propagators.
int withInt
How many integer variables to iterate.
void addToGlb(int v, int i, const SetAssignment &a)
Remove value v from the lower bound of x[i].
bool disabled(const SetAssignment &a, SetTestSpace &c)
Prune values also in a space c with disabled propagators, but not those in assignment a...
virtual void post(Gecode::Space &home, Gecode::SetVarArray &x, Gecode::IntVarArray &y)=0
Post propagator.
struct Gecode::Space::@55::@57 c
Data available only during copying.
Base class for tests with set constraints
Generate all set assignments.
void operator++(void)
Move to next assignment.
bool fixprob(void)
Perform fixpoint computation.
void enable(Space &home, bool s=true)
Enable all propagators in a group.
std::ostringstream olog
Stream used for logging.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
std::ostream & operator<<(std::ostream &os, const Test::Set::SetAssignment &a)
Gecode::IntVarArray y
Int variables to be tested.
BoolVar var(void) const
Return Boolean control variable.
Range iterator producing subsets of an IntSet.
SpaceStatus status(StatusStatistics &stat=unused_status)
Query space status.
int withInt
How many integer variables are used by the test.
int max(void) const
Return largest value of range.
Gecode toplevel namespace
Implication for reification.
int size(void) const
Return arity.
Range iterator for computing set difference.
#define CHECK_TEST(T, M)
Check the test result and handle failed test.
SetTest * test
The test currently run.
Space for executing set tests.
struct Gecode::@554::NNF::@60::@61 b
For binary nodes (and, or, eqv)
Iterate all subsets of a given set.
ReifyMode
Mode for reification.
virtual Gecode::Space * copy(bool share)
Copy space during cloning.
void init(const Gecode::IntSet &s)
Initialize with set s.
Equivalence for reification (default)
int val(void) const
Return assigned value.