main page
modules
namespaces
classes
files
Gecode home
Generated on Sat Nov 9 2013 19:18:26 for Gecode by
doxygen
1.8.4
gecode
float
var-imp
float.hpp
Go to the documentation of this file.
1
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
/*
3
* Main authors:
4
* Filip Konvicka <filip.konvicka@logis.cz>
5
* Lubomir Moric <lubomir.moric@logis.cz>
6
* Vincent Barichard <Vincent.Barichard@univ-angers.fr>
7
*
8
* Contributing authors:
9
* Christian Schulte <schulte@gecode.org>
10
*
11
* Copyright:
12
* LOGIS, s.r.o., 2008
13
* Christian Schulte, 2010
14
* Vincent Barichard, 2012
15
*
16
* Last modified:
17
* $Date: 2013-02-04 17:54:05 +0100 (Mon, 04 Feb 2013) $ by $Author: schulte $
18
* $Revision: 13260 $
19
*
20
* This file is part of Gecode, the generic constraint
21
* development environment:
22
* http://www.gecode.org
23
*
24
* Permission is hereby granted, free of charge, to any person obtaining
25
* a copy of this software and associated documentation files (the
26
* "Software"), to deal in the Software without restriction, including
27
* without limitation the rights to use, copy, modify, merge, publish,
28
* distribute, sublicense, and/or sell copies of the Software, and to
29
* permit persons to whom the Software is furnished to do so, subject to
30
* the following conditions:
31
*
32
* The above copyright notice and this permission notice shall be
33
* included in all copies or substantial portions of the Software.
34
*
35
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
36
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
37
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
38
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
39
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
40
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
41
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
42
*
43
*/
44
45
namespace
Gecode {
namespace
Float {
46
47
/*
48
* Creation of new variable implementations
49
*
50
*/
51
52
forceinline
53
FloatVarImp::FloatVarImp
(
Space
& home,
const
FloatVal
&
d
)
54
:
FloatVarImpBase
(home),
dom
(d) {}
55
56
forceinline
57
FloatVarImp::FloatVarImp
(
Space
& home,
bool
share,
FloatVarImp
&
x
)
58
:
FloatVarImpBase
(home, share, x),
dom
(x.
dom
) {}
59
60
61
/*
62
* Operations on float variable implementations
63
*
64
*/
65
66
forceinline
FloatVal
67
FloatVarImp::domain
(
void
)
const
{
68
return
dom
;
69
}
70
forceinline
FloatNum
71
FloatVarImp::min
(
void
)
const
{
72
return
dom
.
min
();
73
}
74
forceinline
FloatNum
75
FloatVarImp::max
(
void
)
const
{
76
return
dom
.
max
();
77
}
78
forceinline
FloatVal
79
FloatVarImp::val
(
void
)
const
{
80
return
dom
;
81
}
82
forceinline
FloatNum
83
FloatVarImp::med
(
void
)
const
{
84
return
dom
.
med
();
85
}
86
87
forceinline
bool
88
FloatVarImp::assigned
(
void
)
const
{
89
return
dom
.
tight
();
90
}
91
92
forceinline
FloatNum
93
FloatVarImp::size
(
void
)
const
{
94
return
dom
.
size
();
95
}
96
97
98
/*
99
* Tests
100
*
101
*/
102
103
forceinline
bool
104
FloatVarImp::zero_in
(
void
)
const
{
105
return
dom
.
zero_in
();
106
}
107
forceinline
bool
108
FloatVarImp::in
(
FloatNum
n
)
const
{
109
return
dom
.
in
(n);
110
}
111
forceinline
bool
112
FloatVarImp::in
(
const
FloatVal
&
n
)
const
{
113
return
subset
(n,
dom
);
114
}
115
116
117
/*
118
* Support for delta information
119
*
120
*/
121
forceinline
FloatNum
122
FloatVarImp::min
(
const
Delta
&
d
) {
123
return
static_cast<
const
FloatDelta
&
>
(
d
).
min
();
124
}
125
forceinline
FloatNum
126
FloatVarImp::max
(
const
Delta
&
d
) {
127
return
static_cast<
const
FloatDelta
&
>
(
d
).
max
();
128
}
129
130
131
/*
132
* Tell operations (to be inlined: performing bounds checks first)
133
*
134
*/
135
136
forceinline
ModEvent
137
FloatVarImp::gq
(
Space
& home,
FloatNum
n
) {
138
if
(n >
dom
.
max
())
return
ME_FLOAT_FAILED
;
139
if
((n <=
dom
.
min
()) ||
assigned
())
return
ME_FLOAT_NONE
;
140
FloatDelta
d
(
dom
.
min
(),
n
);
141
ModEvent
me
=
ME_FLOAT_BND
;
142
dom
=
intersect
(
dom
,
FloatVal
(n,
dom
.
max
()));
143
if
(
assigned
()) me =
ME_FLOAT_VAL
;
144
GECODE_ASSUME
((me ==
ME_FLOAT_VAL
) |
145
(me ==
ME_FLOAT_BND
));
146
return
notify
(home,me,
d
);
147
}
148
forceinline
ModEvent
149
FloatVarImp::gq
(
Space
& home,
const
FloatVal
&
n
) {
150
if
(n.
min
() >
dom
.
max
())
return
ME_FLOAT_FAILED
;
151
if
((n.
min
() <=
dom
.
min
()) ||
assigned
())
return
ME_FLOAT_NONE
;
152
FloatDelta
d
(
dom
.
min
(),n.
min
());
153
ModEvent
me
=
ME_FLOAT_BND
;
154
dom
=
intersect
(
dom
,
FloatVal
(n.
min
(),
dom
.
max
()));
155
if
(
assigned
()) me =
ME_FLOAT_VAL
;
156
GECODE_ASSUME
((me ==
ME_FLOAT_VAL
) |
157
(me ==
ME_FLOAT_BND
));
158
return
notify
(home,me,
d
);
159
}
160
161
162
forceinline
ModEvent
163
FloatVarImp::lq
(
Space
& home,
FloatNum
n
) {
164
if
(n <
dom
.
min
())
return
ME_FLOAT_FAILED
;
165
if
((n >=
dom
.
max
()) ||
assigned
())
return
ME_FLOAT_NONE
;
166
FloatDelta
d
(n,
dom
.
max
());
167
ModEvent
me
=
ME_FLOAT_BND
;
168
dom
=
intersect
(
dom
,
FloatVal
(
dom
.
min
(),
n
));
169
if
(
assigned
()) me =
ME_FLOAT_VAL
;
170
GECODE_ASSUME
((me ==
ME_FLOAT_VAL
) |
171
(me ==
ME_FLOAT_BND
));
172
return
notify
(home,me,
d
);
173
}
174
forceinline
ModEvent
175
FloatVarImp::lq
(
Space
& home,
const
FloatVal
&
n
) {
176
if
(n.
max
() <
dom
.
min
())
return
ME_FLOAT_FAILED
;
177
if
((n.
max
() >=
dom
.
max
()) ||
assigned
())
return
ME_FLOAT_NONE
;
178
FloatDelta
d
(n.
max
(),
dom
.
max
());
179
ModEvent
me
=
ME_FLOAT_BND
;
180
dom
=
intersect
(
dom
,
FloatVal
(
dom
.
min
(),n.
max
()));
181
if
(
assigned
()) me =
ME_FLOAT_VAL
;
182
GECODE_ASSUME
((me ==
ME_FLOAT_VAL
) |
183
(me ==
ME_FLOAT_BND
));
184
return
notify
(home,me,
d
);
185
}
186
187
188
forceinline
ModEvent
189
FloatVarImp::eq
(
Space
& home,
FloatNum
n
) {
190
if
(!
dom
.
in
(n))
191
return
ME_FLOAT_FAILED
;
192
if
(
assigned
())
193
return
ME_FLOAT_NONE
;
194
FloatDelta
d
;
195
dom
=
n
;
196
return
notify
(home,
ME_FLOAT_VAL
,d);
197
}
198
forceinline
ModEvent
199
FloatVarImp::eq
(
Space
& home,
const
FloatVal
&
n
) {
200
if
(!
overlap
(
dom
,n))
201
return
ME_FLOAT_FAILED
;
202
if
(
assigned
() ||
subset
(
dom
,n))
203
return
ME_FLOAT_NONE
;
204
FloatDelta
d
;
205
ModEvent
me
=
ME_FLOAT_BND
;
206
dom
=
intersect
(
dom
,n);
207
if
(
assigned
()) me =
ME_FLOAT_VAL
;
208
GECODE_ASSUME
((me ==
ME_FLOAT_VAL
) |
209
(me ==
ME_FLOAT_BND
));
210
return
notify
(home,me,d);
211
}
212
213
214
/*
215
* Copying a variable
216
*
217
*/
218
219
forceinline
FloatVarImp
*
220
FloatVarImp::copy
(
Space
& home,
bool
share) {
221
return
copied
() ?
static_cast<
FloatVarImp
*
>
(
forward
())
222
: perform_copy(home,share);
223
}
224
226
forceinline
FloatVarImp
*
227
FloatVarImp::perform_copy(
Space
& home,
bool
share) {
228
return
new
(home)
FloatVarImp
(home, share, *
this
);
229
}
230
231
/*
232
* Dependencies
233
*
234
*/
235
forceinline
void
236
FloatVarImp::subscribe
(
Space
& home,
Propagator
&
p
,
PropCond
pc,
bool
schedule) {
237
FloatVarImpBase::subscribe
(home,p,pc,
assigned
(),schedule);
238
}
239
forceinline
void
240
FloatVarImp::cancel
(
Space
& home,
Propagator
&
p
,
PropCond
pc) {
241
FloatVarImpBase::cancel
(home,p,pc,
assigned
());
242
}
243
244
forceinline
void
245
FloatVarImp::subscribe
(
Space
& home,
Advisor
&
a
) {
246
FloatVarImpBase::subscribe
(home,a,
assigned
());
247
}
248
forceinline
void
249
FloatVarImp::cancel
(
Space
& home,
Advisor
&
a
) {
250
FloatVarImpBase::cancel
(home,a,
assigned
());
251
}
252
253
forceinline
ModEventDelta
254
FloatVarImp::med
(
ModEvent
me) {
255
return
FloatVarImpBase::med
(me);
256
}
257
258
}}
259
260
// STATISTICS: float-var