52 if (
dsv[i]() || (i == 0))
64 for (
int i =
n; i--; )
71 for (
int i=
n-
_n1; i--; )
73 for (
int i=
_n1; i--; )
84 for (
int i=0; i<n; i++)
85 os << a[i] << ((i!=n-1) ?
"," :
"}");
102 olog <<
ind(2) <<
"Initial: x[]=" <<
x
118 olog <<
ind(2) <<
"Initial: x[]=" <<
x
119 <<
" b=" <<
r.var() << std::endl;
124 x.update(*
this, s.
x);
138 for (
int i=
x.size(); i--; )
149 olog <<
ind(3) <<
"Posting reified propagator" << std::endl;
153 olog <<
ind(3) <<
"Posting propagator" << std::endl;
160 olog <<
ind(3) <<
"Fixpoint: " <<
x;
162 olog << std::endl <<
ind(3) <<
" --> " <<
x << std::endl;
173 int i =
static_cast<int>(
Base::rand(
static_cast<unsigned int>(
x.size())));
175 i = (i+1) %
x.size();
188 if (a[i] <
x[i].
max()) {
191 <
unsigned int>(
x[i].
max()-a[i])));
192 assert((v > a[i]) && (v <=
x[i].
max()));
197 if (a[i] >
x[i].
min()) {
200 <
unsigned int>(a[i]-
x[i].
min())));
201 assert((v < a[i]) && (v >=
x[i].
min()));
209 Base::rand(
static_cast<unsigned int>(
x[i].size()-1));
211 if (it.
width() > skip) {
212 v = it.
min() +
static_cast<int>(skip);
214 if (it.
width() == 1) {
216 }
else if (v < it.
max()) {
224 skip -= it.
width(); ++it;
235 olog <<
ind(4) <<
"x[" << i <<
"] ";
244 olog <<
" " << n << std::endl;
254 olog <<
ind(4) <<
"b = " << n << std::endl;
262 static_cast<int>(
Base::rand(
static_cast<unsigned int>(a.
size()))) : -1;
263 for (
int j=a.
size(); j--; )
287 <
unsigned int>(
x[i].
max()-
x[i].
min())));
288 assert((v >
x[i].
min()) && (v <=
x[i].
max()));
294 <
unsigned int>(
x[i].
max()-
x[i].
min())));
295 assert((v <
x[i].
max()) && (v >=
x[i].
min()));
300 static_cast<int>(
Base::rand(
static_cast<unsigned int>(
x[i].size()-1))+1); vals--; ) {
305 if (it.
width() > skip) {
306 v = it.
min() +
static_cast<int>(skip);
break;
308 skip -= it.
width(); ++it;
336 olog <<
ind(3) <<
"Testing fixpoint on copy" << std::endl;
340 olog <<
ind(4) <<
"Copy failed after posting" << std::endl;
341 delete c;
return false;
343 for (
int j=
x.size(); j--; )
344 if (
x[j].size() !=
c->x[j].size()) {
346 olog <<
ind(4) <<
"Different domain size" << std::endl;
347 delete c;
return false;
349 if (
reified && (
r.var().size() !=
c->r.var().size())) {
351 olog <<
ind(4) <<
"Different control variable" << std::endl;
352 delete c;
return false;
355 olog <<
ind(3) <<
"Finished testing fixpoint on copy" << std::endl;
395 olog <<
ind(3) <<
"No failure on disabled copy" << std::endl;
402 olog <<
ind(3) <<
"Failure on disabled copy" << std::endl;
405 for (
int j=
x.size(); j--; ) {
406 if (
x[j].size() !=
c.x[j].size()) {
408 olog <<
ind(4) <<
"Different domain size" << std::endl;
411 if (
reified && (
r.var().size() !=
c.r.var().size())) {
413 olog <<
ind(4) <<
"Different control variable" << std::endl;
446#define CHECK_TEST(T,M) \
448 olog << ind(3) << "Check: " << (M) << std::endl; \
450 problem = (M); delete s; goto failed; \
454#define START_TEST(T) \
457 olog << ind(2) << "Testing: " << (T) << std::endl; \
473 const char* test =
"NONE";
474 const char* problem =
"NONE";
482 post(*search_s,search_s->
x);
492 olog <<
ind(1) <<
"Assignment: " << a
493 << (sol ?
" (solution)" :
" (no solution)")
505 olog <<
ind(3) <<
"No copy" << std::endl;
511 olog <<
ind(3) <<
"Copy" << std::endl;
518 default: assert(
false);
529 START_TEST(
"Partial assignment (after posting)");
544 START_TEST(
"Assignment (after posting, disable)");
559 START_TEST(
"Partial assignment (after posting, disable)");
589 START_TEST(
"Partial assignment (before posting)");
610 problem =
"No fixpoint";
627 s->
post(); c->post();
630 problem =
"Different result after re-enable";
635 problem =
"Different failure after re-enable";
644 START_TEST(
"Assignment reified (rewrite after post, <=>)");
654 START_TEST(
"Assignment reified (rewrite failure, <=>)");
663 START_TEST(
"Assignment reified (immediate rewrite, <=>)");
673 START_TEST(
"Assignment reified (immediate failure, <=>)");
682 START_TEST(
"Assignment reified (before posting, <=>)");
697 START_TEST(
"Assignment reified (after posting, <=>)");
712 START_TEST(
"Assignment reified (after posting, <=>, disable)");
735 problem =
"No fixpoint";
753 s->
post(); c->post();
757 problem =
"No fixpoint";
763 CHECK_TEST(c->propagators()==0,
"No subsumption");
764 CHECK_TEST(c->r.var().assigned(),
"Control variable unassigned");
766 CHECK_TEST(c->r.var().val()==1,
"Zero on solution");
768 CHECK_TEST(c->r.var().val()==0,
"One on non-solution");
777 START_TEST(
"Assignment reified (rewrite after post, =>)");
787 START_TEST(
"Assignment reified (rewrite failure, =>)");
801 START_TEST(
"Assignment reified (immediate rewrite, =>)");
811 START_TEST(
"Assignment reified (immediate failure, =>)");
825 START_TEST(
"Assignment reified (before posting, =>)");
840 START_TEST(
"Assignment reified (after posting, =>)");
855 START_TEST(
"Assignment reified (after posting, =>, disable)");
878 problem =
"No fixpoint";
896 s->
post(); c->post();
900 problem =
"No fixpoint";
906 CHECK_TEST(c->propagators()==0,
"No subsumption");
908 CHECK_TEST(!c->r.var().assigned(),
"Control variable assigned");
910 CHECK_TEST(c->r.var().assigned(),
"Control variable unassigned");
911 CHECK_TEST(c->r.var().val()==0,
"One on non-solution");
920 START_TEST(
"Assignment reified (rewrite after post, <=)");
930 START_TEST(
"Assignment reified (rewrite failure, <=)");
944 START_TEST(
"Assignment reified (immediate rewrite, <=)");
954 START_TEST(
"Assignment reified (immediate failure, <=)");
968 START_TEST(
"Assignment reified (before posting, <=)");
983 START_TEST(
"Assignment reified (after posting, <=)");
998 START_TEST(
"Assignment reified (after posting, <=, disable)");
1021 problem =
"No fixpoint";
1039 s->
post(); c->post();
1043 problem =
"No fixpoint";
1049 CHECK_TEST(c->propagators()==0,
"No subsumption");
1051 CHECK_TEST(c->r.var().assigned(),
"Control variable unassigned");
1052 CHECK_TEST(c->r.var().val()==1,
"Zero on solution");
1054 CHECK_TEST(!c->r.var().assigned(),
"Control variable assigned");
1066 CHECK_TEST(s != NULL,
"Solutions exhausted");
1068 for (
int i=a.
size(); i--; ) {
1070 CHECK_TEST(a[i] == s->
x[i].val(),
"Wrong value in solution");
1081 if (e_s.
next() != NULL) {
1082 problem =
"Excess solutions";
1106 for (
int i = s->
x.
size(); i--; )
1121 for (
int i = s->
x.
size(); i--; )
1139 olog <<
"FAILURE" << std::endl
1140 <<
ind(1) <<
"Test: " << test << std::endl
1141 <<
ind(1) <<
"Problem: " << problem << std::endl;
1143 olog <<
ind(1) <<
"Assignment: " << a << std::endl;
Boolean integer variables.
int val(void) const
Return assigned value.
Depth-first search engine.
FloatNum size(void) const
Return size of float value (distance between maximum and minimum)
Passing integer variables.
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)
void threads(double n)
Set number of parallel threads.
static PropagatorGroup all
Group of all propagators.
Reification specification.
BoolVar var(void) const
Return Boolean control variable.
ReifyMode mode(void) const
Return reification mode.
virtual T * next(void)
Return next solution (NULL, if none exists or search has been stopped)
struct Gecode::Space::@055132133326276162005044145100211202071356247106::@155123175027073262103111264343315000271204104107 c
Data available only during copying.
bool assigned(void) const
Test if all variables are assigned.
int size(void) const
Return size of array (number of elements)
bool assigned(void) const
Test whether view is assigned.
static Gecode::Support::RandomGenerator rand
Random number generator.
static bool fixpoint(void)
Throw a coin whether to compute a fixpoint.
Base class for assignments
Gecode::IntSet d
Domain for each variable.
int n
Number of variables.
Generate all assignments.
Gecode::IntSetValues * dsv
Iterator for each variable.
virtual void operator++(void)
Move to next assignment.
int a
How many assigments still to be generated Generate new value according to domain.
int * vals
The current values for the variables.
virtual void operator++(void)
Move to next assignment.
int _n1
How many variables in the second set.
Gecode::IntSet _d1
Domain for second set of variables Generate new value according to domain d.
int a
How many assigments still to be generated.
int * vals
The current values for the variables.
virtual void operator++(void)
Move to next assignment.
int randval(const Gecode::IntSet &d)
Space for executing tests.
Gecode::Reify r
Reification information.
TestSpace(int n, Gecode::IntSet &d, Test *t)
Create test space without reification.
Gecode::IntSet d
Initial domain.
void rndrel(const Assignment &a, int i, Gecode::IntRelType &irt, int &v)
Randomly select a pruning rel for variable i.
Test * test
The test currently run.
virtual Gecode::Space * copy(void)
Copy space during cloning.
void post(void)
Post propagator.
bool assigned(void) const
Test whether all variables are assigned.
void prune(void)
Prune some random values for some random variable.
void bound(void)
Assing a random variable to a random bound.
void assign(const Assignment &a, bool skip=false)
Assign all (or all but one, if skip is true) variables to values in a.
bool failed(void)
Compute a fixpoint and check for failure.
bool reified
Whether the test is for a reified propagator.
void prune(int i, bool bounds_only)
Prune some random values from variable i.
int rndvar(void)
Randomly select an unassigned variable.
bool disabled(const Assignment &a, TestSpace &c, bool testfix)
Prune values also in a space c with disabled propagators, but not those in assignment a.
void disable(void)
Disable propagators in space and compute fixpoint (make all idle)
Gecode::IntVarArray x
Variables to be tested.
void enable(void)
Enable propagators in space.
void rel(int i, Gecode::IntRelType irt, int n)
Perform integer tell operation on x[i].
unsigned int propagators(void)
Return the number of propagators.
bool pmi(void) const
Test whether reverse implication as reification mode is supported.
virtual bool run(void)
Perform test.
virtual bool ignore(const Assignment &) const
Whether to ignore assignment for reification.
bool testsearch
Whether to perform search test.
bool testfix
Whether to perform fixpoint test.
virtual void post(Gecode::Space &home, Gecode::IntVarArray &x)=0
Post constraint.
bool eqv(void) const
Test whether equivalence as reification mode is supported.
int arity
Number of variables.
virtual bool solution(const Assignment &) const =0
Check for solution.
virtual Assignment * assignment(void) const
Create assignment.
Gecode::IntSet dom
Domain of variables.
bool imp(void) const
Test whether implication as reification mode is supported.
ConTestLevel contest
Whether to test for certain consistency.
Simple class for describing identation.
void branch(Home home, const FloatVarArgs &x, FloatVarBranch vars, FloatValBranch vals, FloatBranchFilter bf=nullptr, FloatVarValPrint vvp=nullptr)
Branch over x with variable selection vars and value selection vals.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
IntRelType
Relation types for integers.
ReifyMode
Mode for reification.
BoolOpType
Operation types for Booleans.
IntPropLevel
Propagation levels for integer propagators.
@ 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)
@ IPL_BASIC
Use basic propagation algorithm.
@ IPL_BASIC_ADVANCED
Use both.
@ IPL_DOM
Domain propagation Options: basic versus advanced propagation.
@ IPL_VAL
Value propagation.
@ IPL_ADVANCED
Use advanced propagation algorithm.
@ IPL_BND
Bounds propagation.
Space(void)
Default constructor.
SpaceStatus status(StatusStatistics &stat=unused_status)
Query space status.
Space * clone(CloneStatistics &stat=unused_clone) const
Clone space.
@ SS_FAILED
Space is failed
Gecode toplevel namespace
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
IntValBranch INT_VAL_MIN(void)
Select smallest value.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Testing finite domain integers.
@ CTL_BOUNDS_Z
Test for bounds(z)-consistency.
@ CTL_BOUNDS_D
Test for bounds(d)-consistency.
@ CTL_NONE
No consistency-test.
@ CTL_DOMAIN
Test for domain-consistency.
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::Int::Assignment &a)