46 class UniformIntInvalidRange :
public Base {
49 UniformIntInvalidRange(
void)
50 : Base(
"FlatZinc::on_restart::uniform_int_invalid_range") {}
52 virtual bool run(
void) {
53 std::stringstream source(R
"FZN(
54predicate gecode_on_restart_uniform_int(int: low,int: high,var int: out);
56constraint gecode_on_restart_uniform_int(1,0,y);
59 Gecode::FlatZinc::Printer p;
60 std::ostringstream err;
61 Gecode::FlatZinc::FlatZincSpace* fg =
63 const std::string message = err.str();
64 return fg ==
nullptr &&
65 message.find(
"gecode_on_restart_uniform_int") != std::string::npos &&
66 message.find(
"low (1) <= high (0)") != std::string::npos;
71 class ScriptedRandom {
73 const unsigned int* values;
78 ScriptedRandom(
const unsigned int* values0,
unsigned int size0)
79 : values(values0), size(size0), next(0) {}
81 unsigned int operator ()(
unsigned int n) {
82 if ((n != (1U << 31)) || (next >= size))
84 return values[next++];
87 unsigned long long int operator ()(
unsigned long long int) {
91 bool done(
void)
const {
97 class WideUniformInt :
public Base {
101 : Base(
"FlatZinc::on_restart::uniform_int_wide_endpoints") {}
103 virtual bool run(
void) {
105 const unsigned int chunks[] = {
106 (1U << 31) - 1U, (1U << 31) - 1U, 1U, 0U
108 ScriptedRandom random(chunks, 4);
109 const unsigned long long int width = (1ULL << 31) + 1ULL;
110 const unsigned long long int offset =
112 if ((offset != width - 1ULL) ||
113 (
static_cast<long long int>(INT_MIN) +
114 static_cast<long long int>(offset) != 0) || !random.done())
118 const unsigned int chunks[] = {1U, (1U << 31) - 1U};
119 ScriptedRandom random(chunks, 2);
120 const unsigned long long int width = 1ULL << 32;
121 const unsigned long long int offset =
123 if ((offset != width - 1ULL) ||
124 (
static_cast<long long int>(INT_MIN) +
125 static_cast<long long int>(offset) != INT_MAX) || !random.done())
138 (void)
new FlatZincTest(
"on_restart::last_val_int",
140predicate gecode_on_restart_status(var int: s);
141predicate gecode_on_restart_last_val_int(var int: input,var int: out);
142predicate int_lin_eq_imp(array [int] of int: as,array [int] of var int: bs,int: c,var bool: r);
143predicate int_eq_imp(var int: a,var int: b,var bool: r);
144array [1..2] of int: X_INTRODUCED_15_ = [1,-1];
145var -1..4: x:: output_var;
146var int: y:: output_var;
147var 0..4: X_INTRODUCED_1_ ::var_is_introduced :: is_defined_var;
148var 1..5: X_INTRODUCED_3_ ::var_is_introduced ;
149var bool: X_INTRODUCED_4_ ::var_is_introduced :: is_defined_var;
150var int: X_INTRODUCED_6_ ::var_is_introduced ;
151var bool: X_INTRODUCED_16_ ::var_is_introduced :: is_defined_var;
152array [1..1] of var int: X_INTRODUCED_2_ ::var_is_introduced = [x];
153constraint int_abs(x,X_INTRODUCED_1_):: ctx_pos:: defines_var(X_INTRODUCED_1_);
154constraint gecode_on_restart_status(X_INTRODUCED_3_);
155constraint gecode_on_restart_last_val_int(y,X_INTRODUCED_6_);
156constraint bool_clause([X_INTRODUCED_4_,X_INTRODUCED_16_],[]);
157constraint int_eq_imp(y,0,X_INTRODUCED_4_);
158constraint int_eq_reif(X_INTRODUCED_3_,1,X_INTRODUCED_4_):: defines_var(X_INTRODUCED_4_);
159constraint int_lin_eq_imp(X_INTRODUCED_15_,[y,X_INTRODUCED_6_],1,X_INTRODUCED_16_):: defines_var(X_INTRODUCED_16_);
160solve :: int_search(X_INTRODUCED_2_,input_order,indomain_min,complete) maximize X_INTRODUCED_1_;
174)OUT", true, {"--restart", "constant", "--restart-base", "100"});
176 (void) new FlatZincTest("on_restart::uniform_int_upper_bound",
178predicate gecode_on_restart_uniform_int(int: low,int: high,var int: out);
179var 0..1: y:: output_var;
180constraint gecode_on_restart_uniform_int(0,1,y);
181constraint int_eq(y,1);
185)OUT", true, {"--restart", "constant", "--restart-base", "100", "--seed", "2"});
190 UniformIntInvalidRange invalid_range;
196// STATISTICS: test-flatzinc
unsigned long long int uniform_int_offset(Random &random, unsigned long long int width)
Sample an offset for an inclusive integer restart range.
GECODE_FLATZINC_EXPORT FlatZincSpace * parse(const std::string &fileName, Printer &p, std::ostream &err=std::cerr, FlatZincSpace *fzs=nullptr, Rnd &rnd=defrnd)
Parse FlatZinc file fileName into fzs and return it.