Go to the documentation of this file.
51 vector<vector<int> > layout;
53 vector<int> layer, pile;
61 void generate(
int seed) {
63 layout = vector<vector<int> >(17, vector<int>(3));
66 for (
int i = 51;
i--; ) deck[
i] =
i+1;
68 std::random_shuffle(deck.begin(), deck.end(), rnd);
72 for (
int i = 17;
i--; )
73 for (
int j = 3; j--; )
74 layout[
i][j] = deck[
pos++];
77 layer = vector<int>(52);
78 pile = vector<int>(52);
79 for (
int i = 17;
i--; ) {
80 for (
int j = 3; j--; ) {
81 layer[layout[
i][j]] = j;
82 pile[ layout[
i][j]] =
i;
112 const char* suit =
"SCHD";
113 std::ostringstream o;
114 o << std::setw(2) << (1 + (val%13)) << suit[val/13];
128 PROPAGATION_TUPLE_SET
132 :
Script(
opt),
x(*this, 52, 0,51),
y(*this, 52, 0,51) {
141 if (
opt.propagation() == PROPAGATION_REIFIED) {
144 for (
int i = 0;
i < 52; ++
i) {
147 for (
int i = 0;
i < 51; ++
i) {
148 IntVar x1(*
this, 0, 12), x2(*
this, 0, 12);
151 const int dr[2] = {1, 12};
155 }
else if (
opt.propagation() == PROPAGATION_DFA) {
158 for (
int r = 13;
r--; ) {
159 for (
int s1 = 4; s1--; ) {
160 for (
int s2 = 4; s2--; ) {
161 for (
int i = -1;
i <= 1;
i+=2) {
170 DFA table(expression);
172 for (
int i = 51;
i--; )
178 for (
int r = 13;
r--; )
179 for (
int s1 = 4; s1--; )
180 for (
int s2 = 4; s2--; )
181 for (
int i = -1;
i <= 1;
i+=2) {
186 for (
int i = 51;
i--; )
191 for (
int i = 17;
i--; )
192 for (
int j = 2; j--; )
193 rel(*
this,
y[layout[
i][j]] <
y[layout[
i][j+1]]);
200 if (
opt.symmetry() == SYMMETRY_CONDITIONAL) {
202 for (
int r = 13;
r--; ) {
204 for (
int s1 = 4; s1--; ) {
205 for (
int s2 = s1; s2--; ) {
209 if (c1 == 0 || c2 == 0)
continue;
211 if (pile[c1] == pile[c2])
continue;
213 int o1 = c1, o2 = c2;
214 if (pile[c1] > pile[c2] && layer[c2] >= layer[c1])
219 for (
int i = 0;
i < layer[o1]; ++
i)
220 ba <<
expr(*
this, (
y[layout[pile[o1]][
i]] <
y[o2]));
221 for (
int i = 0;
i < layer[o2]; ++
i)
222 ba <<
expr(*
this, (
y[layout[pile[o2]][
i]] <
y[o1]));
224 for (
int i = layer[o1]+1;
i < 3; ++
i)
225 ba <<
expr(*
this, (
y[o2] <
y[layout[pile[o1]][
i]]));
226 for (
int i = layer[o2]+1;
i < 3; ++
i)
227 ba <<
expr(*
this, (
y[o1] <
y[layout[pile[o2]][
i]]));
234 rel(*
this, !cond || (
y[o1] <
y[o2]));
248 if (layer[vals.val()] < w) {
250 if ((w = layer[vals.val()]) == 0)
253 assert(
v >= 1 &&
v < 52);
259 os <<
"Layout:" << std::endl;
260 for (
int i = 0;
i < 17;
i++) {
261 for (
int j = 0; j < 3; j++)
262 os <<
card(layout[
i][j]) <<
" ";
268 os << std::endl << std::endl;
270 os <<
"Solution:" << std::endl;
271 for (
int i = 0;
i < 52; ++
i) {
273 os <<
card(
x[
i].val()) <<
" ";
276 if ((
i + 1) % 13 == 0)
303 "no symmetry breaking");
305 "break conditional symmetries");
308 "reified",
"use reified propagation");
310 "dfa",
"use DFA-based extensional propagation");
312 "tuple-set",
"use TupleSet-based extensional propagation");
316 generate(
opt.size());
317 Script::run<BlackHole,DFS,SizeOptions>(
opt);
Post propagator for SetVar x
Post propagator for SetVar SetOpType SetVar y
void propagation(int v)
Set default propagation value.
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
@ PROPAGATION_DFA
Extensional propagation using automatons.
Passing integer variables.
BoolVar expr(Home home, const BoolExpr &e, IntPropLevel ipl)
Post Boolean expression and return its value.
void element(Home home, IntSharedArray c, IntVar x0, IntVar x1, IntPropLevel)
Post domain consistent propagator for .
Value iterator for integer variables.
bool assigned(View x, int v)
Whether x is assigned to value v.
Gecode::IntArgs i(4, 1, 2, 3, 4)
void ipl(IntPropLevel i)
Set default integer propagation level.
IntValBranch INT_VAL(IntBranchVal v, IntBranchCommit c)
Select value as defined by the value function v and commit function c Uses a commit function as defau...
void branch(Home home, const FloatVarArgs &x, FloatVarBranch vars, FloatValBranch vals, FloatBranchFilter bf, FloatVarValPrint vvp)
Branch over x with variable selection vars and value selection vals.
Regular expressions over integer values.
void update(Space &home, bool share, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
BlackHole(bool share, BlackHole &s)
Constructor for cloning s.
Gecode toplevel namespace
void add(const IntArgs &tuple)
Add tuple to tuple set.
IntPropLevel ba(IntPropLevel ipl)
Extract basic or advanced from propagation level.
const unsigned int card
Maximum cardinality of an integer set.
void finalize(void)
Finalize tuple set.
Passing Boolean variables.
virtual void print(std::ostream &os) const
Print instance and solution.
Parametric base-class for scripts.
void extensional(Home home, const IntVarArgs &x, DFA dfa, IntPropLevel)
Post domain consistent propagator for extensional constraint described by a DFA.
Post propagator for SetVar SetOpType SetVar SetRelType r
Boolean integer variables.
@ IPL_DOM
Domain propagation Preferences: prefer speed or memory.
void parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
Example: Black hole patience
IntRelType swap(IntRelType irt)
Return swapped relation type of irt.
Template for linear congruential generators.
@ PROPAGATION_REIFIED
Reified propagation.
Class represeting a set of tuples.
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
std::string card(int val) const
Return a string representing the card of value val.
Deterministic finite automaton (DFA)
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
IntVarArray y
Position of card.
@ SYMMETRY_CONDITIONAL
Breaking conditional symmetries.
static int val(const Space &, IntVar x, int)
Value selection function for branching.
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
@ PROPAGATION_TUPLE_SET
Extensional propagation using tables.
virtual Space * copy(bool share)
Copy during cloning.
BlackHole(const SizeOptions &opt)
Actual model.
void symmetry(int v)
Set default symmetry value.
IntVarArray x
Card at position.
int main(int argc, char *argv[])
Main-function.
@ SYMMETRY_NONE
No symmetry breaking.
Passing integer arguments.
bool pos(const View &x)
Test whether x is postive.
Options for scripts with additional size parameter