main page
modules
namespaces
classes
files
Gecode home
Generated on Thu Mar 7 2013 10:21:17 for Gecode by
doxygen
1.8.3.1
gecode
gist
spacenode.hpp
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
*
6
* Copyright:
7
* Guido Tack, 2006
8
*
9
* Last modified:
10
* $Date: 2010-08-12 19:02:06 +1000 (Thu, 12 Aug 2010) $ by $Author: tack $
11
* $Revision: 11347 $
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
namespace
Gecode {
namespace
Gist {
39
40
forceinline
void
41
SpaceNode::setFlag
(
int
flag,
bool
value) {
42
if
(value)
43
nstatus
|= 1<<(flag-1);
44
else
45
nstatus
&= ~(1<<(flag-1));
46
}
47
48
forceinline
bool
49
SpaceNode::getFlag
(
int
flag)
const
{
50
return
(
nstatus
& (1<<(flag-1))) != 0;
51
}
52
53
forceinline
void
54
SpaceNode::setHasOpenChildren(
bool
b
) {
55
setFlag
(
HASOPENCHILDREN
, b);
56
}
57
58
forceinline
void
59
SpaceNode::setHasFailedChildren(
bool
b
) {
60
setFlag
(
HASFAILEDCHILDREN
, b);
61
}
62
63
forceinline
void
64
SpaceNode::setHasSolvedChildren(
bool
b
) {
65
setFlag
(
HASSOLVEDCHILDREN
, b);
66
}
67
68
forceinline
void
69
SpaceNode::setStatus
(
NodeStatus
s) {
70
nstatus
&= ~( STATUSMASK );
71
nstatus
|= s << 20;
72
}
73
74
forceinline
NodeStatus
75
SpaceNode::getStatus
(
void
)
const
{
76
return
static_cast<
NodeStatus
>
((
nstatus
& STATUSMASK) >> 20);
77
}
78
79
forceinline
void
80
SpaceNode::setDistance
(
unsigned
int
d
) {
81
if
(d > MAXDISTANCE)
82
d = MAXDISTANCE;
83
nstatus
&= ~( DISTANCEMASK );
84
nstatus
|=
d
;
85
}
86
87
forceinline
unsigned
int
88
SpaceNode::getDistance
(
void
)
const
{
89
return
nstatus
& DISTANCEMASK;
90
}
91
92
forceinline
93
SpaceNode::SpaceNode
(
int
p)
94
:
Node
(p), copy(NULL), nstatus(0) {
95
choice
= NULL;
96
setStatus
(
UNDETERMINED
);
97
setHasSolvedChildren(
false
);
98
setHasFailedChildren(
false
);
99
}
100
101
forceinline
Space
*
102
SpaceNode::getSpace
(
NodeAllocator
& na,
103
BestNode
* curBest,
int
c_d
,
int
a_d
) {
104
acquireSpace
(na,curBest,c_d,a_d);
105
Space
* ret;
106
if
(
Support::marked
(
copy
)) {
107
ret =
static_cast<
Space
*
>
(
Support::unmark
(
copy
));
108
copy
= NULL;
109
}
else
{
110
ret =
copy
->
clone
();
111
}
112
return
ret;
113
}
114
115
forceinline
const
Space
*
116
SpaceNode::getWorkingSpace
(
void
)
const
{
117
assert(
copy
!= NULL);
118
if
(
Support::marked
(
copy
))
119
return
static_cast<
Space
*
>
(
Support::unmark
(
copy
));
120
return
copy
;
121
}
122
123
forceinline
void
124
SpaceNode::purge
(
const
NodeAllocator
& na) {
125
if
(!
isRoot
() && (
getStatus
() !=
SOLVED
|| !na.
bab
())) {
126
// only delete copies from solutions if we are not in BAB
127
if
(
Support::marked
(
copy
))
128
delete
static_cast<Space*>(
Support::unmark
(
copy
));
129
else
130
delete
copy
;
131
copy
= NULL;
132
}
133
}
134
135
136
forceinline
bool
137
SpaceNode::isCurrentBest
(
BestNode
* curBest) {
138
return
curBest != NULL && curBest->
s
==
this
;
139
}
140
141
forceinline
bool
142
SpaceNode::isOpen
(
void
) {
143
return
((
getStatus
() ==
UNDETERMINED
) ||
144
getFlag
(
HASOPENCHILDREN
));
145
}
146
147
forceinline
bool
148
SpaceNode::hasFailedChildren
(
void
) {
149
return
getFlag
(
HASFAILEDCHILDREN
);
150
}
151
152
forceinline
bool
153
SpaceNode::hasSolvedChildren
(
void
) {
154
return
getFlag
(
HASSOLVEDCHILDREN
);
155
}
156
157
forceinline
bool
158
SpaceNode::hasOpenChildren
(
void
) {
159
return
getFlag
(
HASOPENCHILDREN
);
160
}
161
162
forceinline
bool
163
SpaceNode::hasCopy
(
void
) {
164
return
copy
!= NULL;
165
}
166
167
forceinline
bool
168
SpaceNode::hasWorkingSpace
(
void
) {
169
return
copy
!= NULL &&
Support::marked
(
copy
);
170
}
171
172
forceinline
int
173
SpaceNode::getAlternative
(
const
NodeAllocator
& na)
const
{
174
SpaceNode
* p =
getParent
(na);
175
if
(p == NULL)
176
return
-1;
177
for
(
int
i
=p->
getNumberOfChildren
();
i
--;)
178
if
(p->
getChild
(na,
i
) ==
this
)
179
return
i
;
180
GECODE_NEVER
;
181
return
-1;
182
}
183
184
forceinline
const
Choice
*
185
SpaceNode::getChoice
(
void
) {
186
return
choice
;
187
}
188
189
}}
190
191
// STATISTICS: gist-any