42 using namespace Gecode;
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(); }
98 bool permutation(
void)
const {
return d() == 4 && _permutation.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) {
226 element(*
this, row1, perm[k[
i][j]], p(j,
i));
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;
301 diff.update(*
this, share, s.
diff);
306 return new EFPA(share,*
this);
317 opt.
parse(argc,argv);
319 Script::run<EFPA,DFS,EFPAOptions>(
opt);