main page
modules
namespaces
classes
files
Gecode home
Generated on Thu Mar 13 2014 04:39:32 for Gecode by
doxygen
1.8.1.2
gecode
int
rel.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-07-07 05:56:28 +1000 (Thu, 07 Jul 2011) $ by $Author: schulte $
11
* $Revision: 12151 $
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/rel.hh
>
39
#include <
gecode/int/bool.hh
>
40
41
#include <algorithm>
42
43
namespace
Gecode {
44
45
using namespace
Int;
46
47
void
48
rel
(
Home
home,
IntVar
x0,
IntRelType
r
,
int
n,
IntConLevel
) {
49
Limits::check
(n,
"Int::rel"
);
50
if
(home.
failed
())
return
;
51
IntView
x(x0);
52
switch
(r) {
53
case
IRT_EQ
:
GECODE_ME_FAIL
(x.
eq
(home,n));
break
;
54
case
IRT_NQ
:
GECODE_ME_FAIL
(x.
nq
(home,n));
break
;
55
case
IRT_LQ
:
GECODE_ME_FAIL
(x.
lq
(home,n));
break
;
56
case
IRT_LE
:
GECODE_ME_FAIL
(x.
le
(home,n));
break
;
57
case
IRT_GQ
:
GECODE_ME_FAIL
(x.
gq
(home,n));
break
;
58
case
IRT_GR
:
GECODE_ME_FAIL
(x.
gr
(home,n));
break
;
59
default
:
throw
UnknownRelation
(
"Int::rel"
);
60
}
61
}
62
63
void
64
rel
(
Home
home,
const
IntVarArgs
& x,
IntRelType
r
,
int
n,
IntConLevel
) {
65
Limits::check
(n,
"Int::rel"
);
66
if
(home.
failed
())
return
;
67
switch
(r) {
68
case
IRT_EQ
:
69
for
(
int
i
=x.
size
();
i
--; ) {
70
IntView
xi(x[
i
]);
GECODE_ME_FAIL
(xi.
eq
(home,n));
71
}
72
break
;
73
case
IRT_NQ
:
74
for
(
int
i
=x.
size
();
i
--; ) {
75
IntView
xi(x[
i
]);
GECODE_ME_FAIL
(xi.
nq
(home,n));
76
}
77
break
;
78
case
IRT_LQ
:
79
for
(
int
i
=x.
size
();
i
--; ) {
80
IntView
xi(x[
i
]);
GECODE_ME_FAIL
(xi.
lq
(home,n));
81
}
82
break
;
83
case
IRT_LE
:
84
for
(
int
i
=x.
size
();
i
--; ) {
85
IntView
xi(x[
i
]);
GECODE_ME_FAIL
(xi.
le
(home,n));
86
}
87
break
;
88
case
IRT_GQ
:
89
for
(
int
i
=x.
size
();
i
--; ) {
90
IntView
xi(x[
i
]);
GECODE_ME_FAIL
(xi.
gq
(home,n));
91
}
92
break
;
93
case
IRT_GR
:
94
for
(
int
i
=x.
size
();
i
--; ) {
95
IntView
xi(x[
i
]);
GECODE_ME_FAIL
(xi.
gr
(home,n));
96
}
97
break
;
98
default
:
99
throw
UnknownRelation
(
"Int::rel"
);
100
}
101
}
102
103
void
104
rel
(
Home
home,
IntVar
x0,
IntRelType
r
,
IntVar
x1,
IntConLevel
icl) {
105
if
(home.
failed
())
return
;
106
switch
(r) {
107
case
IRT_EQ
:
108
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
)) {
109
GECODE_ES_FAIL
((
Rel::EqDom<IntView,IntView>::post
(home,x0,x1)));
110
}
else
{
111
GECODE_ES_FAIL
((
Rel::EqBnd<IntView,IntView>::post
(home,x0,x1)));
112
}
113
break
;
114
case
IRT_NQ
:
115
GECODE_ES_FAIL
(
Rel::Nq<IntView>::post
(home,x0,x1));
break
;
116
case
IRT_GQ
:
117
std::swap(x0,x1);
// Fall through
118
case
IRT_LQ
:
119
GECODE_ES_FAIL
(
Rel::Lq<IntView>::post
(home,x0,x1));
break
;
120
case
IRT_GR
:
121
std::swap(x0,x1);
// Fall through
122
case
IRT_LE
:
123
GECODE_ES_FAIL
(
Rel::Le<IntView>::post
(home,x0,x1));
break
;
124
default
:
125
throw
UnknownRelation
(
"Int::rel"
);
126
}
127
}
128
129
void
130
rel
(
Home
home,
const
IntVarArgs
& x,
IntRelType
r
,
IntVar
y,
131
IntConLevel
icl) {
132
if
(home.
failed
())
return
;
133
switch
(r) {
134
case
IRT_EQ
:
135
{
136
ViewArray<IntView>
xv(home,x.
size
()+1);
137
xv[x.
size
()]=y;
138
for
(
int
i
=x.
size
();
i
--; )
139
xv[
i
]=x[
i
];
140
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
)) {
141
GECODE_ES_FAIL
(
Rel::NaryEqDom<IntView>::post
(home,xv));
142
}
else
{
143
GECODE_ES_FAIL
(
Rel::NaryEqBnd<IntView>::post
(home,xv));
144
}
145
}
146
break
;
147
case
IRT_NQ
:
148
for
(
int
i
=x.
size
();
i
--; ) {
149
GECODE_ES_FAIL
(
Rel::Nq<IntView>::post
(home,x[
i
],y));
150
}
151
break
;
152
case
IRT_GQ
:
153
for
(
int
i
=x.
size
();
i
--; ) {
154
GECODE_ES_FAIL
(
Rel::Lq<IntView>::post
(home,y,x[
i
]));
155
}
156
break
;
157
case
IRT_LQ
:
158
for
(
int
i
=x.
size
();
i
--; ) {
159
GECODE_ES_FAIL
(
Rel::Lq<IntView>::post
(home,x[
i
],y));
160
}
161
break
;
162
case
IRT_GR
:
163
for
(
int
i
=x.
size
();
i
--; ) {
164
GECODE_ES_FAIL
(
Rel::Le<IntView>::post
(home,y,x[
i
]));
165
}
166
break
;
167
case
IRT_LE
:
168
for
(
int
i
=x.
size
();
i
--; ) {
169
GECODE_ES_FAIL
(
Rel::Le<IntView>::post
(home,x[
i
],y));
170
}
171
break
;
172
default
:
173
throw
UnknownRelation
(
"Int::rel"
);
174
}
175
}
176
177
178
void
179
rel
(
Home
home,
IntVar
x0,
IntRelType
r
,
IntVar
x1,
BoolVar
b
,
180
IntConLevel
icl) {
181
if
(home.
failed
())
return
;
182
switch
(r) {
183
case
IRT_EQ
:
184
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
)) {
185
GECODE_ES_FAIL
((
Rel::ReEqDom<IntView,BoolView>::post
(home,x0,x1,b)));
186
}
else
{
187
GECODE_ES_FAIL
((
Rel::ReEqBnd<IntView,BoolView>::post
(home,x0,x1,b)));
188
}
189
break
;
190
case
IRT_NQ
:
191
{
192
NegBoolView
n(b);
193
if
(icl ==
ICL_BND
) {
194
GECODE_ES_FAIL
((
Rel::ReEqBnd<IntView,NegBoolView>
195
::
post
(home,x0,x1,n)));
196
}
else
{
197
GECODE_ES_FAIL
((
Rel::ReEqDom<IntView,NegBoolView>
198
::
post
(home,x0,x1,n)));
199
}
200
}
201
break
;
202
case
IRT_GQ
:
203
std::swap(x0,x1);
// Fall through
204
case
IRT_LQ
:
205
GECODE_ES_FAIL
((
Rel::ReLq<IntView,BoolView>::post
(home,x0,x1,b)));
206
break
;
207
case
IRT_LE
:
208
std::swap(x0,x1);
// Fall through
209
case
IRT_GR
:
210
{
211
NegBoolView
n(b);
212
GECODE_ES_FAIL
((
Rel::ReLq<IntView,NegBoolView>::post
(home,x0,x1,n)));
213
}
214
break
;
215
default
:
216
throw
UnknownRelation
(
"Int::rel"
);
217
}
218
}
219
220
void
221
rel
(
Home
home,
IntVar
x,
IntRelType
r
,
int
n,
BoolVar
b
,
222
IntConLevel
icl) {
223
Limits::check
(n,
"Int::rel"
);
224
if
(home.
failed
())
return
;
225
switch
(r) {
226
case
IRT_EQ
:
227
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
)) {
228
GECODE_ES_FAIL
((
Rel::ReEqDomInt<IntView,BoolView>
229
::
post
(home,x,n,b)));
230
}
else
{
231
GECODE_ES_FAIL
((
Rel::ReEqBndInt<IntView,BoolView>
232
::
post
(home,x,n,b)));
233
}
234
break
;
235
case
IRT_NQ
:
236
{
237
NegBoolView
nb(b);
238
if
(icl ==
ICL_BND
) {
239
GECODE_ES_FAIL
((
Rel::ReEqBndInt<IntView,NegBoolView>
240
::
post
(home,x,n,nb)));
241
}
else
{
242
GECODE_ES_FAIL
((
Rel::ReEqDomInt<IntView,NegBoolView>
243
::
post
(home,x,n,nb)));
244
}
245
}
246
break
;
247
case
IRT_LE
:
248
n--;
// Fall through
249
case
IRT_LQ
:
250
GECODE_ES_FAIL
((
Rel::ReLqInt<IntView,BoolView>
251
::
post
(home,x,n,b)));
252
break
;
253
case
IRT_GQ
:
254
n--;
// Fall through
255
case
IRT_GR
:
256
{
257
NegBoolView
nb(b);
258
GECODE_ES_FAIL
((
Rel::ReLqInt<IntView,NegBoolView>
259
::
post
(home,x,n,nb)));
260
}
261
break
;
262
default
:
263
throw
UnknownRelation
(
"Int::rel"
);
264
}
265
}
266
267
void
268
rel
(
Home
home,
const
IntVarArgs
& x,
IntRelType
r
,
269
IntConLevel
icl) {
270
if
(home.
failed
() || ((r !=
IRT_NQ
) && (x.
size
() < 2)))
271
return
;
272
switch
(r) {
273
case
IRT_EQ
:
274
{
275
ViewArray<IntView>
xv(home,x);
276
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
)) {
277
GECODE_ES_FAIL
(
Rel::NaryEqDom<IntView>::post
(home,xv));
278
}
else
{
279
GECODE_ES_FAIL
(
Rel::NaryEqBnd<IntView>::post
(home,xv));
280
}
281
}
282
break
;
283
case
IRT_NQ
:
284
{
285
ViewArray<IntView>
y(home,x);
286
GECODE_ES_FAIL
((
Rel::NaryNq<IntView>::post
(home,y)));
287
}
288
break
;
289
case
IRT_LE
:
290
{
291
ViewArray<IntView>
y(home,x);
292
GECODE_ES_FAIL
((
Rel::NaryLqLe<IntView,1>::post
(home,y)));
293
}
294
break
;
295
case
IRT_LQ
:
296
{
297
ViewArray<IntView>
y(home,x);
298
GECODE_ES_FAIL
((
Rel::NaryLqLe<IntView,0>::post
(home,y)));
299
}
300
break
;
301
case
IRT_GR
:
302
{
303
ViewArray<IntView>
y(home,x.
size
());
304
for
(
int
i
=x.
size
();
i
--; )
305
y[
i
] = x[x.
size
()-1-
i
];
306
GECODE_ES_FAIL
((
Rel::NaryLqLe<IntView,1>::post
(home,y)));
307
}
308
for
(
int
i
=x.
size
()-1;
i
--; )
309
GECODE_ES_FAIL
(
Rel::Le<IntView>::post
(home,x[
i
+1],x[
i
]));
310
break
;
311
case
IRT_GQ
:
312
{
313
ViewArray<IntView>
y(home,x.
size
());
314
for
(
int
i=x.
size
(); i--; )
315
y[i] = x[x.
size
()-1-
i
];
316
GECODE_ES_FAIL
((
Rel::NaryLqLe<IntView,0>::post
(home,y)));
317
}
318
break
;
319
default
:
320
throw
UnknownRelation
(
"Int::rel"
);
321
}
322
}
323
324
void
325
rel
(
Home
home,
const
IntVarArgs
& x,
IntRelType
r
,
const
IntVarArgs
& y,
326
IntConLevel
icl) {
327
if
(home.
failed
())
return
;
328
329
switch
(r) {
330
case
IRT_GR
:
331
{
332
ViewArray<IntView>
xv(home,x), yv(home,y);
333
GECODE_ES_FAIL
(
Rel::LexLqLe<IntView>::post
(home,yv,xv,
true
));
334
}
335
break
;
336
case
IRT_LE
:
337
{
338
ViewArray<IntView>
xv(home,x), yv(home,y);
339
GECODE_ES_FAIL
(
Rel::LexLqLe<IntView>::post
(home,xv,yv,
true
));
340
}
341
break
;
342
case
IRT_GQ
:
343
{
344
ViewArray<IntView>
xv(home,x), yv(home,y);
345
GECODE_ES_FAIL
(
Rel::LexLqLe<IntView>::post
(home,yv,xv,
false
));
346
}
347
break
;
348
case
IRT_LQ
:
349
{
350
ViewArray<IntView>
xv(home,x), yv(home,y);
351
GECODE_ES_FAIL
(
Rel::LexLqLe<IntView>::post
(home,xv,yv,
false
));
352
}
353
break
;
354
case
IRT_EQ
:
355
if
(x.
size
() != y.
size
()) {
356
home.
fail
();
357
}
else
if
((icl ==
ICL_DOM
) || (icl ==
ICL_DEF
))
358
for
(
int
i
=x.
size
();
i
--; ) {
359
GECODE_ES_FAIL
((
Rel::EqDom<IntView,IntView>
360
::
post
(home,x[
i
],y[i])));
361
}
362
else
363
for
(
int
i
=x.
size
();
i
--; ) {
364
GECODE_ES_FAIL
((
Rel::EqBnd<IntView,IntView>
365
::
post
(home,x[
i
],y[i])));
366
}
367
break
;
368
case
IRT_NQ
:
369
{
370
ViewArray<IntView>
xv(home,x), yv(home,y);
371
GECODE_ES_FAIL
(
Rel::LexNq<IntView>::post
(home,xv,yv));
372
}
373
break
;
374
default
:
375
throw
UnknownRelation
(
"Int::rel"
);
376
}
377
}
378
379
}
380
381
// STATISTICS: int-post