60 int v0 = 5,
int q0 = 3,
int lambda0 = 2,
int d0 = 4)
62 _v(
"-v",
"number of sequences", v0 ),
63 _q(
"-q",
"number of symbols", q0 ),
64 _l(
"-l",
"sets of symbols per sequence (lambda)", lambda0),
65 _d(
"-d",
"Hamming distance between sequences", d0 ),
66 _permutation(
"-permutation",
"use permutation constraints if d=4",
78 _permutation.
add(
true,
"full" );
79 _permutation.
add(
false,
"none");
81 _symmetry.add(
true,
"true" );
82 _symmetry.add(
false,
"false");
85 void parse(
int& argc,
char* argv[]) {
89 int v(
void)
const {
return _v.
value(); }
91 int q(
void)
const {
return _q.
value(); }
93 int l(
void)
const {
return _l.
value(); }
95 int d(
void)
const {
return _d.
value(); }
100 bool symmetry(
void)
const {
return _symmetry.value(); }
137 nseqpair((v*(v-1))/2),
139 diff(*this, n*nseqpair, 0, 1)
150 for (
int i = q;
i--; ) values[
i] =
i+1;
152 for (
int i = v;
i--; )
159 for (
int a = 0;
a <
v; ++
a) {
160 for (
int b =
a+1;
b <
v; ++
b) {
161 for (
int i = n;
i--; ) {
167 assert(nseqi == nseqpair);
172 for (
int i = nseqpair;
i--; ) {
181 for (
int r = 0;
r<v-1; ++
r) {
185 for (
int c = 0; c<n-1; ++
c) {
191 for (
int c = 0; c <
n; ++
c) {
208 for (
int r1 = 0; r1 <
v; ++r1) {
209 for (
int r2 = r1+1; r2 <
v; ++r2) {
214 for (
int i = d;
i--; ) perm[
i] =
IntVar(*
this, 0, n-1);
216 IntVar cform(*
this, 0, 1);
222 for (
int i = 2*d;
i--; ) _p[
i] =
IntVar(*
this, 1, q);
224 for (
int i = 0;
i < 2; ++
i) {
225 for (
int j = 0; j <
d; ++j) {
231 for (
int i = 0;
i <
d; ++
i) {
232 IntVar index(*
this, 0, 2*d);
233 rel(*
this, cform*d +
i == index);
234 IntVar value(*
this, 1, q);
235 element(*
this, _p, index, value);
236 element(*
this, row2, perm[
i], value);
249 for (
int i = n;
i--; ) {
252 rel(*
this, (!p1b[
i] && !p2b[
i] && !p3b[
i] && !p4b[
i]) ==
253 (row1[i] == row2[i]));
262 rel(*
this, perm[0],
IRT_NQ, perm[2], cformb);
263 rel(*
this, perm[0],
IRT_NQ, perm[3], cformb);
264 rel(*
this, perm[1],
IRT_NQ, perm[2], cformb);
265 rel(*
this, perm[1],
IRT_NQ, perm[3], cformb);
271 rel(*
this, (!cformb) >> (perm[2] < perm[3]));
283 for (
int i = 0;
i <
v; ++
i) {
285 os << r << std::endl;
306 return new EFPA(share,*
this);
317 opt.
parse(argc,argv);
319 Script::run<EFPA,DFS,EFPAOptions>(
opt);
void value(int v)
Set default value to v.
EFPAOptions(const char *s, int v0=5, int q0=3, int lambda0=2, int d0=4)
Initialize options for example with name s.
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
void linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatNum c)
Post propagator for .
int v
Number of sequences.
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
int d(void) const
Get d, Hamming distance between sequences.
EFPA(bool share, EFPA &s)
Constructor for cloning s.
Multi _d(Gecode::IntArgs(3, 3, 2, 1))
void add(int v, const char *o, const char *h=NULL)
Add option value for value v, string o, and help text h.
int v(void) const
Get v, number of sequences.
int d
Hamming distance between any pair of sequences.
EFPA(const EFPAOptions &opt)
Actual model.
Parametric base-class for scripts.
void value(unsigned int v)
Set default value to v.
void update(Space &, bool share, VarArray< Var > &a)
Update array to be a clone of array a.
IntVarArray c
Variables for sequences.
Gecode::FloatVal c(-8, 8)
int p
Number of positive literals for node type.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
int n
Length of sequence ( )
IntRelType
Relation types for integers.
bool symmetry(void) const
Whether to use symmetry breaking.
IntValBranch INT_VAL_MIN(void)
Select smallest value.
void parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
Slice< A > row(int r) const
Access row r.
void element(Home home, IntSharedArray c, IntVar x0, IntVar x1, IntConLevel)
Post domain consistent propagator for .
virtual void print(std::ostream &os) const
Print instance and solution.
Passing integer variables.
Passing integer arguments.
Passing Boolean variables.
Boolean integer variables.
LinIntExpr cardinality(const SetExpr &e)
Cardinality of set expression.
BoolVarArray diff
Differences between sequences.
void parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
String-valued option (integer value defined by strings)
void values(Home home, const IntVarArgs &x, IntSet y, IntConLevel icl=ICL_DEF)
Post constraint .
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntConLevel)
Post propagator for .
Example: Equidistant Frequency Permutation Arrays
virtual Space * copy(bool share)
Copy during cloning.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
Matrix-interface for arrays.
int main(int argc, char *argv[])
Main-function.
int q(void) const
Get q, number of symbols.
bool permutation(void) const
Whether to use permutation constraints. Only active if d=4.
struct Gecode::@518::NNF::@57::@58 b
For binary nodes (and, or, eqv)
Gecode toplevel namespace
Slice< A > col(int c) const
Access column c.
BrancherHandle 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.
int nseqpair
Number of sequence pairs ( )
int l(void) const
Get lambda, sets of symbols per sequence.
void icl(IntConLevel i)
Set default integer consistency level.
struct Gecode::@518::NNF::@57::@59 a
For atomic nodes.
Domain propagation or consistency.
Options for EFPA problems
int l
Number of sets of symbols for a sequence ( )