main page
modules
namespaces
classes
files
Gecode home
Generated on Mon Jul 27 2020 00:00:00 for Gecode by
doxygen
1.8.18
gecode
set
element.cpp
Go to the documentation of this file.
1
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
/*
3
* Main authors:
4
* Guido Tack <tack@gecode.org>
5
* Christian Schulte <schulte@gecode.org>
6
*
7
* Copyright:
8
* Guido Tack, 2004
9
* Christian Schulte, 2004
10
*
11
* This file is part of Gecode, the generic constraint
12
* development environment:
13
* http://www.gecode.org
14
*
15
* Permission is hereby granted, free of charge, to any person obtaining
16
* a copy of this software and associated documentation files (the
17
* "Software"), to deal in the Software without restriction, including
18
* without limitation the rights to use, copy, modify, merge, publish,
19
* distribute, sublicense, and/or sell copies of the Software, and to
20
* permit persons to whom the Software is furnished to do so, subject to
21
* the following conditions:
22
*
23
* The above copyright notice and this permission notice shall be
24
* included in all copies or substantial portions of the Software.
25
*
26
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
*
34
*/
35
36
#include <
gecode/set/element.hh
>
37
38
namespace
Gecode
{
39
40
namespace
Int {
41
template
<>
43
class
ViewToVarArg
<
Gecode
::
Set::ConstSetView
> {
44
public
:
45
typedef
IntSetArgs
argtype
;
46
};
47
}
48
49
using namespace
Gecode::Set
;
50
51
void
52
element
(
Home
home,
SetOpType
op
,
const
SetVarArgs
&
x
,
SetVar
y
,
SetVar
z
,
53
const
IntSet
& universe) {
54
GECODE_POST
;
55
56
switch
(
op
) {
57
case
SOT_DUNION
:
58
{
59
Set::Element::ElementDisjoint<SetView,SetView>::IdxViewArray
60
iv(home,
x
);
61
GECODE_ES_FAIL
((
Element::ElementDisjoint<SetView,SetView>
::
62
post
(home,iv,
y
)));
63
}
64
// fall through
65
case
SOT_UNION
:
66
{
67
Set::Element::ElementUnion<SetView,SetView,SetView>::IdxViewArray
68
iv(home,
x
);
69
GECODE_ES_FAIL
(
70
(
Element::ElementUnion<SetView,SetView,SetView>
::
71
post
(home,iv,
y
,
z
)));
72
}
73
break
;
74
case
SOT_INTER
:
75
{
76
Set::Element::ElementIntersection<SetView,SetView,SetView>::IdxViewArray
77
iv(home,
x
);
78
GECODE_ES_FAIL
(
79
(
Element::ElementIntersection<SetView,SetView,SetView>
::
80
post
(home,iv,
y
,
z
,universe)));
81
}
82
break
;
83
case
SOT_MINUS
:
84
throw
IllegalOperation
(
"Set::element"
);
85
break
;
86
default
:
87
throw
UnknownOperation
(
"Set::element"
);
88
}
89
}
90
91
void
92
element
(
Home
home,
SetOpType
op
,
const
IntVarArgs
&
x
,
SetVar
y
,
SetVar
z
,
93
const
IntSet
& universe) {
94
GECODE_POST
;
95
96
switch
(
op
) {
97
case
SOT_DUNION
:
98
{
99
Set::Element::ElementDisjoint<SingletonView,SetView>::IdxViewArray
100
iv(home,
x
);
101
GECODE_ES_FAIL
((
Element::ElementDisjoint<SingletonView,SetView>
102
::
post
(home,iv,
y
)));
103
}
104
// fall through
105
case
SOT_UNION
:
106
{
107
Set::Element::ElementUnion<SingletonView,SetView,SetView>::IdxViewArray
108
iv(home,
x
);
109
GECODE_ES_FAIL
(
110
(
Element::ElementUnion<SingletonView,SetView,SetView>
::
111
post
(home,iv,
y
,
z
)));
112
}
113
break
;
114
case
SOT_INTER
:
115
{
116
Set::Element::ElementIntersection
<
SingletonView
,
SetView
,
117
SetView
>
::IdxViewArray
iv(home,
x
);
118
GECODE_ES_FAIL
(
119
(
Element::ElementIntersection
<
SingletonView
,
SetView
,
120
SetView
>::
post
(home,iv,
y
,
z
,universe)));
121
}
122
break
;
123
case
SOT_MINUS
:
124
throw
IllegalOperation
(
"Set::element"
);
125
break
;
126
default
:
127
throw
UnknownOperation
(
"Set::element"
);
128
}
129
}
130
131
void
132
element
(
Home
home,
SetOpType
op
,
const
IntSetArgs
&
x
,
SetVar
y
,
SetVar
z
,
133
const
IntSet
& universe) {
134
GECODE_POST
;
135
136
switch
(
op
) {
137
case
SOT_DUNION
:
138
{
139
Set::Element::ElementDisjoint<ConstSetView,SetView>::IdxViewArray
140
iv(home,
x
.size());
141
for
(
int
i
=
x
.size();
i
--;) {
142
iv[
i
].idx =
i
; iv[
i
].view =
ConstSetView
(home,
x
[
i
]);
143
}
144
GECODE_ES_FAIL
((
Element::ElementDisjoint<ConstSetView,SetView>
::
145
post
(home,iv,
y
)));
146
}
147
// fall through
148
case
SOT_UNION
:
149
{
150
GECODE_ES_FAIL
(
151
(
Element::ElementUnionConst<SetView,SetView>
::
152
post
(home,
z
,
x
,
y
)));
153
}
154
break
;
155
case
SOT_INTER
:
156
{
157
Set::Element::ElementIntersection
<
ConstSetView
,
158
SetView
,
SetView
>
::IdxViewArray
iv(home,
x
.size());
159
for
(
int
i
=
x
.size();
i
--;) {
160
iv[
i
].idx =
i
; iv[
i
].view =
ConstSetView
(home,
x
[
i
]);
161
}
162
GECODE_ES_FAIL
(
163
(
Element::ElementIntersection<ConstSetView,SetView,SetView>
::
164
post
(home,iv,
y
,
z
,universe)));
165
}
166
break
;
167
case
SOT_MINUS
:
168
throw
IllegalOperation
(
"Set::element"
);
169
break
;
170
default
:
171
throw
UnknownOperation
(
"Set::element"
);
172
}
173
174
}
175
176
void
177
element
(
Home
home,
SetOpType
op
,
const
IntArgs
&
x
,
SetVar
y
,
SetVar
z
,
178
const
IntSet
& universe) {
179
IntSetArgs
xs(
x
.size());
180
for
(
int
i
=
x
.size();
i
--;)
181
xs[
i
]=
IntSet
(
x
[
i
],
x
[
i
]);
182
element
(home,
op
,xs,
y
,
z
,universe);
183
}
184
185
void
186
element
(
Home
home,
const
SetVarArgs
&
x
,
IntVar
y
,
SetVar
z
) {
187
if
(
x
.size() == 0)
188
throw
Set::TooFewArguments
(
"Set::element"
);
189
GECODE_POST
;
190
Set::Element::ElementUnion<SetView,SingletonView,SetView>::IdxViewArray
191
iv(home,
x
);
192
SetView
zv(
z
);
193
194
Int::IntView
yv(
y
);
195
SingletonView
single(yv);
196
GECODE_ES_FAIL
((
Element::ElementUnion<SetView,SingletonView,SetView>
197
::
post
(home, iv, single,zv)));
198
}
199
200
void
201
element
(
Home
home,
const
IntSetArgs
&
x
,
IntVar
y
,
SetVar
z
) {
202
if
(
x
.size() == 0)
203
throw
Set::TooFewArguments
(
"Set::element"
);
204
for
(
int
i
=
x
.size();
i
--;)
205
Set::Limits::check
(
x
[
i
],
"Set::element"
);
206
GECODE_POST
;
207
SetView
zv(
z
);
208
209
Int::IntView
yv(
y
);
210
SingletonView
single(yv);
211
GECODE_ES_FAIL
((
Element::ElementUnionConst
<
SetView
,
212
SingletonView
>::
post
(home,
z
,
x
, single)));
213
}
214
215
216
namespace
{
217
IntVar
218
pair(Home home, IntVar
x
,
int
w, IntVar
y
,
int
h) {
219
IntVar xy(home,0,w*h-1);
220
if
(
Int::Element::Pair::post
(home,
x
,
y
,xy,w,h) !=
ES_OK
)
221
home.fail();
222
return
xy;
223
}
224
}
225
226
void
227
element
(
Home
home,
const
IntSetArgs
&
a
,
228
IntVar
x
,
int
w,
IntVar
y
,
int
h,
SetVar
z
) {
229
if
(
a
.size() == 0)
230
throw
Set::TooFewArguments
(
"Set::element"
);
231
if
(
a
.size() != w*h)
232
throw
Set::ArgumentSizeMismatch
(
"Set::element"
);
233
GECODE_POST
;
234
element
(home,
a
, pair(home,
x
,w,
y
,h),
z
);
235
}
236
237
void
238
element
(
Home
home,
const
SetVarArgs
&
a
,
239
IntVar
x
,
int
w,
IntVar
y
,
int
h,
SetVar
z
) {
240
if
(
a
.size() == 0)
241
throw
Set::TooFewArguments
(
"Set::element"
);
242
if
(
a
.size() != w*h)
243
throw
Set::ArgumentSizeMismatch
(
"Set::element"
);
244
GECODE_POST
;
245
element
(home,
a
, pair(home,
x
,w,
y
,h),
z
);
246
}
247
248
}
249
250
// STATISTICS: set-post
251
Gecode::Set::Element::ElementDisjoint
Propagator for element with disjointness
Definition:
element.hh:194
Gecode::x
Post propagator for SetVar x
Definition:
set.hh:767
Gecode::Int::ArgumentSizeMismatch
Exception: Arguments are of different size
Definition:
exception.hpp:73
Gecode::y
Post propagator for SetVar SetOpType SetVar y
Definition:
set.hh:767
GECODE_ES_FAIL
#define GECODE_ES_FAIL(es)
Check whether execution status es is failed, and fail space home.
Definition:
macros.hpp:103
Gecode::Set::ConstSetView
Constant view.
Definition:
view.hpp:186
Gecode::Set::Element::ElementIntersection
Propagator for element with intersection
Definition:
element.hh:78
Gecode::Int::ViewToVarArg< Gecode::Set::ConstSetView >::argtype
IntSetArgs argtype
Definition:
element.cpp:45
Gecode::Int::IdxViewArray< SView >
Gecode::IntVarArgs
Passing integer variables.
Definition:
int.hh:656
Gecode::element
void element(Home home, IntSharedArray c, IntVar x0, IntVar x1, IntPropLevel)
Post domain consistent propagator for .
Definition:
element.cpp:39
Gecode::Set::SingletonView
Singleton set view.
Definition:
view.hpp:594
Gecode::Int::UnknownOperation
Exception: Unknown operation passed as argument
Definition:
exception.hpp:94
Gecode::z
Post propagator for SetVar SetOpType SetVar SetRelType SetVar z
Definition:
set.hh:767
Gecode::SetVarArgs
Passing set variables.
Definition:
set.hh:488
Gecode::Int::ViewToVarArg
Class to map VarArg type to view.
Definition:
idx-view.hh:60
Gecode::SetOpType
SetOpType
Common operations for sets.
Definition:
set.hh:660
Gecode::Int::Element::Pair::post
static ExecStatus post(Home home, IntView x0, IntView x1, IntView x2, int w, int h)
Post propagator .
Definition:
pair.hpp:43
element.hh
Gecode::SOT_INTER
@ SOT_INTER
Intersection
Definition:
set.hh:663
Gecode
Gecode toplevel namespace
Gecode::IntSet
Integer sets.
Definition:
int.hh:174
Gecode::ArgArray< IntSet >
Gecode::Home
Home class for posting propagators
Definition:
core.hpp:856
Gecode::Int::IllegalOperation
Exception: Illegal operation passed as argument
Definition:
exception.hpp:101
Gecode::SOT_UNION
@ SOT_UNION
Union.
Definition:
set.hh:661
Gecode::post
TFE post(PropagatorGroup g)
Only post functions (but not propagators) from g are considered.
Definition:
filter.cpp:138
Gecode::SetVar
Set variables
Definition:
set.hh:127
Gecode::IntVar
Integer variables.
Definition:
int.hh:371
a
struct Gecode::@602::NNF::@65::@67 a
For atomic nodes.
Gecode::SOT_DUNION
@ SOT_DUNION
Disjoint union.
Definition:
set.hh:662
Gecode::Set::SetView
Set view for set variables
Definition:
view.hpp:56
Gecode::Set::Limits::check
void check(int n, const char *l)
Check whether integer n is in range, otherwise throw overflow exception with information l.
Definition:
limits.hpp:37
GECODE_POST
#define GECODE_POST
Check for failure in a constraint post function.
Definition:
macros.hpp:40
Gecode::Int::IntView
Integer view for integer variables.
Definition:
view.hpp:129
Gecode::op
Post propagator for SetVar SetOpType op
Definition:
set.hh:767
Gecode::Set::Element::ElementUnion
Propagator for element with union
Definition:
element.hh:119
Gecode::Set::Element::ElementUnionConst
Propagator for element with union of constant sets
Definition:
element.hh:157
Gecode::SOT_MINUS
@ SOT_MINUS
Difference.
Definition:
set.hh:664
Gecode::IntArgs
Passing integer arguments.
Definition:
int.hh:628
Test::Int::Basic::i
Gecode::IntArgs i({1, 2, 3, 4})
Gecode::Set
Finite integer sets.
Definition:
var-imp.hpp:137
Gecode::ES_OK
@ ES_OK
Execution is okay.
Definition:
core.hpp:476
Gecode::Int::TooFewArguments
Exception: Too few arguments available in argument array
Definition:
exception.hpp:66