main page
modules
namespaces
classes
files
Gecode home
Generated on Mon Aug 27 2012 17:15:39 for Gecode by
doxygen
1.8.1.2
gecode
int
count.cpp
Go to the documentation of this file.
1
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
/*
3
* Main authors:
4
* Christian Schulte <schulte@gecode.org>
5
*
6
* Copyright:
7
* Christian Schulte, 2002
8
*
9
* Last modified:
10
* $Date: 2011-09-20 21:58:39 +1000 (Tue, 20 Sep 2011) $ by $Author: schulte $
11
* $Revision: 12404 $
12
*
13
* This file is part of Gecode, the generic constraint
14
* development environment:
15
* http://www.gecode.org
16
*
17
* Permission is hereby granted, free of charge, to any person obtaining
18
* a copy of this software and associated documentation files (the
19
* "Software"), to deal in the Software without restriction, including
20
* without limitation the rights to use, copy, modify, merge, publish,
21
* distribute, sublicense, and/or sell copies of the Software, and to
22
* permit persons to whom the Software is furnished to do so, subject to
23
* the following conditions:
24
*
25
* The above copyright notice and this permission notice shall be
26
* included in all copies or substantial portions of the Software.
27
*
28
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
32
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
34
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35
*
36
*/
37
38
#include <
gecode/int/count.hh
>
39
#include <
gecode/int/rel.hh
>
40
41
namespace
Gecode {
42
43
void
44
count
(
Home
home,
const
IntVarArgs
& x,
int
n,
45
IntRelType
r
,
int
m
,
IntConLevel
) {
46
using namespace
Int;
47
Limits::check
(n,
"Int::count"
);
48
Limits::check
(m,
"Int::count"
);
49
50
if
(home.
failed
())
return
;
51
52
ViewArray<IntView>
xv(home,x);
53
ConstIntView
y(n);
54
55
switch
(r) {
56
case
IRT_EQ
:
57
GECODE_ES_FAIL
((
Count::EqInt<IntView,ConstIntView>
58
::
post
(home,xv,y,m)));
59
break
;
60
case
IRT_NQ
:
61
{
62
IntVar
z(home,0,x.
size
());
63
GECODE_ME_FAIL
(
IntView
(z).nq(home,m));
64
GECODE_ES_FAIL
((
Count::EqView<IntView,ConstIntView,IntView,true,false>
65
::
post
(home,xv,y,z,0)));
66
}
67
break
;
68
case
IRT_LE
:
69
m--;
// FALL THROUGH
70
case
IRT_LQ
:
71
GECODE_ES_FAIL
((
Count::LqInt<IntView,ConstIntView>
72
::
post
(home,xv,y,m)));
73
break
;
74
case
IRT_GR
:
75
m++;
// FALL THROUGH
76
case
IRT_GQ
:
77
GECODE_ES_FAIL
((
Count::GqInt<IntView,ConstIntView>
78
::
post
(home,xv,y,m)));
79
break
;
80
default
:
81
throw
UnknownRelation
(
"Int::count"
);
82
}
83
}
84
85
void
86
count
(
Home
home,
const
IntVarArgs
& x,
IntVar
y,
87
IntRelType
r
,
int
m
,
IntConLevel
icl) {
88
using namespace
Int;
89
Limits::check
(m,
"Int::count"
);
90
if
(home.
failed
())
return
;
91
ViewArray<IntView>
xv(home,x);
92
93
switch
(r) {
94
case
IRT_EQ
:
95
{
96
ConstIntView
z(m);
97
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
))
98
GECODE_ES_FAIL
((
Count::EqView<IntView,IntView,ConstIntView,true,true>
99
::
post
(home,xv,y,z,0)));
100
else
101
GECODE_ES_FAIL
((
Count::EqView<IntView,IntView,ConstIntView,true,false>
102
::
post
(home,xv,y,z,0)));
103
}
104
break
;
105
case
IRT_NQ
:
106
{
107
IntVar
z(home,0,x.
size
());
108
GECODE_ME_FAIL
(
IntView
(z).nq(home,m));
109
GECODE_ES_FAIL
((
Count::EqView<IntView,IntView,IntView,true,false>
110
::
post
(home,xv,y,z,0)));
111
}
112
break
;
113
case
IRT_LE
:
114
m--;
// FALL THROUGH
115
case
IRT_LQ
:
116
GECODE_ES_FAIL
((
Count::LqInt<IntView,IntView>
117
::
post
(home,xv,y,m)));
118
break
;
119
case
IRT_GR
:
120
m++;
// FALL THROUGH
121
case
IRT_GQ
:
122
{
123
ConstIntView
z(m);
124
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
))
125
GECODE_ES_FAIL
((
Count::GqView<IntView,IntView,ConstIntView,true,true>
126
::
post
(home,xv,y,z,0)));
127
else
128
GECODE_ES_FAIL
((
Count::GqView<IntView,IntView,ConstIntView,true,false>
129
::
post
(home,xv,y,z,0)));
130
}
131
break
;
132
default
:
133
throw
UnknownRelation
(
"Int::count"
);
134
}
135
}
136
137
void
138
count
(
Home
home,
const
IntVarArgs
& x,
const
IntSet
& y,
139
IntRelType
r
,
int
m
,
IntConLevel
) {
140
using namespace
Int;
141
142
if
(y.
size
() == 1) {
143
count
(home,x,y.
min
(),
r
,
m
);
144
return
;
145
}
146
147
Limits::check
(y.
min
(),
"Int::count"
);
148
Limits::check
(y.
max
(),
"Int::count"
);
149
Limits::check
(m,
"Int::count"
);
150
151
if
(home.
failed
())
return
;
152
153
ViewArray<IntView>
xv(home,x);
154
switch
(r) {
155
case
IRT_EQ
:
156
GECODE_ES_FAIL
((
Count::EqInt<IntView,IntSet>::post
(home,xv,y,m)));
157
break
;
158
case
IRT_NQ
:
159
{
160
IntVar
z(home,0,x.
size
());
161
GECODE_ME_FAIL
(
IntView
(z).nq(home,m));
162
GECODE_ES_FAIL
((
Count::EqView<IntView,IntSet,IntView,true,false>
163
::
post
(home,xv,y,z,0)));
164
}
165
break
;
166
case
IRT_LE
:
167
m--;
// FALL THROUGH
168
case
IRT_LQ
:
169
GECODE_ES_FAIL
((
Count::LqInt<IntView,IntSet>::post
(home,xv,y,m)));
170
break
;
171
case
IRT_GR
:
172
m++;
// FALL THROUGH
173
case
IRT_GQ
:
174
GECODE_ES_FAIL
((
Count::GqInt<IntView,IntSet>::post
(home,xv,y,m)));
175
break
;
176
default
:
177
throw
UnknownRelation
(
"Int::count"
);
178
}
179
}
180
181
void
182
count
(
Home
home,
const
IntVarArgs
& x,
const
IntArgs
& y,
183
IntRelType
r
,
int
m
,
IntConLevel
) {
184
using namespace
Int;
185
if
(x.
size
() != y.
size
())
186
throw
ArgumentSizeMismatch
(
"Int::count"
);
187
Limits::check
(m,
"Int::count"
);
188
if
(home.
failed
())
return
;
189
190
ViewArray<OffsetView>
xy(home,x.
size
());
191
for
(
int
i
=x.
size
();
i
--; )
192
xy[
i
] =
OffsetView
(x[
i
],-y[i]);
193
194
ZeroIntView
zero;
195
switch
(r) {
196
case
IRT_EQ
:
197
GECODE_ES_FAIL
((
Count::EqInt<OffsetView,ZeroIntView>
198
::
post
(home,xy,zero,m)));
199
break
;
200
case
IRT_NQ
:
201
{
202
IntVar
z(home,0,x.
size
());
203
GECODE_ME_FAIL
(
IntView
(z).nq(home,m));
204
GECODE_ES_FAIL
((
Count::EqView<OffsetView,ZeroIntView,IntView,true,false>
205
::
post
(home,xy,zero,z,0)));
206
}
207
break
;
208
case
IRT_LE
:
209
m--;
// FALL THROUGH
210
case
IRT_LQ
:
211
GECODE_ES_FAIL
((
Count::LqInt<OffsetView,ZeroIntView>
212
::
post
(home,xy,zero,m)));
213
break
;
214
case
IRT_GR
:
215
m++;
// FALL THROUGH
216
case
IRT_GQ
:
217
GECODE_ES_FAIL
((
Count::GqInt<OffsetView,ZeroIntView>
218
::
post
(home,xy,zero,m)));
219
break
;
220
default
:
221
throw
UnknownRelation
(
"Int::count"
);
222
}
223
}
224
225
void
226
count
(
Home
home,
const
IntVarArgs
& x,
int
n,
227
IntRelType
r
,
IntVar
z,
IntConLevel
) {
228
using namespace
Int;
229
Limits::check
(n,
"Int::count"
);
230
if
(home.
failed
())
return
;
231
ViewArray<IntView>
xv(home,x);
232
ConstIntView
yv(n);
233
switch
(r) {
234
case
IRT_EQ
:
235
GECODE_ES_FAIL
((
Count::EqView<IntView,ConstIntView,IntView,true,false>
236
::
post
(home,xv,yv,z,0)));
237
break
;
238
case
IRT_NQ
:
239
{
240
IntVar
nz(home,0,x.
size
());
241
GECODE_ES_FAIL
(
Rel::Nq<IntView>::post
(home,z,nz));
242
GECODE_ES_FAIL
((
Count::EqView<IntView,ConstIntView,IntView,true,false>
243
::
post
(home,xv,yv,nz,0)));
244
}
245
break
;
246
case
IRT_LE
:
247
GECODE_ES_FAIL
((
Count::LqView<IntView,ConstIntView,IntView,true>
248
::
post
(home,xv,yv,z,-1)));
249
break
;
250
case
IRT_LQ
:
251
GECODE_ES_FAIL
((
Count::LqView<IntView,ConstIntView,IntView,true>
252
::
post
(home,xv,yv,z,0)));
253
break
;
254
case
IRT_GR
:
255
GECODE_ES_FAIL
((
Count::GqView<IntView,ConstIntView,IntView,true,false>
256
::
post
(home,xv,yv,z,1)));
257
break
;
258
case
IRT_GQ
:
259
GECODE_ES_FAIL
((
Count::GqView<IntView,ConstIntView,IntView,true,false>
260
::
post
(home,xv,yv,z,0)));
261
break
;
262
default
:
263
throw
UnknownRelation
(
"Int::count"
);
264
}
265
}
266
267
void
268
count
(
Home
home,
const
IntVarArgs
& x,
IntVar
y,
269
IntRelType
r
,
IntVar
z,
IntConLevel
icl) {
270
using namespace
Int;
271
if
(home.
failed
())
return
;
272
ViewArray<IntView>
xv(home,x);
273
switch
(r) {
274
case
IRT_EQ
:
275
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
))
276
GECODE_ES_FAIL
((
Count::EqView<IntView,IntView,IntView,true,true>
277
::
post
(home,xv,y,z,0)));
278
else
279
GECODE_ES_FAIL
((
Count::EqView<IntView,IntView,IntView,true,false>
280
::
post
(home,xv,y,z,0)));
281
break
;
282
case
IRT_NQ
:
283
{
284
IntVar
nz(home,0,x.
size
());
285
GECODE_ES_FAIL
(
Rel::Nq<IntView>::post
(home,z,nz));
286
GECODE_ES_FAIL
((
Count::EqView<IntView,IntView,IntView,true,false>
287
::
post
(home,xv,y,nz,0)));
288
}
289
break
;
290
case
IRT_LE
:
291
GECODE_ES_FAIL
((
Count::LqView<IntView,IntView,IntView,true>
292
::
post
(home,xv,y,z,-1)));
293
break
;
294
case
IRT_LQ
:
295
GECODE_ES_FAIL
((
Count::LqView<IntView,IntView,IntView,true>
296
::
post
(home,xv,y,z,0)));
297
break
;
298
case
IRT_GR
:
299
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
))
300
GECODE_ES_FAIL
((
Count::GqView<IntView,IntView,IntView,true,true>
301
::
post
(home,xv,y,z,1)));
302
else
303
GECODE_ES_FAIL
((
Count::GqView<IntView,IntView,IntView,true,false>
304
::
post
(home,xv,y,z,0)));
305
break
;
306
case
IRT_GQ
:
307
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
))
308
GECODE_ES_FAIL
((
Count::GqView<IntView,IntView,IntView,true,true>
309
::
post
(home,xv,y,z,0)));
310
else
311
GECODE_ES_FAIL
((
Count::GqView<IntView,IntView,IntView,true,false>
312
::
post
(home,xv,y,z,0)));
313
break
;
314
default
:
315
throw
UnknownRelation
(
"Int::count"
);
316
}
317
}
318
319
void
320
count
(
Home
home,
const
IntVarArgs
& x,
const
IntSet
& y,
321
IntRelType
r
,
IntVar
z,
IntConLevel
) {
322
using namespace
Int;
323
324
if
(y.
size
() == 1) {
325
count
(home,x,y.
min
(),
r
,z);
326
return
;
327
}
328
329
Limits::check
(y.
min
(),
"Int::count"
);
330
Limits::check
(y.
max
(),
"Int::count"
);
331
332
if
(home.
failed
())
return
;
333
ViewArray<IntView>
xv(home,x);
334
switch
(r) {
335
case
IRT_EQ
:
336
GECODE_ES_FAIL
((
Count::EqView<IntView,IntSet,IntView,true,false>
337
::
post
(home,xv,y,z,0)));
338
break
;
339
case
IRT_NQ
:
340
{
341
IntVar
nz(home,0,x.
size
());
342
GECODE_ES_FAIL
(
Rel::Nq<IntView>::post
(home,z,nz));
343
GECODE_ES_FAIL
((
Count::EqView<IntView,IntSet,IntView,true,false>
344
::
post
(home,xv,y,nz,0)));
345
}
346
break
;
347
case
IRT_LE
:
348
GECODE_ES_FAIL
((
Count::LqView<IntView,IntSet,IntView,true>
349
::
post
(home,xv,y,z,-1)));
350
break
;
351
case
IRT_LQ
:
352
GECODE_ES_FAIL
((
Count::LqView<IntView,IntSet,IntView,true>
353
::
post
(home,xv,y,z,0)));
354
break
;
355
case
IRT_GR
:
356
GECODE_ES_FAIL
((
Count::GqView<IntView,IntSet,IntView,true,false>
357
::
post
(home,xv,y,z,1)));
358
break
;
359
case
IRT_GQ
:
360
GECODE_ES_FAIL
((
Count::GqView<IntView,IntSet,IntView,true,false>
361
::
post
(home,xv,y,z,0)));
362
break
;
363
default
:
364
throw
UnknownRelation
(
"Int::count"
);
365
}
366
}
367
368
void
369
count
(
Home
home,
const
IntVarArgs
& x,
const
IntArgs
& y,
370
IntRelType
r
,
IntVar
z,
IntConLevel
) {
371
using namespace
Int;
372
if
(x.
size
() != y.
size
())
373
throw
ArgumentSizeMismatch
(
"Int::count"
);
374
if
(home.
failed
())
return
;
375
376
ViewArray<OffsetView>
xy(home,x.
size
());
377
for
(
int
i
=x.
size
();
i
--; )
378
xy[
i
] =
OffsetView
(x[
i
],-y[i]);
379
380
ZeroIntView
u;
381
switch
(r) {
382
case
IRT_EQ
:
383
GECODE_ES_FAIL
((
Count::EqView<OffsetView,ZeroIntView,IntView,true,false>
384
::
post
(home,xy,u,z,0)));
385
break
;
386
case
IRT_NQ
:
387
{
388
IntVar
nz(home,0,x.
size
());
389
GECODE_ES_FAIL
(
Rel::Nq<IntView>::post
(home,z,nz));
390
GECODE_ES_FAIL
((
Count::EqView<OffsetView,ZeroIntView,IntView,true,false>
391
::
post
(home,xy,u,nz,0)));
392
}
393
break
;
394
case
IRT_LE
:
395
GECODE_ES_FAIL
((
Count::LqView<OffsetView,ZeroIntView,IntView,true>
396
::
post
(home,xy,u,z,-1)));
397
break
;
398
case
IRT_LQ
:
399
GECODE_ES_FAIL
((
Count::LqView<OffsetView,ZeroIntView,IntView,true>
400
::
post
(home,xy,u,z,0)));
401
break
;
402
case
IRT_GR
:
403
GECODE_ES_FAIL
((
Count::GqView<OffsetView,ZeroIntView,IntView,true,false>
404
::
post
(home,xy,u,z,1)));
405
break
;
406
case
IRT_GQ
:
407
GECODE_ES_FAIL
((
Count::GqView<OffsetView,ZeroIntView,IntView,true,false>
408
::
post
(home,xy,u,z,0)));
409
break
;
410
default
:
411
throw
UnknownRelation
(
"Int::count"
);
412
}
413
}
414
415
}
416
417
// STATISTICS: int-post