main page
modules
namespaces
classes
files
Gecode home
Generated on Sat May 25 2013 18:00:33 for Gecode by
doxygen
1.8.3.1
gecode
set
branch
val-sel.hpp
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
* Contributing authors:
7
* Gabor Szokoli <szokoli@gecode.org>
8
* Guido Tack <tack@gecode.org>
9
*
10
* Copyright:
11
* Christian Schulte, 2012
12
* Gabor Szokoli, 2004
13
* Guido Tack, 2004
14
*
15
* Last modified:
16
* $Date: 2012-10-02 15:49:50 +0200 (Tue, 02 Oct 2012) $ by $Author: schulte $
17
* $Revision: 13123 $
18
*
19
* This file is part of Gecode, the generic constraint
20
* development environment:
21
* http://www.gecode.org
22
*
23
* Permission is hereby granted, free of charge, to any person obtaining
24
* a copy of this software and associated documentation files (the
25
* "Software"), to deal in the Software without restriction, including
26
* without limitation the rights to use, copy, modify, merge, publish,
27
* distribute, sublicense, and/or sell copies of the Software, and to
28
* permit persons to whom the Software is furnished to do so, subject to
29
* the following conditions:
30
*
31
* The above copyright notice and this permission notice shall be
32
* included in all copies or substantial portions of the Software.
33
*
34
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
35
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
37
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
38
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
39
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
40
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41
*
42
*/
43
44
namespace
Gecode {
namespace
Set {
namespace
Branch {
45
46
forceinline
47
ValSelMin::ValSelMin
(
Space
& home,
const
ValBranch
& vb)
48
:
ValSel
<
SetView
,int>(home,vb) {}
49
forceinline
50
ValSelMin::ValSelMin
(
Space
& home,
bool
shared
,
ValSelMin
& vs)
51
:
ValSel
<
SetView
,int>(home,shared,vs) {}
52
forceinline
int
53
ValSelMin::val
(
const
Space
&,
SetView
x
,
int
) {
54
UnknownRanges<SetView>
u
(x);
55
return
u.
min
();
56
}
57
58
forceinline
59
ValSelMax::ValSelMax
(
Space
& home,
const
ValBranch
& vb)
60
:
ValSel
<
SetView
,int>(home,vb) {}
61
forceinline
62
ValSelMax::ValSelMax
(
Space
& home,
bool
shared
,
ValSelMax
& vs)
63
:
ValSel
<
SetView
,int>(home,shared,vs) {}
64
forceinline
int
65
ValSelMax::val
(
const
Space
&,
SetView
x
,
int
) {
66
int
max
= 0;
67
for
(
UnknownRanges<SetView>
u
(x);
u
(); ++
u
)
68
max =
u
.max();
69
return
max
;
70
}
71
72
forceinline
73
ValSelMed::ValSelMed
(
Space
& home,
const
ValBranch
& vb)
74
:
ValSel
<
SetView
,int>(home,vb) {}
75
forceinline
76
ValSelMed::ValSelMed
(
Space
& home,
bool
shared
,
ValSelMed
& vs)
77
:
ValSel
<
SetView
,int>(home,shared,vs) {}
78
forceinline
int
79
ValSelMed::val
(
const
Space
&,
SetView
x
,
int
) {
80
UnknownRanges<SetView>
u1(x);
81
unsigned
int
i
=
Iter::Ranges::size
(u1) / 2;
82
UnknownRanges<SetView>
u2(x);
83
int
med = (u2.
min
()+u2.
max
()) / 2;
84
++u2;
85
if
(!u2()) {
86
return
med;
87
}
88
UnknownRanges<SetView>
u3(x);
89
while
(i >= u3.
width
()) {
90
i -= u3.
width
();
91
++u3;
92
}
93
return
u3.
min
() +
static_cast<
int
>
(
i
);
94
}
95
96
forceinline
97
ValSelRnd::ValSelRnd
(
Space
& home,
const
ValBranch
& vb)
98
:
ValSel
<
SetView
,int>(home,vb),
r
(vb.rnd()) {}
99
forceinline
100
ValSelRnd::ValSelRnd
(
Space
& home,
bool
shared
,
ValSelRnd
& vs)
101
:
ValSel
<
SetView
,int>(home,shared,vs) {
102
r
.
update
(home,shared,vs.
r
);
103
}
104
forceinline
int
105
ValSelRnd::val
(
const
Space
&,
SetView
x
,
int
) {
106
UnknownRanges<SetView>
u
(x);
107
unsigned
int
p
=
r
(
Iter::Ranges::size
(u));
108
for
(
UnknownRanges<SetView>
i
(x);
i
(); ++
i
) {
109
if
(
i
.width() >
p
)
110
return
i
.min() +
static_cast<
int
>
(
p
);
111
p -=
i
.width();
112
}
113
GECODE_NEVER
;
114
return
0;
115
}
116
forceinline
bool
117
ValSelRnd::notice
(
void
)
const
{
118
return
true
;
119
}
120
forceinline
void
121
ValSelRnd::dispose
(
Space
&) {
122
r
.~Rnd();
123
}
124
125
}}}
126
127
// STATISTICS: set-branch
128