main page
modules
namespaces
classes
files
Gecode home
Generated on Thu Feb 21 2013 23:11:42 for Gecode by
doxygen
1.8.3.1
gecode
int
distinct.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
* Gabor Szokoli <szokoli@gecode.org>
6
*
7
* Copyright:
8
* Christian Schulte, 2002
9
* Gabor Szokoli, 2003
10
*
11
* Last modified:
12
* $Date: 2011-08-18 06:25:49 +1000 (Thu, 18 Aug 2011) $ by $Author: schulte $
13
* $Revision: 12308 $
14
*
15
* This file is part of Gecode, the generic constraint
16
* development environment:
17
* http://www.gecode.org
18
*
19
* Permission is hereby granted, free of charge, to any person obtaining
20
* a copy of this software and associated documentation files (the
21
* "Software"), to deal in the Software without restriction, including
22
* without limitation the rights to use, copy, modify, merge, publish,
23
* distribute, sublicense, and/or sell copies of the Software, and to
24
* permit persons to whom the Software is furnished to do so, subject to
25
* the following conditions:
26
*
27
* The above copyright notice and this permission notice shall be
28
* included in all copies or substantial portions of the Software.
29
*
30
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
33
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
34
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
35
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
36
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37
*
38
*/
39
40
#include <
gecode/int/distinct.hh
>
41
42
namespace
Gecode {
43
44
using namespace
Int;
45
46
void
47
distinct
(
Home
home,
const
IntVarArgs
& x,
IntConLevel
icl) {
48
if
(x.
same
(home))
49
throw
ArgumentSame
(
"Int::distinct"
);
50
if
(home.
failed
())
return
;
51
ViewArray<IntView>
xv(home,x);
52
switch
(icl) {
53
case
ICL_BND
:
54
GECODE_ES_FAIL
(
Distinct::Bnd<IntView>::post
(home,xv));
55
break
;
56
case
ICL_DOM
:
57
GECODE_ES_FAIL
(
Distinct::Dom<IntView>::post
(home,xv));
58
break
;
59
default
:
60
GECODE_ES_FAIL
(
Distinct::Val<IntView>::post
(home,xv));
61
}
62
}
63
64
void
65
distinct
(
Home
home,
const
IntArgs
&
c
,
const
IntVarArgs
& x,
66
IntConLevel
icl) {
67
if
(x.
same
(home))
68
throw
ArgumentSame
(
"Int::distinct"
);
69
if
(c.
size
() != x.
size
())
70
throw
ArgumentSizeMismatch
(
"Int::distinct"
);
71
if
(home.
failed
())
return
;
72
ViewArray<OffsetView>
cx(home,x.
size
());
73
for
(
int
i
= c.
size
();
i
--; ) {
74
double
cx_min = (
static_cast<
double
>
(c[
i
]) +
75
static_cast<double>(x[
i
].
min
()));
76
double
cx_max = (
static_cast<
double
>
(c[
i
]) +
77
static_cast<double>(x[
i
].
max
()));
78
Limits::check
(c[
i
],
"Int::distinct"
);
79
Limits::check
(cx_min,
"Int::distinct"
);
80
Limits::check
(cx_max,
"Int::distinct"
);
81
cx[
i
] =
OffsetView
(x[i],c[i]);
82
}
83
switch
(icl) {
84
case
ICL_BND
:
85
GECODE_ES_FAIL
(
Distinct::Bnd<OffsetView>::post
(home,cx));
86
break
;
87
case
ICL_DOM
:
88
GECODE_ES_FAIL
(
Distinct::Dom<OffsetView>::post
(home,cx));
89
break
;
90
default
:
91
GECODE_ES_FAIL
(
Distinct::Val<OffsetView>::post
(home,cx));
92
}
93
}
94
95
}
96
97
// STATISTICS: int-post